From eb7bf3a8b3411a2c0e0f1c392a5f00551d85ab33 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Tue, 27 Sep 2022 20:38:33 +0200 Subject: [PATCH 1/5] [unity] Fixed excessive UnloadingUnusedAssetsImmediate during build. Initially created to avoid out of memory exceptions, can now be disabled via preferences. Closes #2160. --- .../Editor/spine-unity/Editor/Utility/SpineBuildProcessor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineBuildProcessor.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineBuildProcessor.cs index 0cb095fae..43d9cc507 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineBuildProcessor.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SpineBuildProcessor.cs @@ -98,8 +98,8 @@ namespace Spine.Unity.Editor { #endif prefabsToRestore.Add(assetPath); } - EditorUtility.UnloadUnusedAssetsImmediate(); } + EditorUtility.UnloadUnusedAssetsImmediate(); AssetDatabase.StopAssetEditing(); #if !HAS_SAVE_ASSET_IF_DIRTY if (prefabAssets.Length > 0) @@ -147,8 +147,8 @@ namespace Spine.Unity.Editor { #if HAS_SAVE_ASSET_IF_DIRTY AssetDatabase.SaveAssetIfDirty(atlasAsset); #endif - EditorUtility.UnloadUnusedAssetsImmediate(); } + EditorUtility.UnloadUnusedAssetsImmediate(); AssetDatabase.StopAssetEditing(); #if !HAS_SAVE_ASSET_IF_DIRTY if (spriteAtlasAssets.Length > 0) From 2b85114d5455593b1f4e582ade3ae01733666617 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 28 Sep 2022 18:46:31 +0200 Subject: [PATCH 2/5] [unity] Added Preferences parameter to disable console error when SkeletonDataAsset skeleton data file is none. Finishes code changes to allow copy protection systems. Closes #1794. --- .../Editor/spine-unity/Editor/Utility/Preferences.cs | 8 ++++++++ .../Editor/spine-unity/Editor/Windows/SpinePreferences.cs | 6 ++++++ .../Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/Preferences.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/Preferences.cs index d4d7c86ca..bff329ea8 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/Preferences.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/Preferences.cs @@ -162,6 +162,9 @@ namespace Spine.Unity.Editor { const string COMPONENTMATERIAL_WARNING_KEY = "SPINE_COMPONENTMATERIAL_WARNING"; public static bool componentMaterialWarning = SpinePreferences.DEFAULT_COMPONENTMATERIAL_WARNING; + const string SKELETONDATA_ASSET_NO_FILE_ERROR_KEY = "SPINE_SKELETONDATA_ASSET_NO_FILE_ERROR"; + public static bool skeletonDataAssetNoFileError = SpinePreferences.DEFAULT_SKELETONDATA_ASSET_NO_FILE_ERROR; + public const float DEFAULT_MIPMAPBIAS = SpinePreferences.DEFAULT_MIPMAPBIAS; public const string SCENE_ICONS_SCALE_KEY = "SPINE_SCENE_ICONS_SCALE"; @@ -199,6 +202,7 @@ namespace Spine.Unity.Editor { atlasTxtImportWarning = EditorPrefs.GetBool(ATLASTXT_WARNING_KEY, SpinePreferences.DEFAULT_ATLASTXT_WARNING); textureImporterWarning = EditorPrefs.GetBool(TEXTUREIMPORTER_WARNING_KEY, SpinePreferences.DEFAULT_TEXTUREIMPORTER_WARNING); componentMaterialWarning = EditorPrefs.GetBool(COMPONENTMATERIAL_WARNING_KEY, SpinePreferences.DEFAULT_COMPONENTMATERIAL_WARNING); + skeletonDataAssetNoFileError = EditorPrefs.GetBool(SKELETONDATA_ASSET_NO_FILE_ERROR_KEY, SpinePreferences.DEFAULT_SKELETONDATA_ASSET_NO_FILE_ERROR); timelineUseBlendDuration = EditorPrefs.GetBool(TIMELINE_USE_BLEND_DURATION_KEY, SpinePreferences.DEFAULT_TIMELINE_USE_BLEND_DURATION); handleScale = EditorPrefs.GetFloat(SCENE_ICONS_SCALE_KEY, SpinePreferences.DEFAULT_SCENE_ICONS_SCALE); preferencesLoaded = true; @@ -219,6 +223,7 @@ namespace Spine.Unity.Editor { newPreferences.atlasTxtImportWarning = EditorPrefs.GetBool(ATLASTXT_WARNING_KEY, SpinePreferences.DEFAULT_ATLASTXT_WARNING); newPreferences.textureImporterWarning = EditorPrefs.GetBool(TEXTUREIMPORTER_WARNING_KEY, SpinePreferences.DEFAULT_TEXTUREIMPORTER_WARNING); newPreferences.componentMaterialWarning = EditorPrefs.GetBool(COMPONENTMATERIAL_WARNING_KEY, SpinePreferences.DEFAULT_COMPONENTMATERIAL_WARNING); + newPreferences.skeletonDataAssetNoFileError = EditorPrefs.GetBool(SKELETONDATA_ASSET_NO_FILE_ERROR_KEY, SpinePreferences.DEFAULT_SKELETONDATA_ASSET_NO_FILE_ERROR); newPreferences.timelineUseBlendDuration = EditorPrefs.GetBool(TIMELINE_USE_BLEND_DURATION_KEY, SpinePreferences.DEFAULT_TIMELINE_USE_BLEND_DURATION); newPreferences.handleScale = EditorPrefs.GetFloat(SCENE_ICONS_SCALE_KEY, SpinePreferences.DEFAULT_SCENE_ICONS_SCALE); } @@ -237,6 +242,7 @@ namespace Spine.Unity.Editor { EditorPrefs.SetBool(ATLASTXT_WARNING_KEY, preferences.atlasTxtImportWarning); EditorPrefs.SetBool(TEXTUREIMPORTER_WARNING_KEY, preferences.textureImporterWarning); EditorPrefs.SetBool(COMPONENTMATERIAL_WARNING_KEY, preferences.componentMaterialWarning); + EditorPrefs.SetBool(SKELETONDATA_ASSET_NO_FILE_ERROR_KEY, preferences.skeletonDataAssetNoFileError); EditorPrefs.SetBool(TIMELINE_USE_BLEND_DURATION_KEY, preferences.timelineUseBlendDuration); EditorPrefs.SetFloat(SCENE_ICONS_SCALE_KEY, preferences.handleScale); } @@ -312,6 +318,8 @@ namespace Spine.Unity.Editor { SpineEditorUtilities.BoolPrefsField(ref atlasTxtImportWarning, ATLASTXT_WARNING_KEY, new GUIContent("Atlas Extension Warning", "Log a warning and recommendation whenever a `.atlas` file is found.")); SpineEditorUtilities.BoolPrefsField(ref textureImporterWarning, TEXTUREIMPORTER_WARNING_KEY, new GUIContent("Texture Settings Warning", "Log a warning and recommendation whenever Texture Import Settings are detected that could lead to undesired effects, e.g. white border artifacts.")); SpineEditorUtilities.BoolPrefsField(ref componentMaterialWarning, COMPONENTMATERIAL_WARNING_KEY, new GUIContent("Component & Material Warning", "Log a warning and recommendation whenever Component and Material settings are not compatible.")); + SpineEditorUtilities.BoolPrefsField(ref skeletonDataAssetNoFileError, SKELETONDATA_ASSET_NO_FILE_ERROR_KEY, new GUIContent("SkeletonDataAsset no file Error", "Log an error when querying SkeletonData from SkeletonDataAsset with no json or binary file assigned.")); + SkeletonDataAsset.errorIfSkeletonFileNullGlobal = skeletonDataAssetNoFileError; } EditorGUILayout.Space(); diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SpinePreferences.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SpinePreferences.cs index 94c2c0c8c..c036be676 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SpinePreferences.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SpinePreferences.cs @@ -165,6 +165,9 @@ namespace Spine.Unity.Editor { internal const bool DEFAULT_COMPONENTMATERIAL_WARNING = true; public bool componentMaterialWarning = DEFAULT_COMPONENTMATERIAL_WARNING; + internal const bool DEFAULT_SKELETONDATA_ASSET_NO_FILE_ERROR = true; + public bool skeletonDataAssetNoFileError = DEFAULT_SKELETONDATA_ASSET_NO_FILE_ERROR; + public const float DEFAULT_MIPMAPBIAS = -0.5f; public const bool DEFAULT_AUTO_RELOAD_SCENESKELETONS = true; @@ -211,6 +214,7 @@ namespace Spine.Unity.Editor { #if HAS_ON_POSTPROCESS_PREFAB SkeletonRenderer.fixPrefabOverrideViaMeshFilterGlobal = settings.fixPrefabOverrideViaMeshFilter; #endif + SkeletonDataAsset.errorIfSkeletonFileNullGlobal = settings.skeletonDataAssetNoFileError; return settings; } @@ -298,6 +302,8 @@ namespace Spine.Unity.Editor { EditorGUILayout.PropertyField(settings.FindProperty("atlasTxtImportWarning"), new GUIContent("Atlas & Skel Extension Warning", "Log a warning and recommendation whenever a `.atlas` or `.skel` file is found.")); EditorGUILayout.PropertyField(settings.FindProperty("textureImporterWarning"), new GUIContent("Texture Settings Warning", "Log a warning and recommendation whenever Texture Import Settings are detected that could lead to undesired effects, e.g. white border artifacts.")); EditorGUILayout.PropertyField(settings.FindProperty("componentMaterialWarning"), new GUIContent("Component & Material Warning", "Log a warning and recommendation whenever Component and Material settings are not compatible.")); + EditorGUILayout.PropertyField(settings.FindProperty("skeletonDataAssetNoFileError"), new GUIContent("SkeletonDataAsset no file Error", "Log an error when querying SkeletonData from SkeletonDataAsset with no json or binary file assigned.")); + SkeletonDataAsset.errorIfSkeletonFileNullGlobal = settings.FindProperty("skeletonDataAssetNoFileError").boolValue; } EditorGUILayout.Space(); diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs index 778e50264..fe4a724f4 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs @@ -63,6 +63,10 @@ namespace Spine.Unity { public float defaultMix; public RuntimeAnimatorController controller; +#if UNITY_EDITOR + public static bool errorIfSkeletonFileNullGlobal = true; +#endif + public bool IsLoaded { get { return this.skeletonData != null; } } void Reset () { @@ -112,6 +116,9 @@ namespace Spine.Unity { /// Loads, caches and returns the SkeletonData from the skeleton data file. Returns the cached SkeletonData after the first time it is called. Pass false to prevent direct errors from being logged. public SkeletonData GetSkeletonData (bool quiet) { if (skeletonJSON == null) { +#if UNITY_EDITOR + if (!errorIfSkeletonFileNullGlobal) quiet = true; +#endif if (!quiet) Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); Clear(); From 7e440c28aec2d149ae47e1fc8852fa701c3dbed4 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 28 Sep 2022 21:01:59 +0200 Subject: [PATCH 3/5] [unity] Moved common Spine/Blend shader functionality to shared include files. Closes #1721. --- .../Spine-Skeleton-PMA-Additive.shader | 69 +----------------- .../Spine-Skeleton-PMA-Multiply.shader | 71 +------------------ .../Spine-Skeleton-PMA-Screen.shader | 71 +------------------ .../Spine-BlendModes-NormalPass.cginc | 42 +++++++++++ .../Spine-BlendModes-NormalPass.cginc.meta | 10 +++ .../Spine-BlendModes-ShadowCasterPass.cginc | 34 +++++++++ ...ine-BlendModes-ShadowCasterPass.cginc.meta | 10 +++ 7 files changed, 104 insertions(+), 203 deletions(-) create mode 100644 spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc create mode 100644 spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc.meta create mode 100644 spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc create mode 100644 spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc.meta diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Additive.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Additive.shader index 744ccb38e..95f608a33 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Additive.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Additive.shader @@ -43,45 +43,8 @@ Shader "Spine/Blend Modes/Skeleton PMA Additive" { Pass { Name "Normal" - CGPROGRAM - #pragma shader_feature _ _STRAIGHT_ALPHA_INPUT - #pragma vertex vert - #pragma fragment frag - #include "UnityCG.cginc" - #include "../CGIncludes/Spine-Common.cginc" - uniform sampler2D _MainTex; - uniform float4 _Color; - - struct VertexInput { - float4 vertex : POSITION; - float2 uv : TEXCOORD0; - float4 vertexColor : COLOR; - }; - - struct VertexOutput { - float4 pos : SV_POSITION; - float2 uv : TEXCOORD0; - float4 vertexColor : COLOR; - }; - - VertexOutput vert (VertexInput v) { - VertexOutput o; - o.pos = UnityObjectToClipPos(v.vertex); - o.uv = v.uv; - o.vertexColor = PMAGammaToTargetSpace(v.vertexColor) * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. - return o; - } - - float4 frag (VertexOutput i) : SV_Target { - float4 texColor = tex2D(_MainTex, i.uv); - - #if defined(_STRAIGHT_ALPHA_INPUT) - texColor.rgb *= texColor.a; - #endif - - return (texColor * i.vertexColor); - } + #include "../CGIncludes/Spine-BlendModes-NormalPass.cginc" ENDCG } @@ -94,35 +57,7 @@ Shader "Spine/Blend Modes/Skeleton PMA Additive" { ZTest LEqual CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile_shadowcaster - #pragma fragmentoption ARB_precision_hint_fastest - #include "UnityCG.cginc" - struct v2f { - V2F_SHADOW_CASTER; - float4 uvAndAlpha : TEXCOORD1; - }; - - uniform float4 _MainTex_ST; - - v2f vert (appdata_base v, float4 vertexColor : COLOR) { - v2f o; - TRANSFER_SHADOW_CASTER(o) - o.uvAndAlpha.xy = TRANSFORM_TEX(v.texcoord, _MainTex); - o.uvAndAlpha.z = 0; - o.uvAndAlpha.a = vertexColor.a; - return o; - } - - uniform sampler2D _MainTex; - uniform fixed _Cutoff; - - float4 frag (v2f i) : SV_Target { - fixed4 texcol = tex2D(_MainTex, i.uvAndAlpha.xy); - clip(texcol.a * i.uvAndAlpha.a - _Cutoff); - SHADOW_CASTER_FRAGMENT(i) - } + #include "../CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc" ENDCG } } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Multiply.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Multiply.shader index 620487ac6..0fa270294 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Multiply.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Multiply.shader @@ -43,86 +43,21 @@ Shader "Spine/Blend Modes/Skeleton PMA Multiply" { Pass { Name "Normal" - CGPROGRAM - #pragma shader_feature _ _STRAIGHT_ALPHA_INPUT - #pragma vertex vert - #pragma fragment frag - #include "UnityCG.cginc" - #include "../CGIncludes/Spine-Common.cginc" - uniform sampler2D _MainTex; - uniform float4 _Color; - - struct VertexInput { - float4 vertex : POSITION; - float2 uv : TEXCOORD0; - float4 vertexColor : COLOR; - }; - - struct VertexOutput { - float4 pos : SV_POSITION; - float2 uv : TEXCOORD0; - float4 vertexColor : COLOR; - }; - - VertexOutput vert (VertexInput v) { - VertexOutput o; - o.pos = UnityObjectToClipPos(v.vertex); - o.uv = v.uv; - o.vertexColor = PMAGammaToTargetSpace(v.vertexColor) * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. - return o; - } - - float4 frag (VertexOutput i) : SV_Target { - float4 texColor = tex2D(_MainTex, i.uv); - - #if defined(_STRAIGHT_ALPHA_INPUT) - texColor.rgb *= texColor.a; - #endif - - return (texColor * i.vertexColor); - } + #include "../CGIncludes/Spine-BlendModes-NormalPass.cginc" ENDCG } Pass { Name "Caster" - Tags { "LightMode"="ShadowCaster" } + Tags { "LightMode" = "ShadowCaster" } Offset 1, 1 ZWrite On ZTest LEqual CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile_shadowcaster - #pragma fragmentoption ARB_precision_hint_fastest - #include "UnityCG.cginc" - struct v2f { - V2F_SHADOW_CASTER; - float4 uvAndAlpha : TEXCOORD1; - }; - - uniform float4 _MainTex_ST; - - v2f vert (appdata_base v, float4 vertexColor : COLOR) { - v2f o; - TRANSFER_SHADOW_CASTER(o) - o.uvAndAlpha.xy = TRANSFORM_TEX(v.texcoord, _MainTex); - o.uvAndAlpha.z = 0; - o.uvAndAlpha.a = vertexColor.a; - return o; - } - - uniform sampler2D _MainTex; - uniform fixed _Cutoff; - - float4 frag (v2f i) : SV_Target { - fixed4 texcol = tex2D(_MainTex, i.uvAndAlpha.xy); - clip(texcol.a * i.uvAndAlpha.a - _Cutoff); - SHADOW_CASTER_FRAGMENT(i) - } + #include "../CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc" ENDCG } } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Screen.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Screen.shader index adc608447..9ddb59854 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Screen.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/BlendModes/Spine-Skeleton-PMA-Screen.shader @@ -43,86 +43,21 @@ Shader "Spine/Blend Modes/Skeleton PMA Screen" { Pass { Name "Normal" - CGPROGRAM - #pragma shader_feature _ _STRAIGHT_ALPHA_INPUT - #pragma vertex vert - #pragma fragment frag - #include "UnityCG.cginc" - #include "../CGIncludes/Spine-Common.cginc" - uniform sampler2D _MainTex; - uniform float4 _Color; - - struct VertexInput { - float4 vertex : POSITION; - float2 uv : TEXCOORD0; - float4 vertexColor : COLOR; - }; - - struct VertexOutput { - float4 pos : SV_POSITION; - float2 uv : TEXCOORD0; - float4 vertexColor : COLOR; - }; - - VertexOutput vert (VertexInput v) { - VertexOutput o; - o.pos = UnityObjectToClipPos(v.vertex); - o.uv = v.uv; - o.vertexColor = PMAGammaToTargetSpace(v.vertexColor) * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. - return o; - } - - float4 frag (VertexOutput i) : SV_Target { - float4 texColor = tex2D(_MainTex, i.uv); - - #if defined(_STRAIGHT_ALPHA_INPUT) - texColor.rgb *= texColor.a; - #endif - - return (texColor * i.vertexColor); - } + #include "../CGIncludes/Spine-BlendModes-NormalPass.cginc" ENDCG } Pass { Name "Caster" - Tags { "LightMode"="ShadowCaster" } + Tags { "LightMode" = "ShadowCaster" } Offset 1, 1 ZWrite On ZTest LEqual CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile_shadowcaster - #pragma fragmentoption ARB_precision_hint_fastest - #include "UnityCG.cginc" - struct v2f { - V2F_SHADOW_CASTER; - float4 uvAndAlpha : TEXCOORD1; - }; - - uniform float4 _MainTex_ST; - - v2f vert (appdata_base v, float4 vertexColor : COLOR) { - v2f o; - TRANSFER_SHADOW_CASTER(o) - o.uvAndAlpha.xy = TRANSFORM_TEX(v.texcoord, _MainTex); - o.uvAndAlpha.z = 0; - o.uvAndAlpha.a = vertexColor.a; - return o; - } - - uniform sampler2D _MainTex; - uniform fixed _Cutoff; - - float4 frag (v2f i) : SV_Target { - fixed4 texcol = tex2D(_MainTex, i.uvAndAlpha.xy); - clip(texcol.a * i.uvAndAlpha.a - _Cutoff); - SHADOW_CASTER_FRAGMENT(i) - } + #include "../CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc" ENDCG } } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc new file mode 100644 index 000000000..9f6f85b53 --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc @@ -0,0 +1,42 @@ +#ifndef BLENDMODES_NORMAL_PASS_INCLUDED +#define BLENDMODES_NORMAL_PASS_INCLUDED + +#pragma shader_feature _ _STRAIGHT_ALPHA_INPUT +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "../CGIncludes/Spine-Common.cginc" +uniform sampler2D _MainTex; +uniform float4 _Color; + +struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; +}; + +struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; +}; + +VertexOutput vert(VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + o.vertexColor = PMAGammaToTargetSpace(v.vertexColor) * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + return o; +} + +float4 frag(VertexOutput i) : SV_Target{ + float4 texColor = tex2D(_MainTex, i.uv); + + #if defined(_STRAIGHT_ALPHA_INPUT) + texColor.rgb *= texColor.a; + #endif + + return (texColor * i.vertexColor); +} + +#endif diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc.meta b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc.meta new file mode 100644 index 000000000..a85a32101 --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-NormalPass.cginc.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6e28a50646b0e9542a1c93c2d9d993d0 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc new file mode 100644 index 000000000..a6c22c458 --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc @@ -0,0 +1,34 @@ +#ifndef BLENDMODES_SHADOWCASTER_PASS_INCLUDED +#define BLENDMODES_SHADOWCASTER_PASS_INCLUDED + +#pragma vertex vert +#pragma fragment frag +#pragma multi_compile_shadowcaster +#pragma fragmentoption ARB_precision_hint_fastest +#include "UnityCG.cginc" +struct v2f { + V2F_SHADOW_CASTER; + float4 uvAndAlpha : TEXCOORD1; +}; + +uniform float4 _MainTex_ST; + +v2f vert(appdata_base v, float4 vertexColor : COLOR) { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uvAndAlpha.xy = TRANSFORM_TEX(v.texcoord, _MainTex); + o.uvAndAlpha.z = 0; + o.uvAndAlpha.a = vertexColor.a; + return o; +} + +uniform sampler2D _MainTex; +uniform fixed _Cutoff; + +float4 frag(v2f i) : SV_Target{ + fixed4 texcol = tex2D(_MainTex, i.uvAndAlpha.xy); + clip(texcol.a* i.uvAndAlpha.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) +} + +#endif diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc.meta b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc.meta new file mode 100644 index 000000000..c1d2f4039 --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-BlendModes-ShadowCasterPass.cginc.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 76beace455f83a8488bf044605212b2c +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: From 5d1852662cb872729ab224308171fc1c91a133a5 Mon Sep 17 00:00:00 2001 From: Nathan Sweet Date: Thu, 29 Sep 2022 11:43:02 -0400 Subject: [PATCH 4/5] [libgdx] SkeletonViewer, don't use additive for track 0. Improved UI disable states. --- .../assets/skin/skin.json | 3 ++- .../spine/SkeletonViewer.java | 2 +- .../spine/SkeletonViewerUI.java | 27 ++++++++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/spine-libgdx/spine-skeletonviewer/assets/skin/skin.json b/spine-libgdx/spine-skeletonviewer/assets/skin/skin.json index 587970315..582d1b0e5 100644 --- a/spine-libgdx/spine-skeletonviewer/assets/skin/skin.json +++ b/spine-libgdx/spine-skeletonviewer/assets/skin/skin.json @@ -12,6 +12,7 @@ com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { selection: { name: white, color: selection }, dim: { name: white, color: { r: 0, g: 0, b: 0, a: 0.3 } }, list-selection: { name: list-selection, color: selection }, + slider-handle-disabled: { name: slider-handle, color: disabled }, }, com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { default: { @@ -61,6 +62,6 @@ com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { }, }, com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { - default-horizontal: { background: slider-bg, knob: slider-handle }, + default-horizontal: { background: slider-bg, knob: slider-handle, disabledKnob: slider-handle-disabled }, }, } diff --git a/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java b/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java index da939e090..1e26cb6f3 100644 --- a/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java +++ b/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java @@ -209,7 +209,7 @@ public class SkeletonViewer extends ApplicationAdapter { entry = state.setAnimation(track, ui.animationList.getSelected(), ui.loopCheckbox.isChecked()); entry.setHoldPrevious(track > 0 && ui.holdPrevCheckbox.isChecked()); } - entry.setMixBlend(ui.addCheckbox.isChecked() ? MixBlend.add : MixBlend.replace); + entry.setMixBlend(track > 0 && ui.addCheckbox.isChecked() ? MixBlend.add : MixBlend.replace); entry.setReverse(ui.reverseCheckbox.isChecked()); entry.setAlpha(ui.alphaSlider.getValue()); } diff --git a/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewerUI.java b/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewerUI.java index 6af86e079..ef9572574 100644 --- a/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewerUI.java +++ b/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewerUI.java @@ -62,6 +62,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup; import com.badlogic.gdx.scenes.scene2d.ui.Window; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Null; import com.badlogic.gdx.utils.viewport.ScreenViewport; @@ -125,7 +126,9 @@ class SkeletonViewerUI { ButtonGroup trackButtons = new ButtonGroup(); CheckBox loopCheckbox = new CheckBox("Loop", skin); - CheckBox addCheckbox = new CheckBox("Add", skin); + CheckBox reverseCheckbox = new CheckBox("Reverse", skin); + CheckBox holdPrevCheckbox = new HigherTrackCheckBox("Hold previous"); + CheckBox addCheckbox = new HigherTrackCheckBox("Add"); Slider alphaSlider = new Slider(0, 1, 0.01f, false, skin); Label alphaLabel = new Label("100%", skin); @@ -137,9 +140,6 @@ class SkeletonViewerUI { Label speedLabel = new Label("1.0x", skin); TextButton speedResetButton = new TextButton("Reset", skin); - CheckBox reverseCheckbox = new CheckBox("Reverse", skin); - CheckBox holdPrevCheckbox = new CheckBox("Hold previous", skin); - Slider mixSlider = new Slider(0, 4, 0.01f, false, skin); Label mixLabel = new Label("0.3s", skin); @@ -194,6 +194,7 @@ class SkeletonViewerUI { alphaSlider.setValue(1); alphaSlider.setDisabled(true); + alphaLabel.setColor(skin.getColor("disabled")); addCheckbox.setDisabled(true); holdPrevCheckbox.setDisabled(true); @@ -557,6 +558,7 @@ class SkeletonViewerUI { animationList.getSelection().setProgrammaticChangeEvents(true); alphaSlider.setDisabled(track == 0); + alphaLabel.setColor(track == 0 ? skin.getColor("disabled") : Color.WHITE); alphaSlider.setValue(current == null ? 1 : current.alpha); addCheckbox.setDisabled(track == 0); @@ -564,9 +566,11 @@ class SkeletonViewerUI { if (current != null) { loopCheckbox.setChecked(current.getLoop()); - addCheckbox.setChecked(current.getMixBlend() == MixBlend.add); reverseCheckbox.setChecked(current.getReverse()); - holdPrevCheckbox.setChecked(current.getHoldPrevious()); + if (track > 0) { + addCheckbox.setChecked(current.getMixBlend() == MixBlend.add); + holdPrevCheckbox.setChecked(current.getHoldPrevious()); + } } } }; @@ -762,4 +766,15 @@ class SkeletonViewerUI { ex.printStackTrace(); } } + + class HigherTrackCheckBox extends CheckBox { + public HigherTrackCheckBox (String text) { + super(text, skin); + } + + protected Drawable getImageDrawable () { + if (trackButtons.getCheckedIndex() == 0) return getStyle().checkboxOffDisabled; + return super.getImageDrawable(); + } + } } From 114852b15cc22715ed5664d404de89d61c50e01f Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Fri, 30 Sep 2022 14:09:24 +0200 Subject: [PATCH 5/5] [unity] Fixed SkeletonMecanim incorrect looping playback of reversed non-looping clip. Closes #2165. --- .../Runtime/spine-unity/Components/SkeletonMecanim.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs index 2f29cf3dd..8c53527e4 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs @@ -263,7 +263,6 @@ namespace Spine.Unity { var clip = GetAnimation(info.clip); if (clip == null) return false; - var time = AnimationTime(stateInfo.normalizedTime, info.clip.length, info.clip.isLooping, stateInfo.speed < 0); weight = useClipWeight1 ? layerWeight : weight; @@ -289,7 +288,7 @@ namespace Spine.Unity { return false; var time = AnimationTime(stateInfo.normalizedTime + interruptingClipTimeAddition, - info.clip.length, stateInfo.speed < 0); + info.clip.length, info.clip.isLooping, stateInfo.speed < 0); weight = useClipWeight1 ? layerWeight : weight; clip.Apply(skeleton, 0, time, info.clip.isLooping, null, weight, layerBlendMode, MixDirection.In); @@ -502,17 +501,17 @@ namespace Spine.Unity { } static float AnimationTime (float normalizedTime, float clipLength, bool loop, bool reversed) { - float time = AnimationTime(normalizedTime, clipLength, reversed); + float time = ToSpineAnimationTime(normalizedTime, clipLength, loop, reversed); if (loop) return time; const float EndSnapEpsilon = 1f / 30f; // Workaround for end-duration keys not being applied. return (clipLength - time < EndSnapEpsilon) ? clipLength : time; // return a time snapped to clipLength; } - static float AnimationTime (float normalizedTime, float clipLength, bool reversed) { + static float ToSpineAnimationTime (float normalizedTime, float clipLength, bool loop, bool reversed) { if (reversed) normalizedTime = (1 - normalizedTime); if (normalizedTime < 0.0f) - normalizedTime = (normalizedTime % 1.0f) + 1.0f; + normalizedTime = loop ? (normalizedTime % 1.0f) + 1.0f : 0.0f; return normalizedTime * clipLength; }