diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e709f23f..d17dbeee4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -151,6 +151,8 @@ * Added Spine Preferences setting `Reload SkeletonData after Play`. When enabled, the shared `SkeletonData` of all skeletons in the active scene is reloaded (from the `.json` or `.skel.bytes` file) after exiting play-mode. You can disable this setting to avoid the reloading delay if you can ensure that there are no (accidental) modifications to the shared `SkeletonData` during play-mode (otherwise it would carry over its effect into subsequent plays). Defaults to `true` (the safe setting), which maintains existing behaviour. * Added `SkeletonAnimationMulti` sample component methods `SetActiveSkeleton(int index)` and getter property `SkeletonAnimations` to more easily apply changes at all SkeletonAnimation instances instead of only the active one. * PMA textures now have `sRGB (Color Texture)` disabled by default, the preset template `PMATexturePreset.preset` has been adjusted accordingly. As PMA textures are only allowed with Gamma color space, `sRGB (Color Texture)` shall be disabled to prevent border artifacts when mipmaps are enabled. In Gamma color space having this setting disabled has no drawbacks, only benefits. + * `SkeletonRenderTexture` and `SkeletonGraphicRenderTexture` components now support automatic down-scaling when required size on screen exceeds `Max Render Texture Size`. + * Added `Spine/SkeletonGraphic Fill` shader to provide functionality of `Spine/Skeleton Fill` shader for `SkeletonGraphic`. * **Breaking changes** * Made `SkeletonGraphic.unscaledTime` parameter protected, use the new property `UnscaledTime` instead. diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs index 30f2dc2b4..13117d584 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonGraphicRenderTexture.cs @@ -248,7 +248,8 @@ namespace Spine.Unity.Examples { } Vector2 targetCameraViewportSize = targetCamera.pixelRect.size; - commandBuffer.SetViewport(new Rect(-screenSpaceMin, targetCameraViewportSize)); + Rect viewportRect = new Rect(-screenSpaceMin * downScaleFactor, targetCameraViewportSize * downScaleFactor); + commandBuffer.SetViewport(viewportRect); } protected override void AssignMeshAtRenderer () { diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs index da4d428b6..369682ca7 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTexture.cs @@ -167,7 +167,8 @@ namespace Spine.Unity.Examples { commandBuffer.SetProjectionMatrix(targetCamera.projectionMatrix); commandBuffer.SetViewMatrix(targetCamera.worldToCameraMatrix); Vector2 targetCameraViewportSize = targetCamera.pixelRect.size; - commandBuffer.SetViewport(new Rect(-screenSpaceMin, targetCameraViewportSize)); + Rect viewportRect = new Rect(-screenSpaceMin * downScaleFactor, targetCameraViewportSize * downScaleFactor); + commandBuffer.SetViewport(viewportRect); } protected void RenderToRenderTexture () { diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs index 8fb639e4a..7b5ec2ea2 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/SkeletonRenderTexture/SkeletonRenderTextureBase.cs @@ -47,8 +47,10 @@ namespace Spine.Unity.Examples { public Camera targetCamera; protected CommandBuffer commandBuffer; - protected Vector2Int requiredRenderTextureSize; + protected Vector2Int screenSize; + protected Vector2Int usedRenderTextureSize; protected Vector2Int allocatedRenderTextureSize; + protected Vector2 downScaleFactor = Vector2.one; protected Vector3 worldCornerNoDistortion0; protected Vector3 worldCornerNoDistortion1; @@ -89,17 +91,22 @@ namespace Spine.Unity.Examples { uvCorner2 = MathUtilities.InverseLerp(screenSpaceMin, screenSpaceMax, screenCorner2); uvCorner3 = MathUtilities.InverseLerp(screenSpaceMin, screenSpaceMax, screenCorner3); - requiredRenderTextureSize = new Vector2Int( - Math.Min(maxRenderTextureSize, Math.Abs((int)screenSpaceMax.x - (int)screenSpaceMin.x)), - Math.Min(maxRenderTextureSize, Math.Abs((int)screenSpaceMax.y - (int)screenSpaceMin.y))); + screenSize = new Vector2Int(Math.Abs((int)screenSpaceMax.x - (int)screenSpaceMin.x), + Math.Abs((int)screenSpaceMax.y - (int)screenSpaceMin.y)); + usedRenderTextureSize = new Vector2Int( + Math.Min(maxRenderTextureSize, screenSize.x), + Math.Min(maxRenderTextureSize, screenSize.y)); + downScaleFactor = new Vector2( + (float)usedRenderTextureSize.x / (float)screenSize.x, + (float)usedRenderTextureSize.y / (float)screenSize.y); PrepareRenderTexture(); } protected void PrepareRenderTexture () { Vector2Int textureSize = new Vector2Int( - Mathf.NextPowerOfTwo(requiredRenderTextureSize.x), - Mathf.NextPowerOfTwo(requiredRenderTextureSize.y)); + Mathf.NextPowerOfTwo(usedRenderTextureSize.x), + Mathf.NextPowerOfTwo(usedRenderTextureSize.y)); if (textureSize != allocatedRenderTextureSize) { if (renderTexture) @@ -135,8 +142,12 @@ namespace Spine.Unity.Examples { }; quadMesh.normals = normals; - float maxU = (float)requiredRenderTextureSize.x / (float)allocatedRenderTextureSize.x; - float maxV = (float)requiredRenderTextureSize.y / (float)allocatedRenderTextureSize.y; + float maxU = (float)usedRenderTextureSize.x / (float)allocatedRenderTextureSize.x; + float maxV = (float)usedRenderTextureSize.y / (float)allocatedRenderTextureSize.y; + if (downScaleFactor.x < 1 || downScaleFactor.y < 1) { + maxU = downScaleFactor.x * (float)screenSize.x / (float)allocatedRenderTextureSize.x; + maxV = downScaleFactor.y * (float)screenSize.y / (float)allocatedRenderTextureSize.y; + } Vector2[] uv = new Vector2[4] { new Vector2(uvCorner0.x * maxU, uvCorner0.y * maxV), new Vector2(uvCorner1.x * maxU, uvCorner1.y * maxV), diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc index 9b414b743..2b782970a 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc @@ -26,6 +26,11 @@ fixed4 _Color; fixed4 _TextureSampleAdd; float4 _ClipRect; +#ifdef ENABLE_FILL +float4 _FillColor; +float _FillPhase; +#endif + VertexOutput vert (VertexInput IN) { VertexOutput OUT; @@ -73,6 +78,9 @@ fixed4 frag (VertexOutput IN) : SV_Target clip (color.a - 0.001); #endif + #ifdef ENABLE_FILL + color.rgb = lerp(color.rgb, (_FillColor.rgb * color.a), _FillPhase); // make sure to PMA _FillColor. + #endif return color; } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-Fill.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-Fill.shader new file mode 100644 index 000000000..7b2074718 --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-Fill.shader @@ -0,0 +1,78 @@ +Shader "Spine/SkeletonGraphic Fill" +{ + Properties + { + _FillColor("FillColor", Color) = (1,1,1,1) + _FillPhase("FillPhase", Range(0, 1)) = 0 + [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} + [Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0 + [Toggle(_CANVAS_GROUP_COMPATIBLE)] _CanvasGroupCompatible("CanvasGroup Compatible", Int) = 1 + _Color("Tint", Color) = (1,1,1,1) + + [HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 + [HideInInspector] _Stencil("Stencil ID", Float) = 0 + [HideInInspector][Enum(UnityEngine.Rendering.StencilOp)] _StencilOp("Stencil Operation", Float) = 0 + [HideInInspector] _StencilWriteMask("Stencil Write Mask", Float) = 255 + [HideInInspector] _StencilReadMask("Stencil Read Mask", Float) = 255 + + [HideInInspector] _ColorMask("Color Mask", Float) = 15 + + [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0 + + // Outline properties are drawn via custom editor. + [HideInInspector] _OutlineWidth("Outline Width", Range(0,8)) = 3.0 + [HideInInspector] _OutlineColor("Outline Color", Color) = (1,1,0,1) + [HideInInspector] _OutlineReferenceTexWidth("Reference Texture Width", Int) = 1024 + [HideInInspector] _ThresholdEnd("Outline Threshold", Range(0,1)) = 0.25 + [HideInInspector] _OutlineSmoothness("Outline Smoothness", Range(0,1)) = 1.0 + [HideInInspector][MaterialToggle(_USE8NEIGHBOURHOOD_ON)] _Use8Neighbourhood("Sample 8 Neighbours", Float) = 1 + [HideInInspector] _OutlineOpaqueAlpha("Opaque Alpha", Range(0,1)) = 1.0 + [HideInInspector] _OutlineMipLevel("Outline Mip Level", Range(0,3)) = 0 + } + + SubShader + { + Tags + { + "Queue" = "Transparent" + "IgnoreProjector" = "True" + "RenderType" = "Transparent" + "PreviewType" = "Plane" + "CanUseSpriteAtlas" = "True" + } + + Stencil + { + Ref[_Stencil] + Comp[_StencilComp] + Pass[_StencilOp] + ReadMask[_StencilReadMask] + WriteMask[_StencilWriteMask] + } + + Cull Off + Lighting Off + ZWrite Off + ZTest[unity_GUIZTestMode] + Fog { Mode Off } + Blend One OneMinusSrcAlpha + ColorMask[_ColorMask] + + Pass + { + Name "Normal" + + CGPROGRAM + #pragma shader_feature _ _STRAIGHT_ALPHA_INPUT + #pragma shader_feature _ _CANVAS_GROUP_COMPATIBLE + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #define ENABLE_FILL + #include "CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc" + ENDCG + } + } + CustomEditor "SpineShaderWithOutlineGUI" +} diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-Fill.shader.meta b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-Fill.shader.meta new file mode 100644 index 000000000..68d15e4d2 --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-Fill.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c02377d9afbb50e49ab27049e59fb5f8 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: