diff options
Diffstat (limited to '')
378 files changed, 38166 insertions, 0 deletions
diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies.meta new file mode 100644 index 00000000..c5f77ea9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cd53db56acbdeda459f096cdfdbad2f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK.meta new file mode 100644 index 00000000..49a4ea40 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1c585f65609e26c44918fe5b27733e54 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll Binary files differnew file mode 100644 index 00000000..eb56c4a1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.mdb b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.mdb Binary files differnew file mode 100644 index 00000000..d71e4c69 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.mdb diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.mdb.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.mdb.meta new file mode 100644 index 00000000..d265ebc0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.mdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 378ce7362db1e424aa18decc8035d52f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.meta new file mode 100644 index 00000000..2c128952 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.CognitoIdentity.dll.meta @@ -0,0 +1,24 @@ +fileFormatVersion: 2 +guid: 820ee6e459999be418b410c7af108bc3 +timeCreated: 1480638870 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll Binary files differnew file mode 100644 index 00000000..0907a8eb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.mdb b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.mdb Binary files differnew file mode 100644 index 00000000..52fa100e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.mdb diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.mdb.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.mdb.meta new file mode 100644 index 00000000..bea72271 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.mdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7aff903b705db4a4ca954521620a3e83 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.meta new file mode 100644 index 00000000..0488bd01 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.Core.dll.meta @@ -0,0 +1,24 @@ +fileFormatVersion: 2 +guid: aecaffc7454b52e448fc0ea1aef2dd1d +timeCreated: 1480638874 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll Binary files differnew file mode 100644 index 00000000..5efd7fe3 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.mdb b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.mdb Binary files differnew file mode 100644 index 00000000..89f6137e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.mdb diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.mdb.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.mdb.meta new file mode 100644 index 00000000..874c0828 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.mdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 27a1b37fcab46604bbfcdceca8b1ba0b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.meta new file mode 100644 index 00000000..669f5abd --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.S3.dll.meta @@ -0,0 +1,24 @@ +fileFormatVersion: 2 +guid: d4055bfc0cd67d642a7eceaf547c4901 +timeCreated: 1480638876 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll Binary files differnew file mode 100644 index 00000000..b1f1e2a3 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.mdb b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.mdb Binary files differnew file mode 100644 index 00000000..9c52f139 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.mdb diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.mdb.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.mdb.meta new file mode 100644 index 00000000..f4a2ff95 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.mdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7e9c75132ea9a6f49b0544e68db48e74 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.meta new file mode 100644 index 00000000..c817dfdd --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/AWSSDK/AWSSDK.SecurityToken.dll.meta @@ -0,0 +1,24 @@ +fileFormatVersion: 2 +guid: 625a50dd0dd525a49a41cb3e3117fa15 +timeCreated: 1480638869 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib.meta new file mode 100644 index 00000000..2ee475fc --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f274aa6b4f9654f4ab021369110bf11d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/DotZLib.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/DotZLib.dll Binary files differnew file mode 100644 index 00000000..650d0392 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/DotZLib.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/DotZLib.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/DotZLib.dll.meta new file mode 100644 index 00000000..361b366e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/DotZLib.dll.meta @@ -0,0 +1,133 @@ +fileFormatVersion: 2 +guid: 34b0990e1522a284b9666d6821cd601c +timeCreated: 1499845244 +licenseType: Free +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + '': Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude Win: 0 + Exclude Win64: 0 + data: + first: + '': Editor + second: + enabled: 0 + settings: + CPU: AnyCPU + OS: AnyOS + data: + first: + Android: Android + second: + enabled: 0 + settings: + CPU: ARMv7 + data: + first: + Any: + second: + enabled: 1 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + data: + first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + data: + first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + data: + first: + Standalone: Linux + second: + enabled: 1 + settings: + CPU: x86 + data: + first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + data: + first: + Standalone: LinuxUniversal + second: + enabled: 1 + settings: {} + 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: {} + 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 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins.meta new file mode 100644 index 00000000..ccf8d5ed --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5f5d6ec7083e4ae4eac05f2fd47de70d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86.meta new file mode 100644 index 00000000..f92a4e2d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b526f5fec8ff2ec4199745de691cac75 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86/zlibwapi.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86/zlibwapi.dll Binary files differnew file mode 100644 index 00000000..bdec54cf --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86/zlibwapi.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86/zlibwapi.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86/zlibwapi.dll.meta new file mode 100644 index 00000000..1b6fc134 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86/zlibwapi.dll.meta @@ -0,0 +1,114 @@ +fileFormatVersion: 2 +guid: b609c54f9d3581e4fa22b3e389fd8d33 +timeCreated: 1499820240 +licenseType: Free +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + '': Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude Win: 0 + Exclude Win64: 0 + data: + first: + Any: + second: + enabled: 1 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86 + DefaultValueInitialized: true + data: + first: + Facebook: Win + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: None + data: + first: + Standalone: Linux + second: + enabled: 1 + settings: + CPU: x86 + data: + first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: None + data: + first: + Standalone: LinuxUniversal + second: + enabled: 1 + settings: + CPU: x86 + data: + first: + Standalone: OSXIntel + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: OSXIntel64 + second: + enabled: 1 + settings: + CPU: None + data: + first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86 + data: + first: + Standalone: Win + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: None + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64.meta new file mode 100644 index 00000000..922a72c2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6e92bcd653f92bd4ba738508a6576d30 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64/zlibwapi.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64/zlibwapi.dll Binary files differnew file mode 100644 index 00000000..917cc84b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64/zlibwapi.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64/zlibwapi.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64/zlibwapi.dll.meta new file mode 100644 index 00000000..229bfdb9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/DotZLib/Plugins/x86_64/zlibwapi.dll.meta @@ -0,0 +1,114 @@ +fileFormatVersion: 2 +guid: 54f59547b5261e64f8256d6daaa01b17 +timeCreated: 1499820211 +licenseType: Free +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + '': Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude Win: 0 + Exclude Win64: 0 + data: + first: + Any: + second: + enabled: 1 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + data: + first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: None + data: + first: + Facebook: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: Linux + second: + enabled: 1 + settings: + CPU: None + data: + first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + data: + first: + Standalone: LinuxUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + data: + first: + Standalone: OSXIntel + second: + enabled: 1 + settings: + CPU: None + data: + first: + Standalone: OSXIntel64 + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + data: + first: + Standalone: Win + second: + enabled: 1 + settings: + CPU: None + data: + first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed.meta new file mode 100644 index 00000000..86169da5 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba28b198b97022f4db1cf0756ff74859 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/Collections.Pooled.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/Collections.Pooled.dll Binary files differnew file mode 100644 index 00000000..09c2e33a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/Collections.Pooled.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/Collections.Pooled.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/Collections.Pooled.dll.meta new file mode 100644 index 00000000..f1e4487b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/Collections.Pooled.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: db74213609a3d444c8bc111a3e373878 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Buffers.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Buffers.dll Binary files differnew file mode 100644 index 00000000..c517a3b6 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Buffers.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Buffers.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Buffers.dll.meta new file mode 100644 index 00000000..191c1774 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Buffers.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9787e75870c1dc347a0943055c585c64 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Collections.Immutable.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Collections.Immutable.dll Binary files differnew file mode 100644 index 00000000..8bbc7604 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Collections.Immutable.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Collections.Immutable.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Collections.Immutable.dll.meta new file mode 100644 index 00000000..efba29dd --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Collections.Immutable.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 03440596fa1da9c4f9796a20de292254 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Memory.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Memory.dll Binary files differnew file mode 100644 index 00000000..bdfc501e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Memory.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Memory.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Memory.dll.meta new file mode 100644 index 00000000..355ff58e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Memory.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: c30a499f804ba2e4281452f42b3ce52d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Numerics.Vectors.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Numerics.Vectors.dll Binary files differnew file mode 100644 index 00000000..ce46d5be --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Numerics.Vectors.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Numerics.Vectors.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Numerics.Vectors.dll.meta new file mode 100644 index 00000000..d1ee3806 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Numerics.Vectors.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9b6143470b1a740428cde7079e2c7555 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Runtime.CompilerServices.Unsafe.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Runtime.CompilerServices.Unsafe.dll Binary files differnew file mode 100644 index 00000000..31562392 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Runtime.CompilerServices.Unsafe.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Runtime.CompilerServices.Unsafe.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Runtime.CompilerServices.Unsafe.dll.meta new file mode 100644 index 00000000..13133502 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Managed/System.Runtime.CompilerServices.Unsafe.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8b3b4a8bdfbaf344686d420abd25de73 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus.meta new file mode 100644 index 00000000..2e1e393d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b3d3d2bdae3cb7b4eb20b2aad827a89f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer.meta new file mode 100644 index 00000000..7f862483 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 67712a1ed85339c4fb4df0252af25383 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor.meta new file mode 100644 index 00000000..50e9796b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd8bc73f073055440815e9a0c0a91ac0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor/ONSPAudioSourceEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor/ONSPAudioSourceEditor.cs new file mode 100644 index 00000000..62ad97c2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor/ONSPAudioSourceEditor.cs @@ -0,0 +1,101 @@ +/************************************************************************************ +Filename : ONSPAudioSourceEditor.cs +Content : This script adds editor functionality to OculusSpatializerUserParams script. +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK Version 3.5 (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.5/ + +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 CUSTOM_LAYOUT + +using UnityEditor; +using UnityEngine; +using System.Collections.Generic; + +[CustomEditor(typeof(ONSPAudioSource))] + +public class OculusSpatializerUserParamsEditor : Editor +{ + // target component + private ONSPAudioSource m_Component; + + // OnEnable + void OnEnable() + { + m_Component = (ONSPAudioSource)target; + } + + // OnInspectorGUI + public override void OnInspectorGUI() + { + GUI.color = Color.white; + Undo.RecordObject(m_Component, "OculusSpatializerUserParams"); + + { + EditorGUILayout.HelpBox("Please use a VRC_SpatialAudioSource in the future.", MessageType.Error); + #if CUSTOM_LAYOUT + m_Component.EnableSpatialization = EditorGUILayout.Toggle("Spatialization Enabled", m_Component.EnableSpatialization); + m_Component.EnableRfl = EditorGUILayout.Toggle("Reflections Enabled", m_Component.EnableRfl); + m_Component.Gain = EditorGUILayout.FloatField("Gain", m_Component.Gain); + + Separator(); + + Label ("OCULUS ATTENUATION"); + m_Component.UseInvSqr = EditorGUILayout.Toggle("Enabled", m_Component.UseInvSqr); + Label (""); + Label("RANGE (0.0 - 1000000.0 meters)"); + m_Component.Near = EditorGUILayout.FloatField("Minimum", m_Component.Near); + m_Component.Far = EditorGUILayout.FloatField("Maximum", m_Component.Far); + + Label(""); + Label("VOLUMETRIC RADIUS (0.0 - 1000.0 meters)"); + m_Component.VolumetricRadius = EditorGUILayout.FloatField("Radius", m_Component.VolumetricRadius); + + Separator(); + + Label("REVERB SEND LEVEL (-60.0 - 20.0 decibels)"); + m_Component.ReverbSend = EditorGUILayout.FloatField(" ", m_Component.ReverbSend); + + Separator(); + + #else + DrawDefaultInspector (); + #endif + } + + if (GUI.changed) + { + EditorUtility.SetDirty(m_Component); + } + } + + // Utilities, move out of here (or copy over to other editor script) + + // Separator + void Separator() + { + GUI.color = new Color(1, 1, 1, 0.25f); + GUILayout.Box("", "HorizontalSlider", GUILayout.Height(16)); + GUI.color = Color.white; + } + + // Label + void Label(string label) + { + EditorGUILayout.LabelField (label); + } + +} + diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor/ONSPAudioSourceEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor/ONSPAudioSourceEditor.cs.meta new file mode 100644 index 00000000..cabe4386 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Editor/ONSPAudioSourceEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cb850b86de9091d4db4595959c56f954 +timeCreated: 1442269815 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts.meta new file mode 100644 index 00000000..1399d434 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cfc714641b0deb345be4779c85e44bbe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPAudioSource.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPAudioSource.cs new file mode 100644 index 00000000..677ffb90 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPAudioSource.cs @@ -0,0 +1,406 @@ +/************************************************************************************ +Filename : ONSPAudioSource.cs +Content : Interface into the Oculus Native Spatializer Plugin +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK Version 3.5 (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.5/ + +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. +************************************************************************************/ + +// Uncomment below to test access of read-only spatializer parameters +//#define TEST_READONLY_PARAMETERS + +using UnityEngine; +using System; +using System.Collections; +using System.Runtime.InteropServices; + +public class ONSPAudioSource : MonoBehaviour +{ +#if TEST_READONLY_PARAMETERS + // Spatializer read-only system parameters (global) + static int readOnly_GlobalRelectionOn = 8; + static int readOnly_NumberOfUsedSpatializedVoices = 9; +#endif + +#if VRC_CLIENT + // don't include in SDK, not compatible with Unity's version of spatializer + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + static void OnBeforeSceneLoadRuntimeMethod() + { + OSP_SetGlobalVoiceLimit(ONSPSettings.Instance.voiceLimit); + } +#endif + + // Import functions + public const string strONSPS = "AudioPluginOculusSpatializer"; + + [DllImport(strONSPS)] + private static extern void ONSP_GetGlobalRoomReflectionValues(ref bool reflOn, ref bool reverbOn, + ref float width, ref float height, ref float length); + + // Public + + [SerializeField] + private bool enableSpatialization = true; + public bool EnableSpatialization + { + get + { + return enableSpatialization; + } + set + { + enableSpatialization = value; + } + } + + [SerializeField] + private float gain = 0.0f; + public float Gain + { + get + { + return gain; + } + set + { + gain = Mathf.Clamp(value, 0.0f, 24.0f); + } + } + + [SerializeField] + private bool useInvSqr = false; + public bool UseInvSqr + { + get + { + return useInvSqr; + } + set + { + useInvSqr = value; + } + } + + [SerializeField] + private float near = 0.25f; + public float Near + { + get + { + return near; + } + set + { + near = Mathf.Clamp(value, 0.0f, 1000000.0f); + } + } + + [SerializeField] + private float far = 250.0f; + public float Far + { + get + { + return far; + } + set + { + far = Mathf.Clamp(value, 0.0f, 1000000.0f); + } + } + + [SerializeField] + private float volumetricRadius = 0.0f; + public float VolumetricRadius + { + get + { + return volumetricRadius; + } + set + { + volumetricRadius = Mathf.Clamp(value, 0.0f, 1000.0f); + } + } + + [SerializeField] + private float reverbSend = 0.0f; + public float ReverbSend + { + get + { + return reverbSend; + } + set + { + reverbSend = Mathf.Clamp(value, -60.0f, 20.0f); + } + } + + + [SerializeField] + private bool enableRfl = false; + public bool EnableRfl + { + get + { + return enableRfl; + } + set + { + enableRfl = value; + } + } + + + /// VRCHAT: We need to reset the params after avatar loading and viseme setup + public void Reset() + { + var source = GetComponent<AudioSource>(); + + if(source == null) + { + enabled = false; + return; + } + + SetParameters(ref source); + } + + /// <summary> + /// Awake this instance. + /// </summary> + void Awake() + { + Reset(); + } + + /// <summary> + /// Start this instance. + /// </summary> + void Start() + { +#if VRC_CLIENT + var source = GetComponent<AudioSource>(); + + if(source != null && source.outputAudioMixerGroup != VRCAudioManager.GetAvatarGroup()) + VRCAudioManager.ApplyGameAudioMixerSettings(source); +#endif + } + + /// <summary> + /// Update this instance. + /// </summary> + void LateUpdate() + { + // We might iterate through multiple sources / game object + var source = GetComponent<AudioSource>(); + + if(source == null) + { + enabled = false; + return; + } + + // READ-ONLY PARAMETER TEST +#if TEST_READONLY_PARAMETERS + float rfl_enabled = 0.0f; + source.GetSpatializerFloat(readOnly_GlobalRelectionOn, out rfl_enabled); + float num_voices = 0.0f; + source.GetSpatializerFloat(readOnly_NumberOfUsedSpatializedVoices, out num_voices); + + String readOnly = System.String.Format + ("Read only values: refl enabled: {0:F0} num voices: {1:F0}", rfl_enabled, num_voices); + Debug.Log(readOnly); +#endif + + // Check to see if we should disable spatializion + if ((Application.isPlaying == false) || + (AudioListener.pause == true) || + (source.isPlaying == false) || + (source.isActiveAndEnabled == false) + ) + { + source.spatialize = false; + return; + } + else + { + SetParameters(ref source); + } + } + + enum Parameters : int + { + P_GAIN = 0, + P_USEINVSQR, + P_NEAR, + P_FAR, + P_RADIUS, + P_DISABLE_RFL, + P_VSPEAKERMODE, + P_AMBISTAT, + P_READONLY_GLOBAL_RFL_ENABLED, // READ-ONLY + P_READONLY_NUM_VOICES, // READ-ONLY + P_SENDLEVEL, + P_NUM + }; + + /// <summary> + /// Sets the parameters. + /// </summary> + /// <param name="source">Source.</param> + public void SetParameters(ref AudioSource source) + { + // VRCHAT: indentation is weird intentionally, for easier diff + // VRC jnuccio: added try here to catch unknown exception reported in analytics + try + { + if (source == null) + return; + + // See if we should enable spatialization + source.spatialize = enableSpatialization; + + source.SetSpatializerFloat((int)Parameters.P_GAIN, gain); + // All inputs are floats; convert bool to 0.0 and 1.0 + if(useInvSqr == true) + source.SetSpatializerFloat((int)Parameters.P_USEINVSQR, 1.0f); + else + source.SetSpatializerFloat((int)Parameters.P_USEINVSQR, 0.0f); + + source.SetSpatializerFloat((int)Parameters.P_NEAR, near); + source.SetSpatializerFloat((int)Parameters.P_FAR, far); + + source.SetSpatializerFloat((int)Parameters.P_RADIUS, volumetricRadius); + + if(enableRfl == true) + source.SetSpatializerFloat((int)Parameters.P_DISABLE_RFL, 0.0f); + else + source.SetSpatializerFloat((int)Parameters.P_DISABLE_RFL, 1.0f); + + source.SetSpatializerFloat((int)Parameters.P_SENDLEVEL, reverbSend); + + // VRCHAT: indentation is weird intentionally, for easier diff + } + catch (Exception) + { + // not sure why this throws sometimes + } + } + + private static ONSPAudioSource RoomReflectionGizmoAS = null; + + /// <summary> + /// + /// </summary> + void OnDrawGizmos() + { + // Are we the first one created? make sure to set our static ONSPAudioSource + // for drawing out room parameters once + if(RoomReflectionGizmoAS == null) + { + RoomReflectionGizmoAS = this; + } + + Color c; + const float colorSolidAlpha = 0.1f; + + // Draw the near/far spheres + + // Near (orange) + c.r = 1.0f; + c.g = 0.5f; + c.b = 0.0f; + c.a = 1.0f; + Gizmos.color = c; + Gizmos.DrawWireSphere(transform.position, Near); + c.a = colorSolidAlpha; + Gizmos.color = c; + Gizmos.DrawSphere(transform.position, Near); + + // Far (red) + c.r = 1.0f; + c.g = 0.0f; + c.b = 0.0f; + c.a = 1.0f; + Gizmos.color = Color.red; + Gizmos.DrawWireSphere(transform.position, Far); + c.a = colorSolidAlpha; + Gizmos.color = c; + Gizmos.DrawSphere(transform.position, Far); + + // VolumetricRadius (purple) + c.r = 1.0f; + c.g = 0.0f; + c.b = 1.0f; + c.a = 1.0f; + Gizmos.color = c; + Gizmos.DrawWireSphere(transform.position, VolumetricRadius); + c.a = colorSolidAlpha; + Gizmos.color = c; + Gizmos.DrawSphere(transform.position, VolumetricRadius); + + // Draw room parameters ONCE only, provided reflection engine is on + if (RoomReflectionGizmoAS == this) + { + // Get global room parameters (write new C api to get reflection values) + bool reflOn = false; + bool reverbOn = false; + float width = 1.0f; + float height = 1.0f; + float length = 1.0f; + + ONSP_GetGlobalRoomReflectionValues(ref reflOn, ref reverbOn, ref width, ref height, ref length); + + // TO DO: Get the room reflection values and render those out as well (like we do in the VST) + + if((Camera.main != null) && (reflOn == true)) + { + // Set color of cube (cyan is early reflections only, white is with reverb on) + if(reverbOn == true) + c = Color.white; + else + c = Color.cyan; + + Gizmos.color = c; + Gizmos.DrawWireCube(Camera.main.transform.position, new Vector3(width, height, length)); + c.a = colorSolidAlpha; + Gizmos.color = c; + Gizmos.DrawCube(Camera.main.transform.position, new Vector3(width, height, length)); + } + } + } + + /// <summary> + /// + /// </summary> + void OnDestroy() + { + // We will null out single pointer instance + // of the room reflection gizmo since we are being destroyed. + // Any ONSPAS that is alive or born will re-set this pointer + // so that we only draw it once + if(RoomReflectionGizmoAS == this) + { + RoomReflectionGizmoAS = null; + } + } + + [System.Runtime.InteropServices.DllImport("AudioPluginOculusSpatializer")] + private static extern int OSP_SetGlobalVoiceLimit(int VoiceLimit); +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPAudioSource.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPAudioSource.cs.meta new file mode 100644 index 00000000..a5d0b64e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPAudioSource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e503ea6418d27594caa33b93cac1b06a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 1 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPSettings.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPSettings.cs new file mode 100644 index 00000000..de9c0c19 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPSettings.cs @@ -0,0 +1,55 @@ +using UnityEngine; +using System.Collections; + +#if UNITY_EDITOR +[UnityEditor.InitializeOnLoad] +#endif +public sealed class ONSPSettings : ScriptableObject +{ + [SerializeField] + public int voiceLimit = 16; // very conservative fallback + + private static ONSPSettings instance; + public static ONSPSettings Instance + { + get + { + if (instance == null) + { +#if UNITY_ANDROID + instance = Resources.Load<ONSPSettings>("ONSPSettings-Android"); +#else + instance = Resources.Load<ONSPSettings>("ONSPSettings"); +#endif + + // This can happen if the developer never input their App Id into the Unity Editor + // and therefore never created the OculusPlatformSettings.asset file + // Use a dummy object with defaults for the getters so we don't have a null pointer exception + if (instance == null) + { + instance = ScriptableObject.CreateInstance<ONSPSettings>(); + +#if UNITY_EDITOR + // Only in the editor should we save it to disk + 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"), +#if UNITY_ANDROID + "ONSPSettings-Android.asset"); +#else + "ONSPSettings.asset"); +#endif + UnityEditor.AssetDatabase.CreateAsset(instance, fullPath); +#endif + } + } + + return instance; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPSettings.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPSettings.cs.meta new file mode 100644 index 00000000..95435008 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/Oculus/Spatializer/Scripts/ONSPSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad074644ff568a14187a3690cfbd7534 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib.meta new file mode 100644 index 00000000..43295e22 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d9436d911eb9974b9201bb139ef3472 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib/ICSharpCode.SharpZipLib.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib/ICSharpCode.SharpZipLib.dll Binary files differnew file mode 100644 index 00000000..8ed2ab6c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib/ICSharpCode.SharpZipLib.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib/ICSharpCode.SharpZipLib.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib/ICSharpCode.SharpZipLib.dll.meta new file mode 100644 index 00000000..fe229b87 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/SharpZipLib/ICSharpCode.SharpZipLib.dll.meta @@ -0,0 +1,34 @@ +fileFormatVersion: 2 +guid: 5a8cc42eaba7a2a41b6ca3be3c40b315 +timeCreated: 1500596155 +licenseType: Free +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + Any: + second: + enabled: 1 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + data: + first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat.meta new file mode 100644 index 00000000..e612a358 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e2b75d148e825e1428b2c51101067f15 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor.meta new file mode 100644 index 00000000..73ab86d1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad83d1c3741330a43bc5f6b435eec5fb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS.meta new file mode 100644 index 00000000..ccee8d3d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3ff93e02e6372e84ea2959321025da76 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS/S3Manager.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS/S3Manager.cs new file mode 100644 index 00000000..c60c6d7f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS/S3Manager.cs @@ -0,0 +1,127 @@ +// +// Copyright 2014-2015 Amazon.com, +// Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the AWS Mobile SDK For Unity +// Sample Application License Agreement (the "License"). +// You may not use this file except in compliance with the +// License. A copy of the License is located +// in the "license" file accompanying this file. This file is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, 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; +using Amazon.S3; +using Amazon.S3.Model; +using Amazon.Runtime; +using System.IO; +using System; +using Amazon.S3.Util; +using System.Collections.Generic; +using Amazon.CognitoIdentity; +using Amazon; + +public class S3Manager : MonoBehaviour +{ + public string IdentityPoolId = "us-east-1:066cd25b-b249-4394-a267-7a49247aa8f9"; // vrchat identity pool id + public string CognitoIdentityRegion = RegionEndpoint.USEast1.SystemName; + private RegionEndpoint _CognitoIdentityRegion + { + get { return RegionEndpoint.GetBySystemName(CognitoIdentityRegion); } + } + public string S3Region = RegionEndpoint.USEast1.SystemName; + private RegionEndpoint _S3Region + { + get { return RegionEndpoint.GetBySystemName(S3Region); } + } + public string S3BucketName = "vrc-uploads"; // vrchat + + + private IAmazonS3 _s3Client; + private AWSCredentials _credentials; + + private AWSCredentials Credentials + { + get + { + if (_credentials == null) + _credentials = new CognitoAWSCredentials(IdentityPoolId, _CognitoIdentityRegion); + return _credentials; + } + } + + private IAmazonS3 Client + { + get + { + if (_s3Client == null) + { + _s3Client = new AmazonS3Client(Credentials, _S3Region); + } + //test comment + return _s3Client; + } + } + + void Start() + { + UnityInitializer.AttachToGameObject(this.gameObject); + } + + /// <summary> + /// Post Object to S3 Bucket. + /// </summary> + public PostObjectRequest PostObject(string filePath, string s3FolderName, Action<string> onSuccess = null) + { + string fileName = s3FolderName + "/" + System.IO.Path.GetFileName(filePath); + VRC.Core.Logger.Log ("uploading " + fileName, VRC.Core.DebugLevel.All); + + AWSConfigs.LoggingConfig.LogTo = LoggingOptions.None; + + var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); + + VRC.Core.Logger.Log ("Creating request object", VRC.Core.DebugLevel.All); + + var request = new PostObjectRequest() + { + Bucket = S3BucketName, + Key = fileName, + InputStream = stream, + CannedACL = S3CannedACL.Private + }; + + VRC.Core.Logger.Log ("Making HTTP post call", VRC.Core.DebugLevel.All); + + StartCoroutine(PostObjectRoutine(request, onSuccess)); + + return request; + } + + IEnumerator PostObjectRoutine(PostObjectRequest request, Action<string> onSuccess) + { + // make sure UnityInitializer call has time to initialize + yield return null; + yield return null; + + Client.PostObjectAsync(request, (responseObj) => + { + if (responseObj.Exception == null) + { + VRC.Core.Logger.Log("object " + responseObj.Request.Key + " posted to bucket " + responseObj.Request.Bucket, VRC.Core.DebugLevel.All); + string s3Url = string.Format("https://s3-us-west-2.amazonaws.com/{0}/{1}", responseObj.Request.Bucket, responseObj.Request.Key); + if(onSuccess != null) + onSuccess(s3Url); + } + else + { + VRC.Core.Logger.Log ("Exception while posting the result object"); + VRC.Core.Logger.Log("receieved error " + responseObj.Response.HttpStatusCode.ToString()); + } + }); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS/S3Manager.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS/S3Manager.cs.meta new file mode 100644 index 00000000..580d7b65 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/AWS/S3Manager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3d6a1d7b0624f414ba6fb922687a06da +timeCreated: 1480975716 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline.meta new file mode 100644 index 00000000..c6a0e404 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ca18025e95a6e984b8c787551d68cafb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples.meta new file mode 100644 index 00000000..9c3ef3d8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1225a8100b5b5344e8a2139d3c9d1ce2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs new file mode 100644 index 00000000..80f026e2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs @@ -0,0 +1,18 @@ +#if VRC_SDK_PIPELINE_SAMPLES + +using UnityEditor; + +namespace VRC.SDKBase.Editor.BuildPipeline.Samples +{ + public class VRCSDKBuildRequestedCallbackSample : IVRCSDKBuildRequestedCallback + { + public int callbackOrder => 0; + + public bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType) + { + return EditorUtility.DisplayDialog("Build Confirmation", "Are you sure you want to build?", "Yes", "Not Yes"); + } + } +} + +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs.meta new file mode 100644 index 00000000..1b52ab1e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a1d20f4241085e46bdddc71b691465b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef new file mode 100644 index 00000000..a59fc7d6 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef @@ -0,0 +1,12 @@ +{ + "name": "VRC.SDKBase.Editor.BuildPipeline", + "references": [], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +}
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef.meta new file mode 100644 index 00000000..ec3710a4 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 21332e1f0d937794d916d2402ba1943a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components.meta new file mode 100644 index 00000000..64c9cc6c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f4e32f750a7069c4183c336616444602 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/ApiCacheEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/ApiCacheEditor.cs new file mode 100644 index 00000000..297fc8fb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/ApiCacheEditor.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using VRC.Core; + +[CustomEditor(typeof(ApiCache))] +public class ApiCacheEditor : Editor { + public override void OnInspectorGUI() + { + foreach (System.Type type in ApiCache.cache.Keys) + { + Dictionary<string, ApiCache.CacheEntry> typeCache = ApiCache.cache[type]; + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel(type.Name); + EditorGUILayout.LabelField(typeCache.Count.ToString()); + EditorGUILayout.EndHorizontal(); + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/ApiCacheEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/ApiCacheEditor.cs.meta new file mode 100644 index 00000000..7c1cdd09 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/ApiCacheEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 39cdf3092ab81be4b9e623cb5a8819d8 +timeCreated: 1509575680 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/AutoAddSpatialAudioComponents.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/AutoAddSpatialAudioComponents.cs new file mode 100644 index 00000000..3ba78457 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/AutoAddSpatialAudioComponents.cs @@ -0,0 +1,218 @@ +using UnityEngine; +using System.Collections; +using UnityEditor; +using VRC.SDKBase; + +[InitializeOnLoad] +public class AutoAddSpatialAudioComponents +{ + + public static bool Enabled = true; + + static AutoAddSpatialAudioComponents() + { + EditorApplication.hierarchyChanged += OnHierarchyWindowChanged; + EditorApplication.projectChanged += OnProjectWindowChanged; + RegisterCallbacks(); + } + + static void OnHierarchyWindowChanged() + { + if (!Enabled) + { + EditorApplication.hierarchyChanged -= OnHierarchyWindowChanged; + return; + } + + // check for proper use of VRCSP, and warn + //TryToAddSpatializationToAllAudioSources(true, false); + } + + static void OnProjectWindowChanged() + { + RegisterCallbacks(); + } + + static void RegisterCallbacks() + { + VRCSdkControlPanel._EnableSpatialization = VRCSDKControlPanel_EnableSpatialization; + } + + // callback from VrcSdkControlPanel in dll + public static void VRCSDKControlPanel_EnableSpatialization() + { + Debug.Log("Enabling spatialization on 3D AudioSources..."); + TryToAddSpatializationToAllAudioSources(false, true); + } + + static bool ApplyDefaultSpatializationToAudioSource(AudioSource audioSrc, bool force = false) + { + if (audioSrc == null) + return false; + + var vrcsp = audioSrc.gameObject.GetComponent<VRC.SDKBase.VRC_SpatialAudioSource>(); + + // don't make changes if we already have a vrcsp and we aren't forcing + if (vrcsp != null && !force) + return false; + + if (force) + audioSrc.spatialBlend = 1; + + bool initValues = force; + + // is audio source set to be 2D? + bool is2D = audioSrc.spatialBlend == 0; + + if (vrcsp == null) + { + // no onsp and no vrcsp, so add + vrcsp = audioSrc.gameObject.AddComponent<VRC.SDKBase.VRC_SpatialAudioSource>(); + if (is2D) + { + // this audio source was marked as 2D, leave the vrcsp disabled + vrcsp.EnableSpatialization = false; + } + initValues = true; + } + + audioSrc.spatialize = vrcsp.EnableSpatialization; + vrcsp.enabled = true; + + if (initValues) + { + bool isAvatar = audioSrc.GetComponentInParent<VRC.SDKBase.VRC_AvatarDescriptor>(); + + vrcsp.Gain = isAvatar ? AudioManagerSettings.AvatarAudioMaxGain : AudioManagerSettings.RoomAudioGain; + vrcsp.Near = 0; + vrcsp.Far = isAvatar ? AudioManagerSettings.AvatarAudioMaxRange : AudioManagerSettings.RoomAudioMaxRange; + vrcsp.UseAudioSourceVolumeCurve = false; + } + + return true; + } + + public static void TryToAddSpatializationToAllAudioSources(bool newAudioSourcesOnly, bool includeInactive) + { + AudioSource[] allAudioSources = includeInactive ? Resources.FindObjectsOfTypeAll<AudioSource>() : Object.FindObjectsOfType<AudioSource>(); + foreach (AudioSource src in allAudioSources) + { + if (src == null || src.gameObject == null || src.gameObject.scene != UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()) + { + continue; + } + + if (newAudioSourcesOnly) + { + if (!IsNewAudioSource(src)) + continue; + + UnityEngine.Audio.AudioMixerGroup mixer = AssetDatabase.LoadAssetAtPath<UnityEngine.Audio.AudioMixerGroup>("Assets/VRCSDK/Dependencies/OSPNative/scenes/mixers/SpatializerMixer.mixer"); + if (mixer != null) + { + src.outputAudioMixerGroup = mixer; + } + } + + if (ApplyDefaultSpatializationToAudioSource(src, false)) + { + Debug.Log("Automatically added VRC_SpatialAudioSource component to " + GetGameObjectPath(src.gameObject) + "!"); + } + } + } + + static bool IsNewAudioSource(AudioSource src) + { + var vrcsp = src.GetComponent<VRC_SpatialAudioSource>(); + if (vrcsp != null) + return false; + + if (src.clip != null) + return false; + if (src.outputAudioMixerGroup != null) + return false; + + if (src.mute || src.bypassEffects || src.bypassReverbZones || !src.playOnAwake || src.loop) + return false; + + if (src.priority != 128 || + !Mathf.Approximately(src.volume, 1.0f) || + !Mathf.Approximately(src.pitch, 1.0f) || + !Mathf.Approximately(src.panStereo, 0.0f) || + !Mathf.Approximately(src.spatialBlend, 0.0f) || + !Mathf.Approximately(src.reverbZoneMix, 1.0f)) + { + return false; + } + + if (!Mathf.Approximately(src.dopplerLevel, 1.0f) || + !Mathf.Approximately(src.spread, 0.0f) || + src.rolloffMode != AudioRolloffMode.Logarithmic || + !Mathf.Approximately(src.minDistance, 1.0f) || + !Mathf.Approximately(src.maxDistance, 500.0f)) + { + return false; + } + + return true; + } + + static string GetGameObjectPath(GameObject obj) + { + string path = "/" + obj.name; + while (obj.transform.parent != null) + { + obj = obj.transform.parent.gameObject; + path = "/" + obj.name + path; + } + return path; + } + + public static void ConvertONSPAudioSource(AudioSource src) + { + if (src == null) return; + + var onsp = src.GetComponent<ONSPAudioSource>(); + if (onsp != null) + { + var vrcsp = src.gameObject.GetComponent<VRC.SDKBase.VRC_SpatialAudioSource>(); + if (vrcsp == null) + { + // copy the values from deprecated component + vrcsp = src.gameObject.AddComponent<VRC.SDKBase.VRC_SpatialAudioSource>(); + vrcsp.Gain = onsp.Gain; + vrcsp.Near = onsp.Near; + vrcsp.Far = onsp.Far; + vrcsp.UseAudioSourceVolumeCurve = !onsp.UseInvSqr; + vrcsp.EnableSpatialization = onsp.EnableSpatialization; + } + // remove deprecated component + Component.DestroyImmediate(onsp); + } + } + + public static void AddVRCSpatialToBareAudioSource(AudioSource src) + { + if (src == null) return; + + var vrcsp = src.gameObject.GetComponent<VRC.SDKBase.VRC_SpatialAudioSource>(); + if (vrcsp != null) return; + + vrcsp = src.gameObject.AddComponent<VRC.SDKBase.VRC_SpatialAudioSource>(); + + // add default values + bool isAvatar = src.gameObject.GetComponentInParent<VRC.SDKBase.VRC_AvatarDescriptor>(); + + vrcsp.Gain = isAvatar ? AudioManagerSettings.AvatarAudioMaxGain : AudioManagerSettings.RoomAudioGain; + vrcsp.Near = 0; + vrcsp.Far = isAvatar ? AudioManagerSettings.AvatarAudioMaxRange : AudioManagerSettings.RoomAudioMaxRange; + vrcsp.UseAudioSourceVolumeCurve = false; + + // enable spatialization if src is not 2D + AnimationCurve curve = src.GetCustomCurve(AudioSourceCurveType.SpatialBlend); + if (src.spatialBlend == 0 || (curve == null || curve.keys.Length <= 1)) + vrcsp.EnableSpatialization = false; + else + vrcsp.EnableSpatialization = true; + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/AutoAddSpatialAudioComponents.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/AutoAddSpatialAudioComponents.cs.meta new file mode 100644 index 00000000..2269c8fc --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/AutoAddSpatialAudioComponents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a364ece829b6234888c59987a305a00 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorCoroutine.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorCoroutine.cs new file mode 100644 index 00000000..8363d450 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorCoroutine.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +public class EditorCoroutine +{ + public static EditorCoroutine Start( IEnumerator _routine ) + { + EditorCoroutine coroutine = new EditorCoroutine(_routine); + coroutine.start(); + return coroutine; + } + + + public static EditorCoroutine Start(System.Action _action) + { + EditorCoroutine coroutine = new EditorCoroutine(_action); + coroutine.start(); + return coroutine; + } + + readonly IEnumerator routine; + EditorCoroutine( IEnumerator _routine ) + { + routine = _routine; + } + + readonly System.Action action; + EditorCoroutine(System.Action _action) + { + action = _action; + } + + void start() + { + EditorApplication.update += update; + } + public void stop() + { + EditorApplication.update -= update; + } + + void update() + { + if (routine != null) + { + if (!routine.MoveNext()) + stop(); + } + else if (action != null) + { + action(); + stop(); + } + else + stop(); + + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorCoroutine.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorCoroutine.cs.meta new file mode 100644 index 00000000..dc452288 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorCoroutine.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 89005ebc9543e0a4284893c09ca19b1d +timeCreated: 1473271738 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorHandling.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorHandling.cs new file mode 100644 index 00000000..32923b58 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorHandling.cs @@ -0,0 +1,17 @@ +using UnityEditor; +using UnityEngine.SceneManagement; + +[InitializeOnLoad] +public static class EditorHandling +{ + static EditorHandling() + { + UnityEditor.SceneManagement.EditorSceneManager.sceneOpened += SceneOpenedCallback; + } + + static void SceneOpenedCallback( Scene scene, UnityEditor.SceneManagement.OpenSceneMode mode) + { + // refresh window when scene is opened to display content images correctly + if (null != VRCSdkControlPanel.window) VRCSdkControlPanel.window.Reset(); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorHandling.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorHandling.cs.meta new file mode 100644 index 00000000..7657e22a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EditorHandling.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d6c2e367eaa9564ebf6267ec163cfbd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EventHandlerEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EventHandlerEditor.cs new file mode 100644 index 00000000..fcca3092 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EventHandlerEditor.cs @@ -0,0 +1,358 @@ +#if UNITY_EDITOR + +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; +using System.Collections.Generic; +using System.Linq; +using VRC.SDKBase; + +namespace VRCSDK2 +{ +#if VRC_SDK_VRCSDK2 + [CustomEditor(typeof(VRCSDK2.VRC_EventHandler))] + public class EventHandlerEditor : UnityEditor.Editor + { + bool showDeferredEvents = false; + + static VRCSDK2.VRC_EventHandler.VrcEventType lastAddedEventType = VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage; + + public override void OnInspectorGUI() + { + VRCSDK2.VRC_EventHandler myTarget = (VRCSDK2.VRC_EventHandler)target; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("ID:"); + EditorGUILayout.EndHorizontal(); + + if (myTarget.GetComponent<VRCSDK2.VRC_Trigger>() != null) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Add Events via the VRC_Trigger on this object."); + EditorGUILayout.EndHorizontal(); + } + else + { + EditorGUI.BeginChangeCheck(); + + RenderOldEditor(myTarget); + + if (EditorGUI.EndChangeCheck()) + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + } + + if (myTarget.deferredEvents.Count > 0) + { + showDeferredEvents = EditorGUILayout.Foldout(showDeferredEvents, "Deferred Events"); + if (showDeferredEvents) + RenderEvents(myTarget.deferredEvents); + } + } + + int[] sendMessageMethodIndicies; + private void RenderOldEditor(VRCSDK2.VRC_EventHandler myTarget) + { + EditorGUILayout.HelpBox("Please use a VRC_Trigger in the future.", MessageType.Error); + + if (GUILayout.Button("Add Event Handler")) + myTarget.Events.Add(new VRCSDK2.VRC_EventHandler.VrcEvent()); + + bool first = true; + int deleteEventIndex = -1; + if (sendMessageMethodIndicies == null || sendMessageMethodIndicies.Length != myTarget.Events.Count) + sendMessageMethodIndicies = new int[myTarget.Events.Count + 1]; + + for (int i = 0; i < myTarget.Events.Count; ++i) + { + if (!first) + EditorGUILayout.Separator(); + first = false; + + EditorGUILayout.LabelField("Event " + (i + 1).ToString()); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Event Name"); + myTarget.Events[i].Name = EditorGUILayout.TextField(myTarget.Events[i].Name); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Event Type"); + myTarget.Events[i].EventType = (VRCSDK2.VRC_EventHandler.VrcEventType)EditorGUILayout.EnumPopup(myTarget.Events[i].EventType); + EditorGUILayout.EndHorizontal(); + + switch (myTarget.Events[i].EventType) + { + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationBool: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Variable"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationFloat: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Variable"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Value"); + myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationTrigger: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Trigger"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AudioTrigger: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("AudioSource"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Mesh"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.PlayAnimation: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Target"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Animation"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Command"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Receiver"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Message"); + + // sorry for this shit show. Below allows us to show a list of public methods, but also allow custom messages + var methods = VRC_EditorTools.GetAccessibleMethodsOnGameObject(myTarget.Events[i].ParameterObject); + List<string> methodList = methods.Values.Aggregate(new List<string>(), (acc, lst) => { acc.AddRange(lst.Select(mi => mi.Name)); return acc; }); + methodList.Add("Custom Message"); + + string[] _choices = methodList.ToArray(); + + int currentIndex = methodList.Count - 1; + + if (methodList.Contains(myTarget.Events[i].ParameterString)) + currentIndex = methodList.IndexOf(myTarget.Events[i].ParameterString); + + sendMessageMethodIndicies[i] = EditorGUILayout.Popup(currentIndex, _choices); + + if (sendMessageMethodIndicies[i] != methodList.Count - 1) + { + myTarget.Events[i].ParameterString = _choices[sendMessageMethodIndicies[i]]; + } + else + { + if (methodList.Contains(myTarget.Events[i].ParameterString)) + myTarget.Events[i].ParameterString = ""; + + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + } + + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetGameObjectActive: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("GameObject"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetParticlePlaying: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Target"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.TeleportPlayer: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Location"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Align Room To Destination"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelURI: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("URI"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Panel"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelVolume: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Volume"); + myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Panel"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + break; + default: + EditorGUILayout.BeginHorizontal(); + GUIStyle redText = new GUIStyle(); + redText.normal.textColor = Color.red; + EditorGUILayout.LabelField("Unsupported event type", redText); + EditorGUILayout.EndHorizontal(); + break; + } + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Delete " + myTarget.Events[i].Name + "?"); + if (GUILayout.Button("delete")) + deleteEventIndex = i; + EditorGUILayout.EndHorizontal(); + + if (myTarget.Events[i].ParameterObject == null) + myTarget.Events[i].ParameterObject = myTarget.gameObject; + } + + + if (deleteEventIndex != -1) + myTarget.Events.RemoveAt(deleteEventIndex); + } + + private void RenderEvents(IEnumerable<VRCSDK2.VRC_EventHandler.EventInfo> entries) + { + foreach (VRCSDK2.VRC_EventHandler.EventInfo entry in entries) + { + EditorGUILayout.PrefixLabel("Target"); + EditorGUILayout.ObjectField(entry.evt.ParameterObject, typeof(GameObject), true); + + EditorGUILayout.LabelField(string.Format("Name: {0}", entry.evt.Name)); + EditorGUILayout.LabelField(string.Format("Type: {0}", entry.evt.EventType)); + EditorGUILayout.LabelField(string.Format("Bool: {0}", entry.evt.ParameterBool)); + EditorGUILayout.LabelField(string.Format("Float: {0}", entry.evt.ParameterFloat)); + EditorGUILayout.LabelField(string.Format("Int: {0}", entry.evt.ParameterInt)); + EditorGUILayout.LabelField(string.Format("String: {0}", entry.evt.ParameterString)); + + EditorGUILayout.Space(); + } + } + + public static void RenderEditor(VRCSDK2.VRC_EventHandler myTarget) + { + bool first = true; + int deleteEventIndex = -1; + + for (int i = 0; i < myTarget.Events.Count; ++i) + { + if (!first) + EditorGUILayout.Separator(); + first = false; + + if (RenderEventHeader(myTarget, myTarget.Events[i])) + deleteEventIndex = i; + + RenderEventHeader(myTarget, myTarget.Events[i]); + + if (myTarget.Events[i].ParameterObject == null) + myTarget.Events[i].ParameterObject = myTarget.gameObject; + } + + if (deleteEventIndex != -1) + myTarget.Events.RemoveAt(deleteEventIndex); + } + + public static VRCSDK2.VRC_EventHandler.VrcEvent RenderAddEvent(VRCSDK2.VRC_EventHandler myTarget) + { + VRCSDK2.VRC_EventHandler.VrcEvent newEvent = null; + + EditorGUILayout.BeginHorizontal(); + lastAddedEventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", lastAddedEventType, (v) => v != VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject && v != VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage); + if (GUILayout.Button("Add")) + { + newEvent = new VRCSDK2.VRC_EventHandler.VrcEvent + { + EventType = lastAddedEventType, + ParameterObject = myTarget.gameObject + }; + myTarget.Events.Add(newEvent); + EditorUtility.SetDirty(myTarget); + } + EditorGUILayout.EndHorizontal(); + + return newEvent; + } + + public static bool RenderEventHeader(VRCSDK2.VRC_EventHandler myTarget, VRCSDK2.VRC_EventHandler.VrcEvent evt) + { + EditorGUILayout.BeginHorizontal(); + evt.EventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", evt.EventType, (v) => v != VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject && v != VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage); + bool delete = GUILayout.Button("Remove"); + EditorGUILayout.EndHorizontal(); + + return delete; + } + } + + [CustomEditor(typeof(VRC.SDKBase.VRC_EventHandler))] + public class SDKBaseEventHandlerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.LabelField("Event Handlers are not supported in VRCSDK3."); + if (GUILayout.Button("replace me with the correct VRC_EventHandler")) + { + var go = ((VRC.SDKBase.VRC_EventHandler)target).gameObject; + DestroyImmediate(target); + go.AddComponent<VRCSDK2.VRC_EventHandler>(); + } + } + } +#else + + [CustomEditor(typeof(VRC.SDKBase.VRC_EventHandler))] + public class SDKBaseEventHandlerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.LabelField("Event Handlers are not supported in VRCSDK3."); + if( GUILayout.Button("delete me") ) + DestroyImmediate(target); + } + } + +#endif + + +} +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EventHandlerEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EventHandlerEditor.cs.meta new file mode 100644 index 00000000..d0632d47 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/EventHandlerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4810e652e8242384c834320970702290 +timeCreated: 1454469344 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/OldTriggerEditors.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/OldTriggerEditors.cs new file mode 100644 index 00000000..ab085ca3 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/OldTriggerEditors.cs @@ -0,0 +1,48 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR + +#pragma warning disable 0618 + +using UnityEditor; +using System.Collections; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_KeyEvents))] + public class VRC_KeyEventsEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_UseEvents))] + public class VRC_UseEventsEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_TriggerColliderEventTrigger))] + public class VRC_TriggerColliderEventTriggerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_TimedEvents))] + public class VRC_TimedEventsEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } +} + +#pragma warning restore 0618 +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/OldTriggerEditors.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/OldTriggerEditors.cs.meta new file mode 100644 index 00000000..d3b115e7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/OldTriggerEditors.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 482185bf29f12074dada194ffef6a682 +timeCreated: 1475877803 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCAvatarDescriptorEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCAvatarDescriptorEditor.cs new file mode 100644 index 00000000..c248f212 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCAvatarDescriptorEditor.cs @@ -0,0 +1,225 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; +using VRC.SDK3.Editor; +using VRC.SDKBase.Editor; + +[CustomEditor(typeof(VRCSDK2.VRC_AvatarDescriptor))] +public class AvatarDescriptorEditor : Editor +{ + VRCSDK2.VRC_AvatarDescriptor avatarDescriptor; + VRC.Core.PipelineManager pipelineManager; + + SkinnedMeshRenderer selectedMesh; + List<string> blendShapeNames = null; + + bool shouldRefreshVisemes = false; + + public override void OnInspectorGUI() + { + if (avatarDescriptor == null) + avatarDescriptor = (VRCSDK2.VRC_AvatarDescriptor)target; + + if (pipelineManager == null) + { + pipelineManager = avatarDescriptor.GetComponent<VRC.Core.PipelineManager>(); + if (pipelineManager == null) + avatarDescriptor.gameObject.AddComponent<VRC.Core.PipelineManager>(); + } + + // DrawDefaultInspector(); + + if(VRCSdkControlPanel.window != null) + { + if( GUILayout.Button( "Select this avatar in the SDK control panel" ) ) + VRCSdkControlPanelAvatarBuilder.SelectAvatar(avatarDescriptor); + } + + avatarDescriptor.ViewPosition = EditorGUILayout.Vector3Field("View Position", avatarDescriptor.ViewPosition); + //avatarDescriptor.Name = EditorGUILayout.TextField("Avatar Name", avatarDescriptor.Name); + avatarDescriptor.Animations = (VRCSDK2.VRC_AvatarDescriptor.AnimationSet)EditorGUILayout.EnumPopup("Default Animation Set", avatarDescriptor.Animations); + avatarDescriptor.CustomStandingAnims = (AnimatorOverrideController)EditorGUILayout.ObjectField("Custom Standing Anims", avatarDescriptor.CustomStandingAnims, typeof(AnimatorOverrideController), true, null); + avatarDescriptor.CustomSittingAnims = (AnimatorOverrideController)EditorGUILayout.ObjectField("Custom Sitting Anims", avatarDescriptor.CustomSittingAnims, typeof(AnimatorOverrideController), true, null); + avatarDescriptor.ScaleIPD = EditorGUILayout.Toggle("Scale IPD", avatarDescriptor.ScaleIPD); + + avatarDescriptor.lipSync = (VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle)EditorGUILayout.EnumPopup("Lip Sync", avatarDescriptor.lipSync); + switch (avatarDescriptor.lipSync) + { + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.Default: + if (GUILayout.Button("Auto Detect!")) + AutoDetectLipSync(); + break; + + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape: + avatarDescriptor.VisemeSkinnedMesh = (SkinnedMeshRenderer)EditorGUILayout.ObjectField("Face Mesh", avatarDescriptor.VisemeSkinnedMesh, typeof(SkinnedMeshRenderer), true); + if (avatarDescriptor.VisemeSkinnedMesh != null) + { + DetermineBlendShapeNames(); + + int current = -1; + for (int b = 0; b < blendShapeNames.Count; ++b) + if (avatarDescriptor.MouthOpenBlendShapeName == blendShapeNames[b]) + current = b; + + string title = "Jaw Flap Blend Shape"; + int next = EditorGUILayout.Popup(title, current, blendShapeNames.ToArray()); + if (next >= 0) + avatarDescriptor.MouthOpenBlendShapeName = blendShapeNames[next]; + } + break; + + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBone: + avatarDescriptor.lipSyncJawBone = (Transform)EditorGUILayout.ObjectField("Jaw Bone", avatarDescriptor.lipSyncJawBone, typeof(Transform), true); + break; + + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape: + SkinnedMeshRenderer prev = avatarDescriptor.VisemeSkinnedMesh; + avatarDescriptor.VisemeSkinnedMesh = (SkinnedMeshRenderer)EditorGUILayout.ObjectField("Face Mesh", avatarDescriptor.VisemeSkinnedMesh, typeof(SkinnedMeshRenderer), true); + if (avatarDescriptor.VisemeSkinnedMesh != prev) + shouldRefreshVisemes = true; + if (avatarDescriptor.VisemeSkinnedMesh != null) + { + DetermineBlendShapeNames(); + + if (avatarDescriptor.VisemeBlendShapes == null || avatarDescriptor.VisemeBlendShapes.Length != (int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count) + avatarDescriptor.VisemeBlendShapes = new string[(int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count]; + for (int i = 0; i < (int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count; ++i) + { + int current = -1; + for (int b = 0; b < blendShapeNames.Count; ++b) + if (avatarDescriptor.VisemeBlendShapes[i] == blendShapeNames[b]) + current = b; + + string title = "Viseme: " + ((VRCSDK2.VRC_AvatarDescriptor.Viseme)i).ToString(); + int next = EditorGUILayout.Popup(title, current, blendShapeNames.ToArray()); + if (next >= 0) + avatarDescriptor.VisemeBlendShapes[i] = blendShapeNames[next]; + } + + if (shouldRefreshVisemes) + AutoDetectVisemes(); + } + break; + } + EditorGUILayout.LabelField("Unity Version", avatarDescriptor.unityVersion); + } + + void DetermineBlendShapeNames() + { + if (avatarDescriptor.VisemeSkinnedMesh != null && + avatarDescriptor.VisemeSkinnedMesh != selectedMesh) + { + blendShapeNames = new List<string>(); + blendShapeNames.Add("-none-"); + selectedMesh = avatarDescriptor.VisemeSkinnedMesh; + if ((selectedMesh != null) && (selectedMesh.sharedMesh != null)) + { + for (int i = 0; i < selectedMesh.sharedMesh.blendShapeCount; ++i) + blendShapeNames.Add(selectedMesh.sharedMesh.GetBlendShapeName(i)); + } + } + } + + void AutoDetectVisemes() + { + + // prioritize strict - but fallback to looser - naming and don't touch user-overrides + + List<string> blendShapes = new List<string>(blendShapeNames); + blendShapes.Remove("-none-"); + + for (int v = 0; v < avatarDescriptor.VisemeBlendShapes.Length; v++) + { + if (string.IsNullOrEmpty(avatarDescriptor.VisemeBlendShapes[v])) + { + string viseme = ((VRCSDK2.VRC_AvatarDescriptor.Viseme)v).ToString().ToLowerInvariant(); + + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant() == "vrc.v_" + viseme) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant() == "v_" + viseme) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant().EndsWith(viseme)) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant() == viseme) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant().Contains(viseme)) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + next: { } + } + } + + shouldRefreshVisemes = false; + + } + + void AutoDetectLipSync() + { + var smrs = avatarDescriptor.GetComponentsInChildren<SkinnedMeshRenderer>(); + foreach (var smr in smrs) + { + if (smr.sharedMesh.blendShapeCount > 0) + { + avatarDescriptor.lipSyncJawBone = null; + + if (smr.sharedMesh.blendShapeCount > 1) + { + avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape; + avatarDescriptor.VisemeSkinnedMesh = smr; + shouldRefreshVisemes = true; + } + else + { + avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape; + avatarDescriptor.VisemeSkinnedMesh = null; + } + + return; + } + } + + Animator a = avatarDescriptor.GetComponent<Animator>(); + if (!a) + EditorUtility.DisplayDialog("Ooops", "This avatar has no Animator and can have no lipsync.", "OK"); + else if (a.GetBoneTransform(HumanBodyBones.Jaw) != null) + { + avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBone; + avatarDescriptor.lipSyncJawBone = avatarDescriptor.GetComponent<Animator>().GetBoneTransform(HumanBodyBones.Jaw); + avatarDescriptor.VisemeSkinnedMesh = null; + return; + } + + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCAvatarDescriptorEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCAvatarDescriptorEditor.cs.meta new file mode 100644 index 00000000..efb9de93 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCAvatarDescriptorEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5e83254bb97e84795ac882692ae124ba +timeCreated: 1450462624 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSpawnEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSpawnEditor.cs new file mode 100644 index 00000000..ab194e3b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSpawnEditor.cs @@ -0,0 +1,23 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using System.Collections; +using UnityEditor; +using System; + +[CustomEditor(typeof(VRCSDK2.VRC_ObjectSpawn))] +public class VRCObjectSpawnEditor : Editor +{ + VRCSDK2.VRC_ObjectSpawn spawn; + + void OnEnable() + { + if (spawn == null) + spawn = (VRCSDK2.VRC_ObjectSpawn)target; + } + + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSpawnEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSpawnEditor.cs.meta new file mode 100644 index 00000000..9e238711 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSpawnEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 26a75599848adb449b7aceed5090e35c +timeCreated: 1463516633 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSyncEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSyncEditor.cs new file mode 100644 index 00000000..4272f049 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSyncEditor.cs @@ -0,0 +1,25 @@ +#if VRC_SDK_VRCSDK2 + +using UnityEngine; +using System.Collections; +using UnityEditor; +using System; + +[CustomEditor(typeof(VRCSDK2.VRC_ObjectSync))] +public class VRCObjectSyncEditor : Editor +{ + VRCSDK2.VRC_ObjectSync sync; + + void OnEnable() + { + if (sync == null) + sync = (VRCSDK2.VRC_ObjectSync)target; + } + + public override void OnInspectorGUI() + { + sync.SynchronizePhysics = EditorGUILayout.Toggle("Synchronize Physics",sync.SynchronizePhysics); + sync.AllowCollisionTransfer = EditorGUILayout.Toggle("Allow Collision Transfer", sync.AllowCollisionTransfer); + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSyncEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSyncEditor.cs.meta new file mode 100644 index 00000000..c95d4e32 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCObjectSyncEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed4aad2698d3b62408e69b57c7748791 +timeCreated: 1463516212 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModEditorWindow.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModEditorWindow.cs new file mode 100644 index 00000000..693cd368 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModEditorWindow.cs @@ -0,0 +1,37 @@ +#if VRC_SDK_VRCSDK2 + +using UnityEngine; +using UnityEditor; + +public class VRCPlayerModEditorWindow : EditorWindow { + + public delegate void AddModCallback(); + public static AddModCallback addModCallback; + + private static VRCSDK2.VRC_PlayerMods myTarget; + + private static VRCSDK2.VRCPlayerModFactory.PlayerModType type; + + public static void Init (VRCSDK2.VRC_PlayerMods target, AddModCallback callback) + { + // Get existing open window or if none, make a new one: + EditorWindow.GetWindow (typeof (VRCPlayerModEditorWindow)); + addModCallback = callback; + myTarget = target; + + type = VRCSDK2.VRCPlayerModFactory.PlayerModType.Jump; + } + + void OnGUI () + { + type = (VRCSDK2.VRCPlayerModFactory.PlayerModType)EditorGUILayout.EnumPopup("Mods", type); + if(GUILayout.Button("Add Mod")) + { + VRCSDK2.VRCPlayerMod mod = VRCSDK2.VRCPlayerModFactory.Create(type); + myTarget.AddMod(mod); + addModCallback(); + } + } +} + +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModEditorWindow.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModEditorWindow.cs.meta new file mode 100644 index 00000000..e43182bd --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModEditorWindow.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8986a640e24a0754ea0aded12234b808 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModsEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModsEditor.cs new file mode 100644 index 00000000..5efaa351 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModsEditor.cs @@ -0,0 +1,109 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using System; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_PlayerMods))] + public class VRCPlayerModsEditor : UnityEditor.Editor + { + VRCSDK2.VRC_PlayerMods myTarget; + + void OnEnable() + { + if(myTarget == null) + myTarget = (VRCSDK2.VRC_PlayerMods)target; + } + + public override void OnInspectorGUI() + { + myTarget.isRoomPlayerMods = EditorGUILayout.Toggle("isRoomPlayerMods", myTarget.isRoomPlayerMods); + + List<VRCSDK2.VRCPlayerMod> playerMods = myTarget.playerMods; + for(int i=0; i<playerMods.Count; ++i) + { + VRCSDK2.VRCPlayerMod mod = playerMods[i]; + EditorGUILayout.BeginVertical("box"); + EditorGUILayout.LabelField(mod.name, EditorStyles.boldLabel); + if( mod.allowNameEdit ) + mod.name = EditorGUILayout.TextField( "Mod Name: ", mod.name ); + for(int j=0; j<mod.properties.Count; ++j) + { + VRCSDK2.VRCPlayerModProperty prop = mod.properties[j]; + myTarget.playerMods[i].properties[j] = DrawFieldForProp(prop); + } + if(GUILayout.Button ("Remove Mod")) + { + myTarget.RemoveMod(mod); + break; + } + EditorGUILayout.EndVertical(); + } + if(GUILayout.Button("Add Mods")) + { + VRCPlayerModEditorWindow.AddModCallback adcb = OnInspectorGUI; + VRCPlayerModEditorWindow.Init(myTarget, adcb); + } + } + + VRCSDK2.VRCPlayerModProperty DrawFieldForProp(VRCSDK2.VRCPlayerModProperty property) + { + if(property.type.SystemType == typeof(int)) + { + property.intValue = EditorGUILayout.IntField(property.name, property.intValue); + } + else if(property.type.SystemType == typeof(float)) + { + property.floatValue = EditorGUILayout.FloatField(property.name, property.floatValue); + } + else if(property.type.SystemType == typeof(string)) + { + property.stringValue = EditorGUILayout.TextField(property.name, property.stringValue); + } + else if(property.type.SystemType == typeof(bool)) + { + property.boolValue = EditorGUILayout.Toggle(property.name, property.boolValue); + } + else if(property.type.SystemType == typeof(GameObject)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( property.name ); + property.gameObjectValue = (GameObject) EditorGUILayout.ObjectField( property.gameObjectValue, typeof( GameObject ), true ); + EditorGUILayout.EndHorizontal(); + } + else if(property.type.SystemType == typeof(KeyCode)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( property.name ); + property.keyCodeValue = (KeyCode) EditorGUILayout.EnumPopup( property.keyCodeValue ); + EditorGUILayout.EndHorizontal(); + } + else if(property.type.SystemType == typeof(VRCSDK2.VRC_EventHandler.VrcBroadcastType)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( property.name ); + property.broadcastValue = (VRCSDK2.VRC_EventHandler.VrcBroadcastType) EditorGUILayout.EnumPopup( property.broadcastValue ); + EditorGUILayout.EndHorizontal(); + } + else if(property.type.SystemType == typeof(VRCSDK2.VRCPlayerModFactory.HealthOnDeathAction)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( property.name ); + property.onDeathActionValue = (VRCSDK2.VRCPlayerModFactory.HealthOnDeathAction) EditorGUILayout.EnumPopup( property.onDeathActionValue); + EditorGUILayout.EndHorizontal(); + } + else if(property.type.SystemType == typeof(RuntimeAnimatorController)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( property.name ); + property.animationController = (RuntimeAnimatorController) EditorGUILayout.ObjectField( property.animationController, typeof( RuntimeAnimatorController ), false ); + EditorGUILayout.EndHorizontal(); + } + return property; + } + } +} +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModsEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModsEditor.cs.meta new file mode 100644 index 00000000..d0bad2ea --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerModsEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 792e7964a56e51f4188e1221751642e9 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerStationEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerStationEditor.cs new file mode 100644 index 00000000..167c2796 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerStationEditor.cs @@ -0,0 +1,46 @@ +#if VRC_SDK_VRCSDK2 + +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using System; + +[CustomEditor(typeof(VRCSDK2.VRC_Station))] +public class VRCPlayerStationEditor : Editor +{ + VRCSDK2.VRC_Station myTarget; + + SerializedProperty onRemoteEnter; + SerializedProperty onRemoteExit; + SerializedProperty onLocalEnter; + SerializedProperty onLocalExit; + + void OnEnable() + { + if(myTarget == null) + myTarget = (VRCSDK2.VRC_Station)target; + onRemoteEnter = serializedObject.FindProperty("OnRemotePlayerEnterStation"); + onRemoteExit = serializedObject.FindProperty("OnRemotePlayerExitStation"); + onLocalEnter = serializedObject.FindProperty("OnLocalPlayerEnterStation"); + onLocalExit = serializedObject.FindProperty("OnLocalPlayerExitStation"); + } + + public override void OnInspectorGUI() + { + myTarget.PlayerMobility = (VRC.SDKBase.VRCStation.Mobility)EditorGUILayout.EnumPopup("Player Mobility", myTarget.PlayerMobility); + myTarget.canUseStationFromStation = EditorGUILayout.Toggle("Can Use Station From Station", myTarget.canUseStationFromStation); + myTarget.animatorController = (RuntimeAnimatorController)EditorGUILayout.ObjectField("Animator Controller", myTarget.animatorController, typeof(RuntimeAnimatorController), false); + myTarget.disableStationExit = EditorGUILayout.Toggle("Disable Station Exit", myTarget.disableStationExit); + myTarget.seated = EditorGUILayout.Toggle("Seated", myTarget.seated); + myTarget.stationEnterPlayerLocation = (Transform)EditorGUILayout.ObjectField("Player Enter Location", myTarget.stationEnterPlayerLocation, typeof(Transform), true); + myTarget.stationExitPlayerLocation = (Transform)EditorGUILayout.ObjectField("Player Exit Location", myTarget.stationExitPlayerLocation, typeof(Transform), true); + myTarget.controlsObject = (VRC.SDKBase.VRC_ObjectApi)EditorGUILayout.ObjectField("API Object", myTarget.controlsObject, typeof(VRC.SDKBase.VRC_ObjectApi), false); + + EditorGUILayout.PropertyField(onRemoteEnter, new GUIContent("On Remote Player Enter")); + EditorGUILayout.PropertyField(onRemoteExit, new GUIContent("On Remote Player Exit")); + EditorGUILayout.PropertyField(onLocalEnter, new GUIContent("On Local Player Enter")); + EditorGUILayout.PropertyField(onLocalExit, new GUIContent("On Local Player Exit")); + } +} +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerStationEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerStationEditor.cs.meta new file mode 100644 index 00000000..f24108b2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCPlayerStationEditor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 5262a02c32e41e047bdfdfc3b63db8ff +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCSceneDescriptorEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCSceneDescriptorEditor.cs new file mode 100644 index 00000000..616d8a8b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCSceneDescriptorEditor.cs @@ -0,0 +1,29 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using UnityEditor; +using System.Collections; + +[CustomEditor (typeof(VRCSDK2.VRC_SceneDescriptor))] +public class VRCSceneDescriptorEditor : Editor +{ + VRCSDK2.VRC_SceneDescriptor sceneDescriptor; + VRC.Core.PipelineManager pipelineManager; + + public override void OnInspectorGUI() + { + if(sceneDescriptor == null) + sceneDescriptor = (VRCSDK2.VRC_SceneDescriptor)target; + + if(pipelineManager == null) + { + pipelineManager = sceneDescriptor.GetComponent<VRC.Core.PipelineManager>(); + if(pipelineManager == null) + sceneDescriptor.gameObject.AddComponent<VRC.Core.PipelineManager>(); + } + + DrawDefaultInspector(); + + + } +} +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCSceneDescriptorEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCSceneDescriptorEditor.cs.meta new file mode 100644 index 00000000..66325676 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRCSceneDescriptorEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e9cbc493bbbc443fb92898aa84d221ec +timeCreated: 1450463561 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_AvatarVariationsEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_AvatarVariationsEditor.cs new file mode 100644 index 00000000..c9026421 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_AvatarVariationsEditor.cs @@ -0,0 +1,130 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace VRCSDK2 +{ + //[CustomPropertyDrawer(typeof(VRC_AvatarVariations.VariationCategory))] + //public class PropertyDrawer_AvatarVariation_VariationCategory : PropertyDrawer + //{ + // public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + // { + // //EditorGUILayout.Label("blah"); + + // if (property == null) + // return; + + // SerializedProperty nameProperty = property.FindPropertyRelative("name"); + // //SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror"); + // //SerializedProperty typeProperty = property.FindPropertyRelative("type"); + // //SerializedProperty valueProperty = null; + // //switch (typeProperty.enumValueIndex) + // //{ + // // case (int)VRC_DataStorage.VrcDataType.Bool: + // // valueProperty = property.FindPropertyRelative("valueBool"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.Float: + // // valueProperty = property.FindPropertyRelative("valueFloat"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.Int: + // // valueProperty = property.FindPropertyRelative("valueInt"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.String: + // // valueProperty = property.FindPropertyRelative("valueString"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.SerializeObject: + // // valueProperty = property.FindPropertyRelative("serializeComponent"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.None: + // // case (int)VRC_DataStorage.VrcDataType.SerializeBytes: + // // break; + // //} + + // EditorGUI.BeginProperty(rect, label, property); + + // int baseWidth = (int)(rect.width / 4); + // Rect nameRect = new Rect(rect.x, rect.y, baseWidth, rect.height); + // //Rect mirrorRect = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height); + // //Rect typeRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height); + // //Rect valueRect = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height); + // //Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height); + + // EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none); + // //EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none); + + // //switch (mirrorProperty.enumValueIndex) + // //{ + // // case (int)VRC_DataStorage.VrcDataMirror.None: + // // if (valueProperty == null) + // // VRC_EditorTools.FilteredEnumPopup<VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true); + // // else + // // { + // // VRC_EditorTools.FilteredEnumPopup<VRC_DataStorage.VrcDataType>(typeRect, typeProperty, t => true); + // // EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none); + // // } + // // break; + // // case (int)VRC_DataStorage.VrcDataMirror.SerializeComponent: + // // typeProperty.enumValueIndex = (int)VRC_DataStorage.VrcDataType.SerializeObject; + // // EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none); + // // break; + // // default: + // // VRC_EditorTools.FilteredEnumPopup<VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true); + // // break; + // //} + + // EditorGUI.EndProperty(); + // } + //} + + //[CustomEditor(typeof(VRC_AvatarVariations))] + //public class VRC_AvatarVariationsEditor : Editor + //{ + // SerializedProperty categories; + + // void OnEnable() + // { + // categories = serializedObject.FindProperty("categories"); + // } + + // public override void OnInspectorGUI() + // { + // //serializedObject.Update(); + // // EditorGUILayout.PropertyField(categories); + // //serializedObject.ApplyModifiedProperties(); + + + + // //if (target == null) + // // return; + + // ////var prop = serializedObject.FindProperty("root"); + // ////EditorGUILayout.PropertyField(prop, new GUIContent("Show Help")); + // //VRCSDK2.VRC_AvatarVariations variations = target as VRCSDK2.VRC_AvatarVariations; + // //if (variations.categories == null) + // // variations.categories = new VRC_AvatarVariations.VariationCategory[0]; + + // //foreach ( var vc in variations.categories ) + // //{ + // // vc.name = EditorGUILayout.TextField("Variation Name", vc.name); + // //// SerializedProperty triggers = triggersProperty.Copy(); + // //// int triggersLength = triggers.arraySize; + + // //// List<int> to_remove = new List<int>(); + // //// for (int idx = 0; idx < triggersLength; ++idx) + // //// { + // //// SerializedProperty triggerProperty = triggers.GetArrayElementAtIndex(idx); + // //// } + + // //// EditorGUILayout.LabelField(""); + // ////// helpProperty = serializedObject.FindProperty("ShowHelp"); + // ////// EditorGUILayout.PropertyField(helpProperty, new GUIContent("Show Help")); + // //} + + // ////EditorGUILayout. + + // DrawDefaultInspector(); + // } + //} + +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_AvatarVariationsEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_AvatarVariationsEditor.cs.meta new file mode 100644 index 00000000..b4f3a9ff --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_AvatarVariationsEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eeda995d0ceac6443a54716996eab52e +timeCreated: 1511373338 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DataStorageEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DataStorageEditor.cs new file mode 100644 index 00000000..bdc19188 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DataStorageEditor.cs @@ -0,0 +1,91 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR +using UnityEditor; +using UnityEngine; +using VRC.SDKBase; + +namespace VRCSDK2 +{ + [CustomPropertyDrawer(typeof(VRCSDK2.VRC_DataStorage.VrcDataElement))] + public class CustomDataElementDrawer : PropertyDrawer + { + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + if (property == null) + return; + + SerializedProperty nameProperty = property.FindPropertyRelative("name"); + SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror"); + SerializedProperty typeProperty = property.FindPropertyRelative("type"); + SerializedProperty valueProperty = null; + switch (typeProperty.enumValueIndex) + { + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Bool: + valueProperty = property.FindPropertyRelative("valueBool"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Float: + valueProperty = property.FindPropertyRelative("valueFloat"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Int: + valueProperty = property.FindPropertyRelative("valueInt"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.String: + valueProperty = property.FindPropertyRelative("valueString"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeObject: + valueProperty = property.FindPropertyRelative("serializeComponent"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.None: + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeBytes: + break; + } + + EditorGUI.BeginProperty(rect, label, property); + + int baseWidth = (int)(rect.width / 4); + Rect nameRect = new Rect(rect.x, rect.y, baseWidth, rect.height); + Rect mirrorRect = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height); + Rect typeRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height); + Rect valueRect = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height); + Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height); + + EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none); + EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none); + + switch (mirrorProperty.enumValueIndex) + { + case (int)VRCSDK2.VRC_DataStorage.VrcDataMirror.None: + if (valueProperty == null) + VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true); + else + { + VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_DataStorage.VrcDataType>(typeRect, typeProperty, t => true); + EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none); + } + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataMirror.SerializeComponent: + typeProperty.enumValueIndex = (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeObject; + EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none); + break; + default: + VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true); + break; + } + + EditorGUI.EndProperty(); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_DataStorage)), CanEditMultipleObjects] + public class VRC_DataStorageEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + VRCSDK2.VRC_ObjectSync os = ((VRCSDK2.VRC_DataStorage)target).GetComponent<VRCSDK2.VRC_ObjectSync>(); + if (os != null && os.SynchronizePhysics) + EditorGUILayout.HelpBox("Consider either removing the VRC_ObjectSync or disabling SynchronizePhysics.", MessageType.Warning); + + DrawDefaultInspector(); + } + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DataStorageEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DataStorageEditor.cs.meta new file mode 100644 index 00000000..a46a6e7b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DataStorageEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0ac7998a36f085844847acbc046d4e27 +timeCreated: 1478191469 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DestructibleStandardEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DestructibleStandardEditor.cs new file mode 100644 index 00000000..5eaf7be0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DestructibleStandardEditor.cs @@ -0,0 +1,57 @@ +using UnityEngine; +using UnityEditor; +using VRC_DestructibleStandard = VRC.SDKBase.VRC_DestructibleStandard; +using VRC.SDKBase; + +[CustomEditor(typeof(VRC_DestructibleStandard))] +[CanEditMultipleObjects] +public class VRC_DestructibleStandardEditor : Editor +{ + VRC_DestructibleStandard ds; + + SerializedProperty maxHealth; + SerializedProperty currentHealth; + SerializedProperty healable; + SerializedProperty onDamagedTrigger; + SerializedProperty onDestroyedTrigger; + SerializedProperty onHealedTrigger; + SerializedProperty onFullHealedTrigger; + + void OnEnable() + { + maxHealth = serializedObject.FindProperty("maxHealth"); + currentHealth = serializedObject.FindProperty("currentHealth"); + healable = serializedObject.FindProperty("healable"); + onDamagedTrigger = serializedObject.FindProperty("onDamagedTrigger"); + onDestroyedTrigger = serializedObject.FindProperty("onDestructedTrigger"); + onHealedTrigger = serializedObject.FindProperty("onHealedTrigger"); + onFullHealedTrigger = serializedObject.FindProperty("onFullHealedTrigger"); + } + + public override void OnInspectorGUI() + { + ds = (VRC_DestructibleStandard)target; + + // Update the serializedProperty - always do this in the beginning of OnInspectorGUI. + serializedObject.Update (); + + EditorGUILayout.PropertyField(maxHealth, new GUIContent("Max Health")); + EditorGUILayout.PropertyField(currentHealth, new GUIContent("Current Health")); + EditorGUILayout.PropertyField(healable, new GUIContent("Is Healable")); + + EditorGUILayout.PropertyField(onDamagedTrigger, new GUIContent("On Damaged Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Damaged Action", ds.onDamagedTrigger, ds.onDamagedEvent); + + EditorGUILayout.PropertyField(onDestroyedTrigger, new GUIContent("On Destructed Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Destructed Action", ds.onDestructedTrigger, ds.onDestructedEvent); + + EditorGUILayout.PropertyField(onHealedTrigger, new GUIContent("On Healed Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Healed Action", ds.onHealedTrigger, ds.onHealedEvent); + + EditorGUILayout.PropertyField(onFullHealedTrigger, new GUIContent("On Full Healed Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Full Healed Action", ds.onFullHealedTrigger, ds.onFullHealedEvent); + + // Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI. + serializedObject.ApplyModifiedProperties (); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DestructibleStandardEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DestructibleStandardEditor.cs.meta new file mode 100644 index 00000000..34d65d25 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_DestructibleStandardEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3b63b118c0591b548ba1797e6be4292e +timeCreated: 1477161996 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_ObjectSyncEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_ObjectSyncEditor.cs new file mode 100644 index 00000000..13686eae --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_ObjectSyncEditor.cs @@ -0,0 +1,19 @@ +#if VRC_SDK_VRCSDK2 +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +[CustomEditor(typeof(VRCSDK2.VRC_ObjectSync))] +public class VRC_ObjectSyncEditor : Editor { + public override void OnInspectorGUI() + { + VRCSDK2.VRC_ObjectSync c = ((VRCSDK2.VRC_ObjectSync)target); + if ((c.gameObject.GetComponent<Animator>() != null || c.gameObject.GetComponent<Animation>() != null) && c.SynchronizePhysics) + EditorGUILayout.HelpBox("If the Animator or Animation moves the root position of this object then it will conflict with physics synchronization.", MessageType.Warning); + if (c.GetComponent<VRCSDK2.VRC_DataStorage>() != null && c.SynchronizePhysics) + EditorGUILayout.HelpBox("Consider either removing the VRC_DataStorage or disabling SynchronizePhysics.", MessageType.Warning); + DrawDefaultInspector(); + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_ObjectSyncEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_ObjectSyncEditor.cs.meta new file mode 100644 index 00000000..7cf90f30 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_ObjectSyncEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e19a7147a2386554a8e4d6e414f190a2 +timeCreated: 1504908295 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PickupEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PickupEditor.cs new file mode 100644 index 00000000..947dba7d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PickupEditor.cs @@ -0,0 +1,70 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR +using UnityEditor; +using UnityEngine; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_Pickup))] + public class VRC_PickupEditor : UnityEditor.Editor + { + private void InspectorField(string propertyName, string humanName) + { + SerializedProperty propertyField = serializedObject.FindProperty(propertyName); + EditorGUILayout.PropertyField(propertyField, new GUIContent(humanName), true); + } + + private SerializedProperty momentumTransferMethodProperty; + private SerializedProperty disallowTheftProperty; + private SerializedProperty exactGunProperty; + private SerializedProperty exactGripProperty; + private SerializedProperty allowManipulationWhenEquippedProperty; + private SerializedProperty orientationProperty; + private SerializedProperty autoHoldProperty; + private SerializedProperty interactionTextProperty; + private SerializedProperty useTextProperty; + private SerializedProperty throwVelocityBoostMinSpeedProperty; + private SerializedProperty throwVelocityBoostScaleProperty; + private SerializedProperty pickupableProperty; + private SerializedProperty proximityProperty; + + public override void OnInspectorGUI() + { + momentumTransferMethodProperty = serializedObject.FindProperty("MomentumTransferMethod"); + disallowTheftProperty = serializedObject.FindProperty("DisallowTheft"); + exactGunProperty = serializedObject.FindProperty("ExactGun"); + exactGripProperty = serializedObject.FindProperty("ExactGrip"); + allowManipulationWhenEquippedProperty = serializedObject.FindProperty("allowManipulationWhenEquipped"); + orientationProperty = serializedObject.FindProperty("orientation"); + autoHoldProperty = serializedObject.FindProperty("AutoHold"); + interactionTextProperty = serializedObject.FindProperty("InteractionText"); + useTextProperty = serializedObject.FindProperty("UseText"); + throwVelocityBoostMinSpeedProperty = serializedObject.FindProperty("ThrowVelocityBoostMinSpeed"); + throwVelocityBoostScaleProperty = serializedObject.FindProperty("ThrowVelocityBoostScale"); + pickupableProperty = serializedObject.FindProperty("pickupable"); + proximityProperty = serializedObject.FindProperty("proximity"); + + EditorGUILayout.BeginVertical(GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 30)); + + EditorGUILayout.PropertyField(momentumTransferMethodProperty, new GUIContent("Momentum Transfer Method")); + EditorGUILayout.PropertyField(disallowTheftProperty, new GUIContent("Disallow Theft")); + EditorGUILayout.PropertyField(exactGunProperty, new GUIContent("Exact Gun")); + EditorGUILayout.PropertyField(exactGripProperty, new GUIContent("Exact Grip")); + EditorGUILayout.PropertyField(allowManipulationWhenEquippedProperty, new GUIContent("Allow Manipulation When Equipped")); + EditorGUILayout.PropertyField(orientationProperty, new GUIContent("Orientation")); + EditorGUILayout.PropertyField(autoHoldProperty, new GUIContent("AutoHold", "If the pickup is supposed to be aligned to the hand (i.e. orientation field is set to Gun or Grip), auto-detect means that it will be Equipped(not dropped when they release trigger), otherwise just hold as a normal pickup.")); + EditorGUILayout.PropertyField(interactionTextProperty, new GUIContent("Interaction Text","Text displayed when user hovers over the pickup.")); + if (autoHoldProperty.enumValueIndex != (int)VRCSDK2.VRC_Pickup.AutoHoldMode.No) + EditorGUILayout.PropertyField(useTextProperty, new GUIContent("Use Text", "Text to display describing action for clicking button, when this pickup is already being held.")); + EditorGUILayout.PropertyField(throwVelocityBoostMinSpeedProperty, new GUIContent("Throw Velocity Boost Min Speed")); + EditorGUILayout.PropertyField(throwVelocityBoostScaleProperty, new GUIContent("Throw Velocity Boost Scale")); + EditorGUILayout.PropertyField(pickupableProperty, new GUIContent("Pickupable")); + EditorGUILayout.PropertyField(proximityProperty, new GUIContent("Proximity")); + + EditorGUILayout.EndVertical(); + + serializedObject.ApplyModifiedProperties(); + } + + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PickupEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PickupEditor.cs.meta new file mode 100644 index 00000000..02042125 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PickupEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4aff4e5c0d600c845b29d7b8b7965d68 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PlayerAudioOverrideEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PlayerAudioOverrideEditor.cs new file mode 100644 index 00000000..e2138127 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PlayerAudioOverrideEditor.cs @@ -0,0 +1,106 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using System; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_PlayerAudioOverride))] + public class VRC_PlayerAudioOverrideEditor : UnityEditor.Editor + { + private bool voShow = true; + private bool voAdv = false; + private bool avShow = true; + private bool avAdv = false; + private SerializedProperty prioProperty; + private SerializedProperty globalProperty; + private SerializedProperty regionProperty; + private SerializedProperty voGainProperty; + private SerializedProperty voNearProperty; + private SerializedProperty voFarProperty; + private SerializedProperty voRadiusProperty; + private SerializedProperty voDisableLpProperty; + private SerializedProperty avGainProperty; + private SerializedProperty avNearProperty; + private SerializedProperty avFarProperty; + private SerializedProperty avRadiusProperty; + private SerializedProperty avForceSpatialProperty; + private SerializedProperty avAllowCustomProperty; + + public override void OnInspectorGUI() + { + globalProperty = serializedObject.FindProperty("global"); + regionProperty = serializedObject.FindProperty("region"); + prioProperty = serializedObject.FindProperty("regionPriority"); + + voGainProperty = serializedObject.FindProperty("VoiceGain"); + voNearProperty = serializedObject.FindProperty("VoiceNear"); + voFarProperty = serializedObject.FindProperty("VoiceFar"); + voRadiusProperty = serializedObject.FindProperty("VoiceVolumetricRadius"); + voDisableLpProperty = serializedObject.FindProperty("VoiceDisableLowpass"); + + avGainProperty = serializedObject.FindProperty("AvatarGainLimit"); + avNearProperty = serializedObject.FindProperty("AvatarNearLimit"); + avFarProperty = serializedObject.FindProperty("AvatarFarLimit"); + avRadiusProperty = serializedObject.FindProperty("AvatarVolumetricRadiusLimit"); + avForceSpatialProperty = serializedObject.FindProperty("AvatarForceSpatial"); + avAllowCustomProperty = serializedObject.FindProperty("AvatarAllowCustomCurve"); + + serializedObject.Update(); + + EditorGUILayout.BeginVertical(); + + var ovr = serializedObject.targetObject as VRCSDK2.VRC_PlayerAudioOverride; + + EditorGUILayout.PropertyField(globalProperty, new GUIContent("Global")); + if (!ovr.global) + { + EditorGUILayout.PropertyField(regionProperty, new GUIContent("Region")); + EditorGUILayout.PropertyField(prioProperty, new GUIContent("Priority")); + } + + voShow = EditorGUILayout.Foldout(voShow, "Voice Settings"); + + if (voShow) + { + EditorGUILayout.PropertyField(voGainProperty, new GUIContent("Gain")); + EditorGUILayout.PropertyField(voFarProperty, new GUIContent("Far")); + + EditorGUI.indentLevel++; + voAdv = EditorGUILayout.Foldout(voAdv, "Advanced Options"); + if (voAdv) + { + EditorGUILayout.PropertyField(voNearProperty, new GUIContent("Near")); + EditorGUILayout.PropertyField(voRadiusProperty, new GUIContent("Volumetric Radius")); + EditorGUILayout.PropertyField(voDisableLpProperty, new GUIContent("Disable Lowpass Filter")); + } + EditorGUI.indentLevel--; + } + + avShow = EditorGUILayout.Foldout(avShow, "Avatar Audio Limits"); + + if (avShow) + { + EditorGUILayout.PropertyField(avGainProperty, new GUIContent("Gain Limit")); + EditorGUILayout.PropertyField(avFarProperty, new GUIContent("Far Limit")); + + EditorGUI.indentLevel++; + avAdv = EditorGUILayout.Foldout(avAdv, "Advanced Options"); + if (avAdv) + { + EditorGUILayout.PropertyField(avNearProperty, new GUIContent("Near Limit")); + EditorGUILayout.PropertyField(avRadiusProperty, new GUIContent("Volumetric Radius Limit")); + EditorGUILayout.PropertyField(avForceSpatialProperty, new GUIContent("Force Spatial")); + EditorGUILayout.PropertyField(avAllowCustomProperty, new GUIContent("Allow Custom Curve")); + } + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndVertical(); + + serializedObject.ApplyModifiedProperties(); + } + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PlayerAudioOverrideEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PlayerAudioOverrideEditor.cs.meta new file mode 100644 index 00000000..d7bfd85c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_PlayerAudioOverrideEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5c545625e0bf93045ac1c5864141c5c1 +timeCreated: 1474315179 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SpatialAudioSourceEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SpatialAudioSourceEditor.cs new file mode 100644 index 00000000..c7145db2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SpatialAudioSourceEditor.cs @@ -0,0 +1,58 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR + +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using System; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_SpatialAudioSource))] + public class VRC_SpatialAudioSourceEditor : UnityEditor.Editor + { + private bool showAdvancedOptions = false; + private SerializedProperty gainProperty; + private SerializedProperty nearProperty; + private SerializedProperty farProperty; + private SerializedProperty volRadiusProperty; + private SerializedProperty enableSpatialProperty; + private SerializedProperty useCurveProperty; + + public override void OnInspectorGUI() + { + gainProperty = serializedObject.FindProperty("Gain"); + nearProperty = serializedObject.FindProperty("Near"); + farProperty = serializedObject.FindProperty("Far"); + volRadiusProperty = serializedObject.FindProperty("VolumetricRadius"); + enableSpatialProperty = serializedObject.FindProperty("EnableSpatialization"); + useCurveProperty = serializedObject.FindProperty("UseAudioSourceVolumeCurve"); + + serializedObject.Update(); + + VRCSDK2.VRC_SpatialAudioSource target = serializedObject.targetObject as VRCSDK2.VRC_SpatialAudioSource; + AudioSource source = target.GetComponent<AudioSource>(); + + EditorGUILayout.BeginVertical(); + + EditorGUILayout.PropertyField(gainProperty, new GUIContent("Gain")); + EditorGUILayout.PropertyField(farProperty, new GUIContent("Far")); + showAdvancedOptions = EditorGUILayout.Foldout(showAdvancedOptions, "Advanced Options"); + bool enableSp = enableSpatialProperty.boolValue; + if (showAdvancedOptions) + { + EditorGUILayout.PropertyField(nearProperty, new GUIContent("Near")); + EditorGUILayout.PropertyField(volRadiusProperty, new GUIContent("Volumetric Radius")); + EditorGUILayout.PropertyField(enableSpatialProperty, new GUIContent("Enable Spatialization")); + if (enableSp) + EditorGUILayout.PropertyField(useCurveProperty, new GUIContent("Use AudioSource Volume Curve")); + } + + EditorGUILayout.EndVertical(); + + if (source != null) + source.spatialize = enableSp; + serializedObject.ApplyModifiedProperties(); + } + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SpatialAudioSourceEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SpatialAudioSourceEditor.cs.meta new file mode 100644 index 00000000..3f7ca463 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SpatialAudioSourceEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0d2d4cba733f5eb4ba170368e67710d2 +timeCreated: 1474315179 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoPlayerEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoPlayerEditor.cs new file mode 100644 index 00000000..5498e5da --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoPlayerEditor.cs @@ -0,0 +1,105 @@ +#if VRC_SDK_VRCSDK2 + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using VRC.SDKBase; + +[CustomPropertyDrawer(typeof(VRCSDK2.VRC_SyncVideoPlayer.VideoEntry))] +public class CustomVideoEntryDrawer : PropertyDrawer +{ + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty ratio = property.FindPropertyRelative("AspectRatio"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + + return EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(ratio, new GUIContent("Aspect Ratio"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing + + Mathf.Max(EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true), EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true)) + EditorGUIUtility.standardVerticalSpacing; + } + + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty ratio = property.FindPropertyRelative("AspectRatio"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + + EditorGUI.BeginProperty(rect, label, property); + float x = rect.x; + float y = rect.y; + float w = rect.width; + float h = EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing; + VRC_EditorTools.FilteredEnumPopup<UnityEngine.Video.VideoSource>(new Rect(x, y, w, h), source, (e) => e == UnityEngine.Video.VideoSource.Url); + y += h; + + if (source.enumValueIndex == (int)UnityEngine.Video.VideoSource.Url) + { + h = EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), url); + y += h; + } + else + { + h = EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), clip); + y += h; + } + + h = EditorGUI.GetPropertyHeight(ratio, new GUIContent("AspectRatio"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), ratio); + y += h; + + h = EditorGUI.GetPropertyHeight(ratio, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), speed); + if (speed.floatValue == 0f) + speed.floatValue = 1f; + y += h; + + EditorGUI.EndProperty(); + } +} + +[CustomEditor(typeof(VRCSDK2.VRC_SyncVideoPlayer))] +public class SyncVideoPlayerEditor : Editor +{ + ReorderableList sourceList; + + public override void OnInspectorGUI() + { + SerializedProperty searchRoot = serializedObject.FindProperty("VideoSearchRoot"); + EditorGUILayout.PropertyField(searchRoot); + SerializedProperty maxQual = serializedObject.FindProperty("MaxStreamQuality"); + EditorGUILayout.PropertyField(maxQual); + + EditorGUILayout.Space(); + + sourceList.DoLayoutList(); + + serializedObject.ApplyModifiedProperties(); + } + + private void OnEnable() + { + SerializedProperty videos = serializedObject.FindProperty("Videos"); + sourceList = new ReorderableList(serializedObject, videos); + sourceList.drawElementCallback += (Rect rect, int index, bool active, bool focused) => + { + EditorGUI.PropertyField(rect, serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index)); + }; + sourceList.elementHeightCallback += (int index) => + { + SerializedProperty element = serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index); + return EditorGUI.GetPropertyHeight(element); + }; + sourceList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Videos"); + } +} +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoPlayerEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoPlayerEditor.cs.meta new file mode 100644 index 00000000..616cee0f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoPlayerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ae0e74693b7899f47bd98864f94b9311 +timeCreated: 1499468412 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoStreamEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoStreamEditor.cs new file mode 100644 index 00000000..198f7ffa --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoStreamEditor.cs @@ -0,0 +1,117 @@ +#if VRC_SDK_VRCSDK2 + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using VRC.SDKBase; + +[CustomPropertyDrawer(typeof(VRCSDK2.VRC_SyncVideoStream.VideoEntry))] +public class CustomVideoStreamEntryDrawer : PropertyDrawer +{ + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + SerializedProperty live = property.FindPropertyRelative("SyncType"); + SerializedProperty sync = property.FindPropertyRelative("SyncMinutes"); + + return EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing + + Mathf.Max(EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true), EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true)) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(live, new GUIContent("SyncType"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(sync, new GUIContent("SyncMinutes"), true) + EditorGUIUtility.standardVerticalSpacing; + } + + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + SerializedProperty live = property.FindPropertyRelative("SyncType"); + SerializedProperty sync = property.FindPropertyRelative("SyncMinutes"); + + EditorGUI.BeginProperty(rect, label, property); + float x = rect.x; + float y = rect.y; + float w = rect.width; + float h = EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing; + VRC_EditorTools.FilteredEnumPopup<UnityEngine.Video.VideoSource>(new Rect(x, y, w, h), source, (e) => e == UnityEngine.Video.VideoSource.Url); + y += h; + + if (source.enumValueIndex == (int)UnityEngine.Video.VideoSource.Url) + { + h = EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), url); + y += h; + } + else + { + h = EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), clip); + y += h; + } + + h = EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), speed); + if (speed.floatValue == 0f) + speed.floatValue = 1f; + y += h; + + h = EditorGUI.GetPropertyHeight(live, new GUIContent("SyncType"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), live); + y += h; + + h = EditorGUI.GetPropertyHeight(sync, new GUIContent("SyncMinutes"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), sync); + if (sync.floatValue < 1f) + sync.floatValue = 0; + y += h; + + EditorGUI.EndProperty(); + } +} + +[CustomEditor(typeof(VRCSDK2.VRC_SyncVideoStream))] +public class SyncVideoStreamEditor : Editor +{ + ReorderableList sourceList; + + public override void OnInspectorGUI() + { + SerializedProperty searchRoot = serializedObject.FindProperty("VideoSearchRoot"); + EditorGUILayout.PropertyField(searchRoot); + SerializedProperty maxQual = serializedObject.FindProperty("MaxStreamQuality"); + EditorGUILayout.PropertyField(maxQual); + SerializedProperty autoStart = serializedObject.FindProperty("AutoStart"); + EditorGUILayout.PropertyField(autoStart); + + EditorGUILayout.Space(); + + sourceList.DoLayoutList(); + + serializedObject.ApplyModifiedProperties(); + } + + private void OnEnable() + { + SerializedProperty videos = serializedObject.FindProperty("Videos"); + sourceList = new ReorderableList(serializedObject, videos); + sourceList.drawElementCallback += (Rect rect, int index, bool active, bool focused) => + { + EditorGUI.PropertyField(rect, serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index)); + }; + sourceList.elementHeightCallback += (int index) => + { + SerializedProperty element = serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index); + return EditorGUI.GetPropertyHeight(element); + }; + sourceList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Videos"); + } +} + +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoStreamEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoStreamEditor.cs.meta new file mode 100644 index 00000000..ad3b7ed2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_SyncVideoStreamEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3f9dccfed0b072f49a307b3f20a7e768 +timeCreated: 1528745185 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_TriggerEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_TriggerEditor.cs new file mode 100644 index 00000000..f137e724 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_TriggerEditor.cs @@ -0,0 +1,1524 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR + +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using UnityEditorInternal; +using System.Linq; +using System.Collections.Generic; +using System.Reflection; +using System; +using VRC.SDKBase; +using VRC.SDKBase.Editor; + +namespace VRCSDK2 +{ + [CustomPropertyDrawer(typeof(VRCSDK2.VRC_Trigger.CustomTriggerTarget))] + public class CustomTriggerTargetDrawer : PropertyDrawer + { + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + if (Application.isPlaying) + { + EditorGUI.HelpBox(rect, "Trigger Editor disabled while application is running.", MessageType.Info); + return; + } + + if (property == null) + return; + + SerializedProperty objectProperty = property.FindPropertyRelative("TriggerObject"); + SerializedProperty nameProperty = property.FindPropertyRelative("CustomName"); + + EditorGUI.BeginProperty(rect, label, property); + + rect = EditorGUI.PrefixLabel(rect, GUIUtility.GetControlID(FocusType.Passive), label); + Rect objectRect = new Rect(rect.x, rect.y, rect.width / 2 - 5, rect.height); + Rect nameRect = new Rect(rect.x + rect.width / 2, rect.y, rect.width / 2, rect.height); + + VRCSDK2.VRC_Trigger current = null; + if (objectProperty.objectReferenceValue != null) + current = (objectProperty.objectReferenceValue as GameObject).GetComponent<VRCSDK2.VRC_Trigger>(); + current = EditorGUI.ObjectField(objectRect, current, typeof(VRCSDK2.VRC_Trigger), true) as VRCSDK2.VRC_Trigger; + objectProperty.objectReferenceValue = current == null ? null : current.gameObject; + + VRC_EditorTools.CustomTriggerPopup(nameRect, objectProperty, nameProperty); + + EditorGUI.EndProperty(); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_Trigger)), CanEditMultipleObjects] + public class VRC_TriggerEditor : UnityEditor.Editor + { + private List<VRCSDK2.VRC_Trigger.TriggerType> ActiveTypes + { + get + { + List<VRCSDK2.VRC_Trigger.TriggerType> activeTypes = new List<VRCSDK2.VRC_Trigger.TriggerType>(); + + SerializedProperty triggers = triggersProperty.Copy(); + int triggersLength = triggers.arraySize; + + for (int idx = 0; idx < triggersLength; ++idx) + { + VRCSDK2.VRC_Trigger.TriggerType triggerType = (VRCSDK2.VRC_Trigger.TriggerType)triggers.GetArrayElementAtIndex(idx).FindPropertyRelative("TriggerType").intValue; + activeTypes.Add(triggerType); + } + + return activeTypes; + } + } + +#pragma warning disable CS0618 // Type or member is obsolete + private static List<VRCSDK2.VRC_Trigger.TriggerType> hiddenTriggerTypes = new List<VRCSDK2.VRC_Trigger.TriggerType> { /*VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageAdd, VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageRemove*/ }; + private static List<VRCSDK2.VRC_EventHandler.VrcEventType> hiddenEventTypes = new List<VRCSDK2.VRC_EventHandler.VrcEventType> { VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility, VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage, VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand }; + private static List<VRCSDK2.VRC_EventHandler.VrcBroadcastType> unbufferedBroadcastTypes = new List<VRCSDK2.VRC_EventHandler.VrcBroadcastType> { VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered, VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterUnbuffered, VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerUnbuffered, VRCSDK2.VRC_EventHandler.VrcBroadcastType.Local }; + private static List<VRCSDK2.VRC_EventHandler.VrcBroadcastType> bufferOneBroadcastTypes = new List<VRCSDK2.VRC_EventHandler.VrcBroadcastType> { VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne, VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterBufferOne, VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerBufferOne }; + private static List<VRCSDK2.VRC_EventHandler.VrcBroadcastType> hiddenBroadcastTypes = new List<VRCSDK2.VRC_EventHandler.VrcBroadcastType> { }; +#pragma warning restore CS0618 // Type or member is obsolete + + private ReorderableList[] eventLists = new ReorderableList[0]; + private ReorderableList[] relayLists = new ReorderableList[0]; + private ReorderableList[] objectLists = new ReorderableList[0]; + private bool[] visible = new bool[0]; + + private SerializedProperty triggersProperty; + private SerializedProperty proximityProperty; + private SerializedProperty interactTextProperty; + private SerializedProperty ownershipProperty; + private SerializedProperty drawLinesProperty; + + private Dictionary<string, object[]> rpcByteCache = new Dictionary<string, object[]>(); + + private VRCSDK2.VRC_Trigger.TriggerType addTriggerSelectedType = VRCSDK2.VRC_Trigger.TriggerType.Custom; + + private void OnEnable() + { + rpcByteCache.Clear(); + } + + public override void OnInspectorGUI() + { +#pragma warning disable CS0618 // Type or member is obsolete + bool showedOldWarning = false; + foreach (VRCSDK2.VRC_Trigger t in targets.Cast<VRCSDK2.VRC_Trigger>().Where(tr => tr != null)) + { + if (!showedOldWarning && (t.GetComponent<VRCSDK2.VRC_UseEvents>() != null || t.GetComponent<VRCSDK2.VRC_KeyEvents>() != null || t.GetComponent<VRCSDK2.VRC_TriggerColliderEventTrigger>() != null || t.GetComponent<VRCSDK2.VRC_TimedEvents>() != null)) + { + EditorGUILayout.HelpBox("Do not use VRC_Trigger in combination with deprecated event components.", MessageType.Error); + showedOldWarning = true; + } + VRCSDK2.VRC_EventHandler handler = t.GetComponent<VRCSDK2.VRC_EventHandler>(); + if (handler != null) + handler.Events = new List<VRCSDK2.VRC_EventHandler.VrcEvent>(); + } +#pragma warning restore CS0618 // Type or member is obsolete + + triggersProperty = serializedObject.FindProperty("Triggers"); + proximityProperty = serializedObject.FindProperty("proximity"); + interactTextProperty = serializedObject.FindProperty("interactText"); + ownershipProperty = serializedObject.FindProperty("TakesOwnershipIfNecessary"); + drawLinesProperty = serializedObject.FindProperty("DrawLines"); + + serializedObject.Update(); + + SerializedProperty triggers = triggersProperty.Copy(); + int triggersLength = triggers.arraySize; + + if (eventLists.Length != triggersLength) + eventLists = new ReorderableList[triggersLength]; + + if (relayLists.Length != triggersLength) + relayLists = new ReorderableList[triggersLength]; + + if (objectLists.Length != triggersLength) + objectLists = new ReorderableList[triggersLength]; + + if (visible.Length != triggersLength) + { + bool[] newVisible = new bool[triggersLength]; + for (int idx = 0; idx < visible.Length && idx < newVisible.Length; ++idx) + newVisible[idx] = visible[idx]; + for (int idx = visible.Length; idx < newVisible.Length && idx < newVisible.Length; ++idx) + newVisible[idx] = true; + visible = newVisible; + } + + EditorGUILayout.BeginVertical(GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 30)); + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(ownershipProperty, new GUIContent("Take Ownership of Action Targets")); + VRCSDK2.VRC_Trigger.EditorGlobalTriggerLineMode = (VRCSDK2.VRC_Trigger.EditorTriggerLineMode)EditorPrefs.GetInt("VRCSDK2_triggerLineMode", 0); + if (VRCSDK2.VRC_Trigger.EditorGlobalTriggerLineMode == VRCSDK2.VRC_Trigger.EditorTriggerLineMode.PerTrigger) + EditorGUILayout.PropertyField(drawLinesProperty, new GUIContent("Draw Lines")); + + EditorGUILayout.Space(); + + RenderTriggers(); + + EditorGUILayout.Space(); + + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(10); + EditorGUILayout.BeginVertical(); + + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); + + serializedObject.ApplyModifiedProperties(); + } + + private void RenderHelpBox(string message, MessageType messageType) + { + if (VRCSettings.DisplayHelpBoxes || messageType == MessageType.Error || messageType == MessageType.Warning) + EditorGUILayout.HelpBox(message, messageType); + } + + private void RenderTriggers() + { + GUIStyle triggerStyle = new GUIStyle(EditorStyles.helpBox); + + SerializedProperty triggers = triggersProperty.Copy(); + int triggersLength = triggers.arraySize; + + List<int> to_remove = new List<int>(); + for (int idx = 0; idx < triggersLength; ++idx) + { + SerializedProperty triggerProperty = triggers.GetArrayElementAtIndex(idx); + SerializedProperty broadcastProperty = triggerProperty.FindPropertyRelative("BroadcastType"); + + EditorGUILayout.BeginVertical(triggerStyle); + + if (RenderTriggerHeader(triggerProperty, ref visible[idx])) + { + to_remove.Add(idx); + EditorGUILayout.EndVertical(); + + continue; + } + + if (!visible[idx]) + { + EditorGUILayout.EndVertical(); + continue; + } + + if (!unbufferedBroadcastTypes.Contains((VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastProperty.intValue) && + !bufferOneBroadcastTypes.Contains((VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastProperty.intValue) && + ActiveEvents(triggerProperty).Any(e => e == VRCSDK2.VRC_EventHandler.VrcEventType.SendRPC)) + RenderHelpBox("Consider using unbuffered broadcasts with RPCs.", MessageType.Error); + + EditorGUILayout.Separator(); + + RenderTriggerEditor(triggerProperty, idx); + + if (eventLists.Length == triggersLength) + { + EditorGUILayout.Separator(); + + if (triggerProperty.FindPropertyRelative("TriggerType").intValue != (int)VRCSDK2.VRC_Trigger.TriggerType.Relay) + { + RenderTriggerEventsEditor(triggerProperty, idx); + + EditorGUILayout.Separator(); + } + } + EditorGUILayout.EndVertical(); + } + + foreach (int idx in ((IEnumerable<int>)to_remove).Reverse()) + triggersProperty.Copy().DeleteArrayElementAtIndex(idx); + + RenderAddTrigger(); + } + + private void RenderTriggerEditor(SerializedProperty triggerProperty, int idx) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("AfterSeconds"), new GUIContent("Delay in Seconds")); + + VRC_Trigger.TriggerType triggerType = (VRC_Trigger.TriggerType)triggerProperty.FindPropertyRelative("TriggerType").intValue; + switch (triggerType) + { + case VRCSDK2.VRC_Trigger.TriggerType.Custom: + RenderCustom(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.Relay: + RenderRelay(triggerProperty, idx); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnEnterTrigger: + case VRCSDK2.VRC_Trigger.TriggerType.OnExitTrigger: + case VRCSDK2.VRC_Trigger.TriggerType.OnEnterCollider: + case VRCSDK2.VRC_Trigger.TriggerType.OnExitCollider: + RenderCollider(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnKeyDown: + case VRCSDK2.VRC_Trigger.TriggerType.OnKeyUp: + RenderKey(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnTimer: + RenderTimer(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageChange: + // case VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageAdd: + // case VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageRemove: + RenderDataStorage(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnParticleCollision: + //RenderHelpBox("Triggers for each particle in attached particle system that collides with something.", MessageType.Info); + RenderCollider(triggerProperty); + break; + default: + if (VRCSDK2.VRC_Trigger.TypeCollections.InteractiveTypes.Contains(triggerType) || VRCSDK2.VRC_Trigger.TypeCollections.PickupTypes.Contains(triggerType)) + RenderInteractableEditor(); + else + RenderEmpty(triggerProperty); + break; + } + } + + private List<VRCSDK2.VRC_EventHandler.VrcEventType> ActiveEvents(SerializedProperty triggerProperty) + { + List<VRCSDK2.VRC_EventHandler.VrcEventType> activeTypes = new List<VRCSDK2.VRC_EventHandler.VrcEventType>(); + + SerializedProperty events = triggerProperty.FindPropertyRelative("Events").Copy(); + int eventsLength = events.arraySize; + + for (int idx = 0; idx < eventsLength; ++idx) + { + VRCSDK2.VRC_EventHandler.VrcEventType eventType = (VRCSDK2.VRC_EventHandler.VrcEventType)events.GetArrayElementAtIndex(idx).FindPropertyRelative("EventType").intValue; + activeTypes.Add(eventType); + } + + return activeTypes; + } + + private void RenderAddTrigger() + { + Rect rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(15f)); + EditorGUILayout.Space(); + + Rect selectedRect = new Rect(rect.x, rect.y, rect.width / 4 * 3 - 5, rect.height); + Rect addRect = new Rect(selectedRect.x + selectedRect.width + 5, rect.y, rect.width / 4, rect.height); + + bool showStationTypes = serializedObject.targetObjects.Any(o => (o as VRCSDK2.VRC_Trigger).GetComponent<VRCSDK2.VRC_Station>() != null); + System.Func<VRCSDK2.VRC_Trigger.TriggerType, bool> predicate = + v => hiddenTriggerTypes.Contains(v) == false && (showStationTypes || (v != VRCSDK2.VRC_Trigger.TriggerType.OnStationEntered && v != VRCSDK2.VRC_Trigger.TriggerType.OnStationExited)); + + addTriggerSelectedType = VRC_EditorTools.FilteredEnumPopup(selectedRect, addTriggerSelectedType, predicate); + + if (GUI.Button(addRect, "Add")) + { + SerializedProperty triggersAry = triggersProperty; + + // hacks + triggersAry.Next(true); + triggersAry.Next(true); + + int triggersLength = triggersAry.intValue; + triggersAry.intValue = triggersLength + 1; + triggersAry.Next(true); + + for (int idx = 0; idx < triggersLength; ++idx) + triggersAry.Next(false); + + triggersAry.FindPropertyRelative("TriggerType").intValue = (int)addTriggerSelectedType; + triggersAry.FindPropertyRelative("BroadcastType").intValue = (int)VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne; + triggersAry.FindPropertyRelative("TriggerIndividuals").boolValue = true; + triggersAry.FindPropertyRelative("Layers").intValue = LayerMask.GetMask("Default"); + } + + EditorGUILayout.EndHorizontal(); + } + + private bool RenderTriggerHeader(SerializedProperty triggerProperty, ref bool expand) + { + bool delete = false; + + if (!delete) + { + VRCSDK2.VRC_EventHandler.VrcBroadcastType? broadcast = null; + + Rect rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(15f)); + EditorGUILayout.Space(); + + int baseWidth = (int)((rect.width - 40) / 4); + + Rect foldoutRect = new Rect(rect.x + 10, rect.y, 20, rect.height); + Rect typeRect = new Rect(rect.x + 20, rect.y, baseWidth, rect.height); + Rect broadcastRect = new Rect(rect.x + 25 + baseWidth, rect.y, baseWidth, rect.height); + Rect randomRect = new Rect(rect.x + 30 + baseWidth * 2, rect.y, baseWidth, rect.height); + Rect removeRect = new Rect(rect.x + 35 + baseWidth * 3, rect.y, baseWidth, rect.height); + + expand = EditorGUI.Foldout(foldoutRect, expand, GUIContent.none); + + SerializedProperty triggerTypeProperty = triggerProperty.FindPropertyRelative("TriggerType"); + VRCSDK2.VRC_Trigger.TriggerType currentType = (VRCSDK2.VRC_Trigger.TriggerType)triggerTypeProperty.intValue; + + SerializedProperty nameProperty = triggerProperty.FindPropertyRelative("Name"); + if (string.IsNullOrEmpty(nameProperty.stringValue)) + nameProperty.stringValue = "Unnamed"; + + bool showStationTypes = serializedObject.targetObjects.Any(o => (o as VRCSDK2.VRC_Trigger).GetComponent<VRCSDK2.VRC_Station>() != null); + System.Func<string, string> rename = s => s == "Custom" ? s + " (" + nameProperty.stringValue + ")" : s; + System.Func<VRCSDK2.VRC_Trigger.TriggerType, bool> predicate = + v => hiddenTriggerTypes.Contains(v) == false && (showStationTypes || (v != VRCSDK2.VRC_Trigger.TriggerType.OnStationEntered && v != VRCSDK2.VRC_Trigger.TriggerType.OnStationExited)); + + triggerTypeProperty.intValue = (int)VRC_EditorTools.FilteredEnumPopup(typeRect, currentType, predicate, rename); + currentType = (VRCSDK2.VRC_Trigger.TriggerType)triggerTypeProperty.intValue; + + SerializedProperty broadcastTypeProperty = triggerProperty.FindPropertyRelative("BroadcastType"); + List<VRCSDK2.VRC_EventHandler.VrcEventType> activeEvents = ActiveEvents(triggerProperty); + if ((VRCSDK2.VRC_Trigger.TriggerType)triggerTypeProperty.intValue == VRCSDK2.VRC_Trigger.TriggerType.Relay || activeEvents.Contains(VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject)) + { + broadcast = VRCSDK2.VRC_EventHandler.VrcBroadcastType.Always; + broadcastTypeProperty.intValue = (int)broadcast; + } + else + { + VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_EventHandler.VrcBroadcastType>(broadcastRect, broadcastTypeProperty, b => !hiddenBroadcastTypes.Contains(b)); + broadcast = (VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastTypeProperty.intValue; + } + + SerializedProperty probabilitiesProperty = triggerProperty.FindPropertyRelative("Probabilities"); + SerializedProperty probabilityLockProperty = triggerProperty.FindPropertyRelative("ProbabilityLock"); + SerializedProperty eventsProperty = triggerProperty.FindPropertyRelative("Events"); + + if (triggerProperty.FindPropertyRelative("Events").arraySize < 1) + GUI.enabled = false; + if (GUI.Toggle(randomRect, probabilitiesProperty.arraySize > 0, new GUIContent(" Randomize"))) + probabilityLockProperty.arraySize = probabilitiesProperty.arraySize = eventsProperty.arraySize; + else + probabilityLockProperty.arraySize = probabilitiesProperty.arraySize = 0; + GUI.enabled = true; + + if (GUI.Button(removeRect, "Remove")) + delete = true; + + EditorGUILayout.EndHorizontal(); + + if (broadcast.HasValue && expand) + { + string message = null; + switch (broadcast.Value) + { + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Always: + message = "All are able to activate the trigger for everyone, and late-joiners will also trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered: + message = "All are able to activate the trigger for everyone, but late-joiners will not trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Local: + message = "All are able to activate the trigger for themselves only."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Master: + message = "Only the Master is able to activate the trigger for everyone, and late-joiners will also trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterUnbuffered: + message = "Only the Master is able to activate the trigger for everyone, but late-joiners will not trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Owner: + message = "Only the Owner is able to activate the trigger for everyone, and late-joiners will also trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerUnbuffered: + message = "Only the Owner is able to activate the trigger for everyone, but late-joiners will not trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne: + message = "All are able to activate the trigger for everyone, and late-joiners will trigger the most recent one."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterBufferOne: + message = "Only the Master is able to activate the trigger for everyone, and late-joiners will trigger the most recent one."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerBufferOne: + message = "Only the Owner is able to activate the trigger for everyone, and late-joiners will trigger the most recent one."; + break; + } + if (message != null) + RenderHelpBox(message, MessageType.Info); + } + } + + return delete; + } + + private void RenderInteractableEditor() + { + EditorGUILayout.PropertyField(interactTextProperty, new GUIContent("Interaction Text")); + proximityProperty.floatValue = EditorGUILayout.Slider("Proximity", proximityProperty.floatValue, 0f, 100f); + } + + private void RenderTriggerEventsEditor(SerializedProperty triggerProperty, int idx) + { + if (eventLists[idx] == null) + { + ReorderableList newList = new ReorderableList(serializedObject, triggerProperty.FindPropertyRelative("Events"), true, true, true, true); + newList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Actions"); + newList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty eventsListProperty = triggerProperty.FindPropertyRelative("Events"); + SerializedProperty probabilitiesProperty = triggerProperty.FindPropertyRelative("Probabilities"); + SerializedProperty probabilityLockProperty = triggerProperty.FindPropertyRelative("ProbabilityLock"); + SerializedProperty shadowListProperty = triggerProperty.FindPropertyRelative("DataStorageShadowValues"); + + if (shadowListProperty != null && shadowListProperty.arraySize != eventsListProperty.arraySize) + shadowListProperty.arraySize = eventsListProperty.arraySize; + + SerializedProperty shadowProperty = shadowListProperty == null ? null : shadowListProperty.GetArrayElementAtIndex(index); + SerializedProperty eventProperty = eventsListProperty.GetArrayElementAtIndex(index); + SerializedProperty eventTypeProperty = eventProperty.FindPropertyRelative("EventType"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + + string label = ((VRCSDK2.VRC_EventHandler.VrcEventType)eventTypeProperty.intValue).ToString(); + if (!string.IsNullOrEmpty(parameterStringProperty.stringValue)) + label += " (" + parameterStringProperty.stringValue + ")"; + + if (probabilitiesProperty.arraySize == 0) + EditorGUI.LabelField(rect, label); + else + { + Rect labelRect = new Rect(rect.x, rect.y, rect.width / 2, rect.height); + Rect sliderLockRect = new Rect(rect.x + rect.width / 2, rect.y, 30, rect.height); + Rect sliderRect = new Rect(rect.x + rect.width / 2 + 30, rect.y, rect.width / 2 - 30, rect.height); + + EditorGUI.LabelField(labelRect, label); + + probabilityLockProperty.GetArrayElementAtIndex(index).boolValue = GUI.Toggle(sliderLockRect, probabilityLockProperty.GetArrayElementAtIndex(index).boolValue, new GUIContent()); + probabilitiesProperty.GetArrayElementAtIndex(index).floatValue = EditorGUI.Slider(sliderRect, new GUIContent(), probabilitiesProperty.GetArrayElementAtIndex(index).floatValue, 0f, 1f); + + bool allLocked = true; + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + allLocked = allLocked && probabilityLockProperty.GetArrayElementAtIndex(pIdx).boolValue; + if (allLocked) + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + if (pIdx != index) + probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue = probabilitiesProperty.GetArrayElementAtIndex(index).floatValue; + + // Squish 'em down + float probabilitySum = 1f; + const int MAX_SCALE_PROBABILITIES_LOOP_ITERATIONS = 8; + const int PROBABILITY_VALUE_DECIMAL_PLACES = 3; + int loopIterations = 0; + do + { + if (probabilitySum > 1f) + { + float fixRatio = 1f / probabilitySum; + int countChanged = 0; + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + { + if (allLocked) + { + countChanged++; + probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue *= fixRatio; + } + else + { + if (pIdx == index || probabilityLockProperty.GetArrayElementAtIndex(pIdx).boolValue || probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue == 0f) + continue; + countChanged++; + probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue *= fixRatio; + } + } + if (countChanged == 0) + probabilitiesProperty.GetArrayElementAtIndex(index).floatValue -= probabilitySum - 1f; + probabilitiesProperty.GetArrayElementAtIndex(index).floatValue = (float)Math.Round(probabilitiesProperty.GetArrayElementAtIndex(index).floatValue, PROBABILITY_VALUE_DECIMAL_PLACES); + } + probabilitySum = 0f; + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + probabilitySum += probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue; + loopIterations++; + } while ((probabilitySum > 1f) && (loopIterations < MAX_SCALE_PROBABILITIES_LOOP_ITERATIONS)); + } + + if (isFocused) + objectLists[idx] = null; + if (isActive) + { + EditorGUILayout.Space(); + + RenderEventEditor(shadowProperty, triggerProperty, eventProperty, idx); + } + }; + newList.onAddDropdownCallback = (Rect buttonRect, ReorderableList list) => + { + GenericMenu menu = new GenericMenu(); + SerializedProperty eventsList = triggerProperty.FindPropertyRelative("Events"); + foreach (VRCSDK2.VRC_EventHandler.VrcEventType type in System.Enum.GetValues(typeof(VRCSDK2.VRC_EventHandler.VrcEventType)).Cast<VRCSDK2.VRC_EventHandler.VrcEventType>().Where(v => !hiddenEventTypes.Contains(v)).OrderBy(et => System.Enum.GetName(typeof(VRCSDK2.VRC_EventHandler.VrcEventType), et))) + { + menu.AddItem(new GUIContent("Basic Events/" + type.ToString()), false, (t) => + { + eventsList.arraySize++; + + SerializedProperty newEventProperty = eventsList.GetArrayElementAtIndex(eventsList.arraySize - 1); + newEventProperty.FindPropertyRelative("EventType").intValue = (int)(VRCSDK2.VRC_EventHandler.VrcEventType)t; + newEventProperty.FindPropertyRelative("ParameterObjects").arraySize = 0; + newEventProperty.FindPropertyRelative("ParameterInt").intValue = 0; + newEventProperty.FindPropertyRelative("ParameterFloat").floatValue = 0f; + newEventProperty.FindPropertyRelative("ParameterString").stringValue = null; + + serializedObject.ApplyModifiedProperties(); + }, type); + } + VRC.SDKBase.IVRCEventProvider[] providers = FindObjectsOfType<MonoBehaviour>().Where(b => b is VRC.SDKBase.IVRCEventProvider).Cast<VRC.SDKBase.IVRCEventProvider>().ToArray(); + foreach (VRC.SDKBase.IVRCEventProvider provider in providers) + { + foreach (VRCSDK2.VRC_EventHandler.VrcEvent evt in provider.ProvideEvents()) + { + string name = "Events from Scene/" + (provider as MonoBehaviour).name + "/" + evt.Name; + menu.AddItem(new GUIContent(name), false, (t) => + { + eventsList.arraySize++; + + VRCSDK2.VRC_EventHandler.VrcEvent e = (VRCSDK2.VRC_EventHandler.VrcEvent)t; + + SerializedProperty newEventProperty = eventsList.GetArrayElementAtIndex(eventsList.arraySize - 1); + newEventProperty.FindPropertyRelative("Name").stringValue = e.Name; + newEventProperty.FindPropertyRelative("EventType").intValue = (int)e.EventType; + newEventProperty.FindPropertyRelative("ParameterInt").intValue = e.ParameterInt; + newEventProperty.FindPropertyRelative("ParameterFloat").floatValue = e.ParameterFloat; + newEventProperty.FindPropertyRelative("ParameterString").stringValue = e.ParameterString; + newEventProperty.FindPropertyRelative("ParameterObjects").arraySize = e.ParameterObjects.Length; + for (int obj_idx = 0; obj_idx < e.ParameterObjects.Length; ++obj_idx) + newEventProperty.FindPropertyRelative("ParameterObjects").GetArrayElementAtIndex(obj_idx).objectReferenceValue = e.ParameterObjects[obj_idx]; + +#pragma warning disable CS0618 // Type or member is obsolete + newEventProperty.FindPropertyRelative("ParameterObject").objectReferenceValue = e.ParameterObject; +#pragma warning restore CS0618 // Type or member is obsolete + + serializedObject.ApplyModifiedProperties(); + }, evt); + } + } + menu.ShowAsContext(); + + eventLists = new ReorderableList[0]; + objectLists = new ReorderableList[0]; + relayLists = new ReorderableList[0]; + }; + + eventLists[idx] = newList; + } + + ReorderableList eventList = eventLists[idx]; + eventList.DoLayoutList(); + } + + private void RenderDataStorage(SerializedProperty triggerProperty) + { + if (triggerProperty.serializedObject.targetObjects.Any(obj => (obj as VRCSDK2.VRC_Trigger).gameObject.GetComponent<VRCSDK2.VRC_DataStorage>() == null)) + RenderHelpBox("Data Storage Triggers require a VRC_DataStorage Component.", MessageType.Warning); + else + { + SerializedProperty idxProperty = triggerProperty.FindPropertyRelative("DataElementIdx"); + VRCSDK2.VRC_DataStorage ds = (target as VRCSDK2.VRC_Trigger).gameObject.GetComponent<VRCSDK2.VRC_DataStorage>(); + + if (ds.data == null) + { + ds.data = new VRCSDK2.VRC_DataStorage.VrcDataElement[0]; + idxProperty.intValue = -1; + } + + List<string> names = new List<string>(); + names.Add("Any Data Element"); + foreach (VRCSDK2.VRC_DataStorage.VrcDataElement element in ds.data) + names.Add(element.name); + + int selectedIdx = idxProperty.intValue; + if (selectedIdx == -1) + selectedIdx = 0; + else + selectedIdx += 1; + + selectedIdx = EditorGUILayout.Popup("Data Element", selectedIdx, names.ToArray()); + + if (selectedIdx == 0) + idxProperty.intValue = -1; + else + idxProperty.intValue = selectedIdx - 1; + } + } + + private void RenderKey(SerializedProperty triggerProperty) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Key")); + } + + private void RenderCollider(SerializedProperty triggerProperty) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("TriggerIndividuals")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Layers")); + } + + private void RenderTimer(SerializedProperty triggerProperty) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Repeat")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("ResetOnEnable")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("LowPeriodTime")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("HighPeriodTime")); + } + + private void RenderCustom(SerializedProperty triggerProperty) + { + SerializedProperty nameProperty = triggerProperty.FindPropertyRelative("Name"); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Name")); + + if (string.IsNullOrEmpty(nameProperty.stringValue)) + nameProperty.stringValue = "Unnamed"; + } + + private void RenderRelay(SerializedProperty triggerProperty, int idx) + { + if (relayLists[idx] == null) + { + ReorderableList newList = new ReorderableList(serializedObject, triggerProperty.FindPropertyRelative("Others"), true, true, true, true); + newList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, new GUIContent("Targets")); + newList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty target = newList.serializedProperty.GetArrayElementAtIndex(index); + + EditorGUI.PropertyField(rect, target, GUIContent.none); + + target.serializedObject.ApplyModifiedProperties(); + }; + relayLists[idx] = newList; + } + relayLists[idx].DoLayoutList(); + } + + private void RenderEmpty(SerializedProperty triggerProperty) + { + } + + private bool doesPropertyContainAnyNullReceivers(SerializedProperty objectsProperty) + { + bool containsNullReceivers = false; + if (objectsProperty.arraySize > 0) + { + for (int i = 0; i < objectsProperty.arraySize; i++) + { + SerializedProperty elem = objectsProperty.GetArrayElementAtIndex(i); + if (elem.objectReferenceValue == null) containsNullReceivers = true; + } + } + return containsNullReceivers; + } + + private void RenderTargetGameObjectList(SerializedProperty objectsProperty, int idx, bool receiverRequired = true) + { + if (objectLists[idx] == null) + { + objectLists[idx] = new ReorderableList(objectsProperty.serializedObject, objectsProperty, true, true, true, true); + objectLists[idx].drawHeaderCallback = (Rect rect) => + { + string infoString = "Receivers"; + if (objectsProperty.arraySize == 0) + infoString = "Receivers: This GameObject"; + EditorGUI.LabelField(rect, new GUIContent(infoString)); + + Event evt = Event.current; + if (!rect.Contains(evt.mousePosition)) + return; + + if (evt.type == EventType.DragUpdated) + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if (evt.type == EventType.DragPerform) + { + GameObject[] dragObjects = DragAndDrop.objectReferences.OfType<GameObject>().ToArray(); + int startIndex = objectsProperty.arraySize; + objectsProperty.arraySize = objectsProperty.arraySize + dragObjects.Length; + + for (int i = 0; i < dragObjects.Length; i++) + { + SerializedProperty newElem = objectsProperty.GetArrayElementAtIndex(startIndex + i); + newElem.objectReferenceValue = dragObjects[i]; + } + + DragAndDrop.AcceptDrag(); + evt.Use(); + } + }; + objectLists[idx].drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty target = objectLists[idx].serializedProperty.GetArrayElementAtIndex(index); + EditorGUI.PropertyField(rect, target, GUIContent.none); + target.serializedObject.ApplyModifiedProperties(); + }; + } + objectLists[idx].DoLayoutList(); + if (objectsProperty.arraySize == 0) + RenderHelpBox("This trigger will target the GameObject it's on, because the receivers list is empty.", MessageType.Error); + else if (receiverRequired && doesPropertyContainAnyNullReceivers(objectsProperty)) + RenderHelpBox("Trigger with no object set will be ignored!", MessageType.Info); + } + + private void RenderTargetComponentList<T>(SerializedProperty objectsProperty, int idx, string label = "Receivers") where T : Component + { + if (objectLists[idx] == null) + { + objectLists[idx] = new ReorderableList(objectsProperty.serializedObject, objectsProperty, true, true, true, true); + objectLists[idx].drawHeaderCallback = (Rect rect) => + { + string infoString = label; + if (objectsProperty.arraySize == 0) + infoString = label + ": This " + typeof(T).Name; + EditorGUI.LabelField(rect, new GUIContent(infoString)); + + Event evt = Event.current; + if (!rect.Contains(evt.mousePosition)) + return; + + if (evt.type == EventType.DragUpdated) + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if (evt.type == EventType.DragPerform) + { + GameObject[] dragObjects = DragAndDrop.objectReferences.OfType<GameObject>().ToArray(); + int startIndex = objectsProperty.arraySize; + objectsProperty.arraySize = objectsProperty.arraySize + dragObjects.Length; + + for (int i = 0; i < dragObjects.Length; i++) + { + SerializedProperty newElem = objectsProperty.GetArrayElementAtIndex(startIndex + i); + newElem.objectReferenceValue = dragObjects[i]; + } + + DragAndDrop.AcceptDrag(); + evt.Use(); + } + }; + objectLists[idx].drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty target = objectLists[idx].serializedProperty.GetArrayElementAtIndex(index); + + T current = null; + if (target.objectReferenceValue != null) + current = (target.objectReferenceValue as GameObject).GetComponent<T>(); + + current = EditorGUI.ObjectField(rect, current, typeof(T), true) as T; + target.objectReferenceValue = current == null ? null : current.gameObject; + target.serializedObject.ApplyModifiedProperties(); + }; + } + objectLists[idx].DoLayoutList(); + if (objectsProperty.arraySize == 0) + RenderHelpBox("This trigger will target the GameObject it's on, because the receivers list is empty.", MessageType.Error); + else if (doesPropertyContainAnyNullReceivers(objectsProperty)) + RenderHelpBox("Trigger with no object set will be ignored!", MessageType.Info); + } + + public void RenderEventEditor(SerializedProperty shadowProperty, SerializedProperty triggerProperty, SerializedProperty eventProperty, int triggerIdx) + { + SerializedProperty eventTypeProperty = eventProperty.FindPropertyRelative("EventType"); + SerializedProperty parameterObjectProperty = eventProperty.FindPropertyRelative("ParameterObject"); + SerializedProperty parameterObjectsProperty = eventProperty.FindPropertyRelative("ParameterObjects"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + SerializedProperty parameterBoolOpProperty = eventProperty.FindPropertyRelative("ParameterBoolOp"); + SerializedProperty parameterFloatProperty = eventProperty.FindPropertyRelative("ParameterFloat"); + SerializedProperty parameterIntProperty = eventProperty.FindPropertyRelative("ParameterInt"); + SerializedProperty parameterBytesProperty = eventProperty.FindPropertyRelative("ParameterBytes"); + + if (parameterObjectProperty.objectReferenceValue != null && parameterObjectsProperty.arraySize == 0) + { + parameterObjectsProperty.arraySize = 1; + parameterObjectsProperty.GetArrayElementAtIndex(0).objectReferenceValue = parameterObjectProperty.objectReferenceValue; + } + parameterObjectProperty.objectReferenceValue = null; + + switch ((VRCSDK2.VRC_EventHandler.VrcEventType)eventTypeProperty.intValue) + { + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationBool: + { + RenderTargetComponentList<Animator>(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Variable")); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationFloat: + { + RenderTargetComponentList<Animator>(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Variable")); + RenderPropertyEditor(shadowProperty, parameterFloatProperty, new GUIContent("Value")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationInt: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntAdd: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntDivide: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntMultiply: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntSubtract: + { + RenderTargetComponentList<Animator>(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Variable")); + RenderPropertyEditor(shadowProperty, parameterIntProperty, new GUIContent("Value")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationTrigger: + { + RenderTargetComponentList<Animator>(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Trigger")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.PlayAnimation: + { + RenderTargetComponentList<Animation>(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Clip")); + + for (int idx = 0; idx < parameterObjectsProperty.arraySize; ++idx) + { + GameObject obj = parameterObjectsProperty.GetArrayElementAtIndex(idx).objectReferenceValue as GameObject; + Animation anim = obj == null ? null : obj.GetComponent<Animation>(); + if (anim != null && anim.GetClip(parameterStringProperty.stringValue) == null) + { + RenderHelpBox("Could not locate " + parameterStringProperty.stringValue + " on " + obj.name + "; is it legacy?", MessageType.Error); + break; + } + } + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AudioTrigger: + { + RenderTargetComponentList<AudioSource>(parameterObjectsProperty, triggerIdx); + + List<string> clipNames = new List<string>(); + if (parameterObjectsProperty.arraySize > 0) + { + int idx = 0; + for (; idx < parameterObjectsProperty.arraySize; ++idx) + { + SerializedProperty prop = parameterObjectsProperty.GetArrayElementAtIndex(0); + GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; + if (obj != null) + { + foreach (AudioSource source in obj.GetComponents<AudioSource>()) + if (source.clip != null && !string.IsNullOrEmpty(source.clip.name)) + clipNames.Add(source.clip.name); + break; + } + } + for (; idx < parameterObjectsProperty.arraySize; ++idx) + { + SerializedProperty prop = parameterObjectsProperty.GetArrayElementAtIndex(0); + GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; + if (obj != null) + { + List<string> thisClipNames = new List<string>(); + foreach (AudioSource source in obj.GetComponents<AudioSource>()) + if (source.clip != null && !string.IsNullOrEmpty(source.clip.name)) + thisClipNames.Add(source.clip.name); + clipNames.RemoveAll(s => thisClipNames.Contains(s) == false); + } + } + } + + clipNames.Insert(0, ""); + int selectedIdx; + for (selectedIdx = clipNames.Count - 1; selectedIdx > 0; --selectedIdx) + if (parameterStringProperty.stringValue == clipNames[selectedIdx]) + break; + + parameterStringProperty.stringValue = clipNames[EditorGUILayout.Popup("Clip", selectedIdx, clipNames.ToArray())]; + break; + } +#pragma warning disable CS0618 // Type or member is obsolete + case VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility: +#pragma warning restore CS0618 // Type or member is obsolete + { + RenderTargetComponentList<Renderer>(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand: + { + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Command")); + break; + } +#pragma warning disable CS0618 // Type or member is obsolete + case VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage: +#pragma warning restore CS0618 // Type or member is obsolete + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + if (parameterObjectsProperty.arraySize > 0) + RenderMethodSelector(eventProperty); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetGameObjectActive: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SetParticlePlaying: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.TeleportPlayer: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Align Room To Destination"), true); + parameterIntProperty.intValue = EditorGUILayout.Toggle("Lerp On Remote Clients", (parameterIntProperty.intValue != 0)) ? 1 : 0; + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelURI: + { + RenderTargetComponentList<VRCSDK2.VRC_WebPanel>(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("URI")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelVolume: + { + RenderTargetComponentList<VRCSDK2.VRC_WebPanel>(parameterObjectsProperty, triggerIdx); + parameterFloatProperty.floatValue = EditorGUILayout.Slider("Volume", parameterFloatProperty.floatValue, 0f, 1f); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SendRPC: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + + if (parameterObjectsProperty.arraySize > 0) + { + RenderMethodSelector(eventProperty); + RenderRPCParameterEditor(eventProperty); + } + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.ActivateCustomTrigger: + { + RenderTargetComponentList<VRCSDK2.VRC_Trigger>(parameterObjectsProperty, triggerIdx); + + VRC_EditorTools.CustomTriggerPopup("Name", parameterObjectsProperty, parameterStringProperty); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject: + { + VRCSDK2.VRC_SceneDescriptor scene = FindObjectOfType<VRCSDK2.VRC_SceneDescriptor>(); + + string path = parameterStringProperty.stringValue; + GameObject found = scene != null ? scene.DynamicPrefabs.FirstOrDefault(p => AssetDatabase.GetAssetOrScenePath(p) == path) : null; + found = found == null ? AssetDatabase.LoadAssetAtPath<GameObject>(path) : found; + GameObject newFound = EditorGUILayout.ObjectField("Prefab", found, typeof(GameObject), false) as GameObject; + parameterStringProperty.stringValue = newFound == null ? null : AssetDatabase.GetAssetOrScenePath(newFound); + + RenderTargetComponentList<Transform>(parameterObjectsProperty, triggerIdx, "Locations"); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.DestroyObject: + { + SerializedProperty broadcastTypeProperty = triggerProperty.FindPropertyRelative("BroadcastType"); + VRCSDK2.VRC_EventHandler.VrcBroadcastType broadcast = (VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastTypeProperty.intValue; + if (broadcast != VRCSDK2.VRC_EventHandler.VrcBroadcastType.Always && broadcast != VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered && broadcast != VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne) + RenderHelpBox("Not all clients will destroy the object.", MessageType.Warning); + + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetLayer: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + parameterIntProperty.intValue = (int)EditorGUILayout.LayerField("Layer", parameterIntProperty.intValue); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetMaterial: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + + VRCSDK2.VRC_SceneDescriptor scene = FindObjectOfType<VRCSDK2.VRC_SceneDescriptor>(); + + string path = parameterStringProperty.stringValue; + Material found = scene != null ? scene.DynamicMaterials.FirstOrDefault(p => AssetDatabase.GetAssetOrScenePath(p) == path) : null; + found = found == null ? AssetDatabase.LoadAssetAtPath<Material>(path) : found; + Material newFound = EditorGUILayout.ObjectField("Material", found, typeof(Material), false) as Material; + parameterStringProperty.stringValue = newFound == null ? null : AssetDatabase.GetAssetOrScenePath(newFound); + + if (scene != null && found != newFound) + { + scene.DynamicMaterials.Add(newFound); + scene.DynamicMaterials.Remove(found); + } + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddDamage: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx, false); + RenderPropertyEditor(shadowProperty, parameterFloatProperty, new GUIContent("Damage")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddHealth: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx, false); + RenderPropertyEditor(shadowProperty, parameterFloatProperty, new GUIContent("Health")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetComponentActive: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + if (RenderTargetComponentEditor(parameterStringProperty, parameterObjectsProperty, triggerIdx)) + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Enable"), true); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddVelocity: + case VRCSDK2.VRC_EventHandler.VrcEventType.SetVelocity: + { + RenderTargetComponentList<Rigidbody>(parameterObjectsProperty, triggerIdx); + RenderVector3andSpacePropertyEditor(parameterBytesProperty, new GUIContent("Velocity")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddAngularVelocity: + case VRCSDK2.VRC_EventHandler.VrcEventType.SetAngularVelocity: + { + RenderTargetComponentList<Rigidbody>(parameterObjectsProperty, triggerIdx); + RenderVector3andSpacePropertyEditor(parameterBytesProperty, new GUIContent("Angular Velocity")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddForce: + { + RenderTargetComponentList<Rigidbody>(parameterObjectsProperty, triggerIdx); + RenderVector3andSpacePropertyEditor(parameterBytesProperty, new GUIContent("Force")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetUIText: + { + RenderTargetComponentList<Text>(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Text")); + } + break; + +#if UDON + case VRCSDK2.VRC_EventHandler.VrcEventType.CallUdonMethod: + //{ + // RenderTargetComponentList<VRC.Udon.UdonBehaviour>(parameterObjectsProperty, triggerIdx); + // RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Method Name")); + //} + break; +#endif + default: + RenderHelpBox("Unsupported event type", MessageType.Error); + break; + } + } + + private void RenderVector3andSpacePropertyEditor(SerializedProperty propertyBytes, GUIContent label) + { + object[] parameters = null; + parameters = VRC.SDKBase.VRC_Serialization.ParameterDecoder(VRC_EditorTools.ReadBytesFromProperty(propertyBytes)); + if (parameters.Length == 0) + parameters = new object[1] { new Vector4() }; + + EditorGUI.BeginChangeCheck(); + Vector3 vec3Field = EditorGUILayout.Vector3Field(label, new Vector3(((Vector4)parameters[0]).x, ((Vector4)parameters[0]).y, ((Vector4)parameters[0]).z)); + bool spaceField = EditorGUILayout.Toggle("Use World Space", ((Vector4)parameters[0]).w > .5f ? true : false); + parameters[0] = new Vector4(vec3Field.x, vec3Field.y, vec3Field.z, Convert.ToSingle(spaceField)); + if (EditorGUI.EndChangeCheck()) + { + VRC_EditorTools.WriteBytesToProperty(propertyBytes, VRC.SDKBase.VRC_Serialization.ParameterEncoder(parameters)); + } + } + + private void RenderVector3PropertyEditor(SerializedProperty propertyBytes, GUIContent label) + { + object[] parameters = null; + parameters = VRC.SDKBase.VRC_Serialization.ParameterDecoder(VRC_EditorTools.ReadBytesFromProperty(propertyBytes)); + if (parameters.Length == 0) + parameters = new object[1] { new Vector3() }; + + EditorGUI.BeginChangeCheck(); + parameters[0] = EditorGUILayout.Vector3Field(label, (Vector3)parameters[0]); + + if (EditorGUI.EndChangeCheck()) + { + VRC_EditorTools.WriteBytesToProperty(propertyBytes, VRC.SDKBase.VRC_Serialization.ParameterEncoder(parameters)); + } + } + + bool RenderTargetComponentEditor(SerializedProperty componentNameProperty, SerializedProperty objectsProperty, int triggerIdx) + { + if (!objectsProperty.isArray || objectsProperty.arraySize == 0) + return false; + + HashSet<Type> behaviours = new HashSet<Type>(); + bool isFirst = true; + for (int objIdx = 0; objIdx < objectsProperty.arraySize; ++objIdx) + { + if (objectsProperty.GetArrayElementAtIndex(objIdx) == null || objectsProperty.GetArrayElementAtIndex(objIdx).objectReferenceValue == null || !(objectsProperty.GetArrayElementAtIndex(objIdx).objectReferenceValue is GameObject)) + continue; + + if (isFirst) + { + foreach (Component component in (objectsProperty.GetArrayElementAtIndex(0).objectReferenceValue as GameObject).GetComponents(typeof(Component))) + { + Type t = component.GetType(); + if (t.GetProperty("enabled") != null) + behaviours.Add(component.GetType()); + } + isFirst = false; + } + else + { + HashSet<Type> thisBehaviours = new HashSet<Type>(); + foreach (Component component in (objectsProperty.GetArrayElementAtIndex(objIdx).objectReferenceValue as GameObject).GetComponents(typeof(Component))) + { + Type t = component.GetType(); + if (t.GetProperty("enabled") != null) + thisBehaviours.Add(component.GetType()); + } + behaviours.RemoveWhere(s => thisBehaviours.Contains(s) == false); + } + } + + if (behaviours.Count == 0) + return false; + + Type[] types = behaviours.ToArray(); + string[] options = behaviours.Select(t => t.FullName).ToArray(); + int selectedIdx = 0; + for (int typeIdx = 0; typeIdx < types.Length; ++typeIdx) + if (types[typeIdx].FullName == componentNameProperty.stringValue) + { + selectedIdx = typeIdx; + break; + } + + selectedIdx = EditorGUILayout.Popup("Component", selectedIdx, options); + componentNameProperty.stringValue = types[selectedIdx].FullName; + + return true; + } + + void RenderRPCParameterEditor(SerializedProperty eventProperty) + { + EditorGUI.BeginChangeCheck(); + + SerializedProperty parameterIntProperty = eventProperty.FindPropertyRelative("ParameterInt"); + SerializedProperty parameterObjectsProperty = eventProperty.FindPropertyRelative("ParameterObjects"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + SerializedProperty parameterBytesProperty = eventProperty.FindPropertyRelative("ParameterBytes"); + + if (parameterIntProperty.intValue == -1) + parameterIntProperty.intValue = (int)(VRCSDK2.VRC_EventHandler.VrcTargetType.All); + + parameterIntProperty.intValue = (int)VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_EventHandler.VrcTargetType>("Targets", (VRCSDK2.VRC_EventHandler.VrcTargetType)parameterIntProperty.intValue, e => e != VRCSDK2.VRC_EventHandler.VrcTargetType.TargetPlayer); + + string message = null; + switch ((VRCSDK2.VRC_EventHandler.VrcTargetType)parameterIntProperty.intValue) + { + case VRCSDK2.VRC_EventHandler.VrcTargetType.All: + message = "Will execute on all clients, except for those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.AllBuffered: + message = "Will execute on all clients, including those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Local: + message = "Will execute for the instigator only."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Master: + message = "Will execute on the Master."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Others: + message = "Will execute for others but not locally, except for those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.OthersBuffered: + message = "Will execute for others but not locally, including those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Owner: + message = "Will execute on the Owner."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.AllBufferOne: + message = "Will execute on all clients, and only the most recent is executed for those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.OthersBufferOne: + message = "Will execute for others but not locally, and only the most recent is executed for those that join later."; + break; + } + if (message != null) + RenderHelpBox(message, MessageType.Info); + + Dictionary<string, List<MethodInfo>> methods = VRC_EditorTools.GetSharedAccessibleMethodsOnGameObjects(parameterObjectsProperty); + if (methods.Count == 0) + { + RenderHelpBox("No applicable methods found.", MessageType.Error); + return; + } + + List<MethodInfo> methodInfos = methods.Values.Aggregate(new List<MethodInfo>(), (acc, lst) => { acc.AddRange(lst); return acc; }); + + MethodInfo info = methodInfos.FirstOrDefault(m => m.Name == parameterStringProperty.stringValue); + if (info == null) + return; + + ParameterInfo[] paramInfo = info.GetParameters(); + + // Editor-only + foreach (var p in paramInfo) + if (p.ParameterType.Namespace.StartsWith("VRCSDK2")) + VRC.SDKBase.VRC_Serialization.RegisterType(p.ParameterType); + + object[] parameters = null; + if (rpcByteCache.ContainsKey(eventProperty.propertyPath)) + parameters = rpcByteCache[eventProperty.propertyPath]; + else + { + parameters = VRC.SDKBase.VRC_Serialization.ParameterDecoder(VRC_EditorTools.ReadBytesFromProperty(parameterBytesProperty)); + rpcByteCache.Add(eventProperty.propertyPath, parameters); + } + + if (parameters == null) + parameters = new object[paramInfo.Length]; + if (parameters.Length != paramInfo.Length) + Array.Resize(ref parameters, paramInfo.Length); + + EditorGUI.BeginChangeCheck(); + + bool finalParamIsPlayer = false; + + for (int idx = 0; idx < parameters.Length; ++idx) + { + Type paramType = paramInfo[idx].ParameterType; + if (paramType == typeof(Color)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = Color.black; + parameters[idx] = EditorGUILayout.ColorField(paramInfo[idx].Name, (Color)parameters[idx]); + } + else if (paramType == typeof(bool)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = false; + parameters[idx] = EditorGUILayout.Toggle(paramInfo[idx].Name, (bool)parameters[idx]); + } + else if (paramType.IsEnum) + { + // make an array of strings of the enum values + var values = Enum.GetValues(paramType); + string[] itemStrings = new string[values.Length]; + int i = 0; + foreach (var item in Enum.GetValues(paramType)) + { + itemStrings[i++] = item.ToString(); + } + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = Enum.Parse(paramType, itemStrings[0]); + parameters[idx] = Enum.Parse(paramType, itemStrings[EditorGUILayout.Popup(paramInfo[idx].Name, (int)parameters[idx], itemStrings)]); + } + else if (paramType == typeof(double)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0d; + parameters[idx] = EditorGUILayout.DoubleField(paramInfo[idx].Name, (double)parameters[idx]); + } + else if (paramType == typeof(float)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0f; + parameters[idx] = EditorGUILayout.FloatField(paramInfo[idx].Name, (float)parameters[idx]); + } + else if (paramType == typeof(int)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0; + parameters[idx] = EditorGUILayout.IntField(paramInfo[idx].Name, (int)parameters[idx]); + } + else if (typeof(VRC.SDKBase.VRCPlayerApi).IsAssignableFrom(paramType)) + { + if (idx == parameters.Length - 1) + finalParamIsPlayer = true; + parameters[idx] = null; + } + else if (paramType == typeof(long)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0; + parameters[idx] = EditorGUILayout.LongField(paramInfo[idx].Name, (long)parameters[idx]); + } + else if (paramType == typeof(UnityEngine.Rect)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Rect(); + parameters[idx] = EditorGUILayout.RectField(paramInfo[idx].Name, (UnityEngine.Rect)parameters[idx]); + } + else if (paramType == typeof(string)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = ""; + parameters[idx] = EditorGUILayout.TextField(paramInfo[idx].Name, (string)parameters[idx]); + } + else if (paramType == typeof(Vector2)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Vector2(); + parameters[idx] = EditorGUILayout.Vector2Field(paramInfo[idx].Name, (Vector2)parameters[idx]); + } + else if (paramType == typeof(Vector3)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Vector3(); + parameters[idx] = EditorGUILayout.Vector3Field(paramInfo[idx].Name, (Vector3)parameters[idx]); + } + else if (paramType == typeof(Vector4)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Vector4(); + parameters[idx] = EditorGUILayout.Vector4Field(paramInfo[idx].Name, (Vector4)parameters[idx]); + } + else if (paramType == typeof(Quaternion)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Quaternion(); + parameters[idx] = Quaternion.Euler(EditorGUILayout.Vector3Field(paramInfo[idx].Name, ((Quaternion)parameters[idx]).eulerAngles)); + } + else if (paramType == typeof(UnityEngine.Object) || paramType.IsSubclassOf(typeof(UnityEngine.Object))) + { + if (parameters[idx] != null && parameters[idx].GetType() != paramType) + parameters[idx] = null; + parameters[idx] = EditorGUILayout.ObjectField(paramInfo[idx].Name, (UnityEngine.Object)parameters[idx], paramType, true); + } + else + EditorGUILayout.LabelField("Unable to handle " + paramType.Name, EditorStyles.boldLabel); + } + + if (finalParamIsPlayer) + Array.Resize(ref parameters, parameters.Length - 1); + + if (EditorGUI.EndChangeCheck()) + { + VRC_EditorTools.WriteBytesToProperty(parameterBytesProperty, VRC.SDKBase.VRC_Serialization.ParameterEncoder(parameters)); + rpcByteCache[eventProperty.propertyPath] = parameters; + } + } + + void RenderMethodSelector(SerializedProperty eventProperty) + { + SerializedProperty parameterObjectsProperty = eventProperty.FindPropertyRelative("ParameterObjects"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + SerializedProperty parameterBytesProperty = eventProperty.FindPropertyRelative("ParameterBytes"); + + Dictionary<string, List<MethodInfo>> methods = VRC_EditorTools.GetSharedAccessibleMethodsOnGameObjects(parameterObjectsProperty); + if (methods.Count == 0) + return; + + List<string> combined = methods + .Select(pair => pair.Value.Select(s => pair.Key + "." + s.Name)) + .Aggregate((a, b) => + { + var v = new List<string>(); + v.AddRange(a); + v.AddRange(b); + return v; + }).ToList(); + combined.Insert(0, "Custom Method"); + + int currentIndex = string.IsNullOrEmpty(parameterStringProperty.stringValue) ? 0 : combined.FindIndex(s => + { + var split = s.Split('.'); + return split.Length > 1 && s.Split('.')[1] == parameterStringProperty.stringValue; + }); + if (currentIndex < 0 || currentIndex >= combined.Count) + currentIndex = 0; + + int newIndex = EditorGUILayout.Popup("Method", currentIndex, combined.ToArray()); + if (newIndex != currentIndex) + { + parameterStringProperty.stringValue = ""; + parameterBytesProperty.arraySize = 0; + } + currentIndex = newIndex; + + if (currentIndex == 0) + EditorGUILayout.PropertyField(parameterStringProperty, new GUIContent("Custom Method")); + else + parameterStringProperty.stringValue = combined[currentIndex].Split('.')[1]; + } + + private void RenderPropertyEditor(SerializedProperty shadowProperty, SerializedProperty property, GUIContent label, bool isBoolOp = false) + { + VRCSDK2.VRC_DataStorage ds = (target as VRCSDK2.VRC_Trigger).gameObject.GetComponent<VRCSDK2.VRC_DataStorage>(); + if (ds != null && ds.data != null && ds.data.Length != 0 && shadowProperty != null) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel(label); + + bool renderField = false; + switch (property.propertyType) + { + case SerializedPropertyType.Boolean: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterBoolOp"); + List<string> vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.Bool).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + case SerializedPropertyType.Float: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterFloat"); + List<string> vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.Float).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + case SerializedPropertyType.Integer: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterInt"); + List<string> vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.Int).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + case SerializedPropertyType.String: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterString"); + List<string> vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.String).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + default: + { + renderField = true; + } + break; + } + + if (renderField) + EditorGUILayout.PropertyField(property, GUIContent.none); + EditorGUILayout.EndHorizontal(); + } + else + { + if (isBoolOp) + VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_EventHandler.VrcBooleanOp>(label.text, property, s => s != VRCSDK2.VRC_EventHandler.VrcBooleanOp.Unused); + else + EditorGUILayout.PropertyField(property, label); + return; + } + } + + private bool ListPopup(List<string> vals, SerializedProperty prop, bool custom = true) + { + if (vals.Count == 0) + return false; + + if (custom) + vals.Insert(0, "Custom"); + + int selectedIdx = prop.stringValue == null ? 0 : vals.IndexOf(prop.stringValue); + if (selectedIdx < 0 || selectedIdx > vals.Count) + selectedIdx = 0; + + int idx = EditorGUILayout.Popup(selectedIdx, vals.ToArray()); + if (idx == 0 && custom) + { + prop.stringValue = null; + return false; + } + else + { + prop.stringValue = vals[idx]; + return true; + } + } + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_TriggerEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_TriggerEditor.cs.meta new file mode 100644 index 00000000..f108aeb7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_TriggerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3aecd666943878944a811acb9db2ace7 +timeCreated: 1474315179 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_WebPanelEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_WebPanelEditor.cs new file mode 100644 index 00000000..3f646e0a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_WebPanelEditor.cs @@ -0,0 +1,215 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR +using System.IO; +using UnityEditor; +using UnityEngine; +using UnityEditor.Build; +using System; +using System.Linq; +using VRC.SDKBase.Editor; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_WebPanel))] + public class VRC_WebPanelEditor : UnityEditor.Editor + { + private void InspectorField(string propertyName, string humanName) + { + SerializedProperty propertyField = serializedObject.FindProperty(propertyName); + EditorGUILayout.PropertyField(propertyField, new GUIContent(humanName), true); + } + + bool showFiles = false; + System.Collections.Generic.List<string> directories = null; + System.Collections.Generic.List<string> files = null; + + public override void OnInspectorGUI() + { + serializedObject.Update(); + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.BeginVertical(); + + EditorGUILayout.HelpBox("Do not play any videos with Web Panels, use VRC_SyncVideoPlayer instead!", MessageType.Error); + + EditorGUILayout.Space(); + + InspectorField("proximity", "Proximity for Interactivity"); + EditorGUILayout.Space(); + + VRCSDK2.VRC_WebPanel web = (VRCSDK2.VRC_WebPanel)target; + + if (Application.isPlaying) + { + InspectorField("webRoot", "Web Root"); + InspectorField("defaultUrl", "URI"); + + showFiles = web.webData != null && EditorGUILayout.Foldout(showFiles, web.webData.Count.ToString() + " files imported"); + if (showFiles) + foreach (var file in web.webData) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel(file.path); + EditorGUILayout.LabelField(file.data.Length.ToString()); + EditorGUILayout.EndHorizontal(); + } + } + else + { + SerializedProperty webRoot = serializedObject.FindProperty("webRoot"); + RenderDirectoryList(serializedObject, "webRoot", "Path To Web Content"); + + if (string.IsNullOrEmpty(webRoot.stringValue)) + { + InspectorField("defaultUrl", "Start URI"); + } + else + { + RenderWebRootSelector(serializedObject, "defaultUrl", "Start Page"); + + if (VRCSettings.DisplayHelpBoxes) + { + EditorGUILayout.HelpBox("Javascript API bindings are called with engine.call('methodName', ...), which returns a promise-like object.", MessageType.Info); + EditorGUILayout.HelpBox("Javascript may call ListBindings() to discover available API bindings.", MessageType.Info); + EditorGUILayout.HelpBox("Javascript may listen for the 'onBindingsReady' event to execute script when the page is fully loaded and API bindings are available.", MessageType.Info); + } + } + } + + EditorGUILayout.Space(); + + InspectorField("cookiesEnabled", "Enable Cookies"); + + InspectorField("interactive", "Is Interactive"); + + InspectorField("localOnly", "Only Visible Locally"); + + if (!web.localOnly) + { + InspectorField("syncURI", "Synchronize URI"); + InspectorField("syncInput", "Synchronize Mouse Position"); + } + + InspectorField("transparent", "Transparent Background"); + + InspectorField("autoFormSubmit", "Input should Submit Forms"); + + EditorGUILayout.Space(); + + InspectorField("station", "Interaction Station"); + EditorGUILayout.Space(); + + InspectorField("cursor", "Mouse Cursor Object"); + + EditorGUILayout.Space(); + + InspectorField("resolutionWidth", "Resolution Width"); + InspectorField("resolutionHeight", "Resolution Height"); + InspectorField("displayRegion", "Display Region"); + + EditorGUILayout.Space(); + + InspectorField("extraVideoScreens", "Duplicate Screens"); + + EditorGUILayout.EndVertical(); + + if (EditorGUI.EndChangeCheck()) + serializedObject.ApplyModifiedProperties(); + } + + private void AddSubDirectories(ref System.Collections.Generic.List<string> l, string root) + { + if (!Directory.Exists(root)) + { + return; + } + + if (!root.StartsWith(Application.dataPath + Path.DirectorySeparatorChar + "VRCSDK") + || root == Application.dataPath + Path.DirectorySeparatorChar + "VRCSDK" + Path.DirectorySeparatorChar + "Examples" + Path.DirectorySeparatorChar + "Sample Assets" + Path.DirectorySeparatorChar + "WebRoot") + l.Add(root.Substring(Application.dataPath.Length)); + + string[] subdirectories = Directory.GetDirectories(root); + foreach (string dir in subdirectories) + AddSubDirectories(ref l, dir); + } + + private void RenderDirectoryList(SerializedObject obj, string propertyName, string humanName) + { + if (directories == null) + { + directories = new System.Collections.Generic.List<string>(); + directories.Add("No Web Content Directory"); + + AddSubDirectories(ref directories, Application.dataPath + Path.DirectorySeparatorChar); + } + + SerializedProperty target = serializedObject.FindProperty(propertyName); + + int selectedIdx = target.stringValue == null ? 0 : directories.IndexOf(target.stringValue); + if (selectedIdx < 0 || selectedIdx >= directories.Count) + selectedIdx = 0; + + selectedIdx = EditorGUILayout.Popup(humanName, selectedIdx, directories.ToArray()); + if (selectedIdx > 0 && selectedIdx < directories.Count) + target.stringValue = directories[selectedIdx]; + else + target.stringValue = null; + } + + private void AddSubDirectoryFiles(ref System.Collections.Generic.List<string> l, string root) + { + if (!Directory.Exists(root)) + return; + + string[] files = Directory.GetFiles(root); + foreach (string file in files.Where(f => f.ToLower().EndsWith(".html") || f.ToLower().EndsWith(".htm"))) + l.Add(file.Substring(Application.dataPath.Length)); + + string[] subdirectories = Directory.GetDirectories(root); + foreach (string dir in subdirectories) + AddSubDirectoryFiles(ref l, dir); + } + + private void RenderWebRootSelector(SerializedObject obj, string propertyName, string humanName) + { + SerializedProperty webRoot = obj.FindProperty("webRoot"); + SerializedProperty target = serializedObject.FindProperty(propertyName); + + if (files == null) + { + files = new System.Collections.Generic.List<string>(); + + AddSubDirectoryFiles(ref files, Application.dataPath + webRoot.stringValue); + if (files.Count == 0) + { + EditorGUILayout.HelpBox("No suitable html files found in Web Content path.", MessageType.Error); + return; + } + } + + int selectedIdx = 0; + + try + { + System.Uri uri = string.IsNullOrEmpty(target.stringValue) ? null : new Uri(target.stringValue); + + selectedIdx = uri == null ? 0 : files.IndexOf(uri.AbsolutePath.Replace('/', System.IO.Path.DirectorySeparatorChar)); + if (selectedIdx < 0 || selectedIdx >= files.Count) + selectedIdx = 0; + } + catch { } + + selectedIdx = EditorGUILayout.Popup(humanName, selectedIdx, files.ToArray()); + if (selectedIdx >= 0 && selectedIdx < files.Count) + { + System.UriBuilder builder = new UriBuilder() + { + Scheme = "file", + Path = files[selectedIdx].Replace(System.IO.Path.DirectorySeparatorChar, '/'), + Host = "" + }; + target.stringValue = builder.Uri.ToString(); + } + } + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_WebPanelEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_WebPanelEditor.cs.meta new file mode 100644 index 00000000..06aa8999 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_WebPanelEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d09b36020f697be4d9a0f5a6a48cfa83 +timeCreated: 1457992191 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_YouTubeSyncEditor.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_YouTubeSyncEditor.cs new file mode 100644 index 00000000..0193737a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_YouTubeSyncEditor.cs @@ -0,0 +1,20 @@ +#if UNITY_EDITOR && VRC_SDK_VRCSDK2 +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.IO; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRC_YouTubeSync))] + public class VRC_YouTubeSyncEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("This component is deprecated, please use the VRC_SyncVideoPlayer component instead.", MessageType.Error); + } + } +} +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_YouTubeSyncEditor.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_YouTubeSyncEditor.cs.meta new file mode 100644 index 00000000..29cadd5d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Components/VRC_YouTubeSyncEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 764e26c1ca28e2e45a30c778c1955a47 +timeCreated: 1474675311 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel.meta new file mode 100644 index 00000000..75b85315 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57b5f86e2aae43641a9a2638d37566dd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/IVRCSdkControlPanelBuilder.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/IVRCSdkControlPanelBuilder.cs new file mode 100644 index 00000000..3dbb60d1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/IVRCSdkControlPanelBuilder.cs @@ -0,0 +1,9 @@ + +public interface IVRCSdkControlPanelBuilder +{ + void ShowSettingsOptions(); + bool IsValidBuilder(out string message); + void ShowBuilder(); + void RegisterBuilder(VRCSdkControlPanel baseBuilder); + void SelectAllComponents(); +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/IVRCSdkControlPanelBuilder.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/IVRCSdkControlPanelBuilder.cs.meta new file mode 100644 index 00000000..685eb8e9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/IVRCSdkControlPanelBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 310a760e312f2984e85eece367bab19a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanel.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanel.cs new file mode 100644 index 00000000..cbfe1044 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanel.cs @@ -0,0 +1,253 @@ +using UnityEditor; +using UnityEngine; +using VRC.Core; +using VRC.SDKBase.Editor; + +[ExecuteInEditMode] +public partial class VRCSdkControlPanel : EditorWindow +{ + public static VRCSdkControlPanel window; + + [MenuItem("VRChat SDK/Show Control Panel", false, 600)] + static void ShowControlPanel() + { + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + VRC.Core.API.SetOnlineMode(true, "vrchat"); + ConfigManager.RemoteConfig.Init(() => ShowControlPanel()); + return; + } + + window = (VRCSdkControlPanel)EditorWindow.GetWindow(typeof(VRCSdkControlPanel)); + window.titleContent.text = "VRChat SDK"; + window.minSize = new Vector2(SdkWindowWidth + 4, 600); + window.maxSize = new Vector2(SdkWindowWidth + 4, 2000); + window.Init(); + window.Show(); + } + + public static GUIStyle titleGuiStyle; + public static GUIStyle boxGuiStyle; + public static GUIStyle infoGuiStyle; + public static GUIStyle listButtonStyleEven; + public static GUIStyle listButtonStyleOdd; + public static GUIStyle listButtonStyleSelected; + public static GUIStyle scrollViewSeparatorStyle; + public static GUIStyle searchBarStyle; + + void InitializeStyles() + { + titleGuiStyle = new GUIStyle(); + titleGuiStyle.fontSize = 15; + titleGuiStyle.fontStyle = FontStyle.BoldAndItalic; + titleGuiStyle.alignment = TextAnchor.MiddleCenter; + titleGuiStyle.wordWrap = true; + if (EditorGUIUtility.isProSkin) + titleGuiStyle.normal.textColor = Color.white; + else + titleGuiStyle.normal.textColor = Color.black; + + boxGuiStyle = new GUIStyle(); + if (EditorGUIUtility.isProSkin) + { + boxGuiStyle.normal.background = CreateBackgroundColorImage(new Color(0.3f, 0.3f, 0.3f)); + boxGuiStyle.normal.textColor = Color.white; + } + else + { + boxGuiStyle.normal.background = CreateBackgroundColorImage(new Color(0.85f, 0.85f, 0.85f)); + boxGuiStyle.normal.textColor = Color.black; + } + + infoGuiStyle = new GUIStyle(); + infoGuiStyle.wordWrap = true; ; + if (EditorGUIUtility.isProSkin) + infoGuiStyle.normal.textColor = Color.white; + else + infoGuiStyle.normal.textColor = Color.black; + infoGuiStyle.margin = new RectOffset(10, 10, 10, 10); + + listButtonStyleEven = new GUIStyle(); + listButtonStyleEven.margin = new RectOffset(0, 0, 0, 0); + listButtonStyleEven.border = new RectOffset(0, 0, 0, 0); + if (EditorGUIUtility.isProSkin) + { + listButtonStyleEven.normal.textColor = new Color(0.8f, 0.8f, 0.8f); + listButtonStyleEven.normal.background = CreateBackgroundColorImage(new Color(0.540f, 0.540f, 0.54f)); + } + else + { + listButtonStyleEven.normal.textColor = Color.black; + listButtonStyleEven.normal.background = CreateBackgroundColorImage(new Color(0.85f, 0.85f, 0.85f)); + } + + listButtonStyleOdd = new GUIStyle(); + listButtonStyleOdd.margin = new RectOffset(0, 0, 0, 0); + listButtonStyleOdd.border = new RectOffset(0, 0, 0, 0); + if (EditorGUIUtility.isProSkin) + { + listButtonStyleOdd.normal.textColor = new Color(0.8f, 0.8f, 0.8f); + //listButtonStyleOdd.normal.background = CreateBackgroundColorImage(new Color(0.50f, 0.50f, 0.50f)); + } + else + { + listButtonStyleOdd.normal.textColor = Color.black; + listButtonStyleOdd.normal.background = CreateBackgroundColorImage(new Color(0.90f, 0.90f, 0.90f)); + } + + listButtonStyleSelected = new GUIStyle(); + listButtonStyleSelected.normal.textColor = Color.white; + listButtonStyleSelected.margin = new RectOffset(0, 0, 0, 0); + if (EditorGUIUtility.isProSkin) + { + listButtonStyleSelected.normal.textColor = new Color(0.8f, 0.8f, 0.8f); + listButtonStyleSelected.normal.background = CreateBackgroundColorImage(new Color(0.4f, 0.4f, 0.4f)); + } + else + { + listButtonStyleSelected.normal.textColor = Color.black; + listButtonStyleSelected.normal.background = CreateBackgroundColorImage(new Color(0.75f, 0.75f, 0.75f)); + } + + scrollViewSeparatorStyle = new GUIStyle("Toolbar"); + scrollViewSeparatorStyle.fixedWidth = SdkWindowWidth + 10; + scrollViewSeparatorStyle.fixedHeight = 4; + scrollViewSeparatorStyle.margin.top = 1; + + searchBarStyle = new GUIStyle("Toolbar"); + searchBarStyle.fixedWidth = SdkWindowWidth; + searchBarStyle.fixedHeight = 23; + searchBarStyle.padding.top = 3; + + } + + void Init() + { + InitializeStyles(); + ResetIssues(); + InitAccount(); + } + + void OnEnable() + { + OnEnableAccount(); + AssemblyReloadEvents.afterAssemblyReload += BuilderAssemblyReload; + } + + void OnDisable() + { + AssemblyReloadEvents.afterAssemblyReload -= BuilderAssemblyReload; + } + + void OnDestroy() + { + AccountDestroy(); + } + + public const int SdkWindowWidth = 518; + + private readonly GUIContent[] _toolbarLabels = new GUIContent[4] + { + new GUIContent("Authentication"), + new GUIContent("Builder"), + new GUIContent("Content Manager"), + new GUIContent("Settings") + }; + + private readonly bool[] _toolbarOptionsLoggedIn = new bool[4] {true, true, true, true}; + private readonly bool[] _toolbarOptionsNotLoggedIn = new bool[4] {true, false, false, true}; + + void OnGUI() + { + if (window == null) + { + window = (VRCSdkControlPanel)EditorWindow.GetWindow(typeof(VRCSdkControlPanel)); + InitializeStyles(); + } + + if (_bannerImage == null) + _bannerImage = AssetDatabase.LoadAssetAtPath("Assets/VRCSDK/Dependencies/VRChat/SdkGraphics/SDK_Panel_Banner.png", typeof(Texture2D)) as Texture2D; + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.BeginVertical(); + + GUILayout.Box(_bannerImage); + + if (Application.isPlaying) + { + GUI.enabled = false; + GUILayout.Space(20); + EditorGUILayout.LabelField("Unity Application is running ...\nStop it to access the Control Panel", titleGuiStyle, GUILayout.Width(SdkWindowWidth)); + GUI.enabled = true; + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + return; + } + + EditorGUILayout.Space(); + + EnvConfig.SetActiveSDKDefines(); + + int showPanel = GUILayout.Toolbar(VRCSettings.ActiveWindowPanel, _toolbarLabels, APIUser.IsLoggedIn ? _toolbarOptionsLoggedIn : _toolbarOptionsNotLoggedIn, null, GUILayout.Width(SdkWindowWidth)); + + // Only show Account or Settings panels if not logged in + if (APIUser.IsLoggedIn == false && showPanel != 3) + { + showPanel = 0; + } + + if (showPanel != VRCSettings.ActiveWindowPanel) + { + VRCSettings.ActiveWindowPanel = showPanel; + } + + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + switch (showPanel) + { + case 1: + ShowBuilders(); + break; + case 2: + ShowContent(); + break; + case 3: + ShowSettings(); + break; + case 0: + default: + ShowAccount(); + break; + } + } + + [UnityEditor.Callbacks.PostProcessScene] + static void OnPostProcessScene() + { + if (window != null) + window.Reset(); + } + + private void OnFocus() + { + Reset(); + } + + public void Reset() + { + ResetIssues(); + // style backgrounds may be nulled on scene load. detect if so has happened + if((boxGuiStyle != null) && (boxGuiStyle.normal.background == null)) + InitializeStyles(); + } + + [UnityEditor.Callbacks.DidReloadScripts(int.MaxValue)] + static void DidReloadScripts() + { + RefreshApiUrlSetting(); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanel.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanel.cs.meta new file mode 100644 index 00000000..2602c029 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanel.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 20b4cdbdda9655947aab6f8f2c90690f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelAccount.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelAccount.cs new file mode 100644 index 00000000..0e96a6a4 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelAccount.cs @@ -0,0 +1,551 @@ +using UnityEngine; +using UnityEditor; +using VRC.Core; +using System.Text.RegularExpressions; +using VRC.SDKBase.Editor; + +public partial class VRCSdkControlPanel : EditorWindow +{ + static bool isInitialized = false; + static string clientInstallPath; + static bool signingIn = false; + static string error = null; + + public static bool FutureProofPublishEnabled { get { return UnityEditor.EditorPrefs.GetBool("futureProofPublish", DefaultFutureProofPublishEnabled); } } + //public static bool DefaultFutureProofPublishEnabled { get { return !SDKClientUtilities.IsInternalSDK(); } } + public static bool DefaultFutureProofPublishEnabled { get { return false; } } + + static string storedUsername + { + get + { + return null; + } + set + { + EditorPrefs.DeleteKey("sdk#username"); + } + } + + static string storedPassword + { + get + { + return null; + } + set + { + EditorPrefs.DeleteKey("sdk#password"); + } + } + + static string username { get; set; } = null; + static string password { get; set; } = null; + + static ApiServerEnvironment serverEnvironment + { + get + { + ApiServerEnvironment env = ApiServerEnvironment.Release; + try + { + env = (ApiServerEnvironment)System.Enum.Parse(typeof(ApiServerEnvironment), UnityEditor.EditorPrefs.GetString("VRC_ApiServerEnvironment", env.ToString())); + } + catch (System.Exception e) + { + Debug.LogError("Invalid server environment name - " + e.ToString()); + } + + return env; + } + set + { + UnityEditor.EditorPrefs.SetString("VRC_ApiServerEnvironment", value.ToString()); + + API.SetApiUrlFromEnvironment(value); + } + } + + private void OnEnableAccount() + { + entered2faCodeIsInvalid = false; + warningIconGraphic = Resources.Load("2FAIcons/SDK_Warning_Triangle_icon") as Texture2D; + } + + public static void RefreshApiUrlSetting() + { + // this forces the static api url variable to be reset from the server environment set in editor prefs. + // needed because the static variable states get cleared when entering / exiting play mode + ApiServerEnvironment env = serverEnvironment; + serverEnvironment = env; + } + + public static void InitAccount() + { + if (isInitialized) + return; + + if (!APIUser.IsLoggedIn && ApiCredentials.Load()) + APIUser.InitialFetchCurrentUser((c) => AnalyticsSDK.LoggedInUserChanged(c.Model as APIUser), null); + + clientInstallPath = SDKClientUtilities.GetSavedVRCInstallPath(); + if (string.IsNullOrEmpty(clientInstallPath)) + clientInstallPath = SDKClientUtilities.LoadRegistryVRCInstallPath(); + + signingIn = false; + isInitialized = true; + + ClearContent(); + } + + public static bool OnShowStatus() + { + API.SetOnlineMode(true); + + SignIn(false); + + EditorGUILayout.BeginVertical(); + + if (APIUser.IsLoggedIn) + { + OnCreatorStatusGUI(); + } + + EditorGUILayout.EndVertical(); + + return APIUser.IsLoggedIn; + } + + static bool OnAccountGUI() + { + const int ACCOUNT_LOGIN_BORDER_SPACING = 20; + + EditorGUILayout.Separator(); + EditorGUILayout.Separator(); + EditorGUILayout.Separator(); + EditorGUILayout.Separator(); + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Space(ACCOUNT_LOGIN_BORDER_SPACING); + GUILayout.BeginVertical("Account", "window", GUILayout.Height(150), GUILayout.Width(340)); + + if (signingIn) + { + EditorGUILayout.LabelField("Signing in as " + username + "."); + } + else if (APIUser.IsLoggedIn) + { + if (Status != "Connected") + EditorGUILayout.LabelField(Status); + + OnCreatorStatusGUI(); + + GUILayout.BeginHorizontal(); + GUILayout.Label(""); + + if (GUILayout.Button("Logout")) + { + storedUsername = username = null; + storedPassword = password = null; + + VRC.Tools.ClearCookies(); + APIUser.Logout(); + ClearContent(); + } + GUILayout.EndHorizontal(); + } + else + { + InitAccount(); + + ApiServerEnvironment newEnv = ApiServerEnvironment.Release; + if (VRCSettings.DisplayAdvancedSettings) + newEnv = (ApiServerEnvironment)EditorGUILayout.EnumPopup("Use API", serverEnvironment); + if (serverEnvironment != newEnv) + serverEnvironment = newEnv; + + username = EditorGUILayout.TextField("Username/Email", username); + password = EditorGUILayout.PasswordField("Password", password); + + if (GUILayout.Button("Sign In")) + SignIn(true); + if (GUILayout.Button("Sign up")) + Application.OpenURL("https://vrchat.com/register"); + } + + if (showTwoFactorAuthenticationEntry) + { + OnTwoFactorAuthenticationGUI(); + } + + GUILayout.EndVertical(); + GUILayout.Space(ACCOUNT_LOGIN_BORDER_SPACING); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + return !signingIn; + } + + static void OnCreatorStatusGUI() + { + EditorGUILayout.LabelField("Logged in as:", APIUser.CurrentUser.displayName); + + //if (SDKClientUtilities.IsInternalSDK()) + // EditorGUILayout.LabelField("Developer Status: ", APIUser.CurrentUser.developerType.ToString()); + + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.BeginVertical(); + EditorGUILayout.LabelField("World Creator Status: ", APIUser.CurrentUser.canPublishWorlds ? "Allowed to publish worlds" : "Not yet allowed to publish worlds"); + EditorGUILayout.LabelField("Avatar Creator Status: ", APIUser.CurrentUser.canPublishAvatars ? "Allowed to publish avatars" : "Not yet allowed to publish avatars"); + EditorGUILayout.EndVertical(); + + if (!APIUser.CurrentUser.canPublishAllContent) + { + if (GUILayout.Button("More Info...")) + { + VRCSdkControlPanel.ShowContentPublishPermissionsDialog(); + } + } + + + EditorGUILayout.EndHorizontal(); + } + + void ShowAccount() + { + if (VRC.Core.ConfigManager.RemoteConfig.IsInitialized()) + { + if (VRC.Core.ConfigManager.RemoteConfig.HasKey("sdkUnityVersion")) + { + string sdkUnityVersion = VRC.Core.ConfigManager.RemoteConfig.GetString("sdkUnityVersion"); + if (string.IsNullOrEmpty(sdkUnityVersion)) + EditorGUILayout.LabelField("Could not fetch remote config."); + else if (Application.unityVersion != sdkUnityVersion) + { + EditorGUILayout.LabelField("Unity Version", EditorStyles.boldLabel); + EditorGUILayout.LabelField("Wrong Unity version. Please use " + sdkUnityVersion); + } + } + } + else + { + VRC.Core.API.SetOnlineMode(true, "vrchat"); + VRC.Core.ConfigManager.RemoteConfig.Init(); + } + + OnAccountGUI(); + } + + + private const string TWO_FACTOR_AUTHENTICATION_HELP_URL = "https://docs.vrchat.com/docs/setup-2fa"; + + private const string ENTER_2FA_CODE_TITLE_STRING = "Enter a numeric code from your authenticator app (or one of your saved recovery codes)."; + private const string ENTER_2FA_CODE_LABEL_STRING = "Code:"; + + private const string CHECKING_2FA_CODE_STRING = "Checking code..."; + private const string ENTER_2FA_CODE_INVALID_CODE_STRING = "Invalid Code"; + + private const string ENTER_2FA_CODE_VERIFY_STRING = "Verify"; + private const string ENTER_2FA_CODE_CANCEL_STRING = "Cancel"; + private const string ENTER_2FA_CODE_HELP_STRING = "Help"; + + private const int WARNING_ICON_SIZE = 60; + private const int WARNING_FONT_HEIGHT = 18; + + static private Texture2D warningIconGraphic; + + static bool entered2faCodeIsInvalid; + static bool authorizationCodeWasVerified; + + static private int previousAuthenticationCodeLength = 0; + static bool checkingCode; + static string authenticationCode = ""; + + static System.Action onAuthenticationVerifiedAction; + + static bool _showTwoFactorAuthenticationEntry = false; + + static bool showTwoFactorAuthenticationEntry + { + get + { + return _showTwoFactorAuthenticationEntry; + } + set + { + _showTwoFactorAuthenticationEntry = value; + authenticationCode = ""; + if (!_showTwoFactorAuthenticationEntry && !authorizationCodeWasVerified) + Logout(); + } + } + + static bool IsValidAuthenticationCodeFormat() + { + bool isValid2faAuthenticationCode = false; + + if (!string.IsNullOrEmpty(authenticationCode)) + { + // check if the input is a valid 6-digit numberic code (ignoring spaces) + Regex rx = new Regex(@"^(\s*\d\s*){6}$", RegexOptions.Compiled); + MatchCollection matches6DigitCode = rx.Matches(authenticationCode); + isValid2faAuthenticationCode = (matches6DigitCode.Count == 1); + } + + return isValid2faAuthenticationCode; + } + + static bool IsValidRecoveryCodeFormat() + { + bool isValid2faRecoveryCode = false; + + if (!string.IsNullOrEmpty(authenticationCode)) + { + // check if the input is a valid 8-digit alpha-numberic code (format xxxx-xxxx) "-" is optional & ignore any spaces + // OTP codes also exclude the letters i,l,o and the digit 1 to prevent any confusion + Regex rx = new Regex(@"^(\s*[a-hj-km-np-zA-HJ-KM-NP-Z02-9]\s*){4}-?(\s*[a-hj-km-np-zA-HJ-KM-NP-Z02-9]\s*){4}$", RegexOptions.Compiled); + MatchCollection matchesRecoveryCode = rx.Matches(authenticationCode); + isValid2faRecoveryCode = (matchesRecoveryCode.Count == 1); + } + + return isValid2faRecoveryCode; + } + + static void OnTwoFactorAuthenticationGUI() + { + const int ENTER_2FA_CODE_BORDER_SIZE = 20; + const int ENTER_2FA_CODE_BUTTON_WIDTH = 260; + const int ENTER_2FA_CODE_VERIFY_BUTTON_WIDTH = ENTER_2FA_CODE_BUTTON_WIDTH / 2; + const int ENTER_2FA_CODE_ENTRY_REGION_WIDTH = 130; + const int ENTER_2FA_CODE_MIN_WINDOW_WIDTH = ENTER_2FA_CODE_VERIFY_BUTTON_WIDTH + ENTER_2FA_CODE_ENTRY_REGION_WIDTH + (ENTER_2FA_CODE_BORDER_SIZE * 3); + + bool isValidAuthenticationCode = IsValidAuthenticationCodeFormat(); + + + // Invalid code text + if (entered2faCodeIsInvalid) + { + GUIStyle s = new GUIStyle(EditorStyles.label); + s.alignment = TextAnchor.UpperLeft; + s.normal.textColor = Color.red; + s.fontSize = WARNING_FONT_HEIGHT; + s.padding = new RectOffset(0, 0, (WARNING_ICON_SIZE - s.fontSize) / 2, 0); + s.fixedHeight = WARNING_ICON_SIZE; + + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + + EditorGUILayout.BeginVertical(); + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + var textDimensions = s.CalcSize(new GUIContent(ENTER_2FA_CODE_INVALID_CODE_STRING)); + GUILayout.Label(new GUIContent(warningIconGraphic), GUILayout.Width(WARNING_ICON_SIZE), GUILayout.Height(WARNING_ICON_SIZE)); + EditorGUILayout.LabelField(ENTER_2FA_CODE_INVALID_CODE_STRING, s, GUILayout.Width(textDimensions.x)); + EditorGUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndVertical(); + + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + } + else if (checkingCode) + { + // Display checking code message + EditorGUILayout.BeginVertical(); + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUIStyle s = new GUIStyle(EditorStyles.label); + s.alignment = TextAnchor.MiddleCenter; + s.fixedHeight = WARNING_ICON_SIZE; + EditorGUILayout.LabelField(CHECKING_2FA_CODE_STRING, s, GUILayout.Height(WARNING_ICON_SIZE)); + EditorGUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndVertical(); + } + else + { + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(ENTER_2FA_CODE_BORDER_SIZE); + GUILayout.FlexibleSpace(); + GUIStyle titleStyle = new GUIStyle(EditorStyles.label); + titleStyle.alignment = TextAnchor.MiddleCenter; + titleStyle.wordWrap = true; + EditorGUILayout.LabelField(ENTER_2FA_CODE_TITLE_STRING, titleStyle, GUILayout.Width(ENTER_2FA_CODE_MIN_WINDOW_WIDTH - (2 * ENTER_2FA_CODE_BORDER_SIZE)), GUILayout.Height(WARNING_ICON_SIZE), GUILayout.ExpandHeight(true)); + GUILayout.FlexibleSpace(); + GUILayout.Space(ENTER_2FA_CODE_BORDER_SIZE); + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(ENTER_2FA_CODE_BORDER_SIZE); + GUILayout.FlexibleSpace(); + Vector2 size = EditorStyles.boldLabel.CalcSize(new GUIContent(ENTER_2FA_CODE_LABEL_STRING)); + EditorGUILayout.LabelField(ENTER_2FA_CODE_LABEL_STRING, EditorStyles.boldLabel, GUILayout.MaxWidth(size.x)); + authenticationCode = EditorGUILayout.TextField(authenticationCode); + + // Verify 2FA code button + if (GUILayout.Button(ENTER_2FA_CODE_VERIFY_STRING, GUILayout.Width(ENTER_2FA_CODE_VERIFY_BUTTON_WIDTH))) + { + checkingCode = true; + APIUser.VerifyTwoFactorAuthCode(authenticationCode, isValidAuthenticationCode ? API2FA.TIME_BASED_ONE_TIME_PASSWORD_AUTHENTICATION : API2FA.ONE_TIME_PASSWORD_AUTHENTICATION, username, password, + delegate + { + // valid 2FA code submitted + entered2faCodeIsInvalid = false; + authorizationCodeWasVerified = true; + checkingCode = false; + showTwoFactorAuthenticationEntry = false; + if (null != onAuthenticationVerifiedAction) + onAuthenticationVerifiedAction(); + }, + delegate + { + entered2faCodeIsInvalid = true; + checkingCode = false; + } + ); + } + + GUILayout.FlexibleSpace(); + GUILayout.Space(ENTER_2FA_CODE_BORDER_SIZE); + EditorGUILayout.EndHorizontal(); + + GUILayout.FlexibleSpace(); + + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + + // after user has entered an invalid code causing the invalid code message to be displayed, + // edit the code will change it's length meaning it is invalid format, so we can clear the invalid code setting until they resubmit + if (previousAuthenticationCodeLength != authenticationCode.Length) + { + previousAuthenticationCodeLength = authenticationCode.Length; + entered2faCodeIsInvalid = false; + } + + GUI.enabled = true; + GUILayout.FlexibleSpace(); + GUILayout.Space(ENTER_2FA_CODE_BORDER_SIZE); + EditorGUILayout.EndHorizontal(); + + GUILayout.FlexibleSpace(); + + // Two-Factor Authentication Help button + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button(ENTER_2FA_CODE_HELP_STRING)) + { + Application.OpenURL(TWO_FACTOR_AUTHENTICATION_HELP_URL); + } + EditorGUILayout.EndHorizontal(); + + // Cancel button + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button(ENTER_2FA_CODE_CANCEL_STRING)) + { + showTwoFactorAuthenticationEntry = false; + Logout(); + } + EditorGUILayout.EndHorizontal(); + } + + private static string Status + { + get + { + if (!APIUser.IsLoggedIn) + return error == null ? "Please log in." : "Error in authenticating: " + error; + if (signingIn) + return "Logging in."; + else + { + if( serverEnvironment == ApiServerEnvironment.Dev ) + return "Connected to " + serverEnvironment.ToString(); + return "Connected"; + } + } + } + + private static void OnAuthenticationCompleted() + { + AttemptLogin(); + } + + private static void AttemptLogin() + { + APIUser.Login(username, password, + delegate (ApiModelContainer<APIUser> c) + { + APIUser user = c.Model as APIUser; + if (c.Cookies.ContainsKey("twoFactorAuth")) + ApiCredentials.Set(user.username, username, "vrchat", c.Cookies["auth"], c.Cookies["twoFactorAuth"]); + else if (c.Cookies.ContainsKey("auth")) + ApiCredentials.Set(user.username, username, "vrchat", c.Cookies["auth"]); + else + ApiCredentials.SetHumanName(user.username); + signingIn = false; + error = null; + storedUsername = null; + storedPassword = null; + AnalyticsSDK.LoggedInUserChanged(user); + + if (!APIUser.CurrentUser.canPublishAllContent) + { + if (UnityEditor.SessionState.GetString("HasShownContentPublishPermissionsDialogForUser", "") != user.id) + { + UnityEditor.SessionState.SetString("HasShownContentPublishPermissionsDialogForUser", user.id); + VRCSdkControlPanel.ShowContentPublishPermissionsDialog(); + } + } + }, + delegate (ApiModelContainer<APIUser> c) + { + Logout(); + error = c.Error; + VRC.Core.Logger.Log("Error logging in: " + error); + }, + delegate (ApiModelContainer<API2FA> c) + { + if (c.Cookies.ContainsKey("auth")) + ApiCredentials.Set(username, username, "vrchat", c.Cookies["auth"]); + showTwoFactorAuthenticationEntry = true; + onAuthenticationVerifiedAction = OnAuthenticationCompleted; + } + ); + } + + + private static object syncObject = new object(); + private static void SignIn(bool explicitAttempt) + { + lock (syncObject) + { + if (signingIn + || APIUser.IsLoggedIn + || (!explicitAttempt && string.IsNullOrEmpty(storedUsername))) + return; + + signingIn = true; + } + + InitAccount(); + + AttemptLogin(); + } + + public static void Logout() + { + signingIn = false; + storedUsername = null; + storedPassword = null; + VRC.Tools.ClearCookies(); + APIUser.Logout(); + } + + private void AccountDestroy() + { + signingIn = false; + isInitialized = false; + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelAccount.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelAccount.cs.meta new file mode 100644 index 00000000..33a77121 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelAccount.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5066cd5c1cc208143a1253cac821714a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilder.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilder.cs new file mode 100644 index 00000000..46cc98cb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilder.cs @@ -0,0 +1,651 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; +using VRC.SDKBase.Validation.Performance; +using Object = UnityEngine.Object; +using VRC.SDKBase.Editor; + +public partial class VRCSdkControlPanel : EditorWindow +{ + public static System.Action _EnableSpatialization = null; // assigned in AutoAddONSPAudioSourceComponents + + public const string AVATAR_OPTIMIZATION_TIPS_URL = "https://docs.vrchat.com/docs/avatar-optimizing-tips"; + public const string AVATAR_RIG_REQUIREMENTS_URL = "https://docs.vrchat.com/docs/rig-requirements"; + + const string kCantPublishContent = "Before you can upload avatars or worlds, you will need to spend some time in VRChat."; + const string kCantPublishAvatars = "Before you can upload avatars, you will need to spend some time in VRChat."; + const string kCantPublishWorlds = "Before you can upload worlds, you will need to spend some time in VRChat."; + private const string FIX_ISSUES_TO_BUILD_OR_TEST_WARNING_STRING = "You must address the above issues before you can build or test this content!"; + + static Texture _perfIcon_Excellent; + static Texture _perfIcon_Good; + static Texture _perfIcon_Medium; + static Texture _perfIcon_Poor; + static Texture _perfIcon_VeryPoor; + static Texture _bannerImage; + + public void ResetIssues() + { + GUIErrors.Clear(); + GUIInfos.Clear(); + GUIWarnings.Clear(); + GUILinks.Clear(); + GUIStats.Clear(); + CheckedForIssues = false; + } + + public bool CheckedForIssues { get; set; } = false; + + class Issue + { + public string issueText; + public System.Action showThisIssue; + public System.Action fixThisIssue; + public PerformanceRating performanceRating; + + public Issue(string text, System.Action show, System.Action fix, PerformanceRating rating = PerformanceRating.None) + { + issueText = text; + showThisIssue = show; + fixThisIssue = fix; + performanceRating = rating; + } + + public class Equality : IEqualityComparer<Issue>, IComparer<Issue> + { + public bool Equals(Issue b1, Issue b2) + { + return (b1.issueText == b2.issueText); + } + public int Compare(Issue b1, Issue b2) + { + return string.Compare(b1.issueText, b2.issueText); + } + public int GetHashCode(Issue bx) + { + return bx.issueText.GetHashCode(); + } + } + } + + Dictionary<Object, List<Issue>> GUIErrors = new Dictionary<Object, List<Issue>>(); + Dictionary<Object, List<Issue>> GUIWarnings = new Dictionary<Object, List<Issue>>(); + Dictionary<Object, List<Issue>> GUIInfos = new Dictionary<Object, List<Issue>>(); + Dictionary<Object, List<Issue>> GUILinks = new Dictionary<Object, List<Issue>>(); + Dictionary<Object, List<Issue>> GUIStats = new Dictionary<Object, List<Issue>>(); + + public bool NoGuiErrors() + { + return GUIErrors.Count == 0; + } + + public bool NoGuiErrorsOrIssues() + { + return GUIErrors.Count == 0 && CheckedForIssues; + } + + void AddToReport(Dictionary<Object, List<Issue>> report, Object subject, string output, System.Action show, System.Action fix) + { + if (subject == null) + subject = this; + if (!report.ContainsKey(subject)) + report.Add(subject, new List<Issue>()); + + var issue = new Issue(output, show, fix); + if (!report[subject].Contains(issue, new Issue.Equality())) + { + report[subject].Add(issue); + report[subject].Sort(new Issue.Equality()); + } + } + + void BuilderAssemblyReload() + { + ResetIssues(); + } + + public void OnGUIError(Object subject, string output, System.Action show, System.Action fix) + { + AddToReport(GUIErrors, subject, output, show, fix); + } + + public void OnGUIWarning(Object subject, string output, System.Action show, System.Action fix) + { + AddToReport(GUIWarnings, subject, output, show, fix); + } + + public void OnGUIInformation(Object subject, string output) + { + AddToReport(GUIInfos, subject, output, null, null); + } + + public void OnGUILink(Object subject, string output, string link) + { + AddToReport(GUILinks, subject, output + "\n" + link, null, null); + } + + public void OnGUIStat(Object subject, string output, PerformanceRating rating, System.Action show, System.Action fix) + { + if (subject == null) + subject = this; + if (!GUIStats.ContainsKey(subject)) + GUIStats.Add(subject, new List<Issue>()); + GUIStats[subject].Add(new Issue(output, show, fix, rating)); + } + + public int triggerLineMode + { + get { return EditorPrefs.GetInt("VRC.SDKBase_triggerLineMode", 0); } + set { EditorPrefs.SetInt("VRC.SDKBase_triggerLineMode", value); } + } + + private void ShowSettingsOptionsForBuilders() + { + if (_sdkBuilders == null) + { + PopulateSdkBuilders(); + } + for (int i = 0; i < _sdkBuilders.Length; i++) + { + IVRCSdkControlPanelBuilder builder = _sdkBuilders[i]; + builder.ShowSettingsOptions(); + if (i < _sdkBuilders.Length - 1) + { + EditorGUILayout.Separator(); + } + } + } + + private IVRCSdkControlPanelBuilder[] _sdkBuilders; + + private static List<Type> GetSdkBuilderTypesFromAttribute() + { + Type sdkBuilderInterfaceType = typeof(IVRCSdkControlPanelBuilder); + Type sdkBuilderAttributeType = typeof(VRCSdkControlPanelBuilderAttribute); + + List<Type> moduleTypesFromAttribute = new List<Type>(); + foreach(Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + VRCSdkControlPanelBuilderAttribute[] sdkBuilderAttributes; + try + { + sdkBuilderAttributes = (VRCSdkControlPanelBuilderAttribute[])assembly.GetCustomAttributes(sdkBuilderAttributeType, true); + } + catch + { + sdkBuilderAttributes = new VRCSdkControlPanelBuilderAttribute[0]; + } + + foreach(VRCSdkControlPanelBuilderAttribute udonWrapperModuleAttribute in sdkBuilderAttributes) + { + if(udonWrapperModuleAttribute == null) + { + continue; + } + + if(!sdkBuilderInterfaceType.IsAssignableFrom(udonWrapperModuleAttribute.Type)) + { + continue; + } + + moduleTypesFromAttribute.Add(udonWrapperModuleAttribute.Type); + } + } + + return moduleTypesFromAttribute; + } + + private void PopulateSdkBuilders() + { + if (_sdkBuilders != null) + { + return; + } + List<IVRCSdkControlPanelBuilder> builders = new List<IVRCSdkControlPanelBuilder>(); + foreach (Type type in GetSdkBuilderTypesFromAttribute()) + { + IVRCSdkControlPanelBuilder builder = (IVRCSdkControlPanelBuilder)Activator.CreateInstance(type); + builder.RegisterBuilder(this); + builders.Add(builder); + } + _sdkBuilders = builders.ToArray(); + } + + void ShowBuilders() + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.BeginVertical(); + + if (VRC.Core.ConfigManager.RemoteConfig.IsInitialized()) + { + string sdkUnityVersion = VRC.Core.ConfigManager.RemoteConfig.GetString("sdkUnityVersion"); + if (Application.unityVersion != sdkUnityVersion) + { + OnGUIWarning(null, "You are not using the recommended Unity version for the VRChat SDK. Content built with this version may not work correctly. Please use Unity " + sdkUnityVersion, + null, + () => { Application.OpenURL("https://unity3d.com/get-unity/download/archive"); } + ); + } + } + + if (VRCSdk3Analysis.IsSdkDllActive(VRCSdk3Analysis.SdkVersion.VRCSDK2) && VRCSdk3Analysis.IsSdkDllActive(VRCSdk3Analysis.SdkVersion.VRCSDK3)) + { + List<Component> sdk2Components = VRCSdk3Analysis.GetSDKInScene(VRCSdk3Analysis.SdkVersion.VRCSDK2); + List<Component> sdk3Components = VRCSdk3Analysis.GetSDKInScene(VRCSdk3Analysis.SdkVersion.VRCSDK3); + if (sdk2Components.Count > 0 && sdk3Components.Count > 0) + { + OnGUIError(null, + "This scene contains components from the VRChat SDK version 2 and version 3. Version two elements will have to be replaced with their version 3 counterparts to build with SDK3 and UDON.", + () => { Selection.objects = sdk2Components.ToArray(); }, + null + ); + } + } + + if (Lightmapping.giWorkflowMode == Lightmapping.GIWorkflowMode.Iterative) + { + OnGUIWarning(null, + "Automatic lightmap generation is enabled, which may stall the Unity build process. Before building and uploading, consider turning off 'Auto Generate' at the bottom of the Lighting Window.", + () => + { + EditorWindow lightingWindow = GetLightingWindow(); + if (lightingWindow) + { + lightingWindow.Show(); + lightingWindow.Focus(); + } + }, + () => + { + Lightmapping.giWorkflowMode = Lightmapping.GIWorkflowMode.OnDemand; + EditorWindow lightingWindow = GetLightingWindow(); + if (!lightingWindow) return; + lightingWindow.Repaint(); + Focus(); + } + ); + } + + PopulateSdkBuilders(); + IVRCSdkControlPanelBuilder selectedBuilder = null; + string errorMessage = null; + foreach (IVRCSdkControlPanelBuilder sdkBuilder in _sdkBuilders) + { + if (!sdkBuilder.IsValidBuilder(out string message)) + { + if (selectedBuilder == null) + { + errorMessage = message; + } + } + else + { + if (selectedBuilder == null) + { + selectedBuilder = sdkBuilder; + errorMessage = null; + } + else + { + errorMessage = + "A Unity scene cannot contain a VRChat Scene Descriptor and also contain VRChat Avatar Descriptors"; + } + } + } + if (selectedBuilder == null) + { +#if VRC_SDK_VRCSDK2 + EditorGUILayout.LabelField("A VRC_SceneDescriptor or VRC_AvatarDescriptor\nis required to build VRChat SDK Content", titleGuiStyle, GUILayout.Width(SdkWindowWidth)); +#elif VRC_SDK_VRCSDK3 + EditorGUILayout.LabelField("A VRCSceneDescriptor or VRCAvatarDescriptor\nis required to build VRChat SDK Content", titleGuiStyle, GUILayout.Width(SdkWindowWidth)); +#else + EditorGUILayout.LabelField("The SDK did not load properly. Try this - In the Project window, navigate to Assets/VRCSDK/Plugins. Select all the DLLs, then right click and choose 'Reimport'"); +#endif + } + else if (errorMessage != null) + { + OnGUIError(null, + errorMessage, + () => { + foreach (IVRCSdkControlPanelBuilder builder in _sdkBuilders) + { + builder.SelectAllComponents(); + } }, + null + ); + OnGUIShowIssues(); + } + else + { + selectedBuilder.ShowBuilder(); + } + + if (Event.current.type == EventType.Used) return; + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } + + public bool showLayerHelp = false; + + bool ShouldShowLightmapWarning + { + get + { + const string GraphicsSettingsAssetPath = "ProjectSettings/GraphicsSettings.asset"; + SerializedObject graphicsManager = new SerializedObject(UnityEditor.AssetDatabase.LoadAllAssetsAtPath(GraphicsSettingsAssetPath)[0]); + SerializedProperty lightmapStripping = graphicsManager.FindProperty("m_LightmapStripping"); + return lightmapStripping.enumValueIndex == 0; + } + } + + bool ShouldShowFogWarning + { + get + { + const string GraphicsSettingsAssetPath = "ProjectSettings/GraphicsSettings.asset"; + SerializedObject graphicsManager = new SerializedObject(UnityEditor.AssetDatabase.LoadAllAssetsAtPath(GraphicsSettingsAssetPath)[0]); + SerializedProperty lightmapStripping = graphicsManager.FindProperty("m_FogStripping"); + return lightmapStripping.enumValueIndex == 0; + } + } + + void DrawIssueBox(MessageType msgType, Texture icon, string message, System.Action show, System.Action fix) + { + bool haveButtons = ((show != null) || (fix != null)); + + GUIStyle style = new GUIStyle("HelpBox"); + style.fixedWidth = (haveButtons ? (SdkWindowWidth - 90) : SdkWindowWidth); + float minHeight = 40; + + try + { + EditorGUILayout.BeginHorizontal(); + if (icon != null) + { + GUIContent c = new GUIContent(message, icon); + float height = style.CalcHeight(c, style.fixedWidth); + GUILayout.Box(c, style, GUILayout.MinHeight(Mathf.Max(minHeight, height))); + } + else + { + GUIContent c = new GUIContent(message); + float height = style.CalcHeight(c, style.fixedWidth); + Rect rt = GUILayoutUtility.GetRect(c, style, GUILayout.MinHeight(Mathf.Max(minHeight, height))); + EditorGUI.HelpBox(rt, message, msgType); // note: EditorGUILayout resulted in uneven button layout in this case + } + + if (haveButtons) + { + EditorGUILayout.BeginVertical(); + float buttonHeight = ((show == null || fix == null) ? minHeight : (minHeight * 0.5f)); + if ((show != null) && GUILayout.Button("Select", GUILayout.Height(buttonHeight))) + show(); + if ((fix != null) && GUILayout.Button("Auto Fix", GUILayout.Height(buttonHeight))) + { + fix(); + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + CheckedForIssues = false; + Repaint(); + } + EditorGUILayout.EndVertical(); + } + + EditorGUILayout.EndHorizontal(); + } + catch + { + // mutes 'ArgumentException: Getting control 0's position in a group with only 0 controls when doing repaint' + } + } + + public void OnGuiFixIssuesToBuildOrTest() + { + GUIStyle s = new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleCenter }; + EditorGUILayout.Space(); + GUILayout.BeginVertical(boxGuiStyle, GUILayout.Height(WARNING_ICON_SIZE), GUILayout.Width(SdkWindowWidth)); + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + var textDimensions = s.CalcSize(new GUIContent(FIX_ISSUES_TO_BUILD_OR_TEST_WARNING_STRING)); + GUILayout.Label(new GUIContent(warningIconGraphic), GUILayout.Width(WARNING_ICON_SIZE), GUILayout.Height(WARNING_ICON_SIZE)); + EditorGUILayout.LabelField(FIX_ISSUES_TO_BUILD_OR_TEST_WARNING_STRING, s, GUILayout.Width(textDimensions.x), GUILayout.Height(WARNING_ICON_SIZE)); + EditorGUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.EndVertical(); + } + + public void OnGUIShowIssues(Object subject = null) + { + if (subject == null) + subject = this; + + EditorGUI.BeginChangeCheck(); + + GUIStyle style = GUI.skin.GetStyle("HelpBox"); + + if (GUIErrors.ContainsKey(subject)) + foreach (Issue error in GUIErrors[subject].Where(s => !string.IsNullOrEmpty(s.issueText))) + DrawIssueBox(MessageType.Error, null, error.issueText, error.showThisIssue, error.fixThisIssue); + if (GUIWarnings.ContainsKey(subject)) + foreach (Issue error in GUIWarnings[subject].Where(s => !string.IsNullOrEmpty(s.issueText))) + DrawIssueBox(MessageType.Warning, null, error.issueText, error.showThisIssue, error.fixThisIssue); + + if (GUIStats.ContainsKey(subject)) + { + foreach (var kvp in GUIStats[subject].Where(k => k.performanceRating == PerformanceRating.VeryPoor)) + DrawIssueBox(MessageType.Warning, GetPerformanceIconForRating(kvp.performanceRating), kvp.issueText, kvp.showThisIssue, kvp.fixThisIssue); + + foreach (var kvp in GUIStats[subject].Where(k => k.performanceRating == PerformanceRating.Poor)) + DrawIssueBox(MessageType.Warning, GetPerformanceIconForRating(kvp.performanceRating), kvp.issueText, kvp.showThisIssue, kvp.fixThisIssue); + + foreach (var kvp in GUIStats[subject].Where(k => k.performanceRating == PerformanceRating.Medium)) + DrawIssueBox(MessageType.Warning, GetPerformanceIconForRating(kvp.performanceRating), kvp.issueText, kvp.showThisIssue, kvp.fixThisIssue); + + foreach (var kvp in GUIStats[subject].Where(k => k.performanceRating == PerformanceRating.Good || k.performanceRating == PerformanceRating.Excellent)) + DrawIssueBox(MessageType.Warning, GetPerformanceIconForRating(kvp.performanceRating), kvp.issueText, kvp.showThisIssue, kvp.fixThisIssue); + } + + if (GUIInfos.ContainsKey(subject)) + foreach (Issue error in GUIInfos[subject].Where(s => !string.IsNullOrEmpty(s.issueText))) + EditorGUILayout.HelpBox(error.issueText, MessageType.Info); + if (GUILinks.ContainsKey(subject)) + { + EditorGUILayout.BeginVertical(style); + foreach (Issue error in GUILinks[subject].Where(s => !string.IsNullOrEmpty(s.issueText))) + { + var s = error.issueText.Split('\n'); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(s[0]); + if (GUILayout.Button("Open Link", GUILayout.Width(100))) + Application.OpenURL(s[1]); + EditorGUILayout.EndHorizontal(); + } + EditorGUILayout.EndVertical(); + } + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(subject); + UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()); + } + } + + private Texture GetPerformanceIconForRating(PerformanceRating value) + { + if (_perfIcon_Excellent == null) + _perfIcon_Excellent = Resources.Load<Texture>("PerformanceIcons/Perf_Great_32"); + if (_perfIcon_Good == null) + _perfIcon_Good = Resources.Load<Texture>("PerformanceIcons/Perf_Good_32"); + if (_perfIcon_Medium == null) + _perfIcon_Medium = Resources.Load<Texture>("PerformanceIcons/Perf_Medium_32"); + if (_perfIcon_Poor == null) + _perfIcon_Poor = Resources.Load<Texture>("PerformanceIcons/Perf_Poor_32"); + if (_perfIcon_VeryPoor == null) + _perfIcon_VeryPoor = Resources.Load<Texture>("PerformanceIcons/Perf_Horrible_32"); + + switch (value) + { + case PerformanceRating.Excellent: + return _perfIcon_Excellent; + case PerformanceRating.Good: + return _perfIcon_Good; + case PerformanceRating.Medium: + return _perfIcon_Medium; + case PerformanceRating.Poor: + return _perfIcon_Poor; + case PerformanceRating.None: + case PerformanceRating.VeryPoor: + return _perfIcon_VeryPoor; + } + + return _perfIcon_Excellent; + } + + Texture2D CreateBackgroundColorImage(UnityEngine.Color color) + { + int w = 4, h = 4; + Texture2D back = new Texture2D(w, h); + UnityEngine.Color[] buffer = new UnityEngine.Color[w * h]; + for (int i = 0; i < w; ++i) + for (int j = 0; j < h; ++j) + buffer[i + w * j] = color; + back.SetPixels(buffer); + back.Apply(false); + return back; + } + + public static void DrawContentInfo(string name, string version, string description, string capacity, string releaseStatus, List<string> tags) + { + EditorGUILayout.LabelField("Name: " + name); + EditorGUILayout.LabelField("Version: " + version.ToString()); + EditorGUILayout.LabelField("Description: " + description); + if (capacity != null) + EditorGUILayout.LabelField("Capacity: " + capacity); + EditorGUILayout.LabelField("Release: " + releaseStatus); + if (tags != null) + { + string tagString = ""; + for (int i = 0; i < tags.Count; i++) + { + if (i != 0) tagString += ", "; + tagString += tags[i]; + } + EditorGUILayout.LabelField("Tags: " + tagString); + + } + } + public static void DrawContentPlatformSupport(VRC.Core.ApiModel m) + { + if (m.supportedPlatforms == VRC.Core.ApiModel.SupportedPlatforms.StandaloneWindows || m.supportedPlatforms == VRC.Core.ApiModel.SupportedPlatforms.All) + EditorGUILayout.LabelField("Windows Support: YES"); + else + EditorGUILayout.LabelField("Windows Support: NO"); + + if (m.supportedPlatforms == VRC.Core.ApiModel.SupportedPlatforms.Android || m.supportedPlatforms == VRC.Core.ApiModel.SupportedPlatforms.All) + EditorGUILayout.LabelField("Android Support: YES"); + else + EditorGUILayout.LabelField("Android Support: NO"); + } + + public static void DrawBuildTargetSwitcher() + { + EditorGUILayout.LabelField("Active Build Target: " + EditorUserBuildSettings.activeBuildTarget); + if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows || EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows64 && GUILayout.Button("Switch Build Target to Android")) + { + if (EditorUtility.DisplayDialog("Build Target Switcher", "Are you sure you want to switch your build target to Android? This could take a while.", "Confirm", "Cancel")) + { + EditorUserBuildSettings.selectedBuildTargetGroup = BuildTargetGroup.Android; + EditorUserBuildSettings.SwitchActiveBuildTargetAsync(BuildTargetGroup.Android, BuildTarget.Android); + } + } + if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android && GUILayout.Button("Switch Build Target to Windows")) + { + if (EditorUtility.DisplayDialog("Build Target Switcher", "Are you sure you want to switch your build target to Windows? This could take a while.", "Confirm", "Cancel")) + { + EditorUserBuildSettings.selectedBuildTargetGroup = BuildTargetGroup.Standalone; + EditorUserBuildSettings.SwitchActiveBuildTargetAsync(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); + } + } + } + + public static string GetBuildAndPublishButtonString() + { + string buildButtonString = "Build & Publish for UNSUPPORTED"; + if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows || EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows64) + buildButtonString = "Build & Publish for Windows"; + if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) + buildButtonString = "Build & Publish for Android"; + + return buildButtonString; + } + + public static Object[] GetSubstanceObjects(GameObject obj = null, bool earlyOut = false) + { + // if 'obj' is null we check entire scene + // if 'earlyOut' is true we only return 1st object (to detect if substances are present) + + List<Object> objects = new List<Object>(); + if (obj == null) return objects.Count < 1 ? null : objects.ToArray(); + Renderer[] renderers = obj ? obj.GetComponentsInChildren<Renderer>(true) : FindObjectsOfType<Renderer>(); + + if (renderers == null || renderers.Length < 1) + return null; + foreach (Renderer r in renderers) + { + if (r.sharedMaterials.Length < 1) + continue; + foreach (Material m in r.sharedMaterials) + { + if (!m) + continue; + string path = AssetDatabase.GetAssetPath(m); + if (string.IsNullOrEmpty(path)) + continue; + if (path.EndsWith(".sbsar", true, System.Globalization.CultureInfo.InvariantCulture)) + { + objects.Add(r.gameObject); + if (earlyOut) + return objects.ToArray(); + } + } + } + + return objects.Count < 1 ? null : objects.ToArray(); + } + + public static bool HasSubstances(GameObject obj = null) + { + return (GetSubstanceObjects(obj, true) != null); + } + + EditorWindow GetLightingWindow() + { + var editorAsm = typeof(UnityEditor.Editor).Assembly; + return EditorWindow.GetWindow(editorAsm.GetType("UnityEditor.LightingWindow")); + } + + public static void ShowContentPublishPermissionsDialog() + { + if (!VRC.Core.ConfigManager.RemoteConfig.IsInitialized()) + { + VRC.Core.ConfigManager.RemoteConfig.Init(() => ShowContentPublishPermissionsDialog()); + return; + } + + string message = VRC.Core.ConfigManager.RemoteConfig.GetString("sdkNotAllowedToPublishMessage"); + int result = UnityEditor.EditorUtility.DisplayDialogComplex("VRChat SDK", message, "Developer FAQ", "VRChat Discord", "OK"); + if (result == 0) + { + ShowDeveloperFAQ(); + } + if (result == 1) + { + ShowVRChatDiscord(); + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilder.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilder.cs.meta new file mode 100644 index 00000000..747cd3d2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilder.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4c73e735ee0380241b186a8993fa56bf +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilderAttribute.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilderAttribute.cs new file mode 100644 index 00000000..84344b02 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilderAttribute.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using JetBrains.Annotations; +using UnityEngine; + +namespace VRC.SDKBase.Editor +{ + [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] + [MeansImplicitUse] + public class VRCSdkControlPanelBuilderAttribute : Attribute + { + public Type Type { get; } + public VRCSdkControlPanelBuilderAttribute(Type type) + { + Type = type; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilderAttribute.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilderAttribute.cs.meta new file mode 100644 index 00000000..32f46ed8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelBuilderAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c768b42ca9a2f2b48afeb1fa03d5e1bf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelContent.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelContent.cs new file mode 100644 index 00000000..22320b54 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelContent.cs @@ -0,0 +1,690 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using UnityEngine; +using UnityEditor; +using UnityEngine.Networking; +using VRC.Core; + +public partial class VRCSdkControlPanel : EditorWindow +{ + const int PageLimit = 20; + + static List<ApiAvatar> uploadedAvatars = null; + static List<ApiWorld> uploadedWorlds = null; + static List<ApiAvatar> testAvatars = null; + + public static Dictionary<string, Texture2D> ImageCache = new Dictionary<string, Texture2D>(); + + static List<string> justDeletedContents; + static List<ApiAvatar> justUpdatedAvatars; + + static EditorCoroutine fetchingAvatars = null, fetchingWorlds = null; + + private static string searchString = ""; + private static bool WorldsToggle = true; + private static bool AvatarsToggle = true; + private static bool TestAvatarsToggle = true; + + const int SCROLLBAR_RESERVED_REGION_WIDTH = 50; + + const int WORLD_DESCRIPTION_FIELD_WIDTH = 140; + const int WORLD_IMAGE_BUTTON_WIDTH = 100; + const int WORLD_IMAGE_BUTTON_HEIGHT = 100; + const int WORLD_RELEASE_STATUS_FIELD_WIDTH = 150; + const int COPY_WORLD_ID_BUTTON_WIDTH = 75; + const int DELETE_WORLD_BUTTON_WIDTH = 75; + const int WORLD_ALL_INFORMATION_MAX_WIDTH = WORLD_DESCRIPTION_FIELD_WIDTH + WORLD_IMAGE_BUTTON_WIDTH + WORLD_RELEASE_STATUS_FIELD_WIDTH + COPY_WORLD_ID_BUTTON_WIDTH + DELETE_WORLD_BUTTON_WIDTH + SCROLLBAR_RESERVED_REGION_WIDTH; + const int WORLD_REDUCED_INFORMATION_MAX_WIDTH = WORLD_DESCRIPTION_FIELD_WIDTH + WORLD_IMAGE_BUTTON_WIDTH + WORLD_RELEASE_STATUS_FIELD_WIDTH + SCROLLBAR_RESERVED_REGION_WIDTH; + + const int AVATAR_DESCRIPTION_FIELD_WIDTH = 140; + const int AVATAR_IMAGE_BUTTON_WIDTH = WORLD_IMAGE_BUTTON_WIDTH; + const int AVATAR_IMAGE_BUTTON_HEIGHT = WORLD_IMAGE_BUTTON_HEIGHT; + const int AVATAR_RELEASE_STATUS_FIELD_WIDTH = 150; + const int SET_AVATAR_STATUS_BUTTON_WIDTH = 100; + const int COPY_AVATAR_ID_BUTTON_WIDTH = COPY_WORLD_ID_BUTTON_WIDTH; + const int DELETE_AVATAR_BUTTON_WIDTH = DELETE_WORLD_BUTTON_WIDTH; + const int AVATAR_ALL_INFORMATION_MAX_WIDTH = AVATAR_DESCRIPTION_FIELD_WIDTH + AVATAR_IMAGE_BUTTON_WIDTH + AVATAR_RELEASE_STATUS_FIELD_WIDTH + SET_AVATAR_STATUS_BUTTON_WIDTH + COPY_AVATAR_ID_BUTTON_WIDTH + DELETE_AVATAR_BUTTON_WIDTH + SCROLLBAR_RESERVED_REGION_WIDTH; + const int AVATAR_REDUCED_INFORMATION_MAX_WIDTH = AVATAR_DESCRIPTION_FIELD_WIDTH + AVATAR_IMAGE_BUTTON_WIDTH + AVATAR_RELEASE_STATUS_FIELD_WIDTH + SCROLLBAR_RESERVED_REGION_WIDTH; + + const int MAX_ALL_INFORMATION_WIDTH = WORLD_ALL_INFORMATION_MAX_WIDTH > AVATAR_ALL_INFORMATION_MAX_WIDTH ? WORLD_ALL_INFORMATION_MAX_WIDTH : AVATAR_ALL_INFORMATION_MAX_WIDTH; + const int MAX_REDUCED_INFORMATION_WIDTH = WORLD_REDUCED_INFORMATION_MAX_WIDTH > AVATAR_REDUCED_INFORMATION_MAX_WIDTH ? WORLD_REDUCED_INFORMATION_MAX_WIDTH : AVATAR_REDUCED_INFORMATION_MAX_WIDTH; + + public static void ClearContent() + { + if (uploadedWorlds != null) + uploadedWorlds = null; + if (uploadedAvatars != null) + uploadedAvatars = null; + if (testAvatars != null) + testAvatars = null; + ImageCache.Clear(); + } + + IEnumerator FetchUploadedData() + { + if (!ConfigManager.RemoteConfig.IsInitialized()) + ConfigManager.RemoteConfig.Init(); + + if (!APIUser.IsLoggedIn) + yield break; + + ApiCache.ClearResponseCache(); + VRCCachedWebRequest.ClearOld(); + + if (fetchingAvatars == null) + fetchingAvatars = EditorCoroutine.Start(() => FetchAvatars()); + if (fetchingWorlds == null) + fetchingWorlds = EditorCoroutine.Start(() => FetchWorlds()); + FetchTestAvatars(); + } + + private static void FetchAvatars(int offset = 0) + { + ApiAvatar.FetchList( + delegate (IEnumerable<ApiAvatar> obj) + { + if (obj.FirstOrDefault() != null) + fetchingAvatars = EditorCoroutine.Start(() => + { + var l = obj.ToList(); + int count = l.Count; + SetupAvatarData(l); + FetchAvatars(offset + count); + }); + else + { + fetchingAvatars = null; + foreach (ApiAvatar a in uploadedAvatars) + DownloadImage(a.id, a.thumbnailImageUrl); + } + }, + delegate (string obj) + { + Debug.LogError("Error fetching your uploaded avatars:\n" + obj); + fetchingAvatars = null; + }, + ApiAvatar.Owner.Mine, + ApiAvatar.ReleaseStatus.All, + null, + PageLimit, + offset, + ApiAvatar.SortHeading.None, + ApiAvatar.SortOrder.Descending, + null, + null, + true, + false, + null, + false + ); + } + + private static void FetchTestAvatars() + { +#if VRC_SDK_VRCSDK3 + string sdkAvatarFolder = VRC.SDKBase.Editor.VRC_SdkBuilder.GetKnownFolderPath(VRC.SDKBase.Editor.VRC_SdkBuilder.LocalLowGUID) + "/VRChat/vrchat/Avatars/"; + string[] sdkavatars = Directory.GetFiles(sdkAvatarFolder); + string filename = ""; + List<ApiAvatar> avatars = new List<ApiAvatar>(); + foreach(string sdkap in sdkavatars) + { + if(Path.GetExtension(sdkap) != ".vrca") + continue; + + filename = Path.GetFileNameWithoutExtension(sdkap); + ApiAvatar sdka = API.FromCacheOrNew<ApiAvatar>("local:sdk_" + filename); + sdka.assetUrl = sdkap; + sdka.name = filename; + sdka.releaseStatus = "public"; + ApiAvatar.AddLocal(sdka); + avatars.Add(sdka); + } + + testAvatars = avatars; +#else + testAvatars = new List<ApiAvatar>(); +#endif + } + + private static void FetchWorlds(int offset = 0) + { + ApiWorld.FetchList( + delegate (IEnumerable<ApiWorld> obj) + { + if (obj.FirstOrDefault() != null) + fetchingWorlds = EditorCoroutine.Start(() => + { + var l = obj.ToList(); + int count = l.Count; + SetupWorldData(l); + FetchWorlds(offset + count); + }); + else + { + fetchingWorlds = null; + + foreach (ApiWorld w in uploadedWorlds) + DownloadImage(w.id, w.thumbnailImageUrl); + } + }, + delegate (string obj) + { + Debug.LogError("Error fetching your uploaded worlds:\n" + obj); + fetchingWorlds = null; + }, + ApiWorld.SortHeading.Updated, + ApiWorld.SortOwnership.Mine, + ApiWorld.SortOrder.Descending, + offset, + PageLimit, + "", + null, + null, + null, + null, + "", + ApiWorld.ReleaseStatus.All, + null, + null, + true, + false); + } + + static void SetupWorldData(List<ApiWorld> worlds) + { + if (worlds == null || uploadedWorlds == null) + return; + + worlds.RemoveAll(w => w == null || w.name == null || uploadedWorlds.Any(w2 => w2.id == w.id)); + + if (worlds.Count > 0) + { + uploadedWorlds.AddRange(worlds); + uploadedWorlds.Sort((w1, w2) => w1.name.CompareTo(w2.name)); + } + } + + static void SetupAvatarData(List<ApiAvatar> avatars) + { + if (avatars == null || uploadedAvatars == null ) + return; + + avatars.RemoveAll(a => a == null || uploadedAvatars.Any(a2 => a2.id == a.id)); + foreach(var avatar in avatars) + { + if (string.IsNullOrEmpty(avatar.name)) + avatar.name = "(unnamed)"; + } + + if (avatars.Count > 0) + { + uploadedAvatars.AddRange(avatars); + uploadedAvatars.Sort((w1, w2) => w1.name.CompareTo(w2.name)); + } + } + + private static void DownloadImage(string id, string url) + { + if (string.IsNullOrEmpty(url)) + { + return; + } + + if (ImageCache.ContainsKey(id) && ImageCache[id] != null) + { + return; + } + + EditorCoroutine.Start(VRCCachedWebRequest.Get(url, OnDone)); + void OnDone(Texture2D texture) + { + if (texture != null) + { + ImageCache[id] = texture; + } + else if (ImageCache.ContainsKey(id)) + { + ImageCache.Remove(id); + } + } + } + + Vector2 contentScrollPos; + + bool OnGUIUserInfo() + { + bool updatedContent = false; + + if (!ConfigManager.RemoteConfig.IsInitialized()) + ConfigManager.RemoteConfig.Init(); + + if (APIUser.IsLoggedIn && uploadedWorlds != null && uploadedAvatars != null && testAvatars != null) + { + + bool expandedLayout = false; // (position.width > MAX_ALL_INFORMATION_WIDTH); // uncomment for future wide layouts + + if (!expandedLayout) + { + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + } + + GUILayout.BeginHorizontal(); + + GUILayout.BeginVertical(searchBarStyle); + + EditorGUILayout.BeginHorizontal(); + + float searchFieldShrinkOffset = 30f; + GUILayoutOption layoutOption = (expandedLayout ? GUILayout.Width(position.width - searchFieldShrinkOffset) : GUILayout.Width(SdkWindowWidth - searchFieldShrinkOffset)); + searchString = EditorGUILayout.TextField(searchString, GUI.skin.FindStyle("SearchTextField"), layoutOption); + GUIStyle searchButtonStyle = searchString == string.Empty + ? GUI.skin.FindStyle("SearchCancelButtonEmpty") + : GUI.skin.FindStyle("SearchCancelButton"); + if (GUILayout.Button(string.Empty, searchButtonStyle)) + { + searchString = string.Empty; + GUI.FocusControl(null); + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + + if (!expandedLayout) + { + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + } + + layoutOption = (expandedLayout ? GUILayout.Width(position.width) : GUILayout.Width(SdkWindowWidth)); + contentScrollPos = EditorGUILayout.BeginScrollView(contentScrollPos, layoutOption); + + GUIStyle descriptionStyle = new GUIStyle(EditorStyles.wordWrappedLabel); + descriptionStyle.wordWrap = true; + + if (uploadedWorlds.Count > 0) + { + EditorGUILayout.Space(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("WORLDS", EditorStyles.boldLabel, GUILayout.ExpandWidth(false), GUILayout.Width(58)); + WorldsToggle = EditorGUILayout.Foldout(WorldsToggle, new GUIContent("")); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + + if (WorldsToggle) + { + + List<ApiWorld> tmpWorlds = new List<ApiWorld>(); + + if (uploadedWorlds.Count > 0) + tmpWorlds = new List<ApiWorld>(uploadedWorlds); + + foreach (ApiWorld w in tmpWorlds) + { + if (justDeletedContents != null && justDeletedContents.Contains(w.id)) + { + uploadedWorlds.Remove(w); + continue; + } + + if (!w.name.ToLowerInvariant().Contains(searchString.ToLowerInvariant())) + { + continue; + } + + EditorGUILayout.BeginHorizontal(EditorStyles.helpBox); + EditorGUILayout.BeginHorizontal(GUILayout.Width(WORLD_IMAGE_BUTTON_WIDTH)); + + if (ImageCache.ContainsKey(w.id)) + { + if (GUILayout.Button(ImageCache[w.id], GUILayout.Height(WORLD_IMAGE_BUTTON_HEIGHT), + GUILayout.Width(WORLD_IMAGE_BUTTON_WIDTH))) + { + Application.OpenURL(w.imageUrl); + } + } + else + { + if (GUILayout.Button("", GUILayout.Height(WORLD_IMAGE_BUTTON_HEIGHT), + GUILayout.Width(WORLD_IMAGE_BUTTON_WIDTH))) + { + Application.OpenURL(w.imageUrl); + } + } + + if (expandedLayout) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(w.name, descriptionStyle, + GUILayout.Width(position.width - MAX_ALL_INFORMATION_WIDTH + + WORLD_DESCRIPTION_FIELD_WIDTH)); + } + else + { + EditorGUILayout.BeginVertical(); + EditorGUILayout.LabelField(w.name, descriptionStyle); + } + + EditorGUILayout.LabelField("Release Status: " + w.releaseStatus, + GUILayout.Width(WORLD_RELEASE_STATUS_FIELD_WIDTH)); + if (GUILayout.Button("Copy ID", GUILayout.Width(COPY_WORLD_ID_BUTTON_WIDTH))) + { + TextEditor te = new TextEditor(); + te.text = w.id; + te.SelectAll(); + te.Copy(); + } + + if (GUILayout.Button("Delete", GUILayout.Width(DELETE_WORLD_BUTTON_WIDTH))) + { + if (EditorUtility.DisplayDialog("Delete " + w.name + "?", + "Are you sure you want to delete " + w.name + "? This cannot be undone.", "Delete", + "Cancel")) + { + foreach (VRC.Core.PipelineManager pm in FindObjectsOfType<VRC.Core.PipelineManager>() + .Where(pm => pm.blueprintId == w.id)) + { + pm.blueprintId = ""; + pm.completedSDKPipeline = false; + + UnityEditor.EditorUtility.SetDirty(pm); + UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(pm.gameObject.scene); + UnityEditor.SceneManagement.EditorSceneManager.SaveScene(pm.gameObject.scene); + } + + API.Delete<ApiWorld>(w.id); + uploadedWorlds.RemoveAll(world => world.id == w.id); + if (ImageCache.ContainsKey(w.id)) + ImageCache.Remove(w.id); + + if (justDeletedContents == null) justDeletedContents = new List<string>(); + justDeletedContents.Add(w.id); + updatedContent = true; + } + } + + if (expandedLayout) + EditorGUILayout.EndHorizontal(); + else + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + } + } + } + + if (uploadedAvatars.Count > 0) + { + EditorGUILayout.Space(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("AVATARS", EditorStyles.boldLabel, GUILayout.ExpandWidth(false), GUILayout.Width(65)); + AvatarsToggle = EditorGUILayout.Foldout(AvatarsToggle, new GUIContent("")); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + + if (AvatarsToggle) + { + + List<ApiAvatar> tmpAvatars = new List<ApiAvatar>(); + + if (uploadedAvatars.Count > 0) + tmpAvatars = new List<ApiAvatar>(uploadedAvatars); + + if (justUpdatedAvatars != null) + { + foreach (ApiAvatar a in justUpdatedAvatars) + { + int index = tmpAvatars.FindIndex((av) => av.id == a.id); + if (index != -1) + tmpAvatars[index] = a; + } + } + + foreach (ApiAvatar a in tmpAvatars) + { + if (justDeletedContents != null && justDeletedContents.Contains(a.id)) + { + uploadedAvatars.Remove(a); + continue; + } + + if (!a.name.ToLowerInvariant().Contains(searchString.ToLowerInvariant())) + { + continue; + } + + EditorGUILayout.BeginHorizontal(EditorStyles.helpBox); + EditorGUILayout.BeginHorizontal(GUILayout.Width(AVATAR_DESCRIPTION_FIELD_WIDTH)); + if (ImageCache.ContainsKey(a.id)) + { + if (GUILayout.Button(ImageCache[a.id], GUILayout.Height(AVATAR_IMAGE_BUTTON_HEIGHT), + GUILayout.Width(AVATAR_IMAGE_BUTTON_WIDTH))) + { + Application.OpenURL(a.imageUrl); + } + } + else + { + if (GUILayout.Button("", GUILayout.Height(AVATAR_IMAGE_BUTTON_HEIGHT), + GUILayout.Width(AVATAR_IMAGE_BUTTON_WIDTH))) + { + Application.OpenURL(a.imageUrl); + } + } + + if (expandedLayout) + EditorGUILayout.BeginHorizontal(); + else + EditorGUILayout.BeginVertical(); + + EditorGUILayout.LabelField(a.name, descriptionStyle, + GUILayout.Width(expandedLayout + ? position.width - MAX_ALL_INFORMATION_WIDTH + AVATAR_DESCRIPTION_FIELD_WIDTH + : AVATAR_DESCRIPTION_FIELD_WIDTH)); + EditorGUILayout.LabelField("Release Status: " + a.releaseStatus, + GUILayout.Width(AVATAR_RELEASE_STATUS_FIELD_WIDTH)); + + string oppositeReleaseStatus = a.releaseStatus == "public" ? "private" : "public"; + if (GUILayout.Button("Make " + oppositeReleaseStatus, + GUILayout.Width(SET_AVATAR_STATUS_BUTTON_WIDTH))) + { + a.releaseStatus = oppositeReleaseStatus; + + a.SaveReleaseStatus((c) => + { + ApiAvatar savedBP = (ApiAvatar) c.Model; + + if (justUpdatedAvatars == null) justUpdatedAvatars = new List<ApiAvatar>(); + justUpdatedAvatars.Add(savedBP); + + }, + (c) => + { + Debug.LogError(c.Error); + EditorUtility.DisplayDialog("Avatar Updated", + "Failed to change avatar release status", "OK"); + }); + } + + if (GUILayout.Button("Copy ID", GUILayout.Width(COPY_AVATAR_ID_BUTTON_WIDTH))) + { + TextEditor te = new TextEditor(); + te.text = a.id; + te.SelectAll(); + te.Copy(); + } + + if (GUILayout.Button("Delete", GUILayout.Width(DELETE_AVATAR_BUTTON_WIDTH))) + { + if (EditorUtility.DisplayDialog("Delete " + a.name + "?", + "Are you sure you want to delete " + a.name + "? This cannot be undone.", "Delete", + "Cancel")) + { + foreach (VRC.Core.PipelineManager pm in FindObjectsOfType<VRC.Core.PipelineManager>() + .Where(pm => pm.blueprintId == a.id)) + { + pm.blueprintId = ""; + pm.completedSDKPipeline = false; + + UnityEditor.EditorUtility.SetDirty(pm); + UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(pm.gameObject.scene); + UnityEditor.SceneManagement.EditorSceneManager.SaveScene(pm.gameObject.scene); + } + + API.Delete<ApiAvatar>(a.id); + uploadedAvatars.RemoveAll(avatar => avatar.id == a.id); + if (ImageCache.ContainsKey(a.id)) + ImageCache.Remove(a.id); + + if (justDeletedContents == null) justDeletedContents = new List<string>(); + justDeletedContents.Add(a.id); + updatedContent = true; + } + } + + if (expandedLayout) + EditorGUILayout.EndHorizontal(); + else + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + } + } + } + + if (testAvatars.Count > 0) + { + EditorGUILayout.Space(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Test Avatars", EditorStyles.boldLabel, GUILayout.ExpandWidth(false), GUILayout.Width(100)); + TestAvatarsToggle = EditorGUILayout.Foldout(TestAvatarsToggle, new GUIContent("")); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + + if (TestAvatarsToggle) + { + List<ApiAvatar> tmpAvatars = new List<ApiAvatar>(); + + if (testAvatars.Count > 0) + tmpAvatars = new List<ApiAvatar>(testAvatars); + + foreach (ApiAvatar a in tmpAvatars) + { + if (!a.name.ToLowerInvariant().Contains(searchString.ToLowerInvariant())) + { + continue; + } + + EditorGUILayout.BeginHorizontal(EditorStyles.helpBox); + + if (expandedLayout) + EditorGUILayout.BeginHorizontal(); + else + EditorGUILayout.BeginVertical(); + + EditorGUILayout.LabelField(a.name, descriptionStyle, + GUILayout.Width(expandedLayout + ? position.width - MAX_ALL_INFORMATION_WIDTH + AVATAR_DESCRIPTION_FIELD_WIDTH + : AVATAR_DESCRIPTION_FIELD_WIDTH)); + + if (GUILayout.Button("Delete", GUILayout.Width(DELETE_AVATAR_BUTTON_WIDTH))) + { + if (EditorUtility.DisplayDialog("Delete " + a.name + "?", + "Are you sure you want to delete " + a.name + "? This cannot be undone.", "Delete", + "Cancel")) + { + API.Delete<ApiAvatar>(a.id); + testAvatars.RemoveAll(avatar => avatar.id == a.id); + File.Delete(a.assetUrl); + + updatedContent = true; + } + } + + if (expandedLayout) + EditorGUILayout.EndHorizontal(); + else + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + } + } + } + + EditorGUILayout.EndScrollView(); + if (!expandedLayout) + { + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } + if ((updatedContent) && (null != window)) window.Reset(); + + return true; + } + else + { + return false; + } + } + + void ShowContent() + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.BeginVertical(); + + if (uploadedWorlds == null || uploadedAvatars == null || testAvatars == null) + { + if (uploadedWorlds == null) + uploadedWorlds = new List<ApiWorld>(); + if (uploadedAvatars == null) + uploadedAvatars = new List<ApiAvatar>(); + if (testAvatars == null) + testAvatars = new List<ApiAvatar>(); + + EditorCoroutine.Start(FetchUploadedData()); + } + + if( fetchingWorlds != null || fetchingAvatars != null ) + { + GUILayout.BeginVertical(boxGuiStyle, GUILayout.Width(SdkWindowWidth)); + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Fetching Records", titleGuiStyle); + EditorGUILayout.Space(); + GUILayout.EndVertical(); + } + else + { + GUILayout.BeginVertical(boxGuiStyle, GUILayout.Width(SdkWindowWidth)); + EditorGUILayout.Space(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("Fetch updated records from the VRChat server"); + if( GUILayout.Button("Fetch") ) + { + ClearContent(); + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + GUILayout.EndVertical(); + } + + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + OnGUIUserInfo(); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelContent.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelContent.cs.meta new file mode 100644 index 00000000..705c058d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelContent.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c7333cdb3df19724b84b4a1b05093fe0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelHelp.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelHelp.cs new file mode 100644 index 00000000..20db725e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelHelp.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; +using VRC; +using VRC.Core; +using VRC.SDKBase; + +public partial class VRCSdkControlPanel : EditorWindow +{ + [MenuItem("VRChat SDK/Help/Developer FAQ")] + public static void ShowDeveloperFAQ() + { + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + ConfigManager.RemoteConfig.Init(() => ShowDeveloperFAQ()); + return; + } + + Application.OpenURL(ConfigManager.RemoteConfig.GetString("sdkDeveloperFaqUrl")); + } + + [MenuItem("VRChat SDK/Help/VRChat Discord")] + public static void ShowVRChatDiscord() + { + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + ConfigManager.RemoteConfig.Init(() => ShowVRChatDiscord()); + return; + } + + Application.OpenURL(ConfigManager.RemoteConfig.GetString("sdkDiscordUrl")); + } + + [MenuItem("VRChat SDK/Help/Avatar Optimization Tips")] + public static void ShowAvatarOptimizationTips() + { + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + ConfigManager.RemoteConfig.Init(() => ShowAvatarOptimizationTips()); + return; + } + + Application.OpenURL(AVATAR_OPTIMIZATION_TIPS_URL); + } + + [MenuItem("VRChat SDK/Help/Avatar Rig Requirements")] + public static void ShowAvatarRigRequirements() + { + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + ConfigManager.RemoteConfig.Init(() => ShowAvatarRigRequirements()); + return; + } + + Application.OpenURL(AVATAR_RIG_REQUIREMENTS_URL); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelHelp.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelHelp.cs.meta new file mode 100644 index 00000000..a201ff75 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelHelp.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f3507a74e4b8cfd469afac127fa5f4e5 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelSettings.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelSettings.cs new file mode 100644 index 00000000..2df9b7c5 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelSettings.cs @@ -0,0 +1,260 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using VRC.Core; +using VRC.SDKBase.Editor; + +public partial class VRCSdkControlPanel : EditorWindow +{ + bool UseDevApi + { + get + { + return VRC.Core.API.GetApiUrl() == VRC.Core.API.devApiUrl; + } + } + + string clientVersionDate; + string sdkVersionDate; + Vector2 settingsScroll; + + private void Awake() + { + GetClientSdkVersionInformation(); + } + + public void GetClientSdkVersionInformation() + { + clientVersionDate = VRC.Core.SDKClientUtilities.GetTestClientVersionDate(); + sdkVersionDate = VRC.Core.SDKClientUtilities.GetSDKVersionDate(); + } + + public void OnConfigurationChanged() + { + GetClientSdkVersionInformation(); + } + + void ShowSettings() + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.BeginVertical(); + + settingsScroll = EditorGUILayout.BeginScrollView(settingsScroll, GUILayout.Width(SdkWindowWidth)); + + EditorGUILayout.BeginVertical(boxGuiStyle); + EditorGUILayout.LabelField("Developer", EditorStyles.boldLabel); + + VRCSettings.DisplayAdvancedSettings = EditorGUILayout.ToggleLeft("Show Extra Options on build page and account page", VRCSettings.DisplayAdvancedSettings); + bool prevDisplayHelpBoxes = VRCSettings.DisplayHelpBoxes; + VRCSettings.DisplayHelpBoxes = EditorGUILayout.ToggleLeft("Show Help Boxes on SDK components", VRCSettings.DisplayHelpBoxes); + if (VRCSettings.DisplayHelpBoxes != prevDisplayHelpBoxes) + { + Editor[] editors = (Editor[])Resources.FindObjectsOfTypeAll<Editor>(); + for (int i = 0; i < editors.Length; i++) + { + editors[i].Repaint(); + } + } + EditorGUILayout.EndVertical(); + + EditorGUILayout.Separator(); + + ShowSdk23CompatibilitySettings(); + EditorGUILayout.Separator(); + + ShowSettingsOptionsForBuilders(); + + + // debugging + if (APIUser.CurrentUser != null && APIUser.CurrentUser.hasSuperPowers) + { + EditorGUILayout.Separator(); + EditorGUILayout.BeginVertical(boxGuiStyle); + + EditorGUILayout.LabelField("Logging", EditorStyles.boldLabel); + + // API logging + { + bool isLoggingEnabled = UnityEditor.EditorPrefs.GetBool("apiLoggingEnabled"); + bool enableLogging = EditorGUILayout.ToggleLeft("API Logging Enabled", isLoggingEnabled); + if (enableLogging != isLoggingEnabled) + { + if (enableLogging) + VRC.Core.Logger.AddDebugLevel(DebugLevel.API); + else + VRC.Core.Logger.RemoveDebugLevel(DebugLevel.API); + + UnityEditor.EditorPrefs.SetBool("apiLoggingEnabled", enableLogging); + } + } + + // All logging + { + bool isLoggingEnabled = UnityEditor.EditorPrefs.GetBool("allLoggingEnabled"); + bool enableLogging = EditorGUILayout.ToggleLeft("All Logging Enabled", isLoggingEnabled); + if (enableLogging != isLoggingEnabled) + { + if (enableLogging) + VRC.Core.Logger.AddDebugLevel(DebugLevel.All); + else + VRC.Core.Logger.RemoveDebugLevel(DebugLevel.All); + + UnityEditor.EditorPrefs.SetBool("allLoggingEnabled", enableLogging); + } + } + EditorGUILayout.EndVertical(); + } + else + { + if (UnityEditor.EditorPrefs.GetBool("apiLoggingEnabled")) + UnityEditor.EditorPrefs.SetBool("apiLoggingEnabled", false); + if (UnityEditor.EditorPrefs.GetBool("allLoggingEnabled")) + UnityEditor.EditorPrefs.SetBool("allLoggingEnabled", false); + } + + // Future proof upload + { + EditorGUILayout.Separator(); + EditorGUILayout.BeginVertical(boxGuiStyle); + + EditorGUILayout.LabelField("Publish", EditorStyles.boldLabel); + bool futureProofPublish = UnityEditor.EditorPrefs.GetBool("futureProofPublish", DefaultFutureProofPublishEnabled); + + futureProofPublish = EditorGUILayout.ToggleLeft("Future Proof Publish", futureProofPublish); + + if (UnityEditor.EditorPrefs.GetBool("futureProofPublish", DefaultFutureProofPublishEnabled) != futureProofPublish) + { + UnityEditor.EditorPrefs.SetBool("futureProofPublish", futureProofPublish); + } + EditorGUILayout.LabelField("Client Version Date", clientVersionDate); + EditorGUILayout.LabelField("SDK Version Date", sdkVersionDate); + + EditorGUILayout.EndVertical(); + } + + + if (APIUser.CurrentUser != null) + { + EditorGUILayout.Separator(); + EditorGUILayout.BeginVertical(boxGuiStyle); + + // custom vrchat install location + OnVRCInstallPathGUI(); + + EditorGUILayout.EndVertical(); + } + + EditorGUILayout.EndScrollView(); + + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } + + static void OnVRCInstallPathGUI() + { + EditorGUILayout.LabelField("VRChat Client", EditorStyles.boldLabel); + EditorGUILayout.LabelField("Installed Client Path: ", clientInstallPath); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(""); + if (GUILayout.Button("Edit")) + { + string initPath = ""; + if (!string.IsNullOrEmpty(clientInstallPath)) + initPath = clientInstallPath; + + clientInstallPath = EditorUtility.OpenFilePanel("Choose VRC Client Exe", initPath, "exe"); + SDKClientUtilities.SetVRCInstallPath(clientInstallPath); + window.OnConfigurationChanged(); + } + if (GUILayout.Button("Revert to Default")) + { + clientInstallPath = SDKClientUtilities.LoadRegistryVRCInstallPath(); + window.OnConfigurationChanged(); + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Separator(); + } + + static void ShowSdk23CompatibilitySettings() + { + return; + +// EditorGUILayout.BeginVertical(boxGuiStyle); +// EditorGUILayout.LabelField("VRCSDK2 & VRCSDK3 Compatibility", EditorStyles.boldLabel); + +//#if !VRC_CLIENT +// bool sdk2Present = VRCSdk3Analysis.GetSDKInScene(VRCSdk3Analysis.SdkVersion.VRCSDK2).Count > 0; +// bool sdk3Present = VRCSdk3Analysis.GetSDKInScene(VRCSdk3Analysis.SdkVersion.VRCSDK3).Count > 0; +// bool sdk2DllActive = VRCSdk3Analysis.IsSdkDllActive(VRCSdk3Analysis.SdkVersion.VRCSDK2); +// bool sdk3DllActive = VRCSdk3Analysis.IsSdkDllActive(VRCSdk3Analysis.SdkVersion.VRCSDK3); + +// if ( sdk2DllActive && sdk3DllActive) +// { +// GUILayout.TextArea("You have not yet configured this project for development with VRCSDK2 and Triggers or VRCSDK3 and Udon. "); +// if (sdk2Present && sdk3Present) +// { +// GUILayout.TextArea("This scene contains both SDK2 and SDK3 elements. " + +// "Please modify this scene to contain only one type or the other before completing your configuration."); +// } +// else if (sdk2Present) +// { +// GUILayout.TextArea("This scene contains SDK2 scripts. " + +// "Check below to configure this project for use with VRCSDK2 or remove your VRCSDK2 scripts to upgrade to VRCSDK3"); +// bool downgrade = EditorGUILayout.ToggleLeft("Configure for use with VRCSDK2 and Triggers", false); +// if (downgrade) +// VRCSdk3Analysis.SetSdkVersionActive(VRCSdk3Analysis.SdkVersion.VRCSDK2); +// } +// else if (sdk3Present) +// { +// GUILayout.TextArea("This scene contains only SDK3 scripts and it ready to upgrade. " + +// "Click below to get started."); +// bool upgrade = EditorGUILayout.ToggleLeft("Configure for use with VRCSDK3 and Udon - Let's Rock!", false); +// if (upgrade) +// VRCSdk3Analysis.SetSdkVersionActive(VRCSdk3Analysis.SdkVersion.VRCSDK3); +// } +// else +// { +// GUILayout.TextArea("This scene is a blank slate. " + +// "Click below to get started."); +// bool upgrade = EditorGUILayout.ToggleLeft("Configure for use with VRCSDK3 and Udon - Let's Rock!", false); +// if (upgrade) +// VRCSdk3Analysis.SetSdkVersionActive(VRCSdk3Analysis.SdkVersion.VRCSDK3); +// } +// } +// else if (sdk2DllActive) +// { +// GUILayout.TextArea("This project has been configured to be built with VRCSDK2. " + +// "To upgrade, VRCSDK3 must be enabled here."); +// bool upgrade = EditorGUILayout.ToggleLeft("VRCSDK3 Scripts can be used", false); +// if (upgrade) +// VRCSdk3Analysis.SetSdkVersionActive(VRCSdk3Analysis.SdkVersion.VRCSDK3); +// } +// else if (sdk3DllActive) +// { +// GUILayout.TextArea("This project has been configured to be built with VRCSDK3. " + +// "Congratulations, you're ready to go. " + +// "You can still downgrade by activating VRCSDK2 here."); +// bool downgrade = EditorGUILayout.ToggleLeft("VRCSDK2 Scripts can be used", false); +// if (downgrade) +// VRCSdk3Analysis.SetSdkVersionActive(VRCSdk3Analysis.SdkVersion.VRCSDK2); +// } +// else +// { +// GUILayout.TextArea("Somehow you have disabled both VRCSDK2 and VRCSDK3. Oops. " + +// "Click here to begin development with VRCSDK3."); +// bool begin = EditorGUILayout.ToggleLeft("VRCSDK3 Scripts can be used", false); +// if (begin) +// VRCSdk3Analysis.SetSdkVersionActive(VRCSdk3Analysis.SdkVersion.VRCSDK3); +// } +//#else +// GUILayout.TextArea("I think you're in the main VRChat project. " + +// "You should not be enabling or disabling SDKs from here."); +//#endif + +// EditorGUILayout.EndVertical(); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelSettings.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelSettings.cs.meta new file mode 100644 index 00000000..0dd5e76d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelSettings.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8357b9b7ef2416946ae86f465a64c0e0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelWorldBuilder.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelWorldBuilder.cs new file mode 100644 index 00000000..d1e59c98 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelWorldBuilder.cs @@ -0,0 +1,717 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine.Networking; +using UnityEngine.SceneManagement; +using Object = UnityEngine.Object; + +namespace VRC.SDKBase.Editor +{ + public class VRCSdkControlPanelWorldBuilder : IVRCSdkControlPanelBuilder + { + private static Type _postProcessVolumeType; + protected VRCSdkControlPanel _builder; + private VRC_SceneDescriptor[] _scenes; + private Vector2 _scrollPos; + protected Vector2 _builderScrollPos; + + public virtual void SelectAllComponents() + { + List<Object> show = new List<Object>(Selection.objects); + foreach (VRC_SceneDescriptor s in _scenes) + show.Add(s.gameObject); + Selection.objects = show.ToArray(); + } + + public virtual void ShowSettingsOptions() + { + EditorGUILayout.BeginVertical(VRCSdkControlPanel.boxGuiStyle); + GUILayout.Label("World Options", EditorStyles.boldLabel); + EditorGUILayout.BeginHorizontal(); + int prevLineMode = _builder.triggerLineMode; + int lineMode = Convert.ToInt32(EditorGUILayout.EnumPopup("Trigger Lines", (VRC_Trigger.EditorTriggerLineMode)_builder.triggerLineMode, GUILayout.Width(250))); + if (lineMode != prevLineMode) + { + _builder.triggerLineMode = lineMode; + foreach (GameObject t in Selection.gameObjects) + { + EditorUtility.SetDirty(t); + } + } + GUILayout.Space(10); + switch ((VRC_Trigger.EditorTriggerLineMode)_builder.triggerLineMode) + { + case VRC_Trigger.EditorTriggerLineMode.Enabled: + EditorGUILayout.LabelField("Lines shown for all selected triggers", EditorStyles.miniLabel); + break; + case VRC_Trigger.EditorTriggerLineMode.Disabled: + EditorGUILayout.LabelField("No trigger lines are drawn", EditorStyles.miniLabel); + break; + case VRC_Trigger.EditorTriggerLineMode.PerTrigger: + EditorGUILayout.LabelField("Toggle lines directly on each trigger component", EditorStyles.miniLabel); + break; + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndVertical(); + } + + public virtual bool IsValidBuilder(out string message) + { + FindScenes(); + message = null; + if (_scenes != null && _scenes.Length > 0) return true; + return false; + } + + public virtual void ShowBuilder() + { + if (_postProcessVolumeType != null) + { + if (Camera.main != null && Camera.main.GetComponentInChildren(_postProcessVolumeType)) + { + _builder.OnGUIWarning(null, + "Scene has a PostProcessVolume on the Reference Camera (Main Camera). This Camera is disabled at runtime. Please move the PostProcessVolume to another GameObject.", + () => { Selection.activeGameObject = Camera.main.gameObject; }, + TryMovePostProcessVolumeAwayFromMainCamera + ); + } + } + + if (_scenes.Length > 1) + { + Object[] gos = new Object[_scenes.Length]; + for (int i = 0; i < _scenes.Length; ++i) + gos[i] = _scenes[i].gameObject; + _builder.OnGUIError(null, + "A Unity scene containing a VRChat Scene Descriptor should only contain one Scene Descriptor.", + delegate { Selection.objects = gos; }, null); + + EditorGUILayout.Separator(); + GUILayout.BeginVertical(GUILayout.Width(VRCSdkControlPanel.SdkWindowWidth)); + _builder.OnGUIShowIssues(); + GUILayout.EndVertical(); + } + else if (_scenes.Length == 1) + { + bool inScrollView = true; + + _scrollPos = GUILayout.BeginScrollView(_scrollPos, false, false, GUIStyle.none, + GUI.skin.verticalScrollbar, GUILayout.Width(VRCSdkControlPanel.SdkWindowWidth)); + + try + { + bool setupRequired = OnGUISceneSetup(); + + if (!setupRequired) + { + if (!_builder.CheckedForIssues) + { + _builder.ResetIssues(); + OnGUISceneCheck(_scenes[0]); + _builder.CheckedForIssues = true; + } + + OnGUISceneSettings(_scenes[0]); + + _builder.OnGUIShowIssues(); + _builder.OnGUIShowIssues(_scenes[0]); + + GUILayout.FlexibleSpace(); + + GUILayout.EndScrollView(); + inScrollView = false; + + OnGUIScene(); + } + else + { + _builder.OnGuiFixIssuesToBuildOrTest(); + GUILayout.EndScrollView(); + } + } + catch (Exception) + { + if (inScrollView) + GUILayout.EndScrollView(); + } + } + else + { + EditorGUILayout.Space(); + if (UnityEditor.BuildPipeline.isBuildingPlayer) + { + GUILayout.Space(20); + EditorGUILayout.LabelField("Building – Please Wait ...", VRCSdkControlPanel.titleGuiStyle, + GUILayout.Width(VRCSdkControlPanel.SdkWindowWidth)); + } + } + } + + public virtual void RegisterBuilder(VRCSdkControlPanel baseBuilder) + { + _builder = baseBuilder; + } + + private void TryMovePostProcessVolumeAwayFromMainCamera() + { + if (Camera.main == null) + return; + if (_postProcessVolumeType == null) + return; + Component oldVolume = Camera.main.GetComponentInChildren(_postProcessVolumeType); + if (!oldVolume) + return; + GameObject oldObject = oldVolume.gameObject; + GameObject newObject = Object.Instantiate(oldObject); + newObject.name = "Post Processing Volume"; + newObject.tag = "Untagged"; + foreach (Transform child in newObject.transform) + { + Object.DestroyImmediate(child.gameObject); + } + + var newVolume = newObject.GetComponentInChildren(_postProcessVolumeType); + foreach (Component c in newObject.GetComponents<Component>()) + { + if ((c == newObject.transform) || (c == newVolume)) + continue; + Object.DestroyImmediate(c); + } + + Object.DestroyImmediate(oldVolume); + _builder.Repaint(); + Selection.activeGameObject = newObject; + } + + [UnityEditor.Callbacks.DidReloadScripts(int.MaxValue)] + static void DidReloadScripts() + { + DetectPostProcessingPackage(); + } + + static void DetectPostProcessingPackage() + { + _postProcessVolumeType = null; + try + { + System.Reflection.Assembly + postProcAss = System.Reflection.Assembly.Load("Unity.PostProcessing.Runtime"); + _postProcessVolumeType = postProcAss.GetType("UnityEngine.Rendering.PostProcessing.PostProcessVolume"); + } + catch + { + // -> post processing not installed + } + } + + private void FindScenes() + { + VRC_SceneDescriptor[] newScenes = Tools.FindSceneObjectsOfTypeAll<VRC_SceneDescriptor>(); + + if (_scenes != null) + { + foreach (VRC_SceneDescriptor s in newScenes) + if (_scenes.Contains(s) == false) + _builder.CheckedForIssues = false; + } + + _scenes = newScenes; + } + + private static bool OnGUISceneSetup() + { + bool mandatoryExpand = !UpdateLayers.AreLayersSetup() || !UpdateLayers.IsCollisionLayerMatrixSetup(); + if (mandatoryExpand) + EditorGUILayout.LabelField("VRChat Scene Setup", VRCSdkControlPanel.titleGuiStyle, + GUILayout.Height(50)); + + if (!UpdateLayers.AreLayersSetup()) + { + GUILayout.BeginVertical(VRCSdkControlPanel.boxGuiStyle, GUILayout.Height(100), + GUILayout.Width(VRCSdkControlPanel.SdkWindowWidth)); + GUILayout.BeginHorizontal(); + GUILayout.BeginVertical(GUILayout.Width(300)); + EditorGUILayout.Space(); + GUILayout.Label("Layers", VRCSdkControlPanel.infoGuiStyle); + GUILayout.Label( + "VRChat scenes must have the same Unity layer configuration as VRChat so we can all predict things like physics and collisions. Pressing this button will configure your project's layers to match VRChat.", + VRCSdkControlPanel.infoGuiStyle, GUILayout.Width(300)); + GUILayout.EndVertical(); + GUILayout.BeginVertical(GUILayout.Width(150)); + GUILayout.Label("", GUILayout.Height(15)); + if (UpdateLayers.AreLayersSetup()) + { + GUILayout.Label("Step Complete!", VRCSdkControlPanel.infoGuiStyle); + } + else if (GUILayout.Button("Setup Layers for VRChat", GUILayout.Width(172))) + { + bool doIt = EditorUtility.DisplayDialog("Setup Layers for VRChat", + "This adds all VRChat layers to your project and pushes any custom layers down the layer list. If you have custom layers assigned to gameObjects, you'll need to reassign them. Are you sure you want to continue?", + "Do it!", "Don't do it"); + if (doIt) + UpdateLayers.SetupEditorLayers(); + } + + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + GUILayout.Space(10); + } + + if (!UpdateLayers.IsCollisionLayerMatrixSetup()) + { + GUILayout.BeginVertical(VRCSdkControlPanel.boxGuiStyle, GUILayout.Height(100), + GUILayout.Width(VRCSdkControlPanel.SdkWindowWidth)); + GUILayout.BeginHorizontal(); + GUILayout.BeginVertical(GUILayout.Width(300)); + EditorGUILayout.Space(); + GUILayout.Label("Collision Matrix", VRCSdkControlPanel.infoGuiStyle); + GUILayout.Label( + "VRChat uses specific layers for collision. In order for testing and development to run smoothly it is necessary to configure your project's collision matrix to match that of VRChat.", + VRCSdkControlPanel.infoGuiStyle, GUILayout.Width(300)); + GUILayout.EndVertical(); + GUILayout.BeginVertical(GUILayout.Width(150)); + GUILayout.Label("", GUILayout.Height(15)); + if (UpdateLayers.AreLayersSetup() == false) + { + GUILayout.Label("You must first configure your layers for VRChat to proceed. Please see above.", + VRCSdkControlPanel.infoGuiStyle); + } + else if (UpdateLayers.IsCollisionLayerMatrixSetup()) + { + GUILayout.Label("Step Complete!", VRCSdkControlPanel.infoGuiStyle); + } + else + { + if (GUILayout.Button("Set Collision Matrix", GUILayout.Width(172))) + { + bool doIt = EditorUtility.DisplayDialog("Setup Collision Layer Matrix for VRChat", + "This will setup the correct physics collisions in the PhysicsManager for VRChat layers. Are you sure you want to continue?", + "Do it!", "Don't do it"); + if (doIt) + { + UpdateLayers.SetupCollisionLayerMatrix(); + } + } + } + + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + GUILayout.Space(10); + } + + return mandatoryExpand; + } + + protected virtual bool IsSDK3Scene() + { + return false; + } + + protected virtual void OnGUISceneCheck(VRC_SceneDescriptor scene) + { + CheckUploadChanges(scene); + + bool isSdk3Scene = IsSDK3Scene(); + + List<VRC_EventHandler> sdkBaseEventHandlers = + new List<VRC_EventHandler>(Object.FindObjectsOfType<VRC_EventHandler>()); +#if VRC_SDK_VRCSDK2 + if (isSdk3Scene == false) + { + for (int i = sdkBaseEventHandlers.Count - 1; i >= 0; --i) + if (sdkBaseEventHandlers[i] as VRCSDK2.VRC_EventHandler) + sdkBaseEventHandlers.RemoveAt(i); + } +#endif + if (sdkBaseEventHandlers.Count > 0) + { + _builder.OnGUIError(scene, + "You have Event Handlers in your scene that are not allowed in this build configuration.", + delegate + { + List<Object> gos = sdkBaseEventHandlers.ConvertAll(item => (Object) item.gameObject); + Selection.objects = gos.ToArray(); + }, + delegate + { + foreach (VRC_EventHandler eh in sdkBaseEventHandlers) + { +#if VRC_SDK_VRCSDK2 + GameObject go = eh.gameObject; + if (isSdk3Scene == false) + { + if (VRC_SceneDescriptor.Instance as VRCSDK2.VRC_SceneDescriptor != null) + go.AddComponent<VRCSDK2.VRC_EventHandler>(); + } +#endif + Object.DestroyImmediate(eh); + } + }); + } + + Vector3 g = Physics.gravity; + if (Math.Abs(g.x) > float.Epsilon || Math.Abs(g.z) > float.Epsilon) + _builder.OnGUIWarning(scene, + "Gravity vector is not straight down. Though we support different gravity, player orientation is always 'upwards' so things don't always behave as you intend.", + delegate { SettingsService.OpenProjectSettings("Project/Physics"); }, null); + if (g.y > 0) + _builder.OnGUIWarning(scene, + "Gravity vector is not straight down, inverted or zero gravity will make walking extremely difficult.", + delegate { SettingsService.OpenProjectSettings("Project/Physics"); }, null); + if (Math.Abs(g.y) < float.Epsilon) + _builder.OnGUIWarning(scene, + "Zero gravity will make walking extremely difficult, though we support different gravity, player orientation is always 'upwards' so this may not have the effect you're looking for.", + delegate { SettingsService.OpenProjectSettings("Project/Physics"); }, null); + + if (CheckFogSettings()) + { + _builder.OnGUIWarning( + scene, + "Fog shader stripping is set to Custom, this may lead to incorrect or unnecessary shader variants being included in the build. You should use Automatic unless you change the fog mode at runtime.", + delegate { SettingsService.OpenProjectSettings("Project/Graphics"); }, + delegate + { + EnvConfig.SetFogSettings( + new EnvConfig.FogSettings(EnvConfig.FogSettings.FogStrippingMode.Automatic)); + }); + } + + if (scene.autoSpatializeAudioSources) + { + _builder.OnGUIWarning(scene, + "Your scene previously used the 'Auto Spatialize Audio Sources' feature. This has been deprecated, press 'Fix' to disable. Also, please add VRC_SpatialAudioSource to all your audio sources. Make sure Spatial Blend is set to 3D for the sources you want to spatialize.", + null, + delegate { scene.autoSpatializeAudioSources = false; } + ); + } + + AudioSource[] audioSources = Object.FindObjectsOfType<AudioSource>(); + foreach (AudioSource a in audioSources) + { + if (a.GetComponent<ONSPAudioSource>() != null) + { + _builder.OnGUIWarning(scene, + "Found audio source(s) using ONSP, this is deprecated. Press 'fix' to convert to VRC_SpatialAudioSource.", + delegate { Selection.activeObject = a.gameObject; }, + delegate + { + Selection.activeObject = a.gameObject; + AutoAddSpatialAudioComponents.ConvertONSPAudioSource(a); + } + ); + break; + } + else if (a.GetComponent<VRC_SpatialAudioSource>() == null) + { + string msg = + "Found 3D audio source with no VRC Spatial Audio component, this is deprecated. Press 'fix' to add a VRC_SpatialAudioSource."; + if (IsAudioSource2D(a)) + msg = + "Found 2D audio source with no VRC Spatial Audio component, this is deprecated. Press 'fix' to add a (disabled) VRC_SpatialAudioSource."; + + _builder.OnGUIWarning(scene, msg, + delegate { Selection.activeObject = a.gameObject; }, + delegate + { + Selection.activeObject = a.gameObject; + AutoAddSpatialAudioComponents.AddVRCSpatialToBareAudioSource(a); + } + ); + break; + } + } + + if (VRCSdkControlPanel.HasSubstances()) + { + _builder.OnGUIWarning(scene, + "One or more scene objects have Substance materials. This is not supported and may break in game. Please bake your Substances to regular materials.", + () => { Selection.objects = VRCSdkControlPanel.GetSubstanceObjects(); }, + null); + } + + string vrcFilePath = UnityWebRequest.UnEscapeURL(EditorPrefs.GetString("lastVRCPath")); + if (!string.IsNullOrEmpty(vrcFilePath) && + ValidationHelpers.CheckIfAssetBundleFileTooLarge(ContentType.World, vrcFilePath, out int fileSize)) + { + _builder.OnGUIWarning(scene, + ValidationHelpers.GetAssetBundleOverSizeLimitMessageSDKWarning(ContentType.World, fileSize), null, + null); + } + + foreach (GameObject go in Object.FindObjectsOfType<GameObject>()) + { + if (go.transform.parent == null) + { + // check root game objects +#if UNITY_ANDROID + IEnumerable<Shader> illegalShaders = VRC.SDKBase.Validation.WorldValidation.FindIllegalShaders(go); + foreach (Shader s in illegalShaders) + { + _builder.OnGUIWarning(scene, "World uses unsupported shader '" + s.name + "'. This could cause low performance or future compatibility issues.", null, null); + } +#endif + } + else + { + // Check sibling game objects + for (int idx = 0; idx < go.transform.parent.childCount; ++idx) + { + Transform t = go.transform.parent.GetChild(idx); + if (t == go.transform) + continue; + +#if VRC_SDK_VRCSDK2 + bool allowedType = (t.GetComponent<VRCSDK2.VRC_ObjectSync>() + || t.GetComponent<VRCSDK2.VRC_SyncAnimation>() + || t.GetComponent<VRCSDK2.VRC_SyncVideoPlayer>() + || t.GetComponent<VRCSDK2.VRC_SyncVideoStream>()); + if (t.name != go.transform.name || allowedType) continue; +#else + if (t.name != go.transform.name) continue; +#endif + + string path = t.name; + Transform p = t.parent; + while (p != null) + { + path = p.name + "/" + path; + p = p.parent; + } + + _builder.OnGUIWarning(scene, + "Sibling objects share the same path, which may break network events: " + path, + delegate + { + List<Object> gos = new List<Object>(); + for (int c = 0; c < go.transform.parent.childCount; ++c) + if (go.transform.parent.GetChild(c).name == go.name) + gos.Add(go.transform.parent.GetChild(c).gameObject); + Selection.objects = gos.ToArray(); + }, + delegate + { + List<Object> gos = new List<Object>(); + for (int c = 0; c < go.transform.parent.childCount; ++c) + if (go.transform.parent.GetChild(c).name == go.name) + gos.Add(go.transform.parent.GetChild(c).gameObject); + Selection.objects = gos.ToArray(); + for (int i = 0; i < gos.Count; ++i) + gos[i].name = gos[i].name + "-" + i.ToString("00"); + }); + break; + } + } + } + + // detect dynamic materials and prefabs with identical names (since these could break triggers) + VRC_Trigger[] triggers = Tools.FindSceneObjectsOfTypeAll<VRC_Trigger>(); + List<GameObject> prefabs = new List<GameObject>(); + List<Material> materials = new List<Material>(); + +#if VRC_SDK_VRCSDK2 + AssetExporter.FindDynamicContent(ref prefabs, ref materials); +#elif VRC_SDK_VRCSDK3 + AssetExporter.FindDynamicContent(ref prefabs, ref materials); +#endif + + foreach (VRC_Trigger t in triggers) + { + foreach (VRC_Trigger.TriggerEvent triggerEvent in t.Triggers) + { + foreach (VRC_EventHandler.VrcEvent e in triggerEvent.Events.Where(evt => + evt.EventType == VRC_EventHandler.VrcEventType.SpawnObject)) + { + GameObject go = + AssetDatabase.LoadAssetAtPath(e.ParameterString, typeof(GameObject)) as GameObject; + if (go == null) continue; + foreach (GameObject existing in prefabs) + { + if (go == existing || go.name != existing.name) continue; + _builder.OnGUIWarning(scene, + "Trigger prefab '" + AssetDatabase.GetAssetPath(go).Replace(".prefab", "") + + "' has same name as a prefab in another folder. This may break the trigger.", + delegate { Selection.objects = new Object[] {go}; }, + delegate + { + AssetDatabase.RenameAsset(AssetDatabase.GetAssetPath(go), + go.name + "-" + go.GetInstanceID()); + AssetDatabase.Refresh(); + e.ParameterString = AssetDatabase.GetAssetPath(go); + }); + } + } + + foreach (VRC_EventHandler.VrcEvent e in triggerEvent.Events.Where(evt => + evt.EventType == VRC_EventHandler.VrcEventType.SetMaterial)) + { + Material mat = AssetDatabase.LoadAssetAtPath<Material>(e.ParameterString); + if (mat == null || mat.name.Contains("(Instance)")) continue; + foreach (Material existing in materials) + { + if (mat == existing || mat.name != existing.name) continue; + _builder.OnGUIWarning(scene, + "Trigger material '" + AssetDatabase.GetAssetPath(mat).Replace(".mat", "") + + "' has same name as a material in another folder. This may break the trigger.", + delegate { Selection.objects = new Object[] {mat}; }, + delegate + { + AssetDatabase.RenameAsset(AssetDatabase.GetAssetPath(mat), + mat.name + "-" + mat.GetInstanceID()); + AssetDatabase.Refresh(); + e.ParameterString = AssetDatabase.GetAssetPath(mat); + }); + } + } + } + } + } + + private void OnGUISceneSettings(VRC_SceneDescriptor scene) + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.BeginVertical(VRCSdkControlPanel.boxGuiStyle, GUILayout.Width(VRCSdkControlPanel.SdkWindowWidth)); + + string name = "Unpublished VRChat World"; + if (scene.apiWorld != null) + name = (scene.apiWorld as Core.ApiWorld)?.name; + EditorGUILayout.Space(); + EditorGUILayout.LabelField(name, VRCSdkControlPanel.titleGuiStyle); + + Core.PipelineManager[] pms = Tools.FindSceneObjectsOfTypeAll<Core.PipelineManager>(); + if (pms.Length == 1) + { + if (!string.IsNullOrEmpty(pms[0].blueprintId)) + { + if (scene.apiWorld == null) + { + Core.ApiWorld world = Core.API.FromCacheOrNew<Core.ApiWorld>(pms[0].blueprintId); + world.Fetch(null, + (c) => scene.apiWorld = c.Model as Core.ApiWorld, + (c) => + { + if (c.Code == 404) + { + Core.Logger.Log( + $"Could not load world {pms[0].blueprintId} because it didn't exist.", Core.DebugLevel.All); + Core.ApiCache.Invalidate<Core.ApiWorld>(pms[0].blueprintId); + } + else + Debug.LogErrorFormat("Could not load world {0} because {1}", pms[0].blueprintId, + c.Error); + }); + scene.apiWorld = world; + } + } + else + { + // clear scene.apiWorld if blueprint ID has been detached, so world details in builder panel are also cleared + scene.apiWorld = null; + } + } + + if (scene.apiWorld != null) + { + Core.ApiWorld w = (scene.apiWorld as Core.ApiWorld); + DrawContentInfoForWorld(w); + VRCSdkControlPanel.DrawContentPlatformSupport(w); + } + + VRCSdkControlPanel.DrawBuildTargetSwitcher(); + + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } + + public virtual void OnGUIScene() + { + // Stub, needs to be handled in SDK-specific overrides + } + + private static void DrawContentInfoForWorld(Core.ApiWorld w) + { + VRCSdkControlPanel.DrawContentInfo(w.name, w.version.ToString(), w.description, w.capacity.ToString(), w.releaseStatus, + w.tags); + } + + private static void CheckUploadChanges(VRC_SceneDescriptor scene) + { + if (!EditorPrefs.HasKey("VRC.SDKBase_scene_changed") || + !EditorPrefs.GetBool("VRC.SDKBase_scene_changed")) return; + EditorPrefs.DeleteKey("VRC.SDKBase_scene_changed"); + + if (EditorPrefs.HasKey("VRC.SDKBase_capacity")) + { + scene.capacity = EditorPrefs.GetInt("VRC.SDKBase_capacity"); + EditorPrefs.DeleteKey("VRC.SDKBase_capacity"); + } + + if (EditorPrefs.HasKey("VRC.SDKBase_content_sex")) + { + scene.contentSex = EditorPrefs.GetBool("VRC.SDKBase_content_sex"); + EditorPrefs.DeleteKey("VRC.SDKBase_content_sex"); + } + + if (EditorPrefs.HasKey("VRC.SDKBase_content_violence")) + { + scene.contentViolence = EditorPrefs.GetBool("VRC.SDKBase_content_violence"); + EditorPrefs.DeleteKey("VRC.SDKBase_content_violence"); + } + + if (EditorPrefs.HasKey("VRC.SDKBase_content_gore")) + { + scene.contentGore = EditorPrefs.GetBool("VRC.SDKBase_content_gore"); + EditorPrefs.DeleteKey("VRC.SDKBase_content_gore"); + } + + if (EditorPrefs.HasKey("VRC.SDKBase_content_other")) + { + scene.contentOther = EditorPrefs.GetBool("VRC.SDKBase_content_other"); + EditorPrefs.DeleteKey("VRC.SDKBase_content_other"); + } + + if (EditorPrefs.HasKey("VRC.SDKBase_release_public")) + { + scene.releasePublic = EditorPrefs.GetBool("VRC.SDKBase_release_public"); + EditorPrefs.DeleteKey("VRC.SDKBase_release_public"); + } + + EditorUtility.SetDirty(scene); + EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene()); + } + + private static bool CheckFogSettings() + { + EnvConfig.FogSettings fogSettings = EnvConfig.GetFogSettings(); + if (fogSettings.fogStrippingMode == EnvConfig.FogSettings.FogStrippingMode.Automatic) + { + return false; + } + + return fogSettings.keepLinear || fogSettings.keepExp || fogSettings.keepExp2; + } + + private static bool IsAudioSource2D(AudioSource src) + { + AnimationCurve curve = src.GetCustomCurve(AudioSourceCurveType.SpatialBlend); + return Math.Abs(src.spatialBlend) < float.Epsilon && (curve == null || curve.keys.Length <= 1); + } + + void OnGUISceneLayer(int layer, string name, string description) + { + if (LayerMask.LayerToName(layer) != name) + _builder.OnGUIError(null, "Layer " + layer + " must be renamed to '" + name + "'", + delegate { SettingsService.OpenProjectSettings("Project/Physics"); }, null); + + if (_builder.showLayerHelp) + _builder.OnGUIInformation(null, "Layer " + layer + " " + name + "\n" + description); + } + + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelWorldBuilder.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelWorldBuilder.cs.meta new file mode 100644 index 00000000..919e8f14 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ControlPanel/VRCSdkControlPanelWorldBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f2a720a30f1043247af7742fdfd0b8e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/EnvConfig.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/EnvConfig.cs new file mode 100644 index 00000000..3100907a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/EnvConfig.cs @@ -0,0 +1,1230 @@ +#define ENV_SET_INCLUDED_SHADERS + +using UnityEngine; +using UnityEditor; +using System.Collections; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine.Rendering; +using VRC.SDKBase.Validation.Performance.Stats; +using Object = UnityEngine.Object; + +/// <summary> +/// Setup up SDK env on editor launch +/// </summary> +[InitializeOnLoad] +public class EnvConfig +{ + private static readonly BuildTarget[] relevantBuildTargets = + { + BuildTarget.Android, + BuildTarget.iOS, + BuildTarget.StandaloneLinux64, + BuildTarget.StandaloneWindows, BuildTarget.StandaloneWindows64, + BuildTarget.StandaloneOSX + }; + + #if !VRC_CLIENT + private static readonly BuildTarget[] allowedBuildtargets = { + BuildTarget.StandaloneWindows64, + BuildTarget.Android + }; + #endif + + private static readonly Dictionary<BuildTarget, GraphicsDeviceType[]> allowedGraphicsAPIs = new Dictionary<BuildTarget, GraphicsDeviceType[]>() + { + {BuildTarget.Android, new[] {GraphicsDeviceType.OpenGLES3, /* GraphicsDeviceType.Vulkan */}}, + {BuildTarget.iOS, null}, + {BuildTarget.StandaloneLinux64, null}, + {BuildTarget.StandaloneWindows, new[] {GraphicsDeviceType.Direct3D11}}, + {BuildTarget.StandaloneWindows64, new[] {GraphicsDeviceType.Direct3D11}}, + {BuildTarget.StandaloneOSX, null} + }; + + #if ENV_SET_INCLUDED_SHADERS && VRC_CLIENT + private static readonly string[] ensureTheseShadersAreAvailable = + { + "Hidden/CubeBlend", + "Hidden/CubeBlur", + "Hidden/CubeCopy", + "Hidden/VideoDecode", + "Legacy Shaders/Bumped Diffuse", + "Legacy Shaders/Bumped Specular", + "Legacy Shaders/Decal", + "Legacy Shaders/Diffuse Detail", + "Legacy Shaders/Diffuse Fast", + "Legacy Shaders/Diffuse", + "Legacy Shaders/Diffuse", + "Legacy Shaders/Lightmapped/Diffuse", + "Legacy Shaders/Lightmapped/Specular", + "Legacy Shaders/Lightmapped/VertexLit", + "Legacy Shaders/Parallax Diffuse", + "Legacy Shaders/Parallax Specular", + "Legacy Shaders/Reflective/Bumped Diffuse", + "Legacy Shaders/Reflective/Bumped Specular", + "Legacy Shaders/Reflective/Bumped Unlit", + "Legacy Shaders/Reflective/Bumped VertexLit", + "Legacy Shaders/Reflective/Diffuse", + "Legacy Shaders/Reflective/Parallax Diffuse", + "Legacy Shaders/Reflective/Parallax Specular", + "Legacy Shaders/Reflective/Specular", + "Legacy Shaders/Reflective/VertexLit", + "Legacy Shaders/Self-Illumin/Bumped Diffuse", + "Legacy Shaders/Self-Illumin/Bumped Specular", + "Legacy Shaders/Self-Illumin/Diffuse", + "Legacy Shaders/Self-Illumin/Parallax Diffuse", + "Legacy Shaders/Self-Illumin/Parallax Specular", + "Legacy Shaders/Self-Illumin/Specular", + "Legacy Shaders/Self-Illumin/VertexLit", + "Legacy Shaders/Specular", + "Legacy Shaders/Transparent/Bumped Diffuse", + "Legacy Shaders/Transparent/Bumped Specular", + "Legacy Shaders/Transparent/Cutout/Bumped Diffuse", + "Legacy Shaders/Transparent/Cutout/Bumped Specular", + "Legacy Shaders/Transparent/Cutout/Diffuse", + "Legacy Shaders/Transparent/Cutout/Soft Edge Unlit", + "Legacy Shaders/Transparent/Cutout/Specular", + "Legacy Shaders/Transparent/Cutout/VertexLit", + "Legacy Shaders/Transparent/Diffuse", + "Legacy Shaders/Transparent/Parallax Diffuse", + "Legacy Shaders/Transparent/Parallax Specular", + "Legacy Shaders/Transparent/Specular", + "Legacy Shaders/Transparent/VertexLit", + "Legacy Shaders/VertexLit", + "Mobile/Particles/Additive", + "Mobile/Particles/Alpha Blended", + "Mobile/Particles/Multiply", + "Mobile/Particles/VertexLit Blended", + "Mobile/Skybox", + "Nature/Terrain/Diffuse", + "Nature/Terrain/Specular", + "Nature/Terrain/Standard", + "Particles/Additive (Soft)", + "Particles/Additive", + "Particles/Alpha Blended Premultiply", + "Particles/Alpha Blended", + "Particles/Anim Alpha Blended", + "Particles/Multiply (Double)", + "Particles/Multiply", + "Particles/VertexLit Blended", + "Particles/~Additive-Multiply", + "Skybox/Cubemap", + "Skybox/Procedural", + "Skybox/6 Sided", + "Sprites/Default", + "Sprites/Diffuse", + "UI/Default", + "VRChat/UI/Unlit/WebPanelTransparent", + "Toon/Lit", + "Toon/Lit (Double)", + "Toon/Lit Cutout", + "Toon/Lit Cutout (Double)", + "Toon/Lit Outline", + "VRChat/Mobile/Diffuse", + "Video/RealtimeEmissiveGamma", + "VRChat/PC/Toon Lit", + "VRChat/PC/Toon Lit (Double)", + "VRChat/PC/Toon Lit Cutout", + "VRChat/PC/Toon Lit Cutout (Double)", + "Unlit/Color", + "Unlit/Transparent", + "Unlit/Transparent Cutout", + "Unlit/Texture", + "MatCap/Vertex/Textured Lit", + "VRChat/Mobile/Bumped Uniform Diffuse", + "VRChat/Mobile/Bumped Uniform Specular", + "VRChat/Mobile/Toon Lit", + "VRChat/Mobile/MatCap Lit", + "VRChat/Mobile/Skybox", + "VRChat/Mobile/Lightmapped", + "VRChat/Mobile/Bumped Mapped Specular", + "VRChat/Mobile/Diffuse", + "VRChat/Mobile/Particles/Additive", + "VRChat/Mobile/Particles/Multiply", + "VRChat/Mobile/Standard Lite", + }; + #endif + + private static bool _requestConfigureSettings = true; + + static EnvConfig() + { + EditorApplication.update += EditorUpdate; + } + + private static void EditorUpdate() + { + if(!_requestConfigureSettings) + { + return; + } + + if(ConfigureSettings()) + { + _requestConfigureSettings = false; + } + } + + public static void RequestConfigureSettings() + { + _requestConfigureSettings = true; + } + + [UnityEditor.Callbacks.DidReloadScripts(int.MaxValue)] + private static void DidReloadScripts() + { + RequestConfigureSettings(); + } + + public static bool ConfigureSettings() + { + CheckForFirstInit(); + + if(EditorApplication.isPlayingOrWillChangePlaymode || EditorApplication.isUpdating) + { + return false; + } + + ConfigurePlayerSettings(); + + if(!VRC.Core.ConfigManager.RemoteConfig.IsInitialized()) + { + VRC.Core.API.SetOnlineMode(true, "vrchat"); + VRC.Core.ConfigManager.RemoteConfig.Init(); + } + + LoadEditorResources(); + + return true; + } + + #if !VRC_CLIENT + private static void SetDLLPlatforms(string dllName, bool active) + { + string[] assetGuids = AssetDatabase.FindAssets(dllName); + + foreach(string guid in assetGuids) + { + string dllPath = AssetDatabase.GUIDToAssetPath(guid); + if(string.IsNullOrEmpty(dllPath) || dllPath.ToLower().EndsWith(".dll") == false) + { + return; + } + + PluginImporter importer = AssetImporter.GetAtPath(dllPath) as PluginImporter; + if(importer == null) + { + return; + } + + bool allCorrect = true; + if(importer.GetCompatibleWithAnyPlatform() != active) + { + allCorrect = false; + } + else + { + if(importer.GetCompatibleWithAnyPlatform()) + { + if(importer.GetExcludeEditorFromAnyPlatform() != !active || + importer.GetExcludeFromAnyPlatform(BuildTarget.StandaloneWindows) != !active) + { + allCorrect = false; + } + } + else + { + if(importer.GetCompatibleWithEditor() != active || + importer.GetCompatibleWithPlatform(BuildTarget.StandaloneWindows) != active) + { + allCorrect = false; + } + } + } + + if(allCorrect) + { + continue; + } + + if(active) + { + importer.SetCompatibleWithAnyPlatform(true); + importer.SetExcludeEditorFromAnyPlatform(false); + importer.SetExcludeFromAnyPlatform(BuildTarget.Android, false); + importer.SetExcludeFromAnyPlatform(BuildTarget.StandaloneWindows, false); + importer.SetExcludeFromAnyPlatform(BuildTarget.StandaloneWindows64, false); + importer.SetExcludeFromAnyPlatform(BuildTarget.StandaloneLinux64, false); + } + else + { + importer.SetCompatibleWithAnyPlatform(false); + importer.SetCompatibleWithEditor(false); + importer.SetCompatibleWithPlatform(BuildTarget.Android, false); + importer.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows, false); + importer.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows64, false); + importer.SetCompatibleWithPlatform(BuildTarget.StandaloneLinux64, false); + } + + importer.SaveAndReimport(); + } + } + #endif + + [MenuItem("VRChat SDK/Utilities/Force Configure Player Settings")] + public static void ConfigurePlayerSettings() + { + VRC.Core.Logger.Log("Setting required PlayerSettings...", VRC.Core.DebugLevel.All); + + SetBuildTarget(); + + // Needed for Microsoft.CSharp namespace in DLLMaker + // Doesn't seem to work though + if(PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup) != ApiCompatibilityLevel.NET_4_6) + { + PlayerSettings.SetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup, ApiCompatibilityLevel.NET_4_6); + } + + if(!PlayerSettings.runInBackground) + { + PlayerSettings.runInBackground = true; + } + + #if !VRC_CLIENT + SetDLLPlatforms("VRCCore-Standalone", false); + SetDLLPlatforms("VRCCore-Editor", true); + #endif + + SetDefaultGraphicsAPIs(); + SetGraphicsSettings(); + SetQualitySettings(); + SetAudioSettings(); + SetPlayerSettings(); + + #if VRC_CLIENT + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + PlatformSwitcher.RefreshRequiredPackages(EditorUserBuildSettings.selectedBuildTargetGroup); + #else + // SDK + + // default to steam runtime in sdk (shouldn't matter) + SetVRSDKs(EditorUserBuildSettings.selectedBuildTargetGroup, new string[] { "None", "OpenVR", "Oculus" }); + + VRC.Core.AnalyticsSDK.Initialize(VRC.Core.SDKClientUtilities.GetSDKVersionDate()); + #endif + + #if VRC_CLIENT + // VRCLog should handle disk writing + PlayerSettings.usePlayerLog = false; + foreach(LogType logType in Enum.GetValues(typeof(LogType)).Cast<LogType>()) + { + switch(logType) + { + case LogType.Assert: + case LogType.Exception: + { + PlayerSettings.SetStackTraceLogType(logType, StackTraceLogType.ScriptOnly); + break; + } + case LogType.Error: + case LogType.Warning: + case LogType.Log: + { + PlayerSettings.SetStackTraceLogType(logType, StackTraceLogType.None); + break; + } + default: + { + throw new ArgumentOutOfRangeException(); + } + } + } + #endif + } + + private static void EnableBatching(bool enable) + { + PlayerSettings[] playerSettings = Resources.FindObjectsOfTypeAll<PlayerSettings>(); + if(playerSettings == null) + { + return; + } + + SerializedObject playerSettingsSerializedObject = new SerializedObject(playerSettings.Cast<UnityEngine.Object>().ToArray()); + SerializedProperty batchingSettings = playerSettingsSerializedObject.FindProperty("m_BuildTargetBatching"); + if(batchingSettings == null) + { + return; + } + + for(int i = 0; i < batchingSettings.arraySize; i++) + { + SerializedProperty batchingArrayValue = batchingSettings.GetArrayElementAtIndex(i); + + IEnumerator batchingEnumerator = batchingArrayValue?.GetEnumerator(); + if(batchingEnumerator == null) + { + continue; + } + + while(batchingEnumerator.MoveNext()) + { + SerializedProperty property = (SerializedProperty)batchingEnumerator.Current; + + if(property != null && property.name == "m_BuildTarget") + { + // only change setting on "Standalone" entry + if(property.stringValue != "Standalone") + { + break; + } + } + + if(property != null && property.name == "m_StaticBatching") + { + property.boolValue = enable; + } + + if(property != null && property.name == "m_DynamicBatching") + { + property.boolValue = enable; + } + } + } + + playerSettingsSerializedObject.ApplyModifiedProperties(); + } + + public static void SetVRSDKs(BuildTargetGroup buildTargetGroup, string[] sdkNames) + { + VRC.Core.Logger.Log("Setting virtual reality SDKs in PlayerSettings: ", VRC.Core.DebugLevel.All); + if(sdkNames != null) + { + foreach(string s in sdkNames) + { + VRC.Core.Logger.Log("- " + s, VRC.Core.DebugLevel.All); + } + } + + if (!EditorApplication.isPlaying) + { + #pragma warning disable 618 + PlayerSettings.SetVirtualRealitySDKs(buildTargetGroup, sdkNames); + #pragma warning restore 618 + } + } + + public static bool CheckForFirstInit() + { + bool firstLaunch = SessionState.GetBool("EnvConfigFirstLaunch", true); + if(firstLaunch) + { + SessionState.SetBool("EnvConfigFirstLaunch", false); + } + + return firstLaunch; + } + + private static void SetDefaultGraphicsAPIs() + { + VRC.Core.Logger.Log("Setting Graphics APIs", VRC.Core.DebugLevel.All); + foreach(BuildTarget target in relevantBuildTargets) + { + GraphicsDeviceType[] apis = allowedGraphicsAPIs[target]; + if(apis == null) + { + SetGraphicsAPIs(target, true); + } + else + { + SetGraphicsAPIs(target, false, apis); + } + } + } + + private static void SetGraphicsAPIs(BuildTarget platform, bool auto, GraphicsDeviceType[] allowedTypes = null) + { + try + { + if(auto != PlayerSettings.GetUseDefaultGraphicsAPIs(platform)) + { + PlayerSettings.SetUseDefaultGraphicsAPIs(platform, auto); + } + } + catch + { + // ignored + } + + try + { + if(allowedTypes == null || allowedTypes.Length == 0) + { + return; + } + + GraphicsDeviceType[] graphicsAPIs = PlayerSettings.GetGraphicsAPIs(platform); + if(graphicsAPIs == null || graphicsAPIs.Length == 0) + { + return; + } + + if(allowedTypes.SequenceEqual(graphicsAPIs)) + { + return; + } + + PlayerSettings.SetGraphicsAPIs(platform, allowedTypes); + } + catch + { + // ignored + } + } + + private static void SetQualitySettings() + { + VRC.Core.Logger.Log("Setting Graphics Settings", VRC.Core.DebugLevel.All); + const string qualitySettingsAssetPath = "ProjectSettings/QualitySettings.asset"; + SerializedObject qualitySettings = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath(qualitySettingsAssetPath)[0]); + + SerializedProperty qualitySettingsPresets = qualitySettings.FindProperty("m_QualitySettings"); + qualitySettingsPresets.arraySize = _graphicsPresets.Length; + + bool changedProperty = false; + for(int index = 0; index < _graphicsPresets.Length; index++) + { + SerializedProperty currentQualityLevel = qualitySettingsPresets.GetArrayElementAtIndex(index); + Dictionary<string, object> graphicsPreset = _graphicsPresets[index]; + foreach(KeyValuePair<string, object> setting in graphicsPreset) + { + SerializedProperty property = currentQualityLevel.FindPropertyRelative(setting.Key); + if(property == null) + { + Debug.LogWarning($"Serialized property for quality setting '{setting.Key}' could not be found."); + continue; + } + + object settingValue = setting.Value; + #if !VRC_CLIENT + if(setting.Key == "name") + { + settingValue = $"VRC {setting.Value}"; + } + #endif + + switch(settingValue) + { + case null: + { + if(property.objectReferenceValue == setting.Value as Object) + { + continue; + } + + property.objectReferenceValue = null; + break; + } + case string settingAsString: + { + if(property.stringValue == settingAsString) + { + continue; + } + + property.stringValue = settingAsString; + break; + } + case bool settingAsBool: + { + if(property.boolValue == settingAsBool) + { + continue; + } + + property.boolValue = settingAsBool; + break; + } + case int settingAsInt: + { + if(property.intValue == settingAsInt) + { + continue; + } + + property.intValue = settingAsInt; + break; + } + case float settingAsFloat: + { + if(Mathf.Approximately(property.floatValue, settingAsFloat)) + { + continue; + } + + property.floatValue = settingAsFloat; + break; + } + case double settingAsDouble: + { + if(Mathf.Approximately((float)property.doubleValue, (float)settingAsDouble)) + { + continue; + } + + property.doubleValue = settingAsDouble; + break; + } + case Vector3 settingAsVector3: + { + if(property.vector3Value == settingAsVector3) + { + continue; + } + + property.vector3Value = settingAsVector3; + break; + } + case string[] settingAsStringArray: + { + property.arraySize = settingAsStringArray.Length; + + bool changedArrayEntry = false; + for(int settingIndex = 0; settingIndex < settingAsStringArray.Length; settingIndex++) + { + SerializedProperty entry = property.GetArrayElementAtIndex(settingIndex); + if(entry.stringValue == settingAsStringArray[settingIndex]) + { + continue; + } + + entry.stringValue = settingAsStringArray[settingIndex]; + changedArrayEntry = true; + } + + if(!changedArrayEntry) + { + continue; + } + + break; + } + } + + #if !VRC_CLIENT + string levelName = _graphicsPresets[index]["name"] as string; + if(Application.isMobilePlatform) + { + if(levelName == "Mobile") + { + Debug.Log($"Set incorrect quality setting '{setting.Key}' in level '{levelName}' to value '{setting.Value}'."); + } + } + else + { + if(levelName != "Mobile") + { + Debug.Log($"Set incorrect quality setting '{setting.Key}' in level '{levelName}' to value '{setting.Value}'."); + } + } + + #endif + changedProperty = true; + } + } + + if(!changedProperty) + { + return; + } + + int defaultQuality = !Application.isMobilePlatform ? 3 : 4; + #if !VRC_CLIENT + Debug.Log($"A quality setting was changed resetting to the default quality: {_graphicsPresets[defaultQuality]["name"]}."); + #endif + SerializedProperty currentGraphicsQuality = qualitySettings.FindProperty("m_CurrentQuality"); + currentGraphicsQuality.intValue = defaultQuality; + + qualitySettings.ApplyModifiedPropertiesWithoutUndo(); + AssetDatabase.SaveAssets(); + } + + private static void SetGraphicsSettings() + { + VRC.Core.Logger.Log("Setting Graphics Settings", VRC.Core.DebugLevel.All); + + const string graphicsSettingsAssetPath = "ProjectSettings/GraphicsSettings.asset"; + SerializedObject graphicsManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath(graphicsSettingsAssetPath)[0]); + + SerializedProperty deferred = graphicsManager.FindProperty("m_Deferred.m_Mode"); + deferred.enumValueIndex = 1; + + SerializedProperty deferredReflections = graphicsManager.FindProperty("m_DeferredReflections.m_Mode"); + deferredReflections.enumValueIndex = 1; + + SerializedProperty screenSpaceShadows = graphicsManager.FindProperty("m_ScreenSpaceShadows.m_Mode"); + screenSpaceShadows.enumValueIndex = 1; + + SerializedProperty legacyDeferred = graphicsManager.FindProperty("m_LegacyDeferred.m_Mode"); + legacyDeferred.enumValueIndex = 1; + + SerializedProperty depthNormals = graphicsManager.FindProperty("m_DepthNormals.m_Mode"); + depthNormals.enumValueIndex = 1; + + SerializedProperty motionVectors = graphicsManager.FindProperty("m_MotionVectors.m_Mode"); + motionVectors.enumValueIndex = 1; + + SerializedProperty lightHalo = graphicsManager.FindProperty("m_LightHalo.m_Mode"); + lightHalo.enumValueIndex = 1; + + SerializedProperty lensFlare = graphicsManager.FindProperty("m_LensFlare.m_Mode"); + lensFlare.enumValueIndex = 1; + + #if ENV_SET_INCLUDED_SHADERS && VRC_CLIENT + // clear GraphicsSettings->Always Included Shaders - these cause a +5s app startup time increase on Quest. + // include Shader objects as resources instead + SerializedProperty alwaysIncluded = graphicsManager.FindProperty("m_AlwaysIncludedShaders"); + alwaysIncluded.arraySize = 0; + + #if ENV_SEARCH_FOR_SHADERS + Resources.LoadAll("", typeof(Shader)); + System.Collections.Generic.List<Shader> foundShaders = Resources.FindObjectsOfTypeAll<Shader>() + .Where(s => { string name = s.name.ToLower(); return 0 == (s.hideFlags & HideFlags.DontSave); }) + .GroupBy(s => s.name) + .Select(g => g.First()) + .ToList(); + #else + List<Shader> foundShaders = new List<Shader>(); + #endif + + foreach(string shader in ensureTheseShadersAreAvailable) + { + if(foundShaders.Any(s => s.name == shader)) + { + continue; + } + + Shader namedShader = Shader.Find(shader); + if(namedShader != null) + { + foundShaders.Add(namedShader); + } + } + + foundShaders.Sort((s1, s2) => string.Compare(s1.name, s2.name, StringComparison.Ordinal)); + + // populate Resources list of "always included shaders" + ShaderAssetList alwaysIncludedShaders = AssetDatabase.LoadAssetAtPath<ShaderAssetList>("Assets/Resources/AlwaysIncludedShaders.asset"); + alwaysIncludedShaders.Shaders = new Shader[foundShaders.Count]; + for(int shaderIdx = 0; shaderIdx < foundShaders.Count; ++shaderIdx) + { + alwaysIncludedShaders.Shaders[shaderIdx] = foundShaders[shaderIdx]; + } + #endif + + SerializedProperty preloaded = graphicsManager.FindProperty("m_PreloadedShaders"); + preloaded.ClearArray(); + preloaded.arraySize = 0; + + SerializedProperty spritesDefaultMaterial = graphicsManager.FindProperty("m_SpritesDefaultMaterial"); + spritesDefaultMaterial.objectReferenceValue = Shader.Find("Sprites/Default"); + + SerializedProperty renderPipeline = graphicsManager.FindProperty("m_CustomRenderPipeline"); + renderPipeline.objectReferenceValue = null; + + SerializedProperty transparencySortMode = graphicsManager.FindProperty("m_TransparencySortMode"); + transparencySortMode.enumValueIndex = 0; + + SerializedProperty transparencySortAxis = graphicsManager.FindProperty("m_TransparencySortAxis"); + transparencySortAxis.vector3Value = Vector3.forward; + + SerializedProperty defaultRenderingPath = graphicsManager.FindProperty("m_DefaultRenderingPath"); + defaultRenderingPath.intValue = 1; + + SerializedProperty defaultMobileRenderingPath = graphicsManager.FindProperty("m_DefaultMobileRenderingPath"); + defaultMobileRenderingPath.intValue = 1; + + SerializedProperty tierSettings = graphicsManager.FindProperty("m_TierSettings"); + tierSettings.ClearArray(); + tierSettings.arraySize = 0; + + #if ENV_SET_LIGHTMAP + SerializedProperty lightmapStripping = graphicsManager.FindProperty("m_LightmapStripping"); + lightmapStripping.enumValueIndex = 1; + + SerializedProperty instancingStripping = graphicsManager.FindProperty("m_InstancingStripping"); + instancingStripping.enumValueIndex = 2; + + SerializedProperty lightmapKeepPlain = graphicsManager.FindProperty("m_LightmapKeepPlain"); + lightmapKeepPlain.boolValue = true; + + SerializedProperty lightmapKeepDirCombined = graphicsManager.FindProperty("m_LightmapKeepDirCombined"); + lightmapKeepDirCombined.boolValue = true; + + SerializedProperty lightmapKeepDynamicPlain = graphicsManager.FindProperty("m_LightmapKeepDynamicPlain"); + lightmapKeepDynamicPlain.boolValue = true; + + SerializedProperty lightmapKeepDynamicDirCombined = graphicsManager.FindProperty("m_LightmapKeepDynamicDirCombined"); + lightmapKeepDynamicDirCombined.boolValue = true; + + SerializedProperty lightmapKeepShadowMask = graphicsManager.FindProperty("m_LightmapKeepShadowMask"); + lightmapKeepShadowMask.boolValue = true; + + SerializedProperty lightmapKeepSubtractive = graphicsManager.FindProperty("m_LightmapKeepSubtractive"); + lightmapKeepSubtractive.boolValue = true; + #endif + + SerializedProperty albedoSwatchInfos = graphicsManager.FindProperty("m_AlbedoSwatchInfos"); + albedoSwatchInfos.ClearArray(); + albedoSwatchInfos.arraySize = 0; + + SerializedProperty lightsUseLinearIntensity = graphicsManager.FindProperty("m_LightsUseLinearIntensity"); + lightsUseLinearIntensity.boolValue = true; + + SerializedProperty lightsUseColorTemperature = graphicsManager.FindProperty("m_LightsUseColorTemperature"); + lightsUseColorTemperature.boolValue = true; + + graphicsManager.ApplyModifiedProperties(); + } + + public static FogSettings GetFogSettings() + { + VRC.Core.Logger.Log("Force-enabling Fog", VRC.Core.DebugLevel.All); + + const string graphicsSettingsAssetPath = "ProjectSettings/GraphicsSettings.asset"; + SerializedObject graphicsManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath(graphicsSettingsAssetPath)[0]); + + + SerializedProperty fogStrippingSerializedProperty = graphicsManager.FindProperty("m_FogStripping"); + FogSettings.FogStrippingMode fogStripping = (FogSettings.FogStrippingMode)fogStrippingSerializedProperty.enumValueIndex; + + SerializedProperty fogKeepLinearSerializedProperty = graphicsManager.FindProperty("m_FogKeepLinear"); + bool keepLinear = fogKeepLinearSerializedProperty.boolValue; + + SerializedProperty fogKeepExpSerializedProperty = graphicsManager.FindProperty("m_FogKeepExp"); + bool keepExp = fogKeepExpSerializedProperty.boolValue; + + SerializedProperty fogKeepExp2SerializedProperty = graphicsManager.FindProperty("m_FogKeepExp2"); + bool keepExp2 = fogKeepExp2SerializedProperty.boolValue; + + FogSettings fogSettings = new FogSettings(fogStripping, keepLinear, keepExp, keepExp2); + return fogSettings; + } + + public static void SetFogSettings(FogSettings fogSettings) + { + VRC.Core.Logger.Log("Force-enabling Fog", VRC.Core.DebugLevel.All); + + const string graphicsSettingsAssetPath = "ProjectSettings/GraphicsSettings.asset"; + SerializedObject graphicsManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath(graphicsSettingsAssetPath)[0]); + + SerializedProperty fogStripping = graphicsManager.FindProperty("m_FogStripping"); + fogStripping.enumValueIndex = (int)fogSettings.fogStrippingMode; + + SerializedProperty fogKeepLinear = graphicsManager.FindProperty("m_FogKeepLinear"); + fogKeepLinear.boolValue = fogSettings.keepLinear; + + SerializedProperty fogKeepExp = graphicsManager.FindProperty("m_FogKeepExp"); + fogKeepExp.boolValue = fogSettings.keepExp; + + SerializedProperty fogKeepExp2 = graphicsManager.FindProperty("m_FogKeepExp2"); + fogKeepExp2.boolValue = fogSettings.keepExp2; + + graphicsManager.ApplyModifiedProperties(); + } + + private static void SetAudioSettings() + { + Object audioManager = AssetDatabase.LoadMainAssetAtPath("ProjectSettings/AudioManager.asset"); + SerializedObject audioManagerSerializedObject = new SerializedObject(audioManager); + audioManagerSerializedObject.Update(); + + SerializedProperty sampleRateSerializedProperty = audioManagerSerializedObject.FindProperty("m_SampleRate"); + sampleRateSerializedProperty.intValue = 48000; // forcing 48k seems to avoid sample rate conversion problems + + SerializedProperty dspBufferSizeSerializedProperty = audioManagerSerializedObject.FindProperty("m_RequestedDSPBufferSize"); + dspBufferSizeSerializedProperty.intValue = 0; + + SerializedProperty defaultSpeakerModeSerializedProperty = audioManagerSerializedObject.FindProperty("Default Speaker Mode"); + defaultSpeakerModeSerializedProperty.intValue = 2; // 2 = Stereo + + SerializedProperty virtualVoiceCountSerializedProperty = audioManagerSerializedObject.FindProperty("m_VirtualVoiceCount"); + SerializedProperty realVoiceCountSerializedProperty = audioManagerSerializedObject.FindProperty("m_RealVoiceCount"); + if(EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Android) + { + virtualVoiceCountSerializedProperty.intValue = 32; + realVoiceCountSerializedProperty.intValue = 24; + } + else + { + virtualVoiceCountSerializedProperty.intValue = 64; + realVoiceCountSerializedProperty.intValue = 32; + } + + audioManagerSerializedObject.ApplyModifiedPropertiesWithoutUndo(); + AssetDatabase.SaveAssets(); + } + + private static void SetPlayerSettings() + { + // asset bundles MUST be built with settings that are compatible with VRC client + #if VRC_OVERRIDE_COLORSPACE_GAMMA + PlayerSettings.colorSpace = ColorSpace.Gamma; + #else + PlayerSettings.colorSpace = ColorSpace.Linear; + #endif + + #if !VRC_CLIENT // In client rely on platform-switcher + if (!EditorApplication.isPlaying) + { + #pragma warning disable 618 + PlayerSettings.SetVirtualRealitySupported(EditorUserBuildSettings.selectedBuildTargetGroup, true); + #pragma warning restore 618 + } + #endif + + PlayerSettings.graphicsJobs = true; + + PlayerSettings.gpuSkinning = true; + + #if UNITY_2019_3_OR_NEWER + PlayerSettings.gcIncremental = true; + #endif + + PlayerSettings.stereoRenderingPath = StereoRenderingPath.SinglePass; + +#if UNITY_2018_4_OR_NEWER && !UNITY_2019_3_OR_NEWER + PlayerSettings.scriptingRuntimeVersion = ScriptingRuntimeVersion.Latest; +#endif + +#if UNITY_ANDROID + PlayerSettings.Android.forceSDCardPermission = true; // Need access to SD card for saving images + PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64; + + if(PlayerSettings.Android.targetArchitectures.HasFlag(AndroidArchitecture.ARM64)) + { + // Since we need different IL2CPP args we can't build ARM64 with other Architectures. + PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64; + PlayerSettings.SetAdditionalIl2CppArgs(""); + } + else + { + PlayerSettings.SetAdditionalIl2CppArgs("--linker-flags=\"-long-plt\""); + } + + #if UNITY_2019_3_OR_NEWER + PlayerSettings.Android.targetSdkVersion = AndroidSdkVersions.AndroidApiLevel29; + #else + PlayerSettings.Android.targetSdkVersion = AndroidSdkVersions.AndroidApiLevel26; + #endif +#else + PlayerSettings.SetAdditionalIl2CppArgs(""); +#endif + + SetActiveSDKDefines(); + + EnableBatching(true); + } + + public static void SetActiveSDKDefines() + { + bool definesChanged = false; + BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); + List<string> defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup).Split(';').ToList(); + + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + if(assemblies.Any(assembly => assembly.GetType("VRC.Udon.UdonBehaviour") != null)) + { + if(!defines.Contains("UDON", StringComparer.OrdinalIgnoreCase)) + { + defines.Add("UDON"); + definesChanged = true; + } + } + else if(defines.Contains("UDON")) + { + defines.Remove("UDON"); + } + + if(VRCSdk3Analysis.IsSdkDllActive(VRCSdk3Analysis.SdkVersion.VRCSDK2)) + { + if(!defines.Contains("VRC_SDK_VRCSDK2", StringComparer.OrdinalIgnoreCase)) + { + defines.Add("VRC_SDK_VRCSDK2"); + definesChanged = true; + } + } + else if(defines.Contains("VRC_SDK_VRCSDK2")) + { + defines.Remove("VRC_SDK_VRCSDK2"); + } + + if(VRCSdk3Analysis.IsSdkDllActive(VRCSdk3Analysis.SdkVersion.VRCSDK3)) + { + if(!defines.Contains("VRC_SDK_VRCSDK3", StringComparer.OrdinalIgnoreCase)) + { + defines.Add("VRC_SDK_VRCSDK3"); + definesChanged = true; + } + } + else if(defines.Contains("VRC_SDK_VRCSDK3")) + { + defines.Remove("VRC_SDK_VRCSDK3"); + } + + if(definesChanged) + { + PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, string.Join(";", defines.ToArray())); + } + } + + private static void SetBuildTarget() + { + #if !VRC_CLIENT + VRC.Core.Logger.Log("Setting build target", VRC.Core.DebugLevel.All); + + BuildTarget target = UnityEditor.EditorUserBuildSettings.activeBuildTarget; + + if (!allowedBuildtargets.Contains(target)) + { + Debug.LogError("Target not supported, switching to one that is."); + target = allowedBuildtargets[0]; + #pragma warning disable CS0618 // Type or member is obsolete + EditorUserBuildSettings.SwitchActiveBuildTarget(target); + #pragma warning restore CS0618 // Type or member is obsolete + } + #endif + } + + private static void LoadEditorResources() + { + AvatarPerformanceStats.Initialize(); + } + + public readonly struct FogSettings + { + public enum FogStrippingMode + { + Automatic, + Custom + } + + public readonly FogStrippingMode fogStrippingMode; + public readonly bool keepLinear; + public readonly bool keepExp; + public readonly bool keepExp2; + + public FogSettings(FogStrippingMode fogStrippingMode) + { + this.fogStrippingMode = fogStrippingMode; + keepLinear = true; + keepExp = true; + keepExp2 = true; + } + + public FogSettings(FogStrippingMode fogStrippingMode, bool keepLinear, bool keepExp, bool keepExp2) + { + this.fogStrippingMode = fogStrippingMode; + this.keepLinear = keepLinear; + this.keepExp = keepExp; + this.keepExp2 = keepExp2; + } + } + + private static readonly Dictionary<string, object>[] _graphicsPresets = { + new Dictionary<string, object> + { + {"name", "Low"}, + {"pixelLightCount", 4}, + {"shadows", 2}, + {"shadowResolution", 2}, + {"shadowProjection", 1}, + {"shadowCascades", 2}, + {"shadowDistance", 75f}, + {"shadowNearPlaneOffset", 2f}, + {"shadowCascade2Split", 0.33333334}, + {"shadowCascade4Split", new Vector3(0.06666667f, 0.19999999f, 0.46666664f)}, + {"shadowmaskMode", 0}, + {"skinWeights", 4}, + {"textureQuality", 0}, + {"anisotropicTextures", 2}, + {"antiAliasing", 0}, + {"softParticles", true}, + {"softVegetation", true}, + {"realtimeReflectionProbes", true}, + {"billboardsFaceCameraPosition", true}, + {"vSyncCount", 0}, + {"lodBias", 1f}, + {"maximumLODLevel", 0}, + {"streamingMipmapsActive", false}, + {"streamingMipmapsAddAllCameras", true}, + {"streamingMipmapsMemoryBudget", 512f}, + {"streamingMipmapsRenderersPerFrame", 512}, + {"streamingMipmapsMaxLevelReduction", 2}, + {"streamingMipmapsMaxFileIORequests", 1024}, + {"particleRaycastBudget", 1024}, + {"asyncUploadTimeSlice", 2}, + {"asyncUploadBufferSize", 64}, + {"asyncUploadPersistentBuffer", true}, + {"resolutionScalingFixedDPIFactor", 1f}, + {"customRenderPipeline", null}, + {"excludedTargetPlatforms", new[] {"Android"}} + }, + new Dictionary<string, object> + { + {"name", "Medium"}, + {"pixelLightCount", 4}, + {"shadows", 2}, + {"shadowResolution", 2}, + {"shadowProjection", 1}, + {"shadowCascades", 2}, + {"shadowDistance", 75f}, + {"shadowNearPlaneOffset", 2f}, + {"shadowCascade2Split", 0.33333334}, + {"shadowCascade4Split", new Vector3(0.06666667f, 0.19999999f, 0.46666664f)}, + {"shadowmaskMode", 0}, + {"skinWeights", 4}, + {"textureQuality", 0}, + {"anisotropicTextures", 2}, + {"antiAliasing", 4}, + {"softParticles", true}, + {"softVegetation", true}, + {"realtimeReflectionProbes", true}, + {"billboardsFaceCameraPosition", true}, + {"vSyncCount", 0}, + {"lodBias", 1.5f}, + {"maximumLODLevel", 0}, + {"streamingMipmapsActive", false}, + {"streamingMipmapsAddAllCameras", true}, + {"streamingMipmapsMemoryBudget", 512f}, + {"streamingMipmapsRenderersPerFrame", 512}, + {"streamingMipmapsMaxLevelReduction", 2}, + {"streamingMipmapsMaxFileIORequests", 1024}, + {"particleRaycastBudget", 2048}, + {"asyncUploadTimeSlice", 2}, + {"asyncUploadBufferSize", 64}, + {"asyncUploadPersistentBuffer", true}, + {"resolutionScalingFixedDPIFactor", 1f}, + {"customRenderPipeline", null}, + {"excludedTargetPlatforms", new[] {"Android"}} + }, + new Dictionary<string, object> + { + {"name", "High"}, + {"pixelLightCount", 8}, + {"shadows", 2}, + {"shadowResolution", 3}, + {"shadowProjection", 1}, + {"shadowCascades", 2}, + {"shadowDistance", 75f}, + {"shadowNearPlaneOffset", 2f}, + {"shadowCascade2Split", 0.33333334}, + {"shadowCascade4Split", new Vector3(0.06666667f, 0.19999999f, 0.46666664f)}, + {"shadowmaskMode", 0}, + {"skinWeights", 4}, + {"textureQuality", 0}, + {"anisotropicTextures", 2}, + {"antiAliasing", 4}, + {"softParticles", true}, + {"softVegetation", true}, + {"realtimeReflectionProbes", true}, + {"billboardsFaceCameraPosition", true}, + {"vSyncCount", 0}, + {"lodBias", 2f}, + {"maximumLODLevel", 0}, + {"streamingMipmapsActive", false}, + {"streamingMipmapsAddAllCameras", true}, + {"streamingMipmapsMemoryBudget", 512f}, + {"streamingMipmapsRenderersPerFrame", 512}, + {"streamingMipmapsMaxLevelReduction", 2}, + {"streamingMipmapsMaxFileIORequests", 1024}, + {"particleRaycastBudget", 4096}, + {"asyncUploadTimeSlice", 2}, + {"asyncUploadBufferSize", 128}, + {"asyncUploadPersistentBuffer", true}, + {"resolutionScalingFixedDPIFactor", 1f}, + {"customRenderPipeline", null}, + {"excludedTargetPlatforms", new []{"Android"}} + }, + new Dictionary<string, object> + { + {"name", "Ultra"}, + {"pixelLightCount", 8}, + {"shadows", 2}, + {"shadowResolution", 3}, + {"shadowProjection", 1}, + {"shadowCascades", 4}, + {"shadowDistance", 150f}, + {"shadowNearPlaneOffset", 2f}, + {"shadowCascade2Split", 0.33333334}, + {"shadowCascade4Split", new Vector3(0.06666667f, 0.19999999f, 0.46666664f)}, + {"shadowmaskMode", 0}, + {"skinWeights", 4}, + {"textureQuality", 0}, + {"anisotropicTextures", 2}, + {"antiAliasing", 4}, + {"softParticles", true}, + {"softVegetation", true}, + {"realtimeReflectionProbes", true}, + {"billboardsFaceCameraPosition", true}, + {"vSyncCount", 0}, + {"lodBias", 2f}, + {"maximumLODLevel", 0}, + {"streamingMipmapsActive", false}, + {"streamingMipmapsAddAllCameras", true}, + {"streamingMipmapsMemoryBudget", 512f}, + {"streamingMipmapsRenderersPerFrame", 512}, + {"streamingMipmapsMaxLevelReduction", 2}, + {"streamingMipmapsMaxFileIORequests", 1024}, + {"particleRaycastBudget", 4096}, + {"asyncUploadTimeSlice", 2}, + {"asyncUploadBufferSize", 128}, + {"asyncUploadPersistentBuffer", true}, + {"resolutionScalingFixedDPIFactor", 1f}, + {"customRenderPipeline", null}, + {"excludedTargetPlatforms", new[]{"Android"}} + }, + new Dictionary<string, object> + { + {"name", "Mobile"}, + {"pixelLightCount", 4}, + {"shadows", 0}, + {"shadowResolution", 1}, + {"shadowProjection", 1}, + {"shadowCascades", 1}, + {"shadowDistance", 50f}, + {"shadowNearPlaneOffset", 2f}, + {"shadowCascade2Split", 0.33333334}, + {"shadowCascade4Split", new Vector3(0.06666667f, 0.19999999f, 0.46666664f)}, + {"shadowmaskMode", 0}, + {"skinWeights", 4}, + {"textureQuality", 0}, + {"anisotropicTextures", 2}, + {"antiAliasing", 2}, + {"softParticles", false}, + {"softVegetation", false}, + {"realtimeReflectionProbes", false}, + {"billboardsFaceCameraPosition", true}, + {"vSyncCount", 0}, + {"lodBias", 2f}, + {"maximumLODLevel", 0}, + {"streamingMipmapsActive", false}, + {"streamingMipmapsAddAllCameras", true}, + {"streamingMipmapsMemoryBudget", 512f}, + {"streamingMipmapsRenderersPerFrame", 512}, + {"streamingMipmapsMaxLevelReduction", 2}, + {"streamingMipmapsMaxFileIORequests", 1024}, + {"particleRaycastBudget", 1024}, + {"asyncUploadTimeSlice", 1}, + {"asyncUploadBufferSize", 32}, + {"asyncUploadPersistentBuffer", true}, + {"resolutionScalingFixedDPIFactor", 1f}, + {"customRenderPipeline", null}, + {"excludedTargetPlatforms", new []{"Standalone"}} + } + }; +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/EnvConfig.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/EnvConfig.cs.meta new file mode 100644 index 00000000..9e0353a3 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/EnvConfig.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 10d9f721d76e07a47bc9e5f61e2fae72 +timeCreated: 1455115256 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixAnimatorControllers.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixAnimatorControllers.cs new file mode 100644 index 00000000..d3459907 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixAnimatorControllers.cs @@ -0,0 +1,88 @@ +// This code was adapted from: https://github.com/Joshuarox100/Fix-Your-Animators/blob/main/FixYourAnimators.cs +// MIT License +// +// Copyright (c) 2021 Joshuarox100 +// +// 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.Generic; +using UnityEditor; +using UnityEditor.Animations; +using UnityEngine; + +namespace VRC.SDKBase.Editor +{ + public static class FixAnimatorControllers + { + private static readonly HashSet<Type> types = new HashSet<Type> + { + typeof(AnimatorState), + typeof(AnimatorStateMachine), + typeof(StateMachineBehaviour), + typeof(AnimatorStateTransition), + typeof(AnimatorTransition), + typeof(BlendTree) + }; + + [InitializeOnLoadMethod] + private static void RegisterDelegates() + { + Selection.selectionChanged += AutoFixHideFlags; + EditorApplication.quitting += UnregisterDelegates; + } + + public static void UnregisterDelegates() + { + Selection.selectionChanged -= AutoFixHideFlags; + EditorApplication.quitting -= UnregisterDelegates; + } + + // Automatically corrects HideFlags for objects with types included in 'types' when trying to inspect them. + public static void AutoFixHideFlags() + { + bool dirty = false; + foreach(UnityEngine.Object selection in Selection.objects) + { + if(selection == null) + { + continue; + } + + if(selection.hideFlags != (HideFlags.HideInHierarchy | HideFlags.HideInInspector) || !types.Contains(selection.GetType())) + { + continue; + } + + if(!string.IsNullOrEmpty(AssetDatabase.GetAssetPath(selection))) + { + EditorUtility.SetDirty(selection); + } + + selection.hideFlags = HideFlags.HideInHierarchy; + dirty = true; + } + + if(dirty) + { + Selection.selectionChanged(); + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixAnimatorControllers.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixAnimatorControllers.cs.meta new file mode 100644 index 00000000..053757cf --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixAnimatorControllers.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bc1f4d12c7c0f3468bd3469a5209dc1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixConstraintUpdateOrder.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixConstraintUpdateOrder.cs new file mode 100644 index 00000000..6ff7d4b4 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixConstraintUpdateOrder.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; +using UnityEngine.LowLevel; +using UnityEngine.PlayerLoop; + +namespace VRC.SDKBase.Editor +{ + public static class FixConstraintUpdateOrder + { + [RuntimeInitializeOnLoadMethod] + private static void ApplyFix() + { + PlayerLoopSystem currentPlayerLoopSystem = PlayerLoop.GetCurrentPlayerLoop(); + + // Search the current PlayerLoopSystem's sub-systems for the PreLateUpdate system. + PlayerLoopSystem[] playerLoopSystems = currentPlayerLoopSystem.subSystemList; + int preLateUpdateSystemIndex = Array.FindIndex(playerLoopSystems, system => system.type == typeof(PreLateUpdate)); + PlayerLoopSystem preLateUpdateSystem = playerLoopSystems[preLateUpdateSystemIndex]; + + // Search the PreLateUpdate system's sub-systems for ScriptRunBehaviourLateUpdate and ConstraintManagerUpdate. + List<PlayerLoopSystem> preLateUpdateSystemSubSystems = preLateUpdateSystem.subSystemList.ToList(); + PlayerLoopSystem scriptRunBehaviourLateUpdateSystem = preLateUpdateSystemSubSystems.Find(system => system.type == typeof(PreLateUpdate.ScriptRunBehaviourLateUpdate)); + PlayerLoopSystem constraintManagerUpdateSystem = preLateUpdateSystemSubSystems.Find(system => system.type == typeof(PreLateUpdate.ConstraintManagerUpdate)); + + // Move ScriptRunBehaviourLateUpdate to before ConstraintManagerUpdate. + preLateUpdateSystemSubSystems.Remove(scriptRunBehaviourLateUpdateSystem); + preLateUpdateSystemSubSystems.Insert(preLateUpdateSystemSubSystems.IndexOf(constraintManagerUpdateSystem), scriptRunBehaviourLateUpdateSystem); + + // Update the PlayerLoopSystem structs. + preLateUpdateSystem.subSystemList = preLateUpdateSystemSubSystems.ToArray(); + playerLoopSystems[preLateUpdateSystemIndex] = preLateUpdateSystem; + currentPlayerLoopSystem.subSystemList = playerLoopSystems; + PlayerLoop.SetPlayerLoop(currentPlayerLoopSystem); + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixConstraintUpdateOrder.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixConstraintUpdateOrder.cs.meta new file mode 100644 index 00000000..c5d7fc6b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/FixConstraintUpdateOrder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a4af4545014b16439e24fcba1fd1e5e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/HDRColorFixerUtility.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/HDRColorFixerUtility.cs new file mode 100644 index 00000000..a7ea788f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/HDRColorFixerUtility.cs @@ -0,0 +1,73 @@ +using UnityEditor; +using UnityEngine; + +public static class HDRColorFixerUtility +{ + [MenuItem("VRChat SDK/Utilities/Convert HDR Material Colors/To Linear", false, 995)] + private static void ConvertToLinear() + { + if (!TryConvert()) + EditorUtility.DisplayDialog("Error", "Please select one or more HDR materials to convert.", "OK"); + } + + [MenuItem("VRChat SDK/Utilities/Convert HDR Material Colors/To Gamma", false, 996)] + private static void ConvertToGamma() + { + if (!TryConvert(false)) + EditorUtility.DisplayDialog("Error", "Please select one or more HDR materials to convert.", "OK"); + } + + static bool TryConvert(bool toLinear = true) + { + Object[] selection = Selection.objects; + if (selection == null) + return false; + + int matCount = 0; + int colorCount = 0; + foreach (Material mat in selection) + { + matCount++; + MaterialProperty[] props = MaterialEditor.GetMaterialProperties(new Material[] { mat }); + if ((props == null) || (props.Length == 0)) + return false; + + foreach (MaterialProperty m in props) + { + if (m.flags == MaterialProperty.PropFlags.HDR) + { + //Color prev = m.colorValue; + m.colorValue = (toLinear ? m.colorValue.linear : m.colorValue.gamma); + colorCount++; + //Debug.Log("prev: " + prev + ", current: " + m.colorValue); + } + } + } + + if (colorCount == 0) + EditorUtility.DisplayDialog("Result", "Found no HDR Color properties in the selected material" + (matCount > 1 ? "s." : "."), "OK"); + else + EditorUtility.DisplayDialog("Result", "Converted " + colorCount + " HDR Color propert"+ (colorCount > 1 ? "ies" : "y") + " in "+matCount+" material"+(matCount > 1 ? "s":"") + " to " + (toLinear ? "Linear" : "Gamma") + " color space.", "OK"); + + return true; + } + + [MenuItem("VRChat SDK/Utilities/Convert HDR Material Colors/To Linear", true, 995)] + [MenuItem("VRChat SDK/Utilities/Convert HDR Material Colors/To Gamma", true, 996)] + private static bool CheckSelection() + { + if (Selection.objects.Length == 0) + return false; + bool allMaterials = true; + foreach (Object obj in Selection.objects) + { + if (obj.GetType() != typeof(Material)) + { + allMaterials = false; + break; + } + } + return allMaterials; + } + +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/HDRColorFixerUtility.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/HDRColorFixerUtility.cs.meta new file mode 100644 index 00000000..b3ff9fe0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/HDRColorFixerUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3399613f583f3e46b2df27ae87dd5d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility.meta new file mode 100644 index 00000000..b92a81f6 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 16d7f66f81212a64d8af752c268da527 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility/VRCSdk3Analysis.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility/VRCSdk3Analysis.cs new file mode 100644 index 00000000..7caa8b8b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility/VRCSdk3Analysis.cs @@ -0,0 +1,70 @@ +using System.Reflection; +using System.Collections.Generic; +using UnityEngine; +using System; +using System.Linq; +using UnityEditor; + +public class VRCSdk3Analysis +{ + static Assembly GetAssemblyByName(string name) + { + return AppDomain.CurrentDomain.GetAssemblies(). + SingleOrDefault(assembly => assembly.GetName().Name == name); + } + + static List<Component> GetSceneComponentsFromAssembly( Assembly assembly ) + { + if (assembly == null) + return new List<Component>(); + + Type[] types = assembly.GetTypes(); + + List<Component> present = new List<Component>(); + foreach (var type in types ) + { + if (!type.IsSubclassOf(typeof(MonoBehaviour))) + continue; + + var monos = VRC.Tools.FindSceneObjectsOfTypeAll(type); + present.AddRange(monos); + } + return present; + } + + public enum SdkVersion + { + VRCSDK2, + VRCSDK3 + }; + + public static List<Component> GetSDKInScene(SdkVersion version) + { + var assembly = GetAssemblyByName( version.ToString() ); + return GetSceneComponentsFromAssembly(assembly); + } + + public static bool IsSdkDllActive(SdkVersion version) + { + string assembly = version.ToString(); + PluginImporter importer = GetImporterForAssemblyString(assembly); + if (importer == false) + { + //Handle Avatar Dll Split + importer = GetImporterForAssemblyString(assembly + "A"); + if (importer == false) + return false; + } + + return importer.GetCompatibleWithAnyPlatform(); + } + + public static PluginImporter GetImporterForAssemblyString(string assembly) + { +#if VRCUPM + return AssetImporter.GetAtPath($"Packages/com.vrchat.{assembly.ToLower()}/Runtime/VRCSDK/Plugins/{assembly}.dll") as PluginImporter; +#else + return AssetImporter.GetAtPath($"Assets/VRCSDK/Plugins/{assembly}.dll") as PluginImporter; +#endif + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility/VRCSdk3Analysis.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility/VRCSdk3Analysis.cs.meta new file mode 100644 index 00000000..8a2d89cb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDK3Compatibility/VRCSdk3Analysis.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93710d221addc0243ba90dd20369844b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDKUpdater.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDKUpdater.cs new file mode 100644 index 00000000..0be3003a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDKUpdater.cs @@ -0,0 +1,70 @@ +using UnityEngine; +using System.Collections; +using UnityEditor; + +public class SDKUpdater : MonoBehaviour +{ + static string GetCurrentVersion() + { + string currentVersion = ""; + string versionTextPath = Application.dataPath + "/VRCSDK/version.txt"; + if(System.IO.File.Exists(versionTextPath)) + { + string[] versionFileLines = System.IO.File.ReadAllLines(versionTextPath); + if(versionFileLines.Length > 0) + currentVersion = versionFileLines[0]; + } + return currentVersion; + } + + [MenuItem("VRChat SDK/Utilities/Check For Updates")] + static void CheckForUpdatesWithProgressBar() + { + CheckForUpdates(false); + } + + public static void CheckForUpdates(bool isSilent = true) + { + Debug.Log("Checking for VRChat SDK updates..."); + if(!isSilent) + EditorUtility.DisplayProgressBar("SDK Updater", "Checking for updates...", 1f); + + VRC.Core.ConfigManager.RemoteConfig.Init(delegate() { + string currentSdkVersion = GetCurrentVersion(); + string sdkVersion = VRC.Core.ConfigManager.RemoteConfig.GetString("devSdkVersion"); + string sdkUrl = VRC.Core.ConfigManager.RemoteConfig.GetString("devSdkUrl"); + EditorUtility.ClearProgressBar(); + + if(sdkVersion == currentSdkVersion) + { + ShowDownloadUpdatePopup(false, currentSdkVersion, sdkUrl, isSilent); + } + else + { + ShowDownloadUpdatePopup(true, sdkVersion, sdkUrl, isSilent); + } + }); + } + + static void ShowDownloadUpdatePopup(bool updateAvailable, string latestVersion, string sdkUrl, bool isSilent) + { + if(!updateAvailable) + { + if(!isSilent) + EditorUtility.DisplayDialog("VRChat SDK Updater", "SDK is up to date (version " + latestVersion + ")", "Okay"); + } + else + { + if(EditorUtility.DisplayDialog("VRChat SDK Updater", "An update is available (version " + latestVersion + ")", "Download", "Cancel")) + { + DownloadUpdate(sdkUrl); + } + } + } + + static void DownloadUpdate(string sdkUrl) + { + Application.OpenURL(sdkUrl); + } + +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDKUpdater.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDKUpdater.cs.meta new file mode 100644 index 00000000..bb4e950e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/SDKUpdater.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7b8bb626428d0f341b9ed6a68cb5c9cc +timeCreated: 1473273663 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderKeywordsUtility.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderKeywordsUtility.cs new file mode 100644 index 00000000..84f78700 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderKeywordsUtility.cs @@ -0,0 +1,383 @@ +// Original ShaderKeywordsUtility by ScruffyRules#0879 +// Thank you to Xiexe and all that tested! +// Licensed under the MIT License (see https://vrchat.com/legal/attribution) + +#if UNITY_EDITOR +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; + +public class ShaderKeywordsUtility : EditorWindow +{ + private static Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, Dictionary<Material, bool>> avatars = new Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, Dictionary<Material, bool>>(); + private Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, bool> avatarsOpened = new Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, bool>(); + private Vector2 scrollPos; + private static GUIStyle titleGuiStyle; + public static HashSet<string> keywordBlacklist = new HashSet<string>(new string[] + { + // Unity Keywords, these don't matter at all. (They should be loaded) + // All Keywords that are in Standard Unity Shaders + "_ALPHABLEND_ON", + "_ALPHAMODULATE_ON", + "_ALPHAPREMULTIPLY_ON", + "_ALPHATEST_ON", + "_COLORADDSUBDIFF_ON", + "_COLORCOLOR_ON", + "_COLOROVERLAY_ON", + "_DETAIL_MULX2", + "_EMISSION", + "_FADING_ON", + "_GLOSSYREFLECTIONS_OFF", + "_GLOSSYREFLECTIONS_OFF", + "_MAPPING_6_FRAMES_LAYOUT", + "_METALLICGLOSSMAP", + "_NORMALMAP", + "_PARALLAXMAP", + "_REQUIRE_UV2", + "_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A", + "_SPECGLOSSMAP", + "_SPECULARHIGHLIGHTS_OFF", + "_SPECULARHIGHLIGHTS_OFF", + "_SUNDISK_HIGH_QUALITY", + "_SUNDISK_NONE", + "_SUNDISK_SIMPLE", + "_TERRAIN_NORMAL_MAP", + "BILLBOARD_FACE_CAMERA_POS", + "EFFECT_BUMP", + "EFFECT_HUE_VARIATION", + "ETC1_EXTERNAL_ALPHA", + "GEOM_TYPE_BRANCH", + "GEOM_TYPE_BRANCH_DETAIL", + "GEOM_TYPE_FROND", + "GEOM_TYPE_LEAF", + "GEOM_TYPE_MESH", + "LOD_FADE_CROSSFADE", + "PIXELSNAP_ON", + "SOFTPARTICLES_ON", + "STEREO_INSTANCING_ON", + "STEREO_MULTIVIEW_ON", + "UNITY_HDR_ON", + "UNITY_SINGLE_PASS_STEREO", + "UNITY_UI_ALPHACLIP", + "UNITY_UI_CLIP_RECT", + // Post Processing Stack V1 and V2 + // This is mostly just safe keeping somewhere + "FOG_OFF", + "FOG_LINEAR", + "FOG_EXP", + "FOG_EXP2", + "ANTI_FLICKER", + "UNITY_COLORSPACE_GAMMA", + "SOURCE_GBUFFER", + "AUTO_KEY_VALUE", + "GRAIN", + "DITHERING", + "TONEMAPPING_NEUTRAL", + "TONEMAPPING_FILMIC", + "CHROMATIC_ABERRATION", + "DEPTH_OF_FIELD", + "DEPTH_OF_FIELD_COC_VIEW", + "BLOOM", + "BLOOM_LENS_DIRT", + "COLOR_GRADING", + "COLOR_GRADING_LOG_VIEW", + "USER_LUT", + "VIGNETTE_CLASSIC", + "VIGNETTE_MASKED", + "FXAA", + "FXAA_LOW", + "FXAA_KEEP_ALPHA", + "STEREO_INSTANCING_ENABLED", + "STEREO_DOUBLEWIDE_TARGET", + "TONEMAPPING_ACES", + "TONEMAPPING_CUSTOM", + "APPLY_FORWARD_FOG", + "DISTORT", + "CHROMATIC_ABERRATION_LOW", + "BLOOM_LOW", + "VIGNETTE", + "FINALPASS", + "COLOR_GRADING_HDR_3D", + "COLOR_GRADING_HDR", + "AUTO_EXPOSURE" + }); + + const string keywordDescription = "Unity has a global limit of 256 keywords. A lot (~60) are used internally by Unity.\n\nAny new keyword you encounter goes onto a global list, and will stay until you restart the client.\n\nKeywords are used to create compile time branches and remove code, to optimize a shader, however, because of the 256 keyword limit, using them in VRChat can cause other shaders which use keywords to break, as once you hit the limit, any new keyword will get ignored.\n\nIt's best in the confines of VRChat to stay away from using custom keywords if possible, as not to cause issues with (your) shaders breaking.\n\nFor the full list of internal keywords, see 'ShaderKeywordsUtility.cs'"; + + private static bool avatarsDirty = true; + private int loadedScenes = 0; + + [MenuItem("VRChat SDK/Utilities/Avatar Shader Keywords Utility", false, 990)] + static void Init() + { + ShaderKeywordsUtility window = EditorWindow.GetWindow<ShaderKeywordsUtility>(); + window.titleContent = new GUIContent("Shader Keywords Utility"); + window.minSize = new Vector2(325, 410); + window.Show(); + + titleGuiStyle = new GUIStyle + { + fontSize = 15, + fontStyle = FontStyle.BoldAndItalic, + alignment = TextAnchor.MiddleCenter, + wordWrap = true + }; + + if (EditorGUIUtility.isProSkin) + titleGuiStyle.normal.textColor = Color.white; + else + titleGuiStyle.normal.textColor = Color.black; + } + + public static List<VRC.SDKBase.VRC_AvatarDescriptor> getADescs() + { + List<GameObject> GOs = new List<GameObject>(); + for (int i = 0; i < UnityEditor.SceneManagement.EditorSceneManager.sceneCount; i++) + { + Scene scene = UnityEditor.SceneManagement.EditorSceneManager.GetSceneAt(i); + if (scene.isLoaded) + { + GameObject[] GOs2 = scene.GetRootGameObjects(); + foreach (GameObject go in GOs2) + { + GOs.Add(go); + } + } + } + + List<VRC.SDKBase.VRC_AvatarDescriptor> descriptors = new List<VRC.SDKBase.VRC_AvatarDescriptor>(); + foreach (GameObject go in GOs) + { + var vrcdescs = go.GetComponentsInChildren<VRC.SDKBase.VRC_AvatarDescriptor>(true); + foreach (VRC.SDKBase.VRC_AvatarDescriptor vrcdesc in vrcdescs) + { + descriptors.Add(vrcdesc); + } + } + + return descriptors; + } + + public static bool DetectCustomShaderKeywords(VRC.SDKBase.VRC_AvatarDescriptor ad) + { + foreach (Renderer renderer in ad.transform.GetComponentsInChildren<Renderer>(true)) + { + foreach (Material mat in renderer.sharedMaterials) + { + if (mat != null) + { + foreach (string keyword in mat.shaderKeywords) + { + if (!keywordBlacklist.Contains(keyword)) + return true; + } + } + } + } + return false; + } + + void OnGUI() + { + GUILayout.Space(10); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Label("Shader Keywords Utility", titleGuiStyle); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.Space(15); + + bool showHelp = EditorPrefs.GetBool("VRCSDK_ShowShaderKeywordsHelp", true); + if (showHelp) + { + GUILayout.Label(keywordDescription, EditorStyles.helpBox, GUILayout.ExpandWidth(true)); + GUILayout.Space(15); + } + + int _loadedScenes = 0; + for (int i = 0; i < UnityEditor.SceneManagement.EditorSceneManager.sceneCount; i++) + { + Scene scene = UnityEditor.SceneManagement.EditorSceneManager.GetSceneAt(i); + if (scene.isLoaded) + _loadedScenes += 1; + } + if (_loadedScenes != loadedScenes) + { + // Debug.Log("Loaded Scenes changed"); + loadedScenes = _loadedScenes; + avatarsDirty = true; + } + + GUILayout.BeginHorizontal(); + if (GUILayout.Button("Refresh Avatars", GUILayout.ExpandWidth(false))) + avatarsDirty = true; + GUILayout.FlexibleSpace(); + if (GUILayout.Button((showHelp ? "Hide" : "Show") + " Info about Keywords")) + { + showHelp = !showHelp; + EditorPrefs.SetBool("VRCSDK_ShowShaderKeywordsHelp", showHelp); + } + GUILayout.EndHorizontal(); + GUILayout.Space(5); + + scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false); + ListAvatars(); + EditorGUILayout.EndScrollView(); + + } + + void ListAvatars() + { + + if (avatarsDirty) + CacheAvatars(); + + Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, Dictionary<Material, bool>> avatarsE = new Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, Dictionary<Material, bool>>(avatars); + foreach (VRC.SDKBase.VRC_AvatarDescriptor vrcAD in avatarsE.Keys) + { + List<string> keywords = new List<string>(); + foreach (Material mat in avatars[vrcAD].Keys) + { + foreach (string keyword in mat.shaderKeywords) + { + if (!keywords.Contains(keyword) && !keywordBlacklist.Contains(keyword)) + keywords.Add(keyword); + } + } + if (keywords.Count == 0) + { + avatars.Remove(vrcAD); + avatarsOpened.Remove(vrcAD); + continue; + } + + GUILayout.BeginHorizontal(); + bool avatarOpened = avatarsOpened[vrcAD]; + avatarOpened = EditorGUILayout.ToggleLeft("", avatarOpened, GUILayout.MaxWidth(15f)); + avatarsOpened[vrcAD] = avatarOpened; + EditorGUILayout.ObjectField(vrcAD, typeof(VRC.SDKBase.VRC_AvatarDescriptor), true); + GUILayout.EndHorizontal(); + + if (avatarOpened) + { + GUILayout.BeginHorizontal(); + GUILayout.Space(23.0879f); + GUILayout.Label("Total Custom Keywords on Avatar: " + keywords.Count); + GUILayout.EndHorizontal(); + + Dictionary<Material, bool> materials = new Dictionary<Material, bool>(avatars[vrcAD]); + foreach (KeyValuePair<Material, bool> matKeyVal in materials) + { + Material material = matKeyVal.Key; + bool materialOpened = matKeyVal.Value; + + GUILayout.BeginHorizontal(); + GUILayout.Space(23.0879f); + materialOpened = EditorGUILayout.ToggleLeft("", materialOpened, GUILayout.MaxWidth(15f)); + avatars[vrcAD][material] = materialOpened; + EditorGUILayout.ObjectField(material, typeof(Material), false); + GUILayout.EndHorizontal(); + + if (materialOpened) + { + GUILayout.BeginHorizontal(); + GUILayout.Space(23.0879f * 2f); + if (GUILayout.Button("Delete ALL Keywords on this Material")) + { + if (EditorUtility.DisplayDialog("Delete All Keywords on this Material", "Are you sure you want to delete all Shader Keywords on this material?\nSome shaders might use these!", "Yes", "No")) + { + foreach (string keyword in material.shaderKeywords) + { + if (!keywordBlacklist.Contains(keyword)) + material.DisableKeyword(keyword); + } + avatars[vrcAD].Remove(material); + } + } + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + GUILayout.Space(23.0879f * 2f); + GUILayout.Label("Keywords", EditorStyles.boldLabel); + GUILayout.EndHorizontal(); + + int keywordsCount = 0; + foreach (string keyword in material.shaderKeywords) + { + if (!keywordBlacklist.Contains(keyword)) + { + keywordsCount++; + GUILayout.BeginHorizontal(); + GUILayout.Space(23.0879f * 2f); + GUILayout.Label(keyword); + if (GUILayout.Button("Delete", GUILayout.ExpandWidth(false))) + material.DisableKeyword(keyword); + GUILayout.EndHorizontal(); + } + } + if (keywordsCount == 0) + avatars[vrcAD].Remove(material); + } + } + GUILayout.Space(2f); + } + } + + } + + void CacheAvatars() + { + + //Debug.Log("Caching avatars"); + avatars = new Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, Dictionary<Material, bool>>(); + + List<VRC.SDKBase.VRC_AvatarDescriptor> avatarDescriptors = getADescs(); + + foreach (VRC.SDKBase.VRC_AvatarDescriptor aD in avatarDescriptors) + { + if (!avatars.ContainsKey(aD)) + avatars.Add(aD, new Dictionary<Material, bool>()); + + if (!avatarsOpened.ContainsKey(aD)) + avatarsOpened.Add(aD, false); + + foreach (Renderer renderer in aD.transform.GetComponentsInChildren<Renderer>(true)) + { + foreach (Material mat in renderer.sharedMaterials) + { + if (mat != null) + { + if (!avatars[aD].ContainsKey(mat)) + { + foreach (string keyword in mat.shaderKeywords) + { + if (!keywordBlacklist.Contains(keyword)) + { + avatars[aD].Add(mat, false); + break; + } + } + } + } + } + } + if (avatars[aD].Count == 0) + { + avatars.Remove(aD); + avatarsOpened.Remove(aD); + } + } + // prevent leaking + Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, bool> avatarsOpenedE = new Dictionary<VRC.SDKBase.VRC_AvatarDescriptor, bool>(); + foreach (VRC.SDKBase.VRC_AvatarDescriptor aO in avatarsOpenedE.Keys) + { + if (!avatarDescriptors.Contains(aO)) + avatarsOpened.Remove(aO); + } + avatarsDirty = false; + + } + +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderKeywordsUtility.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderKeywordsUtility.cs.meta new file mode 100644 index 00000000..3c3d530f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderKeywordsUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 679ba0056bf110c4db8b550082e73a5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping.meta new file mode 100644 index 00000000..2cc71402 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52dfa3eaa7c850640b4b82bad3c7a6d4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripAndroidAvatars.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripAndroidAvatars.cs new file mode 100644 index 00000000..3e4a1f1a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripAndroidAvatars.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEditor.Rendering; +using UnityEngine; +using VRC.SDKBase.Editor.BuildPipeline; + +public class StripAndroidAvatars : IPreprocessShaders, IVRCSDKBuildRequestedCallback, IPostprocessBuildWithReport +{ + private static VRCSDKRequestedBuildType? _buildType = null; + + public int callbackOrder => 0; + + public bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType) + { + _buildType = requestedBuildType; + return true; + } + + public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data) + { + if(_buildType != VRCSDKRequestedBuildType.Avatar) + { + return; + } + + if(EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android) + { + return; + } + + data.Clear(); + } + + public void OnPostprocessBuild(BuildReport report) + { + _buildType = null; + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripAndroidAvatars.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripAndroidAvatars.cs.meta new file mode 100644 index 00000000..cad09752 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripAndroidAvatars.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f05fc74d61cc0c448411f8b55c918ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripPostProcessing.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripPostProcessing.cs new file mode 100644 index 00000000..d5a55351 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripPostProcessing.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Rendering; +using UnityEngine; + +namespace VRC.SDKBase.Editor.ShaderStripping +{ + public class StripPostProcessing : IPreprocessShaders + { + public int callbackOrder => 0; + + public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data) + { + string shaderName = shader.name; + if(string.IsNullOrEmpty(shaderName) || !shaderName.Contains("PostProcessing")) + { + return; + } + + data.Clear(); + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripPostProcessing.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripPostProcessing.cs.meta new file mode 100644 index 00000000..f40ffb5c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/StripPostProcessing.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 06d01ef00e2795244aa8b5cbe879b16e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/VRC.SDKBase.Editor.ShaderStripping.asmdef b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/VRC.SDKBase.Editor.ShaderStripping.asmdef new file mode 100644 index 00000000..6a0bf26a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/VRC.SDKBase.Editor.ShaderStripping.asmdef @@ -0,0 +1,16 @@ +{ + "name": "VRC.SDKBase.Editor.ShaderStripping", + "references": [], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [ + "VRCSDKBase-Editor.dll" + ], + "autoReferenced": true, + "defineConstraints": [] +}
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/VRC.SDKBase.Editor.ShaderStripping.asmdef.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/VRC.SDKBase.Editor.ShaderStripping.asmdef.meta new file mode 100644 index 00000000..b49d7def --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/ShaderStripping/VRC.SDKBase.Editor.ShaderStripping.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 09158b5a87ea9554daafaef906ae927e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRCCachedWebRequest.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRCCachedWebRequest.cs new file mode 100644 index 00000000..2dab5f97 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRCCachedWebRequest.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections; +using System.IO; +using System.Security.Cryptography; +using System.Text; +using UnityEngine; +using UnityEngine.Networking; + +public static class VRCCachedWebRequest +{ + private const float DefaultCacheTimeHours = 24 * 7; + + public static void ClearOld(float cacheLimitHours = DefaultCacheTimeHours) + { + string cacheDir = CacheDir; + if(!Directory.Exists(cacheDir)) + { + return; + } + + foreach(string fileName in Directory.GetFiles(cacheDir)) + { + if(!(GetAge(fileName) > cacheLimitHours)) + { + continue; + } + + Debug.Log($"Deleting {fileName}"); + File.Delete(fileName); + } + } + + private static string CacheDir => Application.temporaryCachePath; + + public static IEnumerator Get(string url, Action<Texture2D> onDone, float cacheLimitHours = DefaultCacheTimeHours) + { + string cacheDir = CacheDir; + if(!Directory.Exists(cacheDir)) + { + Directory.CreateDirectory(cacheDir); + } + + string hash = CreateHash(url); + string cache = cacheDir + "/www_" + hash; + + if(File.Exists(cache)) + { + // Use cached file if it exists + if(GetAge(cache) > cacheLimitHours) + { + File.Delete(cache); + } + else + { + Texture2D texture = new Texture2D(2, 2); + if(!texture.LoadImage(File.ReadAllBytes(cache))) + { + yield break; + } + + // load texture from disk and exit if we successfully read it + texture.Apply(); + onDone(texture); + } + } + + else + { + // No cached file, load it from url + using(UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url)) + { + // Wait until request and download are complete + yield return uwr.SendWebRequest(); + while(!uwr.isDone || !uwr.downloadHandler.isDone) + { + yield return null; + } + + var texture = DownloadHandlerTexture.GetContent(uwr); + + if(string.IsNullOrEmpty(uwr.error)) + { + File.WriteAllBytes(cache, uwr.downloadHandler.data); + } + + onDone(texture); + } + } + } + + private static string CreateHash(string input) + { + SHA256 hash = SHA256.Create(); + byte[] computedHash = hash.ComputeHash(Encoding.Default.GetBytes(input)); + return Uri.EscapeDataString(Convert.ToBase64String(computedHash)); + } + + private static double GetAge(string file) + { + if(!File.Exists(file)) + { + return 0; + } + + DateTime writeTime = File.GetLastWriteTimeUtc(file); + return DateTime.UtcNow.Subtract(writeTime).TotalHours; + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRCCachedWebRequest.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRCCachedWebRequest.cs.meta new file mode 100644 index 00000000..529acc63 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRCCachedWebRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d2c09d149d213846ac4bdab38be0385 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_EditorTools.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_EditorTools.cs new file mode 100644 index 00000000..50e69d6a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_EditorTools.cs @@ -0,0 +1,457 @@ +#if UNITY_EDITOR +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; +using UnityEditorInternal; +using System.Reflection; +using System; + +namespace VRC.SDKBase +{ + public static class VRC_EditorTools + { + private static LayerMask LayerMaskPopupInternal(LayerMask selectedValue, System.Func<int, string[], int> showMask) + { + string[] layerNames = InternalEditorUtility.layers; + List<int> layerNumbers = new List<int>(); + + foreach (string layer in layerNames) + layerNumbers.Add(LayerMask.NameToLayer(layer)); + + int mask = 0; + for (int idx = 0; idx < layerNumbers.Count; ++idx) + if (((1 << layerNumbers[idx]) & selectedValue.value) > 0) + mask |= (1 << idx); + + mask = showMask(mask, layerNames); + + selectedValue.value = 0; + for (int idx = 0; idx < layerNumbers.Count; ++idx) + if (((1 << idx) & mask) > 0) + selectedValue.value |= (1 << layerNumbers[idx]); + + return selectedValue; + } + + public static LayerMask LayerMaskPopup(LayerMask selectedValue, params GUILayoutOption[] options) + { + return LayerMaskPopupInternal(selectedValue, (mask, layerNames) => EditorGUILayout.MaskField(mask, layerNames, options)); + } + + public static LayerMask LayerMaskPopup(string label, LayerMask selectedValue, params GUILayoutOption[] options) + { + return LayerMaskPopupInternal(selectedValue, (mask, layerNames) => EditorGUILayout.MaskField(label, mask, layerNames, options)); + } + + public static LayerMask LayerMaskPopup(Rect rect, LayerMask selectedValue, GUIStyle style = null) + { + System.Func<int, string[], int> show = (mask, layerNames) => + { + if (style == null) + return EditorGUI.MaskField(rect, mask, layerNames); + else + return EditorGUI.MaskField(rect, mask, layerNames, style); + }; + return LayerMaskPopupInternal(selectedValue, show); + } + + public static LayerMask LayerMaskPopup(Rect rect, string label, LayerMask selectedValue, GUIStyle style = null) + { + System.Func<int, string[], int> show = (mask, layerNames) => + { + if (style == null) + return EditorGUI.MaskField(rect, label, mask, layerNames); + else + return EditorGUI.MaskField(rect, label, mask, layerNames, style); + }; + return LayerMaskPopupInternal(selectedValue, show); + } + + private static T FilteredEnumPopupInternal<T>(T selectedValue, System.Func<T, bool> predicate, System.Func<int, string[], int> showPopup, System.Func<string, string> rename) where T : struct, System.IConvertible + { + if (!typeof(T).IsEnum) + throw new System.ArgumentException(typeof(T).Name + " is not an Enum", "T"); + + T[] ary = System.Enum.GetValues(typeof(T)).Cast<T>().Where(v => predicate(v)).ToArray(); + string[] names = ary.Select(e => System.Enum.GetName(typeof(T), e)).ToArray(); + + int selectedIdx = 0; + for (; selectedIdx < ary.Length; ++selectedIdx) + if (ary[selectedIdx].Equals(selectedValue)) + break; + if (selectedIdx == ary.Length) + selectedIdx = 0; + + if (ary.Length == 0) + throw new System.ArgumentException("Predicate filtered out all options", "predicate"); + + if (rename != null) + return ary[showPopup(selectedIdx, names.Select(rename).ToArray())]; + else + return ary[showPopup(selectedIdx, names)]; + } + + private static void FilteredEnumPopupInternal<T>(SerializedProperty enumProperty, System.Func<T, bool> predicate, System.Func<int, string[], int> showPopup, System.Func<string, string> rename) where T : struct, System.IConvertible + { + string selectedName = enumProperty.enumNames[enumProperty.enumValueIndex]; + T selectedValue = FilteredEnumPopupInternal<T>((T)System.Enum.Parse(typeof(T), selectedName), predicate, showPopup, rename); + selectedName = selectedValue.ToString(); + for (int idx = 0; idx < enumProperty.enumNames.Length; ++idx) + if (enumProperty.enumNames[idx] == selectedName) + { + enumProperty.enumValueIndex = idx; + break; + } + } + + public static T FilteredEnumPopup<T>(string label, T selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, params GUILayoutOption[] options) where T : struct, System.IConvertible + { + return FilteredEnumPopupInternal(selectedValue, predicate, (selectedIdx, names) => EditorGUILayout.Popup(label, selectedIdx, names, options), rename); + } + + public static T FilteredEnumPopup<T>(T selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, params GUILayoutOption[] options) where T : struct, System.IConvertible + { + return FilteredEnumPopupInternal(selectedValue, predicate, (selectedIdx, names) => EditorGUILayout.Popup(selectedIdx, names, options), rename); + } + + public static T FilteredEnumPopup<T>(Rect rect, string label, T selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, GUIStyle style = null) where T : struct, System.IConvertible + { + System.Func<int, string[], int> show = (selectedIdx, names) => + { + if (style != null) + return EditorGUI.Popup(rect, label, selectedIdx, names, style); + else + return EditorGUI.Popup(rect, label, selectedIdx, names); + }; + return FilteredEnumPopupInternal(selectedValue, predicate, show, rename); + } + + public static T FilteredEnumPopup<T>(Rect rect, T selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, GUIStyle style = null) where T : struct, System.IConvertible + { + System.Func<int, string[], int> show = (selectedIdx, names) => + { + if (style != null) + return EditorGUI.Popup(rect, selectedIdx, names, style); + else + return EditorGUI.Popup(rect, selectedIdx, names); + }; + return FilteredEnumPopupInternal(selectedValue, predicate, show, rename); + } + + public static void FilteredEnumPopup<T>(string label, SerializedProperty selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, params GUILayoutOption[] options) where T : struct, System.IConvertible + { + FilteredEnumPopupInternal(selectedValue, predicate, (selectedIdx, names) => EditorGUILayout.Popup(label, selectedIdx, names, options), rename); + } + + public static void FilteredEnumPopup<T>(SerializedProperty selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, params GUILayoutOption[] options) where T : struct, System.IConvertible + { + FilteredEnumPopupInternal(selectedValue, predicate, (selectedIdx, names) => EditorGUILayout.Popup(selectedIdx, names, options), rename); + } + + public static void FilteredEnumPopup<T>(Rect rect, string label, SerializedProperty selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, GUIStyle style = null) where T : struct, System.IConvertible + { + System.Func<int, string[], int> show = (selectedIdx, names) => + { + if (style != null) + return EditorGUI.Popup(rect, label, selectedIdx, names, style); + else + return EditorGUI.Popup(rect, label, selectedIdx, names); + }; + FilteredEnumPopupInternal(selectedValue, predicate, show, rename); + } + + public static void FilteredEnumPopup<T>(Rect rect, SerializedProperty selectedValue, System.Func<T, bool> predicate, System.Func<string, string> rename = null, GUIStyle style = null) where T : struct, System.IConvertible + { + System.Func<int, string[], int> show = (selectedIdx, names) => + { + if (style != null) + return EditorGUI.Popup(rect, selectedIdx, names, style); + else + return EditorGUI.Popup(rect, selectedIdx, names); + }; + FilteredEnumPopupInternal(selectedValue, predicate, show, rename); + } + + private static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopupInternal(VRC.SDKBase.VRC_Trigger sourceTrigger, VRC.SDKBase.VRC_Trigger.TriggerEvent selectedValue, System.Func<int, string[], int> show) + { + if (sourceTrigger == null) + return null; + + VRC.SDKBase.VRC_Trigger.TriggerEvent[] actionsAry = sourceTrigger.Triggers.Where(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom).ToArray(); + string[] names = actionsAry.Select(t => t.Name).ToArray(); + + int selectedIdx = Math.Max(0, names.Length - 1); + if (selectedValue != null) + for (; selectedIdx > 0; --selectedIdx) + if (names[selectedIdx] == selectedValue.Name) + break; + if (actionsAry.Length == 0) + return null; + + return actionsAry[show(selectedIdx, names)]; + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(Rect rect, VRC.SDKBase.VRC_Trigger sourceTrigger, VRC.SDKBase.VRC_Trigger.TriggerEvent selectedValue, GUIStyle style = null) + { + System.Func<int, string[], int> show = (selectedIdx, names) => + { + if (style != null) + return EditorGUI.Popup(rect, selectedIdx, names, style); + else + return EditorGUI.Popup(rect, selectedIdx, names); + }; + + return CustomTriggerPopupInternal(sourceTrigger, selectedValue, show); + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(Rect rect, string label, VRC.SDKBase.VRC_Trigger sourceTrigger, VRC.SDKBase.VRC_Trigger.TriggerEvent selectedValue, GUIStyle style = null) + { + System.Func<int, string[], int> show = (selectedIdx, names) => + { + if (style != null) + return EditorGUI.Popup(rect, label, selectedIdx, names, style); + else + return EditorGUI.Popup(rect, label, selectedIdx, names); + }; + + return CustomTriggerPopupInternal(sourceTrigger, selectedValue, show); + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(VRC.SDKBase.VRC_Trigger sourceTrigger, VRC.SDKBase.VRC_Trigger.TriggerEvent selectedValue, params GUILayoutOption[] options) + { + return CustomTriggerPopupInternal(sourceTrigger, selectedValue, (selectedIdx, names) => EditorGUILayout.Popup(selectedIdx, names, options)); + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(string label, VRC.SDKBase.VRC_Trigger sourceTrigger, VRC.SDKBase.VRC_Trigger.TriggerEvent selectedValue, params GUILayoutOption[] options) + { + return CustomTriggerPopupInternal(sourceTrigger, selectedValue, (selectedIdx, names) => EditorGUILayout.Popup(label, selectedIdx, names, options)); + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(string label, VRC.SDKBase.VRC_Trigger sourceTrigger, string selectedValue, params GUILayoutOption[] options) + { + if (sourceTrigger == null) + return null; + + return CustomTriggerPopup(label, sourceTrigger, sourceTrigger.Triggers.FirstOrDefault(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom && t.Name == selectedValue), options); + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(VRC.SDKBase.VRC_Trigger sourceTrigger, string selectedValue, params GUILayoutOption[] options) + { + if (sourceTrigger == null) + return null; + + return CustomTriggerPopup(sourceTrigger, sourceTrigger.Triggers.FirstOrDefault(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom && t.Name == selectedValue), options); + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(Rect rect, VRC.SDKBase.VRC_Trigger sourceTrigger, string selectedValue, GUIStyle style = null) + { + if (sourceTrigger == null) + return null; + + return CustomTriggerPopup(rect, sourceTrigger, sourceTrigger.Triggers.FirstOrDefault(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom && t.Name == selectedValue), style); + } + + public static VRC.SDKBase.VRC_Trigger.TriggerEvent CustomTriggerPopup(Rect rect, string label, VRC.SDKBase.VRC_Trigger sourceTrigger, string selectedValue, GUIStyle style = null) + { + if (sourceTrigger == null) + return null; + + return CustomTriggerPopup(rect, label, sourceTrigger, sourceTrigger.Triggers.FirstOrDefault(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom && t.Name == selectedValue), style); + } + + private static void InternalSerializedCustomTriggerPopup(SerializedProperty triggersProperty, SerializedProperty customProperty, System.Func<int, string[], int> show, System.Action fail) + { + if (customProperty == null || (customProperty.propertyType != SerializedPropertyType.String)) + throw new ArgumentException("Expected a string for customProperty"); + if (triggersProperty == null || (!triggersProperty.isArray && triggersProperty.propertyType != SerializedPropertyType.ObjectReference)) + throw new ArgumentException("Expected an object or array for triggersProperty"); + + List<String> customNames = new List<string>(); + bool allNull = true; + + if (triggersProperty.isArray) + { + int idx; + for (idx = 0; idx < triggersProperty.arraySize; ++idx) + { + GameObject obj = triggersProperty.GetArrayElementAtIndex(idx).objectReferenceValue as GameObject; + if (obj != null) + { + customNames = obj.GetComponent<VRC.SDKBase.VRC_Trigger>().Triggers.Where(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom).Select(t => t.Name).ToList(); + allNull = false; + break; + } + } + for (; idx < triggersProperty.arraySize; ++idx) + { + GameObject obj = triggersProperty.GetArrayElementAtIndex(idx).objectReferenceValue as GameObject; + if (obj != null) + { + List<string> thisCustomNames = obj.GetComponent<VRC.SDKBase.VRC_Trigger>().Triggers.Where(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom).Select(t => t.Name).ToList(); + customNames.RemoveAll(s => thisCustomNames.Contains(s) == false); + } + } + } + else + { + GameObject obj = triggersProperty.objectReferenceValue as GameObject; + if (obj != null) + { + allNull = false; + customNames = obj.GetComponent<VRC.SDKBase.VRC_Trigger>().Triggers.Where(t => t.TriggerType == VRC.SDKBase.VRC_Trigger.TriggerType.Custom).Select(t => t.Name).ToList(); + } + } + + if (customNames.Count == 0 && !allNull && triggersProperty.isArray) + { + fail(); + customProperty.stringValue = ""; + } + else + { + if (customNames.Count == 0) + customNames.Add(""); + + int selectedIdx = Math.Max(0, customNames.Count - 1); + if (!string.IsNullOrEmpty(customProperty.stringValue)) + for (; selectedIdx > 0; --selectedIdx) + if (customNames[selectedIdx] == customProperty.stringValue) + break; + + selectedIdx = show(selectedIdx, customNames.ToArray()); + customProperty.stringValue = customNames[selectedIdx]; + } + } + + public static void CustomTriggerPopup(string label, SerializedProperty triggersProperty, SerializedProperty customProperty, params GUILayoutOption[] options) + { + InternalSerializedCustomTriggerPopup(triggersProperty, customProperty, (idx, names) => EditorGUILayout.Popup(label, idx, names, options), () => EditorGUILayout.HelpBox("Receivers do not have Custom Triggers which share names.", MessageType.Warning)); + } + + public static void CustomTriggerPopup(SerializedProperty triggersProperty, SerializedProperty customProperty, params GUILayoutOption[] options) + { + InternalSerializedCustomTriggerPopup(triggersProperty, customProperty, (idx, names) => EditorGUILayout.Popup(idx, names, options), () => EditorGUILayout.HelpBox("Receivers do not have Custom Triggers which share names.", MessageType.Warning)); + } + + public static void CustomTriggerPopup(Rect rect, SerializedProperty triggersProperty, SerializedProperty customProperty, GUIStyle style = null) + { + InternalSerializedCustomTriggerPopup(triggersProperty, customProperty, (idx, names) => style == null ? EditorGUI.Popup(rect, idx, names) : EditorGUI.Popup(rect, idx, names, style), () => EditorGUI.HelpBox(rect, "Receivers do not have Custom Triggers which share names.", MessageType.Warning)); + } + + public static void CustomTriggerPopup(Rect rect, string label, SerializedProperty triggersProperty, SerializedProperty customProperty, GUIStyle style = null) + { + InternalSerializedCustomTriggerPopup(triggersProperty, customProperty, (idx, names) => style == null ? EditorGUI.Popup(rect, label, idx, names) : EditorGUI.Popup(rect, label, idx, names, style), () => EditorGUI.HelpBox(rect, "Receivers do not have Custom Triggers which share names.", MessageType.Warning)); + } + + public static void DrawTriggerActionCallback(string actionLabel, VRC.SDKBase.VRC_Trigger trigger, VRC.SDKBase.VRC_EventHandler.VrcEvent e) + { + VRC.SDKBase.VRC_Trigger.TriggerEvent triggerEvent = VRC_EditorTools.CustomTriggerPopup(actionLabel, trigger, e.ParameterString); + e.ParameterString = triggerEvent == null ? null : triggerEvent.Name; + } + + public static Dictionary<string, List<MethodInfo>> GetSharedAccessibleMethodsOnGameObjects(SerializedProperty objectsProperty) + { + Dictionary<string, List<MethodInfo>> methods = new Dictionary<string, List<MethodInfo>>(); + + int idx = 0; + for (; idx < objectsProperty.arraySize; ++idx) + { + SerializedProperty prop = objectsProperty.GetArrayElementAtIndex(idx); + GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; + if (obj != null) + { + methods = VRC_EditorTools.GetAccessibleMethodsOnGameObject(obj); + break; + } + } + List<string> toRemove = new List<string>(); + for (; idx < objectsProperty.arraySize; ++idx) + { + SerializedProperty prop = objectsProperty.GetArrayElementAtIndex(idx); + GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; + if (obj != null) + { + Dictionary<string, List<MethodInfo>> thisObjMethods = VRC_EditorTools.GetAccessibleMethodsOnGameObject(obj); + foreach (string className in methods.Keys.Where(s => thisObjMethods.Keys.Contains(s) == false)) + toRemove.Add(className); + } + } + + foreach (string className in toRemove) + methods.Remove(className); + + return methods; + } + + public static Dictionary<string, List<MethodInfo>> GetAccessibleMethodsOnGameObject(GameObject go) + { + Dictionary<string, List<MethodInfo>> methods = new Dictionary<string, List<MethodInfo>>(); + if (go == null) + return methods; + + Component[] cs = go.GetComponents<Component>(); + if (cs == null) + return methods; + + foreach (Component c in cs.Where(co => co != null)) + { + Type t = c.GetType(); + + if (methods.ContainsKey(t.Name)) + continue; + + // if component is the eventhandler + if (t == typeof(VRC.SDKBase.VRC_EventHandler)) + continue; + + List<MethodInfo> l = GetAccessibleMethodsForClass(t); + methods.Add(t.Name, l); + } + + return methods; + } + + public static List<MethodInfo> GetAccessibleMethodsForClass(Type t) + { + // Get the public methods. + MethodInfo[] myArrayMethodInfo = t.GetMethods(BindingFlags.Public | BindingFlags.Instance); + List<MethodInfo> methods = new List<MethodInfo>(); + + // if component is in UnityEngine namespace, skip it + if (!string.IsNullOrEmpty(t.Namespace) && (t.Namespace.Contains("UnityEngine") || t.Namespace.Contains("UnityEditor"))) + return methods; + + bool isVRCSDK2 = !string.IsNullOrEmpty(t.Namespace) && t.Namespace.Contains("VRCSDK2"); + + // Display information for all methods. + for (int i = 0; i < myArrayMethodInfo.Length; i++) + { + MethodInfo myMethodInfo = (MethodInfo)myArrayMethodInfo[i]; + + // if it's VRCSDK2, require RPC + if (isVRCSDK2 && myMethodInfo.GetCustomAttributes(typeof(VRC.SDKBase.RPC), true).Length == 0) + continue; + + methods.Add(myMethodInfo); + } + return methods; + } + + public static byte[] ReadBytesFromProperty(SerializedProperty property) + { + byte[] bytes = new byte[property.arraySize]; + for (int idx = 0; idx < property.arraySize; ++idx) + bytes[idx] = (byte)property.GetArrayElementAtIndex(idx).intValue; + return bytes; + } + + public static void WriteBytesToProperty(SerializedProperty property, byte[] bytes) + { + property.arraySize = bytes != null ? bytes.Length : 0; + for (int idx = 0; idx < property.arraySize; ++idx) + property.GetArrayElementAtIndex(idx).intValue = (int)bytes[idx]; + } + } +} +#endif
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_EditorTools.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_EditorTools.cs.meta new file mode 100644 index 00000000..95b84813 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_EditorTools.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cb5d1f9882b08564cae97b2b14ad4e8f +timeCreated: 1474562948 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_SdkSplashScreen.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_SdkSplashScreen.cs new file mode 100644 index 00000000..8f80c939 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_SdkSplashScreen.cs @@ -0,0 +1,265 @@ +#define COMMUNITY_LABS_SDK + +using UnityEngine; +using UnityEditor; + +namespace VRCSDK2 +{ + [InitializeOnLoad] + public class VRC_SdkSplashScreen : EditorWindow + { + + static VRC_SdkSplashScreen() + { + EditorApplication.update -= DoSplashScreen; + EditorApplication.update += DoSplashScreen; + } + + private static void DoSplashScreen() + { + EditorApplication.update -= DoSplashScreen; + if (EditorApplication.isPlaying) + return; + + #if UDON + if (!EditorPrefs.GetBool("VRCSDK_ShowedSplashScreenFirstTime", false)) + { + OpenSplashScreen(); + EditorPrefs.SetBool("VRCSDK_ShowedSplashScreenFirstTime", true); + } + else + #endif + if (EditorPrefs.GetBool("VRCSDK_ShowSplashScreen", true)) + OpenSplashScreen(); + } + + private static GUIStyle vrcSdkHeader; + private static GUIStyle vrcSdkBottomHeader; + private static GUIStyle vrcHeaderLearnMoreButton; + private static GUIStyle vrcBottomHeaderLearnMoreButton; + private static Vector2 changeLogScroll; + [MenuItem("VRChat SDK/Splash Screen", false, 500)] + public static void OpenSplashScreen() + { + GetWindow<VRC_SdkSplashScreen>(true); + } + + public static void Open() + { + OpenSplashScreen(); + } + + public void OnEnable() + { + titleContent = new GUIContent("VRChat SDK"); + +#if UDON + maxSize = new Vector2(400, 360); +#else + maxSize = new Vector2(400, 600); +#endif + minSize = maxSize; + + vrcSdkHeader = new GUIStyle + { + normal = + { +#if UDON + background = Resources.Load("vrcSdkSplashUdon1") as Texture2D, +#elif COMMUNITY_LABS_SDK + background = Resources.Load("vrcSdkHeaderWithCommunityLabs") as Texture2D, +#else + background = Resources.Load("vrcSdkHeader") as Texture2D, +#endif + textColor = Color.white + }, + fixedHeight = 200 + }; + + vrcSdkBottomHeader = new GUIStyle + { + normal = + { +#if UDON + background = Resources.Load("vrcSdkSplashUdon2") as Texture2D, +#else + background = Resources.Load("vrcSdkBottomHeader") as Texture2D, +#endif + + textColor = Color.white + }, + fixedHeight = 100 + }; + + } + + public void OnGUI() + { + GUILayout.Box("", vrcSdkHeader); + + vrcHeaderLearnMoreButton = EditorStyles.miniButton; + vrcHeaderLearnMoreButton.normal.textColor = Color.black; + vrcHeaderLearnMoreButton.fontSize = 12; + vrcHeaderLearnMoreButton.border = new RectOffset(10, 10, 10, 10); + Texture2D texture = UnityEditor.AssetDatabase.GetBuiltinExtraResource<Texture2D>("UI/Skin/UISprite.psd"); + vrcHeaderLearnMoreButton.normal.background = texture; + vrcHeaderLearnMoreButton.active.background = texture; +#if UDON + if (GUI.Button(new Rect(20, 165, 185, 25), "Get Started with Udon", vrcHeaderLearnMoreButton)) + Application.OpenURL("https://docs.vrchat.com/docs/getting-started-with-udon"); +#elif COMMUNITY_LABS_SDK + if (GUI.Button(new Rect(20, 140, 180, 40), "Please Read", vrcHeaderLearnMoreButton)) + Application.OpenURL(CommunityLabsConstants.COMMUNITY_LABS_DOCUMENTATION_URL); +#endif + +#if !UDON + GUILayout.Space(4); + GUILayout.BeginHorizontal(); + GUI.backgroundColor = Color.gray; + if (GUILayout.Button("SDK Docs")) + { + Application.OpenURL("https://docs.vrchat.com/"); + } + if (GUILayout.Button("VRChat FAQ")) + { + Application.OpenURL("https://vrchat.com/developer-faq"); + } + if (GUILayout.Button("Help Center")) + { + Application.OpenURL("http://help.vrchat.com"); + } + if(GUILayout.Button("Examples")) + { + Application.OpenURL("https://docs.vrchat.com/docs/vrchat-kits"); + } + GUI.backgroundColor = Color.white; + GUILayout.EndHorizontal(); +#endif + GUILayout.Space(4); + GUILayout.BeginHorizontal(); + + GUI.backgroundColor = Color.gray; +#if UDON + + if(GUILayout.Button("Udon Examples")) + { + Application.OpenURL("https://docs.vrchat.com/docs/examples#udon--sdk3"); + }; +#endif + if (GUILayout.Button("Building VRChat Quest Content")) + { + Application.OpenURL("https://docs.vrchat.com/docs/creating-content-for-the-oculus-quest"); + } + GUI.backgroundColor = Color.white; + GUILayout.EndHorizontal(); + GUILayout.Space(2); +#if !UDON + changeLogScroll = GUILayout.BeginScrollView(changeLogScroll, false, false, GUIStyle.none, GUI.skin.verticalScrollbar, GUILayout.Width(395)); + + GUILayout.Label( + @"Changelog: +2019.2.4-SDK1 +- Removed upload-preventing polygon limits for avatars in SDK. +- This does not change behavior in the client. Although +you can upload content that goes beyond client limits +(for example, the Quest polygon limit), it will not render +in VRChat according to the Minimum Performance Rank setting + +2019.2.4 +- Implemented Quest Avatar limits. If your avatar is +ranked as Very Poor, you will not be able to upload +the avatar. +- If you do upload an avatar beyond the Very Poor +limits, it will not render in VRChat Quest regardless + +2019.2.3 +- Added a VRChat/Mobile/Standard Lite for use on +Oculus Quest avatars +- Standard Lite offers slots for Diffuse, Normal maps, +Metallic+Smoothness maps, and optional Emission maps +- Standard Lite uses a simplified version of BRDF for +lighting + +2019.2.2 +- Added links to the splash screen leading users to our +Quest documentation +- Added Quest shaders to SDK, available under the VRChat +category +- Quest will only support these shaders on avatars. If +you use any other shader, you'll get a warning in the +SDK. If you try to use the shader anyways, it will +fail to load in the client. You can read more about +these shaders in our documentation +- Added warnings when attempting to use unsupported +shaders on Quest +- Added errors when you attempt to upload content +too large for Quest (50mb for worlds, 10mb for +avatars). Build size is determined after package is +created. This will also be enforced in-client for Quest + +2019.1.4p2 +- Fixed an issue causing redundant error messaging when +informing the user that there are objects that share the +same path + +2019.1.4 +- Some additional tooltips in VRC_Mirror inspector for +clarity +- Added a field for a custom shader on mirrors, allowing +the mirror shader to be overridden without the need to +swap materials +using an animator +- Added a drop-down option for mirrors allowing for the +setting of lower fixed resolutions + +2019.1.3 +- Implemented features to enable usage of Community Labs + - Added Community Labs checkbox in the Publish World +screen +- Publishing a world no longer changes its release status. +If you update a Public World, it now remains public +- Changed and updated SDK UI in some places +- Mirrors should now display properly in the editor as +we've moved the necessary shader into place + +2019.1.1 +- Content Manager now behaves better when resizing +the window and scales the contents appropriately" + ); + GUILayout.EndScrollView(); +#endif + GUILayout.Space(4); + + GUILayout.Box("", vrcSdkBottomHeader); + vrcBottomHeaderLearnMoreButton = EditorStyles.miniButton; + vrcBottomHeaderLearnMoreButton.normal.textColor = Color.black; + vrcBottomHeaderLearnMoreButton.fontSize = 10; + vrcBottomHeaderLearnMoreButton.border = new RectOffset(10, 10, 10, 10); + vrcBottomHeaderLearnMoreButton.normal.background = texture; + vrcBottomHeaderLearnMoreButton.active.background = texture; + +#if UDON + if (GUI.Button(new Rect(100, 270, 200, 60), "Join other Creators in our Discord", vrcBottomHeaderLearnMoreButton)) + Application.OpenURL("https://discord.gg/vrchat"); +#else + if (GUI.Button(new Rect(110, 525, 180, 42), "Click Here to see great\nassets for VRChat creation", vrcBottomHeaderLearnMoreButton)) + Application.OpenURL("https://assetstore.unity.com/lists/vrchat-picks-125734?aid=1101l7yuQ"); +#endif + + //if (GUI.Button(new Rect(80, 540, 240, 30), "Learn how to create for VRChat Quest!", vrcBottomHeaderLearnMoreButton)) + //{ + // Application.OpenURL("https://docs.vrchat.com/docs/creating-content-for-the-oculus-quest"); + //} + + GUILayout.FlexibleSpace(); + + GUILayout.BeginHorizontal(); + + GUILayout.FlexibleSpace(); + EditorPrefs.SetBool("VRCSDK_ShowSplashScreen", GUILayout.Toggle(EditorPrefs.GetBool("VRCSDK_ShowSplashScreen"), "Show at Startup")); + + GUILayout.EndHorizontal(); + } + + } +}
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_SdkSplashScreen.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_SdkSplashScreen.cs.meta new file mode 100644 index 00000000..3a808579 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/VRC_SdkSplashScreen.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f4cf5dd705ab67149afaba40b4a8fa7e +timeCreated: 1527894587 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation.meta new file mode 100644 index 00000000..d6615491 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d16275d0b6ce73b4980115b4cebc37f6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance.meta new file mode 100644 index 00000000..8aa6ba68 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c480d6d565ff2084f9ed9c198e402924 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance/SDKPerformanceDisplay.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance/SDKPerformanceDisplay.cs new file mode 100644 index 00000000..da66c921 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance/SDKPerformanceDisplay.cs @@ -0,0 +1,965 @@ +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance +{ + public static class SDKPerformanceDisplay + { + public static void GetSDKPerformanceInfoText( + AvatarPerformanceStats perfStats, + AvatarPerformanceCategory perfCategory, + out string text, + out PerformanceInfoDisplayLevel displayLevel + ) + { + text = ""; + displayLevel = PerformanceInfoDisplayLevel.None; + + PerformanceRating rating = perfStats.GetPerformanceRatingForCategory(perfCategory); + switch(perfCategory) + { + case AvatarPerformanceCategory.Overall: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Info; + text = string.Format("Overall Performance: {0}", AvatarPerformanceStats.GetPerformanceRatingDisplayName(rating)); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Overall Performance: {0} - This avatar may not perform well on many systems." + + " See additional warnings for suggestions on how to improve performance. Click 'Avatar Optimization Tips' below for more information.", + AvatarPerformanceStats.GetPerformanceRatingDisplayName(rating) + ); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + if(VRC.ValidationHelpers.IsMobilePlatform()) + { + text = string.Format( + "Overall Performance: {0} - This avatar does not meet minimum performance requirements for VRChat. " + + "It will be blocked by default on VRChat for Quest, and will not show unless a user chooses to show your avatar." + + " See additional warnings for suggestions on how to improve performance. Click 'Avatar Optimization Tips' below for more information.", + AvatarPerformanceStats.GetPerformanceRatingDisplayName(rating)); + } + else + { + text = string.Format( + "Overall Performance: {0} - This avatar does not meet minimum performance requirements for VRChat. " + + "It may be blocked by users depending on their Performance settings." + + " See additional warnings for suggestions on how to improve performance. Click 'Avatar Optimization Tips' below for more information.", + AvatarPerformanceStats.GetPerformanceRatingDisplayName(rating)); + } + + break; + } + } + + break; + } + case AvatarPerformanceCategory.PolyCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + { + displayLevel = PerformanceInfoDisplayLevel.Info; + text = string.Format("Polygons: {0}", perfStats.polyCount); + break; + } + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Info; + text = string.Format("Polygons: {0} (Recommended: {1})", perfStats.polyCount, AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).polyCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Polygons: {0} - Please try to reduce your avatar poly count to less than {1} (Recommended: {2})", + perfStats.polyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Good).polyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).polyCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Polygons: {0} - This avatar has too many polygons. " + + (VRC.ValidationHelpers.IsMobilePlatform() + ? "It will be blocked by default on VRChat for Quest, and will not show unless a user chooses to show your avatar." + : "It may be blocked by users depending on their Performance settings.") + + " It should have less than {1}. VRChat recommends having less than {2}.", + perfStats.polyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).polyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).polyCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.AABB: + { + switch(rating) + { + case PerformanceRating.Excellent: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Bounding box (AABB) size: {0}", perfStats.aabb.GetValueOrDefault().size.ToString()); + break; + } + case PerformanceRating.Good: + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Bounding box (AABB) size: {0} (Recommended: {1})", + perfStats.aabb.GetValueOrDefault().size.ToString(), + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).aabb.size.ToString()); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "This avatar's bounding box (AABB) is too large on at least one axis. Current size: {0}, Maximum size: {1}", + perfStats.aabb.GetValueOrDefault().size.ToString(), + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).aabb.size.ToString()); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.SkinnedMeshCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Skinned Mesh Renderers: {0}", perfStats.skinnedMeshCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Skinned Mesh Renderers: {0} (Recommended: {1}) - Combine multiple skinned meshes for optimal performance.", + perfStats.skinnedMeshCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).skinnedMeshCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Skinned Mesh Renderers: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many skinned meshes." + + " Combine multiple skinned meshes for optimal performance.", + perfStats.skinnedMeshCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).skinnedMeshCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).skinnedMeshCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.MeshCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Mesh Renderers: {0}", perfStats.meshCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Mesh Renderers: {0} (Recommended: {1}) - Combine multiple meshes for optimal performance.", + perfStats.meshCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).meshCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Mesh Renderers: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many meshes. Combine multiple meshes for optimal performance.", + perfStats.meshCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).meshCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).meshCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.MaterialCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Material Slots: {0}", perfStats.materialCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Material Slots: {0} (Recommended: {1}) - Combine materials and atlas textures for optimal performance.", + perfStats.materialCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).materialCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Material Slots: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many materials. Combine materials and atlas textures for optimal performance.", + perfStats.materialCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).materialCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).materialCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.AnimatorCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Animator Count: {0}", perfStats.animatorCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Animator Count: {0} (Recommended: {1}) - Avoid using extra Animators for optimal performance.", + perfStats.animatorCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).animatorCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Animator Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many Animators. Avoid using extra Animators for optimal performance.", + perfStats.animatorCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).animatorCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).animatorCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.BoneCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Bones: {0}", perfStats.boneCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Bones: {0} (Recommended: {1}) - Reduce number of bones for optimal performance.", + perfStats.boneCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).boneCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Bones: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many bones. Reduce number of bones for optimal performance.", + perfStats.boneCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).boneCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).boneCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.LightCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Lights: {0}", perfStats.lightCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Lights: {0} (Recommended: {1}) - Avoid use of dynamic lights for optimal performance.", + perfStats.lightCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).lightCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Lights: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many dynamic lights. Avoid use of dynamic lights for optimal performance.", + perfStats.lightCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).lightCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).lightCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.ParticleSystemCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Particle Systems: {0}", perfStats.particleSystemCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Particle Systems: {0} (Recommended: {1}) - Reduce number of particle systems for better performance.", + perfStats.particleSystemCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleSystemCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Particle Systems: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many particle systems." + + " Reduce number of particle systems for better performance.", + perfStats.particleSystemCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).particleSystemCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleSystemCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.ParticleTotalCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Total Combined Max Particle Count: {0}", perfStats.particleTotalCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Total Combined Max Particle Count: {0} (Recommended: {1}) - Reduce 'Max Particles' across all particle systems for better performance.", + perfStats.particleTotalCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleTotalCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Total Combined Max Particle Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar uses too many particles." + + " Reduce 'Max Particles' across all particle systems for better performance.", + perfStats.particleTotalCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).particleTotalCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleTotalCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.ParticleMaxMeshPolyCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Mesh Particle Total Max Poly Count: {0}", perfStats.particleMaxMeshPolyCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Mesh Particle Total Max Poly Count: {0} (Recommended: {1}) - Reduce number of polygons in particle meshes, and reduce 'Max Particles' for better performance.", + perfStats.particleMaxMeshPolyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleMaxMeshPolyCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Mesh Particle Total Max Poly Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar uses too many mesh particle polygons." + + " Reduce number of polygons in particle meshes, and reduce 'Max Particles' for better performance.", + perfStats.particleMaxMeshPolyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).particleTotalCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleMaxMeshPolyCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.ParticleTrailsEnabled: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Particle Trails Enabled: {0}", perfStats.particleTrailsEnabled); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Particle Trails Enabled: {0} (Recommended: {1}) - Avoid particle trails for better performance.", + perfStats.particleTrailsEnabled, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleTrailsEnabled); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.ParticleCollisionEnabled: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Particle Collision Enabled: {0}", perfStats.particleCollisionEnabled); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Particle Collision Enabled: {0} (Recommended: {1}) - Avoid particle collision for better performance.", + perfStats.particleCollisionEnabled, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).particleCollisionEnabled); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.TrailRendererCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Trail Renderers: {0}", perfStats.trailRendererCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Trail Renderers: {0} (Recommended: {1}) - Reduce number of TrailRenderers for better performance.", + perfStats.trailRendererCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).trailRendererCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Trail Renderers: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many TrailRenderers. Reduce number of TrailRenderers for better performance.", + perfStats.trailRendererCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).trailRendererCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).trailRendererCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.LineRendererCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Line Renderers: {0}", perfStats.lineRendererCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Line Renderers: {0} (Recommended: {1}) - Reduce number of LineRenderers for better performance.", + perfStats.lineRendererCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).lineRendererCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Line Renderers: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many LineRenderers. Reduce number of LineRenderers for better performance.", + perfStats.lineRendererCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).lineRendererCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).lineRendererCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.DynamicBoneComponentCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Dynamic Bone Components: {0}", perfStats.dynamicBoneComponentCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Components: {0} (Recommended: {1}) - Reduce number of DynamicBone components for better performance.", + perfStats.dynamicBoneComponentCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneComponentCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Components: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many DynamicBone components." + + " Reduce number of DynamicBone components for better performance.", + perfStats.dynamicBoneComponentCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).dynamicBoneComponentCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneComponentCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.DynamicBoneSimulatedBoneCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Dynamic Bone Simulated Bone Count: {0}", perfStats.dynamicBoneSimulatedBoneCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Simulated Bone Count: {0} (Recommended: {1}) - " + + "Reduce number of transforms in hierarchy under DynamicBone components, or set EndLength or EndOffset to zero to reduce the number of simulated bones.", + perfStats.dynamicBoneSimulatedBoneCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneSimulatedBoneCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Simulated Bone Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many bones simulated by DynamicBone." + + " Reduce number of transforms in hierarchy under DynamicBone components, or set EndLength or EndOffset to zero to reduce the number of simulated bones.", + perfStats.dynamicBoneSimulatedBoneCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).dynamicBoneSimulatedBoneCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneSimulatedBoneCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.DynamicBoneColliderCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Dynamic Bone Collider Count: {0}", perfStats.dynamicBoneColliderCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Collider Count: {0} (Recommended: {1}) - Avoid use of DynamicBoneColliders for better performance.", + perfStats.dynamicBoneColliderCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneColliderCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Collider Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many DynamicBoneColliders." + + " Avoid use of DynamicBoneColliders for better performance.", + perfStats.dynamicBoneColliderCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).dynamicBoneColliderCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneColliderCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.DynamicBoneCollisionCheckCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Dynamic Bone Collision Check Count: {0}", perfStats.dynamicBoneCollisionCheckCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Collision Check Count: {0} (Recommended: {1}) - Avoid use of DynamicBoneColliders for better performance.", + perfStats.dynamicBoneCollisionCheckCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneCollisionCheckCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Dynamic Bone Collision Check Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many DynamicBoneColliders." + + " Avoid use of DynamicBoneColliders for better performance.", + perfStats.dynamicBoneCollisionCheckCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).dynamicBoneCollisionCheckCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).dynamicBoneCollisionCheckCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.ClothCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Cloth Component Count: {0}", perfStats.clothCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Cloth Component Count: {0} (Recommended: {1}) - Avoid use of cloth for optimal performance.", + perfStats.clothCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).clothCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Cloth Component Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many Cloth components. Avoid use of cloth for optimal performance.", + perfStats.clothCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).clothCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).clothCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.ClothMaxVertices: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Cloth Total Vertex Count: {0}", perfStats.clothMaxVertices); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Cloth Total Vertex Count: {0} (Recommended: {1}) - Reduce number of vertices in cloth meshes for improved performance.", + perfStats.clothMaxVertices, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).clothMaxVertices); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Cloth Total Vertex Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many vertices in cloth meshes." + + " Reduce number of vertices in cloth meshes for improved performance.", + perfStats.clothMaxVertices, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).clothMaxVertices, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).clothMaxVertices); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.PhysicsColliderCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Physics Collider Count: {0}", perfStats.physicsColliderCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Physics Collider Count: {0} (Recommended: {1}) - Avoid use of colliders for optimal performance.", + perfStats.physicsColliderCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).physicsColliderCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Physics Collider Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many colliders. Avoid use of colliders for optimal performance.", + perfStats.physicsColliderCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).physicsColliderCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).physicsColliderCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.PhysicsRigidbodyCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Physics Rigidbody Count: {0}", perfStats.physicsRigidbodyCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Physics Rigidbody Count: {0} (Recommended: {1}) - Avoid use of rigidbodies for optimal performance.", + perfStats.physicsRigidbodyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).physicsRigidbodyCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Physics Rigidbody Count: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many rigidbodies. Avoid use of rigidbodies for optimal performance.", + perfStats.physicsRigidbodyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).physicsRigidbodyCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).physicsRigidbodyCount); + + break; + } + } + + break; + } + case AvatarPerformanceCategory.AudioSourceCount: + { + switch(rating) + { + case PerformanceRating.Excellent: + case PerformanceRating.Good: + { + displayLevel = PerformanceInfoDisplayLevel.Verbose; + text = string.Format("Audio Sources: {0}", perfStats.audioSourceCount); + break; + } + case PerformanceRating.Medium: + case PerformanceRating.Poor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Audio Sources: {0} (Recommended: {1}) - Reduce number of audio sources for better performance.", + perfStats.audioSourceCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).audioSourceCount); + + break; + } + case PerformanceRating.VeryPoor: + { + displayLevel = PerformanceInfoDisplayLevel.Warning; + text = string.Format( + "Audio Sources: {0} (Maximum: {1}, Recommended: {2}) - This avatar has too many audio sources. Reduce number of audio sources for better performance.", + perfStats.audioSourceCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Poor).audioSourceCount, + AvatarPerformanceStats.GetStatLevelForRating(PerformanceRating.Excellent).audioSourceCount); + + break; + } + } + + break; + } + default: + { + text = ""; + displayLevel = PerformanceInfoDisplayLevel.None; + break; + } + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance/SDKPerformanceDisplay.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance/SDKPerformanceDisplay.cs.meta new file mode 100644 index 00000000..88aebe1e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Editor/Validation/Performance/SDKPerformanceDisplay.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 62d40cc4e8f8494695f0102c58b3ea60 +timeCreated: 1564166079
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials.meta new file mode 100644 index 00000000..18c759c6 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1961e3614590cc14295adc86a8757658 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.mat b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.mat new file mode 100644 index 00000000..e017ab09 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.mat @@ -0,0 +1,138 @@ +%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: BlueprintCam + m_Shader: {fileID: 10752, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: 2000 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 8400000, guid: 94b649c2bd1ac4cac95049605dc5333d, type: 2} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _SrcBlend + second: 1 + data: + first: + name: _DstBlend + second: 0 + data: + first: + name: _Cutoff + second: .5 + data: + first: + name: _Parallax + second: .0199999996 + data: + first: + name: _ZWrite + second: 1 + data: + first: + name: _Glossiness + second: .5 + data: + first: + name: _BumpScale + second: 1 + data: + first: + name: _OcclusionStrength + second: 1 + data: + first: + name: _DetailNormalMapScale + second: 1 + data: + first: + name: _UVSec + second: 0 + data: + first: + name: _Mode + second: 0 + data: + first: + name: _Metallic + second: 0 + m_Colors: + data: + first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.mat.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.mat.meta new file mode 100644 index 00000000..6909a1ba --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: da07ab9b78cb0432e95e11e2cb619ea7 +timeCreated: 1445225813 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.renderTexture b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.renderTexture new file mode 100644 index 00000000..fbdfffff --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.renderTexture @@ -0,0 +1,24 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: BlueprintCam + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_Width: 400 + m_Height: 300 + m_AntiAliasing: 1 + m_DepthFormat: 2 + m_ColorFormat: 0 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_TextureSettings: + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapMode: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.renderTexture.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.renderTexture.meta new file mode 100644 index 00000000..29529135 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/BlueprintCam.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 94b649c2bd1ac4cac95049605dc5333d +timeCreated: 1445225748 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/damageGrey.mat b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/damageGrey.mat new file mode 100644 index 00000000..b77f8c50 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/damageGrey.mat @@ -0,0 +1,73 @@ +%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: damageGrey + m_Shader: {fileID: 10723, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + 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: 2800000, guid: 3a9d01385a8b0af4880d46484c7054ce, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 8d95767408d35544c98f92ef7279b8db, 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 + - _Glossiness: 0 + - _InvFade: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/damageGrey.mat.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/damageGrey.mat.meta new file mode 100644 index 00000000..6c6aaf13 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Materials/damageGrey.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2166f6bbfce69594fad494087eca58e8 +timeCreated: 1478890084 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models.meta new file mode 100644 index 00000000..604d4df0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b6e690f6efd0254cb391a41628c8bc4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials.meta new file mode 100644 index 00000000..ab41c388 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 66f41e779635fd047a6120f8da56fb3e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials/lambert2.mat b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials/lambert2.mat new file mode 100644 index 00000000..f17e5421 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials/lambert2.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: lambert2 + 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: 0.5, g: 0.5, b: 0.5, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials/lambert2.mat.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials/lambert2.mat.meta new file mode 100644 index 00000000..da85e8b1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/Materials/lambert2.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 841c3ce718e8b61408005c1cfce6b7de +timeCreated: 1478890084 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/damageSphere.fbx b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/damageSphere.fbx Binary files differnew file mode 100644 index 00000000..fd1648c2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/damageSphere.fbx diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/damageSphere.fbx.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/damageSphere.fbx.meta new file mode 100644 index 00000000..7c2db64b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Models/damageSphere.fbx.meta @@ -0,0 +1,77 @@ +fileFormatVersion: 2 +guid: e13e96301b7c8214dac6883be5b82bfa +timeCreated: 1478890084 +licenseType: Pro +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2300000: //RootNode + 3300000: //RootNode + 4300000: damageSphere + 9500000: //RootNode + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleRotations: 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: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources.meta new file mode 100644 index 00000000..7c313ef7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0e95cfa09c23b104f9e32c3a443e7d03 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons.meta new file mode 100644 index 00000000..2525ec6e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e161742a124a5d94d99b48ef23847de7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons/SDK_Warning_Triangle_icon.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons/SDK_Warning_Triangle_icon.png Binary files differnew file mode 100644 index 00000000..accb9744 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons/SDK_Warning_Triangle_icon.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons/SDK_Warning_Triangle_icon.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons/SDK_Warning_Triangle_icon.png.meta new file mode 100644 index 00000000..d7c76b0d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/2FAIcons/SDK_Warning_Triangle_icon.png.meta @@ -0,0 +1,154 @@ +fileFormatVersion: 2 +guid: 43066d8a73c579048891e3c123e252a0 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: WebGL + 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: 7f6b62176e469f949be9e9b79373a013 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons.meta new file mode 100644 index 00000000..e69c6c30 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9563ba2f83401054688b497f4a8bef72 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/CL_Lab_Icon_256.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/CL_Lab_Icon_256.png Binary files differnew file mode 100644 index 00000000..17d1a228 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/CL_Lab_Icon_256.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/CL_Lab_Icon_256.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/CL_Lab_Icon_256.png.meta new file mode 100644 index 00000000..6fe8b2b4 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/CL_Lab_Icon_256.png.meta @@ -0,0 +1,154 @@ +fileFormatVersion: 2 +guid: f310c3dbad3125d4e8fc2e00bdc2acb4 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: WebGL + 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: 6c7cf76d4c1786f49a3ceb1031f37c7b + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/Icon_New.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/Icon_New.png Binary files differnew file mode 100644 index 00000000..9325b823 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/Icon_New.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/Icon_New.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/Icon_New.png.meta new file mode 100644 index 00000000..45e70ecd --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/CL_Icons/Icon_New.png.meta @@ -0,0 +1,154 @@ +fileFormatVersion: 2 +guid: 36349feed06587e479724a1a09c0b267 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: WebGL + 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: 7b0b16a8026d32f43b3992d38a892a83 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons.meta new file mode 100644 index 00000000..2ebb55ac --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 06310c7e9ae999f47a8c29b0e9bdf45e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons/EditorUI_Link.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons/EditorUI_Link.png Binary files differnew file mode 100644 index 00000000..345e4516 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons/EditorUI_Link.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons/EditorUI_Link.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons/EditorUI_Link.png.meta new file mode 100644 index 00000000..28a2bae3 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/EditorUI_Icons/EditorUI_Link.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 53f9c1f34eb97ec4196ff26de5e242f7 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + 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: 0 + 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: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons.meta new file mode 100644 index 00000000..d029d402 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b3526caa92c5284a817e770dcc4d672 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Good_32.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Good_32.png Binary files differnew file mode 100644 index 00000000..fd330510 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Good_32.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Good_32.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Good_32.png.meta new file mode 100644 index 00000000..3901dcb7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Good_32.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 4109d4977ddfb6548b458318e220ac70 +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: 2 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: baf621c415cae4e44a8bd5c0a5153bbb + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Great_32.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Great_32.png Binary files differnew file mode 100644 index 00000000..b245929d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Great_32.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Great_32.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Great_32.png.meta new file mode 100644 index 00000000..f491f245 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Great_32.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 644caf5607820c7418cf0d248b12f33b +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: 2 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 35821de39f3ce454cb1997a05350b1ac + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Horrible_32.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Horrible_32.png Binary files differnew file mode 100644 index 00000000..32003255 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Horrible_32.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Horrible_32.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Horrible_32.png.meta new file mode 100644 index 00000000..24cf8ee8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Horrible_32.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 2886eb1248200a94d9eaec82336fbbad +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: 2 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 19f5799c16616894fb9d40c371a3421b + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Medium_32.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Medium_32.png Binary files differnew file mode 100644 index 00000000..bc2920d8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Medium_32.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Medium_32.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Medium_32.png.meta new file mode 100644 index 00000000..34922a73 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Medium_32.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 9296abd40c7c1934cb668aae07b41c69 +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: 2 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: d22a8feddc754e04489c4b00925e38b3 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Poor_32.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Poor_32.png Binary files differnew file mode 100644 index 00000000..b6ced4ab --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Poor_32.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Poor_32.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Poor_32.png.meta new file mode 100644 index 00000000..62ef2613 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/PerformanceIcons/Perf_Poor_32.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: e561d0406779ab948b7f155498d101ee +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: 2 + 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 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 4dca2da27f51ad64d8e65a535134449f + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCCam.prefab b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCCam.prefab new file mode 100644 index 00000000..94057061 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCCam.prefab @@ -0,0 +1,94 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &167386 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 436948} + - component: {fileID: 2016482} + - component: {fileID: 12480940} + - component: {fileID: 9243104} + m_Layer: 0 + m_Name: VRCCam + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &436948 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167386} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 1.3, z: 0.8} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!20 &2016482 +Camera: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167386} + 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.01 + far clip plane: 100 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967263 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 94b649c2bd1ac4cac95049605dc5333d, type: 2} + 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!92 &9243104 +Behaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167386} + m_Enabled: 1 +--- !u!124 &12480940 +Behaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167386} + m_Enabled: 1 +--- !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: 167386} + m_IsPrefabParent: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCCam.prefab.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCCam.prefab.meta new file mode 100644 index 00000000..9adae7b3 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCCam.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: be98467dc5d3c4eb1aeef22952913b0e +timeCreated: 1445230771 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCProjectSettings.prefab b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCProjectSettings.prefab new file mode 100644 index 00000000..bb413097 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCProjectSettings.prefab @@ -0,0 +1,71 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &125948 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 474528} + - component: {fileID: 11496614} + m_Layer: 0 + m_Name: VRCProjectSettings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &474528 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125948} + 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 &11496614 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125948} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -826769915, guid: 4ecd63eff847044b68db9453ce219299, type: 3} + m_Name: + m_EditorClassIdentifier: + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - Interactive + - Player + - PlayerLocal + - Environment + - UiMenu + - Pickup + - PickupNoEnvironment + - StereoLeft + - StereoRight + - Walkthrough + - MirrorReflection + - reserved2 + - reserved3 + - reserved4 + numLayers: 22 + layerCollisionArr: 01010101010001010101010100010001010101010101010101010101010101010101010101000101010101010001000101010101010101010101010101010101010101010100010101010101000100010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000101010101010001000101010101010101010101010101010101000000010000010100000000000000000000000000000000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100010101010101000100010101010101010101010101010101010101010101010001010100000100000000000001010101000101010101010101010101010101000101010000010000000000000101010100010101010101010101010101010100010101010101000100010101010101010101010101010101010100000001000001010000000000000000000000000000000000000000000000000101010101000101010000010001010101010000000001010101010101010101000000010000010100000000000100000000000000000101010101010101010101010101010001010100000100010001010101010101000000000000000000000101010101000101010000010001000101010101010100000000000000000000010101010100010101000001000100010101010101010101010101010101010101010101010001010101010100000001010101010101010101010101010101010101010101000101010101010000000101010101010101010101010101010101010101010100010101010101000000010101010101010101010101010101010101010101010001010101010100000001010101010101010101010101010101010101010101000101010000010001010000010101010100010101010101010101010101010100010101010101000101000001010101010101010101010101010101010101010001010101010100010100000101010101010101010101010101010101010101000101010101010001010000010101010101010101010101010101010101010100010101010101000101000001010101010101010101010101010101010101010001010101010100010100000101010101010101010101010101010101010101000101010101010001010000010101010101010101010101010101010101010100010101010101000101000001010101010101010101010101010101010101010001010101010100010100000101010101010101010101010101010101010101000101010101010001010000010101010101010101010101010101 + queriesHitTriggers: 0 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCProjectSettings.prefab.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCProjectSettings.prefab.meta new file mode 100644 index 00000000..cef6ed2e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCProjectSettings.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dce0dda226bd1f147a34f9b4660f5992 +timeCreated: 1469565980 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKAvatar.prefab b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKAvatar.prefab new file mode 100644 index 00000000..3231f63a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKAvatar.prefab @@ -0,0 +1,6188 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &101506 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22453716} + - component: {fileID: 22262882} + - component: {fileID: 11487388} + m_Layer: 5 + m_Name: WaitingPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &22453716 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101506} + 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: 22490930} + - {fileID: 22496752} + m_Father: {fileID: 22421576} + 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.000061035156} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22262882 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101506} + m_CullTransparentMesh: 0 +--- !u!114 &11487388 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101506} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &102674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22496752} + - component: {fileID: 22286842} + - component: {fileID: 11436170} + m_Layer: 5 + m_Name: Instructions Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22496752 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102674} + 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: 22453716} + 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: -12} + m_SizeDelta: {x: 377, y: 96} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22286842 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102674} + m_CullTransparentMesh: 0 +--- !u!114 &11436170 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102674} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Pulling the latest changes for your user profile. This should only take + a few seconds. +--- !u!1 &104178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22448628} + - component: {fileID: 22254594} + - component: {fileID: 11419312} + m_Layer: 5 + m_Name: Sharing + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22448628 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104178} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2915254170551827166} + 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: 5.395752, y: -3.6516724} + m_SizeDelta: {x: 139, y: 19.351} + m_Pivot: {x: 0, y: 1} +--- !u!222 &22254594 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104178} + m_CullTransparentMesh: 0 +--- !u!114 &11419312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + 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: <b>Sharing</b> +--- !u!1 &105498 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22418210} + - component: {fileID: 11410624} + m_Layer: 5 + m_Name: ToggleOtherNSFW + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22418210 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105498} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22427500} + - {fileID: 22424584} + m_Father: {fileID: 1429250489926043145} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.20288, y: -42.99965} + m_SizeDelta: {x: 87.6, y: 20} + m_Pivot: {x: 0, y: 1} +--- !u!114 &11410624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105498} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11464384} + toggleTransition: 1 + graphic: {fileID: 11431262} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &107522 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22459454} + - component: {fileID: 22206444} + - component: {fileID: 11402610} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22459454 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 107522} + 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: 22414506} + 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: 8.064995, y: -1.8100014} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22206444 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 107522} + m_CullTransparentMesh: 0 +--- !u!114 &11402610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 107522} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Nudity/Sexuality +--- !u!1 &108774 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22468808} + - component: {fileID: 22260516} + - component: {fileID: 11498064} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22468808 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108774} + 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: 22496488} + m_Father: {fileID: 22428200} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22260516 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108774} + m_CullTransparentMesh: 0 +--- !u!114 &11498064 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108774} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &109206 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487130} + - component: {fileID: 22299634} + - component: {fileID: 11494636} + m_Layer: 5 + m_Name: AvatarPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109206} + 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: 22430982} + - {fileID: 22469280} + - {fileID: 8816168464355853577} + m_Father: {fileID: 22421576} + 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: 0, y: 0.0006713867} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22299634 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109206} + m_CullTransparentMesh: 0 +--- !u!114 &11494636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &110446 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22424094} + - component: {fileID: 22211462} + - component: {fileID: 11491430} + - component: {fileID: 11455918} + m_Layer: 5 + m_Name: Name Input Field + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22424094 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + 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: 22452692} + - {fileID: 22486324} + - {fileID: 22484442} + m_Father: {fileID: 4927814703199369361} + 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: 223, y: -27.5} + m_SizeDelta: {x: 171.45, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22211462 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + m_CullTransparentMesh: 0 +--- !u!114 &11491430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &11455918 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11491430} + m_TextComponent: {fileID: 11497130} + m_Placeholder: {fileID: 11494394} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &113498 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22490930} + - component: {fileID: 22206518} + - component: {fileID: 11476206} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22490930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113498} + 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: 22453716} + 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: 84} + m_SizeDelta: {x: 372.5, y: 35.3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22206518 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113498} + m_CullTransparentMesh: 0 +--- !u!114 &11476206 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113498} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Fetching user data... +--- !u!1 &114006 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22460420} + - component: {fileID: 22269502} + - component: {fileID: 11455486} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22460420 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114006} + 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: 22472234} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22269502 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114006} + m_CullTransparentMesh: 0 +--- !u!114 &11455486 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114006} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &116654 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22492674} + - component: {fileID: 22233620} + - component: {fileID: 11432770} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22492674 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116654} + 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: 22491018} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22233620 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116654} + m_CullTransparentMesh: 0 +--- !u!114 &11432770 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116654} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &118368 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22476926} + - component: {fileID: 22227422} + - component: {fileID: 11439894} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22476926 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118368} + 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: 22499028} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22227422 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118368} + m_CullTransparentMesh: 0 +--- !u!114 &11439894 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118368} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &118826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22419236} + - component: {fileID: 22238216} + - component: {fileID: 11412892} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22419236 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118826} + 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: 22487874} + 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.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22238216 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118826} + m_CullTransparentMesh: 0 +--- !u!114 &11412892 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Describe your avatar to other users... +--- !u!1 &120598 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487874} + - component: {fileID: 22268262} + - component: {fileID: 11403538} + - component: {fileID: 11468992} + m_Layer: 5 + m_Name: Description Input Field + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487874 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.000936} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22419236} + - {fileID: 22472220} + m_Father: {fileID: 22491596} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 8, y: -26.058} + m_SizeDelta: {x: 314, y: 42.300003} + m_Pivot: {x: 0, y: 1} +--- !u!222 &22268262 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_CullTransparentMesh: 0 +--- !u!114 &11403538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &11468992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11403538} + m_TextComponent: {fileID: 11451624} + m_Placeholder: {fileID: 11412892} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &120724 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22479512} + - component: {fileID: 22230008} + - component: {fileID: 11434648} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22479512 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120724} + 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: 22490118} + 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: 8.064999, y: -1.8100014} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22230008 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120724} + m_CullTransparentMesh: 0 +--- !u!114 &11434648 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Realistic Violence +--- !u!1 &122736 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22495880} + - component: {fileID: 22251888} + - component: {fileID: 11439916} + m_Layer: 5 + m_Name: DownloadedImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22495880 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122736} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.0008068085} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 22493504} + 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: -10, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22251888 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122736} + m_CullTransparentMesh: 0 +--- !u!114 &11439916 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!1 &124112 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22472220} + - component: {fileID: 22270328} + - component: {fileID: 11451624} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22472220 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 124112} + 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: 22487874} + 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: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22270328 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 124112} + m_CullTransparentMesh: 0 +--- !u!114 &11451624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 124112} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &126456 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22421576} + - component: {fileID: 22322114} + - component: {fileID: 11488136} + - component: {fileID: 11475592} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22421576 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 22453716} + - {fileID: 22487130} + - {fileID: 22451706} + m_Father: {fileID: 489650} + 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: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &22322114 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + 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!114 &11488136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!114 &11475592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!1 &126544 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22426144} + - component: {fileID: 22253160} + - component: {fileID: 11447186} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22426144 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126544} + 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: 22487030} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22253160 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126544} + m_CullTransparentMesh: 0 +--- !u!114 &11447186 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126544} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Public +--- !u!1 &127532 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22454648} + - component: {fileID: 22249484} + - component: {fileID: 11431262} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22454648 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127532} + 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: 22427500} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22249484 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127532} + m_CullTransparentMesh: 0 +--- !u!114 &11431262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127532} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &130058 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22490118} + - component: {fileID: 11424500} + m_Layer: 5 + m_Name: ToggleViolence + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22490118 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130058} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22491018} + - {fileID: 22479512} + m_Father: {fileID: 1429250489926043145} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 5.8497314, y: -42.99965} + m_SizeDelta: {x: 122.35, y: 20} + m_Pivot: {x: 0, y: 1} +--- !u!114 &11424500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130058} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11484944} + toggleTransition: 1 + graphic: {fileID: 11432770} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &130828 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22438938} + - component: {fileID: 22253718} + - component: {fileID: 11414970} + - component: {fileID: 11410872} + m_Layer: 5 + m_Name: UploadButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22438938 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + 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: 22435636} + m_Father: {fileID: 355522866781571698} + m_RootOrder: 1 + 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.0021209717, y: -72.4} + m_SizeDelta: {x: 200, y: 30} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &22253718 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + m_CullTransparentMesh: 0 +--- !u!114 &11414970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &11410872 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 11414970} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &137154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22486974} + - component: {fileID: 22251420} + - component: {fileID: 11422078} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22486974 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137154} + 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: 22471816} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22251420 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137154} + m_CullTransparentMesh: 0 +--- !u!114 &11422078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &143916 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22491018} + - component: {fileID: 22257412} + - component: {fileID: 11484944} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22491018 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143916} + 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: 22492674} + m_Father: {fileID: 22490118} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22257412 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143916} + m_CullTransparentMesh: 0 +--- !u!114 &11484944 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &144826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487030} + - component: {fileID: 11413372} + m_Layer: 5 + m_Name: RadioPublic + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487030 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144826} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 0.99997914, y: 0.99997914, z: 0.99997914} + m_Children: + - {fileID: 22471816} + - {fileID: 22426144} + m_Father: {fileID: 224783621249996776} + m_RootOrder: 1 + 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: 3.128502, y: -30.002} + m_SizeDelta: {x: 122.31, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11413372 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11407148} + toggleTransition: 1 + graphic: {fileID: 11422078} + m_Group: {fileID: 114099288769022120} + onValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_MethodName: + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_IsOn: 0 +--- !u!1 &147400 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22430982} + - component: {fileID: 22267868} + - component: {fileID: 11452970} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22430982 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 147400} + 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: 22487130} + 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.00054169, y: -35} + m_SizeDelta: {x: 682.4, y: 35.331} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22267868 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 147400} + m_CullTransparentMesh: 0 +--- !u!114 &11452970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 147400} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: New Avatar Creation +--- !u!1 &151154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22408842} + - component: {fileID: 22226632} + - component: {fileID: 11465176} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22408842 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151154} + 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: 22438098} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22226632 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151154} + m_CullTransparentMesh: 0 +--- !u!114 &11465176 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &151922 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22481592} + - component: {fileID: 22299796} + - component: {fileID: 11440936} + m_Layer: 5 + m_Name: Message Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22481592 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151922} + 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: 22451706} + 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: -3.0000076, y: -49} + m_SizeDelta: {x: 571, y: 169} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22299796 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151922} + m_CullTransparentMesh: 0 +--- !u!114 &11440936 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151922} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'The signed in account does not have acces to the blueprint associated + with your VRC_Avatar(or Scene)Descriptor. + + + Please sign in with the correct + account or detach the Blueprint ID (accessible on the VRC_PipelineManager) associated + with the descriptor.' +--- !u!1 &153164 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22424074} + - component: {fileID: 22210774} + - component: {fileID: 11450568} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22424074 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153164} + 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: 22493504} + 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: -102.9} + m_SizeDelta: {x: 236.9, y: 45.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22210774 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153164} + m_CullTransparentMesh: 0 +--- !u!114 &11450568 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Move the VRCCam to your preferred position for the preview image. +--- !u!1 &155990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22427500} + - component: {fileID: 22286186} + - component: {fileID: 11464384} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22427500 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155990} + 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: 22454648} + m_Father: {fileID: 22418210} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22286186 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155990} + m_CullTransparentMesh: 0 +--- !u!114 &11464384 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &156682 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22461880} + - component: {fileID: 22283940} + - component: {fileID: 11447112} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22461880 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 156682} + 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: 22428200} + 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: 8.064999, y: -1.8100014} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22283940 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 156682} + m_CullTransparentMesh: 0 +--- !u!114 &11447112 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 156682} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Blood/Gore +--- !u!1 &161276 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22472234} + - component: {fileID: 22232096} + - component: {fileID: 11432540} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22472234 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161276} + 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: 22460420} + m_Father: {fileID: 22414506} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22232096 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161276} + m_CullTransparentMesh: 0 +--- !u!114 &11432540 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161276} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &162430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22496488} + - component: {fileID: 22259696} + - component: {fileID: 11490126} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22496488 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162430} + 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: 22468808} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22259696 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162430} + m_CullTransparentMesh: 0 +--- !u!114 &11490126 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &163744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22463280} + - component: {fileID: 22258752} + - component: {fileID: 11448094} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22463280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163744} + 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: 22450530} + 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: 13.600006, y: -0.5} + m_SizeDelta: {x: -37.3, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22258752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163744} + m_CullTransparentMesh: 0 +--- !u!114 &11448094 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + 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: The above information is accurate and I have the rights to upload this + content to VRChat. +--- !u!1 &165964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 496812} + - component: {fileID: 11451840} + - component: {fileID: 11412050} + m_Layer: 0 + m_Name: VRCSDKAvatar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &496812 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165964} + 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: 489650} + - {fileID: 271733544967300250} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &11451840 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1634753351, guid: 4ecd63eff847044b68db9453ce219299, type: 3} + m_Name: + m_EditorClassIdentifier: + resWidth: 1200 + resHeight: 900 + shotCamera: {fileID: 0} +--- !u!114 &11412050 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1e5ebf65c5dceeb4c909aa7812bd2999, type: 3} + m_Name: + m_EditorClassIdentifier: + pipelineManager: {fileID: 0} + waitingPanel: {fileID: 101506} + blueprintPanel: {fileID: 109206} + errorPanel: {fileID: 171326} + titleText: {fileID: 11452970} + blueprintName: {fileID: 11455918} + blueprintDescription: {fileID: 11468992} + bpImage: {fileID: 11439916} + liveBpImage: {fileID: 11492750} + shouldUpdateImageToggle: {fileID: 11432902} + contentSex: {fileID: 11403432} + contentViolence: {fileID: 11424500} + contentGore: {fileID: 11471546} + contentOther: {fileID: 11410624} + developerAvatar: {fileID: 114967376091345990} + sharePrivate: {fileID: 114834159878135836} + sharePublic: {fileID: 11413372} + tagFallback: {fileID: 5903699577361849750} + uploadButton: {fileID: 11410872} +--- !u!1 &167426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 489650} + m_Layer: 5 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &489650 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167426} + 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: 22421576} + - {fileID: 7213138078819630856} + m_Father: {fileID: 496812} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &170908 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22471816} + - component: {fileID: 22205216} + - component: {fileID: 11407148} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22471816 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170908} + 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: 22486974} + m_Father: {fileID: 22487030} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22205216 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170908} + m_CullTransparentMesh: 0 +--- !u!114 &11407148 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170908} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &171326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22451706} + - component: {fileID: 22212720} + - component: {fileID: 11448660} + m_Layer: 5 + m_Name: ErrorPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &22451706 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171326} + 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: 22498164} + - {fileID: 22481592} + m_Father: {fileID: 22421576} + 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: 0, y: -0.000061035156} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22212720 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171326} + m_CullTransparentMesh: 0 +--- !u!114 &11448660 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &171736 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22498164} + - component: {fileID: 22284274} + - component: {fileID: 11406420} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22498164 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171736} + 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: 22451706} + 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: -3, y: 84} + m_SizeDelta: {x: 571, y: 35} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22284274 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171736} + m_CullTransparentMesh: 0 +--- !u!114 &11406420 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Uh oh! Something went wrong. +--- !u!1 &172094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22467418} + - component: {fileID: 22297688} + - component: {fileID: 11474594} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22467418 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172094} + 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: 22460248} + 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: 9, y: -0.5} + m_SizeDelta: {x: -28, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22297688 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172094} + m_CullTransparentMesh: 0 +--- !u!114 &11474594 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_LineSpacing: 1 + m_Text: Upload Image +--- !u!1 &172924 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22452692} + - component: {fileID: 22268536} + - component: {fileID: 11470698} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22452692 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172924} + 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: 22424094} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -58.000008, y: -0.49864} + m_SizeDelta: {x: 101, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22268536 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172924} + m_CullTransparentMesh: 0 +--- !u!114 &11470698 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172924} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Avatar Name +--- !u!1 &174514 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22428200} + - component: {fileID: 11471546} + m_Layer: 5 + m_Name: ToggleGore + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22428200 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174514} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22468808} + - {fileID: 22461880} + m_Father: {fileID: 1429250489926043145} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.19545, y: -22.994469} + m_SizeDelta: {x: 87.6, y: 20} + m_Pivot: {x: 0, y: 1} +--- !u!114 &11471546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174514} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11498064} + toggleTransition: 1 + graphic: {fileID: 11490126} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &174636 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22491596} + - component: {fileID: 22264454} + - component: {fileID: 11486050} + m_Layer: 5 + m_Name: DescriptionBackdrop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22491596 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174636} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -9.996505} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22429304} + - {fileID: 22487874} + - {fileID: 1429250489926043145} + - {fileID: 2915254170551827166} + - {fileID: 8184591146332811178} + m_Father: {fileID: 4927814703199369361} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 25.449219, y: -46.765457} + m_SizeDelta: {x: 333.2, y: 246.2} + m_Pivot: {x: 0, y: 1} +--- !u!222 &22264454 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174636} + m_CullTransparentMesh: 0 +--- !u!114 &11486050 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174636} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.347} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &176252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22486324} + - component: {fileID: 22285162} + - component: {fileID: 11494394} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22486324 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176252} + 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: 22424094} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 85.72, y: -0.5} + m_SizeDelta: {x: 161.82, y: 17} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22285162 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176252} + m_CullTransparentMesh: 0 +--- !u!114 &11494394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + 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: Name your avatar! +--- !u!1 &183420 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22469280} + - component: {fileID: 22205582} + - component: {fileID: 11479858} + m_Layer: 5 + m_Name: Instructions Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22469280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183420} + 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: 22487130} + m_RootOrder: 1 + 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: -325.2, y: -52.666} + m_SizeDelta: {x: 650.4, y: 96} + m_Pivot: {x: 0, y: 1} +--- !u!222 &22205582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183420} + m_CullTransparentMesh: 0 +--- !u!114 &11479858 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + 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: '1. Enter a name for your avatar + + 2. Enter a description for your avatar + + 3. + Adjust the VRCCam gameobject in the scene to capture the desired preview image. + + 4. + Confirm your info and press Upload!' +--- !u!1 &183888 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22499028} + - component: {fileID: 22228300} + - component: {fileID: 11494914} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22499028 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183888} + 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: 22476926} + m_Father: {fileID: 22460248} + 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: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22228300 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183888} + m_CullTransparentMesh: 0 +--- !u!114 &11494914 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183888} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &188734 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22414506} + - component: {fileID: 11403432} + m_Layer: 5 + m_Name: ToggleSex + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22414506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188734} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22472234} + - {fileID: 22459454} + m_Father: {fileID: 1429250489926043145} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 5.8720703, y: -22.994469} + m_SizeDelta: {x: 122.3, y: 20} + m_Pivot: {x: 0, y: 1} +--- !u!114 &11403432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188734} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11432540} + toggleTransition: 1 + graphic: {fileID: 11455486} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &189400 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22460248} + - component: {fileID: 11432902} + m_Layer: 5 + m_Name: ImageUploadToggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22460248 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 189400} + 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: 22499028} + - {fileID: 22467418} + m_Father: {fileID: 789207073669774090} + 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: -4, y: 149} + m_SizeDelta: {x: 130.7, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11432902 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 189400} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 11494914} + toggleTransition: 1 + graphic: {fileID: 11439894} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &193662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22435636} + - component: {fileID: 22268752} + - component: {fileID: 11413370} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22435636 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193662} + 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: 22438938} + 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!222 &22268752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193662} + m_CullTransparentMesh: 0 +--- !u!114 &11413370 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193662} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Upload +--- !u!1 &195402 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22424584} + - component: {fileID: 22234444} + - component: {fileID: 11404358} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22424584 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195402} + 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: 22418210} + 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: 8.064999, y: -1.8100014} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22234444 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195402} + m_CullTransparentMesh: 0 +--- !u!114 &11404358 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195402} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Other NSFW +--- !u!1 &195576 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22484442} + - component: {fileID: 22280576} + - component: {fileID: 11497130} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22484442 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195576} + 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: 22424094} + 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.0062408447, y: -0.5} + m_SizeDelta: {x: -9.6268, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22280576 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195576} + m_CullTransparentMesh: 0 +--- !u!114 &11497130 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195576} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &195922 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22493504} + - component: {fileID: 22273480} + - component: {fileID: 11416048} + m_Layer: 5 + m_Name: ScreenCaptureImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22493504 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195922} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10.00259} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22424074} + - {fileID: 22487014} + - {fileID: 22495880} + m_Father: {fileID: 789207073669774090} + 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: -4, y: 51.70596} + m_SizeDelta: {x: 200, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22273480 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195922} + m_CullTransparentMesh: 0 +--- !u!114 &11416048 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195922} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.153} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &197494 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22450530} + - component: {fileID: 11491544} + m_Layer: 5 + m_Name: ToggleWarrant + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22450530 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197494} + 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: 22438098} + - {fileID: 22463280} + m_Father: {fileID: 355522866781571698} + 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.0016326904, y: -12.5} + m_SizeDelta: {x: 333.2, y: 44.6} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &11491544 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197494} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11491236} + toggleTransition: 1 + graphic: {fileID: 11465176} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 11410872} + m_MethodName: set_interactable + 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_IsOn: 0 +--- !u!1 &198080 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22438098} + - component: {fileID: 22217994} + - component: {fileID: 11491236} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22438098 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 198080} + 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: 22408842} + m_Father: {fileID: 22450530} + 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.199997, y: -17.628} + m_SizeDelta: {x: 17, y: 17} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22217994 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 198080} + m_CullTransparentMesh: 0 +--- !u!114 &11491236 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 198080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &199038 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22429304} + - component: {fileID: 22204726} + - component: {fileID: 11448800} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22429304 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199038} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 22491596} + 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: 58.498, y: -16.63} + m_SizeDelta: {x: 101, y: 18.849} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22204726 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199038} + m_CullTransparentMesh: 0 +--- !u!114 &11448800 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199038} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: <b>Description</b> +--- !u!1 &199464 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487014} + - component: {fileID: 22236308} + - component: {fileID: 11492750} + m_Layer: 5 + m_Name: LiveImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487014 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199464} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.0008068085} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 22493504} + 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: 0, y: 0} + m_SizeDelta: {x: -10, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22236308 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199464} + m_CullTransparentMesh: 0 +--- !u!114 &11492750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199464} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: da07ab9b78cb0432e95e11e2cb619ea7, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1150165278439098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224409414070554650} + - component: {fileID: 114834159878135836} + m_Layer: 5 + m_Name: RadioPrivate + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224409414070554650 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1150165278439098} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 0.99997914, y: 0.99997914, z: 0.99997914} + m_Children: + - {fileID: 224686935057798268} + - {fileID: 224397026252626120} + m_Father: {fileID: 224783621249996776} + 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: 3.1369019, y: -10.002} + m_SizeDelta: {x: 122.32, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114834159878135836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1150165278439098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114717708085256960} + toggleTransition: 1 + graphic: {fileID: 114478162951737584} + m_Group: {fileID: 114099288769022120} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1241987128978368 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224432111462723848} + - component: {fileID: 222252374333273992} + - component: {fileID: 114029730665108650} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224432111462723848 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1241987128978368} + 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: 224766902916238748} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222252374333273992 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1241987128978368} + m_CullTransparentMesh: 0 +--- !u!114 &114029730665108650 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1241987128978368} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1245883131199138 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224473490853457722} + - component: {fileID: 114967376091345990} + m_Layer: 5 + m_Name: ToggleDeveloper + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &224473490853457722 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245883131199138} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 224766902916238748} + - {fileID: 224489403646772602} + m_Father: {fileID: 2915254170551827166} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 172.4, y: -33.748} + m_SizeDelta: {x: 87.6, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114967376091345990 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245883131199138} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114572230790120168} + toggleTransition: 1 + graphic: {fileID: 114029730665108650} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &1251575947532730 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224783621249996776} + - component: {fileID: 222143581812082624} + - component: {fileID: 114099288769022120} + m_Layer: 5 + m_Name: PubPrivGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224783621249996776 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1251575947532730} + 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: 224409414070554650} + - {fileID: 22487030} + m_Father: {fileID: 2915254170551827166} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -23.002998} + m_SizeDelta: {x: 128.59, y: 44.497} + m_Pivot: {x: 0, y: 1} +--- !u!222 &222143581812082624 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1251575947532730} + m_CullTransparentMesh: 0 +--- !u!114 &114099288769022120 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1251575947532730} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2fafe2cfe61f6974895a912c3755e8f1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_AllowSwitchOff: 0 +--- !u!1 &1310872466756068 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224954057184815540} + - component: {fileID: 222646989135543262} + - component: {fileID: 114478162951737584} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224954057184815540 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1310872466756068} + 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: 224686935057798268} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222646989135543262 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1310872466756068} + m_CullTransparentMesh: 0 +--- !u!114 &114478162951737584 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1310872466756068} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1340954652522590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224686935057798268} + - component: {fileID: 222468766432627704} + - component: {fileID: 114717708085256960} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224686935057798268 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340954652522590} + 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: 224954057184815540} + m_Father: {fileID: 224409414070554650} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222468766432627704 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340954652522590} + m_CullTransparentMesh: 0 +--- !u!114 &114717708085256960 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340954652522590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1360496469885794 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224766902916238748} + - component: {fileID: 222456799799402392} + - component: {fileID: 114572230790120168} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224766902916238748 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1360496469885794} + 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: 224432111462723848} + m_Father: {fileID: 224473490853457722} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222456799799402392 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1360496469885794} + m_CullTransparentMesh: 0 +--- !u!114 &114572230790120168 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1360496469885794} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1492976870421326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224692523738355708} + - component: {fileID: 222862218682029654} + - component: {fileID: 114934272629127694} + m_Layer: 5 + m_Name: ContentWarnings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224692523738355708 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492976870421326} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1429250489926043145} + 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: 5.395752, y: -3.6516724} + m_SizeDelta: {x: 139, y: 19.351} + m_Pivot: {x: 0, y: 1} +--- !u!222 &222862218682029654 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492976870421326} + m_CullTransparentMesh: 0 +--- !u!114 &114934272629127694 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492976870421326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + 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: <b>Content Warnings</b> +--- !u!1 &1734352126078960 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224397026252626120} + - component: {fileID: 222790143132638610} + - component: {fileID: 114585340354443920} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224397026252626120 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1734352126078960} + 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: 224409414070554650} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222790143132638610 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1734352126078960} + m_CullTransparentMesh: 0 +--- !u!114 &114585340354443920 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1734352126078960} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Private +--- !u!1 &1765883088336620 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224489403646772602} + - component: {fileID: 222731090166640010} + - component: {fileID: 114402411408682102} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224489403646772602 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1765883088336620} + 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: 224473490853457722} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222731090166640010 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1765883088336620} + m_CullTransparentMesh: 0 +--- !u!114 &114402411408682102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1765883088336620} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Developer +--- !u!1 &718173877464757059 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5481567485446787297} + - component: {fileID: 7790244103301639447} + - component: {fileID: 1560912915598115914} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5481567485446787297 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718173877464757059} + 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: 4732162556140524814} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7790244103301639447 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718173877464757059} + m_CullTransparentMesh: 0 +--- !u!114 &1560912915598115914 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718173877464757059} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &1324679359523858631 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4732162556140524814} + - component: {fileID: 5903699577361849750} + m_Layer: 5 + m_Name: ToggleFallback + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4732162556140524814 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324679359523858631} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1334067987372989039} + - {fileID: 5481567485446787297} + m_Father: {fileID: 8184591146332811178} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 166.15, y: -33.003998} + m_SizeDelta: {x: 321.5, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &5903699577361849750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324679359523858631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 7363610053945505759} + toggleTransition: 1 + graphic: {fileID: 2330942944417180284} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &2107329247381563594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2915254170551827166} + - component: {fileID: 1839589424820014423} + m_Layer: 5 + m_Name: Sharing Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2915254170551827166 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107329247381563594} + 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: 22448628} + - {fileID: 224473490853457722} + - {fileID: 224783621249996776} + m_Father: {fileID: 22491596} + m_RootOrder: 3 + 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: -41.406} + m_SizeDelta: {x: 0, y: -181.92} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1839589424820014423 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107329247381563594} + m_CullTransparentMesh: 0 +--- !u!1 &2109414122816638154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5442601334693742213} + - component: {fileID: 4949780216938772833} + - component: {fileID: 5867974500396140529} + m_Layer: 5 + m_Name: Fallback + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5442601334693742213 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2109414122816638154} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10.002593} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8184591146332811178} + 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: 5.395752, y: -3.6516724} + m_SizeDelta: {x: 139, y: 19.351} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4949780216938772833 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2109414122816638154} + m_CullTransparentMesh: 0 +--- !u!114 &5867974500396140529 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2109414122816638154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + 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: <b>Crossplatform</b> +--- !u!1 &2949130253747264289 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1334067987372989039} + - component: {fileID: 7992255844010136375} + - component: {fileID: 7363610053945505759} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1334067987372989039 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2949130253747264289} + 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: 5958812037034930751} + m_Father: {fileID: 4732162556140524814} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7992255844010136375 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2949130253747264289} + m_CullTransparentMesh: 0 +--- !u!114 &7363610053945505759 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2949130253747264289} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4153567218243203912 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 789207073669774090} + - component: {fileID: 7641013228752496310} + m_Layer: 5 + m_Name: Thumbnail Section + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &789207073669774090 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4153567218243203912} + 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: 22460248} + - {fileID: 22493504} + m_Father: {fileID: 8816168464355853577} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5624597, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0.0009765625} + m_SizeDelta: {x: -0.5120001, y: 0.0019836} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &7641013228752496310 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4153567218243203912} + m_CullTransparentMesh: 0 +--- !u!1 &4540851213555860597 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8184591146332811178} + - component: {fileID: 4116315911900391806} + m_Layer: 5 + m_Name: Fallback Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &8184591146332811178 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4540851213555860597} + 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: 5442601334693742213} + - {fileID: 4732162556140524814} + m_Father: {fileID: 22491596} + m_RootOrder: 4 + 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: -96.48} + m_SizeDelta: {x: 0, y: -200.33} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4116315911900391806 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4540851213555860597} + m_CullTransparentMesh: 0 +--- !u!1 &5056753244420955025 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5958812037034930751} + - component: {fileID: 5897781320530667045} + - component: {fileID: 2330942944417180284} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5958812037034930751 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5056753244420955025} + 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: 1334067987372989039} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5897781320530667045 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5056753244420955025} + m_CullTransparentMesh: 0 +--- !u!114 &2330942944417180284 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5056753244420955025} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5066156587248360152 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1429250489926043145} + - component: {fileID: 3544560487160362335} + m_Layer: 5 + m_Name: Content Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1429250489926043145 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5066156587248360152} + 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: 224692523738355708} + - {fileID: 22414506} + - {fileID: 22490118} + - {fileID: 22428200} + - {fileID: 22418210} + m_Father: {fileID: 22491596} + 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: 22.739} + m_SizeDelta: {x: 0, y: -182.19} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3544560487160362335 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5066156587248360152} + m_CullTransparentMesh: 0 +--- !u!1 &5505165777585729944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8816168464355853577} + - component: {fileID: 7155735132007679088} + - component: {fileID: 3090693048259790443} + m_Layer: 5 + m_Name: Avatar Info Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8816168464355853577 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5505165777585729944} + 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: 789207073669774090} + - {fileID: 4927814703199369361} + m_Father: {fileID: 22487130} + 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: 1.5, y: -55.66501} + m_SizeDelta: {x: -64.9, y: -186} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7155735132007679088 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5505165777585729944} + m_CullTransparentMesh: 0 +--- !u!114 &3090693048259790443 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5505165777585729944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &6303516923191188114 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4927814703199369361} + - component: {fileID: 2658698471590132712} + m_Layer: 5 + m_Name: Settings Section + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4927814703199369361 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6303516923191188114} + 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: 22424094} + - {fileID: 22491596} + - {fileID: 355522866781571698} + m_Father: {fileID: 8816168464355853577} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.5624597, y: 1} + m_AnchoredPosition: {x: 0.30078125, y: 0} + m_SizeDelta: {x: 0.5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2658698471590132712 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6303516923191188114} + m_CullTransparentMesh: 0 +--- !u!1 &6832677529068424879 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 355522866781571698} + - component: {fileID: 2482461880778642618} + m_Layer: 5 + m_Name: Upload Section + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &355522866781571698 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6832677529068424879} + 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: 22450530} + - {fileID: 22438938} + m_Father: {fileID: 4927814703199369361} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -292.96863} + m_SizeDelta: {x: 384, y: 121} + m_Pivot: {x: 0, y: 1} +--- !u!222 &2482461880778642618 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6832677529068424879} + m_CullTransparentMesh: 0 +--- !u!1 &8319057631029531250 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7213138078819630856} + - component: {fileID: 5596853559641249901} + - component: {fileID: 1104926893031823546} + m_Layer: 5 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7213138078819630856 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8319057631029531250} + 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: 489650} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5596853559641249901 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8319057631029531250} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!114 &1104926893031823546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8319057631029531250} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, 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!1 &8636170726128255610 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 271733544967300250} + - component: {fileID: 1443952628097626346} + m_Layer: 0 + m_Name: VRCUICamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &271733544967300250 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8636170726128255610} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 10000, y: 10000, z: 10000} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 496812} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &1443952628097626346 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8636170726128255610} + 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: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 32 + 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: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKAvatar.prefab.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKAvatar.prefab.meta new file mode 100644 index 00000000..9fef5972 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKAvatar.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b14e1b78a061f8543b2f4120b5c369fa +timeCreated: 1473705286 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKWorld.prefab b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKWorld.prefab new file mode 100644 index 00000000..40d7bd42 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKWorld.prefab @@ -0,0 +1,7992 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &101506 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22453716} + - component: {fileID: 22262882} + - component: {fileID: 11487388} + m_Layer: 5 + m_Name: WaitingPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &22453716 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101506} + 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: 22490930} + - {fileID: 22496752} + m_Father: {fileID: 22421576} + 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.000061035156} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22262882 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101506} + m_CullTransparentMesh: 0 +--- !u!114 &11487388 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101506} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &102674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22496752} + - component: {fileID: 22286842} + - component: {fileID: 11436170} + m_Layer: 5 + m_Name: Instructions Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22496752 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102674} + 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: 22453716} + 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: -12} + m_SizeDelta: {x: 377, y: 96} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22286842 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102674} + m_CullTransparentMesh: 0 +--- !u!114 &11436170 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102674} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Pulling the latest changes for your user profile. This should only take + a few seconds. +--- !u!1 &104178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22448628} + - component: {fileID: 22254594} + - component: {fileID: 11419312} + m_Layer: 5 + m_Name: ContentWarnings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22448628 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104178} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 22491596} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -5, y: -70} + m_SizeDelta: {x: -22.899996, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22254594 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104178} + m_CullTransparentMesh: 0 +--- !u!114 &11419312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + 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: Content Warnings +--- !u!1 &104248 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22499354} + - component: {fileID: 22202580} + - component: {fileID: 11466538} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22499354 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104248} + 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: 22441724} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22202580 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104248} + m_CullTransparentMesh: 0 +--- !u!114 &11466538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104248} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &105498 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22418210} + - component: {fileID: 11410624} + m_Layer: 5 + m_Name: ToggleSDKExample + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22418210 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105498} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22427500} + - {fileID: 22424584} + m_Father: {fileID: 22491596} + m_RootOrder: 8 + 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: 84.8, y: -97.99707} + m_SizeDelta: {x: 101, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11410624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105498} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11464384} + toggleTransition: 1 + graphic: {fileID: 11431262} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &109206 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487130} + - component: {fileID: 22299634} + - component: {fileID: 11494636} + m_Layer: 5 + m_Name: WorldPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109206} + 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: 22430982} + - {fileID: 22469280} + - {fileID: 22460248} + - {fileID: 22493504} + - {fileID: 22424094} + - {fileID: 22451990} + - {fileID: 22491596} + - {fileID: 224237802529560364} + - {fileID: 224365754264647900} + - {fileID: 224003974963403824} + - {fileID: 22450530} + - {fileID: 224209506000875612} + - {fileID: 224913925568883582} + m_Father: {fileID: 22421576} + 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: 0, y: 0} + m_SizeDelta: {x: 0, y: -0.000026598573} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22299634 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109206} + m_CullTransparentMesh: 0 +--- !u!114 &11494636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &110446 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22424094} + - component: {fileID: 22211462} + - component: {fileID: 11491430} + - component: {fileID: 11455918} + m_Layer: 5 + m_Name: Name Input Field + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22424094 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + 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: 22486324} + - {fileID: 22484442} + - {fileID: 22452692} + m_Father: {fileID: 22487130} + m_RootOrder: 4 + 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: -79, y: 102} + m_SizeDelta: {x: 200, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22211462 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + m_CullTransparentMesh: 0 +--- !u!114 &11491430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &11455918 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110446} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11491430} + m_TextComponent: {fileID: 11497130} + m_Placeholder: {fileID: 11494394} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &111974 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 463698} + - component: {fileID: 11476802} + - component: {fileID: 11470868} + - component: {fileID: 11407838} + m_Layer: 5 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &463698 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111974} + 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: 489650} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &11476802 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111974} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!114 &11470868 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111974} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, 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 &11407838 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111974} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2d49b7c1bcd2e07499844da127be038d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ForceModuleActive: 0 +--- !u!1 &113498 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22490930} + - component: {fileID: 22206518} + - component: {fileID: 11476206} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22490930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113498} + 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: 22453716} + 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: 84} + m_SizeDelta: {x: 372.5, y: 35.3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22206518 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113498} + m_CullTransparentMesh: 0 +--- !u!114 &11476206 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113498} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Fetching user data... +--- !u!1 &114226 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22463042} + - component: {fileID: 11408614} + m_Layer: 5 + m_Name: ToggleOtherNSFW + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22463042 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114226} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22468376} + - {fileID: 22490722} + m_Father: {fileID: 22491596} + m_RootOrder: 6 + 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.00017476082, y: -98} + m_SizeDelta: {x: 101, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11408614 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114226} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11436892} + toggleTransition: 1 + graphic: {fileID: 11479550} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &114468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22490722} + - component: {fileID: 22256492} + - component: {fileID: 11428766} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22490722 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114468} + 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: 22463042} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22256492 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114468} + m_CullTransparentMesh: 0 +--- !u!114 &11428766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Other NSFW +--- !u!1 &116654 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22492674} + - component: {fileID: 22233620} + - component: {fileID: 11432770} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22492674 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116654} + 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: 22491018} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22233620 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116654} + m_CullTransparentMesh: 0 +--- !u!114 &11432770 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116654} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &118368 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22476926} + - component: {fileID: 22227422} + - component: {fileID: 11439894} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22476926 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118368} + 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: 22499028} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22227422 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118368} + m_CullTransparentMesh: 0 +--- !u!114 &11439894 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118368} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &118676 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22403286} + - component: {fileID: 22296130} + - component: {fileID: 11451980} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22403286 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118676} + 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: 22451990} + 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: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22296130 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118676} + m_CullTransparentMesh: 0 +--- !u!114 &11451980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 64 +--- !u!1 &118826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22419236} + - component: {fileID: 22238216} + - component: {fileID: 11412892} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22419236 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118826} + 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: 22487874} + 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.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22238216 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118826} + m_CullTransparentMesh: 0 +--- !u!114 &11412892 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 118826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Enter up to 5 tags (separated by a space or comma) that other users can + search for to find your world... +--- !u!1 &120598 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487874} + - component: {fileID: 22268262} + - component: {fileID: 11403538} + - component: {fileID: 11468992} + m_Layer: 5 + m_Name: Tags Input Field + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487874 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1.0000156, y: 1.0000156, z: 1.0000156} + m_Children: + - {fileID: 22419236} + - {fileID: 22472220} + m_Father: {fileID: 224365754264647900} + m_RootOrder: 1 + 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.00033569336, y: -35.8} + m_SizeDelta: {x: 314, y: 42.300003} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22268262 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_CullTransparentMesh: 0 +--- !u!114 &11403538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &11468992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120598} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11403538} + m_TextComponent: {fileID: 11451624} + m_Placeholder: {fileID: 11412892} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &120724 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22479512} + - component: {fileID: 22230008} + - component: {fileID: 11434648} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22479512 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120724} + 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: 22490118} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22230008 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120724} + m_CullTransparentMesh: 0 +--- !u!114 &11434648 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 120724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Realistic Violence +--- !u!1 &122064 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22497578} + - component: {fileID: 11467458} + m_Layer: 5 + m_Name: ToggleGore + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22497578 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122064} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22465652} + - {fileID: 22491818} + m_Father: {fileID: 22491596} + m_RootOrder: 5 + 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.00029087067, y: -84} + m_SizeDelta: {x: 101, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11467458 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122064} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11496636} + toggleTransition: 1 + graphic: {fileID: 11455342} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &122194 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22465652} + - component: {fileID: 22220888} + - component: {fileID: 11496636} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22465652 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122194} + 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: 22411296} + m_Father: {fileID: 22497578} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22220888 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122194} + m_CullTransparentMesh: 0 +--- !u!114 &11496636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122194} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &122736 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22495880} + - component: {fileID: 22251888} + - component: {fileID: 11439916} + m_Layer: 5 + m_Name: DownloadedImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22495880 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122736} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.0008068085} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 22493504} + 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: -10, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22251888 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122736} + m_CullTransparentMesh: 0 +--- !u!114 &11439916 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 122736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!1 &124112 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22472220} + - component: {fileID: 22270328} + - component: {fileID: 11451624} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22472220 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 124112} + 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: 22487874} + 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: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22270328 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 124112} + m_CullTransparentMesh: 0 +--- !u!114 &11451624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 124112} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &126456 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22421576} + - component: {fileID: 22322114} + - component: {fileID: 11488136} + - component: {fileID: 11475592} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22421576 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 22453716} + - {fileID: 22487130} + - {fileID: 22451706} + m_Father: {fileID: 489650} + 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: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &22322114 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 2016390} + 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!114 &11488136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, 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!114 &11475592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126456} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!1 &126544 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22426144} + - component: {fileID: 22253160} + - component: {fileID: 11447186} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22426144 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126544} + 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: 22487030} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22253160 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126544} + m_CullTransparentMesh: 0 +--- !u!114 &11447186 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126544} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Featured +--- !u!1 &126848 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22408262} + - component: {fileID: 22291280} + - component: {fileID: 11478514} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22408262 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126848} + 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: 22409378} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22291280 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126848} + m_CullTransparentMesh: 0 +--- !u!114 &11478514 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126848} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Nudity/Sexuality +--- !u!1 &127532 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22454648} + - component: {fileID: 22249484} + - component: {fileID: 11431262} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22454648 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127532} + 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: 22427500} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22249484 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127532} + m_CullTransparentMesh: 0 +--- !u!114 &11431262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127532} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &129088 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453312} + - component: {fileID: 2016390} + - component: {fileID: 12425760} + m_Layer: 0 + m_Name: VRCUICamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &453312 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129088} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 10000, y: 10000, z: 10000} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 496812} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &2016390 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129088} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} + 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: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 32 + 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: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!124 &12425760 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129088} + m_Enabled: 1 +--- !u!1 &130058 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22490118} + - component: {fileID: 11424500} + m_Layer: 5 + m_Name: ToggleViolence + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22490118 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130058} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22491018} + - {fileID: 22479512} + m_Father: {fileID: 22491596} + m_RootOrder: 4 + 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: -101.3, y: -98} + m_SizeDelta: {x: 107.4, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11424500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130058} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11484944} + toggleTransition: 1 + graphic: {fileID: 11432770} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &130828 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22438938} + - component: {fileID: 22253718} + - component: {fileID: 11414970} + - component: {fileID: 11410872} + m_Layer: 5 + m_Name: LearnAboutCommLabsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22438938 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.0000167, y: 1.0000167, z: 1.0000167} + m_Children: + - {fileID: 22435636} + m_Father: {fileID: 224913925568883582} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -110, y: 0} + m_SizeDelta: {x: 200, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22253718 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + m_CullTransparentMesh: 0 +--- !u!114 &11414970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &11410872 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130828} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11414970} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &136716 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22481008} + - component: {fileID: 22213130} + - component: {fileID: 11467824} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22481008 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136716} + 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: 22409732} + 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: 9, y: 0} + m_SizeDelta: {x: -28, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22213130 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136716} + m_CullTransparentMesh: 0 +--- !u!114 &11467824 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136716} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: Publish to Community Labs +--- !u!1 &137154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22486974} + - component: {fileID: 22251420} + - component: {fileID: 11422078} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22486974 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137154} + 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: 22471816} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22251420 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137154} + m_CullTransparentMesh: 0 +--- !u!114 &11422078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 137154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &142088 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22409378} + - component: {fileID: 11406064} + m_Layer: 5 + m_Name: ToggleSex + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22409378 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142088} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22441724} + - {fileID: 22408262} + m_Father: {fileID: 22491596} + m_RootOrder: 3 + 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: -101.3, y: -84} + m_SizeDelta: {x: 107.4, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11406064 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142088} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11415792} + toggleTransition: 1 + graphic: {fileID: 11466538} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &143348 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22441724} + - component: {fileID: 22218418} + - component: {fileID: 11415792} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22441724 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143348} + 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: 22499354} + m_Father: {fileID: 22409378} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22218418 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143348} + m_CullTransparentMesh: 0 +--- !u!114 &11415792 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143348} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &143916 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22491018} + - component: {fileID: 22257412} + - component: {fileID: 11484944} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22491018 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143916} + 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: 22492674} + m_Father: {fileID: 22490118} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22257412 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143916} + m_CullTransparentMesh: 0 +--- !u!114 &11484944 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &144826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487030} + - component: {fileID: 11413372} + m_Layer: 5 + m_Name: ToggleFeatured + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487030 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144826} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 22471816} + - {fileID: 22426144} + m_Father: {fileID: 22491596} + m_RootOrder: 7 + 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: 84.8, y: -83.99707} + m_SizeDelta: {x: 101, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11413372 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11407148} + toggleTransition: 1 + graphic: {fileID: 11422078} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &145350 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22491818} + - component: {fileID: 22266622} + - component: {fileID: 11430164} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22491818 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 145350} + 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: 22497578} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22266622 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 145350} + m_CullTransparentMesh: 0 +--- !u!114 &11430164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 145350} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Blood/Gore +--- !u!1 &146662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22409732} + - component: {fileID: 11405096} + m_Layer: 5 + m_Name: TogglePublishToCommunityLabs + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22409732 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 146662} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.0000168, y: 1.0000168, z: 1.0000168} + m_Children: + - {fileID: 22439134} + - {fileID: 22481008} + m_Father: {fileID: 224913925568883582} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 50, y: 0} + m_SizeDelta: {x: 322.57, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &11405096 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 146662} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11468578} + toggleTransition: 1 + graphic: {fileID: 11473836} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &147400 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22430982} + - component: {fileID: 22267868} + - component: {fileID: 11452970} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22430982 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 147400} + 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: 22487130} + 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: 55, y: 196} + m_SizeDelta: {x: 372.5, y: 35.3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22267868 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 147400} + m_CullTransparentMesh: 0 +--- !u!114 &11452970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 147400} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: New World Creation +--- !u!1 &151154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22408842} + - component: {fileID: 22226632} + - component: {fileID: 11465176} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22408842 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151154} + 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: 22438098} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22226632 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151154} + m_CullTransparentMesh: 0 +--- !u!114 &11465176 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &151922 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22481592} + - component: {fileID: 22299796} + - component: {fileID: 11440936} + m_Layer: 5 + m_Name: Message Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22481592 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151922} + 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: 22451706} + 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: -3.0000076, y: -49} + m_SizeDelta: {x: 571, y: 169} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22299796 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151922} + m_CullTransparentMesh: 0 +--- !u!114 &11440936 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 151922} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'The signed in account does not have acces to the blueprint associated + with your VRC_Avatar(or Scene)Descriptor. + + + Please sign in with the correct + account or detach the Blueprint ID (accessible on the VRC_PipelineManager) associated + with the descriptor.' +--- !u!1 &153164 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22424074} + - component: {fileID: 22210774} + - component: {fileID: 11450568} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22424074 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153164} + 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: 22493504} + 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: -102.9} + m_SizeDelta: {x: 236.9, y: 45.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22210774 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153164} + m_CullTransparentMesh: 0 +--- !u!114 &11450568 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Move the VRCCam to your preferred position for the preview image. +--- !u!1 &155990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22427500} + - component: {fileID: 22286186} + - component: {fileID: 11464384} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22427500 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155990} + 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: 22454648} + m_Father: {fileID: 22418210} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22286186 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155990} + m_CullTransparentMesh: 0 +--- !u!114 &11464384 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &157912 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22423528} + - component: {fileID: 22230676} + - component: {fileID: 11479550} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22423528 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157912} + 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: 22468376} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22230676 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157912} + m_CullTransparentMesh: 0 +--- !u!114 &11479550 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157912} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &163744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22463280} + - component: {fileID: 22258752} + - component: {fileID: 11448094} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22463280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163744} + 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: 22450530} + 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: 9, y: 0.5} + m_SizeDelta: {x: -28, y: -1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22258752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163744} + m_CullTransparentMesh: 0 +--- !u!114 &11448094 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + 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: The above information is accurate and I have the rights to upload this + content to VRChat. +--- !u!1 &165242 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22483280} + - component: {fileID: 22285758} + - component: {fileID: 11415816} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22483280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165242} + 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: 22451990} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -60, y: -0.5} + m_SizeDelta: {x: 101, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22285758 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165242} + m_CullTransparentMesh: 0 +--- !u!114 &11415816 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Player Capacity +--- !u!1 &165934 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22451990} + - component: {fileID: 22250804} + - component: {fileID: 11416788} + - component: {fileID: 11403672} + m_Layer: 5 + m_Name: Capacity Input Field + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22451990 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165934} + 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: 22471032} + - {fileID: 22403286} + - {fileID: 22483280} + m_Father: {fileID: 22487130} + m_RootOrder: 5 + 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: -79, y: 70} + m_SizeDelta: {x: 200, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22250804 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165934} + m_CullTransparentMesh: 0 +--- !u!114 &11416788 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165934} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &11403672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165934} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11416788} + m_TextComponent: {fileID: 11451980} + m_Placeholder: {fileID: 11411326} + m_ContentType: 2 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 4 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 1 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: 64 + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &165964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 496812} + - component: {fileID: 11451840} + - component: {fileID: 11489688} + m_Layer: 0 + m_Name: VRCSDKWorld + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &496812 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165964} + 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: 489650} + - {fileID: 453312} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &11451840 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1634753351, guid: 4ecd63eff847044b68db9453ce219299, type: 3} + m_Name: + m_EditorClassIdentifier: + resWidth: 1200 + resHeight: 900 + shotCamera: {fileID: 0} +--- !u!114 &11489688 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 165964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2bd5ee5d69ee0f3449bf2f81fcb7f4e3, type: 3} + m_Name: + m_EditorClassIdentifier: + pipelineManager: {fileID: 0} + waitingPanel: {fileID: 101506} + blueprintPanel: {fileID: 109206} + errorPanel: {fileID: 171326} + titleText: {fileID: 11452970} + blueprintName: {fileID: 11455918} + blueprintDescription: {fileID: 114806165407024962} + worldCapacity: {fileID: 11403672} + bpImage: {fileID: 11439916} + liveBpImage: {fileID: 11492750} + shouldUpdateImageToggle: {fileID: 11432902} + releasePublic: {fileID: 114867311168779012} + contentNsfw: {fileID: 0} + contentSex: {fileID: 11406064} + contentViolence: {fileID: 11424500} + contentGore: {fileID: 11467458} + contentOther: {fileID: 11408614} + contentFeatured: {fileID: 11413372} + contentSDKExample: {fileID: 11410624} + showInWorldsMenuGroup: {fileID: 114266014547472576} + showInActiveWorlds: {fileID: 114963158220535402} + showInPopularWorlds: {fileID: 114301999424098226} + showInNewWorlds: {fileID: 114274045118423354} + userTags: {fileID: 11468992} + uploadButton: {fileID: 114904025437279192} + openCommunityLabsDocsButton: {fileID: 11410872} + publishToCommunityLabsPanel: {fileID: 1289014466887554} +--- !u!1 &167426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 489650} + m_Layer: 5 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &489650 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167426} + 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: 22421576} + - {fileID: 463698} + m_Father: {fileID: 496812} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &167770 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22471032} + - component: {fileID: 22293836} + - component: {fileID: 11411326} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22471032 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167770} + 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: 22451990} + 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.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22293836 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167770} + m_CullTransparentMesh: 0 +--- !u!114 &11411326 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167770} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + 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: How Many People? +--- !u!1 &168688 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22411296} + - component: {fileID: 22230626} + - component: {fileID: 11455342} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22411296 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168688} + 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: 22465652} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22230626 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168688} + m_CullTransparentMesh: 0 +--- !u!114 &11455342 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168688} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &170908 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22471816} + - component: {fileID: 22205216} + - component: {fileID: 11407148} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22471816 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170908} + 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: 22486974} + m_Father: {fileID: 22487030} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22205216 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170908} + m_CullTransparentMesh: 0 +--- !u!114 &11407148 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170908} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &171326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22451706} + - component: {fileID: 22212720} + - component: {fileID: 11448660} + m_Layer: 5 + m_Name: ErrorPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &22451706 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171326} + 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: 22498164} + - {fileID: 22481592} + m_Father: {fileID: 22421576} + 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: 0, y: -0.000061035156} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22212720 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171326} + m_CullTransparentMesh: 0 +--- !u!114 &11448660 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &171736 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22498164} + - component: {fileID: 22284274} + - component: {fileID: 11406420} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22498164 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171736} + 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: 22451706} + 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: -3, y: 84} + m_SizeDelta: {x: 571, y: 35} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22284274 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171736} + m_CullTransparentMesh: 0 +--- !u!114 &11406420 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Uh oh! Something went wrong. +--- !u!1 &172094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22467418} + - component: {fileID: 22297688} + - component: {fileID: 11474594} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22467418 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172094} + 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: 22460248} + 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: 9, y: -0.5} + m_SizeDelta: {x: -28, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22297688 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172094} + m_CullTransparentMesh: 0 +--- !u!114 &11474594 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_LineSpacing: 1 + m_Text: Upload Image +--- !u!1 &172924 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22452692} + - component: {fileID: 22268536} + - component: {fileID: 11470698} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22452692 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172924} + 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: 22424094} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -60, y: -0.5} + m_SizeDelta: {x: 101, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22268536 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172924} + m_CullTransparentMesh: 0 +--- !u!114 &11470698 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 172924} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: World Name +--- !u!1 &174636 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22491596} + - component: {fileID: 22264454} + - component: {fileID: 11486050} + m_Layer: 5 + m_Name: DescriptionBackdrop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22491596 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174636} + 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: 224701047088951004} + - {fileID: 224939501917592340} + - {fileID: 22448628} + - {fileID: 22409378} + - {fileID: 22490118} + - {fileID: 22497578} + - {fileID: 22463042} + - {fileID: 22487030} + - {fileID: 22418210} + m_Father: {fileID: 22487130} + m_RootOrder: 6 + 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: -125, y: -1.04} + m_SizeDelta: {x: 323.7, y: 107} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22264454 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174636} + m_CullTransparentMesh: 0 +--- !u!114 &11486050 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174636} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.347} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &175228 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22446772} + - component: {fileID: 22209530} + - component: {fileID: 11473836} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22446772 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175228} + 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: 22439134} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22209530 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175228} + m_CullTransparentMesh: 0 +--- !u!114 &11473836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175228} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &176252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22486324} + - component: {fileID: 22285162} + - component: {fileID: 11494394} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22486324 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176252} + 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: 22424094} + 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.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22285162 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176252} + m_CullTransparentMesh: 0 +--- !u!114 &11494394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + 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: Name your world! +--- !u!1 &177538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22439134} + - component: {fileID: 22285300} + - component: {fileID: 11468578} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22439134 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 177538} + 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: 22446772} + m_Father: {fileID: 22409732} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 17, y: 17} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22285300 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 177538} + m_CullTransparentMesh: 0 +--- !u!114 &11468578 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 177538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &183420 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22469280} + - component: {fileID: 22205582} + - component: {fileID: 11479858} + m_Layer: 5 + m_Name: Instructions Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22469280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183420} + 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: 22487130} + 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: -36, y: 145} + m_SizeDelta: {x: 504.3, y: 96} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22205582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183420} + m_CullTransparentMesh: 0 +--- !u!114 &11479858 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + 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: '1. Enter a name and maximum player count for your world + + 2. Enter + a description for your world + + 3. Adjust the VRCCam gameobject in the scene + to capture the desired preview image. + + 4. Confirm your info and press Upload!' +--- !u!1 &183888 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22499028} + - component: {fileID: 22228300} + - component: {fileID: 11494914} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22499028 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183888} + 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: 22476926} + m_Father: {fileID: 22460248} + 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: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22228300 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183888} + m_CullTransparentMesh: 0 +--- !u!114 &11494914 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183888} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &189400 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22460248} + - component: {fileID: 11432902} + m_Layer: 5 + m_Name: ImageUploadToggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22460248 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 189400} + 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: 22499028} + - {fileID: 22467418} + m_Father: {fileID: 22487130} + 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: 203, y: 108} + m_SizeDelta: {x: 160, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11432902 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 189400} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 11494914} + toggleTransition: 1 + graphic: {fileID: 11439894} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &191964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22468376} + - component: {fileID: 22294808} + - component: {fileID: 11436892} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22468376 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191964} + 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: 22423528} + m_Father: {fileID: 22463042} + 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: 10, y: -10} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22294808 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191964} + m_CullTransparentMesh: 0 +--- !u!114 &11436892 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &193662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22435636} + - component: {fileID: 22268752} + - component: {fileID: 11413370} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22435636 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193662} + 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: 22438938} + 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!222 &22268752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193662} + m_CullTransparentMesh: 0 +--- !u!114 &11413370 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193662} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Learn about Community Labs +--- !u!1 &195402 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22424584} + - component: {fileID: 22234444} + - component: {fileID: 11404358} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22424584 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195402} + 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: 22418210} + 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: 8.064999, y: -1.8100004} + m_SizeDelta: {x: -26.13, y: -5.6199994} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22234444 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195402} + m_CullTransparentMesh: 0 +--- !u!114 &11404358 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195402} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: SDK Examples +--- !u!1 &195576 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22484442} + - component: {fileID: 22280576} + - component: {fileID: 11497130} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22484442 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195576} + 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: 22424094} + 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: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22280576 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195576} + m_CullTransparentMesh: 0 +--- !u!114 &11497130 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195576} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &195922 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22493504} + - component: {fileID: 22273480} + - component: {fileID: 11416048} + m_Layer: 5 + m_Name: ScreenCaptureImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22493504 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195922} + 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: 22424074} + - {fileID: 22487014} + - {fileID: 22495880} + m_Father: {fileID: 22487130} + 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: 179, y: 14} + m_SizeDelta: {x: 210, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22273480 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195922} + m_CullTransparentMesh: 0 +--- !u!114 &11416048 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 195922} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.153} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &197494 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22450530} + - component: {fileID: 11491544} + m_Layer: 5 + m_Name: ToggleWarrant + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22450530 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197494} + 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: 22438098} + - {fileID: 22463280} + m_Father: {fileID: 22487130} + m_RootOrder: 10 + 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: -129, y: -165} + m_SizeDelta: {x: 322.57, y: 26.100006} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11491544 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197494} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 11491236} + toggleTransition: 1 + graphic: {fileID: 11465176} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 114904025437279192} + m_MethodName: set_interactable + 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_IsOn: 0 +--- !u!1 &198080 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22438098} + - component: {fileID: 22217994} + - component: {fileID: 11491236} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22438098 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 198080} + 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: 22408842} + m_Father: {fileID: 22450530} + 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: 10, y: -10} + m_SizeDelta: {x: 17, y: 17} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22217994 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 198080} + m_CullTransparentMesh: 0 +--- !u!114 &11491236 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 198080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &199038 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22429304} + - component: {fileID: 22204726} + - component: {fileID: 11448800} + m_Layer: 5 + m_Name: Tags Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22429304 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199038} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1.0000156, y: 1.0000156, z: 1.0000156} + m_Children: [] + m_Father: {fileID: 224365754264647900} + 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: -9} + m_SizeDelta: {x: 500, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22204726 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199038} + m_CullTransparentMesh: 0 +--- !u!114 &11448800 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199038} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Tags +--- !u!1 &199464 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22487014} + - component: {fileID: 22236308} + - component: {fileID: 11492750} + m_Layer: 5 + m_Name: LiveImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &22487014 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199464} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.01} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 22493504} + 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: 0, y: 0} + m_SizeDelta: {x: -10, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &22236308 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199464} + m_CullTransparentMesh: 0 +--- !u!114 &11492750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 199464} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: da07ab9b78cb0432e95e11e2cb619ea7, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1110787134002876 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224563792090707174} + - component: {fileID: 222343407709141784} + - component: {fileID: 114985580786379380} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224563792090707174 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110787134002876} + 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: 224003974963403824} + 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: 9, y: 0.5} + m_SizeDelta: {x: -28, y: -1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222343407709141784 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110787134002876} + m_CullTransparentMesh: 0 +--- !u!114 &114985580786379380 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110787134002876} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + 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: Public World (Private worlds are only seen by author) +--- !u!1 &1163350460098956 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224238963257626914} + - component: {fileID: 222801312704964980} + - component: {fileID: 114038639220772638} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224238963257626914 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1163350460098956} + 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: 224662512987890222} + m_Father: {fileID: 224881636171744216} + 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: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222801312704964980 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1163350460098956} + m_CullTransparentMesh: 0 +--- !u!114 &114038639220772638 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1163350460098956} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1217951901534380 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224209506000875612} + - component: {fileID: 222923352132452458} + - component: {fileID: 114395185288059358} + - component: {fileID: 114904025437279192} + m_Layer: 5 + m_Name: UploadButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224209506000875612 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217951901534380} + 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: 224887116296390214} + m_Father: {fileID: 22487130} + m_RootOrder: 11 + 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: 180, y: -150} + m_SizeDelta: {x: 200, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222923352132452458 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217951901534380} + m_CullTransparentMesh: 0 +--- !u!114 &114395185288059358 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217951901534380} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114904025437279192 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217951901534380} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 114395185288059358} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1248836869699840 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224881636171744216} + - component: {fileID: 114963158220535402} + m_Layer: 5 + m_Name: ShowActive + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224881636171744216 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248836869699840} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.75, y: 0.75, z: 0.7} + m_Children: + - {fileID: 224238963257626914} + - {fileID: 224414781600708868} + m_Father: {fileID: 224237802529560364} + 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: 7.5, y: 0} + m_SizeDelta: {x: 100, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114963158220535402 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248836869699840} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114038639220772638} + toggleTransition: 1 + graphic: {fileID: 114425726696625912} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1289014466887554 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224913925568883582} + - component: {fileID: 222993317418629808} + - component: {fileID: 114421426614643036} + m_Layer: 5 + m_Name: PublishToCommunityLabs + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &224913925568883582 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1289014466887554} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.9999892, y: 0.9999892, z: 0.9999892} + m_Children: + - {fileID: 224405308945679254} + - {fileID: 224560161326457194} + - {fileID: 22409732} + - {fileID: 22438938} + m_Father: {fileID: 22487130} + m_RootOrder: 12 + 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.5, y: -195.6} + m_SizeDelta: {x: 576, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222993317418629808 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1289014466887554} + m_CullTransparentMesh: 0 +--- !u!114 &114421426614643036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1289014466887554} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.722} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1311164872568664 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224554182203924970} + - component: {fileID: 222038842167926006} + - component: {fileID: 114405973168686448} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224554182203924970 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1311164872568664} + 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: 224939501917592340} + 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: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222038842167926006 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1311164872568664} + m_CullTransparentMesh: 0 +--- !u!114 &114405973168686448 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1311164872568664} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &1410586910528236 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224567068193907552} + - component: {fileID: 222364253621263146} + - component: {fileID: 114131123913015884} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224567068193907552 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1410586910528236} + 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: 224924735049580200} + m_Father: {fileID: 224081522026327500} + 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: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222364253621263146 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1410586910528236} + m_CullTransparentMesh: 0 +--- !u!114 &114131123913015884 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1410586910528236} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1415241314871196 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224003974963403824} + - component: {fileID: 114867311168779012} + m_Layer: 5 + m_Name: TogglePublic + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224003974963403824 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1415241314871196} + 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: 224878089506178020} + - {fileID: 224563792090707174} + m_Father: {fileID: 22487130} + m_RootOrder: 9 + 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: -129, y: -145} + m_SizeDelta: {x: 322.57, y: 26.1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114867311168779012 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1415241314871196} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114398721189777046} + toggleTransition: 1 + graphic: {fileID: 114924332738671574} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &1435860526288850 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224389434569615672} + - component: {fileID: 222954023356271394} + - component: {fileID: 114896315027009862} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224389434569615672 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1435860526288850} + 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: 224659715462348342} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222954023356271394 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1435860526288850} + m_CullTransparentMesh: 0 +--- !u!114 &114896315027009862 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1435860526288850} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1457971847498212 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224878089506178020} + - component: {fileID: 222225249130726968} + - component: {fileID: 114398721189777046} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224878089506178020 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457971847498212} + 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: 224308997821320730} + m_Father: {fileID: 224003974963403824} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 17, y: 17} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222225249130726968 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457971847498212} + m_CullTransparentMesh: 0 +--- !u!114 &114398721189777046 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457971847498212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1512245177226388 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224914956019195300} + - component: {fileID: 222944924247789546} + - component: {fileID: 114657336810471318} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224914956019195300 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1512245177226388} + 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: 224237802529560364} + 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: -75.7, y: -2.1} + m_SizeDelta: {x: 160, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222944924247789546 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1512245177226388} + m_CullTransparentMesh: 0 +--- !u!114 &114657336810471318 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1512245177226388} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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: 0 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Show In Worlds Menu:' +--- !u!1 &1530403277137380 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224237802529560364} + - component: {fileID: 222413374675144758} + - component: {fileID: 114266014547472576} + m_Layer: 5 + m_Name: FilteringTags + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224237802529560364 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1530403277137380} + 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: 224881636171744216} + - {fileID: 224914956019195300} + - {fileID: 224144908770989872} + - {fileID: 224081522026327500} + m_Father: {fileID: 22487130} + m_RootOrder: 7 + 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: -125, y: -67} + m_SizeDelta: {x: 323.7, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222413374675144758 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1530403277137380} + m_CullTransparentMesh: 0 +--- !u!114 &114266014547472576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1530403277137380} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.297} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1546856778923102 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224144908770989872} + - component: {fileID: 114301999424098226} + m_Layer: 5 + m_Name: ShowPopular + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224144908770989872 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1546856778923102} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.0011329651} + m_LocalScale: {x: 0.7500139, y: 0.7500139, z: 0.7000129} + m_Children: + - {fileID: 224659715462348342} + - {fileID: 224714239840559184} + m_Father: {fileID: 224237802529560364} + 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: 68.1, y: -0.0009765625} + m_SizeDelta: {x: 100, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114301999424098226 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1546856778923102} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114837861664647532} + toggleTransition: 1 + graphic: {fileID: 114896315027009862} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1569549418882862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224662512987890222} + - component: {fileID: 222417229371458228} + - component: {fileID: 114425726696625912} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224662512987890222 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1569549418882862} + 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: 224238963257626914} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222417229371458228 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1569549418882862} + m_CullTransparentMesh: 0 +--- !u!114 &114425726696625912 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1569549418882862} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1588312817834600 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224308997821320730} + - component: {fileID: 222151007828074154} + - component: {fileID: 114924332738671574} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224308997821320730 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1588312817834600} + 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: 224878089506178020} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222151007828074154 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1588312817834600} + m_CullTransparentMesh: 0 +--- !u!114 &114924332738671574 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1588312817834600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1662280514738870 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224939501917592340} + - component: {fileID: 222830863570019808} + - component: {fileID: 114255478571308094} + - component: {fileID: 114806165407024962} + m_Layer: 5 + m_Name: Description Input Field + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224939501917592340 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662280514738870} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 9.999617} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 224271520881373844} + - {fileID: 224554182203924970} + m_Father: {fileID: 22491596} + m_RootOrder: 1 + 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: -40} + m_SizeDelta: {x: 314, y: 42.300003} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222830863570019808 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662280514738870} + m_CullTransparentMesh: 0 +--- !u!114 &114255478571308094 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662280514738870} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114806165407024962 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662280514738870} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114255478571308094} + m_TextComponent: {fileID: 114405973168686448} + m_Placeholder: {fileID: 114754453891612576} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &1775543874701914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224924735049580200} + - component: {fileID: 222489374809896884} + - component: {fileID: 114131362755238432} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224924735049580200 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775543874701914} + 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: 224567068193907552} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222489374809896884 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775543874701914} + m_CullTransparentMesh: 0 +--- !u!114 &114131362755238432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775543874701914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1777214450262072 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224405308945679254} + - component: {fileID: 222764976207145244} + - component: {fileID: 114993941419843678} + m_Layer: 5 + m_Name: NewIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224405308945679254 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1777214450262072} + 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: 224913925568883582} + 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.0012588637, y: 21} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222764976207145244 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1777214450262072} + m_CullTransparentMesh: 0 +--- !u!114 &114993941419843678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1777214450262072} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 36349feed06587e479724a1a09c0b267, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1779176327120180 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224714239840559184} + - component: {fileID: 222079504614982886} + - component: {fileID: 114542794815776334} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224714239840559184 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1779176327120180} + 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: 224144908770989872} + 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: 9, y: -0.5} + m_SizeDelta: {x: -28, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222079504614982886 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1779176327120180} + m_CullTransparentMesh: 0 +--- !u!114 &114542794815776334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1779176327120180} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_LineSpacing: 1 + m_Text: Popular +--- !u!1 &1793483865763980 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224045026096711926} + - component: {fileID: 222754362675478158} + - component: {fileID: 114724877240833130} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224045026096711926 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1793483865763980} + 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: 224081522026327500} + 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: 9, y: -0.5} + m_SizeDelta: {x: -28, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222754362675478158 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1793483865763980} + m_CullTransparentMesh: 0 +--- !u!114 &114724877240833130 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1793483865763980} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_LineSpacing: 1 + m_Text: New +--- !u!1 &1867248601299410 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224365754264647900} + - component: {fileID: 222801631859172078} + - component: {fileID: 114804517537383506} + m_Layer: 5 + m_Name: TagsBackdrop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224365754264647900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1867248601299410} + 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: 22429304} + - {fileID: 22487874} + m_Father: {fileID: 22487130} + m_RootOrder: 8 + 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: -125, y: -107} + m_SizeDelta: {x: 323.7, y: 56} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222801631859172078 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1867248601299410} + m_CullTransparentMesh: 0 +--- !u!114 &114804517537383506 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1867248601299410} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.347} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1889194436472316 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224271520881373844} + - component: {fileID: 222417869573579944} + - component: {fileID: 114754453891612576} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224271520881373844 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889194436472316} + 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: 224939501917592340} + 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.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222417869573579944 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889194436472316} + m_CullTransparentMesh: 0 +--- !u!114 &114754453891612576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889194436472316} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 10 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Describe your world to other users... +--- !u!1 &1889930117577538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224701047088951004} + - component: {fileID: 222046298512334484} + - component: {fileID: 114899202759966298} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224701047088951004 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889930117577538} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 22491596} + 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: -10.600578} + m_SizeDelta: {x: 101, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222046298512334484 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889930117577538} + m_CullTransparentMesh: 0 +--- !u!114 &114899202759966298 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889930117577538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Description +--- !u!1 &1933703822908772 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224414781600708868} + - component: {fileID: 222071568462011864} + - component: {fileID: 114435050140951602} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224414781600708868 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1933703822908772} + 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: 224881636171744216} + 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: 9, y: -0.5} + m_SizeDelta: {x: -28, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222071568462011864 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1933703822908772} + m_CullTransparentMesh: 0 +--- !u!114 &114435050140951602 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1933703822908772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 0 + m_LineSpacing: 1 + m_Text: Active +--- !u!1 &1935460479090000 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224560161326457194} + - component: {fileID: 222835123684128380} + - component: {fileID: 114147321882124734} + m_Layer: 5 + m_Name: LabIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224560161326457194 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1935460479090000} + 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: 224913925568883582} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 24.200012, y: 0} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222835123684128380 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1935460479090000} + m_CullTransparentMesh: 0 +--- !u!114 &114147321882124734 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1935460479090000} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: f310c3dbad3125d4e8fc2e00bdc2acb4, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1937843859996720 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224081522026327500} + - component: {fileID: 114274045118423354} + m_Layer: 5 + m_Name: ShowNew + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224081522026327500 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1937843859996720} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.0011329651} + m_LocalScale: {x: 0.7500139, y: 0.7500139, z: 0.7000129} + m_Children: + - {fileID: 224567068193907552} + - {fileID: 224045026096711926} + m_Father: {fileID: 224237802529560364} + 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: 129.4, y: -0.0009765625} + m_SizeDelta: {x: 100, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114274045118423354 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1937843859996720} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114131123913015884} + toggleTransition: 1 + graphic: {fileID: 114131362755238432} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1946473914797420 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224659715462348342} + - component: {fileID: 222557215457754948} + - component: {fileID: 114837861664647532} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224659715462348342 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1946473914797420} + 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: 224389434569615672} + m_Father: {fileID: 224144908770989872} + 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: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222557215457754948 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1946473914797420} + m_CullTransparentMesh: 0 +--- !u!114 &114837861664647532 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1946473914797420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1953052023277510 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224887116296390214} + - component: {fileID: 222408967468241682} + - component: {fileID: 114572482594954600} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224887116296390214 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953052023277510} + 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: 224209506000875612} + 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!222 &222408967468241682 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953052023277510} + m_CullTransparentMesh: 0 +--- !u!114 &114572482594954600 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953052023277510} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + 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: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Upload diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKWorld.prefab.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKWorld.prefab.meta new file mode 100644 index 00000000..271aa4fe --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRCSDKWorld.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc887d4eeb5a941ed86bca0135b05e2b +timeCreated: 1445230767 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRC_PlayerVisualDamage.prefab b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRC_PlayerVisualDamage.prefab new file mode 100644 index 00000000..41ae7f85 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRC_PlayerVisualDamage.prefab @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &116118 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 430146} + - 33: {fileID: 3398868} + - 23: {fileID: 2361110} + - 114: {fileID: 11458046} + m_Layer: 0 + m_Name: VRC_PlayerVisualDamage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &430146 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116118} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.8081263, y: 1.8081274, z: 1.8081274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 +--- !u!23 &2361110 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116118} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: 2166f6bbfce69594fad494087eca58e8, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3398868 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116118} + m_Mesh: {fileID: 4300000, guid: e13e96301b7c8214dac6883be5b82bfa, type: 3} +--- !u!114 &11458046 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116118} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1938141040, guid: f78c4655b33cb5741983dc02e08899cf, type: 3} + m_Name: + m_EditorClassIdentifier: + fullDamageScale: 1 + minDamageScale: 2 + offset: 0.5 +--- !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: 116118} + m_IsPrefabParent: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRC_PlayerVisualDamage.prefab.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRC_PlayerVisualDamage.prefab.meta new file mode 100644 index 00000000..63aa3ca6 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/VRC_PlayerVisualDamage.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5f3166efede7b7e479e24ff71225220f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation.meta new file mode 100644 index 00000000..e0704ad1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38728f748b721a64a88ad81b1d0e92a3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance.meta new file mode 100644 index 00000000..f79e64e7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 15c2b243844259140a8191cf4f7bf6d4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets.meta new file mode 100644 index 00000000..ca98908f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b2581976910dff45953345cfefc9409 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Quest.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Quest.asset new file mode 100644 index 00000000..3a2ad737 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Quest.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4afb61f36d144fc381114cd7f78d13e7, type: 3} + m_Name: PerformanceScannerSet_Quest + m_EditorClassIdentifier: + performanceScanners: + - {fileID: 11400000, guid: 8ae6e7ea5b8982143aa8c2c4e2fe81c6, type: 2} + - {fileID: 11400000, guid: c2ca835e9f95b464b8a2df5c181ba44e, type: 2} + - {fileID: 11400000, guid: d162a2d08d890e644b79b605f1d1120e, type: 2} + - {fileID: 11400000, guid: 986c284df70b4c34dad7e5ef27a86156, type: 2} + - {fileID: 11400000, guid: 69c7115984bf82e46af96d6f144fe463, type: 2} + - {fileID: 11400000, guid: 07199be0cf1b2a34f8dff60d486129ea, type: 2} + - {fileID: 11400000, guid: e750aae2c41768e4485dfb9a6de00454, type: 2} + - {fileID: 11400000, guid: f4004220746a95a4e84a3909a49d844b, type: 2} + - {fileID: 11400000, guid: 18ec5f6f963b6774fa1b84c5bff0246f, type: 2} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Quest.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Quest.asset.meta new file mode 100644 index 00000000..524546ec --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Quest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf50321b92d503d4a823939356ce856d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Windows.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Windows.asset new file mode 100644 index 00000000..affed90a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Windows.asset @@ -0,0 +1,24 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4afb61f36d144fc381114cd7f78d13e7, type: 3} + m_Name: PerformanceScannerSet_Windows + m_EditorClassIdentifier: + performanceScanners: + - {fileID: 11400000, guid: 8ae6e7ea5b8982143aa8c2c4e2fe81c6, type: 2} + - {fileID: 11400000, guid: c2ca835e9f95b464b8a2df5c181ba44e, type: 2} + - {fileID: 11400000, guid: d162a2d08d890e644b79b605f1d1120e, type: 2} + - {fileID: 11400000, guid: 371dfb95b91b4684eb1ad68d37d81ac9, type: 2} + - {fileID: 11400000, guid: 69c7115984bf82e46af96d6f144fe463, type: 2} + - {fileID: 11400000, guid: 07199be0cf1b2a34f8dff60d486129ea, type: 2} + - {fileID: 11400000, guid: e750aae2c41768e4485dfb9a6de00454, type: 2} + - {fileID: 11400000, guid: f4004220746a95a4e84a3909a49d844b, type: 2} + - {fileID: 11400000, guid: 18ec5f6f963b6774fa1b84c5bff0246f, type: 2} + - {fileID: 11400000, guid: 986c284df70b4c34dad7e5ef27a86156, type: 2} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Windows.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Windows.asset.meta new file mode 100644 index 00000000..2c0d4e53 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/ScannerSets/PerformanceScannerSet_Windows.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b0d7b483809dd6441bb36507c9f64040 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners.meta new file mode 100644 index 00000000..76f403e5 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2d6b7ca27999e74ea11c638e4cd57a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AnimatorPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AnimatorPerformanceScanner.asset new file mode 100644 index 00000000..da9e3e0c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AnimatorPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 08c8e931d0544866a0f626855d9c1841, type: 3} + m_Name: AnimatorPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AnimatorPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AnimatorPerformanceScanner.asset.meta new file mode 100644 index 00000000..fb1ca8a7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AnimatorPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8ae6e7ea5b8982143aa8c2c4e2fe81c6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AudioPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AudioPerformanceScanner.asset new file mode 100644 index 00000000..52a182e3 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AudioPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b3a8bba736414d1aaa9e766da27b56b5, type: 3} + m_Name: AudioPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AudioPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AudioPerformanceScanner.asset.meta new file mode 100644 index 00000000..4b346453 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/AudioPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2ca835e9f95b464b8a2df5c181ba44e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ClothPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ClothPerformanceScanner.asset new file mode 100644 index 00000000..11be1032 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ClothPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cec88b5a46f459195f10a2f11fddb2f, type: 3} + m_Name: ClothPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ClothPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ClothPerformanceScanner.asset.meta new file mode 100644 index 00000000..abd3f594 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ClothPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d162a2d08d890e644b79b605f1d1120e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/DynamicBonePerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/DynamicBonePerformanceScanner.asset new file mode 100644 index 00000000..b38de27b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/DynamicBonePerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a226df494ef04404a9a47c714822ab9f, type: 3} + m_Name: DynamicBonePerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/DynamicBonePerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/DynamicBonePerformanceScanner.asset.meta new file mode 100644 index 00000000..2300ceca --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/DynamicBonePerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 371dfb95b91b4684eb1ad68d37d81ac9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LightPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LightPerformanceScanner.asset new file mode 100644 index 00000000..6b2d006f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LightPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 405778fdc32c44c1bb9fdd0476fb0007, type: 3} + m_Name: LightPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LightPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LightPerformanceScanner.asset.meta new file mode 100644 index 00000000..3b709d73 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LightPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69c7115984bf82e46af96d6f144fe463 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LineRendererPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LineRendererPerformanceScanner.asset new file mode 100644 index 00000000..e02602b1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LineRendererPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ec87392b85844f7bb526a48ec866a8f0, type: 3} + m_Name: LineRendererPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LineRendererPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LineRendererPerformanceScanner.asset.meta new file mode 100644 index 00000000..90c067c0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/LineRendererPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07199be0cf1b2a34f8dff60d486129ea +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/MeshPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/MeshPerformanceScanner.asset new file mode 100644 index 00000000..e45942fb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/MeshPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 38bca10261df4ddfa10cff3b3bbb9428, type: 3} + m_Name: MeshPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/MeshPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/MeshPerformanceScanner.asset.meta new file mode 100644 index 00000000..695b5064 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/MeshPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e750aae2c41768e4485dfb9a6de00454 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ParticlePerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ParticlePerformanceScanner.asset new file mode 100644 index 00000000..435125cb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ParticlePerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 10723e354ff14f98a49ab797b3f005e6, type: 3} + m_Name: ParticlePerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ParticlePerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ParticlePerformanceScanner.asset.meta new file mode 100644 index 00000000..d339960f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/ParticlePerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f4004220746a95a4e84a3909a49d844b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/PhysicsPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/PhysicsPerformanceScanner.asset new file mode 100644 index 00000000..9c533293 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/PhysicsPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6a94ecdeecd04f85824cc3244be5712a, type: 3} + m_Name: PhysicsPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/PhysicsPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/PhysicsPerformanceScanner.asset.meta new file mode 100644 index 00000000..92865ce7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/PhysicsPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18ec5f6f963b6774fa1b84c5bff0246f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/TrailRendererPerformanceScanner.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/TrailRendererPerformanceScanner.asset new file mode 100644 index 00000000..2fa528b8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/TrailRendererPerformanceScanner.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2efd714b564547b4be1ebd1f2700668b, type: 3} + m_Name: TrailRendererPerformanceScanner + m_EditorClassIdentifier: + includeInactiveObjectsInStats: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/TrailRendererPerformanceScanner.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/TrailRendererPerformanceScanner.asset.meta new file mode 100644 index 00000000..099569d7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/Scanners/TrailRendererPerformanceScanner.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 986c284df70b4c34dad7e5ef27a86156 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels.meta new file mode 100644 index 00000000..f5040429 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 08d17d7c96d25404290953571645631f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest.meta new file mode 100644 index 00000000..528eb466 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c32a3f58d606ce2418232aacc9a4f29b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/AvatarPerformanceStatLevels_Quest.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/AvatarPerformanceStatLevels_Quest.asset new file mode 100644 index 00000000..89d4a358 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/AvatarPerformanceStatLevels_Quest.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 468554b1bfc447f41a20a2f5bae65d16, type: 3} + m_Name: AvatarPerformanceStatLevels_Quest + m_EditorClassIdentifier: + excellent: {fileID: 11400000, guid: e750436d0bab192489da0debe67ee879, type: 2} + good: {fileID: 11400000, guid: b25db21b17fba3d49a7248568fdb9870, type: 2} + medium: {fileID: 11400000, guid: 31feb7417182a80469408649071d10ac, type: 2} + poor: {fileID: 11400000, guid: 171503e8193e15447967be1e3ca1e714, type: 2} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/AvatarPerformanceStatLevels_Quest.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/AvatarPerformanceStatLevels_Quest.asset.meta new file mode 100644 index 00000000..5480a614 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/AvatarPerformanceStatLevels_Quest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f0f530dea3891c04e8ab37831627e702 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Excellent_Quest.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Excellent_Quest.asset new file mode 100644 index 00000000..f0615502 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Excellent_Quest.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_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Excellent_Quest + m_EditorClassIdentifier: + polyCount: 7500 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 1.25, y: 1.25, z: 1.25} + skinnedMeshCount: 1 + meshCount: 1 + materialCount: 1 + animatorCount: 1 + boneCount: 75 + lightCount: 0 + particleSystemCount: 0 + particleTotalCount: 0 + particleMaxMeshPolyCount: 0 + particleTrailsEnabled: 0 + particleCollisionEnabled: 0 + trailRendererCount: 0 + lineRendererCount: 0 + dynamicBoneComponentCount: 0 + dynamicBoneSimulatedBoneCount: 0 + dynamicBoneColliderCount: 0 + dynamicBoneCollisionCheckCount: 0 + clothCount: 0 + clothMaxVertices: 0 + physicsColliderCount: 0 + physicsRigidbodyCount: 0 + audioSourceCount: 0 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Excellent_Quest.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Excellent_Quest.asset.meta new file mode 100644 index 00000000..000c77f9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Excellent_Quest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e750436d0bab192489da0debe67ee879 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Good_Quest.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Good_Quest.asset new file mode 100644 index 00000000..42ad7d62 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Good_Quest.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_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Good_Quest + m_EditorClassIdentifier: + polyCount: 10000 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2, y: 2, z: 2} + skinnedMeshCount: 1 + meshCount: 1 + materialCount: 1 + animatorCount: 1 + boneCount: 90 + lightCount: 0 + particleSystemCount: 0 + particleTotalCount: 0 + particleMaxMeshPolyCount: 0 + particleTrailsEnabled: 0 + particleCollisionEnabled: 0 + trailRendererCount: 0 + lineRendererCount: 0 + dynamicBoneComponentCount: 0 + dynamicBoneSimulatedBoneCount: 0 + dynamicBoneColliderCount: 0 + dynamicBoneCollisionCheckCount: 0 + clothCount: 0 + clothMaxVertices: 0 + physicsColliderCount: 0 + physicsRigidbodyCount: 0 + audioSourceCount: 0 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Good_Quest.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Good_Quest.asset.meta new file mode 100644 index 00000000..1c5ccd91 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Good_Quest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b25db21b17fba3d49a7248568fdb9870 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Medium_Quest.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Medium_Quest.asset new file mode 100644 index 00000000..c59c2528 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Medium_Quest.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_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Medium_Quest + m_EditorClassIdentifier: + polyCount: 15000 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.5, y: 3, z: 2.5} + skinnedMeshCount: 2 + meshCount: 2 + materialCount: 2 + animatorCount: 1 + boneCount: 150 + lightCount: 0 + particleSystemCount: 0 + particleTotalCount: 0 + particleMaxMeshPolyCount: 0 + particleTrailsEnabled: 0 + particleCollisionEnabled: 0 + trailRendererCount: 0 + lineRendererCount: 0 + dynamicBoneComponentCount: 0 + dynamicBoneSimulatedBoneCount: 0 + dynamicBoneColliderCount: 0 + dynamicBoneCollisionCheckCount: 0 + clothCount: 0 + clothMaxVertices: 0 + physicsColliderCount: 0 + physicsRigidbodyCount: 0 + audioSourceCount: 0 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Medium_Quest.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Medium_Quest.asset.meta new file mode 100644 index 00000000..8ce5ce44 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Medium_Quest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 31feb7417182a80469408649071d10ac +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Poor_Quest.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Poor_Quest.asset new file mode 100644 index 00000000..937ec600 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Poor_Quest.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_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Poor_Quest + m_EditorClassIdentifier: + polyCount: 20000 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.5, y: 3, z: 2.5} + skinnedMeshCount: 2 + meshCount: 2 + materialCount: 4 + animatorCount: 2 + boneCount: 150 + lightCount: 0 + particleSystemCount: 2 + particleTotalCount: 200 + particleMaxMeshPolyCount: 400 + particleTrailsEnabled: 1 + particleCollisionEnabled: 1 + trailRendererCount: 1 + lineRendererCount: 1 + dynamicBoneComponentCount: 0 + dynamicBoneSimulatedBoneCount: 0 + dynamicBoneColliderCount: 0 + dynamicBoneCollisionCheckCount: 0 + clothCount: 0 + clothMaxVertices: 0 + physicsColliderCount: 0 + physicsRigidbodyCount: 0 + audioSourceCount: 0 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Poor_Quest.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Poor_Quest.asset.meta new file mode 100644 index 00000000..002a2e6d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Quest/Poor_Quest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 171503e8193e15447967be1e3ca1e714 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows.meta new file mode 100644 index 00000000..3d6cfacf --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc64ef9dd92900049adb05a449a3e28b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/AvatarPerformanceStatLevels_Windows.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/AvatarPerformanceStatLevels_Windows.asset new file mode 100644 index 00000000..7a075a4d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/AvatarPerformanceStatLevels_Windows.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 468554b1bfc447f41a20a2f5bae65d16, type: 3} + m_Name: AvatarPerformanceStatLevels_Windows + m_EditorClassIdentifier: + excellent: {fileID: 11400000, guid: 88c46902276e7624e8adda9020bef28b, type: 2} + good: {fileID: 11400000, guid: 38957d57ab5a7f145b954d20fc24b1d4, type: 2} + medium: {fileID: 11400000, guid: 65edaefdc2f87414594559cb89383b5b, type: 2} + poor: {fileID: 11400000, guid: 595049d4e162571489f2437524d98a31, type: 2} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/AvatarPerformanceStatLevels_Windows.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/AvatarPerformanceStatLevels_Windows.asset.meta new file mode 100644 index 00000000..f5038617 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/AvatarPerformanceStatLevels_Windows.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 438f83f183e95f740877d4c22ed91af2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Excellent_Windows.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Excellent_Windows.asset new file mode 100644 index 00000000..8ae9443e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Excellent_Windows.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Excellent_Windows + m_EditorClassIdentifier: + polyCount: 32000 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 1.25, y: 1.25, z: 1.25} + skinnedMeshCount: 1 + meshCount: 4 + materialCount: 4 + animatorCount: 1 + boneCount: 75 + lightCount: 0 + particleSystemCount: 0 + particleTotalCount: 0 + particleMaxMeshPolyCount: 0 + particleTrailsEnabled: 0 + particleCollisionEnabled: 0 + trailRendererCount: 1 + lineRendererCount: 1 + dynamicBoneComponentCount: 0 + dynamicBoneSimulatedBoneCount: 0 + dynamicBoneColliderCount: 0 + dynamicBoneCollisionCheckCount: 0 + clothCount: 0 + clothMaxVertices: 0 + physicsColliderCount: 0 + physicsRigidbodyCount: 0 + audioSourceCount: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Excellent_Windows.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Excellent_Windows.asset.meta new file mode 100644 index 00000000..cc679c67 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Excellent_Windows.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 88c46902276e7624e8adda9020bef28b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Good_Windows.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Good_Windows.asset new file mode 100644 index 00000000..4aca9569 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Good_Windows.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Good_Windows + m_EditorClassIdentifier: + polyCount: 70000 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2, y: 2, z: 2} + skinnedMeshCount: 2 + meshCount: 8 + materialCount: 8 + animatorCount: 4 + boneCount: 150 + lightCount: 0 + particleSystemCount: 4 + particleTotalCount: 300 + particleMaxMeshPolyCount: 1000 + particleTrailsEnabled: 0 + particleCollisionEnabled: 0 + trailRendererCount: 2 + lineRendererCount: 2 + dynamicBoneComponentCount: 4 + dynamicBoneSimulatedBoneCount: 16 + dynamicBoneColliderCount: 0 + dynamicBoneCollisionCheckCount: 0 + clothCount: 1 + clothMaxVertices: 50 + physicsColliderCount: 1 + physicsRigidbodyCount: 1 + audioSourceCount: 4 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Good_Windows.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Good_Windows.asset.meta new file mode 100644 index 00000000..0be8ddcb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Good_Windows.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38957d57ab5a7f145b954d20fc24b1d4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Medium_Windows.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Medium_Windows.asset new file mode 100644 index 00000000..eed8bec0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Medium_Windows.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Medium_Windows + m_EditorClassIdentifier: + polyCount: 70000 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.5, y: 3, z: 2.5} + skinnedMeshCount: 8 + meshCount: 16 + materialCount: 16 + animatorCount: 16 + boneCount: 256 + lightCount: 0 + particleSystemCount: 8 + particleTotalCount: 1000 + particleMaxMeshPolyCount: 2000 + particleTrailsEnabled: 1 + particleCollisionEnabled: 1 + trailRendererCount: 4 + lineRendererCount: 4 + dynamicBoneComponentCount: 16 + dynamicBoneSimulatedBoneCount: 32 + dynamicBoneColliderCount: 4 + dynamicBoneCollisionCheckCount: 8 + clothCount: 1 + clothMaxVertices: 100 + physicsColliderCount: 8 + physicsRigidbodyCount: 8 + audioSourceCount: 8 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Medium_Windows.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Medium_Windows.asset.meta new file mode 100644 index 00000000..d0051a6f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Medium_Windows.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65edaefdc2f87414594559cb89383b5b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Poor_Windows.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Poor_Windows.asset new file mode 100644 index 00000000..b2bda772 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Poor_Windows.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f742c36dce5730f4d96e37d82c330584, type: 3} + m_Name: Poor_Windows + m_EditorClassIdentifier: + polyCount: 70000 + aabb: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.5, y: 3, z: 2.5} + skinnedMeshCount: 16 + meshCount: 24 + materialCount: 32 + animatorCount: 32 + boneCount: 400 + lightCount: 1 + particleSystemCount: 16 + particleTotalCount: 2500 + particleMaxMeshPolyCount: 5000 + particleTrailsEnabled: 1 + particleCollisionEnabled: 1 + trailRendererCount: 8 + lineRendererCount: 8 + dynamicBoneComponentCount: 32 + dynamicBoneSimulatedBoneCount: 256 + dynamicBoneColliderCount: 32 + dynamicBoneCollisionCheckCount: 256 + clothCount: 1 + clothMaxVertices: 200 + physicsColliderCount: 8 + physicsRigidbodyCount: 8 + audioSourceCount: 8 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Poor_Windows.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Poor_Windows.asset.meta new file mode 100644 index 00000000..60ee682e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/Validation/Performance/StatsLevels/Windows/Poor_Windows.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 595049d4e162571489f2437524d98a31 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/awsconfig.xml b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/awsconfig.xml new file mode 100644 index 00000000..980f930d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/awsconfig.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> + +<aws + correctForClockSkew="true"> + + <logging + logTo="UnityLogger" + logResponses="Always" + logMetrics="true" + logMetricsFormat="JSON" /> + + <s3 useSignatureVersion4="true" /> + + <mobileAnalytics + sessionTimeout = "5" + maxDBSize = "5242880" + dbWarningThreshold = "0.9" + maxRequestSize = "102400" + allowUseDataNetwork = "false" + /> + +</aws>
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/awsconfig.xml.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/awsconfig.xml.meta new file mode 100644 index 00000000..641b3a53 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/awsconfig.xml.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4acdf7b3eb426480bb5acf58638bd493 +timeCreated: 1448068597 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.customizations.json b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.customizations.json new file mode 100644 index 00000000..cd445dff --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.customizations.json @@ -0,0 +1,49 @@ +{ + "endpoints": { + "*/sts": { + "endpoint": "sts.amazonaws.com" + }, + "*/route53": { + "endpoint": "route53.amazonaws.com" + }, + "*/route53domains": { + "endpoint": "route53domains.us-east-1.amazonaws.com" + }, + "us-east-1/s3": { + "endpoint": "s3.amazonaws.com", + "signature-version" : "2" + }, + "us-west-1/s3": { + "endpoint": "s3-us-west-1.amazonaws.com", + "signature-version" : "2" + }, + "us-west-2/s3": { + "endpoint": "s3-us-west-2.amazonaws.com", + "signature-version" : "2" + }, + "ap-northeast-1/s3": { + "endpoint": "s3-ap-northeast-1.amazonaws.com", + "signature-version" : "2" + }, + "ap-southeast-1/s3": { + "endpoint": "s3-ap-southeast-1.amazonaws.com", + "signature-version" : "2" + }, + "ap-southeast-2/s3": { + "endpoint": "s3-ap-southeast-2.amazonaws.com", + "signature-version" : "2" + }, + "sa-east-1/s3": { + "endpoint": "s3-sa-east-1.amazonaws.com", + "signature-version" : "2" + }, + "eu-west-1/s3": { + "endpoint": "s3-eu-west-1.amazonaws.com", + "signature-version" : "2" + }, + "us-gov-west-1/s3": { + "endpoint": "s3-us-gov-west-1.amazonaws.com", + "signature-version" : "2" + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.customizations.json.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.customizations.json.meta new file mode 100644 index 00000000..4216a6ef --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.customizations.json.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd5614b710e774040ab715161f7dfaca +timeCreated: 1448068597 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.json b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.json new file mode 100644 index 00000000..526d206d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.json @@ -0,0 +1,57 @@ +{ + "version": 2, + "endpoints": { + "*/*": { + "endpoint": "{service}.{region}.amazonaws.com" + }, + "cn-north-1/*": { + "endpoint": "{service}.{region}.amazonaws.com.cn", + "signatureVersion": "v4" + }, + "us-gov-west-1/iam": { + "endpoint": "iam.us-gov.amazonaws.com" + }, + "us-gov-west-1/s3": { + "endpoint": "s3-{region}.amazonaws.com" + }, + "*/cloudfront": { + "endpoint": "cloudfront.amazonaws.com" + }, + "*/iam": { + "endpoint": "iam.amazonaws.com" + }, + "*/importexport": { + "endpoint": "importexport.amazonaws.com" + }, + "*/route53": { + "endpoint": "route53.amazonaws.com" + }, + "us-east-1/sdb": { + "endpoint": "sdb.amazonaws.com" + }, + "us-east-1/s3": { + "endpoint": "s3.amazonaws.com" + }, + "us-west-1/s3": { + "endpoint": "s3-{region}.amazonaws.com" + }, + "us-west-2/s3": { + "endpoint": "s3-{region}.amazonaws.com" + }, + "eu-west-1/s3": { + "endpoint": "s3-{region}.amazonaws.com" + }, + "ap-southeast-1/s3": { + "endpoint": "s3-{region}.amazonaws.com" + }, + "ap-southeast-2/s3": { + "endpoint": "s3-{region}.amazonaws.com" + }, + "ap-northeast-1/s3": { + "endpoint": "s3-{region}.amazonaws.com" + }, + "sa-east-1/s3": { + "endpoint": "s3-{region}.amazonaws.com" + } + } +}
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.json.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.json.meta new file mode 100644 index 00000000..ec4e15bc --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/endpoints.json.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37b4abef7420c4c7ea71dbe76757498a +timeCreated: 1448068597 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader.png Binary files differnew file mode 100644 index 00000000..a0a529d1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader.png.meta new file mode 100644 index 00000000..c020e270 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 248f850c58993ed43bcaad6b934b7c92 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 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: 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 + - buildTarget: Standalone + 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader_Oculus_Quest.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader_Oculus_Quest.png Binary files differnew file mode 100644 index 00000000..f7f20480 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader_Oculus_Quest.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader_Oculus_Quest.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader_Oculus_Quest.png.meta new file mode 100644 index 00000000..c9e8efd4 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkBottomHeader_Oculus_Quest.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 551946bfd2b165f419f297805d1e1256 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 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: 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 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Android + 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkClDialogNewIcon.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkClDialogNewIcon.png Binary files differnew file mode 100644 index 00000000..aecf1065 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkClDialogNewIcon.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkClDialogNewIcon.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkClDialogNewIcon.png.meta new file mode 100644 index 00000000..de0f59de --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkClDialogNewIcon.png.meta @@ -0,0 +1,136 @@ +fileFormatVersion: 2 +guid: d2244637721b4f3458280ffc1f9dd7cc +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 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: 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 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: WebGL + 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeader.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeader.png Binary files differnew file mode 100644 index 00000000..91d814e2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeader.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeader.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeader.png.meta new file mode 100644 index 00000000..2f737dda --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeader.png.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 38956f4b67ba0984587b1a913d05beea +timeCreated: 1532782887 +licenseType: Pro +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: 0 + 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: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeaderWithCommunityLabs.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeaderWithCommunityLabs.png Binary files differnew file mode 100644 index 00000000..a5336880 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeaderWithCommunityLabs.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeaderWithCommunityLabs.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeaderWithCommunityLabs.png.meta new file mode 100644 index 00000000..6d78c749 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkHeaderWithCommunityLabs.png.meta @@ -0,0 +1,136 @@ +fileFormatVersion: 2 +guid: ff7f4f4963793a340bde459bc9975c07 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 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: 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 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: WebGL + 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon1.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon1.png Binary files differnew file mode 100644 index 00000000..0fe45be0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon1.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon1.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon1.png.meta new file mode 100644 index 00000000..fdc98b28 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon1.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 1d151b29d1d1c704daa27e4921e39129 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + 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: 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: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon2.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon2.png Binary files differnew file mode 100644 index 00000000..a4f86a7c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon2.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon2.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon2.png.meta new file mode 100644 index 00000000..ef43bad9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Resources/vrcSdkSplashUdon2.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 8458230047d35d4498b2de453f2cabda +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + 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: 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: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + 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/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts.meta new file mode 100644 index 00000000..58505ef8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: be124825cc1da304b927f0e73a2d9ce3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ApiFileHelper.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ApiFileHelper.cs new file mode 100644 index 00000000..0dedf888 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ApiFileHelper.cs @@ -0,0 +1,1903 @@ +#if UNITY_EDITOR +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System; +using System.IO; +using Debug = UnityEngine.Debug; +using System.Text.RegularExpressions; + +namespace VRC.Core +{ + public class ApiFileHelper : MonoBehaviour + { + private readonly int kMultipartUploadChunkSize = 100 * 1024 * 1024; // 100 MB + private readonly int SERVER_PROCESSING_WAIT_TIMEOUT_CHUNK_SIZE = 50 * 1024 * 1024; + private readonly float SERVER_PROCESSING_WAIT_TIMEOUT_PER_CHUNK_SIZE = 120.0f; + private readonly float SERVER_PROCESSING_MAX_WAIT_TIMEOUT = 600.0f; + private readonly float SERVER_PROCESSING_INITIAL_RETRY_TIME = 2.0f; + private readonly float SERVER_PROCESSING_MAX_RETRY_TIME = 10.0f; + + private static bool EnableDeltaCompression = false; + + private readonly Regex[] kUnityPackageAssetNameFilters = new Regex[] + { + new Regex(@"/LightingData\.asset$"), // lightmap base asset + new Regex(@"/Lightmap-.*(\.png|\.exr)$"), // lightmaps + new Regex(@"/ReflectionProbe-.*(\.exr|\.png)$"), // reflection probes + new Regex(@"/Editor/Data/UnityExtensions/") // anything that looks like part of the Unity installation + }; + + public delegate void OnFileOpSuccess(ApiFile apiFile, string message); + public delegate void OnFileOpError(ApiFile apiFile, string error); + public delegate void OnFileOpProgress(ApiFile apiFile, string status, string subStatus, float pct); + public delegate bool FileOpCancelQuery(ApiFile apiFile); + + public static ApiFileHelper Instance + { + get + { + CheckInstance(); + return mInstance; + } + } + + private static ApiFileHelper mInstance = null; + const float kPostWriteDelay = 0.75f; + + public enum FileOpResult + { + Success, + Unchanged + } + + public static string GetMimeTypeFromExtension(string extension) + { + if (extension == ".vrcw") + return "application/x-world"; + if (extension == ".vrca") + return "application/x-avatar"; + if (extension == ".dll") + return "application/x-msdownload"; + if (extension == ".unitypackage") + return "application/gzip"; + if (extension == ".gz") + return "application/gzip"; + if (extension == ".jpg") + return "image/jpg"; + if (extension == ".png") + return "image/png"; + if (extension == ".sig") + return "application/x-rsync-signature"; + if (extension == ".delta") + return "application/x-rsync-delta"; + + Debug.LogWarning("Unknown file extension for mime-type: " + extension); + return "application/octet-stream"; + } + + public static bool IsGZipCompressed(string filename) + { + return GetMimeTypeFromExtension(Path.GetExtension(filename)) == "application/gzip"; + } + + public IEnumerator UploadFile(string filename, string existingFileId, string friendlyName, + OnFileOpSuccess onSuccess, OnFileOpError onError, OnFileOpProgress onProgress, FileOpCancelQuery cancelQuery) + { + VRC.Core.Logger.Log("UploadFile: filename: " + filename + ", file id: " + + (!string.IsNullOrEmpty(existingFileId) ? existingFileId : "<new>") + ", name: " + friendlyName, DebugLevel.All); + + // init remote config + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + bool done = false; + ConfigManager.RemoteConfig.Init( + delegate () { done = true; }, + delegate () { done = true; } + ); + + while (!done) + yield return null; + + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + Error(onError, null, "Failed to fetch configuration."); + yield break; + } + } + + // configure delta compression + { + EnableDeltaCompression = ConfigManager.RemoteConfig.GetBool("sdkEnableDeltaCompression", false); + } + + // validate input file + Progress(onProgress, null, "Checking file..."); + + if (string.IsNullOrEmpty(filename)) + { + Error(onError, null, "Upload filename is empty!"); + yield break; + } + + if (!System.IO.Path.HasExtension(filename)) + { + Error(onError, null, "Upload filename must have an extension: " + filename); + yield break; + } + + string whyNot; + if (!VRC.Tools.FileCanRead(filename, out whyNot)) + { + Error(onError, null, "Could not read file to upload!", filename + "\n" + whyNot); + yield break; + } + + // get or create ApiFile + Progress(onProgress, null, string.IsNullOrEmpty(existingFileId) ? "Creating file record..." : "Getting file record..."); + + bool wait = true; + bool wasError = false; + bool worthRetry = false; + string errorStr = ""; + + if (string.IsNullOrEmpty(friendlyName)) + friendlyName = filename; + + string extension = System.IO.Path.GetExtension(filename); + string mimeType = GetMimeTypeFromExtension(extension); + + ApiFile apiFile = null; + + System.Action<ApiContainer> fileSuccess = (ApiContainer c) => + { + apiFile = c.Model as ApiFile; + wait = false; + }; + + System.Action<ApiContainer> fileFailure = (ApiContainer c) => + { + errorStr = c.Error; + wait = false; + + if (c.Code == 400) + worthRetry = true; + }; + + while (true) + { + apiFile = null; + wait = true; + worthRetry = false; + errorStr = ""; + + if (string.IsNullOrEmpty(existingFileId)) + ApiFile.Create(friendlyName, mimeType, extension, fileSuccess, fileFailure); + else + API.Fetch<ApiFile>(existingFileId, fileSuccess, fileFailure); + + while (wait) + { + if (apiFile != null && CheckCancelled(cancelQuery, onError, apiFile)) + yield break; + + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + if (errorStr.Contains("File not found")) + { + Debug.LogError("Couldn't find file record: " + existingFileId + ", creating new file record"); + + existingFileId = ""; + continue; + } + + string msg = string.IsNullOrEmpty(existingFileId) ? "Failed to create file record." : "Failed to get file record."; + Error(onError, null, msg, errorStr); + + if (!worthRetry) + yield break; + } + + if (!worthRetry) + break; + else + yield return new WaitForSecondsRealtime(kPostWriteDelay); + } + + if (apiFile == null) + yield break; + + LogApiFileStatus(apiFile, false, true); + + while (apiFile.HasQueuedOperation(EnableDeltaCompression)) + { + wait = true; + + apiFile.DeleteLatestVersion((c) => wait = false, (c) => wait = false); + + while (wait) + { + if (apiFile != null && CheckCancelled(cancelQuery, onError, apiFile)) + yield break; + + yield return null; + } + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + LogApiFileStatus(apiFile, false); + + // check for server side errors from last upload + if (apiFile.IsInErrorState()) + { + Debug.LogWarning("ApiFile: " + apiFile.id + ": server failed to process last uploaded, deleting failed version"); + + while (true) + { + // delete previous failed version + Progress(onProgress, apiFile, "Preparing file for upload...", "Cleaning up previous version"); + + wait = true; + errorStr = ""; + worthRetry = false; + + apiFile.DeleteLatestVersion(fileSuccess, fileFailure); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, null)) + { + yield break; + } + + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to delete previous failed version!", errorStr); + if (!worthRetry) + { + CleanupTempFiles(apiFile.id); + yield break; + } + } + + if (worthRetry) + yield return new WaitForSecondsRealtime(kPostWriteDelay); + else + break; + } + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + LogApiFileStatus(apiFile, false); + + // verify previous file op is complete + if (apiFile.HasQueuedOperation(EnableDeltaCompression)) + { + Error(onError, apiFile, "A previous upload is still being processed. Please try again later."); + yield break; + } + + if (wasError) + yield break; + + LogApiFileStatus(apiFile, false); + + // generate md5 and check if file has changed + Progress(onProgress, apiFile, "Preparing file for upload...", "Generating file hash"); + + string fileMD5Base64 = ""; + wait = true; + errorStr = ""; + VRC.Tools.FileMD5(filename, + delegate (byte[] md5Bytes) + { + fileMD5Base64 = Convert.ToBase64String(md5Bytes); + wait = false; + }, + delegate (string error) + { + errorStr = filename + "\n" + error; + wait = false; + } + ); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + CleanupTempFiles(apiFile.id); + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to generate MD5 hash for upload file.", errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + + LogApiFileStatus(apiFile, false); + + // check if file has been changed + Progress(onProgress, apiFile, "Preparing file for upload...", "Checking for changes"); + + bool isPreviousUploadRetry = false; + if (apiFile.HasExistingOrPendingVersion()) + { + // uploading the same file? + if (string.Compare(fileMD5Base64, apiFile.GetFileMD5(apiFile.GetLatestVersionNumber())) == 0) + { + // the previous operation completed successfully? + if (!apiFile.IsWaitingForUpload()) + { + Success(onSuccess, apiFile, "The file to upload is unchanged."); + CleanupTempFiles(apiFile.id); + yield break; + } + else + { + isPreviousUploadRetry = true; + + Debug.Log("Retrying previous upload"); + } + } + else + { + // the file has been modified + if (apiFile.IsWaitingForUpload()) + { + // previous upload failed, and the file is changed + while (true) + { + // delete previous failed version + Progress(onProgress, apiFile, "Preparing file for upload...", "Cleaning up previous version"); + + wait = true; + worthRetry = false; + errorStr = ""; + + apiFile.DeleteLatestVersion(fileSuccess, fileFailure); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to delete previous incomplete version!", errorStr); + if (!worthRetry) + { + CleanupTempFiles(apiFile.id); + yield break; + } + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + if (!worthRetry) + break; + } + } + } + } + + LogApiFileStatus(apiFile, false); + + // generate signature for new file + + Progress(onProgress, apiFile, "Preparing file for upload...", "Generating signature"); + + string signatureFilename = VRC.Tools.GetTempFileName(".sig", out errorStr, apiFile.id); + if (string.IsNullOrEmpty(signatureFilename)) + { + Error(onError, apiFile, "Failed to generate file signature!", "Failed to create temp file: \n" + errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + + wasError = false; + yield return StartCoroutine(CreateFileSignatureInternal(filename, signatureFilename, + delegate () + { + // success! + }, + delegate (string error) + { + Error(onError, apiFile, "Failed to generate file signature!", error); + CleanupTempFiles(apiFile.id); + wasError = true; + }) + ); + + if (wasError) + yield break; + + LogApiFileStatus(apiFile, false); + + // generate signature md5 and file size + Progress(onProgress, apiFile, "Preparing file for upload...", "Generating signature hash"); + + string sigMD5Base64 = ""; + wait = true; + errorStr = ""; + VRC.Tools.FileMD5(signatureFilename, + delegate (byte[] md5Bytes) + { + sigMD5Base64 = Convert.ToBase64String(md5Bytes); + wait = false; + }, + delegate (string error) + { + errorStr = signatureFilename + "\n" + error; + wait = false; + } + ); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + CleanupTempFiles(apiFile.id); + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to generate MD5 hash for signature file.", errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + + long sigFileSize = 0; + if (!VRC.Tools.GetFileSize(signatureFilename, out sigFileSize, out errorStr)) + { + Error(onError, apiFile, "Failed to generate file signature!", "Couldn't get file size:\n" + errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + + LogApiFileStatus(apiFile, false); + + // download previous version signature (if exists) + string existingFileSignaturePath = null; + if (EnableDeltaCompression && apiFile.HasExistingVersion()) + { + Progress(onProgress, apiFile, "Preparing file for upload...", "Downloading previous version signature"); + + wait = true; + errorStr = ""; + apiFile.DownloadSignature( + delegate (byte[] data) + { + // save to temp file + existingFileSignaturePath = VRC.Tools.GetTempFileName(".sig", out errorStr, apiFile.id); + if (string.IsNullOrEmpty(existingFileSignaturePath)) + { + errorStr = "Failed to create temp file: \n" + errorStr; + wait = false; + } + else + { + try + { + File.WriteAllBytes(existingFileSignaturePath, data); + } + catch (Exception e) + { + existingFileSignaturePath = null; + errorStr = "Failed to write signature temp file:\n" + e.Message; + } + wait = false; + } + }, + delegate (string error) + { + errorStr = error; + wait = false; + }, + delegate (long downloaded, long length) + { + Progress(onProgress, apiFile, "Preparing file for upload...", "Downloading previous version signature", Tools.DivideSafe(downloaded, length)); + } + ); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + CleanupTempFiles(apiFile.id); + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to download previous file version signature.", errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + } + + LogApiFileStatus(apiFile, false); + + // create delta if needed + string deltaFilename = null; + + if (EnableDeltaCompression && !string.IsNullOrEmpty(existingFileSignaturePath)) + { + Progress(onProgress, apiFile, "Preparing file for upload...", "Creating file delta"); + + deltaFilename = VRC.Tools.GetTempFileName(".delta", out errorStr, apiFile.id); + if (string.IsNullOrEmpty(deltaFilename)) + { + Error(onError, apiFile, "Failed to create file delta for upload.", "Failed to create temp file: \n" + errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + + wasError = false; + yield return StartCoroutine(CreateFileDeltaInternal(filename, existingFileSignaturePath, deltaFilename, + delegate () + { + // success! + }, + delegate (string error) + { + Error(onError, apiFile, "Failed to create file delta for upload.", error); + CleanupTempFiles(apiFile.id); + wasError = true; + }) + ); + + if (wasError) + yield break; + } + + // upload smaller of delta and new file + long fullFileSize = 0; + long deltaFileSize = 0; + if (!VRC.Tools.GetFileSize(filename, out fullFileSize, out errorStr) || + (!string.IsNullOrEmpty(deltaFilename) && !VRC.Tools.GetFileSize(deltaFilename, out deltaFileSize, out errorStr))) + { + Error(onError, apiFile, "Failed to create file delta for upload.", "Couldn't get file size: " + errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + + bool uploadDeltaFile = EnableDeltaCompression && deltaFileSize > 0 && deltaFileSize < fullFileSize; + if (EnableDeltaCompression) + VRC.Core.Logger.Log("Delta size " + deltaFileSize + " (" + ((float)deltaFileSize / (float)fullFileSize) + " %), full file size " + fullFileSize + ", uploading " + (uploadDeltaFile ? " DELTA" : " FULL FILE"), DebugLevel.All); + else + VRC.Core.Logger.Log("Delta compression disabled, uploading FULL FILE, size " + fullFileSize, DebugLevel.All); + + LogApiFileStatus(apiFile, uploadDeltaFile); + + string deltaMD5Base64 = ""; + if (uploadDeltaFile) + { + Progress(onProgress, apiFile, "Preparing file for upload...", "Generating file delta hash"); + + wait = true; + errorStr = ""; + VRC.Tools.FileMD5(deltaFilename, + delegate (byte[] md5Bytes) + { + deltaMD5Base64 = Convert.ToBase64String(md5Bytes); + wait = false; + }, + delegate (string error) + { + errorStr = error; + wait = false; + } + ); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + CleanupTempFiles(apiFile.id); + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to generate file delta hash.", errorStr); + CleanupTempFiles(apiFile.id); + yield break; + } + } + + // validate existing pending version info, if this is a retry + bool versionAlreadyExists = false; + + LogApiFileStatus(apiFile, uploadDeltaFile); + + if (isPreviousUploadRetry) + { + bool isValid = true; + + ApiFile.Version v = apiFile.GetVersion(apiFile.GetLatestVersionNumber()); + if (v != null) + { + if (uploadDeltaFile) + { + isValid = deltaFileSize == v.delta.sizeInBytes && + deltaMD5Base64.CompareTo(v.delta.md5) == 0 && + sigFileSize == v.signature.sizeInBytes && + sigMD5Base64.CompareTo(v.signature.md5) == 0; + } + else + { + isValid = fullFileSize == v.file.sizeInBytes && + fileMD5Base64.CompareTo(v.file.md5) == 0 && + sigFileSize == v.signature.sizeInBytes && + sigMD5Base64.CompareTo(v.signature.md5) == 0; + } + } + else + { + isValid = false; + } + + if (isValid) + { + versionAlreadyExists = true; + + Debug.Log("Using existing version record"); + } + else + { + // delete previous invalid version + Progress(onProgress, apiFile, "Preparing file for upload...", "Cleaning up previous version"); + + while (true) + { + wait = true; + errorStr = ""; + worthRetry = false; + + apiFile.DeleteLatestVersion(fileSuccess, fileFailure); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, null)) + { + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to delete previous incomplete version!", errorStr); + if (!worthRetry) + { + CleanupTempFiles(apiFile.id); + yield break; + } + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + if (!worthRetry) + break; + } + } + } + + LogApiFileStatus(apiFile, uploadDeltaFile); + + // create new version of file + if (!versionAlreadyExists) + { + while (true) + { + Progress(onProgress, apiFile, "Creating file version record..."); + + wait = true; + errorStr = ""; + worthRetry = false; + + if (uploadDeltaFile) + // delta file + apiFile.CreateNewVersion(ApiFile.Version.FileType.Delta, deltaMD5Base64, deltaFileSize, sigMD5Base64, sigFileSize, fileSuccess, fileFailure); + else + // full file + apiFile.CreateNewVersion(ApiFile.Version.FileType.Full, fileMD5Base64, fullFileSize, sigMD5Base64, sigFileSize, fileSuccess, fileFailure); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + CleanupTempFiles(apiFile.id); + yield break; + } + + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Failed to create file version record.", errorStr); + if (!worthRetry) + { + CleanupTempFiles(apiFile.id); + yield break; + } + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + if (!worthRetry) + break; + } + } + + // upload components + + LogApiFileStatus(apiFile, uploadDeltaFile); + + // upload delta + if (uploadDeltaFile) + { + if (apiFile.GetLatestVersion().delta.status == ApiFile.Status.Waiting) + { + Progress(onProgress, apiFile, "Uploading file delta..."); + + wasError = false; + yield return StartCoroutine(UploadFileComponentInternal(apiFile, + ApiFile.Version.FileDescriptor.Type.delta, deltaFilename, deltaMD5Base64, deltaFileSize, + delegate (ApiFile file) + { + Debug.Log("Successfully uploaded file delta."); + apiFile = file; + }, + delegate (string error) + { + Error(onError, apiFile, "Failed to upload file delta.", error); + CleanupTempFiles(apiFile.id); + wasError = true; + }, + delegate (long downloaded, long length) + { + Progress(onProgress, apiFile, "Uploading file delta...", "", Tools.DivideSafe(downloaded, length)); + }, + cancelQuery) + ); + + if (wasError) + yield break; + } + } + // upload file + else + { + if (apiFile.GetLatestVersion().file.status == ApiFile.Status.Waiting) + { + Progress(onProgress, apiFile, "Uploading file..."); + + wasError = false; + yield return StartCoroutine(UploadFileComponentInternal(apiFile, + ApiFile.Version.FileDescriptor.Type.file, filename, fileMD5Base64, fullFileSize, + delegate (ApiFile file) + { + VRC.Core.Logger.Log("Successfully uploaded file.", DebugLevel.All); + apiFile = file; + }, + delegate (string error) + { + Error(onError, apiFile, "Failed to upload file.", error); + CleanupTempFiles(apiFile.id); + wasError = true; + }, + delegate (long downloaded, long length) + { + Progress(onProgress, apiFile, "Uploading file...", "", Tools.DivideSafe(downloaded, length)); + }, + cancelQuery) + ); + + if (wasError) + yield break; + } + } + + LogApiFileStatus(apiFile, uploadDeltaFile); + + // upload signature + if (apiFile.GetLatestVersion().signature.status == ApiFile.Status.Waiting) + { + Progress(onProgress, apiFile, "Uploading file signature..."); + + wasError = false; + yield return StartCoroutine(UploadFileComponentInternal(apiFile, + ApiFile.Version.FileDescriptor.Type.signature, signatureFilename, sigMD5Base64, sigFileSize, + delegate (ApiFile file) + { + VRC.Core.Logger.Log("Successfully uploaded file signature.", DebugLevel.All); + apiFile = file; + }, + delegate (string error) + { + Error(onError, apiFile, "Failed to upload file signature.", error); + CleanupTempFiles(apiFile.id); + wasError = true; + }, + delegate (long downloaded, long length) + { + Progress(onProgress, apiFile, "Uploading file signature...", "", Tools.DivideSafe(downloaded, length)); + }, + cancelQuery) + ); + + if (wasError) + yield break; + } + + LogApiFileStatus(apiFile, uploadDeltaFile); + + // Validate file records queued or complete + Progress(onProgress, apiFile, "Validating upload..."); + + bool isUploadComplete = (uploadDeltaFile + ? apiFile.GetFileDescriptor(apiFile.GetLatestVersionNumber(), ApiFile.Version.FileDescriptor.Type.delta).status == ApiFile.Status.Complete + : apiFile.GetFileDescriptor(apiFile.GetLatestVersionNumber(), ApiFile.Version.FileDescriptor.Type.file).status == ApiFile.Status.Complete); + isUploadComplete = isUploadComplete && + apiFile.GetFileDescriptor(apiFile.GetLatestVersionNumber(), ApiFile.Version.FileDescriptor.Type.signature).status == ApiFile.Status.Complete; + + if (!isUploadComplete) + { + Error(onError, apiFile, "Failed to upload file.", "Record status is not 'complete'"); + CleanupTempFiles(apiFile.id); + yield break; + } + + bool isServerOpQueuedOrComplete = (uploadDeltaFile + ? apiFile.GetFileDescriptor(apiFile.GetLatestVersionNumber(), ApiFile.Version.FileDescriptor.Type.file).status != ApiFile.Status.Waiting + : apiFile.GetFileDescriptor(apiFile.GetLatestVersionNumber(), ApiFile.Version.FileDescriptor.Type.delta).status != ApiFile.Status.Waiting); + + if (!isServerOpQueuedOrComplete) + { + Error(onError, apiFile, "Failed to upload file.", "Record is still in 'waiting' status"); + CleanupTempFiles(apiFile.id); + yield break; + } + + LogApiFileStatus(apiFile, uploadDeltaFile); + + // wait for server processing to complete + Progress(onProgress, apiFile, "Processing upload..."); + float checkDelay = SERVER_PROCESSING_INITIAL_RETRY_TIME; + float maxDelay = SERVER_PROCESSING_MAX_RETRY_TIME; + float timeout = GetServerProcessingWaitTimeoutForDataSize(apiFile.GetLatestVersion().file.sizeInBytes); + double initialStartTime = Time.realtimeSinceStartup; + double startTime = initialStartTime; + while (apiFile.HasQueuedOperation(uploadDeltaFile)) + { + // wait before polling again + Progress(onProgress, apiFile, "Processing upload...", "Checking status in " + Mathf.CeilToInt(checkDelay) + " seconds"); + + while (Time.realtimeSinceStartup - startTime < checkDelay) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + CleanupTempFiles(apiFile.id); + yield break; + } + + if (Time.realtimeSinceStartup - initialStartTime > timeout) + { + LogApiFileStatus(apiFile, uploadDeltaFile); + + Error(onError, apiFile, "Timed out waiting for upload processing to complete."); + CleanupTempFiles(apiFile.id); + yield break; + } + + yield return null; + } + + while (true) + { + // check status + Progress(onProgress, apiFile, "Processing upload...", "Checking status..."); + + wait = true; + worthRetry = false; + errorStr = ""; + API.Fetch<ApiFile>(apiFile.id, fileSuccess, fileFailure); + + while (wait) + { + if (CheckCancelled(cancelQuery, onError, apiFile)) + { + CleanupTempFiles(apiFile.id); + yield break; + } + + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + Error(onError, apiFile, "Checking upload status failed.", errorStr); + if (!worthRetry) + { + CleanupTempFiles(apiFile.id); + yield break; + } + } + + if (!worthRetry) + break; + } + + checkDelay = Mathf.Min(checkDelay * 2, maxDelay); + startTime = Time.realtimeSinceStartup; + } + + // cleanup and wait for it to finish + yield return StartCoroutine(CleanupTempFilesInternal(apiFile.id)); + + Success(onSuccess, apiFile, "Upload complete!"); + } + + private static void LogApiFileStatus(ApiFile apiFile, bool checkDelta, bool logSuccess = false) + { + if (apiFile == null || !apiFile.IsInitialized) + { + Debug.LogFormat("<color=yellow>apiFile not initialized</color>"); + } + else if (apiFile.IsInErrorState()) + { + Debug.LogFormat("<color=yellow>ApiFile {0} is in an error state.</color>", apiFile.name); + } + else if (logSuccess) + VRC.Core.Logger.Log("< color = yellow > Processing { 3}: { 0}, { 1}, { 2}</ color > " + + (apiFile.IsWaitingForUpload() ? "waiting for upload" : "upload complete") + + (apiFile.HasExistingOrPendingVersion() ? "has existing or pending version" : "no previous version") + + (apiFile.IsLatestVersionQueued(checkDelta) ? "latest version queued" : "latest version not queued") + + apiFile.name, DebugLevel.All); + + if (apiFile != null && apiFile.IsInitialized && logSuccess) + { + var apiFields = apiFile.ExtractApiFields(); + if (apiFields != null) + VRC.Core.Logger.Log("<color=yellow>{0}</color>" + VRC.Tools.JsonEncode(apiFields), DebugLevel.All); + } + } + + public IEnumerator CreateFileSignatureInternal(string filename, string outputSignatureFilename, Action onSuccess, Action<string> onError) + { + VRC.Core.Logger.Log("CreateFileSignature: " + filename + " => " + outputSignatureFilename, DebugLevel.All); + + yield return null; + + Stream inStream = null; + FileStream outStream = null; + byte[] buf = new byte[64 * 1024]; + IAsyncResult asyncRead = null; + IAsyncResult asyncWrite = null; + + try + { + inStream = librsync.net.Librsync.ComputeSignature(File.OpenRead(filename)); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't open input file: " + e.Message); + yield break; + } + + try + { + outStream = File.Open(outputSignatureFilename, FileMode.Create, FileAccess.Write); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't create output file: " + e.Message); + yield break; + } + + while (true) + { + try + { + asyncRead = inStream.BeginRead(buf, 0, buf.Length, null, null); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't read file: " + e.Message); + yield break; + } + + while (!asyncRead.IsCompleted) + yield return null; + + int read = 0; + try + { + read = inStream.EndRead(asyncRead); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't read file: " + e.Message); + yield break; + } + + if (read <= 0) + break; + + try + { + asyncWrite = outStream.BeginWrite(buf, 0, read, null, null); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't write file: " + e.Message); + yield break; + } + + while (!asyncWrite.IsCompleted) + yield return null; + + try + { + outStream.EndWrite(asyncWrite); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't write file: " + e.Message); + yield break; + } + } + + inStream.Close(); + outStream.Close(); + + yield return null; + + if (onSuccess != null) + onSuccess(); + } + + public IEnumerator CreateFileDeltaInternal(string newFilename, string existingFileSignaturePath, string outputDeltaFilename, Action onSuccess, Action<string> onError) + { + Debug.Log("CreateFileDelta: " + newFilename + " (delta) " + existingFileSignaturePath + " => " + outputDeltaFilename); + + yield return null; + + Stream inStream = null; + FileStream outStream = null; + byte[] buf = new byte[64 * 1024]; + IAsyncResult asyncRead = null; + IAsyncResult asyncWrite = null; + + try + { + inStream = librsync.net.Librsync.ComputeDelta(File.OpenRead(existingFileSignaturePath), File.OpenRead(newFilename)); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't open input file: " + e.Message); + yield break; + } + + try + { + outStream = File.Open(outputDeltaFilename, FileMode.Create, FileAccess.Write); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't create output file: " + e.Message); + yield break; + } + + while (true) + { + try + { + asyncRead = inStream.BeginRead(buf, 0, buf.Length, null, null); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't read file: " + e.Message); + yield break; + } + + while (!asyncRead.IsCompleted) + yield return null; + + int read = 0; + try + { + read = inStream.EndRead(asyncRead); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't read file: " + e.Message); + yield break; + } + + if (read <= 0) + break; + + try + { + asyncWrite = outStream.BeginWrite(buf, 0, read, null, null); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't write file: " + e.Message); + yield break; + } + + while (!asyncWrite.IsCompleted) + yield return null; + + try + { + outStream.EndWrite(asyncWrite); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't write file: " + e.Message); + yield break; + } + } + + inStream.Close(); + outStream.Close(); + + yield return null; + + if (onSuccess != null) + onSuccess(); + } + + protected static void Success(OnFileOpSuccess onSuccess, ApiFile apiFile, string message) + { + if (apiFile == null) + apiFile = new ApiFile(); + + VRC.Core.Logger.Log("ApiFile " + apiFile.ToStringBrief() + ": Operation Succeeded!", DebugLevel.All); + if (onSuccess != null) + onSuccess(apiFile, message); + } + + protected static void Error(OnFileOpError onError, ApiFile apiFile, string error, string moreInfo = "") + { + if (apiFile == null) + apiFile = new ApiFile(); + + Debug.LogError("ApiFile " + apiFile.ToStringBrief() + ": Error: " + error + "\n" + moreInfo); + if (onError != null) + onError(apiFile, error); + } + + protected static void Progress(OnFileOpProgress onProgress, ApiFile apiFile, string status, string subStatus = "", float pct = 0.0f) + { + if (apiFile == null) + apiFile = new ApiFile(); + + if (onProgress != null) + onProgress(apiFile, status, subStatus, pct); + } + + protected static bool CheckCancelled(FileOpCancelQuery cancelQuery, OnFileOpError onError, ApiFile apiFile) + { + if (apiFile == null) + { + Debug.LogError("apiFile was null"); + return true; + } + + if (cancelQuery != null && cancelQuery(apiFile)) + { + Debug.Log("ApiFile " + apiFile.ToStringBrief() + ": Operation cancelled"); + if (onError != null) + onError(apiFile, "Cancelled by user."); + return true; + } + + return false; + } + + protected static void CleanupTempFiles(string subFolderName) + { + Instance.StartCoroutine(Instance.CleanupTempFilesInternal(subFolderName)); + } + + protected IEnumerator CleanupTempFilesInternal(string subFolderName) + { + if (!string.IsNullOrEmpty(subFolderName)) + { + string folder = VRC.Tools.GetTempFolderPath(subFolderName); + + while (Directory.Exists(folder)) + { + try + { + if (Directory.Exists(folder)) + Directory.Delete(folder, true); + } + catch (System.Exception) + { + } + + yield return null; + } + } + } + + private static void CheckInstance() + { + if (mInstance == null) + { + GameObject go = new GameObject("ApiFileHelper"); + mInstance = go.AddComponent<ApiFileHelper>(); + + try + { + GameObject.DontDestroyOnLoad(go); + } + catch + { + } + } + } + + private float GetServerProcessingWaitTimeoutForDataSize(int size) + { + float timeoutMultiplier = Mathf.Ceil((float)size / (float)SERVER_PROCESSING_WAIT_TIMEOUT_CHUNK_SIZE); + return Mathf.Clamp(timeoutMultiplier * SERVER_PROCESSING_WAIT_TIMEOUT_PER_CHUNK_SIZE, SERVER_PROCESSING_WAIT_TIMEOUT_PER_CHUNK_SIZE, SERVER_PROCESSING_MAX_WAIT_TIMEOUT); + } + + private bool UploadFileComponentValidateFileDesc(ApiFile apiFile, string filename, string md5Base64, long fileSize, ApiFile.Version.FileDescriptor fileDesc, Action<ApiFile> onSuccess, Action<string> onError) + { + if (fileDesc.status != ApiFile.Status.Waiting) + { + // nothing to do (might be a retry) + Debug.Log("UploadFileComponent: (file record not in waiting status, done)"); + if (onSuccess != null) + onSuccess(apiFile); + return false; + } + + if (fileSize != fileDesc.sizeInBytes) + { + if (onError != null) + onError("File size does not match version descriptor"); + return false; + } + if (string.Compare(md5Base64, fileDesc.md5) != 0) + { + if (onError != null) + onError("File MD5 does not match version descriptor"); + return false; + } + + // make sure file is right size + long tempSize = 0; + string errorStr = ""; + if (!VRC.Tools.GetFileSize(filename, out tempSize, out errorStr)) + { + if (onError != null) + onError("Couldn't get file size"); + return false; + } + if (tempSize != fileSize) + { + if (onError != null) + onError("File size does not match input size"); + return false; + } + + return true; + } + + private IEnumerator UploadFileComponentDoSimpleUpload(ApiFile apiFile, + ApiFile.Version.FileDescriptor.Type fileDescriptorType, + string filename, + string md5Base64, + long fileSize, + Action<ApiFile> onSuccess, + Action<string> onError, + Action<long, long> onProgress, + FileOpCancelQuery cancelQuery) + { + OnFileOpError onCancelFunc = delegate (ApiFile file, string s) + { + if (onError != null) + onError(s); + }; + + string uploadUrl = ""; + while (true) + { + bool wait = true; + string errorStr = ""; + bool worthRetry = false; + + apiFile.StartSimpleUpload(fileDescriptorType, + (c) => + { + uploadUrl = (c as ApiDictContainer).ResponseDictionary["url"] as string; + wait = false; + }, + (c) => + { + errorStr = "Failed to start upload: " + c.Error; + wait = false; + if (c.Code == 400) + worthRetry = true; + }); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + if (onError != null) + onError(errorStr); + if (!worthRetry) + yield break; + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + if (!worthRetry) + break; + } + + // PUT file + { + bool wait = true; + string errorStr = ""; + + VRC.HttpRequest req = ApiFile.PutSimpleFileToURL(uploadUrl, filename, GetMimeTypeFromExtension(Path.GetExtension(filename)), md5Base64, true, + delegate () + { + wait = false; + }, + delegate (string error) + { + errorStr = "Failed to upload file: " + error; + wait = false; + }, + delegate (long uploaded, long length) + { + if (onProgress != null) + onProgress(uploaded, length); + } + ); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + if (req != null) + req.Abort(); + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + if (onError != null) + onError(errorStr); + yield break; + } + } + + // finish upload + while (true) + { + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + bool wait = true; + string errorStr = ""; + bool worthRetry = false; + + apiFile.FinishUpload(fileDescriptorType, null, + (c) => + { + apiFile = c.Model as ApiFile; + wait = false; + }, + (c) => + { + errorStr = "Failed to finish upload: " + c.Error; + wait = false; + if (c.Code == 400) + worthRetry = false; + }); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + if (onError != null) + onError(errorStr); + if (!worthRetry) + yield break; + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + if (!worthRetry) + break; + } + + } + + private IEnumerator UploadFileComponentDoMultipartUpload(ApiFile apiFile, + ApiFile.Version.FileDescriptor.Type fileDescriptorType, + string filename, + string md5Base64, + long fileSize, + Action<ApiFile> onSuccess, + Action<string> onError, + Action<long, long> onProgress, + FileOpCancelQuery cancelQuery) + { + FileStream fs = null; + OnFileOpError onCancelFunc = delegate (ApiFile file, string s) + { + if (fs != null) + fs.Close(); + if (onError != null) + onError(s); + }; + + // query multipart upload status. + // we might be resuming a previous upload + ApiFile.UploadStatus uploadStatus = null; + { + while (true) + { + bool wait = true; + string errorStr = ""; + bool worthRetry = false; + + apiFile.GetUploadStatus(apiFile.GetLatestVersionNumber(), fileDescriptorType, + (c) => + { + uploadStatus = c.Model as ApiFile.UploadStatus; + wait = false; + + VRC.Core.Logger.Log("Found existing multipart upload status (next part = " + uploadStatus.nextPartNumber + ")", DebugLevel.All); + }, + (c) => + { + errorStr = "Failed to query multipart upload status: " + c.Error; + wait = false; + if (c.Code == 400) + worthRetry = true; + }); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + if (onError != null) + onError(errorStr); + if (!worthRetry) + yield break; + } + + if (!worthRetry) + break; + } + } + + // split file into chunks + try + { + fs = File.OpenRead(filename); + } + catch (Exception e) + { + if (onError != null) + onError("Couldn't open file: " + e.Message); + yield break; + } + + byte[] buffer = new byte[kMultipartUploadChunkSize * 2]; + + long totalBytesUploaded = 0; + List<string> etags = new List<string>(); + if (uploadStatus != null) + etags = uploadStatus.etags.ToList(); + + int numParts = Mathf.Max(1, Mathf.FloorToInt((float)fs.Length / (float)kMultipartUploadChunkSize)); + for (int partNumber = 1; partNumber <= numParts; partNumber++) + { + // read chunk + int bytesToRead = partNumber < numParts ? kMultipartUploadChunkSize : (int)(fs.Length - fs.Position); + int bytesRead = 0; + try + { + bytesRead = fs.Read(buffer, 0, bytesToRead); + } + catch (Exception e) + { + fs.Close(); + if (onError != null) + onError("Couldn't read file: " + e.Message); + yield break; + } + + if (bytesRead != bytesToRead) + { + fs.Close(); + if (onError != null) + onError("Couldn't read file: read incorrect number of bytes from stream"); + yield break; + } + + // check if this part has been upload already + // NOTE: uploadStatus.nextPartNumber == number of parts already uploaded + if (uploadStatus != null && partNumber <= uploadStatus.nextPartNumber) + { + totalBytesUploaded += bytesRead; + continue; + } + + // start upload + string uploadUrl = ""; + + while (true) + { + bool wait = true; + string errorStr = ""; + bool worthRetry = false; + + apiFile.StartMultipartUpload(fileDescriptorType, partNumber, + (c) => + { + uploadUrl = (c as ApiDictContainer).ResponseDictionary["url"] as string; + wait = false; + }, + (c) => + { + errorStr = "Failed to start part upload: " + c.Error; + wait = false; + }); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + fs.Close(); + if (onError != null) + onError(errorStr); + if (!worthRetry) + yield break; + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + if (!worthRetry) + break; + } + + // PUT file part + { + bool wait = true; + string errorStr = ""; + + VRC.HttpRequest req = ApiFile.PutMultipartDataToURL(uploadUrl, buffer, bytesRead, GetMimeTypeFromExtension(Path.GetExtension(filename)), true, + delegate (string etag) + { + if (!string.IsNullOrEmpty(etag)) + etags.Add(etag); + totalBytesUploaded += bytesRead; + wait = false; + }, + delegate (string error) + { + errorStr = "Failed to upload data: " + error; + wait = false; + }, + delegate (long uploaded, long length) + { + if (onProgress != null) + onProgress(totalBytesUploaded + uploaded, fileSize); + } + ); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + if (req != null) + req.Abort(); + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + fs.Close(); + if (onError != null) + onError(errorStr); + yield break; + } + } + } + + // finish upload + while (true) + { + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + bool wait = true; + string errorStr = ""; + bool worthRetry = false; + + apiFile.FinishUpload(fileDescriptorType, etags, + (c) => + { + apiFile = c.Model as ApiFile; + wait = false; + }, + (c) => + { + errorStr = "Failed to finish upload: " + c.Error; + wait = false; + if (c.Code == 400) + worthRetry = true; + }); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + yield break; + } + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + fs.Close(); + if (onError != null) + onError(errorStr); + if (!worthRetry) + yield break; + } + + // delay to let write get through servers + yield return new WaitForSecondsRealtime(kPostWriteDelay); + + if (!worthRetry) + break; + } + + fs.Close(); + } + + private IEnumerator UploadFileComponentVerifyRecord(ApiFile apiFile, + ApiFile.Version.FileDescriptor.Type fileDescriptorType, + string filename, + string md5Base64, + long fileSize, + ApiFile.Version.FileDescriptor fileDesc, + Action<ApiFile> onSuccess, + Action<string> onError, + Action<long, long> onProgress, + FileOpCancelQuery cancelQuery) + { + OnFileOpError onCancelFunc = delegate (ApiFile file, string s) + { + if (onError != null) + onError(s); + }; + + float initialStartTime = Time.realtimeSinceStartup; + float startTime = initialStartTime; + float timeout = GetServerProcessingWaitTimeoutForDataSize(fileDesc.sizeInBytes); + float waitDelay = SERVER_PROCESSING_INITIAL_RETRY_TIME; + float maxDelay = SERVER_PROCESSING_MAX_RETRY_TIME; + + while (true) + { + if (apiFile == null) + { + if (onError != null) + onError("ApiFile is null"); + yield break; + } + + var desc = apiFile.GetFileDescriptor(apiFile.GetLatestVersionNumber(), fileDescriptorType); + if (desc == null) + { + if (onError != null) + onError("File descriptor is null ('" + fileDescriptorType + "')"); + yield break; + } + + if (desc.status != ApiFile.Status.Waiting) + { + // upload completed or is processing + break; + } + + // wait for next poll + while (Time.realtimeSinceStartup - startTime < waitDelay) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + yield break; + } + + if (Time.realtimeSinceStartup - initialStartTime > timeout) + { + if (onError != null) + onError("Couldn't verify upload status: Timed out wait for server processing"); + yield break; + } + + yield return null; + } + + + while (true) + { + bool wait = true; + string errorStr = ""; + bool worthRetry = false; + + apiFile.Refresh( + (c) => + { + wait = false; + }, + (c) => + { + errorStr = "Couldn't verify upload status: " + c.Error; + wait = false; + if (c.Code == 400) + worthRetry = true; + }); + + while (wait) + { + if (CheckCancelled(cancelQuery, onCancelFunc, apiFile)) + { + yield break; + } + + yield return null; + } + + if (!string.IsNullOrEmpty(errorStr)) + { + if (onError != null) + onError(errorStr); + if (!worthRetry) + yield break; + } + + if (!worthRetry) + break; + } + + waitDelay = Mathf.Min(waitDelay * 2, maxDelay); + startTime = Time.realtimeSinceStartup; + } + + if (onSuccess != null) + onSuccess(apiFile); + } + + private IEnumerator UploadFileComponentInternal(ApiFile apiFile, + ApiFile.Version.FileDescriptor.Type fileDescriptorType, + string filename, + string md5Base64, + long fileSize, + Action<ApiFile> onSuccess, + Action<string> onError, + Action<long, long> onProgress, + FileOpCancelQuery cancelQuery) + { + VRC.Core.Logger.Log("UploadFileComponent: " + fileDescriptorType + " (" + apiFile.id + "): " + filename, DebugLevel.All); + ApiFile.Version.FileDescriptor fileDesc = apiFile.GetFileDescriptor(apiFile.GetLatestVersionNumber(), fileDescriptorType); + + if (!UploadFileComponentValidateFileDesc(apiFile, filename, md5Base64, fileSize, fileDesc, onSuccess, onError)) + yield break; + + switch (fileDesc.category) + { + case ApiFile.Category.Simple: + yield return UploadFileComponentDoSimpleUpload(apiFile, fileDescriptorType, filename, md5Base64, fileSize, onSuccess, onError, onProgress, cancelQuery); + break; + case ApiFile.Category.Multipart: + yield return UploadFileComponentDoMultipartUpload(apiFile, fileDescriptorType, filename, md5Base64, fileSize, onSuccess, onError, onProgress, cancelQuery); + break; + default: + if (onError != null) + onError("Unknown file category type: " + fileDesc.category); + yield break; + } + + yield return UploadFileComponentVerifyRecord(apiFile, fileDescriptorType, filename, md5Base64, fileSize, fileDesc, onSuccess, onError, onProgress, cancelQuery); + } + } +} + +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ApiFileHelper.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ApiFileHelper.cs.meta new file mode 100644 index 00000000..29e6938a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ApiFileHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 36c0d886a26373c46be857f2fc441071 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/AudioManagerSettings.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/AudioManagerSettings.cs new file mode 100644 index 00000000..108bd7e2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/AudioManagerSettings.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace VRC.SDKBase +{ + public class AudioManagerSettings + { + public const float MinVoiceSendDistance = 25.0f; // meters + public const float MaxVoiceSendDistancePctOfFarRange = 0.5f; + public const float VoiceFadeOutDistancePctOfFarRange = 0.25f; + public const float RoomAudioGain = 10f; // dB + public const float RoomAudioMaxRange = 80f; // meters + public const float VoiceGain = 15f; // dB + public const float VoiceMaxRange = 25f; // meters, this is half the oculus inv sq max range + public const float LipsyncGain = 1f; // multiplier, not dB! + public const float AvatarAudioMaxGain = 10f; // dB + public const float AvatarAudioMaxRange = 40f; // meters + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/AudioManagerSettings.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/AudioManagerSettings.cs.meta new file mode 100644 index 00000000..91be94d7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/AudioManagerSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: acadc6659c5ab3446ad0d5de2563f95f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/CommunityLabsConstants.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/CommunityLabsConstants.cs new file mode 100644 index 00000000..31ec162d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/CommunityLabsConstants.cs @@ -0,0 +1,20 @@ +using UnityEngine; + +namespace VRCSDK2 +{ + public class CommunityLabsConstants + { + public const string COMMUNITY_LABS_DOCUMENTATION_URL = "https://docs.vrchat.com/docs/vrchat-community-labs"; + + public const string MANAGE_WORLD_IN_BROWSER_STRING = "Manage World in Browser"; + public const string READ_COMMUNITY_LABS_DOCS_STRING = "Read Community Labs Docs"; + + public const string UPLOADED_CONTENT_SUCCESSFULLY_MESSAGE = "Content Successfully Uploaded!"; + + public const string UPLOADED_NEW_PRIVATE_WORLD_CONFIRMATION_MESSAGE = "You've uploaded a private world. You can find it on the \"Mine\" row in your worlds menu."; + public const string UPDATED_PRIVATE_WORLD_CONFIRMATION_MESSAGE = "You've updated your private world. You can find it on the \"Mine\" row in your worlds menu."; + public const string PUBLISHED_WORLD_TO_COMMUNITY_LABS_CONFIRMATION_MESSAGE = "You've uploaded and published a world to Community Labs."; + public const string UPDATED_COMMUNITY_LABS_WORLD_CONFIRMATION_MESSAGE = "You've updated your Community Labs world."; + public const string UPDATED_PUBLIC_WORLD_CONFIRMATION_MESSAGE = "You've updated your public world."; + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/CommunityLabsConstants.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/CommunityLabsConstants.cs.meta new file mode 100644 index 00000000..5a616c22 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/CommunityLabsConstants.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d047eaa3325d654aa62ccad6f73eb93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ContentUploadedDialog.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ContentUploadedDialog.cs new file mode 100644 index 00000000..2d136979 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ContentUploadedDialog.cs @@ -0,0 +1,133 @@ +using System.Collections; +using System.Collections.Generic; +using System; +using System.IO; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.SceneManagement; +using VRC.Core; +#if UNITY_EDITOR +using UnityEditor; + +namespace VRCSDK2 +{ + public class ContentUploadedDialog : EditorWindow + { + private Texture2D clIconGraphic = null; + private Color dialogTextColor = Color.white; + private string contentUrl = null; + + private void OnEnable() + { + if(EditorGUIUtility.isProSkin) + dialogTextColor = Color.white; + else + dialogTextColor = Color.black; + + clIconGraphic = Resources.Load("vrcSdkClDialogNewIcon") as Texture2D; + } + + public void setContentURL(string url = null) + { + contentUrl = url; + } + + void OnGUI() + { + const int CONTENT_UPLOADED_BORDER_SIZE = 20; + const int CONTENT_UPLOADED_HORIZONTAL_SPACING = 10; + + const int CONTENT_UPLOADED_BUTTON_WIDTH = 260; + const int CONTENT_UPLOADED_BUTTON_HEIGHT = 40; + const int CONTENT_CL_VERTICAL_HEADER_SPACING = 40; + + const int CONTENT_CL_TEXT_REGION_HEIGHT = 120; + + const int CONTENT_MIN_WINDOW_WIDTH = (CONTENT_UPLOADED_BUTTON_WIDTH * 2) + CONTENT_UPLOADED_HORIZONTAL_SPACING + (CONTENT_UPLOADED_BORDER_SIZE * 2); + const int CONTENT_MIN_WINDOW_HEIGHT = CONTENT_UPLOADED_BUTTON_HEIGHT + CONTENT_CL_VERTICAL_HEADER_SPACING + CONTENT_CL_TEXT_REGION_HEIGHT + (CONTENT_UPLOADED_BORDER_SIZE * 2); + + GUILayout.BeginHorizontal(); + GUILayout.Space(CONTENT_UPLOADED_BORDER_SIZE); + + // Community Labs graphic + if (RuntimeWorldCreation.IsCurrentWorldInCommunityLabs && (null != clIconGraphic)) + { + GUILayout.Label(new GUIContent(clIconGraphic), GUIStyle.none); + } + + this.minSize = new Vector2(CONTENT_MIN_WINDOW_WIDTH, CONTENT_MIN_WINDOW_HEIGHT); + + GUILayout.BeginVertical(); + if (RuntimeWorldCreation.IsCurrentWorldInCommunityLabs && (null != clIconGraphic)) + GUILayout.Space(CONTENT_CL_VERTICAL_HEADER_SPACING); + GUIStyle uploadedTitleStyle = new GUIStyle(EditorStyles.boldLabel); + uploadedTitleStyle.normal.textColor = dialogTextColor; + uploadedTitleStyle.fontSize = 15; + GUILayout.Label(CommunityLabsConstants.UPLOADED_CONTENT_SUCCESSFULLY_MESSAGE, uploadedTitleStyle); + + string uploadedMessage = CommunityLabsConstants.UPLOADED_NEW_PRIVATE_WORLD_CONFIRMATION_MESSAGE; + + if (!RuntimeWorldCreation.IsCurrentWorldUploaded) + { + if (RuntimeWorldCreation.IsCurrentWorldInCommunityLabs) + uploadedMessage = CommunityLabsConstants.PUBLISHED_WORLD_TO_COMMUNITY_LABS_CONFIRMATION_MESSAGE; + else + uploadedMessage = CommunityLabsConstants.UPLOADED_NEW_PRIVATE_WORLD_CONFIRMATION_MESSAGE; + } + else + { + if (RuntimeWorldCreation.IsCurrentWorldInCommunityLabs) + { + uploadedMessage = CommunityLabsConstants.UPDATED_COMMUNITY_LABS_WORLD_CONFIRMATION_MESSAGE; + } + else + { + if (RuntimeWorldCreation.IsCurrentWorldPubliclyPublished) + uploadedMessage = CommunityLabsConstants.UPDATED_PUBLIC_WORLD_CONFIRMATION_MESSAGE; + else + uploadedMessage = CommunityLabsConstants.UPDATED_PRIVATE_WORLD_CONFIRMATION_MESSAGE; + } + } + + GUIStyle uploadedMessageStyle = new GUIStyle(EditorStyles.label); + uploadedMessageStyle.normal.textColor = dialogTextColor; + uploadedMessageStyle.fontSize = 13; + uploadedMessageStyle.wordWrap = true; + GUILayout.Label(uploadedMessage, uploadedMessageStyle); + GUILayout.EndVertical(); + + GUILayout.EndHorizontal(); + + GUILayout.FlexibleSpace(); + + GUILayout.BeginHorizontal(); + + GUILayout.Space(CONTENT_UPLOADED_BORDER_SIZE); + + if (RuntimeWorldCreation.IsCurrentWorldInCommunityLabs) + { + if (GUILayout.Button(CommunityLabsConstants.READ_COMMUNITY_LABS_DOCS_STRING, GUILayout.Width(CONTENT_UPLOADED_BUTTON_WIDTH), GUILayout.Height(CONTENT_UPLOADED_BUTTON_HEIGHT))) + { + Application.OpenURL(CommunityLabsConstants.COMMUNITY_LABS_DOCUMENTATION_URL); + } + } + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button(CommunityLabsConstants.MANAGE_WORLD_IN_BROWSER_STRING, GUILayout.Width(CONTENT_UPLOADED_BUTTON_WIDTH), GUILayout.Height(CONTENT_UPLOADED_BUTTON_HEIGHT))) + { + Application.OpenURL(contentUrl); + } + + if (RuntimeWorldCreation.IsCurrentWorldInCommunityLabs) + GUILayout.Space(CONTENT_UPLOADED_BORDER_SIZE); + else + GUILayout.FlexibleSpace(); + + GUILayout.EndHorizontal(); + + GUILayout.Space(CONTENT_UPLOADED_BORDER_SIZE); + } + } +} +#endif diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ContentUploadedDialog.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ContentUploadedDialog.cs.meta new file mode 100644 index 00000000..b589cde9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/ContentUploadedDialog.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e1c693656bf5d584b87df969efeb5536 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/GameViewMethods.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/GameViewMethods.cs new file mode 100644 index 00000000..50504090 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/GameViewMethods.cs @@ -0,0 +1,49 @@ +using System; +using System.Reflection; + +namespace VRC. SDKBase +{ + public static class GameViewMethods + { + private static readonly Type GameViewType = System.Type.GetType("UnityEditor.GameView,UnityEditor"); + private static readonly Type PlayModeViewType = System.Type.GetType("UnityEditor.PlayModeView, UnityEditor"); + + public static int GetSelectedSizeIndex() + { + return (int) GetSelectedSizeProperty().GetValue(GetPlayModeViewObject()); + } + + public static void SetSelectedSizeIndex(int value) + { + var selectedSizeIndexProp = GetSelectedSizeProperty(); + selectedSizeIndexProp.SetValue(GetPlayModeViewObject(), value, null); + } + + // Set it to something else just to force a refresh + public static void ResizeGameView() + { + int current = GetSelectedSizeIndex(); + SetSelectedSizeIndex(current == 0 ? 1 : 0); + } + + private static PropertyInfo GetSelectedSizeProperty() + { + return GameViewType.GetProperty("selectedSizeIndex", + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + } + + private static Object GetPlayModeViewObject() + { + MethodInfo GetMainPlayModeView = PlayModeViewType.GetMethod("GetMainPlayModeView", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + return GetMainPlayModeView.Invoke(null, null); + } + + public static void Repaint() + { + MethodInfo RepaintAll = PlayModeViewType.GetMethod("RepaintAll", BindingFlags.NonPublic | BindingFlags.Static); + RepaintAll.Invoke(GetPlayModeViewObject(), null); + } + + } +}
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/GameViewMethods.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/GameViewMethods.cs.meta new file mode 100644 index 00000000..38eb991a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/GameViewMethods.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0c461e358764cd1ab95544e34b0346c +timeCreated: 1627603592
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback.meta new file mode 100644 index 00000000..6d91ee1e --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3a112d2b0d1702748a7b089bba1faeac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback/FallbackMaterialCache.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback/FallbackMaterialCache.cs new file mode 100644 index 00000000..5a65be9b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback/FallbackMaterialCache.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +public class FallbackMaterialCache +{ + private readonly Dictionary<Material, Material> _fallbackMaterialCache = new Dictionary<Material, Material>(); + + public void AddFallbackMaterial(Material material, Material fallbackMaterial) + { + if(!_fallbackMaterialCache.ContainsKey(material)) + { + _fallbackMaterialCache.Add(material, fallbackMaterial); + } + else + { + Debug.LogError($"Attempted to add a duplicate fallback material '{fallbackMaterial.name}' for original material '{material.name}'."); + } + } + + public bool TryGetFallbackMaterial(Material material, out Material fallbackMaterial) + { + if(material != null) + { + return _fallbackMaterialCache.TryGetValue(material, out fallbackMaterial); + } + + fallbackMaterial = null; + return false; + } + + public void Clear() + { + Material[] cachedFallbackMaterials = _fallbackMaterialCache.Values.ToArray(); + for(int i = cachedFallbackMaterials.Length - 1; i >= 0; i--) + { + Object.Destroy(cachedFallbackMaterials[i]); + } + + _fallbackMaterialCache.Clear(); + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback/FallbackMaterialCache.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback/FallbackMaterialCache.cs.meta new file mode 100644 index 00000000..64637629 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/MaterialFallback/FallbackMaterialCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10121679f780956408f9a434a526f553 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeAPICreation.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeAPICreation.cs new file mode 100644 index 00000000..154fba15 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeAPICreation.cs @@ -0,0 +1,324 @@ +using System.Collections; +using System.Collections.Generic; +using System; +using System.IO; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.SceneManagement; +using VRC.Core; +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace VRCSDK2 +{ +#if UNITY_EDITOR + + public class RuntimeAPICreation : MonoBehaviour + { + public VRC.Core.PipelineManager pipelineManager; + + protected bool forceNewFileCreation = false; + protected bool useFileApi = false; + + protected bool isUploading = false; + protected float uploadProgress = 0f; + protected string uploadMessage; + protected string uploadTitle; + + protected string uploadVrcPath; + protected string uploadUnityPackagePath; + + protected string cloudFrontAssetUrl; + protected string cloudFrontImageUrl; + protected string cloudFrontUnityPackageUrl; + + protected CameraImageCapture imageCapture; + + private bool cancelRequested = false; + + public static bool publishingToCommunityLabs = false; + + private Dictionary<string, string> mRetryState = new Dictionary<string, string>(); + + protected bool isUpdate { get { return pipelineManager.completedSDKPipeline; } } + + protected void Start() + { + if (!Application.isEditor || !Application.isPlaying) + return; + + PipelineSaver ps = GameObject.FindObjectOfType<PipelineSaver>(); + pipelineManager = ps.gameObject.GetComponent<PipelineManager>(); + + imageCapture = GetComponent<CameraImageCapture>(); + imageCapture.shotCamera = GameObject.Find("VRCCam").GetComponent<Camera>(); + + LoadUploadRetryStateFromCache(); + + forceNewFileCreation = UnityEditor.EditorPrefs.GetBool("forceNewFileCreation", true); + useFileApi = UnityEditor.EditorPrefs.GetBool("useFileApi", false); + + API.SetOnlineMode(true); + } + + protected void Update() + { + if (isUploading) + { + bool cancelled = UnityEditor.EditorUtility.DisplayCancelableProgressBar(uploadTitle, uploadMessage, uploadProgress); + if (cancelled) + { + cancelRequested = true; + } + + if (EditorApplication.isPaused) + EditorApplication.isPaused = false; + + } + } + + protected void LoadUploadRetryStateFromCache() + { + try + { + string json = File.ReadAllText(GetUploadRetryStateFilePath()); + mRetryState = VRC.Tools.ObjDictToStringDict(VRC.Tools.JsonDecode(json) as Dictionary<string, object>); + + Debug.LogFormat("<color=yellow> loaded retry state: {0}</color>", json); + } + catch (Exception) + { + // normal case + return; + } + + Debug.Log("Loaded upload retry state from: " + GetUploadRetryStateFilePath()); + } + + protected void SaveUploadRetryState(string key, string val) + { + if (string.IsNullOrEmpty(val)) + return; + mRetryState[key] = val; + SaveUploadRetryState(); + } + + protected void SaveUploadRetryState() + { + try + { + Directory.CreateDirectory(Path.GetDirectoryName(GetUploadRetryStateFilePath())); + string json = VRC.Tools.JsonEncode(mRetryState); + File.WriteAllText(GetUploadRetryStateFilePath(), json); + + Debug.LogFormat("<color=yellow> wrote retry state: {0}</color>", json); + } + catch (Exception e) + { + Debug.LogError("Couldn't save upload retry state: " + GetUploadRetryStateFilePath() + "\n" + e.Message); + return; + } + + Debug.Log("Saved upload retry state to: " + GetUploadRetryStateFilePath()); + } + + protected void ClearUploadRetryState() + { + try + { + if (!File.Exists(GetUploadRetryStateFilePath())) + return; + + File.Delete(GetUploadRetryStateFilePath()); + } + catch (Exception e) + { + Debug.LogError("Couldn't delete upload retry state: " + GetUploadRetryStateFilePath() + "\n" + e.Message); + return; + } + + Debug.Log("Cleared upload retry state at: " + GetUploadRetryStateFilePath()); + } + + protected string GetUploadRetryStateFilePath() + { + string id = UnityEditor.AssetDatabase.AssetPathToGUID(SceneManager.GetActiveScene().path); + return Path.Combine(VRC.Tools.GetTempFolderPath(id), "upload_retry.dat"); + } + + protected string GetUploadRetryStateValue(string key) + { + return mRetryState.ContainsKey(key) ? mRetryState[key] : ""; + } + + protected virtual void DisplayUpdateCompletedDialog(string contentUrl=null) + { + if (UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "Update Complete! Launch VRChat to see your uploaded content." + (null==contentUrl ? "" : "\n\nManage content at: " + contentUrl ), (null == contentUrl) ? "Okay" : CommunityLabsConstants.MANAGE_WORLD_IN_BROWSER_STRING, (null == contentUrl) ? "" : "Done" )) + { + if (null!=contentUrl) + { + Application.OpenURL(contentUrl); + } + } + } + + protected void OnSDKPipelineComplete(string contentUrl=null) + { + VRC.Core.Logger.Log("OnSDKPipelineComplete", DebugLevel.All); + isUploading = false; + pipelineManager.completedSDKPipeline = true; + ClearUploadRetryState(); + UnityEditor.EditorPrefs.SetBool("forceNewFileCreation", false); + UnityEditor.EditorApplication.isPaused = false; + UnityEditor.EditorApplication.isPlaying = false; + UnityEditor.EditorUtility.ClearProgressBar(); + DisplayUpdateCompletedDialog(contentUrl); + } + + protected void OnSDKPipelineError(string error, string details) + { + VRC.Core.Logger.Log("OnSDKPipelineError: " + error + " - " + details, DebugLevel.All); + isUploading = false; + pipelineManager.completedSDKPipeline = true; + UnityEditor.EditorApplication.isPaused = false; + UnityEditor.EditorApplication.isPlaying = false; + UnityEditor.EditorUtility.ClearProgressBar(); + if (cancelRequested) + UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "The update was cancelled.", "Okay"); + else + UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "Error updating content. " + error + "\n" + details, "Okay"); + } + + protected void SetUploadProgress(string title, string message, float progress) + { + uploadTitle = title; + uploadMessage = message; + uploadProgress = progress; + } + + protected bool WasCancelRequested(ApiFile apiFile) + { + return cancelRequested; + } + + protected void PrepareUnityPackageForS3(string packagePath, string blueprintId, int version, AssetVersion assetVersion) + { + uploadUnityPackagePath = Application.temporaryCachePath + "/" + blueprintId + "_" + version.ToString() + "_" + Application.unityVersion + "_" + assetVersion.ApiVersion + "_" + VRC.Tools.Platform + + "_" + API.GetServerEnvironmentForApiUrl() + ".unitypackage"; + uploadUnityPackagePath.Trim(); + uploadUnityPackagePath.Replace(' ', '_'); + + if (System.IO.File.Exists(uploadUnityPackagePath)) + System.IO.File.Delete(uploadUnityPackagePath); + + System.IO.File.Copy(packagePath, uploadUnityPackagePath); + } + + protected void PrepareVRCPathForS3(string abPath, string blueprintId, int version, AssetVersion assetVersion) + { + uploadVrcPath = Application.temporaryCachePath + "/" + blueprintId + "_" + version.ToString() + "_" + Application.unityVersion + "_" + assetVersion.ApiVersion + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl() + System.IO.Path.GetExtension(abPath); + uploadVrcPath.Trim(); + uploadVrcPath.Replace(' ', '_'); + + if (System.IO.File.Exists(uploadVrcPath)) + System.IO.File.Delete(uploadVrcPath); + + System.IO.File.Copy(abPath, uploadVrcPath); + } + + protected IEnumerator UploadFile(string filename, string existingFileUrl, string friendlyFilename, string fileType, Action<string> onSuccess) + { + if (string.IsNullOrEmpty(filename)) + yield break; + VRC.Core.Logger.Log("Uploading " + fileType + "(" + filename + ") ...", DebugLevel.All); + SetUploadProgress("Uploading " + fileType + "...", "", 0.0f); + + string fileId = GetUploadRetryStateValue(filename); + if (string.IsNullOrEmpty(fileId)) + fileId = isUpdate ? ApiFile.ParseFileIdFromFileAPIUrl(existingFileUrl) : ""; + string errorStr = ""; + string newFileUrl = ""; + + + yield return StartCoroutine(ApiFileHelper.Instance.UploadFile(filename, forceNewFileCreation ? "" : fileId, friendlyFilename, + delegate (ApiFile apiFile, string message) + { + newFileUrl = apiFile.GetFileURL(); + if (VRC.Core.Logger.DebugLevelIsEnabled(DebugLevel.API)) + VRC.Core.Logger.Log(fileType + " upload succeeded: " + message + " (" + filename + + ") => " + apiFile.ToString(), DebugLevel.API); + else + VRC.Core.Logger.Log(fileType + " upload succeeded ", DebugLevel.Always); + }, + delegate (ApiFile apiFile, string error) + { + SaveUploadRetryState(filename, apiFile.id); + + errorStr = error; + Debug.LogError(fileType + " upload failed: " + error + " (" + filename + + ") => " + apiFile.ToString()); + }, + delegate (ApiFile apiFile, string status, string subStatus, float pct) + { + SetUploadProgress("Uploading " + fileType + "...", status + (!string.IsNullOrEmpty(subStatus) ? " (" + subStatus + ")" : ""), pct); + }, + WasCancelRequested + )); + + if (!string.IsNullOrEmpty(errorStr)) + { + OnSDKPipelineError(fileType + " upload failed.", errorStr); + yield break; + } + + if (onSuccess != null) + onSuccess(newFileUrl); + } + + protected IEnumerator UpdateImage(string existingFileUrl, string friendlyFileName) + { + string imagePath = imageCapture.TakePicture(); + + if (!string.IsNullOrEmpty(imagePath)) + { + yield return StartCoroutine(UploadFile(imagePath, existingFileUrl, friendlyFileName, "Image", + delegate (string fileUrl) + { + cloudFrontImageUrl = fileUrl; + } + )); + } + } + + protected virtual IEnumerator CreateBlueprint() + { + throw new NotImplementedException(); + } + + protected virtual IEnumerator UpdateBlueprint() + { + throw new NotImplementedException(); + } + + protected bool ValidateNameInput(InputField nameInput) + { + bool isValid = true; + if (string.IsNullOrEmpty(nameInput.text)) + { + isUploading = false; + UnityEditor.EditorUtility.DisplayDialog("Invalid Input", "Cannot leave the name field empty.", "OK"); + isValid = false; + } + return isValid; + } + + protected bool ValidateAssetBundleBlueprintID(string blueprintID) + { + string lastBuiltID = UnityEditor.EditorPrefs.GetString("lastBuiltAssetBundleBlueprintID", ""); + return !string.IsNullOrEmpty(lastBuiltID) && lastBuiltID == blueprintID; + } + } +#endif + +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeAPICreation.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeAPICreation.cs.meta new file mode 100644 index 00000000..a6fb7e10 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeAPICreation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3132e0ab7e16494a9d492087a1ca447 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeBlueprintCreation.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeBlueprintCreation.cs new file mode 100644 index 00000000..7017dbae --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeBlueprintCreation.cs @@ -0,0 +1,421 @@ +using UnityEngine; +using UnityEngine.UI; +using System.Collections; +using System.Collections.Generic; +using VRC.Core; +using VRC.SDKBase; + +namespace VRCSDK2 +{ +#if UNITY_EDITOR + public class RuntimeBlueprintCreation : RuntimeAPICreation + { + public GameObject waitingPanel; + public GameObject blueprintPanel; + public GameObject errorPanel; + + public Text titleText; + public InputField blueprintName; + public InputField blueprintDescription; + public RawImage bpImage; + public Image liveBpImage; + public Toggle shouldUpdateImageToggle; + public Toggle contentSex; + public Toggle contentViolence; + public Toggle contentGore; + public Toggle contentOther; + public Toggle developerAvatar; + public Toggle sharePrivate; + public Toggle sharePublic; + public Toggle tagFallback; + + public UnityEngine.UI.Button uploadButton; + + private ApiAvatar apiAvatar; + + new void Start() + { + if (!Application.isEditor || !Application.isPlaying) + return; + + base.Start(); + + var desc = pipelineManager.GetComponent<VRC.SDKBase.VRC_AvatarDescriptor>(); + desc.PositionPortraitCamera(imageCapture.shotCamera.transform); + + Application.runInBackground = true; + UnityEngine.XR.XRSettings.enabled = false; + + uploadButton.onClick.AddListener(SetupUpload); + + shouldUpdateImageToggle.onValueChanged.AddListener(ToggleUpdateImage); + + Login(); + } + + void LoginErrorCallback(string obj) + { + VRC.Core.Logger.LogError("Could not log in - " + obj, DebugLevel.Always); + blueprintPanel.SetActive(false); + errorPanel.SetActive(true); + } + + void Login() + { + if (!ApiCredentials.Load()) + LoginErrorCallback("Not logged in"); + else + APIUser.InitialFetchCurrentUser( + delegate (ApiModelContainer<APIUser> c) + { + pipelineManager.user = c.Model as APIUser; + + ApiAvatar av = new ApiAvatar() { id = pipelineManager.blueprintId }; + av.Get(false, + (c2) => + { + VRC.Core.Logger.Log("<color=magenta>Updating an existing avatar.</color>", DebugLevel.API); + apiAvatar = c2.Model as ApiAvatar; + pipelineManager.completedSDKPipeline = !string.IsNullOrEmpty(apiAvatar.authorId); + SetupUI(); + }, + (c2) => + { + VRC.Core.Logger.Log("<color=magenta>Creating a new avatar.</color>", DebugLevel.API); + apiAvatar = new ApiAvatar(); + apiAvatar.id = pipelineManager.blueprintId; + pipelineManager.completedSDKPipeline = !string.IsNullOrEmpty(apiAvatar.authorId); + SetupUI(); + }); + }, (c) => { + LoginErrorCallback(c.Error); + }); + } + + void SetupUI() + { + if (!ValidateAssetBundleBlueprintID(apiAvatar.id)) + { + blueprintPanel.SetActive(false); + errorPanel.SetActive(true); + OnSDKPipelineError("The asset bundle is out of date. Please rebuild the scene using 'New Build'.", "The blueprint ID in the scene does not match the id in the asset bundle."); + return; + } + + if (APIUser.Exists(pipelineManager.user)) + { + waitingPanel.SetActive(false); + blueprintPanel.SetActive(true); + errorPanel.SetActive(false); + + if (isUpdate) + { + // bp update + if (apiAvatar.authorId == pipelineManager.user.id) + { + titleText.text = "Update Avatar"; + // apiAvatar = pipelineManager.user.GetBlueprint(pipelineManager.blueprintId) as ApiAvatar; + blueprintName.text = apiAvatar.name; + contentSex.isOn = apiAvatar.tags.Contains("content_sex"); + contentViolence.isOn = apiAvatar.tags.Contains("content_violence"); + contentGore.isOn = apiAvatar.tags.Contains("content_gore"); + contentOther.isOn = apiAvatar.tags.Contains("content_other"); + developerAvatar.isOn = apiAvatar.tags.Contains("developer"); + sharePrivate.isOn = apiAvatar.releaseStatus.Contains("private"); + sharePublic.isOn = apiAvatar.releaseStatus.Contains("public"); + + tagFallback.isOn = apiAvatar.tags.Contains("author_quest_fallback"); + tagFallback.transform.parent.gameObject.SetActive(true); + + switch (pipelineManager.fallbackStatus) + { + case PipelineManager.FallbackStatus.Valid: +#if UNITY_ANDROID + tagFallback.interactable = true; + tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback"; +#else + tagFallback.interactable = false; + tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (change only with Android upload)"; +#endif + break; + case PipelineManager.FallbackStatus.InvalidPerformance: + case PipelineManager.FallbackStatus.InvalidRig: + tagFallback.isOn = false; // need to remove tag on this upload, the updated version is not up-to-spec + tagFallback.interactable = false; + tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (avatar not valid, tag will be cleared)"; + break; + } + + blueprintDescription.text = apiAvatar.description; + shouldUpdateImageToggle.interactable = true; + shouldUpdateImageToggle.isOn = false; + liveBpImage.enabled = false; + bpImage.enabled = true; + + ImageDownloader.DownloadImage(apiAvatar.imageUrl, 0, (Texture2D obj) => bpImage.texture = obj, null); + } + else // user does not own apiAvatar id associated with descriptor + { + Debug.LogErrorFormat("{0} is not an owner of {1}", apiAvatar.authorId, pipelineManager.user.id); + blueprintPanel.SetActive(false); + errorPanel.SetActive(true); + } + } + else + { + titleText.text = "New Avatar"; + shouldUpdateImageToggle.interactable = false; + shouldUpdateImageToggle.isOn = true; + liveBpImage.enabled = true; + bpImage.enabled = false; + tagFallback.isOn = false; + + // Janky fix for an avatar's blueprint image not showing up the very first time you press publish in a project until you resize the window + // can remove if we fix the underlying issue or move publishing out of Play Mode + string firstTimeResize = $"{Application.identifier}-firstTimeResize"; + if (!PlayerPrefs.HasKey(firstTimeResize)) + { + GameViewMethods.ResizeGameView(); + PlayerPrefs.SetInt(firstTimeResize, 1); + } + + tagFallback.transform.parent.gameObject.SetActive(true); + switch (pipelineManager.fallbackStatus) + { + case PipelineManager.FallbackStatus.Valid: +#if UNITY_ANDROID + tagFallback.interactable = true; + tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback"; +#else + tagFallback.interactable = false; + tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (change only with Android upload)"; +#endif + break; + case PipelineManager.FallbackStatus.InvalidPerformance: + case PipelineManager.FallbackStatus.InvalidRig: + tagFallback.transform.parent.gameObject.SetActive(true); + tagFallback.interactable = false; + tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (avatar not valid, tag will be cleared)"; + break; + } + } + } + else + { + waitingPanel.SetActive(true); + blueprintPanel.SetActive(false); + errorPanel.SetActive(false); + } + + if (APIUser.CurrentUser != null && APIUser.CurrentUser.hasSuperPowers) + developerAvatar.gameObject.SetActive(true); + else + developerAvatar.gameObject.SetActive(false); + } + + public void SetupUpload() + { + uploadTitle = "Preparing For Upload"; + isUploading = true; + + string abPath = UnityEditor.EditorPrefs.GetString("currentBuildingAssetBundlePath"); + + string unityPackagePath = UnityEditor.EditorPrefs.GetString("VRC_exportedUnityPackagePath"); + + UnityEditor.EditorPrefs.SetBool("VRCSDK2_scene_changed", true); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_sex", contentSex.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_violence", contentViolence.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_gore", contentGore.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_other", contentOther.isOn); + + if (string.IsNullOrEmpty(apiAvatar.id)) + { + pipelineManager.AssignId(); + apiAvatar.id = pipelineManager.blueprintId; + } + + string avatarId = apiAvatar.id; + int version = isUpdate ? apiAvatar.version + 1 : 1; + PrepareVRCPathForS3(abPath, avatarId, version, ApiAvatar.VERSION); + + if (!string.IsNullOrEmpty(unityPackagePath) && System.IO.File.Exists(unityPackagePath)) + { + VRC.Core.Logger.Log("Found unity package path. Preparing to upload!", DebugLevel.All); + PrepareUnityPackageForS3(unityPackagePath, avatarId, version, ApiAvatar.VERSION); + } + + StartCoroutine(UploadNew()); + } + + IEnumerator UploadNew() + { + bool caughtInvalidInput = false; + if (!ValidateNameInput(blueprintName)) + caughtInvalidInput = true; + + if (caughtInvalidInput) + yield break; + + VRC.Core.Logger.Log("Starting upload", DebugLevel.Always); + + // upload unity package + if (!string.IsNullOrEmpty(uploadUnityPackagePath)) + { + yield return StartCoroutine(UploadFile(uploadUnityPackagePath, isUpdate ? apiAvatar.unityPackageUrl : "", GetFriendlyAvatarFileName("Unity package"), "Unity package", + delegate (string fileUrl) + { + cloudFrontUnityPackageUrl = fileUrl; + } + )); + } + + // upload asset bundle + if (!string.IsNullOrEmpty(uploadVrcPath)) + { + yield return StartCoroutine(UploadFile(uploadVrcPath, isUpdate ? apiAvatar.assetUrl : "", GetFriendlyAvatarFileName("Asset bundle"), "Asset bundle", + delegate (string fileUrl) + { + cloudFrontAssetUrl = fileUrl; + } + )); + } + + if (isUpdate) + yield return StartCoroutine(UpdateBlueprint()); + else + yield return StartCoroutine(CreateBlueprint()); + + OnSDKPipelineComplete(); + } + + private string GetFriendlyAvatarFileName(string type) + { + return "Avatar - " + blueprintName.text + " - " + type + " - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + } + + List<string> BuildTags() + { + var tags = new List<string>(); + if (contentSex.isOn) + tags.Add("content_sex"); + if (contentViolence.isOn) + tags.Add("content_violence"); + if (contentGore.isOn) + tags.Add("content_gore"); + if (contentOther.isOn) + tags.Add("content_other"); + + if (APIUser.CurrentUser.hasSuperPowers) + { + if (developerAvatar.isOn) + tags.Add("developer"); + } + + if (tagFallback.isOn) + tags.Add("author_quest_fallback"); + + return tags; + } + + protected override IEnumerator CreateBlueprint() + { + yield return StartCoroutine(UpdateImage(isUpdate ? apiAvatar.imageUrl : "", GetFriendlyAvatarFileName("Image"))); + + ApiAvatar avatar = new ApiAvatar + { + id = pipelineManager.blueprintId, + authorName = pipelineManager.user.displayName, + authorId = pipelineManager.user.id, + name = blueprintName.text, + imageUrl = cloudFrontImageUrl, + assetUrl = cloudFrontAssetUrl, + description = blueprintDescription.text, + tags = BuildTags(), + unityPackageUrl = cloudFrontUnityPackageUrl, + releaseStatus = sharePublic.isOn ? "public" : "private" + }; + + bool doneUploading = false; + bool wasError = false; + + avatar.Post( + (c) => + { + ApiAvatar savedBP = (ApiAvatar)c.Model; + pipelineManager.blueprintId = savedBP.id; + UnityEditor.EditorPrefs.SetString("blueprintID-" + pipelineManager.GetInstanceID().ToString(), savedBP.id); + + AnalyticsSDK.AvatarUploaded(savedBP, false); + doneUploading = true; + }, + (c) => + { + Debug.LogError(c.Error); + SetUploadProgress("Saving Avatar", "Error saving blueprint.", 0.0f); + doneUploading = true; + wasError = true; + }); + + while (!doneUploading) + yield return null; + + if (wasError) + yield return new WaitUntil(() => UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "Error saving blueprint.", "Okay")); + } + + protected override IEnumerator UpdateBlueprint() + { + bool doneUploading = false; + + apiAvatar.name = blueprintName.text; + apiAvatar.description = blueprintDescription.text; + apiAvatar.assetUrl = cloudFrontAssetUrl; + apiAvatar.releaseStatus = sharePublic.isOn ? "public" : "private"; + apiAvatar.tags = BuildTags(); + apiAvatar.unityPackageUrl = cloudFrontUnityPackageUrl; + + if (shouldUpdateImageToggle.isOn) + { + yield return StartCoroutine(UpdateImage(isUpdate ? apiAvatar.imageUrl : "", GetFriendlyAvatarFileName("Image"))); + apiAvatar.imageUrl = cloudFrontImageUrl; + } + + SetUploadProgress("Saving Avatar", "Almost finished!!", 0.8f); + apiAvatar.Save( + (c) => { AnalyticsSDK.AvatarUploaded(apiAvatar, true); doneUploading = true; }, + (c) => { + Debug.LogError(c.Error); + SetUploadProgress("Saving Avatar", "Error saving blueprint.", 0.0f); + doneUploading = true; + }); + + while (!doneUploading) + yield return null; + } + + void ToggleUpdateImage(bool isOn) + { + if (isOn) + { + bpImage.enabled = false; + liveBpImage.enabled = true; + } + else + { + bpImage.enabled = true; + liveBpImage.enabled = false; + ImageDownloader.DownloadImage(apiAvatar.imageUrl, 0, obj => bpImage.texture = obj, null); + } + } + + void OnDestroy() + { + UnityEditor.EditorUtility.ClearProgressBar(); + UnityEditor.EditorPrefs.DeleteKey("currentBuildingAssetBundlePath"); + } + } +#endif +} + + diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeBlueprintCreation.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeBlueprintCreation.cs.meta new file mode 100644 index 00000000..cf873f35 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeBlueprintCreation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1e5ebf65c5dceeb4c909aa7812bd2999 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeWorldCreation.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeWorldCreation.cs new file mode 100644 index 00000000..e002d2f8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeWorldCreation.cs @@ -0,0 +1,681 @@ +#define COMMUNITY_LABS_SDK +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.SceneManagement; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Resources; +using VRC.Core; +using System; +using System.IO; +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace VRCSDK2 +{ +#if UNITY_EDITOR + public class RuntimeWorldCreation : RuntimeAPICreation + { + public GameObject waitingPanel; + public GameObject blueprintPanel; + public GameObject errorPanel; + + public Text titleText; + public InputField blueprintName; + public InputField blueprintDescription; + public InputField worldCapacity; + public RawImage bpImage; + public Image liveBpImage; + public Toggle shouldUpdateImageToggle; + public Toggle releasePublic; + public Toggle contentNsfw; + + public Toggle contentSex; + public Toggle contentViolence; + public Toggle contentGore; + public Toggle contentOther; + + public Toggle contentFeatured; + public Toggle contentSDKExample; + + public Image showInWorldsMenuGroup; + public Toggle showInActiveWorlds; + public Toggle showInPopularWorlds; + public Toggle showInNewWorlds; + + public InputField userTags; + + public UnityEngine.UI.Button uploadButton; + + public UnityEngine.UI.Button openCommunityLabsDocsButton; + + public GameObject publishToCommunityLabsPanel; + + private Toggle publishToCommLabsToggle; + + private ApiWorld worldRecord; + + private const int MAX_USER_TAGS_FOR_WORLD = 5; + private const int MAX_CHARACTERS_ALLOWED_IN_USER_TAG = 20; + List<String> customTags; + + public static bool IsCurrentWorldInCommunityLabs = false; + public static bool IsCurrentWorldUploaded = false; + public static bool IsCurrentWorldPubliclyPublished = false; + public static bool HasExceededPublishLimit = false; + + new void Start() + { + if (!Application.isEditor || !Application.isPlaying) + return; + + base.Start(); + + IsCurrentWorldInCommunityLabs = false; + IsCurrentWorldUploaded = false; + IsCurrentWorldPubliclyPublished = false; + + + var desc = pipelineManager.GetComponent<VRC.SDKBase.VRC_SceneDescriptor>(); + desc.PositionPortraitCamera(imageCapture.shotCamera.transform); + + Application.runInBackground = true; + UnityEngine.XR.XRSettings.enabled = false; + + uploadButton.onClick.AddListener(SetupUpload); + + openCommunityLabsDocsButton.onClick.AddListener(OpenCommunityLabsDocumentation); + + shouldUpdateImageToggle.onValueChanged.AddListener(ToggleUpdateImage); + + releasePublic.gameObject.SetActive(false); + + System.Action<string> onError = (err) => { + VRC.Core.Logger.LogError("Could not authenticate - " + err, DebugLevel.Always); + blueprintPanel.SetActive(false); + errorPanel.SetActive(true); + }; + + if (!ApiCredentials.Load()) + onError("Not logged in"); + else + APIUser.InitialFetchCurrentUser( + delegate (ApiModelContainer<APIUser> c) + { + UserLoggedInCallback(c.Model as APIUser); + }, + delegate (ApiModelContainer<APIUser> c) + { + onError(c.Error); + } + ); + +#if !COMMUNITY_LABS_SDK + publishToCommunityLabsPanel.gameObject.SetActive(false); +#endif + } + + void UserLoggedInCallback(APIUser user) + { + pipelineManager.user = user; + + ApiWorld model = new ApiWorld(); + model.id = pipelineManager.blueprintId; + model.Fetch(null, + (c) => + { + VRC.Core.Logger.Log("<color=magenta>Updating an existing world.</color>", DebugLevel.All); + worldRecord = c.Model as ApiWorld; + pipelineManager.completedSDKPipeline = !string.IsNullOrEmpty(worldRecord.authorId); + GetUserUploadInformationAndSetupUI(model.id); + }, + (c) => + { + VRC.Core.Logger.Log("<color=magenta>World record not found, creating a new world.</color>", DebugLevel.All); + worldRecord = new ApiWorld { capacity = 16 }; + pipelineManager.completedSDKPipeline = false; + worldRecord.id = pipelineManager.blueprintId; + GetUserUploadInformationAndSetupUI(model.id); + }); + } + + void CheckWorldStatus(string worldId, Action onCheckComplete) + { + // check if world has been previously uploaded, and if world is in community labs + ApiWorld.FetchUploadedWorlds( + delegate (IEnumerable<ApiWorld> worlds) + { + ApiWorld selectedWorld = worlds.FirstOrDefault(w => w.id == worldId); + if (null!=selectedWorld) + { + IsCurrentWorldInCommunityLabs = selectedWorld.IsCommunityLabsWorld; + IsCurrentWorldPubliclyPublished = selectedWorld.IsPublicPublishedWorld; + IsCurrentWorldUploaded = true; + } + if (onCheckComplete != null) onCheckComplete(); + + }, + delegate (string err) + { + IsCurrentWorldInCommunityLabs = false; + IsCurrentWorldUploaded = false; + IsCurrentWorldPubliclyPublished = false; + Debug.Log("CheckWorldStatus error:" + err); + if (onCheckComplete != null) onCheckComplete(); + } + ); + } + + + void GetUserUploadInformationAndSetupUI(string worldId) + { + CheckWorldStatus(worldId, delegate() + { + bool hasSufficientTrustLevelToPublishToCommunityLabs = APIUser.CurrentUser.hasKnownTrustLevel; + APIUser.FetchPublishWorldsInformation( + (c) => + { + try + { + Dictionary<string, object> publish = c as Dictionary<string, object>; + if (publish["canPublish"] is bool) + { + HasExceededPublishLimit = !(bool)(publish["canPublish"]); + } + else + HasExceededPublishLimit = true; + } + catch (Exception) + { + HasExceededPublishLimit = true; + } + + if(Application.isPlaying) + { + SetupUI(hasSufficientTrustLevelToPublishToCommunityLabs, HasExceededPublishLimit); + } + }, + (c) => + { + if(Application.isPlaying) + { + SetupUI(hasSufficientTrustLevelToPublishToCommunityLabs, HasExceededPublishLimit); + } + } + ); + } + ); + } + + void SetupUI(bool hasEnoughTrustToPublishToCL = false, bool hasExceededWeeklyPublishLimit = false) + { +#if COMMUNITY_LABS_SDK + // do not display community labs panel if updating an existing CL world or updating a public world + publishToCommunityLabsPanel.gameObject.SetActive(!IsCurrentWorldUploaded); +#endif + + if (!ValidateAssetBundleBlueprintID(worldRecord.id)) + { + blueprintPanel.SetActive(false); + errorPanel.SetActive(true); + OnSDKPipelineError("The asset bundle is out of date. Please rebuild the scene using 'New Build'.", "The blueprint ID in the scene does not match the id in the asset bundle."); + return; + } + + contentFeatured.gameObject.SetActive(APIUser.CurrentUser.hasSuperPowers); + contentSDKExample.gameObject.SetActive(APIUser.CurrentUser.hasSuperPowers); + + if (APIUser.Exists(pipelineManager.user)) + { + waitingPanel.SetActive(false); + blueprintPanel.SetActive(true); + errorPanel.SetActive(false); + + if (string.IsNullOrEmpty(worldRecord.authorId) || worldRecord.authorId == pipelineManager.user.id) + { + titleText.text = "Configure World"; + blueprintName.text = worldRecord.name; + worldCapacity.text = worldRecord.capacity.ToString(); + contentSex.isOn = worldRecord.tags.Contains("content_sex"); + contentViolence.isOn = worldRecord.tags.Contains("content_violence"); + contentGore.isOn = worldRecord.tags.Contains("content_gore"); + contentOther.isOn = worldRecord.tags.Contains("content_other"); + shouldUpdateImageToggle.interactable = isUpdate; + shouldUpdateImageToggle.isOn = !isUpdate; + liveBpImage.enabled = !isUpdate; + bpImage.enabled = isUpdate; + + if (!APIUser.CurrentUser.hasSuperPowers) + { + releasePublic.gameObject.SetActive(false); + releasePublic.isOn = false; + releasePublic.interactable = false; + + contentFeatured.isOn = contentSDKExample.isOn = false; + } + else + { + contentFeatured.isOn = worldRecord.tags.Contains("content_featured"); + contentSDKExample.isOn = worldRecord.tags.Contains("content_sdk_example"); + + releasePublic.isOn = worldRecord.releaseStatus == "public"; + releasePublic.gameObject.SetActive(true); + } + + // "show in worlds menu" + if (APIUser.CurrentUser.hasSuperPowers) + { + showInWorldsMenuGroup.gameObject.SetActive(true); + showInActiveWorlds.isOn = !worldRecord.tags.Contains("admin_hide_active"); + showInPopularWorlds.isOn = !worldRecord.tags.Contains("admin_hide_popular"); + showInNewWorlds.isOn = !worldRecord.tags.Contains("admin_hide_new"); + } + else + { + showInWorldsMenuGroup.gameObject.SetActive(false); + } + + blueprintDescription.text = worldRecord.description; + + userTags.text = ""; + foreach (var tag in worldRecord.publicTags) + { + userTags.text = userTags.text + tag.Replace("author_tag_", ""); + userTags.text = userTags.text + " "; + } + + ImageDownloader.DownloadImage(worldRecord.imageUrl, 0, obj => bpImage.texture = obj, null); + } + else // user does not own world id associated with descriptor + { + Debug.LogErrorFormat("{0} is not an owner of {1}", worldRecord.authorId, pipelineManager.user.id); + blueprintPanel.SetActive(false); + errorPanel.SetActive(true); + } + } + else + { + waitingPanel.SetActive(true); + blueprintPanel.SetActive(false); + errorPanel.SetActive(false); + + if (!APIUser.CurrentUser.hasSuperPowers) + { + releasePublic.gameObject.SetActive(false); + releasePublic.isOn = false; + releasePublic.interactable = false; + } + else + { + releasePublic.gameObject.SetActive(true); + releasePublic.isOn = false; + } + } + + // set up publish to Community Labs checkbox and text + int worldsPublishedThisWeek = hasExceededWeeklyPublishLimit ? 1 : 0; + int maximumWorldsAllowedToPublishPerWeek = 1; + publishToCommLabsToggle = publishToCommunityLabsPanel.GetComponentInChildren<Toggle>(); + + if (null != publishToCommLabsToggle) + { + // disable publishing to CL checkbox if not enough trust or exceeded publish limit + publishToCommLabsToggle.interactable = hasEnoughTrustToPublishToCL && !hasExceededWeeklyPublishLimit; + + Text publishText = publishToCommLabsToggle.gameObject.GetComponentInChildren<Text>(); + if (null != publishText) + { + if (!hasEnoughTrustToPublishToCL) + { + publishText.text = "Not enough Trust to Publish to Community Labs"; + } + else + { + if (hasExceededWeeklyPublishLimit) + { + publishText.text = "Publish limit for Community Labs Exceeded\n" + "(" + worldsPublishedThisWeek + "/" + maximumWorldsAllowedToPublishPerWeek + " Published this week)"; + } + else + { + publishText.text = "Publish to Community Labs\n" + "(" + worldsPublishedThisWeek + "/" + maximumWorldsAllowedToPublishPerWeek + " Published this week)"; + } + } + } + } + } + + public void SetupUpload() + { + if (!ParseUserTags()) + return; + + publishingToCommunityLabs = (publishToCommLabsToggle != null) && (publishToCommLabsToggle.isActiveAndEnabled) && (publishToCommLabsToggle.isOn); + + uploadTitle = "Preparing For Upload"; + isUploading = true; + + string abPath = UnityEditor.EditorPrefs.GetString("currentBuildingAssetBundlePath"); + + + string unityPackagePath = UnityEditor.EditorPrefs.GetString("VRC_exportedUnityPackagePath"); + + UnityEditor.EditorPrefs.SetBool("VRCSDK2_scene_changed", true); + UnityEditor.EditorPrefs.SetInt("VRCSDK2_capacity", System.Convert.ToInt16(worldCapacity.text)); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_sex", contentSex.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_violence", contentViolence.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_gore", contentGore.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_other", contentOther.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_release_public", releasePublic.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_featured", contentFeatured.isOn); + UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_sdk_example", contentSDKExample.isOn); + + if (string.IsNullOrEmpty(worldRecord.id)) + { + pipelineManager.AssignId(); + worldRecord.id = pipelineManager.blueprintId; + } + + string blueprintId = worldRecord.id; + int version = Mathf.Max(1, worldRecord.version + 1); + PrepareVRCPathForS3(abPath, blueprintId, version, ApiWorld.VERSION); + + if (!string.IsNullOrEmpty(unityPackagePath) && System.IO.File.Exists(unityPackagePath)) + { + VRC.Core.Logger.Log("Found unity package path. Preparing to upload!", DebugLevel.All); + PrepareUnityPackageForS3(unityPackagePath, blueprintId, version, ApiWorld.VERSION); + } + + StartCoroutine(UploadNew()); + } + + void OnUploadedWorld() + { + const string devUrl = "https://dev-api.vrchat.cloud"; + const string releaseUrl = "https://vrchat.com"; + + string uploadedWorldURL = (API.IsDevApi() ? devUrl : releaseUrl) + "/home/world/" + pipelineManager.blueprintId; + OnSDKPipelineComplete(uploadedWorldURL); + } + + IEnumerator UploadNew() + { + bool caughtInvalidInput = false; + if (!ValidateNameInput(blueprintName)) + caughtInvalidInput = true; + + if (caughtInvalidInput) + yield break; + + VRC.Core.Logger.Log("Starting upload", DebugLevel.Always); + + // upload unity package + if (!string.IsNullOrEmpty(uploadUnityPackagePath)) + { + yield return StartCoroutine(UploadFile(uploadUnityPackagePath, isUpdate ? worldRecord.unityPackageUrl : "", GetFriendlyWorldFileName("Unity package"), "Unity package", + delegate (string fileUrl) + { + cloudFrontUnityPackageUrl = fileUrl; + } + )); + } + + // upload asset bundle + if (!string.IsNullOrEmpty(uploadVrcPath)) + { + yield return StartCoroutine(UploadFile(uploadVrcPath, isUpdate ? worldRecord.assetUrl : "", GetFriendlyWorldFileName("Asset bundle"), "Asset bundle", + delegate (string fileUrl) + { + cloudFrontAssetUrl = fileUrl; + } + )); + } + + if (isUpdate) + yield return StartCoroutine(UpdateBlueprint()); + else + yield return StartCoroutine(CreateBlueprint()); + + if (publishingToCommunityLabs) + { + ApiWorld.PublishWorldToCommunityLabs(pipelineManager.blueprintId, + (world) => OnUploadedWorld(), + (err) => + { + Debug.LogError("PublishWorldToCommunityLabs error:" + err); + OnUploadedWorld(); + } + ); + } + else + { + OnUploadedWorld(); + } + } + + private string GetFriendlyWorldFileName(string type) + { + return "World - " + blueprintName.text + " - " + type + " - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + } + + List<string> BuildTags() + { + var tags = new List<string>(); + if (contentSex.isOn) + tags.Add("content_sex"); + if (contentViolence.isOn) + tags.Add("content_violence"); + if (contentGore.isOn) + tags.Add("content_gore"); + if (contentOther.isOn) + tags.Add("content_other"); + + if (APIUser.CurrentUser.hasSuperPowers) + { + if (contentFeatured.isOn) + tags.Add("content_featured"); + if (contentSDKExample.isOn) + tags.Add("content_sdk_example"); + if(releasePublic.isOn) + tags.Add("admin_approved"); + } + + // "show in worlds menu" + if (APIUser.CurrentUser.hasSuperPowers) + { + if (!showInActiveWorlds.isOn) + tags.Add("admin_hide_active"); + if (!showInPopularWorlds.isOn) + tags.Add("admin_hide_popular"); + if (!showInNewWorlds.isOn) + tags.Add("admin_hide_new"); + } + + // add any author tags + foreach (var word in customTags) + { + // add all custom tags with "author_tag_" prefix + tags.Add("author_tag_" + word); + } + + return tags; + } + + bool ParseUserTags() + { + bool validTags = true; + customTags = new List<string>(); + char[] delimiterChars = { ' ', ',', '.', ':', '\t', '\n', '"', '#' }; + + // split user tags into individual words + string[] words = userTags.text.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries); + + foreach (var word in words) + { + customTags.Add(word.ToLower()); + } + + // check that number of tags is within tag limit + if (words.Count() > MAX_USER_TAGS_FOR_WORLD) + { + validTags = false; + UnityEditor.EditorUtility.DisplayDialog("Tags are limited to a maximum of " + MAX_USER_TAGS_FOR_WORLD + " per world.", "Please remove excess tags before uploading!", "OK"); + } + else + { + // check that no tags exceed maximum tag length + int maximumTagLength = 0; + foreach (string item in words) + { + if (item.Length > maximumTagLength) + { + maximumTagLength = item.Length; + } + } + + if (maximumTagLength > MAX_CHARACTERS_ALLOWED_IN_USER_TAG) + { + validTags = false; + UnityEditor.EditorUtility.DisplayDialog("Tags are limited to a maximum of " + MAX_CHARACTERS_ALLOWED_IN_USER_TAG + " characters per tag.", "One or more of your tags exceeds the maximum " + MAX_CHARACTERS_ALLOWED_IN_USER_TAG + " character limit.\n\n" + "Please shorten tags before uploading!", "OK"); + } + else + { + // make sure tags are all alphanumeric + foreach (var word in words) + { + if (!word.All(char.IsLetterOrDigit)) + { + validTags = false; + UnityEditor.EditorUtility.DisplayDialog("Tags should consist of alphanumeric characters only.", "Please remove any non-alphanumeric characters from tags before uploading!", "OK"); + } + } + } + } + + return validTags; + } + + protected override IEnumerator CreateBlueprint() + { + yield return StartCoroutine(UpdateImage(isUpdate ? worldRecord.imageUrl : "", GetFriendlyWorldFileName("Image"))); + + SetUploadProgress("Saving Blueprint to user", "Almost finished!!", 0.0f); + ApiWorld world = new ApiWorld + { + id = worldRecord.id, + authorName = pipelineManager.user.displayName, + authorId = pipelineManager.user.id, + name = blueprintName.text, + imageUrl = cloudFrontImageUrl, + assetUrl = cloudFrontAssetUrl, + unityPackageUrl = cloudFrontUnityPackageUrl, + description = blueprintDescription.text, + tags = BuildTags(), + releaseStatus = (releasePublic.isOn) ? ("public") : ("private"), + capacity = System.Convert.ToInt16(worldCapacity.text), + occupants = 0, + shouldAddToAuthor = true + }; + + if (APIUser.CurrentUser.hasSuperPowers) + world.isCurated = contentFeatured.isOn || contentSDKExample.isOn; + else + world.isCurated = false; + + bool doneUploading = false; + world.Post( + (c) => + { + ApiWorld savedBP = (ApiWorld)c.Model; + pipelineManager.blueprintId = savedBP.id; + UnityEditor.EditorPrefs.SetString("blueprintID-" + pipelineManager.GetInstanceID().ToString(), savedBP.id); + VRC.Core.Logger.Log("Setting blueprintID on pipeline manager and editor prefs", DebugLevel.All); + doneUploading = true; + }, + (c) => { doneUploading = true; Debug.LogError(c.Error); }); + + while (!doneUploading) + yield return null; + } + + protected override IEnumerator UpdateBlueprint() + { + bool doneUploading = false; + + worldRecord.name = blueprintName.text; + worldRecord.description = blueprintDescription.text; + worldRecord.capacity = System.Convert.ToInt16(worldCapacity.text); + worldRecord.assetUrl = cloudFrontAssetUrl; + worldRecord.tags = BuildTags(); + worldRecord.releaseStatus = (releasePublic.isOn) ? ("public") : ("private"); + worldRecord.unityPackageUrl = cloudFrontUnityPackageUrl; + worldRecord.isCurated = contentFeatured.isOn || contentSDKExample.isOn; + + if (shouldUpdateImageToggle.isOn) + { + yield return StartCoroutine(UpdateImage(isUpdate ? worldRecord.imageUrl : "", GetFriendlyWorldFileName("Image"))); + + worldRecord.imageUrl = cloudFrontImageUrl; + } + + SetUploadProgress("Saving Blueprint", "Almost finished!!", 0.0f); + worldRecord.Save((c) => doneUploading = true, (c) => { doneUploading = true; Debug.LogError(c.Error); }); + + while (!doneUploading) + yield return null; + } + + void ToggleUpdateImage(bool isOn) + { + if (isOn) + { + bpImage.enabled = false; + liveBpImage.enabled = true; + } + else + { + bpImage.enabled = true; + liveBpImage.enabled = false; + ImageDownloader.DownloadImage(worldRecord.imageUrl, 0, obj => bpImage.texture = obj, null); + } + } + + protected override void DisplayUpdateCompletedDialog(string contentUrl = null) + { +#if UNITY_EDITOR +#if COMMUNITY_LABS_SDK + if (null != contentUrl) + { + CheckWorldStatus(pipelineManager.blueprintId, delegate () + { + ContentUploadedDialog window = (ContentUploadedDialog)EditorWindow.GetWindow(typeof(ContentUploadedDialog), true, "VRCSDK", true); + window.setContentURL(contentUrl); + window.Show(); + // refresh UI based on uploaded world + GetUserUploadInformationAndSetupUI(pipelineManager.blueprintId); + } + ); + } + else +#endif + base.DisplayUpdateCompletedDialog(contentUrl); +#endif + } + + private void OpenCommunityLabsDocumentation() + { + Application.OpenURL(CommunityLabsConstants.COMMUNITY_LABS_DOCUMENTATION_URL); + } + + void OnDestroy() + { + UnityEditor.EditorUtility.ClearProgressBar(); + UnityEditor.EditorPrefs.DeleteKey("currentBuildingAssetBundlePath"); + } + } +#endif +} + + diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeWorldCreation.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeWorldCreation.cs.meta new file mode 100644 index 00000000..8121e7c2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/RuntimeWorldCreation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2bd5ee5d69ee0f3449bf2f81fcb7f4e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/SceneSaver.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/SceneSaver.cs new file mode 100644 index 00000000..86d56a5d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/SceneSaver.cs @@ -0,0 +1,18 @@ +using System.Collections; +using UnityEngine; + +public class SceneSaver +{ + static public void SaveScene() + { +#if UNITY_EDITOR + var activeScene = UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene(); + UnityEditor.SceneManagement.EditorSceneManager.SaveScene(activeScene); + + UnityEditor.EditorApplication.isPaused = false; + UnityEditor.EditorApplication.isPlaying = false; + + UnityEditor.SceneManagement.EditorSceneManager.OpenScene(activeScene.name); +#endif + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/SceneSaver.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/SceneSaver.cs.meta new file mode 100644 index 00000000..454a9ab4 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/SceneSaver.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0d49300ad532d4ae6b569b28de5b7dac +timeCreated: 1446917779 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation.meta new file mode 100644 index 00000000..9c503220 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d5069afa88a13b54a971e8ed7c71194d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance.meta new file mode 100644 index 00000000..6b2cbfdd --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5498b20a608b27c43bfb2f8de499afbe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformance.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformance.cs new file mode 100644 index 00000000..3269bc89 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformance.cs @@ -0,0 +1,165 @@ +using System.Collections; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance +{ + public static class AvatarPerformance + { + #region Public Constants + + public const int DEFAULT_DYNAMIC_BONE_MAX_SIMULATED_BONE_LIMIT = 32; + public const int DEFAULT_DYNAMIC_BONE_MAX_COLLIDER_CHECK_LIMIT = 8; + + #if UNITY_ANDROID || UNITY_IOS + internal const PerformanceRating AVATAR_PERFORMANCE_RATING_MINIMUM_TO_DISPLAY_DEFAULT = PerformanceRating.Medium; + internal const PerformanceRating AVATAR_PERFORMANCE_RATING_MINIMUM_TO_DISPLAY_MIN = PerformanceRating.Medium; + internal const PerformanceRating AVATAR_PERFORMANCE_RATING_MINIMUM_TO_DISPLAY_MAX = PerformanceRating.Poor; + #else + internal const PerformanceRating AVATAR_PERFORMANCE_RATING_MINIMUM_TO_DISPLAY_DEFAULT = PerformanceRating.VeryPoor; + internal const PerformanceRating AVATAR_PERFORMANCE_RATING_MINIMUM_TO_DISPLAY_MIN = PerformanceRating.Medium; + internal const PerformanceRating AVATAR_PERFORMANCE_RATING_MINIMUM_TO_DISPLAY_MAX = PerformanceRating.VeryPoor; + #endif + + #endregion + + #region Public Delegates + + public delegate bool IgnoreDelegate(Component component); + + public delegate void FilterBlockCallback(); + + public static IgnoreDelegate ShouldIgnoreComponent { get; set; } + + #endregion + + #region Public Methods + + public static void CalculatePerformanceStats(string avatarName, GameObject avatarObject, AvatarPerformanceStats perfStats) + { + perfStats.Reset(); + perfStats.avatarName = avatarName; + + PerformanceScannerSet performanceScannerSet = GetPerformanceScannerSet(); + if(performanceScannerSet != null) + { + performanceScannerSet.RunPerformanceScan(avatarObject, perfStats, ShouldIgnoreComponentInternal); + } + + // cache performance ratings + perfStats.CalculateAllPerformanceRatings(); + } + + public static IEnumerator CalculatePerformanceStatsEnumerator(string avatarName, GameObject avatarObject, AvatarPerformanceStats perfStats) + { + perfStats.Reset(); + perfStats.avatarName = avatarName; + + PerformanceScannerSet performanceScannerSet = GetPerformanceScannerSet(); + if(performanceScannerSet != null) + { + yield return performanceScannerSet.RunPerformanceScanEnumerator(avatarObject, perfStats, ShouldIgnoreComponentInternal); + } + + // cache performance ratings + perfStats.CalculateAllPerformanceRatings(); + } + + public static IEnumerator ApplyPerformanceFiltersEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, PerformanceRating minPerfRating, FilterBlockCallback onBlock) + { + // Performance Filtering is disabled. + if(minPerfRating == PerformanceRating.None) + { + yield break; + } + + PerformanceFilterSet performanceFilterSet = GetPerformanceFilterSet(); + if(performanceFilterSet == null) + { + yield break; + } + + bool avatarBlocked = false; + yield return performanceFilterSet.ApplyPerformanceFilters( + avatarObject, + perfStats, + minPerfRating, + ShouldIgnoreComponentInternal, + () => { avatarBlocked = true; } + ); + + if(!avatarBlocked) + { + yield break; + } + + VRC.Core.Logger.LogFormat( + "Avatar hidden due to low performance rating: [{0}] {1} - minimum setting: {2}", + perfStats.avatarName, + perfStats.GetPerformanceRatingForCategory(AvatarPerformanceCategory.Overall), + minPerfRating + ); + + onBlock(); + } + + #endregion + + #region Private Methods + + private static PerformanceScannerSet GetPerformanceScannerSet() + { + PerformanceScannerSet performanceScannerSet; + if(VRC.ValidationHelpers.IsStandalonePlatform()) + { + performanceScannerSet = Resources.Load<PerformanceScannerSet>("Validation/Performance/ScannerSets/PerformanceScannerSet_Windows"); + } + else + { + performanceScannerSet = Resources.Load<PerformanceScannerSet>("Validation/Performance/ScannerSets/PerformanceScannerSet_Quest"); + } + + return performanceScannerSet; + } + + private static PerformanceFilterSet GetPerformanceFilterSet() + { + PerformanceFilterSet performanceFilterSet; + if(VRC.ValidationHelpers.IsStandalonePlatform()) + { + performanceFilterSet = Resources.Load<PerformanceFilterSet>("Validation/Performance/FilterSets/PerformanceFilterSet_Windows"); + } + else + { + performanceFilterSet = Resources.Load<PerformanceFilterSet>("Validation/Performance/FilterSets/PerformanceFilterSet_Quest"); + } + + return performanceFilterSet; + } + + private static bool ShouldIgnoreComponentInternal(Component component) + { + if(Application.isEditor) + { + if(component == null) + { + return false; + } + + if(component.CompareTag("EditorOnly")) + { + return true; + } + } + + if(ShouldIgnoreComponent != null) + { + return ShouldIgnoreComponent(component); + } + + return false; + } + + #endregion + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformance.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformance.cs.meta new file mode 100644 index 00000000..8d06a338 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 15ecac6f7fdc1bc4fb723fee6f4635dd +timeCreated: 1540944864 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformanceCategory.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformanceCategory.cs new file mode 100644 index 00000000..847ac62c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformanceCategory.cs @@ -0,0 +1,37 @@ +namespace VRC.SDKBase.Validation.Performance +{ + public enum AvatarPerformanceCategory + { + None, + + Overall, + + DownloadSize, + PolyCount, + AABB, + SkinnedMeshCount, + MeshCount, + MaterialCount, + DynamicBoneComponentCount, + DynamicBoneSimulatedBoneCount, + DynamicBoneColliderCount, + DynamicBoneCollisionCheckCount, + AnimatorCount, + BoneCount, + LightCount, + ParticleSystemCount, + ParticleTotalCount, + ParticleMaxMeshPolyCount, + ParticleTrailsEnabled, + ParticleCollisionEnabled, + TrailRendererCount, + LineRendererCount, + ClothCount, + ClothMaxVertices, + PhysicsColliderCount, + PhysicsRigidbodyCount, + AudioSourceCount, + + AvatarPerformanceCategoryCount + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformanceCategory.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformanceCategory.cs.meta new file mode 100644 index 00000000..449a3394 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/AvatarPerformanceCategory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f1ce994297384ff1bc330196df61b7ca +timeCreated: 1561267912
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters.meta new file mode 100644 index 00000000..2d342f0d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 484ec183d2d0d564ca351f47f755930c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters/AbstractPerformanceFilter.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters/AbstractPerformanceFilter.cs new file mode 100644 index 00000000..9896fcc9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters/AbstractPerformanceFilter.cs @@ -0,0 +1,109 @@ +using System.Collections; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Filters +{ + public abstract class AbstractPerformanceFilter : ScriptableObject + { + public abstract IEnumerator ApplyPerformanceFilter( + GameObject avatarObject, + AvatarPerformanceStats perfStats, + PerformanceRating ratingLimit, + AvatarPerformance.IgnoreDelegate shouldIgnoreComponent, + AvatarPerformance.FilterBlockCallback onBlock + ); + + protected static IEnumerator RemoveComponentsOfTypeEnumerator<T>(GameObject target) where T : Component + { + if(target == null) + { + yield break; + } + + foreach(T targetComponent in target.GetComponentsInChildren<T>(true)) + { + if(targetComponent == null || targetComponent.gameObject == null) + { + continue; + } + + #if VERBOSE_COMPONENT_REMOVAL + Debug.LogWarningFormat("Removing {0} comp from {1}", targetComponent.GetType().Name, targetComponent.gameObject.name); + #endif + + yield return RemoveComponent(targetComponent); + } + } + + protected static IEnumerator RemoveComponent(Component targetComponent) + { + yield return RemoveDependencies(targetComponent); + + Destroy(targetComponent); + yield return null; + } + + protected static IEnumerator RemoveDependencies(Component targetComponent) + { + if(targetComponent == null) + { + yield break; + } + + Component[] siblingComponents = targetComponent.GetComponents<Component>(); + if(siblingComponents == null || siblingComponents.Length == 0) + { + yield break; + } + + System.Type componentType = targetComponent.GetType(); + foreach(Component siblingComponent in siblingComponents) + { + if(siblingComponent == null) + { + continue; + } + + bool deleteMe = false; + object[] requireComponentAttributes = siblingComponent.GetType().GetCustomAttributes(typeof(RequireComponent), true); + if(requireComponentAttributes.Length == 0) + { + continue; + } + + foreach(var requireComponentObject in requireComponentAttributes) + { + RequireComponent requireComponentAttribute = requireComponentObject as RequireComponent; + if(requireComponentAttribute == null) + { + continue; + } + + if( + requireComponentAttribute.m_Type0 != componentType && + requireComponentAttribute.m_Type1 != componentType && + requireComponentAttribute.m_Type2 != componentType + ) + { + continue; + } + + deleteMe = true; + break; + } + + if(!deleteMe) + { + continue; + } + + #if VERBOSE_COMPONENT_REMOVAL + Debug.LogWarningFormat("Deleting component dependency {0} found on {1}", siblingComponent.GetType().Name, targetComponent.gameObject.name); + #endif + + yield return RemoveComponent(siblingComponent); + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters/AbstractPerformanceFilter.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters/AbstractPerformanceFilter.cs.meta new file mode 100644 index 00000000..6987057b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Filters/AbstractPerformanceFilter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: abda65e062e44213aa3e1f4c82b400a8 +timeCreated: 1563937347
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/MeshUtils.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/MeshUtils.cs new file mode 100644 index 00000000..e5acd99f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/MeshUtils.cs @@ -0,0 +1,33 @@ +using UnityEngine; + +namespace VRC.SDKBase.Validation.Performance +{ + public static class MeshUtils + { + private const uint INDICES_PER_TRIANGLE = 3U; + + public static uint GetMeshTriangleCount(Mesh sourceMesh) + { + if(sourceMesh == null) + { + return 0; + } + + // We can't use GetIndexCount if the mesh isn't readable so just return a huge number. + // The SDK Control Panel should show a warning in this case. + if(!sourceMesh.isReadable) + { + return uint.MaxValue; + } + + uint count = 0; + for(int i = 0; i < sourceMesh.subMeshCount; i++) + { + uint indexCount = sourceMesh.GetIndexCount(i); + count += indexCount / INDICES_PER_TRIANGLE; + } + + return count; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/MeshUtils.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/MeshUtils.cs.meta new file mode 100644 index 00000000..4658d3db --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/MeshUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f28c978154794266b38d686139c6b872 +timeCreated: 1561249515
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceFilterSet.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceFilterSet.cs new file mode 100644 index 00000000..b2637485 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceFilterSet.cs @@ -0,0 +1,46 @@ +using System.Collections; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Filters; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New PerformanceFilterSet", + menuName = "VRC Scriptable Objects/Performance/PerformanceFilterSet" + )] + #endif + public class PerformanceFilterSet : ScriptableObject + { + public AbstractPerformanceFilter[] performanceFilters; + + public IEnumerator ApplyPerformanceFilters( + GameObject avatarObject, + AvatarPerformanceStats perfStats, + PerformanceRating ratingLimit, + AvatarPerformance.IgnoreDelegate shouldIgnoreComponent, + AvatarPerformance.FilterBlockCallback onBlock + ) + { + foreach(AbstractPerformanceFilter performanceFilter in performanceFilters) + { + if(performanceFilter == null) + { + continue; + } + + bool avatarBlocked = false; + yield return performanceFilter.ApplyPerformanceFilter(avatarObject, perfStats, ratingLimit, shouldIgnoreComponent, () => { avatarBlocked = true; }); + + if(!avatarBlocked) + { + continue; + } + + onBlock(); + break; + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceFilterSet.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceFilterSet.cs.meta new file mode 100644 index 00000000..dce1427b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceFilterSet.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8cdca9d06d1b4732b9ccb82a38bb8d9c +timeCreated: 1563939583
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceInfoDisplayLevel.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceInfoDisplayLevel.cs new file mode 100644 index 00000000..d132fe4a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceInfoDisplayLevel.cs @@ -0,0 +1,12 @@ +namespace VRC.SDKBase.Validation.Performance +{ + public enum PerformanceInfoDisplayLevel + { + None, + + Verbose, + Info, + Warning, + Error + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceInfoDisplayLevel.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceInfoDisplayLevel.cs.meta new file mode 100644 index 00000000..c1ea78c5 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceInfoDisplayLevel.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a5ed7498cb1a46c78eab031f5f32448c +timeCreated: 1561267918
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceRating.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceRating.cs new file mode 100644 index 00000000..901d8494 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceRating.cs @@ -0,0 +1,12 @@ +namespace VRC.SDKBase.Validation.Performance +{ + public enum PerformanceRating + { + None = 0, + Excellent = 1, + Good = 2, + Medium = 3, + Poor = 4, + VeryPoor = 5 + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceRating.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceRating.cs.meta new file mode 100644 index 00000000..0175bfdb --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceRating.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5019a55ee9e2404c81bc61a39a010d8d +timeCreated: 1561267904
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceScannerSet.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceScannerSet.cs new file mode 100644 index 00000000..716c66f7 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceScannerSet.cs @@ -0,0 +1,44 @@ +using System.Collections; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Scanners; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New PerformanceScannerSet", + menuName = "VRC Scriptable Objects/Performance/PerformanceScannerSet" + )] + #endif + public class PerformanceScannerSet : ScriptableObject + { + public AbstractPerformanceScanner[] performanceScanners; + + public void RunPerformanceScan(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + foreach(AbstractPerformanceScanner performanceScanner in performanceScanners) + { + if(performanceScanner == null) + { + continue; + } + + performanceScanner.RunPerformanceScan(avatarObject, perfStats, shouldIgnoreComponent); + } + } + + public IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + foreach(AbstractPerformanceScanner performanceScanner in performanceScanners) + { + if(performanceScanner == null) + { + continue; + } + + yield return performanceScanner.RunPerformanceScanEnumerator(avatarObject, perfStats, shouldIgnoreComponent); + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceScannerSet.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceScannerSet.cs.meta new file mode 100644 index 00000000..7a3b582a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/PerformanceScannerSet.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4afb61f36d144fc381114cd7f78d13e7 +timeCreated: 1561259704
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners.meta new file mode 100644 index 00000000..c6dfe083 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ff73eb9209385a4597520a6792b968f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AbstractPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AbstractPerformanceScanner.cs new file mode 100644 index 00000000..9face97c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AbstractPerformanceScanner.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Profiling; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + public abstract class AbstractPerformanceScanner : ScriptableObject + { + private const int MAXIMUM_COMPONENT_SCANS_PER_FRAME = 10; + private static int _componentScansThisFrame = 0; + private static int _componentScansFrameNumber = 0; + + private readonly Stack<IEnumerator> _coroutines = new Stack<IEnumerator>(); + + private bool _limitComponentScansPerFrame = true; + + public abstract IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent); + + public void RunPerformanceScan(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + _limitComponentScansPerFrame = false; + + try + { + _coroutines.Push(RunPerformanceScanEnumerator(avatarObject, perfStats, shouldIgnoreComponent)); + while(_coroutines.Count > 0) + { + IEnumerator currentCoroutine = _coroutines.Peek(); + if(currentCoroutine.MoveNext()) + { + IEnumerator nestedCoroutine = currentCoroutine.Current as IEnumerator; + if(nestedCoroutine != null) + { + _coroutines.Push(nestedCoroutine); + } + } + else + { + _coroutines.Pop(); + } + } + + _coroutines.Clear(); + } + finally + { + _limitComponentScansPerFrame = true; + } + } + + protected IEnumerator ScanAvatarForComponentsOfType(Type componentType, GameObject avatarObject, List<Component> destinationBuffer) + { + yield return HandleComponentScansPerFrameLimit(); + + Profiler.BeginSample("Component Scan"); + destinationBuffer.Clear(); + destinationBuffer.AddRange(avatarObject.GetComponentsInChildren(componentType, true)); + Profiler.EndSample(); + } + + protected IEnumerator ScanAvatarForComponentsOfType<T>(GameObject avatarObject, List<T> destinationBuffer) + { + yield return HandleComponentScansPerFrameLimit(); + + Profiler.BeginSample("Component Scan"); + destinationBuffer.Clear(); + avatarObject.GetComponentsInChildren(true, destinationBuffer); + Profiler.EndSample(); + yield return null; + } + + private IEnumerator HandleComponentScansPerFrameLimit() + { + if(!_limitComponentScansPerFrame) + { + yield break; + } + + while(_componentScansThisFrame >= MAXIMUM_COMPONENT_SCANS_PER_FRAME) + { + if(Time.frameCount > _componentScansFrameNumber) + { + _componentScansFrameNumber = Time.frameCount; + _componentScansThisFrame = 0; + break; + } + + yield return null; + } + + _componentScansThisFrame++; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AbstractPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AbstractPerformanceScanner.cs.meta new file mode 100644 index 00000000..357ef0f0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AbstractPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0bd0691a021844f49444a04a959d6328 +timeCreated: 1561279121
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AnimatorPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AnimatorPerformanceScanner.cs new file mode 100644 index 00000000..859a95ba --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AnimatorPerformanceScanner.cs @@ -0,0 +1,44 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New AnimatorPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/AnimatorPerformanceScanner" + )] + #endif + public sealed class AnimatorPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + int animatorCount = 0; + + // Animators + List<Animator> animatorBuffer = new List<Animator>(); + yield return ScanAvatarForComponentsOfType(avatarObject, animatorBuffer); + if(shouldIgnoreComponent != null) + { + animatorBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + // ReSharper disable once UselessBinaryOperation + animatorCount += animatorBuffer.Count; + + // Animations + List<Animation> animationBuffer = new List<Animation>(); + yield return ScanAvatarForComponentsOfType(avatarObject, animationBuffer); + if(shouldIgnoreComponent != null) + { + animationBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + animatorCount += animationBuffer.Count; + + perfStats.animatorCount = animatorCount; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AnimatorPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AnimatorPerformanceScanner.cs.meta new file mode 100644 index 00000000..edec0a0f --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AnimatorPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 08c8e931d0544866a0f626855d9c1841 +timeCreated: 1561251363
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AudioPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AudioPerformanceScanner.cs new file mode 100644 index 00000000..a8a5944d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AudioPerformanceScanner.cs @@ -0,0 +1,29 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New AudioPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/AudioPerformanceScanner" + )] + #endif + public sealed class AudioPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Audio Sources + List<AudioSource> audioSourceBuffer = new List<AudioSource>(); + yield return ScanAvatarForComponentsOfType(avatarObject, audioSourceBuffer); + if(shouldIgnoreComponent != null) + { + audioSourceBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + perfStats.audioSourceCount = audioSourceBuffer.Count; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AudioPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AudioPerformanceScanner.cs.meta new file mode 100644 index 00000000..6cbd2a09 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/AudioPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b3a8bba736414d1aaa9e766da27b56b5 +timeCreated: 1561255618
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ClothPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ClothPerformanceScanner.cs new file mode 100644 index 00000000..d8332184 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ClothPerformanceScanner.cs @@ -0,0 +1,48 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Profiling; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New ClothPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/ClothPerformanceScanner" + )] + #endif + public sealed class ClothPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Cloth + List<Cloth> clothBuffer = new List<Cloth>(); + yield return ScanAvatarForComponentsOfType(avatarObject, clothBuffer); + if(shouldIgnoreComponent != null) + { + clothBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + int totalClothVertices = 0; + foreach(Cloth cloth in clothBuffer) + { + if(cloth == null) + { + continue; + } + + Vector3[] clothVertices = cloth.vertices; + if(clothVertices == null) + { + continue; + } + + totalClothVertices += clothVertices.Length; + } + + perfStats.clothCount = clothBuffer.Count; + perfStats.clothMaxVertices = totalClothVertices; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ClothPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ClothPerformanceScanner.cs.meta new file mode 100644 index 00000000..b04d8aef --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ClothPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0cec88b5a46f459195f10a2f11fddb2f +timeCreated: 1561255843
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/DynamicBonePerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/DynamicBonePerformanceScanner.cs new file mode 100644 index 00000000..860df33a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/DynamicBonePerformanceScanner.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; +using UnityEngine.Profiling; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New DynamicBonePerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/DynamicBonePerformanceScanner" + )] + #endif + public sealed class DynamicBonePerformanceScanner : AbstractPerformanceScanner + { + private Type _dynamicBoneType; + private FieldInfo _dynamicBoneRootFieldInfo; + private FieldInfo _dynamicBoneExclusionsFieldInfo; + private FieldInfo _dynamicBoneCollidersFieldInfo; + private FieldInfo _dynamicBoneEndLengthFieldInfo; + private FieldInfo _dynamicBoneEndOffsetFieldInfo; + + private void Awake() + { + FindDynamicBoneTypes(); + } + + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + if(_dynamicBoneType == null) + { + yield break; + } + + // Dynamic Bone as Component + List<Component> dynamicBoneComponentBuffer = new List<Component>(); + List<object> dynamicBoneColliderObjectBuffer = new List<object>(); + yield return ScanAvatarForComponentsOfType(_dynamicBoneType, avatarObject, dynamicBoneComponentBuffer); + if(shouldIgnoreComponent != null) + { + dynamicBoneComponentBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + int totalSimulatedBoneCount = 0; + int totalCollisionChecks = 0; + + Profiler.BeginSample("Analyze Dynamic Bones"); + foreach(Component dynamicBone in dynamicBoneComponentBuffer) + { + Profiler.BeginSample("Single Dynamic Bone Component"); + int simulatedBones = 0; + + // Add extra bones to the end of each chain if end bones are being used. + float endLength = (float)_dynamicBoneEndLengthFieldInfo.GetValue(dynamicBone); + Vector3 endOffset = (Vector3)_dynamicBoneEndOffsetFieldInfo.GetValue(dynamicBone); + bool hasEndBones = endLength > 0 || endOffset != Vector3.zero; + + Transform root = (Transform)_dynamicBoneRootFieldInfo.GetValue(dynamicBone); + if(root != null) + { + List<Transform> exclusions = (List<Transform>)_dynamicBoneExclusionsFieldInfo.GetValue(dynamicBone); + + // Calculate number of simulated bones for the hierarchy + simulatedBones = CountTransformsRecursively(root, exclusions, hasEndBones); + totalSimulatedBoneCount += simulatedBones; + } + + int colliderListEntryCount = 0; + IList colliderList = (IList)_dynamicBoneCollidersFieldInfo.GetValue(dynamicBone); + if(colliderList != null) + { + foreach(object collider in colliderList) + { + colliderListEntryCount += 1; + if(collider != null && !dynamicBoneColliderObjectBuffer.Contains(collider)) + { + dynamicBoneColliderObjectBuffer.Add(collider); + } + } + } + + // The root bone is skipped in collision checks. + totalCollisionChecks += (simulatedBones - 1) * colliderListEntryCount; + Profiler.EndSample(); + } + + Profiler.EndSample(); + + yield return null; + + perfStats.dynamicBoneComponentCount = dynamicBoneComponentBuffer.Count; + perfStats.dynamicBoneSimulatedBoneCount = totalSimulatedBoneCount; + perfStats.dynamicBoneColliderCount = dynamicBoneColliderObjectBuffer.Count; + perfStats.dynamicBoneCollisionCheckCount = totalCollisionChecks; + } + + private void FindDynamicBoneTypes() + { + if(_dynamicBoneType != null) + { + return; + } + + Type dyBoneType = ValidationUtils.GetTypeFromName("DynamicBone"); + if(dyBoneType == null) + { + return; + } + + Type dyBoneColliderType = ValidationUtils.GetTypeFromName("DynamicBoneColliderBase") ?? ValidationUtils.GetTypeFromName("DynamicBoneCollider"); + if(dyBoneColliderType == null) + { + return; + } + + FieldInfo rootFieldInfo = dyBoneType.GetField("m_Root", BindingFlags.Public | BindingFlags.Instance); + if(rootFieldInfo == null || rootFieldInfo.FieldType != typeof(Transform)) + { + return; + } + + FieldInfo exclusionsFieldInfo = dyBoneType.GetField("m_Exclusions", BindingFlags.Public | BindingFlags.Instance); + if(exclusionsFieldInfo == null || exclusionsFieldInfo.FieldType != typeof(List<Transform>)) + { + return; + } + + FieldInfo collidersFieldInfo = dyBoneType.GetField("m_Colliders", BindingFlags.Public | BindingFlags.Instance); + if(collidersFieldInfo == null || collidersFieldInfo.FieldType.GetGenericTypeDefinition() != typeof(List<>) || + collidersFieldInfo.FieldType.GetGenericArguments().Single() != dyBoneColliderType) + { + return; + } + + FieldInfo endLengthFieldInfo = dyBoneType.GetField("m_EndLength", BindingFlags.Public | BindingFlags.Instance); + if(endLengthFieldInfo == null || endLengthFieldInfo.FieldType != typeof(float)) + { + return; + } + + FieldInfo endOffsetFieldInfo = dyBoneType.GetField("m_EndOffset", BindingFlags.Public | BindingFlags.Instance); + if(endOffsetFieldInfo == null || endOffsetFieldInfo.FieldType != typeof(Vector3)) + { + return; + } + + _dynamicBoneType = dyBoneType; + _dynamicBoneRootFieldInfo = rootFieldInfo; + _dynamicBoneExclusionsFieldInfo = exclusionsFieldInfo; + _dynamicBoneCollidersFieldInfo = collidersFieldInfo; + _dynamicBoneEndLengthFieldInfo = endLengthFieldInfo; + _dynamicBoneEndOffsetFieldInfo = endOffsetFieldInfo; + } + + // Like DynamicBone itself exclusions only apply to children of the current bone. + // This means the root bone itself never excluded. + private static int CountTransformsRecursively(Transform transform, List<Transform> exclusions, bool addEndBones) + { + if(transform == null) + { + return 0; + } + + int count = 1; + int childCount = transform.childCount; + if(childCount > 0) + { + foreach(Transform child in transform) + { + if(exclusions == null || !exclusions.Contains(child)) + { + count += CountTransformsRecursively(child, exclusions, addEndBones); + } + } + } + else + { + if(addEndBones) + { + count++; + } + } + + return count; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/DynamicBonePerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/DynamicBonePerformanceScanner.cs.meta new file mode 100644 index 00000000..60f0db5a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/DynamicBonePerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a226df494ef04404a9a47c714822ab9f +timeCreated: 1561251560
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LightPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LightPerformanceScanner.cs new file mode 100644 index 00000000..8d86c6b5 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LightPerformanceScanner.cs @@ -0,0 +1,29 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New LightPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/LightPerformanceScanner" + )] + #endif + public sealed class LightPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Lights + List<Light> lightBuffer = new List<Light>(); + yield return ScanAvatarForComponentsOfType(avatarObject, lightBuffer); + if(shouldIgnoreComponent != null) + { + lightBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + perfStats.lightCount = lightBuffer.Count; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LightPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LightPerformanceScanner.cs.meta new file mode 100644 index 00000000..9c346056 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LightPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 405778fdc32c44c1bb9fdd0476fb0007 +timeCreated: 1561256390
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LineRendererPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LineRendererPerformanceScanner.cs new file mode 100644 index 00000000..1d1faa85 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LineRendererPerformanceScanner.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New LineRendererPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/LineRendererPerformanceScanner" + )] + #endif + public sealed class LineRendererPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Line Renderers + List<LineRenderer> lineRendererBuffer = new List<LineRenderer>(); + yield return ScanAvatarForComponentsOfType(avatarObject, lineRendererBuffer); + if(shouldIgnoreComponent != null) + { + lineRendererBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + int numLineRenderers = lineRendererBuffer.Count; + perfStats.lineRendererCount = numLineRenderers; + perfStats.materialCount = perfStats.materialCount.GetValueOrDefault() + numLineRenderers; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LineRendererPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LineRendererPerformanceScanner.cs.meta new file mode 100644 index 00000000..79875a56 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/LineRendererPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ec87392b85844f7bb526a48ec866a8f0 +timeCreated: 1561253047
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/MeshPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/MeshPerformanceScanner.cs new file mode 100644 index 00000000..9b5b1201 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/MeshPerformanceScanner.cs @@ -0,0 +1,266 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Profiling; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New MeshPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/MeshPerformanceScanner" + )] + #endif + public sealed class MeshPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Renderers + List<Renderer> rendererBuffer = new List<Renderer>(16); + yield return ScanAvatarForComponentsOfType(avatarObject, rendererBuffer); + if(shouldIgnoreComponent != null) + { + rendererBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + yield return AnalyzeGeometry(avatarObject, rendererBuffer, perfStats); + AnalyzeMeshRenderers(rendererBuffer, perfStats); + AnalyzeSkinnedMeshRenderers(rendererBuffer, perfStats); + + + yield return null; + } + + private static uint CalculateRendererPolyCount(Renderer renderer) + { + Mesh sharedMesh = null; + SkinnedMeshRenderer skinnedMeshRenderer = renderer as SkinnedMeshRenderer; + if(skinnedMeshRenderer != null) + { + sharedMesh = skinnedMeshRenderer.sharedMesh; + } + + if(sharedMesh == null) + { + MeshRenderer meshRenderer = renderer as MeshRenderer; + if(meshRenderer != null) + { + MeshFilter meshFilter = meshRenderer.GetComponent<MeshFilter>(); + if(meshFilter != null) + { + sharedMesh = meshFilter.sharedMesh; + } + } + } + + if(sharedMesh == null) + { + return 0; + } + + return MeshUtils.GetMeshTriangleCount(sharedMesh); + } + + private static bool RendererHasMesh(Renderer renderer) + { + MeshRenderer meshRenderer = renderer as MeshRenderer; + if(meshRenderer != null) + { + MeshFilter meshFilter = meshRenderer.GetComponent<MeshFilter>(); + if(meshFilter == null) + { + return false; + } + + return meshFilter.sharedMesh != null; + } + + SkinnedMeshRenderer skinnedMeshRenderer = renderer as SkinnedMeshRenderer; + if(skinnedMeshRenderer != null) + { + return skinnedMeshRenderer.sharedMesh != null; + } + + return false; + } + + private IEnumerator AnalyzeGeometry(GameObject avatarObject, IEnumerable<Renderer> renderers, AvatarPerformanceStats perfStats) + { + List<Renderer> lodGroupRendererIgnoreBuffer = new List<Renderer>(16); + List<LODGroup> lodBuffer = new List<LODGroup>(16); + + ulong polyCount = 0; + Bounds bounds = new Bounds(avatarObject.transform.position, Vector3.zero); + + yield return ScanAvatarForComponentsOfType(avatarObject, lodBuffer); + try + { + foreach(LODGroup lodGroup in lodBuffer) + { + LOD[] lodLevels = lodGroup.GetLODs(); + + ulong highestLodPolyCount = 0; + foreach(LOD lod in lodLevels) + { + uint thisLodPolyCount = 0; + foreach(Renderer renderer in lod.renderers) + { + lodGroupRendererIgnoreBuffer.Add(renderer); + checked + { + thisLodPolyCount += CalculateRendererPolyCount(renderer); + } + } + + if(thisLodPolyCount > highestLodPolyCount) + { + highestLodPolyCount = thisLodPolyCount; + } + } + + checked + { + polyCount += highestLodPolyCount; + } + } + } + catch(OverflowException e) + { + VRC.Core.Logger.Log("Overflow exception while analyzing geometry, assuming max value:" + e.ToString(), VRC.Core.DebugLevel.All); + polyCount = uint.MaxValue; + } + + Profiler.BeginSample("Calculate Total Polygon Count and Bounds"); + foreach(Renderer renderer in renderers) + { + Profiler.BeginSample("Single Renderer"); + if(renderer is MeshRenderer || renderer is SkinnedMeshRenderer) + { + if(!RendererHasMesh(renderer)) + { + Profiler.EndSample(); + continue; + } + + bounds.Encapsulate(renderer.bounds); + } + + if(lodGroupRendererIgnoreBuffer.Contains(renderer)) + { + Profiler.EndSample(); + continue; + } + + polyCount += CalculateRendererPolyCount(renderer); + Profiler.EndSample(); + } + + Profiler.EndSample(); + + bounds.center -= avatarObject.transform.position; + + lodGroupRendererIgnoreBuffer.Clear(); + lodBuffer.Clear(); + + perfStats.polyCount = polyCount > int.MaxValue ? int.MaxValue : (int)polyCount; + perfStats.aabb = bounds; + } + + private static void AnalyzeSkinnedMeshRenderers(IEnumerable<Renderer> renderers, AvatarPerformanceStats perfStats) + { + Profiler.BeginSample("AnalyzeSkinnedMeshRenderers"); + int count = 0; + int materialSlots = 0; + int skinnedBoneCount = 0; + HashSet<Transform> transformIgnoreBuffer = new HashSet<Transform>(); + + foreach(Renderer renderer in renderers) + { + Profiler.BeginSample("Analyze SkinnedMeshRenderer"); + SkinnedMeshRenderer skinnedMeshRenderer = renderer as SkinnedMeshRenderer; + if(skinnedMeshRenderer == null) + { + Profiler.EndSample(); + continue; + } + + count++; + + Mesh sharedMesh = skinnedMeshRenderer.sharedMesh; + if(sharedMesh != null) + { + materialSlots += sharedMesh.subMeshCount; + } + + // bone count + Profiler.BeginSample("Count Bones"); + Transform[] bones = skinnedMeshRenderer.bones; + foreach(Transform bone in bones) + { + Profiler.BeginSample("Count Bone"); + if(bone == null || transformIgnoreBuffer.Contains(bone)) + { + Profiler.EndSample(); + continue; + } + + transformIgnoreBuffer.Add(bone); + skinnedBoneCount++; + Profiler.EndSample(); + } + + Profiler.EndSample(); + + Profiler.EndSample(); + } + + transformIgnoreBuffer.Clear(); + Profiler.EndSample(); + + perfStats.skinnedMeshCount = count; + perfStats.boneCount = skinnedBoneCount; + perfStats.materialCount = perfStats.materialCount.GetValueOrDefault() + materialSlots; + } + + private static void AnalyzeMeshRenderers(IEnumerable<Renderer> renderers, AvatarPerformanceStats perfStats) + { + Profiler.BeginSample("AnalyzeMeshRenderers"); + int count = 0; + int materialSlots = 0; + foreach(Renderer renderer in renderers) + { + Profiler.BeginSample("Analyze MeshRenderer"); + MeshRenderer meshRenderer = renderer as MeshRenderer; + if(meshRenderer == null) + { + Profiler.EndSample(); + continue; + } + + count++; + + Profiler.BeginSample("Get MeshFilter"); + MeshFilter meshFilter = meshRenderer.GetComponent<MeshFilter>(); + Profiler.EndSample(); + if(meshFilter == null) + { + Profiler.EndSample(); + continue; + } + + Mesh sharedMesh = meshFilter.sharedMesh; + if(sharedMesh != null) + { + materialSlots += sharedMesh.subMeshCount; + } + } + + Profiler.EndSample(); + + perfStats.meshCount = count; + perfStats.materialCount = perfStats.materialCount.GetValueOrDefault() + materialSlots; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/MeshPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/MeshPerformanceScanner.cs.meta new file mode 100644 index 00000000..ba7c1507 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/MeshPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 38bca10261df4ddfa10cff3b3bbb9428 +timeCreated: 1561249198
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ParticlePerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ParticlePerformanceScanner.cs new file mode 100644 index 00000000..3d7acea8 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ParticlePerformanceScanner.cs @@ -0,0 +1,114 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Profiling; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New ParticlePerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/ParticlePerformanceScanner" + )] + #endif + public sealed class ParticlePerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Particle Systems + List<ParticleSystem> particleSystemBuffer = new List<ParticleSystem>(); + yield return ScanAvatarForComponentsOfType(avatarObject, particleSystemBuffer); + if(shouldIgnoreComponent != null) + { + particleSystemBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + AnalyzeParticleSystemRenderers(particleSystemBuffer, perfStats); + + yield return null; + } + + private static void AnalyzeParticleSystemRenderers(IEnumerable<ParticleSystem> particleSystems, AvatarPerformanceStats perfStats) + { + int particleSystemCount = 0; + ulong particleTotalCount = 0; + ulong particleTotalMaxMeshPolyCount = 0; + bool particleTrailsEnabled = false; + bool particleCollisionEnabled = false; + int materialSlots = 0; + + Profiler.BeginSample("AnalyzeParticleSystemRenderers"); + foreach(ParticleSystem particleSystem in particleSystems) + { + Profiler.BeginSample("Single Particle System"); + int particleCount = particleSystem.main.maxParticles; + if(particleCount <= 0) + { + Profiler.EndSample(); + continue; + } + + particleSystemCount++; + particleTotalCount += (uint)particleCount; + + ParticleSystemRenderer particleSystemRenderer = particleSystem.GetComponent<ParticleSystemRenderer>(); + if(particleSystemRenderer == null) + { + Profiler.EndSample(); + continue; + } + + materialSlots++; + + // mesh particles + if(particleSystemRenderer.renderMode == ParticleSystemRenderMode.Mesh && particleSystemRenderer.meshCount > 0) + { + uint highestPolyCount = 0; + + Mesh[] meshes = new Mesh[particleSystemRenderer.meshCount]; + int particleRendererMeshCount = particleSystemRenderer.GetMeshes(meshes); + for(int meshIndex = 0; meshIndex < particleRendererMeshCount; meshIndex++) + { + Mesh mesh = meshes[meshIndex]; + if(mesh == null) + { + continue; + } + + uint polyCount = MeshUtils.GetMeshTriangleCount(mesh); + if(polyCount > highestPolyCount) + { + highestPolyCount = polyCount; + } + } + + ulong maxMeshParticlePolyCount = (uint)particleCount * highestPolyCount; + particleTotalMaxMeshPolyCount += maxMeshParticlePolyCount; + } + + if(particleSystem.trails.enabled) + { + particleTrailsEnabled = true; + materialSlots++; + } + + if(particleSystem.collision.enabled) + { + particleCollisionEnabled = true; + } + + Profiler.EndSample(); + } + + Profiler.EndSample(); + + perfStats.particleSystemCount = particleSystemCount; + perfStats.particleTotalCount = particleTotalCount > int.MaxValue ? int.MaxValue : (int)particleTotalCount; + perfStats.particleMaxMeshPolyCount = particleTotalMaxMeshPolyCount > int.MaxValue ? int.MaxValue : (int)particleTotalMaxMeshPolyCount; + perfStats.particleTrailsEnabled = particleTrailsEnabled; + perfStats.particleCollisionEnabled = particleCollisionEnabled; + perfStats.materialCount = perfStats.materialCount.GetValueOrDefault() + materialSlots; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ParticlePerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ParticlePerformanceScanner.cs.meta new file mode 100644 index 00000000..54556038 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/ParticlePerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 10723e354ff14f98a49ab797b3f005e6 +timeCreated: 1561250267
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/PhysicsPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/PhysicsPerformanceScanner.cs new file mode 100644 index 00000000..c6b643da --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/PhysicsPerformanceScanner.cs @@ -0,0 +1,64 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Profiling; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New PhysicsPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/PhysicsPerformanceScanner" + )] + #endif + public sealed class PhysicsPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Colliders + List<Collider> colliderBuffer = new List<Collider>(); + yield return ScanAvatarForComponentsOfType(avatarObject, colliderBuffer); + colliderBuffer.RemoveAll( + o => + { + if(shouldIgnoreComponent != null && shouldIgnoreComponent(o)) + { + return true; + } + + if(o.GetComponent<VRC.SDKBase.VRCStation>() != null) + { + return true; + } + + return false; + } + ); + + perfStats.physicsColliderCount = colliderBuffer.Count; + + // Rigidbodies + List<Rigidbody> rigidbodyBuffer = new List<Rigidbody>(); + yield return ScanAvatarForComponentsOfType(avatarObject, rigidbodyBuffer); + rigidbodyBuffer.RemoveAll( + o => + { + if(shouldIgnoreComponent != null && shouldIgnoreComponent(o)) + { + return true; + } + + if(o.GetComponent<VRC.SDKBase.VRCStation>() != null) + { + return true; + } + + return false; + } + ); + + perfStats.physicsRigidbodyCount = rigidbodyBuffer.Count; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/PhysicsPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/PhysicsPerformanceScanner.cs.meta new file mode 100644 index 00000000..ed550cf1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/PhysicsPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6a94ecdeecd04f85824cc3244be5712a +timeCreated: 1561256481
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/TrailRendererPerformanceScanner.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/TrailRendererPerformanceScanner.cs new file mode 100644 index 00000000..c75e4cae --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/TrailRendererPerformanceScanner.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using VRC.SDKBase.Validation.Performance.Stats; + +namespace VRC.SDKBase.Validation.Performance.Scanners +{ + #if VRC_CLIENT + [CreateAssetMenu( + fileName = "New TrailRendererPerformanceScanner", + menuName = "VRC Scriptable Objects/Performance/Avatar/Scanners/TrailRendererPerformanceScanner" + )] + #endif + public sealed class TrailRendererPerformanceScanner : AbstractPerformanceScanner + { + public override IEnumerator RunPerformanceScanEnumerator(GameObject avatarObject, AvatarPerformanceStats perfStats, AvatarPerformance.IgnoreDelegate shouldIgnoreComponent) + { + // Trail Renderers + List<TrailRenderer> trailRendererBuffer = new List<TrailRenderer>(); + yield return ScanAvatarForComponentsOfType(avatarObject, trailRendererBuffer); + if(shouldIgnoreComponent != null) + { + trailRendererBuffer.RemoveAll(c => shouldIgnoreComponent(c)); + } + + int numTrailRenderers = trailRendererBuffer.Count; + perfStats.trailRendererCount = numTrailRenderers; + perfStats.materialCount = perfStats.materialCount.GetValueOrDefault() + numTrailRenderers; + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/TrailRendererPerformanceScanner.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/TrailRendererPerformanceScanner.cs.meta new file mode 100644 index 00000000..028dd032 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Scanners/TrailRendererPerformanceScanner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2efd714b564547b4be1ebd1f2700668b +timeCreated: 1561251810
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats.meta new file mode 100644 index 00000000..d3f32ff9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 98d6a2417172b474281db225f2dd8f6e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStats.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStats.cs new file mode 100644 index 00000000..2a59664c --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStats.cs @@ -0,0 +1,589 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace VRC.SDKBase.Validation.Performance.Stats +{ + public class AvatarPerformanceStats + { + private delegate int ComparePerformanceStatsDelegate(AvatarPerformanceStats stats, AvatarPerformanceStatsLevel statsLevel); + + #region Public Fields + + public string avatarName; + + public int? polyCount; + public Bounds? aabb; + public int? skinnedMeshCount; + public int? meshCount; + public int? materialCount; + public int? animatorCount; + public int? boneCount; + public int? lightCount; + public int? particleSystemCount; + public int? particleTotalCount; + public int? particleMaxMeshPolyCount; + public bool? particleTrailsEnabled; + public bool? particleCollisionEnabled; + public int? trailRendererCount; + public int? lineRendererCount; + public int? dynamicBoneComponentCount; + public int? dynamicBoneSimulatedBoneCount; + public int? dynamicBoneColliderCount; + public int? dynamicBoneCollisionCheckCount; // number of collider simulated bones excluding the root multiplied by the number of colliders + public int? clothCount; + public int? clothMaxVertices; + public int? physicsColliderCount; + public int? physicsRigidbodyCount; + public int? audioSourceCount; + public float? downloadSize; + + #endregion + + #region Private Fields + + private readonly PerformanceRating[] _performanceRatingCache; + private static readonly Dictionary<AvatarPerformanceCategory, string> _performanceCategoryDisplayNames = new Dictionary<AvatarPerformanceCategory, string> + { + {AvatarPerformanceCategory.PolyCount, "Polygons"}, + {AvatarPerformanceCategory.AABB, "Bounds"}, + {AvatarPerformanceCategory.SkinnedMeshCount, "Skinned Meshes"}, + {AvatarPerformanceCategory.MeshCount, "Meshes"}, + {AvatarPerformanceCategory.MaterialCount, "Material Slots"}, + {AvatarPerformanceCategory.AnimatorCount, "Animators"}, + {AvatarPerformanceCategory.BoneCount, "Bones"}, + {AvatarPerformanceCategory.LightCount, "Lights"}, + {AvatarPerformanceCategory.ParticleSystemCount, "Particle Systems"}, + {AvatarPerformanceCategory.ParticleTotalCount, "Total Max Particles"}, + {AvatarPerformanceCategory.ParticleMaxMeshPolyCount, "Mesh Particle Max Polygons"}, + {AvatarPerformanceCategory.ParticleTrailsEnabled, "Particle Trails Enabled"}, + {AvatarPerformanceCategory.ParticleCollisionEnabled, "Particle Collision Enabled"}, + {AvatarPerformanceCategory.TrailRendererCount, "Trail Renderers"}, + {AvatarPerformanceCategory.LineRendererCount, "Line Renderers"}, + {AvatarPerformanceCategory.DynamicBoneComponentCount, "Dynamic Bone Components"}, + {AvatarPerformanceCategory.DynamicBoneSimulatedBoneCount, "Dynamic Bone Transforms"}, + {AvatarPerformanceCategory.DynamicBoneColliderCount, "Dynamic Bone Colliders"}, + {AvatarPerformanceCategory.DynamicBoneCollisionCheckCount, "Dynamic Bone Collision Check Count"}, + {AvatarPerformanceCategory.ClothCount, "Cloths"}, + {AvatarPerformanceCategory.ClothMaxVertices, "Total Cloth Vertices"}, + {AvatarPerformanceCategory.PhysicsColliderCount, "Physics Colliders"}, + {AvatarPerformanceCategory.PhysicsRigidbodyCount, "Physics Rigidbodies"}, + {AvatarPerformanceCategory.AudioSourceCount, "Audio Sources"}, + {AvatarPerformanceCategory.DownloadSize, "Download Size"}, + }; + + private static readonly Dictionary<PerformanceRating, string> _performanceRatingDisplayNames = new Dictionary<PerformanceRating, string> + { + {PerformanceRating.None, "None"}, + {PerformanceRating.Excellent, "Excellent"}, + {PerformanceRating.Good, "Good"}, + {PerformanceRating.Medium, "Medium"}, + {PerformanceRating.Poor, "Poor"}, + {PerformanceRating.VeryPoor, "VeryPoor"} + }; + + #endregion + + #region Initialization + + private static AvatarPerformanceStatsLevelSet _performanceStatsLevelSet = null; + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + public static void Initialize() + { + if(_performanceStatsLevelSet != null) + { + return; + } + + _performanceStatsLevelSet = Resources.Load<AvatarPerformanceStatsLevelSet>(GetPlatformPerformanceStatLevels()); + } + + private static string GetPlatformPerformanceStatLevels() + { +#if UNITY_ANDROID + return "Validation/Performance/StatsLevels/Quest/AvatarPerformanceStatLevels_Quest"; +#else + return "Validation/Performance/StatsLevels/Windows/AvatarPerformanceStatLevels_Windows"; +#endif + } + + #endregion + + #region Constructors + + public AvatarPerformanceStats() + { + _performanceRatingCache = new PerformanceRating[(int)AvatarPerformanceCategory.AvatarPerformanceCategoryCount]; + } + + #endregion + + #region Public Methods + + public void Reset() + { + avatarName = null; + polyCount = null; + aabb = null; + skinnedMeshCount = null; + meshCount = null; + materialCount = null; + animatorCount = null; + boneCount = null; + lightCount = null; + particleSystemCount = null; + particleTotalCount = null; + particleMaxMeshPolyCount = null; + particleTrailsEnabled = null; + particleCollisionEnabled = null; + trailRendererCount = null; + lineRendererCount = null; + dynamicBoneComponentCount = null; + dynamicBoneSimulatedBoneCount = null; + dynamicBoneColliderCount = null; + dynamicBoneCollisionCheckCount = null; + clothCount = null; + clothMaxVertices = null; + physicsColliderCount = null; + physicsRigidbodyCount = null; + audioSourceCount = null; + downloadSize = null; + + for(int i = 0; i < (int)AvatarPerformanceCategory.AvatarPerformanceCategoryCount; i++) + { + _performanceRatingCache[i] = PerformanceRating.None; + } + } + + public PerformanceRating GetPerformanceRatingForCategory(AvatarPerformanceCategory perfCategory) + { + if(_performanceRatingCache[(int)perfCategory] == PerformanceRating.None) + { + _performanceRatingCache[(int)perfCategory] = CalculatePerformanceRatingForCategory(perfCategory); + } + + return _performanceRatingCache[(int)perfCategory]; + } + + public void CalculateAllPerformanceRatings() + { + for(int i = 0; i < _performanceRatingCache.Length; i++) + { + _performanceRatingCache[i] = PerformanceRating.None; + } + + foreach(AvatarPerformanceCategory perfCategory in Enum.GetValues(typeof(AvatarPerformanceCategory))) + { + if(perfCategory == AvatarPerformanceCategory.None || + perfCategory == AvatarPerformanceCategory.AvatarPerformanceCategoryCount) + { + continue; + } + + if(_performanceRatingCache[(int)perfCategory] == PerformanceRating.None) + { + _performanceRatingCache[(int)perfCategory] = CalculatePerformanceRatingForCategory(perfCategory); + } + } + } + + public static string GetPerformanceCategoryDisplayName(AvatarPerformanceCategory category) + { + return _performanceCategoryDisplayNames[category]; + } + + public static string GetPerformanceRatingDisplayName(PerformanceRating rating) + { + return _performanceRatingDisplayNames[rating]; + } + + public static AvatarPerformanceStatsLevel GetStatLevelForRating(PerformanceRating rating) + { + switch(rating) + { + case PerformanceRating.None: + return _performanceStatsLevelSet.excellent; + + case PerformanceRating.Excellent: + return _performanceStatsLevelSet.excellent; + + case PerformanceRating.Good: + return _performanceStatsLevelSet.good; + + case PerformanceRating.Medium: + return _performanceStatsLevelSet.medium; + + case PerformanceRating.Poor: + return _performanceStatsLevelSet.poor; + + case PerformanceRating.VeryPoor: + return _performanceStatsLevelSet.poor; + + default: + return _performanceStatsLevelSet.excellent; + } + } + + #endregion + + #region Private Methods + + private PerformanceRating CalculatePerformanceRatingForCategory(AvatarPerformanceCategory perfCategory) + { + switch(perfCategory) + { + case AvatarPerformanceCategory.Overall: + { + PerformanceRating maxRating = PerformanceRating.None; + + foreach(AvatarPerformanceCategory category in Enum.GetValues(typeof(AvatarPerformanceCategory))) + { + if(category == AvatarPerformanceCategory.None || + category == AvatarPerformanceCategory.Overall || + category == AvatarPerformanceCategory.AvatarPerformanceCategoryCount) + { + continue; + } + + PerformanceRating rating = GetPerformanceRatingForCategory(category); + if(rating > maxRating) + { + maxRating = rating; + } + } + + return maxRating; + } + case AvatarPerformanceCategory.PolyCount: + { + if(!polyCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.polyCount.GetValueOrDefault() - y.polyCount); + } + case AvatarPerformanceCategory.AABB: + { + if(!aabb.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating( + (x, y) => + ApproxLessOrEqual(y.aabb.extents.x, 0.0f) || // -1 extents means "no AABB limit" + ( + ApproxLessOrEqual(x.aabb.GetValueOrDefault().extents.x, y.aabb.extents.x) && + ApproxLessOrEqual(x.aabb.GetValueOrDefault().extents.y, y.aabb.extents.y) && + ApproxLessOrEqual(x.aabb.GetValueOrDefault().extents.z, y.aabb.extents.z)) + ? -1 + : 1 + ); + } + case AvatarPerformanceCategory.SkinnedMeshCount: + { + if(!skinnedMeshCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.skinnedMeshCount.GetValueOrDefault() - y.skinnedMeshCount); + } + case AvatarPerformanceCategory.MeshCount: + { + if(!meshCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.meshCount.GetValueOrDefault() - y.meshCount); + } + case AvatarPerformanceCategory.MaterialCount: + { + if(!materialCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.materialCount.GetValueOrDefault() - y.materialCount); + } + case AvatarPerformanceCategory.AnimatorCount: + { + if(!animatorCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.animatorCount.GetValueOrDefault() - y.animatorCount); + } + case AvatarPerformanceCategory.BoneCount: + { + if(!boneCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.boneCount.GetValueOrDefault() - y.boneCount); + } + case AvatarPerformanceCategory.LightCount: + { + if(!lightCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.lightCount.GetValueOrDefault() - y.lightCount); + } + case AvatarPerformanceCategory.ParticleSystemCount: + { + if(!particleSystemCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.particleSystemCount.GetValueOrDefault() - y.particleSystemCount); + } + case AvatarPerformanceCategory.ParticleTotalCount: + { + if(!particleTotalCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.particleTotalCount.GetValueOrDefault() - y.particleTotalCount); + } + case AvatarPerformanceCategory.ParticleMaxMeshPolyCount: + { + if(!particleMaxMeshPolyCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.particleMaxMeshPolyCount.GetValueOrDefault() - y.particleMaxMeshPolyCount); + } + case AvatarPerformanceCategory.ParticleTrailsEnabled: + { + if(!particleTrailsEnabled.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating( + (x, y) => + { + if(x.particleTrailsEnabled == y.particleTrailsEnabled) + { + return 0; + } + + return x.particleTrailsEnabled.GetValueOrDefault() ? 1 : -1; + }); + } + case AvatarPerformanceCategory.ParticleCollisionEnabled: + { + if(!particleCollisionEnabled.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating( + (x, y) => + { + if(x.particleCollisionEnabled == y.particleCollisionEnabled) + { + return 0; + } + + return x.particleCollisionEnabled.GetValueOrDefault() ? 1 : -1; + }); + } + case AvatarPerformanceCategory.TrailRendererCount: + { + if(!trailRendererCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.trailRendererCount.GetValueOrDefault() - y.trailRendererCount); + } + case AvatarPerformanceCategory.LineRendererCount: + { + if(!lineRendererCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.lineRendererCount.GetValueOrDefault() - y.lineRendererCount); + } + case AvatarPerformanceCategory.DynamicBoneComponentCount: + { + if(!dynamicBoneComponentCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.dynamicBoneComponentCount.GetValueOrDefault() - y.dynamicBoneComponentCount); + } + case AvatarPerformanceCategory.DynamicBoneSimulatedBoneCount: + { + if(!dynamicBoneSimulatedBoneCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.dynamicBoneSimulatedBoneCount.GetValueOrDefault() - y.dynamicBoneSimulatedBoneCount); + } + case AvatarPerformanceCategory.DynamicBoneColliderCount: + { + if(!dynamicBoneColliderCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.dynamicBoneColliderCount.GetValueOrDefault() - y.dynamicBoneColliderCount); + } + case AvatarPerformanceCategory.DynamicBoneCollisionCheckCount: + { + if(!dynamicBoneCollisionCheckCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.dynamicBoneCollisionCheckCount.GetValueOrDefault() - y.dynamicBoneCollisionCheckCount); + } + case AvatarPerformanceCategory.ClothCount: + { + if(!clothCount.HasValue) + { + return PerformanceRating.None; + } + return CalculatePerformanceRating((x, y) => x.clothCount.GetValueOrDefault() - y.clothCount); + } + case AvatarPerformanceCategory.ClothMaxVertices: + { + if(!clothMaxVertices.HasValue) + { + return PerformanceRating.None; + } + return CalculatePerformanceRating((x, y) => x.clothMaxVertices.GetValueOrDefault() - y.clothMaxVertices); + } + case AvatarPerformanceCategory.PhysicsColliderCount: + { + if(!physicsColliderCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.physicsColliderCount.GetValueOrDefault() - y.physicsColliderCount); + } + case AvatarPerformanceCategory.PhysicsRigidbodyCount: + { + if(!physicsRigidbodyCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.physicsRigidbodyCount.GetValueOrDefault() - y.physicsRigidbodyCount); + } + case AvatarPerformanceCategory.AudioSourceCount: + { + if(!audioSourceCount.HasValue) + { + return PerformanceRating.None; + } + + return CalculatePerformanceRating((x, y) => x.audioSourceCount.GetValueOrDefault() - y.audioSourceCount); + } + case AvatarPerformanceCategory.DownloadSize: + { + if(!downloadSize.HasValue) + { + return PerformanceRating.None; + } + + return PerformanceRating.Excellent; + } + default: + { + return PerformanceRating.None; + } + } + } + + private PerformanceRating CalculatePerformanceRating(ComparePerformanceStatsDelegate compareFn) + { + if(compareFn(this, _performanceStatsLevelSet.excellent) <= 0) + { + return PerformanceRating.Excellent; + } + + if(compareFn(this, _performanceStatsLevelSet.good) <= 0) + { + return PerformanceRating.Good; + } + + if(compareFn(this, _performanceStatsLevelSet.medium) <= 0) + { + return PerformanceRating.Medium; + } + + if(compareFn(this, _performanceStatsLevelSet.poor) <= 0) + { + return PerformanceRating.Poor; + } + + return PerformanceRating.VeryPoor; + } + + private static bool ApproxLessOrEqual(float x1, float x2) + { + float r = x1 - x2; + return r < 0.0f || Mathf.Approximately(r, 0.0f); + } + + #endregion + + #region Overrides + + public override string ToString() + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + sb.AppendFormat("Avatar Name: {0}\n", avatarName); + sb.AppendFormat("Overall Performance: {0}\n", GetPerformanceRatingForCategory(AvatarPerformanceCategory.Overall)); + sb.AppendFormat("Poly Count: {0}\n", polyCount); + sb.AppendFormat("Bounds: {0}\n", aabb.ToString()); + sb.AppendFormat("Skinned Mesh Count: {0}\n", skinnedMeshCount); + sb.AppendFormat("Mesh Count: {0}\n", meshCount); + sb.AppendFormat("Material Count: {0}\n", materialCount); + sb.AppendFormat("Animator Count: {0}\n", animatorCount); + sb.AppendFormat("Bone Count: {0}\n", boneCount); + sb.AppendFormat("Light Count: {0}\n", lightCount); + sb.AppendFormat("Particle System Count: {0}\n", particleSystemCount); + sb.AppendFormat("Particle Total Count: {0}\n", particleTotalCount); + sb.AppendFormat("Particle Max Mesh Poly Count: {0}\n", particleMaxMeshPolyCount); + sb.AppendFormat("Particle Trails Enabled: {0}\n", particleTrailsEnabled); + sb.AppendFormat("Particle Collision Enabled: {0}\n", particleCollisionEnabled); + sb.AppendFormat("Trail Renderer Count: {0}\n", trailRendererCount); + sb.AppendFormat("Line Renderer Count: {0}\n", lineRendererCount); + sb.AppendFormat("Dynamic Bone Component Count: {0}\n", dynamicBoneComponentCount); + sb.AppendFormat("Dynamic Bone Simulated Bone Count: {0}\n", dynamicBoneSimulatedBoneCount); + sb.AppendFormat("Dynamic Bone Collider Count: {0}\n", dynamicBoneColliderCount); + sb.AppendFormat("Dynamic Bone Collision Check Count: {0}\n", dynamicBoneCollisionCheckCount); + sb.AppendFormat("Cloth Count: {0}\n", clothCount); + sb.AppendFormat("Cloth Max Vertices: {0}\n", clothMaxVertices); + sb.AppendFormat("Physics Collider Count: {0}\n", physicsColliderCount); + sb.AppendFormat("Physics Rigidbody Count: {0}\n", physicsRigidbodyCount); + if(downloadSize > 0) + { + sb.AppendFormat("Download Size: {0} MB\n", downloadSize); + } + + return sb.ToString(); + } + + #endregion + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStats.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStats.cs.meta new file mode 100644 index 00000000..894716a6 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStats.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1bf4fb79a49d4b109c4dce6b38e5548e +timeCreated: 1561267926
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevel.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevel.cs new file mode 100644 index 00000000..c31b43a2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevel.cs @@ -0,0 +1,32 @@ +using UnityEngine; + +namespace VRC.SDKBase.Validation.Performance.Stats +{ + public class AvatarPerformanceStatsLevel : ScriptableObject + { + public int polyCount; + public Bounds aabb; + public int skinnedMeshCount; + public int meshCount; + public int materialCount; + public int animatorCount; + public int boneCount; + public int lightCount; + public int particleSystemCount; + public int particleTotalCount; + public int particleMaxMeshPolyCount; + public bool particleTrailsEnabled; + public bool particleCollisionEnabled; + public int trailRendererCount; + public int lineRendererCount; + public int dynamicBoneComponentCount; + public int dynamicBoneSimulatedBoneCount; + public int dynamicBoneColliderCount; + public int dynamicBoneCollisionCheckCount; + public int clothCount; + public int clothMaxVertices; + public int physicsColliderCount; + public int physicsRigidbodyCount; + public int audioSourceCount; + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevel.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevel.cs.meta new file mode 100644 index 00000000..966fbdc0 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f742c36dce5730f4d96e37d82c330584 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevelSet.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevelSet.cs new file mode 100644 index 00000000..6490496b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevelSet.cs @@ -0,0 +1,15 @@ +using UnityEngine; +using UnityEngine.Serialization; + +namespace VRC.SDKBase.Validation.Performance.Stats +{ + public class AvatarPerformanceStatsLevelSet : ScriptableObject + { + [FormerlySerializedAs("veryGood")] + public AvatarPerformanceStatsLevel excellent; + public AvatarPerformanceStatsLevel good; + public AvatarPerformanceStatsLevel medium; + [FormerlySerializedAs("bad")] + public AvatarPerformanceStatsLevel poor; + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevelSet.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevelSet.cs.meta new file mode 100644 index 00000000..603c0a80 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/Performance/Stats/AvatarPerformanceStatsLevelSet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 468554b1bfc447f41a20a2f5bae65d16 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ShaderValidation.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ShaderValidation.cs new file mode 100644 index 00000000..0a69a1af --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ShaderValidation.cs @@ -0,0 +1,86 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace VRC.SDKBase.Validation +{ + public static class ShaderValidation + { + public static IEnumerable<Shader> FindIllegalShaders(GameObject target, string[] whitelist) + { + List<Shader> illegalShaders = new List<Shader>(); + IEnumerator seeker = FindIllegalShadersEnumerator(target, whitelist, (c) => illegalShaders.Add(c)); + while(seeker.MoveNext()) + { + } + + return illegalShaders; + } + + private static IEnumerator FindIllegalShadersEnumerator(GameObject target, string[] whitelist, System.Action<Shader> onFound, bool useWatch = false) + { + System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); + if(useWatch) + { + watch.Start(); + } + + List<Material> materialCache = new List<Material>(); + Queue<GameObject> children = new Queue<GameObject>(); + children.Enqueue(target.gameObject); + while(children.Count > 0) + { + GameObject child = children.Dequeue(); + if(child == null) + { + continue; + } + + for(int idx = 0; idx < child.transform.childCount; ++idx) + { + children.Enqueue(child.transform.GetChild(idx).gameObject); + } + + foreach(Renderer childRenderers in child.transform.GetComponents<Renderer>()) + { + if(childRenderers == null) + { + continue; + } + + foreach(Material sharedMaterial in childRenderers.sharedMaterials) + { + if(materialCache.Any(cacheMtl => sharedMaterial == cacheMtl)) // did we already look at this one? + { + continue; + } + + // Skip empty material slots, or materials without shaders. + // Both will end up using the magenta error shader. + if(sharedMaterial == null || sharedMaterial.shader == null) + { + continue; + } + + if(whitelist.All(okayShaderName => sharedMaterial.shader.name != okayShaderName)) + { + onFound(sharedMaterial.shader); + yield return null; + } + + materialCache.Add(sharedMaterial); + } + + if(!useWatch || watch.ElapsedMilliseconds <= 1) + { + continue; + } + + yield return null; + watch.Reset(); + } + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ShaderValidation.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ShaderValidation.cs.meta new file mode 100644 index 00000000..1b9e8680 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ShaderValidation.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bef0a8d1d2c547119a62b7d7a5c512ea +timeCreated: 1563940360
\ No newline at end of file diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ValidationUtils.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ValidationUtils.cs new file mode 100644 index 00000000..e6dfef95 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ValidationUtils.cs @@ -0,0 +1,260 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using UnityEngine; +using System.Reflection; + +namespace VRC.SDKBase.Validation +{ + public static class ValidationUtils + { + public static void RemoveIllegalComponents(GameObject target, HashSet<Type> whitelist, bool retry = true, bool onlySceneObjects = false, bool logStripping = true) + { + List<Component> foundComponents = FindIllegalComponents(target, whitelist); + foreach(Component component in foundComponents) + { + if(component == null) + { + continue; + } + + if(onlySceneObjects && component.GetInstanceID() < 0) + { + continue; + } + + if(logStripping) + { + Core.Logger.LogWarning($"Removing {component.GetType().Name} comp from {component.gameObject.name}"); + } + + RemoveComponent(component); + } + } + + public static List<Component> FindIllegalComponents(GameObject target, HashSet<Type> whitelist) + { + List<Component> foundComponents = new List<Component>(); + Component[] allComponents = target.GetComponentsInChildren<Component>(true); + foreach(Component component in allComponents) + { + if(component == null) + { + continue; + } + + Type componentType = component.GetType(); + if(whitelist.Contains(componentType)) + { + continue; + } + + foundComponents.Add(component); + } + + return foundComponents; + } + + private static readonly Dictionary<string, Type> _typeCache = new Dictionary<string, Type>(); + private static readonly Dictionary<string, HashSet<Type>> _whitelistCache = new Dictionary<string, HashSet<Type>>(); + public static HashSet<Type> WhitelistedTypes(string whitelistName, IEnumerable<string> componentTypeWhitelist) + { + if (_whitelistCache.ContainsKey(whitelistName)) + { + return _whitelistCache[whitelistName]; + } + + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + HashSet<Type> whitelist = new HashSet<Type>(); + foreach(string whitelistedTypeName in componentTypeWhitelist) + { + Type whitelistedType = GetTypeFromName(whitelistedTypeName, assemblies); + if(whitelistedType == null) + { + continue; + } + + if(whitelist.Contains(whitelistedType)) + { + continue; + } + + whitelist.Add(whitelistedType); + } + + AddDerivedClasses(whitelist); + + _whitelistCache[whitelistName] = whitelist; + + return _whitelistCache[whitelistName]; + } + + public static HashSet<Type> WhitelistedTypes(string whitelistName, IEnumerable<Type> componentTypeWhitelist) + { + if (_whitelistCache.ContainsKey(whitelistName)) + { + return _whitelistCache[whitelistName]; + } + + HashSet<Type> whitelist = new HashSet<Type>(); + whitelist.UnionWith(componentTypeWhitelist); + + AddDerivedClasses(whitelist); + + _whitelistCache[whitelistName] = whitelist; + + return _whitelistCache[whitelistName]; + } + + private static void AddDerivedClasses(HashSet<Type> whitelist) + { + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach(Assembly assembly in assemblies) + { + foreach(Type type in assembly.GetTypes()) + { + if(whitelist.Contains(type)) + { + continue; + } + + if(!typeof(Component).IsAssignableFrom(type)) + { + continue; + } + + Type currentType = type; + while(currentType != typeof(object) && currentType != null) + { + if(whitelist.Contains(currentType)) + { + whitelist.Add(type); + break; + } + + currentType = currentType.BaseType; + } + } + } + } + + public static Type GetTypeFromName(string name, Assembly[] assemblies = null) + { + if (_typeCache.ContainsKey(name)) + { + + return _typeCache[name]; + } + + if (assemblies == null) + { + assemblies = AppDomain.CurrentDomain.GetAssemblies(); + } + + foreach (Assembly assembly in assemblies) + { + Type found = assembly.GetType(name); + if(found == null) + { + continue; + } + + _typeCache[name] = found; + return found; + } + + //This is really verbose for some SDK scenes, eg. + //If they don't have FinalIK installed +#if VRC_CLIENT && UNITY_EDITOR + Debug.LogWarningFormat("Could not find type {0}", name); +#endif + + _typeCache[name] = null; + return null; + } + + private static readonly Dictionary<Type, ImmutableArray<RequireComponent>> _requireComponentsCache = new Dictionary<Type, ImmutableArray<RequireComponent>>(); + private static void RemoveDependencies(Component rootComponent) + { + if (rootComponent == null) + { + return; + } + + Component[] components = rootComponent.GetComponents<Component>(); + if (components == null || components.Length == 0) + { + return; + } + + Type compType = rootComponent.GetType(); + foreach (var siblingComponent in components) + { + if (siblingComponent == null) + { + continue; + } + + Type siblingComponentType = siblingComponent.GetType(); + if(!_requireComponentsCache.TryGetValue(siblingComponentType, out ImmutableArray<RequireComponent> requiredComponentAttributes)) + { + requiredComponentAttributes = siblingComponentType.GetCustomAttributes(typeof(RequireComponent), true).Cast<RequireComponent>().ToImmutableArray(); + _requireComponentsCache.Add(siblingComponentType, requiredComponentAttributes); + } + + bool deleteMe = false; + foreach (RequireComponent requireComponent in requiredComponentAttributes) + { + if (requireComponent == null) + { + continue; + } + + if(requireComponent.m_Type0 != compType && requireComponent.m_Type1 != compType && requireComponent.m_Type2 != compType) + { + continue; + } + + deleteMe = true; + break; + } + + if (deleteMe && siblingComponent != rootComponent) + { + RemoveComponent(siblingComponent); + } + } + } + + public static void RemoveComponent(Component comp) + { + if (comp == null) + { + return; + } + + RemoveDependencies(comp); + +#if VRC_CLIENT + UnityEngine.Object.DestroyImmediate(comp, true); +#else + UnityEngine.Object.DestroyImmediate(comp, false); +#endif + } + + public static void RemoveComponentsOfType<T>(GameObject target) where T : Component + { + if (target == null) + return; + + foreach (T comp in target.GetComponentsInChildren<T>(true)) + { + if (comp == null || comp.gameObject == null) + continue; + + RemoveComponent(comp); + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ValidationUtils.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ValidationUtils.cs.meta new file mode 100644 index 00000000..adc2f728 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/ValidationUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8a90ec11b51863c4cb2d8a8cee31c2fb +timeCreated: 1504829091 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/WorldValidation.cs b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/WorldValidation.cs new file mode 100644 index 00000000..3dab42c2 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/WorldValidation.cs @@ -0,0 +1,682 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +#if TextMeshPro +using TMPro; +#endif +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; +using UnityEngine.UI; + +namespace VRC.SDKBase.Validation +{ + public static class WorldValidation + { + private static readonly Lazy<int> _debugLevel = new Lazy<int>(InitializeLogging); + private static int DebugLevel => _debugLevel.Value; + + private static int InitializeLogging() + { + int hashCode = typeof(WorldValidation).GetHashCode(); + VRC.Core.Logger.DescribeDebugLevel(hashCode, "WorldValidation", VRC.Core.Logger.Color.red); + VRC.Core.Logger.AddDebugLevel(hashCode); + return hashCode; + } + + static string[] ComponentTypeWhiteList = null; + + public enum WhiteListConfiguration + { + None, + VRCSDK2, + VRCSDK3, + Unchanged + } + + static WhiteListConfiguration ComponentTypeWhiteListConfiguration = WhiteListConfiguration.None; + + static readonly string[] ComponentTypeWhiteListCommon = new string[] + { + #if UNITY_STANDALONE + "UnityEngine.Rendering.PostProcessing.PostProcessDebug", + "UnityEngine.Rendering.PostProcessing.PostProcessLayer", + "UnityEngine.Rendering.PostProcessing.PostProcessVolume", + #endif + "VRC.Core.PipelineManager", + "UiInputField", + "VRCProjectSettings", + "DynamicBone", + "DynamicBoneCollider", + "TMPro.TMP_Dropdown", + "TMPro.TMP_InputField", + "TMPro.TMP_ScrollbarEventHandler", + "TMPro.TMP_SelectionCaret", + "TMPro.TMP_SpriteAnimator", + "TMPro.TMP_SubMesh", + "TMPro.TMP_SubMeshUI", + "TMPro.TMP_Text", + "TMPro.TextMeshPro", + "TMPro.TextMeshProUGUI", + "TMPro.TextContainer", + "TMPro.TMP_Dropdown+DropdownItem", + "UnityEngine.EventSystems.EventSystem", + "UnityEngine.EventSystems.EventTrigger", + "UnityEngine.EventSystems.UIBehaviour", + "UnityEngine.EventSystems.BaseInput", + "UnityEngine.EventSystems.BaseInputModule", + "UnityEngine.EventSystems.PointerInputModule", + "UnityEngine.EventSystems.StandaloneInputModule", + "UnityEngine.EventSystems.TouchInputModule", + "UnityEngine.EventSystems.BaseRaycaster", + "UnityEngine.EventSystems.PhysicsRaycaster", + "UnityEngine.UI.Button", + "UnityEngine.UI.Dropdown", + "UnityEngine.UI.Dropdown+DropdownItem", + "UnityEngine.UI.Graphic", + "UnityEngine.UI.GraphicRaycaster", + "UnityEngine.UI.Image", + "UnityEngine.UI.InputField", + "UnityEngine.UI.Mask", + "UnityEngine.UI.MaskableGraphic", + "UnityEngine.UI.RawImage", + "UnityEngine.UI.RectMask2D", + "UnityEngine.UI.Scrollbar", + "UnityEngine.UI.ScrollRect", + "UnityEngine.UI.Selectable", + "UnityEngine.UI.Slider", + "UnityEngine.UI.Text", + "UnityEngine.UI.Toggle", + "UnityEngine.UI.ToggleGroup", + "UnityEngine.UI.AspectRatioFitter", + "UnityEngine.UI.CanvasScaler", + "UnityEngine.UI.ContentSizeFitter", + "UnityEngine.UI.GridLayoutGroup", + "UnityEngine.UI.HorizontalLayoutGroup", + "UnityEngine.UI.HorizontalOrVerticalLayoutGroup", + "UnityEngine.UI.LayoutElement", + "UnityEngine.UI.LayoutGroup", + "UnityEngine.UI.VerticalLayoutGroup", + "UnityEngine.UI.BaseMeshEffect", + "UnityEngine.UI.Outline", + "UnityEngine.UI.PositionAsUV1", + "UnityEngine.UI.Shadow", + "OVRLipSync", + "OVRLipSyncContext", + "OVRLipSyncContextBase", + "OVRLipSyncContextCanned", + "OVRLipSyncContextMorphTarget", + "OVRLipSyncContextTextureFlip", + "ONSPReflectionZone", + "OculusSpatializerUnity", + "ONSPAmbisonicsNative", + "ONSPAudioSource", + "RootMotion.FinalIK.BipedIK", + "RootMotion.FinalIK.FingerRig", + "RootMotion.FinalIK.Grounder", + "RootMotion.FinalIK.GrounderBipedIK", + "RootMotion.FinalIK.GrounderFBBIK", + "RootMotion.FinalIK.GrounderIK", + "RootMotion.FinalIK.GrounderQuadruped", + "RootMotion.FinalIK.GrounderVRIK", + "RootMotion.FinalIK.AimIK", + "RootMotion.FinalIK.CCDIK", + "RootMotion.FinalIK.FABRIK", + "RootMotion.FinalIK.FABRIKRoot", + "RootMotion.FinalIK.FullBodyBipedIK", + "RootMotion.FinalIK.IK", + "RootMotion.FinalIK.IKExecutionOrder", + "RootMotion.FinalIK.LegIK", + "RootMotion.FinalIK.LimbIK", + "RootMotion.FinalIK.LookAtIK", + "RootMotion.FinalIK.TrigonometricIK", + "RootMotion.FinalIK.VRIK", + "RootMotion.FinalIK.FBBIKArmBending", + "RootMotion.FinalIK.FBBIKHeadEffector", + "RootMotion.FinalIK.TwistRelaxer", + "RootMotion.FinalIK.InteractionObject", + "RootMotion.FinalIK.InteractionSystem", + "RootMotion.FinalIK.InteractionTarget", + "RootMotion.FinalIK.InteractionTrigger", + "RootMotion.FinalIK.GenericPoser", + "RootMotion.FinalIK.HandPoser", + "RootMotion.FinalIK.Poser", + "RootMotion.FinalIK.RagdollUtility", + "RootMotion.FinalIK.RotationLimit", + "RootMotion.FinalIK.RotationLimitAngle", + "RootMotion.FinalIK.RotationLimitHinge", + "RootMotion.FinalIK.RotationLimitPolygonal", + "RootMotion.FinalIK.RotationLimitSpline", + "RootMotion.FinalIK.AimPoser", + "RootMotion.FinalIK.Amplifier", + "RootMotion.FinalIK.BodyTilt", + "RootMotion.FinalIK.HitReaction", + "RootMotion.FinalIK.HitReactionVRIK", + "RootMotion.FinalIK.Inertia", + "RootMotion.FinalIK.OffsetModifier", + "RootMotion.FinalIK.OffsetModifierVRIK", + "RootMotion.FinalIK.OffsetPose", + "RootMotion.FinalIK.Recoil", + "RootMotion.FinalIK.ShoulderRotator", + "RootMotion.Dynamics.AnimationBlocker", + "RootMotion.Dynamics.BehaviourBase", + "RootMotion.Dynamics.BehaviourFall", + "RootMotion.Dynamics.BehaviourPuppet", + "RootMotion.Dynamics.JointBreakBroadcaster", + "RootMotion.Dynamics.MuscleCollisionBroadcaster", + "RootMotion.Dynamics.PressureSensor", + "RootMotion.Dynamics.Prop", + "RootMotion.Dynamics.PropRoot", + "RootMotion.Dynamics.PuppetMaster", + "RootMotion.Dynamics.PuppetMasterSettings", + // TODO: remove these if they are only needed in editor + "RootMotion.Dynamics.BipedRagdollCreator", + "RootMotion.Dynamics.RagdollCreator", + "RootMotion.Dynamics.RagdollEditor", + // + "RootMotion.SolverManager", + "RootMotion.TriggerEventBroadcaster", + "UnityEngine.WindZone", + "UnityEngine.Tilemaps.Tilemap", + "UnityEngine.Tilemaps.TilemapRenderer", + "UnityEngine.Terrain", + "UnityEngine.Tree", + "UnityEngine.SpriteMask", + "UnityEngine.Grid", + "UnityEngine.GridLayout", + "UnityEngine.AudioSource", + "UnityEngine.AudioReverbZone", + "UnityEngine.AudioLowPassFilter", + "UnityEngine.AudioHighPassFilter", + "UnityEngine.AudioDistortionFilter", + "UnityEngine.AudioEchoFilter", + "UnityEngine.AudioChorusFilter", + "UnityEngine.AudioReverbFilter", + "UnityEngine.Playables.PlayableDirector", + "UnityEngine.TerrainCollider", + "UnityEngine.Canvas", + "UnityEngine.CanvasGroup", + "UnityEngine.CanvasRenderer", + "UnityEngine.TextMesh", + "UnityEngine.Animator", + "UnityEngine.AI.NavMeshAgent", + "UnityEngine.AI.NavMeshObstacle", + "UnityEngine.AI.OffMeshLink", + "UnityEngine.Cloth", + "UnityEngine.WheelCollider", + "UnityEngine.Rigidbody", + "UnityEngine.Joint", + "UnityEngine.HingeJoint", + "UnityEngine.SpringJoint", + "UnityEngine.FixedJoint", + "UnityEngine.CharacterJoint", + "UnityEngine.ConfigurableJoint", + "UnityEngine.ConstantForce", + "UnityEngine.Collider", + "UnityEngine.BoxCollider", + "UnityEngine.SphereCollider", + "UnityEngine.MeshCollider", + "UnityEngine.CapsuleCollider", + "UnityEngine.CharacterController", + "UnityEngine.ParticleSystem", + "UnityEngine.ParticleSystemRenderer", + "UnityEngine.BillboardRenderer", + "UnityEngine.Camera", + "UnityEngine.FlareLayer", + "UnityEngine.SkinnedMeshRenderer", + "UnityEngine.Renderer", + "UnityEngine.TrailRenderer", + "UnityEngine.LineRenderer", + "UnityEngine.GUIElement", + "UnityEngine.GUILayer", + "UnityEngine.Light", + "UnityEngine.LightProbeGroup", + "UnityEngine.LightProbeProxyVolume", + "UnityEngine.LODGroup", + "UnityEngine.ReflectionProbe", + "UnityEngine.SpriteRenderer", + "UnityEngine.Transform", + "UnityEngine.RectTransform", + "UnityEngine.Rendering.SortingGroup", + "UnityEngine.Projector", + "UnityEngine.OcclusionPortal", + "UnityEngine.OcclusionArea", + "UnityEngine.LensFlare", + "UnityEngine.Skybox", + "UnityEngine.MeshFilter", + "UnityEngine.Halo", + "UnityEngine.MeshRenderer", + "UnityEngine.Collider2D", + "UnityEngine.Rigidbody2D", + "UnityEngine.CompositeCollider2D", + "UnityEngine.ConstantForce2D", + "UnityEngine.AreaEffector2D", + "UnityEngine.CapsuleCollider2D", + "UnityEngine.DistanceJoint2D", + "UnityEngine.EdgeCollider2D", + "UnityEngine.Effector2D", + "UnityEngine.BoxCollider2D", + "UnityEngine.CircleCollider2D", + "UnityEngine.FixedJoint2D", + "UnityEngine.HingeJoint2D", + "UnityEngine.FrictionJoint2D", + "UnityEngine.PlatformEffector2D", + "UnityEngine.PointEffector2D", + "UnityEngine.PolygonCollider2D", + "UnityEngine.SliderJoint2D", + "UnityEngine.SurfaceEffector2D", + "UnityEngine.RelativeJoint2D", + "UnityEngine.TargetJoint2D", + "UnityEngine.WheelJoint2D", + "UnityEngine.Joint2D", + "UnityEngine.ParticleSystemForceField" + }; + + static readonly string[] ComponentTypeWhiteListSdk2 = new string[] + { + #if UNITY_STANDALONE + "VRCSDK2.VRC_CustomRendererBehaviour", + "VRCSDK2.VRC_MidiNoteIn", + "VRCSDK2.scripts.Scenes.VRC_Panorama", + "VRCSDK2.VRC_Water", + "UnityStandardAssets.Water.WaterBasic", + "UnityStandardAssets.Water.Displace", + "UnityStandardAssets.Water.GerstnerDisplace", + "UnityStandardAssets.Water.PlanarReflection", + "UnityStandardAssets.Water.SpecularLighting", + "UnityStandardAssets.Water.Water", + "UnityStandardAssets.Water.WaterBase", + "UnityStandardAssets.Water.WaterTile", + #endif + "VRCSDK2.VRCTriggerRelay", + "VRCSDK2.VRC_AudioBank", + "VRCSDK2.VRC_DataStorage", + "VRCSDK2.VRC_EventHandler", + "VRCSDK2.VRC_IKFollower", + "VRCSDK2.VRC_Label", + "VRCSDK2.VRC_KeyEvents", + "VRCSDK2.VRC_PhysicsRoot", + "VRCSDK2.VRC_CombatSystem", + "VRCSDK2.VRC_DestructibleStandard", + "VRC_VisualDamage", + "VRCSDK2.VRC_OscButtonIn", + "VRCSDK2.VRC_GunStats", + "VRCSDK2.VRC_JukeBox", + "VRCSDK2.VRC_AddDamage", + "VRCSDK2.VRC_AddHealth", + "VRCSDK2.VRC_AvatarCalibrator", + "VRCSDK2.VRC_AvatarPedestal", + "VRCSDK2.VRC_NPCSpawn", + "VRCSDK2.VRC_ObjectSpawn", + "VRCSDK2.VRC_ObjectSync", + "VRCSDK2.VRC_Pickup", + "VRCSDK2.VRC_PortalMarker", + "VRCSDK2.VRC_SlideShow", + "VRCSDK2.VRC_SpatialAudioSource", + "VRCSDK2.VRC_StationInput", + "VRCSDK2.VRC_SyncAnimation", + "VRCSDK2.VRC_SyncVideoPlayer", + "VRCSDK2.VRC_SyncVideoStream", + "VRCSDK2.VRC_VideoScreen", + "VRCSDK2.VRC_VideoSpeaker", + "VRCSDK2.VRC_PlayerAudioOverride", + "VRCSDK2.VRC_MirrorReflection", + "VRCSDK2.VRC_PlayerMods", + "VRCSDK2.VRC_SceneDescriptor", + "VRCSDK2.VRC_SceneResetPosition", + "VRCSDK2.VRC_SceneSmoothShift", + "VRCSDK2.VRC_SpecialLayer", + "VRCSDK2.VRC_Station", + "VRCSDK2.VRC_StereoObject", + "VRCSDK2.VRC_TimedEvents", + "VRCSDK2.VRC_Trigger", + "VRCSDK2.VRC_TriggerColliderEventTrigger", + "VRCSDK2.VRC_UseEvents", + "VRCSDK2.VRC_UiShape", + "UnityEngine.Animation", + #if !UNITY_2019_4_OR_NEWER + "UnityEngine.GUIText", + "UnityEngine.GUITexture", + #endif + "UnityEngine.Video.VideoPlayer", + "PhysSound.PhysSoundBase", + "PhysSound.PhysSoundObject", + "PhysSound.PhysSoundTempAudio", + "PhysSound.PhysSoundTempAudioPool", + "PhysSound.PhysSoundTerrain", + "RealisticEyeMovements.EyeAndHeadAnimator", + "RealisticEyeMovements.LookTargetController", + "UnityStandardAssets.Cameras.AbstractTargetFollower", + "UnityStandardAssets.Cameras.AutoCam", + "UnityStandardAssets.Cameras.FreeLookCam", + "UnityStandardAssets.Cameras.HandHeldCam", + "UnityStandardAssets.Cameras.LookatTarget", + "UnityStandardAssets.Cameras.PivotBasedCameraRig", + "UnityStandardAssets.Cameras.ProtectCameraFromWallClip", + "UnityStandardAssets.Cameras.TargetFieldOfView", + "UnityStandardAssets.Characters.FirstPerson.FirstPersonController", + "UnityStandardAssets.Characters.FirstPerson.HeadBob", + "UnityStandardAssets.Characters.FirstPerson.RigidbodyFirstPersonController", + "UnityStandardAssets.Vehicles.Ball.Ball", + "UnityStandardAssets.Vehicles.Ball.BallUserControl", + "UnityStandardAssets.Characters.ThirdPerson.AICharacterControl", + "UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter", + "UnityStandardAssets.Characters.ThirdPerson.ThirdPersonUserControl", + "UnityStandardAssets.CrossPlatformInput.AxisTouchButton", + "UnityStandardAssets.CrossPlatformInput.ButtonHandler", + "UnityStandardAssets.CrossPlatformInput.InputAxisScrollbar", + "UnityStandardAssets.CrossPlatformInput.Joystick", + "UnityStandardAssets.CrossPlatformInput.MobileControlRig", + "UnityStandardAssets.CrossPlatformInput.TiltInput", + "UnityStandardAssets.CrossPlatformInput.TouchPad", + "UnityStandardAssets.Effects.AfterburnerPhysicsForce", + "UnityStandardAssets.Effects.ExplosionFireAndDebris", + "UnityStandardAssets.Effects.ExplosionPhysicsForce", + "UnityStandardAssets.Effects.Explosive", + "UnityStandardAssets.Effects.ExtinguishableParticleSystem", + "UnityStandardAssets.Effects.FireLight", + "UnityStandardAssets.Effects.Hose", + "UnityStandardAssets.Effects.ParticleSystemMultiplier", + "UnityStandardAssets.Effects.SmokeParticles", + "UnityStandardAssets.Effects.WaterHoseParticles", + "UnityStandardAssets.Utility.ActivateTrigger", + "UnityStandardAssets.Utility.AutoMoveAndRotate", + "UnityStandardAssets.Utility.DragRigidbody", + "UnityStandardAssets.Utility.DynamicShadowSettings", + "UnityStandardAssets.Utility.FollowTarget", + "UnityStandardAssets.Utility.FPSCounter", + "UnityStandardAssets.Utility.ObjectResetter", + "UnityStandardAssets.Utility.ParticleSystemDestroyer", + #if !UNITY_2019_4_OR_NEWER + "UnityStandardAssets.Utility.SimpleActivatorMenu", + #endif + "UnityStandardAssets.Utility.SimpleMouseRotator", + "UnityStandardAssets.Utility.SmoothFollow", + "UnityStandardAssets.Utility.TimedObjectActivator", + "UnityStandardAssets.Utility.TimedObjectDestructor", + "UnityStandardAssets.Utility.WaypointCircuit", + "UnityStandardAssets.Utility.WaypointProgressTracker", + "UnityStandardAssets.Vehicles.Aeroplane.AeroplaneAiControl", + "UnityStandardAssets.Vehicles.Aeroplane.AeroplaneAudio", + "UnityStandardAssets.Vehicles.Aeroplane.AeroplaneController", + "UnityStandardAssets.Vehicles.Aeroplane.AeroplaneControlSurfaceAnimator", + "UnityStandardAssets.Vehicles.Aeroplane.AeroplanePropellerAnimator", + "UnityStandardAssets.Vehicles.Aeroplane.AeroplaneUserControl2Axis", + "UnityStandardAssets.Vehicles.Aeroplane.AeroplaneUserControl4Axis", + "UnityStandardAssets.Vehicles.Aeroplane.JetParticleEffect", + "UnityStandardAssets.Vehicles.Aeroplane.LandingGear", + "UnityStandardAssets.Vehicles.Car.BrakeLight", + "UnityStandardAssets.Vehicles.Car.CarAIControl", + "UnityStandardAssets.Vehicles.Car.CarAudio", + "UnityStandardAssets.Vehicles.Car.CarController", + "UnityStandardAssets.Vehicles.Car.CarSelfRighting", + "UnityStandardAssets.Vehicles.Car.CarUserControl", + "UnityStandardAssets.Vehicles.Car.Mudguard", + "UnityStandardAssets.Vehicles.Car.SkidTrail", + "UnityStandardAssets.Vehicles.Car.Suspension", + "UnityStandardAssets.Vehicles.Car.WheelEffects", + "RenderHeads.Media.AVProVideo.ApplyToMaterial", + "RenderHeads.Media.AVProVideo.ApplyToMesh", + "RenderHeads.Media.AVProVideo.AudioOutput", + "RenderHeads.Media.AVProVideo.CubemapCube", + "RenderHeads.Media.AVProVideo.DebugOverlay", + "RenderHeads.Media.AVProVideo.DisplayBackground", + "RenderHeads.Media.AVProVideo.DisplayIMGUI", + "RenderHeads.Media.AVProVideo.DisplayUGUI", + "RenderHeads.Media.AVProVideo.MediaPlayer", + "RenderHeads.Media.AVProVideo.StreamParser", + "RenderHeads.Media.AVProVideo.SubtitlesUGUI", + "RenderHeads.Media.AVProVideo.UpdateStereoMaterial", + "AlphaButtonClickMask", + "EventSystemChecker", + "VirtualMarketplaceItem", + "SDK2UrlLauncher" + }; + + static readonly string[] ComponentTypeWhiteListSdk3 = new string[] + { + "VRC.SDK3.VRCDestructibleStandard", + "VRC.SDK3.Components.VRCVisualDamage", + "VRC.SDK3.Components.VRCAvatarPedestal", + "VRC.SDK3.Components.VRCPickup", + "VRC.SDK3.Components.VRCPortalMarker", + "VRC.SDK3.Components.VRCSpatialAudioSource", + "VRC.SDK3.Components.VRCMirrorReflection", + "VRC.SDK3.Components.VRCSceneDescriptor", + "VRC.SDK3.Components.VRCStation", + "VRC.SDK3.Components.VRCUiShape", + "VRC.SDK3.Components.VRCObjectSync", + "VRC.SDK3.Components.VRCObjectPool", + "VRC.SDK3.Video.Components.VRCUnityVideoPlayer", + "VRC.SDK3.Video.Components.AVPro.VRCAVProVideoPlayer", + "VRC.SDK3.Video.Components.AVPro.VRCAVProVideoScreen", + "VRC.SDK3.Video.Components.AVPro.VRCAVProVideoSpeaker", + "VRC.SDK3.Midi.VRCMidiListener", + "VRC.Udon.UdonBehaviour", + "VRC.Udon.AbstractUdonBehaviourEventProxy", + "UnityEngine.Animations.AimConstraint", + "UnityEngine.Animations.LookAtConstraint", + "UnityEngine.Animations.ParentConstraint", + "UnityEngine.Animations.PositionConstraint", + "UnityEngine.Animations.RotationConstraint", + "UnityEngine.Animations.ScaleConstraint", + "UnityEngine.ParticleSystemForceField", + "Cinemachine.Cinemachine3rdPersonAim", + "Cinemachine.CinemachineBlendListCamera", + "Cinemachine.CinemachineBrain", + "Cinemachine.CinemachineCameraOffset", + "Cinemachine.CinemachineClearShot", + "Cinemachine.CinemachineCollider", + "Cinemachine.CinemachineConfiner", + "Cinemachine.CinemachineDollyCart", + "Cinemachine.CinemachineExternalCamera", + "Cinemachine.CinemachineFollowZoom", + "Cinemachine.CinemachineFreeLook", + "Cinemachine.CinemachineMixingCamera", + "Cinemachine.CinemachinePath", + "Cinemachine.CinemachinePipeline", + "Cinemachine.CinemachinePixelPerfect", + "Cinemachine.CinemachineRecomposer", + "Cinemachine.CinemachineSmoothPath", + "Cinemachine.CinemachineStateDrivenCamera", + "Cinemachine.CinemachineStoryboard", + "Cinemachine.CinemachineTargetGroup", + "Cinemachine.CinemachineVirtualCamera", + "Cinemachine.Cinemachine3rdPersonFollow", + "Cinemachine.CinemachineBasicMultiChannelPerlin", + "Cinemachine.CinemachineComposer", + "Cinemachine.CinemachineFramingTransposer", + "Cinemachine.CinemachineGroupComposer", + "Cinemachine.CinemachineHardLockToTarget", + "Cinemachine.CinemachineHardLookAt", + "Cinemachine.CinemachineOrbitalTransposer", + "Cinemachine.CinemachinePOV", + "Cinemachine.CinemachineSameAsFollowTarget", + "Cinemachine.CinemachineTrackedDolly", + "Cinemachine.CinemachineTransposer", + "Cinemachine.CinemachineCore" + }; + + public static readonly string[] ShaderWhiteList = new string[] + { + "VRChat/Mobile/Standard Lite", + "VRChat/Mobile/Diffuse", + "VRChat/Mobile/Bumped Diffuse", + "VRChat/Mobile/Bumped Mapped Specular", + "VRChat/Mobile/Toon Lit", + "VRChat/Mobile/MatCap Lit", + "VRChat/Mobile/Lightmapped", + "VRChat/Mobile/Skybox", + "VRChat/Mobile/Particles/Additive", + "VRChat/Mobile/Particles/Multiply", + "FX/MirrorReflection", + "UI/Default", + }; + + private static readonly HashSet<int> scannedObjects = new HashSet<int>(); + + private static void ConfigureWhiteList(WhiteListConfiguration config) + { + if(ComponentTypeWhiteListConfiguration == config || + config == WhiteListConfiguration.Unchanged) + { + return; + } + + List<string> concatenation = new List<string>(); + concatenation.AddRange(ComponentTypeWhiteListCommon); + + switch(config) + { + case WhiteListConfiguration.VRCSDK2: + concatenation.AddRange(ComponentTypeWhiteListSdk2); + break; + case WhiteListConfiguration.VRCSDK3: + concatenation.AddRange(ComponentTypeWhiteListSdk3); + break; + } + + ComponentTypeWhiteListConfiguration = config; + ComponentTypeWhiteList = concatenation.ToArray(); + } + + [PublicAPI] + public static void RemoveIllegalComponents(List<GameObject> targets, WhiteListConfiguration config, bool retry = true, HashSet<Type> tagWhitelistedTypes = null) + { + ConfigureWhiteList(config); + + HashSet<Type> whitelist = ValidationUtils.WhitelistedTypes($"world{config}", ComponentTypeWhiteList); + + // combine whitelist types from world tags with cached whitelist + if (tagWhitelistedTypes != null) + { + tagWhitelistedTypes.UnionWith(whitelist); + } + + foreach(GameObject target in targets) + { + ValidationUtils.RemoveIllegalComponents(target, (tagWhitelistedTypes == null) ? whitelist : tagWhitelistedTypes, retry, true, true); + SecurityScan(target); + AddScanned(target); + } + } + + private static void AddScanned(GameObject obj) + { + if(obj == null) + return; + + if(!scannedObjects.Contains(obj.GetInstanceID())) + scannedObjects.Add(obj.GetInstanceID()); + + for(int idx = 0; idx < obj.transform.childCount; ++idx) + AddScanned(obj.transform.GetChild(idx)?.gameObject); + } + + private static bool WasScanned(GameObject obj) + { + return scannedObjects.Contains(obj.GetInstanceID()); + } + + [PublicAPI] + public static void ScanGameObject(GameObject target, WhiteListConfiguration config) + { + if(WasScanned(target)) + { + return; + } + + ConfigureWhiteList(config); + HashSet<Type> whitelist = ValidationUtils.WhitelistedTypes("world" + config, ComponentTypeWhiteList); + ValidationUtils.RemoveIllegalComponents(target, whitelist); + SecurityScan(target); + AddScanned(target); + + // Must be called after AddScanned to avoid infinite recursion. + ScanDropdownTemplates(target, config); + } + + [PublicAPI] + public static void ClearScannedGameObjectCache() + { + scannedObjects.Clear(); + } + + [PublicAPI] + public static IEnumerable<Shader> FindIllegalShaders(GameObject target) + { + return ShaderValidation.FindIllegalShaders(target, ShaderWhiteList); + } + + private static void SecurityScan(GameObject target) + { + PlayableDirector[] playableDirectors = target.GetComponentsInChildren<PlayableDirector>(true); + foreach(PlayableDirector playableDirector in playableDirectors) + { + StripPlayableDirectorWithPrefabs(playableDirector); + } + } + + private static void ScanDropdownTemplates(GameObject target, WhiteListConfiguration config) + { + Dropdown[] dropdowns = target.GetComponentsInChildren<Dropdown>(true); + foreach(Dropdown dropdown in dropdowns) + { + if(dropdown == null) + { + continue; + } + + RectTransform dropdownTemplate = dropdown.template; + if(dropdownTemplate == null) + { + continue; + } + + ScanGameObject(dropdownTemplate.transform.root.gameObject, config); + } + + #if TextMeshPro + TMP_Dropdown[] tmpDropdowns = target.GetComponentsInChildren<TMP_Dropdown>(true); + foreach(TMP_Dropdown textMeshProDropdown in tmpDropdowns) + { + if(textMeshProDropdown == null) + { + continue; + } + + RectTransform dropdownTemplate = textMeshProDropdown.template; + if(dropdownTemplate == null) + { + continue; + } + + ScanGameObject(dropdownTemplate.transform.root.gameObject, config); + } + #endif + } + + private static void StripPlayableDirectorWithPrefabs(PlayableDirector playableDirector) + { + if(!(playableDirector.playableAsset is UnityEngine.Timeline.TimelineAsset timelineAsset)) + return; + + IEnumerable<TrackAsset> tracks = timelineAsset.GetOutputTracks(); + foreach(TrackAsset track in tracks) + { + if(!(track is ControlTrack)) + continue; + + IEnumerable<TimelineClip> clips = track.GetClips(); + foreach(TimelineClip clip in clips) + { + if(clip.asset is ControlPlayableAsset controlPlayableAsset && controlPlayableAsset.prefabGameObject != null) + { + UnityEngine.Object.Destroy(playableDirector); + VRC.Core.Logger.LogWarning("PlayableDirector containing prefab removed", DebugLevel, playableDirector.gameObject); + } + } + } + } + } +} diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/WorldValidation.cs.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/WorldValidation.cs.meta new file mode 100644 index 00000000..f84c2b09 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Scripts/Validation/WorldValidation.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9b03724cd556cb047b2da80492ea28a5 +timeCreated: 1504829091 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics.meta new file mode 100644 index 00000000..28941976 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e4416b239ee93442a3551de776ad3bc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics/SDK_Panel_Banner.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics/SDK_Panel_Banner.png Binary files differnew file mode 100644 index 00000000..c42cc3f1 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics/SDK_Panel_Banner.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics/SDK_Panel_Banner.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics/SDK_Panel_Banner.png.meta new file mode 100644 index 00000000..f70de059 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/SdkGraphics/SDK_Panel_Banner.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 9ae7399f0cf902a41a20f3487af8322a +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + 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: 0 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + 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: 5772d417389f8c34cb882113498aee62 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Settings.asset b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Settings.asset new file mode 100644 index 00000000..13d0bb9d --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Settings.asset @@ -0,0 +1,18 @@ +%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: 862234372, guid: f994bcaaf4690ab4e953545d40789022, type: 3} + m_Name: Settings + m_EditorClassIdentifier: + activeWindowPanel: 0 + polygonLimits: e80300008813000010270000 + DisplayAdvancedSettings: 0 + DisplayHelpBoxes: 1 diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Settings.asset.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Settings.asset.meta new file mode 100644 index 00000000..4c9c63df --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Settings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d471b09e7f06a69458457ec63d3532b8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures.meta new file mode 100644 index 00000000..cd5c08e5 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c023e5673bf12a4f8830db737e937c8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/VRChatBanner.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/VRChatBanner.png Binary files differnew file mode 100644 index 00000000..a8126051 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/VRChatBanner.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/VRChatBanner.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/VRChatBanner.png.meta new file mode 100644 index 00000000..3b11ff54 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/VRChatBanner.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 861bc2dd35aa1534d89330ffa4434b61 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + 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: 0 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + 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: a0c65038ff8c0624ea8e378f0bda371d + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGRNoAlpha.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGRNoAlpha.png Binary files differnew file mode 100644 index 00000000..80aa0e82 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGRNoAlpha.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGRNoAlpha.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGRNoAlpha.png.meta new file mode 100644 index 00000000..1c90d514 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGRNoAlpha.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8d95767408d35544c98f92ef7279b8db +timeCreated: 1532782888 +licenseType: Pro +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: 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: Android + maxTextureSize: 2048 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGreyNoAlpha.png b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGreyNoAlpha.png Binary files differnew file mode 100644 index 00000000..1f78cb8b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGreyNoAlpha.png diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGreyNoAlpha.png.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGreyNoAlpha.png.meta new file mode 100644 index 00000000..fbe0b1fc --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/VRChat/Textures/damageGreyNoAlpha.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 13d3efffb839ced4c8426a88a0c3e98c +timeCreated: 1532782887 +licenseType: Pro +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: 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: Android + maxTextureSize: 2048 + textureFormat: 50 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync.meta new file mode 100644 index 00000000..2a27d522 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a05c24cef2f33a2489d3db88b736e31f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/Blake2Sharp.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/Blake2Sharp.dll Binary files differnew file mode 100644 index 00000000..43b09138 --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/Blake2Sharp.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/Blake2Sharp.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/Blake2Sharp.dll.meta new file mode 100644 index 00000000..c45e428a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/Blake2Sharp.dll.meta @@ -0,0 +1,34 @@ +fileFormatVersion: 2 +guid: a2e4b2ce02fa7914895069e5fdbf112d +timeCreated: 1499976970 +licenseType: Free +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + Any: + second: + enabled: 1 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + data: + first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/librsync.net.dll b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/librsync.net.dll Binary files differnew file mode 100644 index 00000000..f25a7e6b --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/librsync.net.dll diff --git a/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/librsync.net.dll.meta b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/librsync.net.dll.meta new file mode 100644 index 00000000..a48b988a --- /dev/null +++ b/VRCSDK3Worlds/Assets/VRCSDK/Dependencies/librsync/librsync.net.dll.meta @@ -0,0 +1,34 @@ +fileFormatVersion: 2 +guid: 912b2ac597cb1ad4c9bdc1a98ec15459 +timeCreated: 1499976969 +licenseType: Free +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + Any: + second: + enabled: 1 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + data: + first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: |