From 7babd6f7b8572f578c3116ad47519e1b31e7dcf1 Mon Sep 17 00:00:00 2001 From: Aivo Paas Date: Mon, 16 Sep 2024 13:04:57 +0300 Subject: [PATCH 01/14] [AUTH-6] Use auth-service endpoints for auth-related requests (#317) ## [AUTH-6](https://ready-player-me.atlassian.net/browse/AUTH-6) ## Description - Switched from old authentication endpoints to the new ones in auth-service ## How to Test - Use the Avatar Creator Wizard functionality and verify it works: - Log in with email code - Sign up when clicking Next in the editor ## Checklist - [ ] Tests written or updated for the changes. - [ ] Documentation is updated. - [ ] Changelog is updated. [AUTH-6]: https://ready-player-me.atlassian.net/browse/AUTH-6?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../Scripts/Data/Constants/AuthConstants.cs | 5 ++- .../AvatarCreator/Scripts/Data/CreatedUser.cs | 13 +++++++ .../AvatarCreator/Scripts/Data/UserSession.cs | 11 ++++++ .../JsonConverters/AuthDataConverter.cs | 17 +++++++++ .../Scripts/WebRequests/AuthAPIRequests.cs | 36 +++++++++++-------- .../Scripts/WebRequests/AvatarAPIRequests.cs | 2 +- .../AvatarCreatorSelection.cs | 2 ++ 7 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs diff --git a/Runtime/AvatarCreator/Scripts/Data/Constants/AuthConstants.cs b/Runtime/AvatarCreator/Scripts/Data/Constants/AuthConstants.cs index 0d531fd1..5cb64db4 100644 --- a/Runtime/AvatarCreator/Scripts/Data/Constants/AuthConstants.cs +++ b/Runtime/AvatarCreator/Scripts/Data/Constants/AuthConstants.cs @@ -3,11 +3,10 @@ public static class AuthConstants { public const string EMAIL = "email"; - public const string AUTH_TYPE = "authType"; - public const string AUTH_TYPE_CODE = "code"; - public const string AUTH_TYPE_PASSWORD = "password"; + public const string CODE = "code"; public const string TOKEN = "token"; public const string REFRESH_TOKEN = "refreshToken"; public const string USER_ID = "id"; + public const string APP_NAME = "appName"; } } diff --git a/Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs b/Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs new file mode 100644 index 00000000..397a47d2 --- /dev/null +++ b/Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs @@ -0,0 +1,13 @@ +namespace ReadyPlayerMe.AvatarCreator +{ + public struct CreatedUser + { + public string Id; + public string Name; + public string Email; + public string Token; + public string RefreshToken; + public string LastModifiedAvatarId; + } +} + diff --git a/Runtime/AvatarCreator/Scripts/Data/UserSession.cs b/Runtime/AvatarCreator/Scripts/Data/UserSession.cs index 8cb064ef..6a01f07a 100644 --- a/Runtime/AvatarCreator/Scripts/Data/UserSession.cs +++ b/Runtime/AvatarCreator/Scripts/Data/UserSession.cs @@ -11,5 +11,16 @@ public struct UserSession public string Token; public string RefreshToken; public string LastModifiedAvatarId; + + public UserSession(CreatedUser createdUser) + { + Id = createdUser.Id; + Name = createdUser.Name; + Email = createdUser.Email; + Token = createdUser.Token; + RefreshToken = createdUser.RefreshToken; + LastModifiedAvatarId = createdUser.LastModifiedAvatarId; + } } } + diff --git a/Runtime/AvatarCreator/Scripts/JsonConverters/AuthDataConverter.cs b/Runtime/AvatarCreator/Scripts/JsonConverters/AuthDataConverter.cs index 01ef113f..6c7807ef 100644 --- a/Runtime/AvatarCreator/Scripts/JsonConverters/AuthDataConverter.cs +++ b/Runtime/AvatarCreator/Scripts/JsonConverters/AuthDataConverter.cs @@ -9,6 +9,11 @@ public static class AuthDataConverter private const string DATA = "data"; public static string CreatePayload(Dictionary data) + { + return JObject.FromObject(data).ToString(); + } + + public static string CreateDataPayload(Dictionary data) { return new JObject( new JProperty(DATA, JObject.FromObject(data)) @@ -16,6 +21,18 @@ public static string CreatePayload(Dictionary data) } public static JToken ParseResponse(string response) + { + var json = JObject.Parse(response); + + if (json == null) + { + throw new Exception("No data received"); + } + + return json; + } + + public static JToken ParseDataResponse(string response) { var json = JObject.Parse(response); var data = json.GetValue(DATA); diff --git a/Runtime/AvatarCreator/Scripts/WebRequests/AuthAPIRequests.cs b/Runtime/AvatarCreator/Scripts/WebRequests/AuthAPIRequests.cs index 283edf27..201f2a39 100644 --- a/Runtime/AvatarCreator/Scripts/WebRequests/AuthAPIRequests.cs +++ b/Runtime/AvatarCreator/Scripts/WebRequests/AuthAPIRequests.cs @@ -25,6 +25,7 @@ public class AuthAPIRequests private readonly string domain; private readonly IDictionary headers = CommonHeaders.GetHeadersWithAppId(); private readonly string rpmAuthBaseUrl; + private readonly string appName; private readonly WebRequestDispatcher webRequestDispatcher; @@ -33,16 +34,26 @@ public AuthAPIRequests(string domain) this.domain = domain; webRequestDispatcher = new WebRequestDispatcher(); - rpmAuthBaseUrl = string.Format(Env.RPM_SUBDOMAIN_BASE_URL, domain); + rpmAuthBaseUrl = Env.RPM_API_V1_BASE_URL; + appName = CoreSettingsHandler.CoreSettings.Subdomain; } public async Task LoginAsAnonymous(CancellationToken cancellationToken = default) { - var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}/users", HttpMethod.POST, headers, ctx:cancellationToken); + var payload = JsonConvert.SerializeObject(new { + data = new { + appName = appName, + requestToken = true + } + }); + + var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}users", HttpMethod.POST, headers, payload, ctx:cancellationToken); response.ThrowIfError(); - var data = AuthDataConverter.ParseResponse(response.Text); - return JsonConvert.DeserializeObject(data!.ToString()); + var data = AuthDataConverter.ParseDataResponse(response.Text); + var createdUser = JsonConvert.DeserializeObject(data!.ToString()); + + return new UserSession(createdUser); } public async Task SendCodeToEmail(string email, string userId = "",CancellationToken cancellationToken = default) @@ -50,7 +61,6 @@ public async Task SendCodeToEmail(string email, string userId = "",CancellationT var data = new Dictionary { { AuthConstants.EMAIL, email }, - { AuthConstants.AUTH_TYPE, AuthConstants.AUTH_TYPE_CODE } }; if (!string.IsNullOrEmpty(userId)) @@ -60,7 +70,7 @@ public async Task SendCodeToEmail(string email, string userId = "",CancellationT var payload = AuthDataConverter.CreatePayload(data); - var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}/auth/start", HttpMethod.POST, headers, payload, ctx:cancellationToken); + var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}auth/request-login-code", HttpMethod.POST, headers, payload, ctx:cancellationToken); response.ThrowIfError(); } @@ -68,7 +78,8 @@ public async Task LoginWithCode(string code, string userIdToMerge = { var body = new Dictionary { - { AuthConstants.AUTH_TYPE_CODE, code } + { AuthConstants.CODE, code }, + { AuthConstants.APP_NAME, appName } }; if (userIdToMerge != null) { @@ -76,7 +87,7 @@ public async Task LoginWithCode(string code, string userIdToMerge = } var payload = AuthDataConverter.CreatePayload(body); - var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}/auth/login", HttpMethod.POST, headers, payload, ctx:cancellationToken); + var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}auth/login", HttpMethod.POST, headers, payload, ctx:cancellationToken); response.ThrowIfError(); var data = AuthDataConverter.ParseResponse(response.Text); @@ -88,12 +99,11 @@ public async Task Signup(string email, string userId, CancellationToken cancella var data = new Dictionary { { AuthConstants.EMAIL, email }, - { AuthConstants.AUTH_TYPE, AuthConstants.AUTH_TYPE_PASSWORD }, { AuthConstants.USER_ID, userId } }; var payload = AuthDataConverter.CreatePayload(data); - var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}/auth/start", HttpMethod.POST, headers, payload, ctx:cancellationToken); + var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}auth/signup/passwordless", HttpMethod.POST, headers, payload, ctx:cancellationToken); response.ThrowIfError(); } @@ -114,18 +124,16 @@ public async Task GetRefreshToken(string token, string ref private async Task RefreshRequest(string token, string refreshToken, CancellationToken cancellationToken) { - var url = $"{rpmAuthBaseUrl}/auth/refresh"; - var payload = AuthDataConverter.CreatePayload(new Dictionary { { AuthConstants.TOKEN, token }, { AuthConstants.REFRESH_TOKEN, refreshToken } }); - var response = await webRequestDispatcher.SendRequest(url, HttpMethod.POST, headers, payload, ctx:cancellationToken); + var response = await webRequestDispatcher.SendRequest($"{rpmAuthBaseUrl}auth/refresh", HttpMethod.POST, headers, payload, ctx:cancellationToken); response.ThrowIfError(); - return AuthDataConverter.ParseResponse(response.Text); + return AuthDataConverter.ParseDataResponse(response.Text); } } } diff --git a/Runtime/AvatarCreator/Scripts/WebRequests/AvatarAPIRequests.cs b/Runtime/AvatarCreator/Scripts/WebRequests/AvatarAPIRequests.cs index caded4e4..96cade94 100644 --- a/Runtime/AvatarCreator/Scripts/WebRequests/AvatarAPIRequests.cs +++ b/Runtime/AvatarCreator/Scripts/WebRequests/AvatarAPIRequests.cs @@ -81,7 +81,7 @@ public async Task CreateFromTemplateAvatar(string templateId, { BODY_TYPE, CoreSettingsHandler.CoreSettings.BodyType.GetDescription() } }; - var payload = AuthDataConverter.CreatePayload(payloadData); + var payload = AuthDataConverter.CreateDataPayload(payloadData); var response = await authorizedRequest.SendRequest( new RequestData diff --git a/Samples~/AvatarCreatorSamples/AvatarCreatorWizard/Scripts/UI/SelectionScreens/AvatarCreatorSelection.cs b/Samples~/AvatarCreatorSamples/AvatarCreatorWizard/Scripts/UI/SelectionScreens/AvatarCreatorSelection.cs index d0aa0d3c..0452a565 100644 --- a/Samples~/AvatarCreatorSamples/AvatarCreatorWizard/Scripts/UI/SelectionScreens/AvatarCreatorSelection.cs +++ b/Samples~/AvatarCreatorSamples/AvatarCreatorWizard/Scripts/UI/SelectionScreens/AvatarCreatorSelection.cs @@ -43,6 +43,7 @@ public override void ActivateState() { saveButton.onClick.AddListener(OnSaveButton); signupElement.OnContinueWithoutSignup.AddListener(Save); + signupElement.OnSendEmail.AddListener(OnSendEmail); categoryUICreator.OnCategorySelected += OnCategorySelected; Setup(); } @@ -51,6 +52,7 @@ public override void DeactivateState() { saveButton.onClick.RemoveListener(OnSaveButton); signupElement.OnContinueWithoutSignup.RemoveListener(Save); + signupElement.OnSendEmail.RemoveListener(OnSendEmail); categoryUICreator.OnCategorySelected -= OnCategorySelected; Cleanup(); } From b00fc0f5f5eb98eda8816ab478b4b142027d55af Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 16 Sep 2024 16:36:55 +0300 Subject: [PATCH 02/14] chore: update version and changelog --- .github/latest.md | 4 +--- CHANGELOG.md | 4 ++++ .../AvatarCreator/Scripts/Data/CreatedUser.cs.meta | 11 +++++++++++ Runtime/Core/Scripts/Data/ApplicationData.cs | 2 +- package.json | 2 +- 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs.meta diff --git a/.github/latest.md b/.github/latest.md index 2a6a71bd..d94a6847 100644 --- a/.github/latest.md +++ b/.github/latest.md @@ -2,6 +2,4 @@ ## Changelog ## Updated -- Updated handling of response data to reduce garbage allocation [#314](https://github.com/readyplayerme/rpm-unity-sdk-core/pull/314) -## Fixed -- Preserve AssetId property in IAssetData [#313](https://github.com/readyplayerme/rpm-unity-sdk-core/pull/313) \ No newline at end of file +- auth-related requests now use auth-service endpoints [#317](https://github.com/readyplayerme/rpm-unity-sdk-core/pull/317) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6469ae37..42790e72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [7.2.0] - 2024.09.16 + +## Updated +- auth-related requests now use auth-service endpoints [#317](https://github.com/readyplayerme/rpm-unity-sdk-core/pull/317) ## [7.2.0] - 2024.09.06 diff --git a/Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs.meta b/Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs.meta new file mode 100644 index 00000000..d7ee0623 --- /dev/null +++ b/Runtime/AvatarCreator/Scripts/Data/CreatedUser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5e54d27ca4d403d41b845fe44a532989 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Core/Scripts/Data/ApplicationData.cs b/Runtime/Core/Scripts/Data/ApplicationData.cs index 6c7a9480..d5ce5094 100644 --- a/Runtime/Core/Scripts/Data/ApplicationData.cs +++ b/Runtime/Core/Scripts/Data/ApplicationData.cs @@ -6,7 +6,7 @@ namespace ReadyPlayerMe.Core { public static class ApplicationData { - public const string SDK_VERSION = "v7.2.0"; + public const string SDK_VERSION = "v7.3.0"; private const string TAG = "ApplicationData"; private const string DEFAULT_RENDER_PIPELINE = "Built-In Render Pipeline"; private static readonly AppData Data; diff --git a/package.json b/package.json index ba31710a..98d32fd9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.readyplayerme.core", - "version": "7.2.0", + "version": "7.3.0", "displayName": "Ready Player Me Core", "description": "This Module contains all the core functionality required for using Ready Player Me avatars in Unity, including features such as: \n - Module management and automatic package setup logic\n - Avatar loading from .glb files \n - Avatar creation \n - Avatar and 2D render requests \n - Optional Analytics\n - Custom editor windows\n - Sample scenes and assets", "unity": "2020.3", From 70f3e7a46ba24e4a20d35077a3c4cbd81ddc7257 Mon Sep 17 00:00:00 2001 From: "Sercan (Sarge) Altundas" Date: Wed, 18 Sep 2024 21:04:39 +0300 Subject: [PATCH 03/14] Avatar Destroy (#319) ## [TICKETID](https://ready-player-me.atlassian.net/browse/TICKETID) ## Description - Briefly describe what this change will do ## How to Test - Add steps to locally test these changes ## Checklist - [ ] Tests written or updated for the changes. - [ ] Documentation is updated. - [ ] Changelog is updated. --- Runtime/Core/Scripts/Data/AvatarData.cs | 35 ++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Runtime/Core/Scripts/Data/AvatarData.cs b/Runtime/Core/Scripts/Data/AvatarData.cs index 89bc28ae..ad371f9f 100644 --- a/Runtime/Core/Scripts/Data/AvatarData.cs +++ b/Runtime/Core/Scripts/Data/AvatarData.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using System; +using UnityEngine; namespace ReadyPlayerMe.Core { @@ -6,5 +7,37 @@ public class AvatarData : MonoBehaviour { public string AvatarId; public AvatarMetadata AvatarMetadata; + + private SkinnedMeshRenderer[] meshes; + + private void Awake() + { + meshes = GetComponentsInChildren(); + } + + private void OnDestroy() + { + foreach (var mesh in meshes) + { + var materials = mesh.sharedMaterials; + + foreach (var material in materials) + { + if(material == null) continue; + + foreach (var property in material.GetTexturePropertyNames()) + { + Texture texture = material.GetTexture(property); + + if(texture == null) continue; + + Destroy(texture); + } + Destroy(material); + } + + Destroy(mesh.sharedMesh); + } + } } } From bbdbc66cad8236b3e9ec1acd52e7a5c8e8b0fcf9 Mon Sep 17 00:00:00 2001 From: Harrison Date: Wed, 18 Sep 2024 21:07:27 +0300 Subject: [PATCH 04/14] chore: small cleanup --- Runtime/Core/Scripts/Data/AvatarData.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Runtime/Core/Scripts/Data/AvatarData.cs b/Runtime/Core/Scripts/Data/AvatarData.cs index ad371f9f..09a7cfe4 100644 --- a/Runtime/Core/Scripts/Data/AvatarData.cs +++ b/Runtime/Core/Scripts/Data/AvatarData.cs @@ -1,5 +1,4 @@ -using System; -using UnityEngine; +using UnityEngine; namespace ReadyPlayerMe.Core { @@ -23,19 +22,19 @@ private void OnDestroy() foreach (var material in materials) { - if(material == null) continue; - + if (material == null) continue; + foreach (var property in material.GetTexturePropertyNames()) { Texture texture = material.GetTexture(property); - - if(texture == null) continue; - - Destroy(texture); + + if (texture == null) continue; + + Destroy(texture); } Destroy(material); } - + Destroy(mesh.sharedMesh); } } From 9dbf55bc6aa4e8083a5d57f77795f9d96b30d895 Mon Sep 17 00:00:00 2001 From: Harrison Date: Wed, 18 Sep 2024 21:44:56 +0300 Subject: [PATCH 05/14] chore: moved cleanup to separate monobehavior --- Runtime/Core/Scripts/Data/AvatarData.cs | 32 ------------ Runtime/Core/Scripts/Utils/DestroyMesh.cs | 52 +++++++++++++++++++ .../Core/Scripts/Utils/DestroyMesh.cs.meta | 11 ++++ 3 files changed, 63 insertions(+), 32 deletions(-) create mode 100644 Runtime/Core/Scripts/Utils/DestroyMesh.cs create mode 100644 Runtime/Core/Scripts/Utils/DestroyMesh.cs.meta diff --git a/Runtime/Core/Scripts/Data/AvatarData.cs b/Runtime/Core/Scripts/Data/AvatarData.cs index 09a7cfe4..89bc28ae 100644 --- a/Runtime/Core/Scripts/Data/AvatarData.cs +++ b/Runtime/Core/Scripts/Data/AvatarData.cs @@ -6,37 +6,5 @@ public class AvatarData : MonoBehaviour { public string AvatarId; public AvatarMetadata AvatarMetadata; - - private SkinnedMeshRenderer[] meshes; - - private void Awake() - { - meshes = GetComponentsInChildren(); - } - - private void OnDestroy() - { - foreach (var mesh in meshes) - { - var materials = mesh.sharedMaterials; - - foreach (var material in materials) - { - if (material == null) continue; - - foreach (var property in material.GetTexturePropertyNames()) - { - Texture texture = material.GetTexture(property); - - if (texture == null) continue; - - Destroy(texture); - } - Destroy(material); - } - - Destroy(mesh.sharedMesh); - } - } } } diff --git a/Runtime/Core/Scripts/Utils/DestroyMesh.cs b/Runtime/Core/Scripts/Utils/DestroyMesh.cs new file mode 100644 index 00000000..49592550 --- /dev/null +++ b/Runtime/Core/Scripts/Utils/DestroyMesh.cs @@ -0,0 +1,52 @@ +using UnityEngine; + +namespace ReadyPlayerMe +{ + /// + /// This class is responsible for destroying all SkinnedMeshRenderer components and their associated resources (meshes, materials, and textures) + /// when the GameObject is destroyed to prevent memory leaks. + /// + public class DestroyMesh : MonoBehaviour + { + private SkinnedMeshRenderer[] meshes; + + /// + /// Called when the script instance is being loaded. + /// Initializes the meshes array by finding all SkinnedMeshRenderer components in the child objects of the current GameObject. + /// + private void Awake() + { + meshes = GetComponentsInChildren(); + } + + /// + /// Called when the GameObject is destroyed. + /// Destroys all associated SkinnedMeshRenderer meshes, materials, and textures to ensure proper memory management. + /// + private void OnDestroy() + { + foreach (var mesh in meshes) + { + var materials = mesh.sharedMaterials; + + foreach (var material in materials) + { + if (material == null) continue; + + foreach (var property in material.GetTexturePropertyNames()) + { + var texture = material.GetTexture(property); + + if (texture == null) continue; + + Destroy(texture); + } + + Destroy(material); + } + + Destroy(mesh.sharedMesh); + } + } + } +} diff --git a/Runtime/Core/Scripts/Utils/DestroyMesh.cs.meta b/Runtime/Core/Scripts/Utils/DestroyMesh.cs.meta new file mode 100644 index 00000000..1227f59e --- /dev/null +++ b/Runtime/Core/Scripts/Utils/DestroyMesh.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d21b91e22ee6f548b51e598aacec332 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From a9c487c107ce2560b72aef80b466102db5952d0f Mon Sep 17 00:00:00 2001 From: Harrison Date: Wed, 18 Sep 2024 21:53:43 +0300 Subject: [PATCH 06/14] chore: update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42790e72..bdfb3e6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,14 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [7.2.0] - 2024.09.16 +## [7.2.0] - 2024.09.19 ## Updated - auth-related requests now use auth-service endpoints [#317](https://github.com/readyplayerme/rpm-unity-sdk-core/pull/317) +## Added +- DestroyMesh class can be used to destroy manually destroy mesh, materials and textures to prevent memory leaks + ## [7.2.0] - 2024.09.06 ## Updated From 8082b930ff6f61a261231d2d99f1650817a6fac2 Mon Sep 17 00:00:00 2001 From: Harrison Date: Thu, 26 Sep 2024 11:47:55 +0300 Subject: [PATCH 07/14] feat: update shaders --- .../glTFastShaderVariants.shadervariants | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Runtime/Core/Shaders/glTFastShaderVariants.shadervariants b/Runtime/Core/Shaders/glTFastShaderVariants.shadervariants index b1eb71c6..de0855cf 100644 --- a/Runtime/Core/Shaders/glTFastShaderVariants.shadervariants +++ b/Runtime/Core/Shaders/glTFastShaderVariants.shadervariants @@ -13,9 +13,15 @@ ShaderVariantCollection: variants: - keywords: DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _ALPHATEST_ON + passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _EMISSION _METALLICGLOSSMAP + passType: 4 - keywords: DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _EMISSION _METALLICGLOSSMAP _NORMALMAP passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH _ALPHATEST_ON + passType: 4 - keywords: DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _METALLICGLOSSMAP _NORMALMAP passType: 4 - keywords: DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _NORMALMAP @@ -25,12 +31,33 @@ ShaderVariantCollection: - keywords: DIRECTIONAL LIGHTPROBE_SH _ALPHABLEND_ON _EMISSION _METALLICGLOSSMAP _NORMALMAP passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH _EMISSION _METALLICGLOSSMAP + passType: 4 - keywords: DIRECTIONAL LIGHTPROBE_SH _ALPHABLEND_ON _METALLICGLOSSMAP _NORMALMAP passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _METALLICGLOSSMAP _NORMALMAP + _OCCLUSION + passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH _METALLICGLOSSMAP _NORMALMAP + passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH _METALLICGLOSSMAP _NORMALMAP _OCCLUSION + passType: 4 + - keywords: DIRECTIONAL LIGHTPROBE_SH _ALPHATEST_ON + passType: 4 + - keywords: DIRECTIONAL _ALPHATEST_ON + passType: 5 + - keywords: DIRECTIONAL _METALLICGLOSSMAP + passType: 5 + - keywords: DIRECTIONAL _METALLICGLOSSMAP _NORMALMAP + passType: 5 + - keywords: DIRECTIONAL _METALLICGLOSSMAP _NORMALMAP _OCCLUSION + passType: 5 - keywords: passType: 8 - keywords: SHADOWS_DEPTH passType: 8 + - keywords: SHADOWS_DEPTH _ALPHATEST_ON + passType: 8 - keywords: SHADOWS_DEPTH _ALPHABLEND_ON passType: 8 - keywords: SHADOWS_DEPTH _ALPHABLEND_ON _METALLICGLOSSMAP @@ -41,3 +68,5 @@ ShaderVariantCollection: passType: 8 - keywords: _METALLICGLOSSMAP passType: 8 + - keywords: _METALLICGLOSSMAP _OCCLUSION + passType: 8 From db63e28adb4fe7e46a64c2e8e44cdb94a9f36370 Mon Sep 17 00:00:00 2001 From: Harrison Hough Date: Thu, 26 Sep 2024 19:38:59 +0300 Subject: [PATCH 08/14] feat: added shader variant tool --- .../Utilities/ShaderVariantConstants.cs | 25 ++++ .../Utilities/ShaderVariantConstants.cs.meta | 11 ++ .../Scripts/Utilities/ShaderVariantTool.cs | 140 ++++++++++++++++++ .../Utilities/ShaderVariantTool.cs.meta | 11 ++ 4 files changed, 187 insertions(+) create mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs create mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta create mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantTool.cs create mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs b/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs new file mode 100644 index 00000000..5c14ea79 --- /dev/null +++ b/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs @@ -0,0 +1,25 @@ +using UnityEngine.Rendering; + +namespace ReadyPlayerMe.Core.Editor +{ + public static class ShaderVariantConstants + { + public static ShaderVariantData[] Variants = new [] + { + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _ALPHATEST_ON" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _EMISSION _METALLICGLOSSMAP" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _EMISSION _METALLICGLOSSMAP _NORMALMAP" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _METALLICGLOSSMAP _NORMALMAP" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _METALLICGLOSSMAP _NORMALMAP _OCCLUSION" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _NORMALMAP" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH _ALPHABLEND_ON" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _ALPHABLEND_ON" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _ALPHATEST_ON" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _METALLICGLOSSMAP" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _METALLICGLOSSMAP _OCCLUSION" ), + new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "_METALLICGLOSSMAP _OCCLUSION" ), + }; + } +} diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta b/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta new file mode 100644 index 00000000..44759b75 --- /dev/null +++ b/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3618da9f59bf4a34db4895ae8524b8e1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs b/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs new file mode 100644 index 00000000..f1d82a16 --- /dev/null +++ b/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs @@ -0,0 +1,140 @@ +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; + +namespace ReadyPlayerMe.Core.Editor +{ + [System.Serializable] + public struct ShaderVariantData + { + public string ShaderName; + public PassType PassType; + public string Keywords; + + public ShaderVariantData(string shaderName, PassType passType, string keywords) + { + ShaderName = shaderName; + PassType = passType; + Keywords = keywords; + } + } + + public class ShaderVariantTool + { + public List ShaderVariants { get; private set; } = new List(); + + /// + /// Reads the shader variants from a ShaderVariantCollection asset. + /// + /// The ShaderVariantCollection asset to load from. + public void ReadShaderVariantsFromCollection(ShaderVariantCollection variantCollection) + { + ShaderVariants.Clear(); // Clear any existing data + try + { + var serializedObject = new SerializedObject(variantCollection); + var shaderArrayProperty = serializedObject.FindProperty("m_Shaders"); + + if (shaderArrayProperty == null) + { + Debug.Log("Error: Unable to find Shaders in the ShaderVariantCollection."); + return; + } + + for (int i = 0; i < shaderArrayProperty.arraySize; i++) + { + var shaderProperty = shaderArrayProperty.GetArrayElementAtIndex(i); + var shaderReferenceProp = shaderProperty.FindPropertyRelative("first"); + var shader = shaderReferenceProp.objectReferenceValue as Shader; + + if (shader == null) + { + Debug.LogError("Shader not found."); + continue; + } + + var variantsProperty = shaderProperty.FindPropertyRelative("second.variants"); + for (int j = 0; j < variantsProperty.arraySize; j++) + { + var variantProperty = variantsProperty.GetArrayElementAtIndex(j); + var passTypeProperty = variantProperty.FindPropertyRelative("passType"); + var keywordsProperty = variantProperty.FindPropertyRelative("keywords"); + + var passType = (PassType)passTypeProperty.intValue; + + ShaderVariants.Add(new ShaderVariantData + { + ShaderName = shader.name, + PassType = passType, + Keywords = keywordsProperty.stringValue + }); + } + } + + Debug.Log($"Successfully loaded {ShaderVariants.Count} shader variants."); + } + catch + { + Debug.LogError("An error occurred while reading the ShaderVariantCollection."); + } + } + + /// + /// Exports the shader variants to a script for hard-coding. + /// + public void ExportShaderVariantsToFile(string outputPath) + { + List lines = new List(); + lines.Add("using UnityEngine.Rendering;\n"); + lines.Add("namespace ReadyPlayerMe.Core.Editor\n{"); + lines.Add(" public static class ShaderVariantConstants\n {"); + lines.Add(" public static ShaderVariantData[] Variants = new [] \n {"); + + foreach (ShaderVariantData variant in ShaderVariants) + { + var keywordsString = variant.Keywords.Length > 0 ? $"\"{string.Join("\", \"", variant.Keywords)}\"" : "\"\""; + lines.Add($" new ShaderVariantData(\"{variant.ShaderName}\", PassType.{variant.PassType}, {keywordsString} ),"); + } + + lines.Add(" };"); + lines.Add(" }"); + lines.Add("}"); + + File.WriteAllLines(outputPath, lines.ToArray()); + AssetDatabase.Refresh(); + Debug.Log($"Shader variants exported to {outputPath}"); + } + + /// + /// Creates a new .shadervariants file based on the shader variants list. + /// + public void CreateNewShaderVariantsFile(string outputPath) + { + ShaderVariantCollection newCollection = new ShaderVariantCollection(); + + foreach (ShaderVariantData variantData in ShaderVariantConstants.Variants) + { + Shader shader = Shader.Find(variantData.ShaderName); + if (shader == null) + { + Debug.LogError($"Shader not found: {variantData.ShaderName}"); + continue; + } + + var keywordsArray = variantData.Keywords.Split(' '); + ShaderVariantCollection.ShaderVariant newVariant = new ShaderVariantCollection.ShaderVariant( + shader, + variantData.PassType, + keywordsArray); + newCollection.Add(newVariant); + } + + AssetDatabase.CreateAsset(newCollection, outputPath); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + Debug.Log($"New .shadervariants file created at {outputPath}"); + } + } +} \ No newline at end of file diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta b/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta new file mode 100644 index 00000000..ec210f6d --- /dev/null +++ b/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f9e050aace6e214db052d4bfef9a104 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 43c58cb62698ad5e99dd19496dea66f1686283eb Mon Sep 17 00:00:00 2001 From: Harrison Hough Date: Thu, 26 Sep 2024 20:11:40 +0300 Subject: [PATCH 09/14] feat: update URP shader variants --- .../glTFastShaderVariantsURP.shadervariants | 146 ++++++++++++++++-- ...TFastShaderVariantsURP.shadervariants.meta | 2 +- 2 files changed, 133 insertions(+), 15 deletions(-) diff --git a/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants b/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants index 28f42f55..0b5e29e5 100644 --- a/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants +++ b/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants @@ -8,23 +8,141 @@ ShaderVariantCollection: m_PrefabAsset: {fileID: 0} m_Name: glTFastShaderVariantsURP m_Shaders: - - first: {fileID: -6465566751694194690, guid: b9d29dfa1474148e792ac720cbd45122, - type: 3} + - first: {fileID: 4800000, guid: 99fa998bbbed3408aafa652b466d261d, type: 3} second: - variants: [] - - first: {fileID: -6465566751694194690, guid: 90c26dfde11bf4ff69ef936c6e6b1ed1, - type: 3} + variants: + - keywords: DIRECTIONAL + passType: 4 + - keywords: POINT + passType: 5 + - keywords: SHADOWS_DEPTH + passType: 8 + - keywords: + passType: 10 + - keywords: + passType: 11 + - first: {fileID: 4800000, guid: 4eb7e251dc88045e9b33e3f643084108, type: 3} second: - variants: [] - - first: {fileID: -6465566751694194690, guid: c9ba521fe23b44d6db1017a2d9d47a17, - type: 3} + variants: + - keywords: + passType: 0 + - first: {fileID: 4800000, guid: 223792947f6cb461c93ef4d8df7b859c, type: 3} second: - variants: [] - - first: {fileID: -6465566751694194690, guid: ba6d401c74b2c4f96af7edf0fe32241e, - type: 3} + variants: + - keywords: + passType: 0 + - first: {fileID: 4800000, guid: b325a765e406c458f88111b5ba9b2ce1, type: 3} + second: + variants: + - keywords: + passType: 0 + - first: {fileID: 4800000, guid: b2339366be04e4cf197c6cf4bd5a84dc, type: 3} second: - variants: [] - - first: {fileID: -6465566751694194690, guid: f06cd296b834444abb6dbc0acccf9414, + variants: + - keywords: + passType: 0 + - first: {fileID: 4800000, guid: 5415cfa8493204ba5ae288a245ca7616, type: 3} + second: + variants: + - keywords: + passType: 0 + - first: {fileID: 4800000, guid: 8b605e834d6d2408a9e781775006555e, type: 3} + second: + variants: + - keywords: + passType: 0 + - first: {fileID: 4800000, guid: 4340a3cf1cde6416d957808a6ac79eed, type: 3} + second: + variants: + - keywords: + passType: 0 + - first: {fileID: -6465566751694194690, guid: b9d29dfa1474148e792ac720cbd45122, type: 3} second: - variants: [] + variants: + - keywords: + passType: 8 + - keywords: _ALPHATEST_ON + passType: 8 + - keywords: _EMISSIVE + passType: 8 + - keywords: _OCCLUSION + passType: 8 + - keywords: + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _ALPHATEST_ON _MAIN_LIGHT_SHADOWS + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _ALPHATEST_ON _MAIN_LIGHT_SHADOWS_CASCADE + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + _SHADOWS_SOFT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _EMISSIVE _MAIN_LIGHT_SHADOWS + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _EMISSIVE _MAIN_LIGHT_SHADOWS + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + _SURFACE_TYPE_TRANSPARENT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _EMISSIVE _MAIN_LIGHT_SHADOWS_CASCADE + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + _SHADOWS_SOFT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _EMISSIVE _MAIN_LIGHT_SHADOWS_CASCADE + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + _SHADOWS_SOFT _SURFACE_TYPE_TRANSPARENT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS + _OCCLUSION _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION + _SCREEN_SPACE_OCCLUSION + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + _SURFACE_TYPE_TRANSPARENT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + _OCCLUSION _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION + _SCREEN_SPACE_OCCLUSION _SHADOWS_SOFT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + _SHADOWS_SOFT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _ADDITIONAL_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + _REFLECTION_PROBE_BLENDING _REFLECTION_PROBE_BOX_PROJECTION _SCREEN_SPACE_OCCLUSION + _SHADOWS_SOFT _SURFACE_TYPE_TRANSPARENT + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _EMISSIVE _MAIN_LIGHT_SHADOWS + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _EMISSIVE _MAIN_LIGHT_SHADOWS_CASCADE + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _MAIN_LIGHT_SHADOWS + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _MAIN_LIGHT_SHADOWS _OCCLUSION + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _MAIN_LIGHT_SHADOWS_CASCADE + passType: 13 + - keywords: _ADDITIONAL_LIGHTS _MAIN_LIGHT_SHADOWS_CASCADE _OCCLUSION + passType: 13 + - keywords: _ALPHATEST_ON + passType: 13 + - keywords: _EMISSIVE + passType: 13 + - keywords: _OCCLUSION + passType: 13 + - first: {fileID: 4800000, guid: f853aafa0bc764a138f572608a37a73c, type: 3} + second: + variants: + - keywords: DIRECTIONAL + passType: 4 + - keywords: POINT + passType: 5 + - keywords: SHADOWS_DEPTH + passType: 8 + - keywords: + passType: 10 + - keywords: + passType: 11 diff --git a/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants.meta b/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants.meta index 1be2f866..387403e1 100644 --- a/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants.meta +++ b/Runtime/Core/Shaders/glTFastShaderVariantsURP.shadervariants.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7e5de14f5e1aa714c9dc61ebdecba7dc +guid: 9446dd36f6079114e89e9f98aed2fc3c NativeFormatImporter: externalObjects: {} mainObjectFileID: 20000000 From b0c4a998464652a873e9630ce8e018c79481ce16 Mon Sep 17 00:00:00 2001 From: Harrison Hough Date: Thu, 26 Sep 2024 20:13:06 +0300 Subject: [PATCH 10/14] chore: remove shader variant class --- .../Utilities/ShaderVariantConstants.cs | 25 ---- .../Utilities/ShaderVariantConstants.cs.meta | 11 -- .../Scripts/Utilities/ShaderVariantTool.cs | 140 ------------------ .../Utilities/ShaderVariantTool.cs.meta | 11 -- 4 files changed, 187 deletions(-) delete mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs delete mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta delete mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantTool.cs delete mode 100644 Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs b/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs deleted file mode 100644 index 5c14ea79..00000000 --- a/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs +++ /dev/null @@ -1,25 +0,0 @@ -using UnityEngine.Rendering; - -namespace ReadyPlayerMe.Core.Editor -{ - public static class ShaderVariantConstants - { - public static ShaderVariantData[] Variants = new [] - { - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _ALPHATEST_ON" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _EMISSION _METALLICGLOSSMAP" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _EMISSION _METALLICGLOSSMAP _NORMALMAP" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _METALLICGLOSSMAP _NORMALMAP" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _METALLICGLOSSMAP _NORMALMAP _OCCLUSION" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN _NORMALMAP" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ForwardBase, "DIRECTIONAL LIGHTPROBE_SH _ALPHABLEND_ON" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _ALPHABLEND_ON" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _ALPHATEST_ON" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _METALLICGLOSSMAP" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "SHADOWS_DEPTH _METALLICGLOSSMAP _OCCLUSION" ), - new ShaderVariantData("glTF/PbrMetallicRoughness", PassType.ShadowCaster, "_METALLICGLOSSMAP _OCCLUSION" ), - }; - } -} diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta b/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta deleted file mode 100644 index 44759b75..00000000 --- a/Editor/Core/Scripts/Utilities/ShaderVariantConstants.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3618da9f59bf4a34db4895ae8524b8e1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs b/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs deleted file mode 100644 index f1d82a16..00000000 --- a/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using UnityEditor; -using UnityEngine; -using UnityEngine.Rendering; - -namespace ReadyPlayerMe.Core.Editor -{ - [System.Serializable] - public struct ShaderVariantData - { - public string ShaderName; - public PassType PassType; - public string Keywords; - - public ShaderVariantData(string shaderName, PassType passType, string keywords) - { - ShaderName = shaderName; - PassType = passType; - Keywords = keywords; - } - } - - public class ShaderVariantTool - { - public List ShaderVariants { get; private set; } = new List(); - - /// - /// Reads the shader variants from a ShaderVariantCollection asset. - /// - /// The ShaderVariantCollection asset to load from. - public void ReadShaderVariantsFromCollection(ShaderVariantCollection variantCollection) - { - ShaderVariants.Clear(); // Clear any existing data - try - { - var serializedObject = new SerializedObject(variantCollection); - var shaderArrayProperty = serializedObject.FindProperty("m_Shaders"); - - if (shaderArrayProperty == null) - { - Debug.Log("Error: Unable to find Shaders in the ShaderVariantCollection."); - return; - } - - for (int i = 0; i < shaderArrayProperty.arraySize; i++) - { - var shaderProperty = shaderArrayProperty.GetArrayElementAtIndex(i); - var shaderReferenceProp = shaderProperty.FindPropertyRelative("first"); - var shader = shaderReferenceProp.objectReferenceValue as Shader; - - if (shader == null) - { - Debug.LogError("Shader not found."); - continue; - } - - var variantsProperty = shaderProperty.FindPropertyRelative("second.variants"); - for (int j = 0; j < variantsProperty.arraySize; j++) - { - var variantProperty = variantsProperty.GetArrayElementAtIndex(j); - var passTypeProperty = variantProperty.FindPropertyRelative("passType"); - var keywordsProperty = variantProperty.FindPropertyRelative("keywords"); - - var passType = (PassType)passTypeProperty.intValue; - - ShaderVariants.Add(new ShaderVariantData - { - ShaderName = shader.name, - PassType = passType, - Keywords = keywordsProperty.stringValue - }); - } - } - - Debug.Log($"Successfully loaded {ShaderVariants.Count} shader variants."); - } - catch - { - Debug.LogError("An error occurred while reading the ShaderVariantCollection."); - } - } - - /// - /// Exports the shader variants to a script for hard-coding. - /// - public void ExportShaderVariantsToFile(string outputPath) - { - List lines = new List(); - lines.Add("using UnityEngine.Rendering;\n"); - lines.Add("namespace ReadyPlayerMe.Core.Editor\n{"); - lines.Add(" public static class ShaderVariantConstants\n {"); - lines.Add(" public static ShaderVariantData[] Variants = new [] \n {"); - - foreach (ShaderVariantData variant in ShaderVariants) - { - var keywordsString = variant.Keywords.Length > 0 ? $"\"{string.Join("\", \"", variant.Keywords)}\"" : "\"\""; - lines.Add($" new ShaderVariantData(\"{variant.ShaderName}\", PassType.{variant.PassType}, {keywordsString} ),"); - } - - lines.Add(" };"); - lines.Add(" }"); - lines.Add("}"); - - File.WriteAllLines(outputPath, lines.ToArray()); - AssetDatabase.Refresh(); - Debug.Log($"Shader variants exported to {outputPath}"); - } - - /// - /// Creates a new .shadervariants file based on the shader variants list. - /// - public void CreateNewShaderVariantsFile(string outputPath) - { - ShaderVariantCollection newCollection = new ShaderVariantCollection(); - - foreach (ShaderVariantData variantData in ShaderVariantConstants.Variants) - { - Shader shader = Shader.Find(variantData.ShaderName); - if (shader == null) - { - Debug.LogError($"Shader not found: {variantData.ShaderName}"); - continue; - } - - var keywordsArray = variantData.Keywords.Split(' '); - ShaderVariantCollection.ShaderVariant newVariant = new ShaderVariantCollection.ShaderVariant( - shader, - variantData.PassType, - keywordsArray); - newCollection.Add(newVariant); - } - - AssetDatabase.CreateAsset(newCollection, outputPath); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - Debug.Log($"New .shadervariants file created at {outputPath}"); - } - } -} \ No newline at end of file diff --git a/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta b/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta deleted file mode 100644 index ec210f6d..00000000 --- a/Editor/Core/Scripts/Utilities/ShaderVariantTool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6f9e050aace6e214db052d4bfef9a104 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From ca03470ce4c25c6b17b6d5235477aaadaa69e249 Mon Sep 17 00:00:00 2001 From: arturtreiberg Date: Mon, 7 Oct 2024 10:20:32 +0300 Subject: [PATCH 11/14] make voice handler more durable for webgl --- Runtime/Core/Scripts/Animation/VoiceHandler.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Runtime/Core/Scripts/Animation/VoiceHandler.cs b/Runtime/Core/Scripts/Animation/VoiceHandler.cs index ba1e59cf..1233b749 100644 --- a/Runtime/Core/Scripts/Animation/VoiceHandler.cs +++ b/Runtime/Core/Scripts/Animation/VoiceHandler.cs @@ -46,7 +46,7 @@ public class VoiceHandler : MonoBehaviour private bool CanGetAmplitude => AudioSource != null && AudioSource.clip != null && AudioSource.isPlaying; private CancellationTokenSource ctxSource; - + private void Start() { CreateBlendshapeMeshMap(); @@ -165,10 +165,17 @@ public void PlayAudioClip(AudioClip audioClip) private float GetAmplitude() { - if (CanGetAmplitude) + if (CanGetAmplitude && AudioSource.clip.loadState == AudioDataLoadState.Loaded) { - var amplitude = 0f; + int currentPosition = AudioSource.timeSamples; + int remaining = AudioSource.clip.samples - currentPosition; + if (remaining > 0 && remaining < AUDIO_SAMPLE_LENGTH) + { + return 0f; + } + AudioSource.clip.GetData(audioSample, AudioSource.timeSamples); + var amplitude = 0f; foreach (var sample in audioSample) { @@ -178,7 +185,7 @@ private float GetAmplitude() return Mathf.Clamp01(amplitude / audioSample.Length * AMPLITUDE_MULTIPLIER); } - return 0; + return 0f; } #region Blend Shape Movement From 9e1b7239a4419d2ba32c1e07b4763505acb8d7ee Mon Sep 17 00:00:00 2001 From: Artur Treiberg <26140626+arturtreiberg@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:58:37 +0300 Subject: [PATCH 12/14] Update Runtime/Core/Scripts/Animation/VoiceHandler.cs Co-authored-by: Harrison Hough --- Runtime/Core/Scripts/Animation/VoiceHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Core/Scripts/Animation/VoiceHandler.cs b/Runtime/Core/Scripts/Animation/VoiceHandler.cs index 1233b749..4b19a8c3 100644 --- a/Runtime/Core/Scripts/Animation/VoiceHandler.cs +++ b/Runtime/Core/Scripts/Animation/VoiceHandler.cs @@ -167,7 +167,7 @@ private float GetAmplitude() { if (CanGetAmplitude && AudioSource.clip.loadState == AudioDataLoadState.Loaded) { - int currentPosition = AudioSource.timeSamples; + var currentPosition = AudioSource.timeSamples; int remaining = AudioSource.clip.samples - currentPosition; if (remaining > 0 && remaining < AUDIO_SAMPLE_LENGTH) { From 4f5a3a96377668d1ec69b1dcbd3f67a1c04b2473 Mon Sep 17 00:00:00 2001 From: arturtreiberg Date: Mon, 7 Oct 2024 11:59:36 +0300 Subject: [PATCH 13/14] int to var --- Runtime/Core/Scripts/Animation/VoiceHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Core/Scripts/Animation/VoiceHandler.cs b/Runtime/Core/Scripts/Animation/VoiceHandler.cs index 4b19a8c3..61e59a68 100644 --- a/Runtime/Core/Scripts/Animation/VoiceHandler.cs +++ b/Runtime/Core/Scripts/Animation/VoiceHandler.cs @@ -168,7 +168,7 @@ private float GetAmplitude() if (CanGetAmplitude && AudioSource.clip.loadState == AudioDataLoadState.Loaded) { var currentPosition = AudioSource.timeSamples; - int remaining = AudioSource.clip.samples - currentPosition; + var remaining = AudioSource.clip.samples - currentPosition; if (remaining > 0 && remaining < AUDIO_SAMPLE_LENGTH) { return 0f; From 03d2f312115678cfcf839bceb4d35f72cf80476a Mon Sep 17 00:00:00 2001 From: Harrison Hough Date: Tue, 22 Oct 2024 06:56:46 +0300 Subject: [PATCH 14/14] chore: update changelog date --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdfb3e6d..fadd87fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,14 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [7.2.0] - 2024.09.19 +## [7.3.0] - 2024.10.22 ## Updated - auth-related requests now use auth-service endpoints [#317](https://github.com/readyplayerme/rpm-unity-sdk-core/pull/317) +- updated shader variants to fix issues various material issues + +## Fixed +- Fixed an issue causing Out of Bounds exception in WebGL voice handler [#322](https://github.com/readyplayerme/rpm-unity-sdk-core/pull/322) ## Added - DestroyMesh class can be used to destroy manually destroy mesh, materials and textures to prevent memory leaks