From 172675a722a980c8b346fc834a2d9043d01cecb2 Mon Sep 17 00:00:00 2001
From: muskit <15199219+muskit@users.noreply.github.com>
Date: Wed, 14 Jun 2023 03:05:31 -0700
Subject: [PATCH] Import fixup of old code into new Unity project
---
.gitignore | 72 ++
.vscode/settings.json | 55 ++
Assets/Readme.asset | 34 +
Assets/Readme.asset.meta | 8 +
Assets/Scenes.meta | 8 +
Assets/Scenes/SampleScene.unity | 407 ++++++++
Assets/Scenes/SampleScene.unity.meta | 7 +
Assets/Scripts.meta | 8 +
Assets/Scripts/Chart.meta | 8 +
Assets/Scripts/Data.meta | 8 +
Assets/Scripts/Data/Chart.meta | 8 +
Assets/Scripts/Data/Chart/Chart.cs | 332 +++++++
Assets/Scripts/Data/Chart/Chart.cs.meta | 11 +
Assets/Scripts/Data/Chart/Difficulty.cs | 9 +
Assets/Scripts/Data/Chart/Difficulty.cs.meta | 11 +
Assets/Scripts/Data/Chart/MeasureBeat.cs | 121 +++
Assets/Scripts/Data/Chart/MeasureBeat.cs.meta | 11 +
Assets/Scripts/Data/Chart/Note.cs | 43 +
Assets/Scripts/Data/Chart/Note.cs.meta | 11 +
Assets/Scripts/Data/Chart/NoteEvent.cs | 36 +
Assets/Scripts/Data/Chart/NoteEvent.cs.meta | 11 +
Assets/Scripts/Data/Chart/NoteHold.cs | 20 +
Assets/Scripts/Data/Chart/NoteHold.cs.meta | 11 +
Assets/Scripts/Data/Chart/NotePlay.cs | 38 +
Assets/Scripts/Data/Chart/NotePlay.cs.meta | 11 +
Assets/Scripts/Data/Mer.meta | 8 +
Assets/Scripts/Data/Mer/Mer.cs | 146 +++
Assets/Scripts/Data/Mer/Mer.cs.meta | 11 +
Assets/Scripts/Data/Mer/MerNote.cs | 38 +
Assets/Scripts/Data/Mer/MerNote.cs.meta | 11 +
Assets/Scripts/Util.cs | 145 +++
Assets/Scripts/Util.cs.meta | 11 +
Assets/Settings.meta | 8 +
Assets/Settings/SampleSceneProfile.asset | 123 +++
Assets/Settings/SampleSceneProfile.asset.meta | 8 +
Assets/Settings/URP-Balanced-Renderer.asset | 81 ++
.../Settings/URP-Balanced-Renderer.asset.meta | 8 +
Assets/Settings/URP-Balanced.asset | 74 ++
Assets/Settings/URP-Balanced.asset.meta | 8 +
.../Settings/URP-HighFidelity-Renderer.asset | 81 ++
.../URP-HighFidelity-Renderer.asset.meta | 8 +
Assets/Settings/URP-HighFidelity.asset | 69 ++
Assets/Settings/URP-HighFidelity.asset.meta | 8 +
Assets/Settings/URP-Performant-Renderer.asset | 57 ++
.../URP-Performant-Renderer.asset.meta | 8 +
Assets/Settings/URP-Performant.asset | 69 ++
Assets/Settings/URP-Performant.asset.meta | 8 +
Assets/TutorialInfo.meta | 8 +
Assets/TutorialInfo/Icons.meta | 9 +
Assets/TutorialInfo/Icons/URP.png | Bin 0 -> 24069 bytes
Assets/TutorialInfo/Icons/URP.png.meta | 134 +++
Assets/TutorialInfo/Layout.wlt | 654 +++++++++++++
Assets/TutorialInfo/Layout.wlt.meta | 8 +
Assets/TutorialInfo/Scripts.meta | 9 +
Assets/TutorialInfo/Scripts/Editor.meta | 9 +
.../Scripts/Editor/ReadmeEditor.cs | 242 +++++
.../Scripts/Editor/ReadmeEditor.cs.meta | 12 +
Assets/TutorialInfo/Scripts/Readme.cs | 16 +
Assets/TutorialInfo/Scripts/Readme.cs.meta | 12 +
...niversalRenderPipelineGlobalSettings.asset | 27 +
...salRenderPipelineGlobalSettings.asset.meta | 8 +
Packages/manifest.json | 46 +
Packages/packages-lock.json | 427 +++++++++
ProjectSettings/AudioManager.asset | 19 +
.../BurstAotSettings_StandaloneWindows.json | 17 +
ProjectSettings/ClusterInputManager.asset | 6 +
ProjectSettings/CommonBurstAotSettings.json | 6 +
ProjectSettings/DynamicsManager.asset | 36 +
ProjectSettings/EditorBuildSettings.asset | 11 +
ProjectSettings/EditorSettings.asset | 42 +
ProjectSettings/GraphicsSettings.asset | 70 ++
ProjectSettings/InputManager.asset | 487 ++++++++++
ProjectSettings/MemorySettings.asset | 35 +
ProjectSettings/NavMeshAreas.asset | 91 ++
ProjectSettings/PackageManagerSettings.asset | 43 +
ProjectSettings/Physics2DSettings.asset | 56 ++
ProjectSettings/PresetManager.asset | 7 +
ProjectSettings/ProjectSettings.asset | 896 ++++++++++++++++++
ProjectSettings/ProjectVersion.txt | 2 +
ProjectSettings/QualitySettings.asset | 136 +++
ProjectSettings/SceneTemplateSettings.json | 167 ++++
ProjectSettings/ShaderGraphSettings.asset | 16 +
ProjectSettings/TagManager.asset | 43 +
ProjectSettings/TimeManager.asset | 9 +
ProjectSettings/URPProjectSettings.asset | 15 +
ProjectSettings/UnityConnectSettings.asset | 36 +
ProjectSettings/VFXManager.asset | 12 +
ProjectSettings/VersionControlSettings.asset | 8 +
ProjectSettings/XRSettings.asset | 10 +
ProjectSettings/boot.config | 0
90 files changed, 6184 insertions(+)
create mode 100644 .gitignore
create mode 100644 .vscode/settings.json
create mode 100644 Assets/Readme.asset
create mode 100644 Assets/Readme.asset.meta
create mode 100644 Assets/Scenes.meta
create mode 100644 Assets/Scenes/SampleScene.unity
create mode 100644 Assets/Scenes/SampleScene.unity.meta
create mode 100644 Assets/Scripts.meta
create mode 100644 Assets/Scripts/Chart.meta
create mode 100644 Assets/Scripts/Data.meta
create mode 100644 Assets/Scripts/Data/Chart.meta
create mode 100644 Assets/Scripts/Data/Chart/Chart.cs
create mode 100644 Assets/Scripts/Data/Chart/Chart.cs.meta
create mode 100644 Assets/Scripts/Data/Chart/Difficulty.cs
create mode 100644 Assets/Scripts/Data/Chart/Difficulty.cs.meta
create mode 100755 Assets/Scripts/Data/Chart/MeasureBeat.cs
create mode 100644 Assets/Scripts/Data/Chart/MeasureBeat.cs.meta
create mode 100755 Assets/Scripts/Data/Chart/Note.cs
create mode 100644 Assets/Scripts/Data/Chart/Note.cs.meta
create mode 100755 Assets/Scripts/Data/Chart/NoteEvent.cs
create mode 100644 Assets/Scripts/Data/Chart/NoteEvent.cs.meta
create mode 100755 Assets/Scripts/Data/Chart/NoteHold.cs
create mode 100644 Assets/Scripts/Data/Chart/NoteHold.cs.meta
create mode 100755 Assets/Scripts/Data/Chart/NotePlay.cs
create mode 100644 Assets/Scripts/Data/Chart/NotePlay.cs.meta
create mode 100644 Assets/Scripts/Data/Mer.meta
create mode 100644 Assets/Scripts/Data/Mer/Mer.cs
create mode 100644 Assets/Scripts/Data/Mer/Mer.cs.meta
create mode 100644 Assets/Scripts/Data/Mer/MerNote.cs
create mode 100644 Assets/Scripts/Data/Mer/MerNote.cs.meta
create mode 100644 Assets/Scripts/Util.cs
create mode 100644 Assets/Scripts/Util.cs.meta
create mode 100644 Assets/Settings.meta
create mode 100644 Assets/Settings/SampleSceneProfile.asset
create mode 100644 Assets/Settings/SampleSceneProfile.asset.meta
create mode 100644 Assets/Settings/URP-Balanced-Renderer.asset
create mode 100644 Assets/Settings/URP-Balanced-Renderer.asset.meta
create mode 100644 Assets/Settings/URP-Balanced.asset
create mode 100644 Assets/Settings/URP-Balanced.asset.meta
create mode 100644 Assets/Settings/URP-HighFidelity-Renderer.asset
create mode 100644 Assets/Settings/URP-HighFidelity-Renderer.asset.meta
create mode 100644 Assets/Settings/URP-HighFidelity.asset
create mode 100644 Assets/Settings/URP-HighFidelity.asset.meta
create mode 100644 Assets/Settings/URP-Performant-Renderer.asset
create mode 100644 Assets/Settings/URP-Performant-Renderer.asset.meta
create mode 100644 Assets/Settings/URP-Performant.asset
create mode 100644 Assets/Settings/URP-Performant.asset.meta
create mode 100644 Assets/TutorialInfo.meta
create mode 100644 Assets/TutorialInfo/Icons.meta
create mode 100644 Assets/TutorialInfo/Icons/URP.png
create mode 100644 Assets/TutorialInfo/Icons/URP.png.meta
create mode 100644 Assets/TutorialInfo/Layout.wlt
create mode 100644 Assets/TutorialInfo/Layout.wlt.meta
create mode 100644 Assets/TutorialInfo/Scripts.meta
create mode 100644 Assets/TutorialInfo/Scripts/Editor.meta
create mode 100644 Assets/TutorialInfo/Scripts/Editor/ReadmeEditor.cs
create mode 100644 Assets/TutorialInfo/Scripts/Editor/ReadmeEditor.cs.meta
create mode 100644 Assets/TutorialInfo/Scripts/Readme.cs
create mode 100644 Assets/TutorialInfo/Scripts/Readme.cs.meta
create mode 100644 Assets/UniversalRenderPipelineGlobalSettings.asset
create mode 100644 Assets/UniversalRenderPipelineGlobalSettings.asset.meta
create mode 100644 Packages/manifest.json
create mode 100644 Packages/packages-lock.json
create mode 100644 ProjectSettings/AudioManager.asset
create mode 100644 ProjectSettings/BurstAotSettings_StandaloneWindows.json
create mode 100644 ProjectSettings/ClusterInputManager.asset
create mode 100644 ProjectSettings/CommonBurstAotSettings.json
create mode 100644 ProjectSettings/DynamicsManager.asset
create mode 100644 ProjectSettings/EditorBuildSettings.asset
create mode 100644 ProjectSettings/EditorSettings.asset
create mode 100644 ProjectSettings/GraphicsSettings.asset
create mode 100644 ProjectSettings/InputManager.asset
create mode 100644 ProjectSettings/MemorySettings.asset
create mode 100644 ProjectSettings/NavMeshAreas.asset
create mode 100644 ProjectSettings/PackageManagerSettings.asset
create mode 100644 ProjectSettings/Physics2DSettings.asset
create mode 100644 ProjectSettings/PresetManager.asset
create mode 100644 ProjectSettings/ProjectSettings.asset
create mode 100644 ProjectSettings/ProjectVersion.txt
create mode 100644 ProjectSettings/QualitySettings.asset
create mode 100644 ProjectSettings/SceneTemplateSettings.json
create mode 100644 ProjectSettings/ShaderGraphSettings.asset
create mode 100644 ProjectSettings/TagManager.asset
create mode 100644 ProjectSettings/TimeManager.asset
create mode 100644 ProjectSettings/URPProjectSettings.asset
create mode 100644 ProjectSettings/UnityConnectSettings.asset
create mode 100644 ProjectSettings/VFXManager.asset
create mode 100644 ProjectSettings/VersionControlSettings.asset
create mode 100644 ProjectSettings/XRSettings.asset
create mode 100644 ProjectSettings/boot.config
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..58cbc82
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,72 @@
+# This .gitignore file should be placed at the root of your Unity project directory
+#
+# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
+#
+/[Ll]ibrary/
+/[Tt]emp/
+/[Oo]bj/
+/[Bb]uild/
+/[Bb]uilds/
+/[Ll]ogs/
+/[Uu]ser[Ss]ettings/
+
+# MemoryCaptures can get excessive in size.
+# They also could contain extremely sensitive data
+/[Mm]emoryCaptures/
+
+# Recordings can get excessive in size
+/[Rr]ecordings/
+
+# Uncomment this line if you wish to ignore the asset store tools plugin
+# /[Aa]ssets/AssetStoreTools*
+
+# Autogenerated Jetbrains Rider plugin
+/[Aa]ssets/Plugins/Editor/JetBrains*
+
+# Visual Studio cache directory
+.vs/
+
+# Gradle cache directory
+.gradle/
+
+# Autogenerated VS/MD/Consulo solution and project files
+ExportedObj/
+.consulo/
+*.csproj
+*.unityproj
+*.sln
+*.suo
+*.tmp
+*.user
+*.userprefs
+*.pidb
+*.booproj
+*.svd
+*.pdb
+*.mdb
+*.opendb
+*.VC.db
+
+# Unity3D generated meta files
+*.pidb.meta
+*.pdb.meta
+*.mdb.meta
+
+# Unity3D generated file on crash reports
+sysinfo.txt
+
+# Builds
+*.apk
+*.aab
+*.unitypackage
+*.app
+
+# Crashlytics generated file
+crashlytics-build.properties
+
+# Packed Addressables
+/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
+
+# Temporary auto-generated Android Assets
+/[Aa]ssets/[Ss]treamingAssets/aa.meta
+/[Aa]ssets/[Ss]treamingAssets/aa/*
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..e232cd6
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,55 @@
+{
+ "files.exclude":
+ {
+ "**/.DS_Store":true,
+ "**/.git":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/Assets/Readme.asset b/Assets/Readme.asset
new file mode 100644
index 0000000..77c2f83
--- /dev/null
+++ b/Assets/Readme.asset
@@ -0,0 +1,34 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: fcf7219bab7fe46a1ad266029b2fee19, type: 3}
+ m_Name: Readme
+ m_EditorClassIdentifier:
+ icon: {fileID: 2800000, guid: 727a75301c3d24613a3ebcec4a24c2c8, type: 3}
+ title: URP Empty Template
+ sections:
+ - heading: Welcome to the Universal Render Pipeline
+ text: This template includes the settings and assets you need to start creating with the Universal Render Pipeline.
+ linkText:
+ url:
+ - heading: URP Documentation
+ text:
+ linkText: Read more about URP
+ url: https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest
+ - heading: Forums
+ text:
+ linkText: Get answers and support
+ url: https://forum.unity.com/forums/universal-render-pipeline.383/
+ - heading: Report bugs
+ text:
+ linkText: Submit a report
+ url: https://unity3d.com/unity/qa/bug-reporting
+ loadedLayout: 1
diff --git a/Assets/Readme.asset.meta b/Assets/Readme.asset.meta
new file mode 100644
index 0000000..ab3ad45
--- /dev/null
+++ b/Assets/Readme.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8105016687592461f977c054a80ce2f2
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scenes.meta b/Assets/Scenes.meta
new file mode 100644
index 0000000..e59fb45
--- /dev/null
+++ b/Assets/Scenes.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9c53962885c2c4f449125a979d6ad240
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity
new file mode 100644
index 0000000..89d7244
--- /dev/null
+++ b/Assets/Scenes/SampleScene.unity
@@ -0,0 +1,407 @@
+%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.18028305, g: 0.22571313, b: 0.3069213, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ 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: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ 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: 0}
+ m_LightingSettings: {fileID: 0}
+--- !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
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &330585543
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 330585546}
+ - component: {fileID: 330585545}
+ - component: {fileID: 330585544}
+ - component: {fileID: 330585547}
+ 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 &330585544
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330585543}
+ m_Enabled: 1
+--- !u!20 &330585545
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330585543}
+ 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_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.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 &330585546
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330585543}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &330585547
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330585543}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_RenderShadows: 1
+ m_RequiresDepthTextureOption: 2
+ m_RequiresOpaqueTextureOption: 2
+ m_CameraType: 0
+ m_Cameras: []
+ m_RendererIndex: -1
+ m_VolumeLayerMask:
+ serializedVersion: 2
+ m_Bits: 1
+ m_VolumeTrigger: {fileID: 0}
+ m_VolumeFrameworkUpdateModeOption: 2
+ m_RenderPostProcessing: 1
+ m_Antialiasing: 0
+ m_AntialiasingQuality: 2
+ m_StopNaN: 0
+ m_Dithering: 0
+ m_ClearDepth: 1
+ m_AllowXRRendering: 1
+ m_RequiresDepthTexture: 0
+ m_RequiresColorTexture: 0
+ m_Version: 2
+--- !u!1 &410087039
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 410087041}
+ - component: {fileID: 410087040}
+ - component: {fileID: 410087042}
+ 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 &410087040
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 410087039}
+ m_Enabled: 1
+ serializedVersion: 10
+ m_Type: 1
+ m_Shape: 0
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_Intensity: 2
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.80208
+ 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_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 5000
+ m_UseColorTemperature: 1
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_UseViewFrustumForShadowCasterCull: 1
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &410087041
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 410087039}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!114 &410087042
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 410087039}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Version: 1
+ m_UsePipelineSettings: 1
+ m_AdditionalLightsShadowResolutionTier: 2
+ m_LightLayerMask: 1
+ m_CustomShadowLayers: 0
+ m_ShadowLayerMask: 1
+ m_LightCookieSize: {x: 1, y: 1}
+ m_LightCookieOffset: {x: 0, y: 0}
+--- !u!1 &832575517
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 832575519}
+ - component: {fileID: 832575518}
+ m_Layer: 0
+ m_Name: Global Volume
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &832575518
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 832575517}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IsGlobal: 1
+ priority: 0
+ blendDistance: 0
+ weight: 1
+ sharedProfile: {fileID: 11400000, guid: a6560a915ef98420e9faacc1c7438823, type: 2}
+--- !u!4 &832575519
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 832575517}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
diff --git a/Assets/Scenes/SampleScene.unity.meta b/Assets/Scenes/SampleScene.unity.meta
new file mode 100644
index 0000000..9531828
--- /dev/null
+++ b/Assets/Scenes/SampleScene.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 99c9720ab356a0642a771bea13969a05
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta
new file mode 100644
index 0000000..b9b2049
--- /dev/null
+++ b/Assets/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 47e9a97b0459a9602ad0c6db9a677bdf
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Chart.meta b/Assets/Scripts/Chart.meta
new file mode 100644
index 0000000..0effb71
--- /dev/null
+++ b/Assets/Scripts/Chart.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 068bea4454abab153a89e02bb7310362
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data.meta b/Assets/Scripts/Data.meta
new file mode 100644
index 0000000..1fa327a
--- /dev/null
+++ b/Assets/Scripts/Data.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3c8e63ed48e601437a85463147fc9a07
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart.meta b/Assets/Scripts/Data/Chart.meta
new file mode 100644
index 0000000..f507915
--- /dev/null
+++ b/Assets/Scripts/Data/Chart.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 25140b91ea8636ea5acb3ff90421f11a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart/Chart.cs b/Assets/Scripts/Data/Chart/Chart.cs
new file mode 100644
index 0000000..a42b2d2
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/Chart.cs
@@ -0,0 +1,332 @@
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using UnityEngine;
+
+using WacK.Data.Mer;
+
+namespace WacK.Data.Chart
+{
+ ///
+ /// Chart data.
+ ///
+ public class Chart
+ {
+ public static bool doneLoading { get; private set; } = false;
+ // [ms] = List (list for chord marking creation)
+ public SortedList> playNotes { get; private set; }
+ public SortedList> timeSigChgs { get; private set; }
+ public SortedList> tempoChgs { get; private set; }
+ public SortedList> events { get; private set; }
+
+ public Chart()
+ {
+ doneLoading = false;
+ }
+
+ // place notes and events relative to the previous
+ public void Load(Mer.Mer chart)
+ {
+ playNotes = new SortedList>();
+
+ List tempo = new List();
+ List tempoChangeMeasures = new List();
+ List tempoChangeBeats = new List();
+
+ // TODO: switch to MeasureBeat
+ List beatsPerMeasure = new List();
+ List bpmChangeMeasures = new List();
+
+ tempo.Add(0);
+ tempoChangeMeasures.Add(0);
+ tempoChangeBeats.Add(0);
+
+ beatsPerMeasure.Add(0);
+ bpmChangeMeasures.Add(0);
+
+ float queuedTempo = -1;
+ int queuedBPM = -1;
+
+ // timing info of the previous beat
+ float prevTime = 0;
+ int prevMeasure = 0;
+ int prevBeat = 0; // (/1920 beats per measure)
+
+ Note prevNote = null;
+ Note curNote = null;
+ var prevHoldPoint = new System.Collections.Generic.Dictionary(); //
+ var curHoldNote = new System.Collections.Generic.Dictionary(); //
+
+ // Notes and Events //
+ foreach (var measure in chart.notes) // `measure` = measure: List
+ {
+ foreach (var chartNote in measure.Value) // `chartNote` = beat, ChartNote
+ {
+ var curTime = prevTime + Util.NoteTime(measure.Key - prevMeasure, chartNote.Item1 - prevBeat, tempo.Last(), beatsPerMeasure.Last());
+ var mb = new MeasureBeat(measure.Key, chartNote.Item1);
+
+ if (prevMeasure != measure.Key && prevBeat != chartNote.Item1)
+ {
+ if (queuedTempo != -1)
+ {
+ tempo.Add(queuedTempo);
+ tempoChangeMeasures.Add(measure.Key);
+ tempoChangeBeats.Add(chartNote.Item1);
+ queuedTempo = -1;
+ }
+
+ if (queuedBPM != -1)
+ {
+ beatsPerMeasure.Add(queuedBPM);
+ bpmChangeMeasures.Add(measure.Key);
+ queuedBPM = -1;
+ }
+ }
+
+ // notetype-dependent operations
+ switch (chartNote.Item2.noteType)
+ {
+ // Beat map data
+ case MerType.Tempo:
+ if (tempo.Count == 1)
+ {
+ tempo.Add(float.Parse(chartNote.Item2.value));
+ tempoChangeMeasures.Add(measure.Key);
+ tempoChangeBeats.Add(chartNote.Item1);
+ }
+ else
+ queuedTempo = float.Parse(chartNote.Item2.value);
+ this.tempoChgs.Add(
+ curTime,
+ new NoteEvent (
+ curTime, mb,
+ NoteEventType.Tempo,
+ value: float.Parse(chartNote.Item2.value)
+ ));
+ break;
+ case MerType.TimeSignature:
+ var words = chartNote.Item2.value.Split();
+ var nu = int.Parse(words[0]);
+ var de = int.Parse(words[1]);
+ if (beatsPerMeasure.Count == 1)
+ {
+ beatsPerMeasure.Add(int.Parse(chartNote.Item2.value));
+ bpmChangeMeasures.Add(measure.Key);
+ }
+ else
+ queuedBPM = int.Parse(chartNote.Item2.value);
+ this.timeSigChgs.Add(
+ curTime,
+ new NoteEvent<(int, int)> (
+ curTime, mb,
+ NoteEventType.TimeSignature,
+ value: (nu, de)
+ ));
+ break;
+ // Playable notes
+ case MerType.Touch:
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size
+ );
+ break;
+ case MerType.HoldStart:
+ curNote = new NoteHold(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ holdIndex: chartNote.Item2.holdIdx,
+ holdNext: chartNote.Item2.holdNextIdx
+ );
+ var nh = curNote as NoteHold;
+ prevHoldPoint[chartNote.Item2.holdNextIdx] = (NotePlay) curNote;
+ curHoldNote[chartNote.Item2.holdNextIdx] = nh;
+ break;
+ case MerType.HoldMid:
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ type: NotePlayType.HoldMid,
+ holdIndex: chartNote.Item2.holdIdx,
+ holdNext: chartNote.Item2.holdNextIdx
+ );
+ prevHoldPoint[chartNote.Item2.holdNextIdx] = (NotePlay) curNote;
+ curHoldNote[chartNote.Item2.holdNextIdx] = curHoldNote[chartNote.Item2.holdIdx];
+ break;
+ case MerType.HoldEnd: // TODO: draw end note on cone texture
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ type: NotePlayType.HoldEnd,
+ holdIndex: chartNote.Item2.holdIdx
+ );
+ break;
+ case MerType.Untimed:
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ type: NotePlayType.Untimed
+ );
+ break;
+ case MerType.SwipeIn:
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ type: NotePlayType.SwipeIn
+ );
+ break;
+ case MerType.SwipeOut:
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ type: NotePlayType.SwipeOut
+ );
+ break;
+ case MerType.SwipeCW:
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ type: NotePlayType.SwipeCW
+ );
+ break;
+ case MerType.SwipeCCW:
+ curNote = new NotePlay(
+ curTime, mb,
+ chartNote.Item2.position, chartNote.Item2.size,
+ type: NotePlayType.SwipeCCW
+ );
+ break;
+ // Events (invisible modifier notes)
+ case MerType.BGAdd:
+ curNote = new NoteEvent(
+ curTime, mb,
+ NoteEventType.BGAdd,
+ chartNote.Item2.position, chartNote.Item2.size,
+ value: int.Parse(chartNote.Item2.value)
+ );
+ break;
+ case MerType.BGRem:
+ curNote = new NoteEvent(
+ curTime, mb,
+ NoteEventType.BGRem,
+ chartNote.Item2.position, chartNote.Item2.size,
+ value: int.Parse(chartNote.Item2.value)
+ );
+ break;
+ }
+
+ if (curNote == null || curNote == prevNote) continue;
+
+ /* Handle our crafted curNote, storing it somewhere in this Chart */
+ // NotePlay
+ var np = curNote as NotePlay;
+ if (np != null)
+ {
+ // hold point handling
+ if (np.type == NotePlayType.HoldMid || np.type == NotePlayType.HoldEnd)
+ {
+ curHoldNote[np.holdIdx].points[curTime] = np;
+ }
+
+ // add note
+ if (!playNotes.ContainsKey(curTime))
+ {
+ playNotes[curTime] = new List();
+ }
+ playNotes[curTime].Add(np);
+ }
+
+ // NoteEvent -- tempo changes
+ var nef = curNote as NoteEvent;
+ if (nef != null)
+ {
+ if (nef.type == NoteEventType.Tempo)
+ this.tempoChgs[curTime] = nef;
+ else
+ Debug.LogWarning($"Didn't add NoteEvent of type {nef.type}");
+ }
+
+ // NoteEvent<(int, int)> -- time signature changes
+ var neii = curNote as NoteEvent<(int, int)>;
+ if (neii != null)
+ {
+ this.timeSigChgs[curTime] = neii;
+ }
+
+ // NoteEvent
+ var nei = curNote as NoteEvent;
+ if (nei != null)
+ {
+ this.events[curTime] = nei;
+ }
+
+ // update previous states
+ prevNote = curNote;
+ prevTime = curTime;
+ prevBeat = chartNote.Item1;
+ prevMeasure = measure.Key;
+ }
+ }
+
+ // chords
+ foreach (KeyValuePair> pair in playNotes)
+ {
+ List chordableNotes = new List();
+ foreach (NotePlay n in pair.Value)
+ {
+ if (n.type != NotePlayType.HoldEnd && n.type != NotePlayType.Untimed)
+ if (!(new NotePlayType[] { NotePlayType.HoldEnd, NotePlayType.Untimed, NotePlayType.HoldMid }).Contains(n.type))
+ chordableNotes.Add(n);
+ }
+ if (chordableNotes.Count >= 2)
+ {
+ Debug.Log($"Found chord: {string.Join(", ", chordableNotes)}");
+ // TODO: draw chord indicators "Chordify"
+ }
+ }
+
+ // Measure Lines //
+ // TODO: adapt to tempo changes in the middle of a measure
+ // int tempoIdx = 1;
+ // int bpmIdx = 1;
+ // for (int curMeasure = 0; curMeasure < chart.notes.Count; curMeasure++)
+ // {
+ // while (curMeasure >= bpmChangeMeasures[bpmIdx] && bpmIdx < bpmChangeMeasures.Count - 1)
+ // ++bpmIdx;
+ // GD.Print($"{curMeasure}: {bpmIdx}");
+
+ // // last tempo change / only one tempo change exists
+ // if (tempoIdx == tempoChangeMeasures.Count - 1)
+ // {
+ // float pos = tempoChangePositions[tempoIdx] + Util.NotePosition(curMeasure - tempoChangeMeasures[tempoIdx], 0, tempo.Last(), beatsPerMeasure[bpmIdx]);
+ // var ml = measureLine.Instance();
+ // measureScroll.AddChild(ml);
+ // ml.Translation = new Vector3(0, 0, pos);
+ // ml.Text = $"{curMeasure}";
+ // }
+ // else if (tempoIdx < tempoChangeMeasures.Count)
+ // {
+ // // TODO: adapt to key signature changes
+ // while (curMeasure == tempoChangeMeasures[tempoIdx])
+ // {
+ // int measuresToCreate = tempoChangeMeasures[tempoIdx] - tempoChangeMeasures[tempoIdx - 1];
+ // for (int i = 0; i < measuresToCreate; ++i)
+ // {
+ // int measureNum = tempoChangeMeasures[tempoIdx - 1] + i;
+ // // GD.Print($"{tempoIdx} / {tempoChangePositions.Count}, {tempo.Count}");
+ // float pos = Util.InterpFloat(tempoChangePositions[tempoIdx - 1], tempoChangePositions[tempoIdx], (float)i/measuresToCreate);
+
+ // var ml = measureLine.Instance();
+ // measureScroll.AddChild(ml);
+ // ml.Translation = new Vector3(0, 0, pos);
+ // ml.Text = $"{curMeasure}";
+ // }
+ // tempoIdx = Mathf.Clamp(tempoIdx + 1, 0, tempo.Count - 1);
+ // }
+ // }
+ // }
+
+ doneLoading = true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Data/Chart/Chart.cs.meta b/Assets/Scripts/Data/Chart/Chart.cs.meta
new file mode 100644
index 0000000..dc3ce32
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/Chart.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 562cc671f5a30839c8769855d8d0483f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart/Difficulty.cs b/Assets/Scripts/Data/Chart/Difficulty.cs
new file mode 100644
index 0000000..22294fd
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/Difficulty.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace WacK.Data.Chart
+{
+ public enum DifficultyLevel
+ {
+ Normal, Hard, Expert, Inferno
+ }
+}
diff --git a/Assets/Scripts/Data/Chart/Difficulty.cs.meta b/Assets/Scripts/Data/Chart/Difficulty.cs.meta
new file mode 100644
index 0000000..96aa7a8
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/Difficulty.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 02342af085b6384489297bdfaaff13f1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart/MeasureBeat.cs b/Assets/Scripts/Data/Chart/MeasureBeat.cs
new file mode 100755
index 0000000..d7171c2
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/MeasureBeat.cs
@@ -0,0 +1,121 @@
+using System;
+
+namespace WacK.Data.Chart
+{
+ ///
+ /// Represents a non-timed chart position in measure and beat as a fraction of the measure.
+ ///
+ public class MeasureBeat
+ {
+ public const int DENOMINATOR = 1920;
+
+ public int measure { get; private set; }
+ ///
+ /// Beat in the measure, represented as beat/1920 of a measure.
+ ///
+ public int beat { get; private set; }
+
+ public MeasureBeat(int measure, int beat)
+ {
+ this.measure = measure;
+ this.beat = beat;
+ Normalize();
+ }
+
+ public void Normalize()
+ {
+ // beats larger than denominator
+ if (Math.Abs(beat) >= DENOMINATOR)
+ {
+ measure += beat / DENOMINATOR;
+ beat %= DENOMINATOR;
+ }
+ // positive measure, negative beats
+ if (beat < 0 && measure > 0)
+ {
+ measure--;
+ beat += DENOMINATOR;
+ }
+ }
+
+ public override string ToString()
+ {
+ return $"MeasureBeat({this.measure}, {this.beat}/{DENOMINATOR})";
+ }
+
+ public override int GetHashCode()
+ {
+ return measure*DENOMINATOR + beat;
+ }
+
+ public override bool Equals(object tgt)
+ {
+ if (tgt == null) return false;
+
+ return this == (MeasureBeat)tgt;
+ }
+
+ /* STATIC CONSTANTS */
+ public readonly static MeasureBeat ZERO = new MeasureBeat(0, 0);
+
+ /* STATIC OPERATORS */
+ public static MeasureBeat operator +(MeasureBeat a) => a;
+ public static MeasureBeat operator -(MeasureBeat a)
+ => new MeasureBeat(-a.measure, -a.beat);
+
+ public static MeasureBeat operator +(MeasureBeat a, MeasureBeat b)
+ {
+ var meas = a.measure + b.measure;
+ var beat = a.beat + b.beat;
+ return new MeasureBeat(meas, beat);
+ }
+
+ public static MeasureBeat operator -(MeasureBeat a, MeasureBeat b)
+ {
+ return a + -b;
+ }
+
+ public static bool operator ==(MeasureBeat a, MeasureBeat b)
+ {
+ return a.measure == b.measure && a.beat == b.beat;
+ }
+
+ public static bool operator !=(MeasureBeat a, MeasureBeat b)
+ {
+ return !(a == b);
+ }
+
+ public static bool operator <(MeasureBeat a, MeasureBeat b)
+ {
+ if (a.measure < b.measure) return true;
+
+ if (a.measure == b.measure)
+ {
+ return a.beat < b.beat;
+ }
+
+ return false;
+ }
+
+ public static bool operator >(MeasureBeat a, MeasureBeat b)
+ {
+ if (a != b)
+ {
+ return !(a < b);
+ }
+ return false;
+ }
+
+ public static bool operator <=(MeasureBeat a, MeasureBeat b)
+ {
+ if (a == b) return true;
+ return a < b;
+ }
+
+ public static bool operator >=(MeasureBeat a, MeasureBeat b)
+ {
+ if (a == b) return true;
+ return a > b;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Data/Chart/MeasureBeat.cs.meta b/Assets/Scripts/Data/Chart/MeasureBeat.cs.meta
new file mode 100644
index 0000000..a2ea869
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/MeasureBeat.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f19917e007c0523e9a5ccccea23e9524
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart/Note.cs b/Assets/Scripts/Data/Chart/Note.cs
new file mode 100755
index 0000000..e4fd040
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/Note.cs
@@ -0,0 +1,43 @@
+using System.Collections.Generic;
+
+namespace WacK.Data.Chart
+{
+ ///
+ /// Base class for various in-play note types.
+ ///
+ public abstract class Note
+ {
+ ///
+ /// Time in milliseconds which the note occurs.
+ ///
+ public double time = 0;
+
+ ///
+ /// Time of the note in MeasureBeat.
+ ///
+ public MeasureBeat measureBeat;
+
+ ///
+ /// The note's radial position out of 60.
+ ///
+ public int? position;
+
+ ///
+ /// The radial size of the note.
+ /// 1 <= size <= 60
+ ///
+ public int? size;
+
+ public Note(double time, MeasureBeat measureBeat, int? position = null, int? size = null)
+ {
+ this.time = time;
+ this.measureBeat = measureBeat;
+ this.position = position;
+ this.size = size;
+ }
+
+ public Note()
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Data/Chart/Note.cs.meta b/Assets/Scripts/Data/Chart/Note.cs.meta
new file mode 100644
index 0000000..404365d
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/Note.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1ed8bb3e1326d18f9927b087b6e8fe7c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart/NoteEvent.cs b/Assets/Scripts/Data/Chart/NoteEvent.cs
new file mode 100755
index 0000000..4bcf519
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/NoteEvent.cs
@@ -0,0 +1,36 @@
+using System;
+
+using System.Collections.Generic;
+
+namespace WacK.Data.Chart
+{
+ public enum NoteEventType
+ {
+ Tempo,
+ TimeSignature,
+ ScrollSpeedMultiplier,
+ BGAdd,
+ BGRem,
+ }
+
+ ///
+ /// Represents an unplayable event with some associated data value.
+ ///
+ /// The value's type.
+ public class NoteEvent : Note
+ {
+ public NoteEventType type;
+
+ ///
+ /// A value whose function will vary depending on the type of note.
+ ///
+ public T value;
+
+ public NoteEvent(double time, MeasureBeat measureBeat, NoteEventType type, int? position = null, int? size = null, T value = default(T)) :
+ base(time, measureBeat, position, size)
+ {
+ this.value = value;
+ this.type = type;
+ }
+ }
+}
diff --git a/Assets/Scripts/Data/Chart/NoteEvent.cs.meta b/Assets/Scripts/Data/Chart/NoteEvent.cs.meta
new file mode 100644
index 0000000..26934cf
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/NoteEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f133260cfe1efeb06bc84818f1f694c0
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart/NoteHold.cs b/Assets/Scripts/Data/Chart/NoteHold.cs
new file mode 100755
index 0000000..389b006
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/NoteHold.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace WacK.Data.Chart
+{
+ ///
+ /// A hold note. Notably contains data about hold points.
+ ///
+ public class NoteHold : NotePlay
+ {
+ public SortedList points;
+
+ public NoteHold(double time, MeasureBeat measureBeat, int position, int size, int holdIndex, int holdNext, bool bonus = false)
+ : base(time, measureBeat, position, size,holdIndex, holdNext, type: NotePlayType.HoldStart, bonus: false)
+ {
+ // points = (SortedList)holdPoints.Skip(1);
+ }
+ }
+}
diff --git a/Assets/Scripts/Data/Chart/NoteHold.cs.meta b/Assets/Scripts/Data/Chart/NoteHold.cs.meta
new file mode 100644
index 0000000..57d1c40
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/NoteHold.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 74c839480bb719c9b96e11709817d2e6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Chart/NotePlay.cs b/Assets/Scripts/Data/Chart/NotePlay.cs
new file mode 100755
index 0000000..85197d3
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/NotePlay.cs
@@ -0,0 +1,38 @@
+using System.Collections.Generic;
+
+namespace WacK.Data.Chart
+{
+ public enum NotePlayType
+ {
+ Touch,
+ HoldStart,
+ HoldMid,
+ HoldEnd,
+ Untimed,
+ SwipeIn,
+ SwipeOut,
+ SwipeCW,
+ SwipeCCW,
+ }
+
+ ///
+ /// Represents playable notes.
+ ///
+ public class NotePlay : Note
+ {
+ public NotePlayType type { get; private set; }
+ public bool isBonus { get; private set; }
+ public int holdIdx { get; private set; }
+ public int holdNextIdx { get; private set; }
+
+ public NotePlay(double time, MeasureBeat measureBeat, int position, int size, int holdIndex = -1, int holdNext = -1,
+ NotePlayType type = NotePlayType.Touch, bool bonus = false)
+ : base(time, measureBeat, position, size)
+ {
+ this.type = type;
+ this.isBonus = bonus;
+ this.holdIdx = holdIndex;
+ this.holdNextIdx = holdNext;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Data/Chart/NotePlay.cs.meta b/Assets/Scripts/Data/Chart/NotePlay.cs.meta
new file mode 100644
index 0000000..a7458c3
--- /dev/null
+++ b/Assets/Scripts/Data/Chart/NotePlay.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ccfc6a251580ee67a83e2269870a227c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Mer.meta b/Assets/Scripts/Data/Mer.meta
new file mode 100644
index 0000000..a6ae7fc
--- /dev/null
+++ b/Assets/Scripts/Data/Mer.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0ed6e3a31145daf8597c9bd80394d64d
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Mer/Mer.cs b/Assets/Scripts/Data/Mer/Mer.cs
new file mode 100644
index 0000000..7cb711a
--- /dev/null
+++ b/Assets/Scripts/Data/Mer/Mer.cs
@@ -0,0 +1,146 @@
+/**
+ * Chart.cs
+ * Representation of a chart, constructed from a .mer file.
+ *
+ * by muskit
+ * July 1, 2022
+ **/
+
+using System;
+using System.Collections.Generic;
+
+namespace WacK.Data.Mer
+{
+ ///
+ /// Structurized representation of a .mer file.
+ ///
+ public class Mer
+ {
+ ///
+ /// HIERARCHY:
+ /// Key is measure.
+ /// Value is List of (beat/1920, Notes) tuples.
+ ///
+ public SortedList> notes = new SortedList>();
+
+ public int playableNoteCount { get; private set; }
+
+ ///
+ /// Construct Chart from contents of .mer file.
+ ///
+ /// Contents of a .mer file.
+ public Mer(string str)
+ {
+ if (str == String.Empty) return;
+
+ playableNoteCount = 0;
+
+ List lines = new List(str.Split('\n'));
+ foreach (var line in lines)
+ {
+ List tokens = new List(line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries));
+ if (tokens.Count == 0) continue;
+ if (tokens[0][0] == '#') continue;
+
+ int currentMeasure = int.Parse(tokens[0]);
+ int currentBeat = int.Parse(tokens[1]);
+
+ if (!notes.ContainsKey(currentMeasure))
+ {
+ notes[currentMeasure] = new List<(int, MerNote)>();
+ }
+
+ switch (tokens[2])
+ {
+ case "1": // common note types
+ switch(tokens[3])
+ {
+ case "1": // touch
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.Touch)));
+ ++playableNoteCount;
+ break;
+ case "2": // touch w/ bonus
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.Touch, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "20": // touch w/ bonus (+ "big effect")
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.Touch, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "16": // untimed
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.Untimed)));
+ ++playableNoteCount;
+ break;
+ case "26": // untimed w/ bonus
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.Untimed, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "3": // swipe in (red)
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeIn)));
+ ++playableNoteCount;
+ break;
+ case "21": // swipe in w/ bonus
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeIn, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "4": // swipe out (blue)
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeOut)));
+ ++playableNoteCount;
+ break;
+ case "22": // swipe out w/ bonus
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeOut, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "7": // swipe CCW
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeCCW)));
+ ++playableNoteCount;
+ break;
+ case "8": // swipe CCW w/ bonus
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeCCW, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "5": // swipe CW
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeCW)));
+ ++playableNoteCount;
+ break;
+ case "6": // swipe CW w/ bonus
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), type: MerType.SwipeCW, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "9": // hold start
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), holdIndex: int.Parse(tokens[4]), holdNext: int.Parse(tokens[8]), type: MerType.HoldStart)));
+ break;
+ case "25": // hold start (w/ bonus)
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), holdIndex: int.Parse(tokens[4]), holdNext: int.Parse(tokens[8]), type: MerType.HoldStart, bonus: true)));
+ ++playableNoteCount;
+ break;
+ case "10": // hold middle
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), holdIndex: int.Parse(tokens[4]), holdNext: int.Parse(tokens[8]), type: MerType.HoldMid)));
+ break;
+ case "11": // hold end
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), holdIndex: int.Parse(tokens[4]), type: MerType.HoldEnd)));
+ break;
+ case "12": // BG add
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), value: tokens[8], type: MerType.BGAdd)));
+ break;
+ case "13": // BG rem
+ notes[currentMeasure].Add((currentBeat, new MerNote(int.Parse(tokens[5]), int.Parse(tokens[6]), value: tokens[8], type: MerType.BGRem)));
+ break;
+
+ }
+ break;
+ case "2": // tempo
+ notes[currentMeasure].Add((currentBeat, new MerNote(value: tokens[3], type: MerType.Tempo)));
+ break;
+ case "3": // beats per measure
+ notes[currentMeasure].Add((currentBeat, new MerNote(value: $"{tokens[3]} {tokens[4]}", type: MerType.TimeSignature)));
+ break;
+ }
+ }
+ foreach (var measure in notes)
+ {
+ measure.Value.Sort((x, y) => x.Item1.CompareTo(y.Item1));
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/Data/Mer/Mer.cs.meta b/Assets/Scripts/Data/Mer/Mer.cs.meta
new file mode 100644
index 0000000..4ed5e08
--- /dev/null
+++ b/Assets/Scripts/Data/Mer/Mer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 03f65fd134dbd18faba49dbb870b3450
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/Mer/MerNote.cs b/Assets/Scripts/Data/Mer/MerNote.cs
new file mode 100644
index 0000000..a867d5b
--- /dev/null
+++ b/Assets/Scripts/Data/Mer/MerNote.cs
@@ -0,0 +1,38 @@
+/**
+ * Note.cs
+ * A struct representing a note.
+ *
+ * by muskit
+ * July 1, 2022
+ **/
+
+namespace WacK.Data.Mer
+{
+ public enum MerType
+ {
+ Touch, HoldStart, HoldMid, HoldEnd, Untimed, SwipeIn, SwipeOut, SwipeCW, SwipeCCW, Tempo, TimeSignature, BGAdd, BGRem
+ }
+ public struct MerNote
+ {
+ public MerType noteType { get; private set; }
+ public bool isBonus { get; private set; }
+
+ // Radial values in minutes
+ public int position { get; private set; }
+ public int size { get; private set; } // 1 <= size <= 60
+ public string value { get; private set; }
+ public int holdIdx { get; private set; }
+ public int holdNextIdx { get; private set; }
+
+ public MerNote(int position = 0, int size = 1, string value = "", int holdIndex = -1, int holdNext = -1, MerType type = MerType.Touch, bool bonus = false)
+ {
+ this.position = position;
+ this.size = size;
+ this.value = value;
+ this.holdIdx = holdIndex;
+ this.holdNextIdx = holdNext;
+ this.noteType = type;
+ this.isBonus = bonus;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Data/Mer/MerNote.cs.meta b/Assets/Scripts/Data/Mer/MerNote.cs.meta
new file mode 100644
index 0000000..84590cb
--- /dev/null
+++ b/Assets/Scripts/Data/Mer/MerNote.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f03d973b6879b96a5b79467d1dd3cbfc
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Util.cs b/Assets/Scripts/Util.cs
new file mode 100644
index 0000000..95cc485
--- /dev/null
+++ b/Assets/Scripts/Util.cs
@@ -0,0 +1,145 @@
+/**
+ * Util.cs
+ * Various conversion functions.
+ *
+ * by muskit
+ * July 26, 2022
+ **/
+
+using System;
+using Unity.Mathematics;
+using UnityEngine;
+
+namespace WacK
+{
+ public static class Util
+ {
+ public static float Seg2Rad(float seg)
+ {
+ return Mathf.Deg2Rad * 6f * seg;
+ }
+ public static float Rad2Seg(float angle)
+ {
+ return Mathf.Rad2Deg * angle / 6f;
+ }
+
+ public static int InterpInt(int a, int b, float ratio)
+ {
+ if (a == 0 && b == 0)
+ return 0;
+ return (int)Math.Round(a + (b - a) * ratio);
+ }
+
+ public static float InterpFloat(float a, float b, float ratio)
+ {
+ if (a == 0 && b == 0)
+ return 0;
+ return a + (b - a) * ratio;
+ }
+
+ // Returns an equivalent destination angle that's closest to the origin.
+ public static float NearestAngle(float origin, float destination)
+ {
+ float result = destination;
+
+ float plus = destination + 2f * Mathf.PI;
+ float minus = destination - 2f * Mathf.PI;
+ float minusDelta = Mathf.Abs(minus - origin);
+ float normDelta = Mathf.Abs(destination - origin);
+ float plusDelta = Mathf.Abs(plus - origin);
+ if (plusDelta < normDelta)
+ result = plus;
+ if (minusDelta < normDelta)
+ result = minus;
+
+ return result;
+ }
+
+ // Return an equivalent minute that's closest to the origin.
+ public static float NearestMinute(int origin, int destination)
+ {
+ int result = destination % 60;
+
+ int plus = destination + 60;
+ int minus = destination - 60;
+ int minusDelta = Math.Abs(minus - origin);
+ int normDelta = Math.Abs(destination - origin);
+ int plusDelta = Math.Abs(plus - origin);
+ if (plusDelta < normDelta)
+ result = plus;
+ if (minusDelta < normDelta)
+ result = minus;
+
+ return result;
+ }
+
+ public static float ScreenPixelToRad(Vector2 pos)
+ {
+ var resolution = Screen.currentResolution;
+ var origin = new Vector2(resolution.width / 2 - 1, resolution.height / 2 - 1);
+
+ return Mathf.Atan2(pos.y - origin.y, pos.x - origin.x);
+ }
+
+ public static int TouchPosToSegmentInt(Vector2 pos, Vector2 touchResolution)
+ {
+ var origin = new Vector2(touchResolution.x / 2 - 1, touchResolution.y / 2 - 1);
+ var angle = Mathf.Atan2(pos.y - origin.y, pos.x - origin.x);
+
+ if (angle > 0)
+ angle = 2f * Mathf.PI - angle;
+
+ return Mathf.FloorToInt(Mathf.Abs(angle) / 2f * Mathf.PI * 60) % 60;
+ }
+
+ public static int ScreenPixelToSegmentInt(Vector2 pos)
+ {
+ var angle = ScreenPixelToRad(pos);
+ if (angle > 0)
+ angle = 2f * Mathf.PI - angle;
+
+ return Mathf.FloorToInt(Mathf.Abs(angle) / 2f * Mathf.PI * 60) % 60;
+ }
+
+ public static float NoteTime(int measure, int beat, float tempo, int beatsPerMeasure)
+ {
+ if (tempo == 0) return 0; // avoid divide by 0
+
+ return 60f / tempo * beatsPerMeasure * ((float)measure + (float)beat / 1920f);
+ }
+
+ // public static float NotePosition(int measure, int beat, float tempo, int beatsPerMeasure)
+ // {
+ // if (tempo == 0) return 0; // avoid divide by 0
+ // return TimeToPosition(60f / tempo * beatsPerMeasure * ((float)measure + (float)beat / 1920f));
+ // }
+
+ // public static float TimeToPosition(float time)
+ // {
+ // return time * UserSettings.playSpeedMultiplier * UserSettings.SCROLL_MULT;
+ // }
+
+ // public static float PositionToTime(float pos)
+ // {
+ // return pos / UserSettings.playSpeedMultiplier / UserSettings.SCROLL_MULT;
+ // }
+
+ // TODO: notes scale to scroll position instead of strikeline
+ // (where calibration offsets can be applied)
+ // public static Vector3 NoteScale(float zPos, float zOrigin = 0)
+ // {
+ // var val = zPos - zOrigin;
+ // if (val <= Misc.noteDrawDistance)
+ // {
+ // var ratio = Mathf.Clamp((Misc.noteDrawDistance - val) / Misc.noteDrawDistance, 0, 1);
+ // return new Vector3(ratio, ratio, 1);
+ // }
+ // return Vector3.Zero;
+ // }
+
+ public static string DifficultyValueToString(float diffPoint)
+ {
+ return Mathf.FloorToInt(diffPoint).ToString() + (diffPoint > Mathf.Floor(diffPoint) ? "+" : "");
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Util.cs.meta b/Assets/Scripts/Util.cs.meta
new file mode 100644
index 0000000..97fcf52
--- /dev/null
+++ b/Assets/Scripts/Util.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 688459c0b01f03ca1a20a911252e2915
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings.meta b/Assets/Settings.meta
new file mode 100644
index 0000000..39b94dd
--- /dev/null
+++ b/Assets/Settings.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 709f11a7f3c4041caa4ef136ea32d874
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings/SampleSceneProfile.asset b/Assets/Settings/SampleSceneProfile.asset
new file mode 100644
index 0000000..37e401d
--- /dev/null
+++ b/Assets/Settings/SampleSceneProfile.asset
@@ -0,0 +1,123 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-7893295128165547882
+MonoBehaviour:
+ m_ObjectHideFlags: 3
+ 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: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3}
+ m_Name: Bloom
+ m_EditorClassIdentifier:
+ active: 1
+ m_AdvancedMode: 0
+ threshold:
+ m_OverrideState: 1
+ m_Value: 1
+ min: 0
+ intensity:
+ m_OverrideState: 1
+ m_Value: 1
+ min: 0
+ scatter:
+ m_OverrideState: 0
+ m_Value: 0.7
+ min: 0
+ max: 1
+ clamp:
+ m_OverrideState: 0
+ m_Value: 65472
+ min: 0
+ tint:
+ m_OverrideState: 0
+ m_Value: {r: 1, g: 1, b: 1, a: 1}
+ hdr: 0
+ showAlpha: 0
+ showEyeDropper: 1
+ highQualityFiltering:
+ m_OverrideState: 0
+ m_Value: 0
+ skipIterations:
+ m_OverrideState: 0
+ m_Value: 1
+ min: 0
+ max: 16
+ dirtTexture:
+ m_OverrideState: 0
+ m_Value: {fileID: 0}
+ dirtIntensity:
+ m_OverrideState: 0
+ m_Value: 0
+ min: 0
+--- !u!114 &-7011558710299706105
+MonoBehaviour:
+ m_ObjectHideFlags: 3
+ 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: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3}
+ m_Name: Vignette
+ m_EditorClassIdentifier:
+ active: 1
+ m_AdvancedMode: 0
+ color:
+ m_OverrideState: 0
+ m_Value: {r: 0, g: 0, b: 0, a: 1}
+ hdr: 0
+ showAlpha: 0
+ showEyeDropper: 1
+ center:
+ m_OverrideState: 0
+ m_Value: {x: 0.5, y: 0.5}
+ intensity:
+ m_OverrideState: 1
+ m_Value: 0.25
+ min: 0
+ max: 1
+ smoothness:
+ m_OverrideState: 1
+ m_Value: 0.4
+ min: 0.01
+ max: 1
+ rounded:
+ m_OverrideState: 0
+ m_Value: 0
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3}
+ m_Name: SampleSceneProfile
+ m_EditorClassIdentifier:
+ components:
+ - {fileID: 849379129802519247}
+ - {fileID: -7893295128165547882}
+ - {fileID: -7011558710299706105}
+--- !u!114 &849379129802519247
+MonoBehaviour:
+ m_ObjectHideFlags: 3
+ 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: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3}
+ m_Name: Tonemapping
+ m_EditorClassIdentifier:
+ active: 1
+ m_AdvancedMode: 0
+ mode:
+ m_OverrideState: 1
+ m_Value: 1
diff --git a/Assets/Settings/SampleSceneProfile.asset.meta b/Assets/Settings/SampleSceneProfile.asset.meta
new file mode 100644
index 0000000..f8cce64
--- /dev/null
+++ b/Assets/Settings/SampleSceneProfile.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a6560a915ef98420e9faacc1c7438823
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings/URP-Balanced-Renderer.asset b/Assets/Settings/URP-Balanced-Renderer.asset
new file mode 100644
index 0000000..e946432
--- /dev/null
+++ b/Assets/Settings/URP-Balanced-Renderer.asset
@@ -0,0 +1,81 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-1878332245247344467
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: f62c9c65cf3354c93be831c8bc075510, type: 3}
+ m_Name: SSAO
+ m_EditorClassIdentifier:
+ m_Active: 1
+ m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3}
+ m_Settings:
+ Downsample: 1
+ AfterOpaque: 0
+ Source: 0
+ NormalSamples: 0
+ Intensity: 0.5
+ DirectLightingStrength: 0.25
+ Radius: 0.25
+ SampleCount: 4
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3}
+ m_Name: URP-Balanced-Renderer
+ m_EditorClassIdentifier:
+ debugShaders:
+ debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7,
+ type: 3}
+ m_RendererFeatures:
+ - {fileID: -1878332245247344467}
+ m_RendererFeatureMap: adc0de57c6d2eee5
+ m_UseNativeRenderPass: 0
+ postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2}
+ shaders:
+ blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3}
+ copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
+ screenSpaceShadowPS: {fileID: 0}
+ samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
+ stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3}
+ fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3}
+ materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3}
+ coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
+ coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b,
+ type: 3}
+ cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf,
+ type: 3}
+ objectMotionVector: {fileID: 4800000, guid: 7b3ede40266cd49a395def176e1bc486,
+ type: 3}
+ m_AssetVersion: 1
+ m_OpaqueLayerMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_TransparentLayerMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_DefaultStencilState:
+ overrideStencilState: 0
+ stencilReference: 0
+ stencilCompareFunction: 8
+ passOperation: 2
+ failOperation: 0
+ zFailOperation: 0
+ m_ShadowTransparentReceive: 1
+ m_RenderingMode: 0
+ m_DepthPrimingMode: 1
+ m_AccurateGbufferNormals: 0
+ m_ClusteredRendering: 0
+ m_TileSize: 32
+ m_IntermediateTextureMode: 0
diff --git a/Assets/Settings/URP-Balanced-Renderer.asset.meta b/Assets/Settings/URP-Balanced-Renderer.asset.meta
new file mode 100644
index 0000000..8fa7f17
--- /dev/null
+++ b/Assets/Settings/URP-Balanced-Renderer.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e634585d5c4544dd297acaee93dc2beb
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings/URP-Balanced.asset b/Assets/Settings/URP-Balanced.asset
new file mode 100644
index 0000000..a4c84ef
--- /dev/null
+++ b/Assets/Settings/URP-Balanced.asset
@@ -0,0 +1,74 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
+ m_Name: URP-Balanced
+ m_EditorClassIdentifier:
+ k_AssetVersion: 9
+ k_AssetPreviousVersion: 9
+ m_RendererType: 1
+ m_RendererData: {fileID: 0}
+ m_RendererDataList:
+ - {fileID: 11400000, guid: e634585d5c4544dd297acaee93dc2beb, type: 2}
+ m_DefaultRendererIndex: 0
+ m_RequireDepthTexture: 0
+ m_RequireOpaqueTexture: 0
+ m_OpaqueDownsampling: 1
+ m_SupportsTerrainHoles: 1
+ m_StoreActionsOptimization: 0
+ m_SupportsHDR: 1
+ m_MSAA: 1
+ m_RenderScale: 1
+ m_UpscalingFilter: 0
+ m_FsrOverrideSharpness: 0
+ m_FsrSharpness: 0.92
+ m_MainLightRenderingMode: 1
+ m_MainLightShadowsSupported: 1
+ m_MainLightShadowmapResolution: 1024
+ m_AdditionalLightsRenderingMode: 1
+ m_AdditionalLightsPerObjectLimit: 2
+ m_AdditionalLightShadowsSupported: 0
+ m_AdditionalLightsShadowmapResolution: 512
+ m_AdditionalLightsShadowResolutionTierLow: 128
+ m_AdditionalLightsShadowResolutionTierMedium: 256
+ m_AdditionalLightsShadowResolutionTierHigh: 512
+ m_ReflectionProbeBlending: 0
+ m_ReflectionProbeBoxProjection: 1
+ m_ShadowDistance: 50
+ m_ShadowCascadeCount: 1
+ m_Cascade2Split: 0.25
+ m_Cascade3Split: {x: 0.1, y: 0.3}
+ m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467}
+ m_CascadeBorder: 0.1
+ m_ShadowDepthBias: 1
+ m_ShadowNormalBias: 1
+ m_SoftShadowsSupported: 1
+ m_ConservativeEnclosingSphere: 0
+ m_NumIterationsEnclosingSphere: 64
+ m_AdditionalLightsCookieResolution: 512
+ m_AdditionalLightsCookieFormat: 1
+ m_UseSRPBatcher: 1
+ m_SupportsDynamicBatching: 0
+ m_MixedLightingSupported: 1
+ m_SupportsLightLayers: 0
+ m_DebugLevel: 0
+ m_UseAdaptivePerformance: 1
+ m_ColorGradingMode: 0
+ m_ColorGradingLutSize: 32
+ m_UseFastSRGBLinearConversion: 0
+ m_ShadowType: 1
+ m_LocalShadowsSupported: 0
+ m_LocalShadowsAtlasResolution: 256
+ m_MaxPixelLights: 0
+ m_ShadowAtlasResolution: 256
+ m_ShaderVariantLogLevel: 0
+ m_VolumeFrameworkUpdateMode: 0
+ m_ShadowCascades: 0
diff --git a/Assets/Settings/URP-Balanced.asset.meta b/Assets/Settings/URP-Balanced.asset.meta
new file mode 100644
index 0000000..f524db0
--- /dev/null
+++ b/Assets/Settings/URP-Balanced.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e1260c1148f6143b28bae5ace5e9c5d1
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings/URP-HighFidelity-Renderer.asset b/Assets/Settings/URP-HighFidelity-Renderer.asset
new file mode 100644
index 0000000..9bb7a06
--- /dev/null
+++ b/Assets/Settings/URP-HighFidelity-Renderer.asset
@@ -0,0 +1,81 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-1878332245247344467
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: f62c9c65cf3354c93be831c8bc075510, type: 3}
+ m_Name: SSAO
+ m_EditorClassIdentifier:
+ m_Active: 1
+ m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3}
+ m_Settings:
+ Downsample: 0
+ AfterOpaque: 0
+ Source: 1
+ NormalSamples: 1
+ Intensity: 0.5
+ DirectLightingStrength: 0.25
+ Radius: 0.25
+ SampleCount: 12
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3}
+ m_Name: URP-HighFidelity-Renderer
+ m_EditorClassIdentifier:
+ debugShaders:
+ debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7,
+ type: 3}
+ m_RendererFeatures:
+ - {fileID: -1878332245247344467}
+ m_RendererFeatureMap: adc0de57c6d2eee5
+ m_UseNativeRenderPass: 0
+ postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2}
+ shaders:
+ blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3}
+ copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
+ screenSpaceShadowPS: {fileID: 0}
+ samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
+ stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3}
+ fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3}
+ materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3}
+ coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
+ coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b,
+ type: 3}
+ cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf,
+ type: 3}
+ objectMotionVector: {fileID: 4800000, guid: 7b3ede40266cd49a395def176e1bc486,
+ type: 3}
+ m_AssetVersion: 1
+ m_OpaqueLayerMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_TransparentLayerMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_DefaultStencilState:
+ overrideStencilState: 0
+ stencilReference: 0
+ stencilCompareFunction: 8
+ passOperation: 2
+ failOperation: 0
+ zFailOperation: 0
+ m_ShadowTransparentReceive: 1
+ m_RenderingMode: 0
+ m_DepthPrimingMode: 1
+ m_AccurateGbufferNormals: 0
+ m_ClusteredRendering: 0
+ m_TileSize: 32
+ m_IntermediateTextureMode: 0
diff --git a/Assets/Settings/URP-HighFidelity-Renderer.asset.meta b/Assets/Settings/URP-HighFidelity-Renderer.asset.meta
new file mode 100644
index 0000000..bcdff02
--- /dev/null
+++ b/Assets/Settings/URP-HighFidelity-Renderer.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c40be3174f62c4acf8c1216858c64956
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings/URP-HighFidelity.asset b/Assets/Settings/URP-HighFidelity.asset
new file mode 100644
index 0000000..6248100
--- /dev/null
+++ b/Assets/Settings/URP-HighFidelity.asset
@@ -0,0 +1,69 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
+ m_Name: URP-HighFidelity
+ m_EditorClassIdentifier:
+ k_AssetVersion: 9
+ k_AssetPreviousVersion: 9
+ m_RendererType: 1
+ m_RendererData: {fileID: 0}
+ m_RendererDataList:
+ - {fileID: 11400000, guid: c40be3174f62c4acf8c1216858c64956, type: 2}
+ m_DefaultRendererIndex: 0
+ m_RequireDepthTexture: 0
+ m_RequireOpaqueTexture: 0
+ m_OpaqueDownsampling: 1
+ m_SupportsTerrainHoles: 1
+ m_StoreActionsOptimization: 0
+ m_SupportsHDR: 1
+ m_MSAA: 4
+ m_RenderScale: 1
+ m_MainLightRenderingMode: 1
+ m_MainLightShadowsSupported: 1
+ m_MainLightShadowmapResolution: 4096
+ m_AdditionalLightsRenderingMode: 1
+ m_AdditionalLightsPerObjectLimit: 8
+ m_AdditionalLightShadowsSupported: 1
+ m_AdditionalLightsShadowmapResolution: 4096
+ m_AdditionalLightsShadowResolutionTierLow: 128
+ m_AdditionalLightsShadowResolutionTierMedium: 256
+ m_AdditionalLightsShadowResolutionTierHigh: 512
+ m_ReflectionProbeBlending: 1
+ m_ReflectionProbeBoxProjection: 1
+ m_ShadowDistance: 150
+ m_ShadowCascadeCount: 4
+ m_Cascade2Split: 0.25
+ m_Cascade3Split: {x: 0.1, y: 0.3}
+ m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467}
+ m_CascadeBorder: 0.1
+ m_ShadowDepthBias: 1
+ m_ShadowNormalBias: 1
+ m_SoftShadowsSupported: 1
+ m_AdditionalLightsCookieResolution: 4096
+ m_AdditionalLightsCookieFormat: 4
+ m_UseSRPBatcher: 1
+ m_SupportsDynamicBatching: 0
+ m_MixedLightingSupported: 1
+ m_SupportsLightLayers: 0
+ m_DebugLevel: 0
+ m_UseAdaptivePerformance: 1
+ m_ColorGradingMode: 0
+ m_ColorGradingLutSize: 32
+ m_UseFastSRGBLinearConversion: 0
+ m_ShadowType: 1
+ m_LocalShadowsSupported: 0
+ m_LocalShadowsAtlasResolution: 256
+ m_MaxPixelLights: 0
+ m_ShadowAtlasResolution: 256
+ m_ShaderVariantLogLevel: 0
+ m_VolumeFrameworkUpdateMode: 0
+ m_ShadowCascades: 1
diff --git a/Assets/Settings/URP-HighFidelity.asset.meta b/Assets/Settings/URP-HighFidelity.asset.meta
new file mode 100644
index 0000000..7416e17
--- /dev/null
+++ b/Assets/Settings/URP-HighFidelity.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7b7fd9122c28c4d15b667c7040e3b3fd
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings/URP-Performant-Renderer.asset b/Assets/Settings/URP-Performant-Renderer.asset
new file mode 100644
index 0000000..7cda107
--- /dev/null
+++ b/Assets/Settings/URP-Performant-Renderer.asset
@@ -0,0 +1,57 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3}
+ m_Name: URP-Performant-Renderer
+ m_EditorClassIdentifier:
+ debugShaders:
+ debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7,
+ type: 3}
+ m_RendererFeatures: []
+ m_RendererFeatureMap:
+ m_UseNativeRenderPass: 0
+ postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2}
+ shaders:
+ blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3}
+ copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
+ screenSpaceShadowPS: {fileID: 0}
+ samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
+ stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3}
+ fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3}
+ materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3}
+ coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
+ coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b,
+ type: 3}
+ cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf,
+ type: 3}
+ objectMotionVector: {fileID: 4800000, guid: 7b3ede40266cd49a395def176e1bc486,
+ type: 3}
+ m_AssetVersion: 1
+ m_OpaqueLayerMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_TransparentLayerMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_DefaultStencilState:
+ overrideStencilState: 0
+ stencilReference: 0
+ stencilCompareFunction: 8
+ passOperation: 2
+ failOperation: 0
+ zFailOperation: 0
+ m_ShadowTransparentReceive: 1
+ m_RenderingMode: 0
+ m_DepthPrimingMode: 1
+ m_AccurateGbufferNormals: 0
+ m_ClusteredRendering: 0
+ m_TileSize: 32
+ m_IntermediateTextureMode: 0
diff --git a/Assets/Settings/URP-Performant-Renderer.asset.meta b/Assets/Settings/URP-Performant-Renderer.asset.meta
new file mode 100644
index 0000000..912ff60
--- /dev/null
+++ b/Assets/Settings/URP-Performant-Renderer.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 707360a9c581a4bd7aa53bfeb1429f71
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Settings/URP-Performant.asset b/Assets/Settings/URP-Performant.asset
new file mode 100644
index 0000000..5e53341
--- /dev/null
+++ b/Assets/Settings/URP-Performant.asset
@@ -0,0 +1,69 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ 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: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
+ m_Name: URP-Performant
+ m_EditorClassIdentifier:
+ k_AssetVersion: 9
+ k_AssetPreviousVersion: 9
+ m_RendererType: 1
+ m_RendererData: {fileID: 0}
+ m_RendererDataList:
+ - {fileID: 11400000, guid: 707360a9c581a4bd7aa53bfeb1429f71, type: 2}
+ m_DefaultRendererIndex: 0
+ m_RequireDepthTexture: 0
+ m_RequireOpaqueTexture: 0
+ m_OpaqueDownsampling: 1
+ m_SupportsTerrainHoles: 1
+ m_StoreActionsOptimization: 0
+ m_SupportsHDR: 0
+ m_MSAA: 1
+ m_RenderScale: 1
+ m_MainLightRenderingMode: 1
+ m_MainLightShadowsSupported: 0
+ m_MainLightShadowmapResolution: 1024
+ m_AdditionalLightsRenderingMode: 0
+ m_AdditionalLightsPerObjectLimit: 4
+ m_AdditionalLightShadowsSupported: 0
+ m_AdditionalLightsShadowmapResolution: 512
+ m_AdditionalLightsShadowResolutionTierLow: 128
+ m_AdditionalLightsShadowResolutionTierMedium: 256
+ m_AdditionalLightsShadowResolutionTierHigh: 512
+ m_ReflectionProbeBlending: 0
+ m_ReflectionProbeBoxProjection: 0
+ m_ShadowDistance: 50
+ m_ShadowCascadeCount: 1
+ m_Cascade2Split: 0.25
+ m_Cascade3Split: {x: 0.1, y: 0.3}
+ m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467}
+ m_CascadeBorder: 0.1
+ m_ShadowDepthBias: 1
+ m_ShadowNormalBias: 1
+ m_SoftShadowsSupported: 0
+ m_AdditionalLightsCookieResolution: 2048
+ m_AdditionalLightsCookieFormat: 3
+ m_UseSRPBatcher: 1
+ m_SupportsDynamicBatching: 0
+ m_MixedLightingSupported: 1
+ m_SupportsLightLayers: 0
+ m_DebugLevel: 0
+ m_UseAdaptivePerformance: 1
+ m_ColorGradingMode: 0
+ m_ColorGradingLutSize: 16
+ m_UseFastSRGBLinearConversion: 0
+ m_ShadowType: 1
+ m_LocalShadowsSupported: 0
+ m_LocalShadowsAtlasResolution: 256
+ m_MaxPixelLights: 0
+ m_ShadowAtlasResolution: 256
+ m_ShaderVariantLogLevel: 0
+ m_VolumeFrameworkUpdateMode: 0
+ m_ShadowCascades: 0
diff --git a/Assets/Settings/URP-Performant.asset.meta b/Assets/Settings/URP-Performant.asset.meta
new file mode 100644
index 0000000..264c9c5
--- /dev/null
+++ b/Assets/Settings/URP-Performant.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d0e2fc18fe036412f8223b3b3d9ad574
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/TutorialInfo.meta b/Assets/TutorialInfo.meta
new file mode 100644
index 0000000..a700bca
--- /dev/null
+++ b/Assets/TutorialInfo.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ba062aa6c92b140379dbc06b43dd3b9b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/TutorialInfo/Icons.meta b/Assets/TutorialInfo/Icons.meta
new file mode 100644
index 0000000..1d19fb9
--- /dev/null
+++ b/Assets/TutorialInfo/Icons.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 8a0c9218a650547d98138cd835033977
+folderAsset: yes
+timeCreated: 1484670163
+licenseType: Store
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/TutorialInfo/Icons/URP.png b/Assets/TutorialInfo/Icons/URP.png
new file mode 100644
index 0000000000000000000000000000000000000000..6194a807e27158f864a7c7677f4cbf62d8b94503
GIT binary patch
literal 24069
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
HejoV",
+ "ignore": false,
+ "defaultInstantiationMode": 1,
+ "supportsModification": true
+ },
+ "newSceneOverride": 0
+}
\ No newline at end of file
diff --git a/ProjectSettings/ShaderGraphSettings.asset b/ProjectSettings/ShaderGraphSettings.asset
new file mode 100644
index 0000000..9b28428
--- /dev/null
+++ b/ProjectSettings/ShaderGraphSettings.asset
@@ -0,0 +1,16 @@
+%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: 11500000, guid: de02f9e1d18f588468e474319d09a723, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ customInterpolatorErrorThreshold: 32
+ customInterpolatorWarningThreshold: 16
diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset
new file mode 100644
index 0000000..1c92a78
--- /dev/null
+++ b/ProjectSettings/TagManager.asset
@@ -0,0 +1,43 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!78 &1
+TagManager:
+ serializedVersion: 2
+ tags: []
+ layers:
+ - Default
+ - TransparentFX
+ - Ignore Raycast
+ -
+ - Water
+ - UI
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ m_SortingLayers:
+ - name: Default
+ uniqueID: 0
+ locked: 0
diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset
new file mode 100644
index 0000000..558a017
--- /dev/null
+++ b/ProjectSettings/TimeManager.asset
@@ -0,0 +1,9 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!5 &1
+TimeManager:
+ m_ObjectHideFlags: 0
+ Fixed Timestep: 0.02
+ Maximum Allowed Timestep: 0.33333334
+ m_TimeScale: 1
+ Maximum Particle Timestep: 0.03
diff --git a/ProjectSettings/URPProjectSettings.asset b/ProjectSettings/URPProjectSettings.asset
new file mode 100644
index 0000000..c1f118a
--- /dev/null
+++ b/ProjectSettings/URPProjectSettings.asset
@@ -0,0 +1,15 @@
+%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: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_LastMaterialVersion: 5
diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset
new file mode 100644
index 0000000..a88bee0
--- /dev/null
+++ b/ProjectSettings/UnityConnectSettings.asset
@@ -0,0 +1,36 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!310 &1
+UnityConnectSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 1
+ m_Enabled: 0
+ m_TestMode: 0
+ m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
+ m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
+ m_ConfigUrl: https://config.uca.cloud.unity3d.com
+ m_DashboardUrl: https://dashboard.unity3d.com
+ m_TestInitMode: 0
+ CrashReportingSettings:
+ m_EventUrl: https://perf-events.cloud.unity3d.com
+ m_Enabled: 0
+ m_LogBufferSize: 10
+ m_CaptureEditorExceptions: 1
+ UnityPurchasingSettings:
+ m_Enabled: 0
+ m_TestMode: 0
+ UnityAnalyticsSettings:
+ m_Enabled: 0
+ m_TestMode: 0
+ m_InitializeOnStartup: 1
+ m_PackageRequiringCoreStatsPresent: 0
+ UnityAdsSettings:
+ m_Enabled: 0
+ m_InitializeOnStartup: 1
+ m_TestMode: 0
+ m_IosGameId:
+ m_AndroidGameId:
+ m_GameIds: {}
+ m_GameId:
+ PerformanceReportingSettings:
+ m_Enabled: 0
diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset
new file mode 100644
index 0000000..3a95c98
--- /dev/null
+++ b/ProjectSettings/VFXManager.asset
@@ -0,0 +1,12 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!937362698 &1
+VFXManager:
+ m_ObjectHideFlags: 0
+ m_IndirectShader: {fileID: 0}
+ m_CopyBufferShader: {fileID: 0}
+ m_SortShader: {fileID: 0}
+ m_StripUpdateShader: {fileID: 0}
+ m_RenderPipeSettingsPath:
+ m_FixedTimeStep: 0.016666668
+ m_MaxDeltaTime: 0.05
diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset
new file mode 100644
index 0000000..dca2881
--- /dev/null
+++ b/ProjectSettings/VersionControlSettings.asset
@@ -0,0 +1,8 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!890905787 &1
+VersionControlSettings:
+ m_ObjectHideFlags: 0
+ m_Mode: Visible Meta Files
+ m_CollabEditorSettings:
+ inProgressEnabled: 1
diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset
new file mode 100644
index 0000000..482590c
--- /dev/null
+++ b/ProjectSettings/XRSettings.asset
@@ -0,0 +1,10 @@
+{
+ "m_SettingKeys": [
+ "VR Device Disabled",
+ "VR Device User Alert"
+ ],
+ "m_SettingValues": [
+ "False",
+ "False"
+ ]
+}
\ No newline at end of file
diff --git a/ProjectSettings/boot.config b/ProjectSettings/boot.config
new file mode 100644
index 0000000..e69de29