Browse Source

Merge branch '4.0-beta' of https://github.com/esotericsoftware/spine-runtimes into 4.0-beta

badlogic 4 years ago
parent
commit
5ef75959b9
20 changed files with 150 additions and 130 deletions
  1. 1 0
      CHANGELOG.md
  2. 8 6
      spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonAnimation.cs
  3. 2 2
      spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs
  4. 6 6
      spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs
  5. 5 10
      spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Lit-Common.cginc
  6. 15 1
      spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/ShaderShared.cginc
  7. 44 44
      spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc
  8. 10 14
      spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc
  9. 1 1
      spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc
  10. 20 15
      spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/Shaders/CGIncludes/Spine-SkeletonLit-ForwardPass-LW.hlsl
  11. 1 0
      spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/Shaders/CGIncludes/Spine-Sprite-ForwardPass-LW.hlsl
  12. 2 2
      spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/package-2019.1.json
  13. 2 2
      spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/package-2019.2.json
  14. 2 2
      spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/package.json
  15. 2 2
      spine-unity/Modules/com.esotericsoftware.spine.timeline/package.json
  16. 2 0
      spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/2D/Include/Spine-Sprite-StandardPass-URP-2D.hlsl
  17. 5 6
      spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/2D/Spine-SkeletonLit-URP-2D.shader
  18. 19 15
      spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/Include/Spine-SkeletonLit-ForwardPass-URP.hlsl
  19. 1 0
      spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/Include/Spine-Sprite-ForwardPass-URP.hlsl
  20. 2 2
      spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/package.json

+ 1 - 0
CHANGELOG.md

@@ -50,6 +50,7 @@
   * Removed redundant `Spine.SkeletonExtensions` extension methods `Skeleton.Set*ToSetupPose()`. Also removed less commonly used extension methods `TrackEntry.AllowImmediateQueue()` and `Attachment.IsRenderable()`.
   * `Skin.Attachments` now replaces `Skin.GetAttachments()`, returning an `ICollection<SkinEntry>`. This makes access more consistent and intuitive. To fix any compile errors, replace any occurrances of `skin.GetAttachments()` by `skin.Attachments`.
   * Reverted changes: `BoneFollower` property `followLocalScale` has intermediately been renamed to `followScale` but was renamed back to `followLocalScale`. Serialized values (scenes and prefabs) will automatically be upgraded, only code accessing `followScale` needs to be adapted.
+  * Corrected blending behaviour of all `Sprite` shaders in `Premultiply Alpha` blend mode (including URP and LWRP packages). Previously vertex color alpha was premultiplied again, even though `Premultiply Alpha` blend mode assumes PMA texture and PMA vertex color input. Slot-alpha blending will thus be correctly lighter after upgrading to 4.0. If you have compensated this problem by disabling `Advanced - PMA Vertex Colors` you can now re-enable this parameter, also allowing for rendering Additive slots in a single pass.
 
 * **Additions**
   * Additional **Fix Draw Order** parameter at SkeletonRenderer, defaults to `disabled` (previous behaviour).

+ 8 - 6
spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonAnimation.cs

@@ -134,14 +134,16 @@ namespace Spine.Unity {
 		#region Runtime Instantiation
 		/// <summary>Adds and prepares a SkeletonAnimation component to a GameObject at runtime.</summary>
 		/// <returns>The newly instantiated SkeletonAnimation</returns>
-		public static SkeletonAnimation AddToGameObject (GameObject gameObject, SkeletonDataAsset skeletonDataAsset) {
-			return SkeletonRenderer.AddSpineComponent<SkeletonAnimation>(gameObject, skeletonDataAsset);
+		public static SkeletonAnimation AddToGameObject (GameObject gameObject, SkeletonDataAsset skeletonDataAsset,
+			bool quiet = false) {
+			return SkeletonRenderer.AddSpineComponent<SkeletonAnimation>(gameObject, skeletonDataAsset, quiet);
 		}
 
 		/// <summary>Instantiates a new UnityEngine.GameObject and adds a prepared SkeletonAnimation component to it.</summary>
 		/// <returns>The newly instantiated SkeletonAnimation component.</returns>
-		public static SkeletonAnimation NewSkeletonAnimationGameObject (SkeletonDataAsset skeletonDataAsset) {
-			return SkeletonRenderer.NewSpineGameObject<SkeletonAnimation>(skeletonDataAsset);
+		public static SkeletonAnimation NewSkeletonAnimationGameObject (SkeletonDataAsset skeletonDataAsset,
+			bool quiet = false) {
+			return SkeletonRenderer.NewSpineGameObject<SkeletonAnimation>(skeletonDataAsset, quiet);
 		}
 		#endregion
 
@@ -155,10 +157,10 @@ namespace Spine.Unity {
 		/// <summary>
 		/// Initialize this component. Attempts to load the SkeletonData and creates the internal Spine objects and buffers.</summary>
 		/// <param name="overwrite">If set to <c>true</c>, force overwrite an already initialized object.</param>
-		public override void Initialize (bool overwrite) {
+		public override void Initialize (bool overwrite, bool quiet = false) {
 			if (valid && !overwrite)
 				return;
-			base.Initialize(overwrite);
+			base.Initialize(overwrite, quiet);
 
 			if (!valid)
 				return;

+ 2 - 2
spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs

@@ -69,11 +69,11 @@ namespace Spine.Unity {
 		public event UpdateBonesDelegate UpdateComplete { add { _UpdateComplete += value; } remove { _UpdateComplete -= value; } }
 		#endregion
 
-		public override void Initialize (bool overwrite) {
+		public override void Initialize (bool overwrite, bool quiet = false) {
 			if (valid && !overwrite)
 				return;
 
-			base.Initialize(overwrite);
+			base.Initialize(overwrite, quiet);
 
 			if (!valid)
 				return;

+ 6 - 6
spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs

@@ -247,17 +247,17 @@ namespace Spine.Unity {
 		public SkeletonDataAsset SkeletonDataAsset { get { return skeletonDataAsset; } } // ISkeletonComponent
 
 		#region Runtime Instantiation
-		public static T NewSpineGameObject<T> (SkeletonDataAsset skeletonDataAsset) where T : SkeletonRenderer {
-			return SkeletonRenderer.AddSpineComponent<T>(new GameObject("New Spine GameObject"), skeletonDataAsset);
+		public static T NewSpineGameObject<T> (SkeletonDataAsset skeletonDataAsset, bool quiet = false) where T : SkeletonRenderer {
+			return SkeletonRenderer.AddSpineComponent<T>(new GameObject("New Spine GameObject"), skeletonDataAsset, quiet);
 		}
 
 		/// <summary>Add and prepare a Spine component that derives from SkeletonRenderer to a GameObject at runtime.</summary>
 		/// <typeparam name="T">T should be SkeletonRenderer or any of its derived classes.</typeparam>
-		public static T AddSpineComponent<T> (GameObject gameObject, SkeletonDataAsset skeletonDataAsset) where T : SkeletonRenderer {
+		public static T AddSpineComponent<T> (GameObject gameObject, SkeletonDataAsset skeletonDataAsset, bool quiet = false) where T : SkeletonRenderer {
 			var c = gameObject.AddComponent<T>();
 			if (skeletonDataAsset != null) {
 				c.skeletonDataAsset = skeletonDataAsset;
-				c.Initialize(false);
+				c.Initialize(false, quiet);
 			}
 			return c;
 		}
@@ -315,7 +315,7 @@ namespace Spine.Unity {
 		/// <summary>
 		/// Initialize this component. Attempts to load the SkeletonData and creates the internal Skeleton object and buffers.</summary>
 		/// <param name="overwrite">If set to <c>true</c>, it will overwrite internal objects if they were already generated. Otherwise, the initialized component will ignore subsequent calls to initialize.</param>
-		public virtual void Initialize (bool overwrite) {
+		public virtual void Initialize (bool overwrite, bool quiet = false) {
 			if (valid && !overwrite)
 				return;
 
@@ -361,7 +361,7 @@ namespace Spine.Unity {
 			#if UNITY_EDITOR
 			if (!Application.isPlaying) {
 				string errorMessage = null;
-				if (MaterialChecks.IsMaterialSetupProblematic(this, ref errorMessage))
+				if (quiet || MaterialChecks.IsMaterialSetupProblematic(this, ref errorMessage))
 					Debug.LogWarningFormat(this, "Problematic material setup at {0}: {1}", this.name, errorMessage);
 			}
 			#endif

+ 5 - 10
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Lit-Common.cginc

@@ -109,16 +109,11 @@ sampler2D _MainTex;
 fixed4 frag (VertexOutput i) : SV_Target {
 	fixed4 tex = tex2D(_MainTex, i.uv0);
 	ALPHA_CLIP(tex, i.color);
-
-	fixed4 col;
-	#if defined(_STRAIGHT_ALPHA_INPUT)
-	col.rgb = tex * i.color * tex.a;
-	#else
-	col.rgb = tex * i.color;
-	#endif
-
-	col *= 2;
-	col.a = tex.a * i.color.a;
+#if defined(_STRAIGHT_ALPHA_INPUT)
+	tex.rgb *= tex.a;
+#endif
+	fixed4 col = tex * i.color;
+	col.rgb *= 2;
 	return col;
 }
 

+ 15 - 1
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/ShaderShared.cginc

@@ -137,7 +137,7 @@ inline fixed4 prepareLitPixelForOutput(fixed4 finalPixel, fixed4 color) : SV_Tar
 	finalPixel.rgb *= finalPixel.a;
 #elif defined(_ALPHAPREMULTIPLY_ON)
 	//Pre multiplied alpha
-	finalPixel.rgb *= color.a;
+	// texture and vertex colors are premultiplied already
 #elif defined(_MULTIPLYBLEND)
 	//Multiply
 	finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a);
@@ -240,6 +240,20 @@ uniform fixed _Cutoff;
 
 #endif
 
+////////////////////////////////////////
+// Additive Slot blend mode
+// return unlit textureColor, alpha clip textureColor.a only
+//
+#if defined(_ALPHAPREMULTIPLY_ON)
+	#define RETURN_UNLIT_IF_ADDITIVE_SLOT(textureColor, vertexColor) \
+	if (vertexColor.a == 0 && (vertexColor.r || vertexColor.g || vertexColor.b)) {\
+		ALPHA_CLIP(texureColor, fixed4(1, 1, 1, 1))\
+			return texureColor * vertexColor;\
+	}
+#else
+	#define RETURN_UNLIT_IF_ADDITIVE_SLOT(textureColor, vertexColor)
+#endif
+
 ////////////////////////////////////////
 // Color functions
 //

+ 44 - 44
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc

@@ -1,6 +1,6 @@
 #ifndef SPRITE_PIXEL_LIGHTING_INCLUDED
 #define SPRITE_PIXEL_LIGHTING_INCLUDED
-	
+
 #include "ShaderShared.cginc"
 #include "SpriteLighting.cginc"
 #include "SpriteSpecular.cginc"
@@ -24,24 +24,24 @@
 	#define _LIGHT_COORD_INDEX_0 4
 	#define _LIGHT_COORD_INDEX_1 5
 	#define _FOG_COORD_INDEX 6
-#endif // _NORMALMAP	
+#endif // _NORMALMAP
 
 struct VertexOutput
 {
-	float4 pos : SV_POSITION;				
+	float4 pos : SV_POSITION;
 	fixed4 color : COLOR;
 	float2 texcoord : TEXCOORD0;
 	float4 posWorld : TEXCOORD1;
 	half3 normalWorld : TEXCOORD2;
 #if defined(_NORMALMAP)
-	half3 tangentWorld : TEXCOORD3;  
+	half3 tangentWorld : TEXCOORD3;
 	half3 binormalWorld : TEXCOORD4;
 #endif // _NORMALMAP
 	fixed3 vertexLighting : _VERTEX_LIGHTING_INDEX;
 	LIGHTING_COORDS(_LIGHT_COORD_INDEX_0, _LIGHT_COORD_INDEX_1)
 #if defined(_FOG)
 	UNITY_FOG_COORDS(_FOG_COORD_INDEX)
-#endif // _FOG	
+#endif // _FOG
 
 	UNITY_VERTEX_OUTPUT_STEREO
 };
@@ -56,16 +56,16 @@ inline fixed3 calculateLightDiffuse(VertexOutput input, float3 normalWorld, inou
 {
 	//For directional lights _WorldSpaceLightPos0.w is set to zero
 	float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
-	
+
 	float attenuation = LIGHT_ATTENUATION(input);
 	float angleDot = max(0, dot(normalWorld, lightWorldDirection));
-	
+
 #if defined(_DIFFUSE_RAMP)
 	fixed3 lightDiffuse = calculateRampedDiffuse(_LightColor0.rgb, attenuation, angleDot);
 #else
 	fixed3 lightDiffuse = _LightColor0.rgb * (attenuation * angleDot);
 #endif // _DIFFUSE_RAMP
-	
+
 	return lightDiffuse;
 }
 
@@ -96,7 +96,7 @@ fixed3 calculateAmbientLight(half3 normalWorld)
 {
 #if defined(_SPHERICAL_HARMONICS)
 	fixed3 ambient = ShadeSH9(half4(normalWorld, 1.0));
-#else 
+#else
 	fixed3 ambient = unity_AmbientSky.rgb;
 #endif
 	return ambient;
@@ -129,124 +129,124 @@ fixed4 calculateSpecularLightAdditive(SpecularCommonData s, float3 viewDir, floa
 VertexOutput vert(VertexInput v)
 {
 	VertexOutput output;
-	
+
 	UNITY_SETUP_INSTANCE_ID(input);
     UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-	
+
 	output.pos = calculateLocalPos(v.vertex);
 	output.color = calculateVertexColor(v.color);
 	output.texcoord = calculateTextureCoord(v.texcoord);
 	output.posWorld = calculateWorldPos(v.vertex);
-	
+
 	float backFaceSign = 1;
-#if defined(FIXED_NORMALS_BACKFACE_RENDERING)	
+#if defined(FIXED_NORMALS_BACKFACE_RENDERING)
 	backFaceSign = calculateBackfacingSign(output.posWorld.xyz);
-#endif	
+#endif
 
 	output.normalWorld = calculateSpriteWorldNormal(v, backFaceSign);
 	output.vertexLighting = calculateVertexLighting(output.posWorld, output.normalWorld);
-	
+
 #if defined(_NORMALMAP)
 	output.tangentWorld = calculateWorldTangent(v.tangent);
 	output.binormalWorld = calculateSpriteWorldBinormal(v, output.normalWorld, output.tangentWorld, backFaceSign);
 #endif
 
 	TRANSFER_VERTEX_TO_FRAGMENT(output)
-	
+
 #if defined(_FOG)
 	UNITY_TRANSFER_FOG(output,output.pos);
-#endif // _FOG	
-	
+#endif // _FOG
+
 	return output;
 }
 
 ////////////////////////////////////////
 // Fragment programs
 //
-
 fixed4 fragBase(VertexOutput input) : SV_Target
 {
 	fixed4 texureColor = calculateTexturePixel(input.texcoord);
+	RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.color) // shall be called before ALPHA_CLIP
 	ALPHA_CLIP(texureColor, input.color)
-	
+
 	//Get normal direction
 	fixed3 normalWorld = calculateNormalWorld(input);
 
 	//Get Ambient diffuse
 	fixed3 ambient = calculateAmbientLight(normalWorld);
 
-	
+
 #if defined(SPECULAR)
-	
+
 	//For directional lights _WorldSpaceLightPos0.w is set to zero
 	float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
 	float attenuation = LIGHT_ATTENUATION(input);
-	
+
 	//Returns pixel lit by light, texture color should inlcluded alpha
 	half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz);
 	fixed4 pixel = calculateSpecularLight(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation, ambient + input.vertexLighting);
-	
+
 	APPLY_EMISSION_SPECULAR(pixel, input.texcoord)
-	
+
 #else
 
 	//Get primary pixel light diffuse
 	fixed3 diffuse = calculateLightDiffuse(input, normalWorld, texureColor);
-	
+
 	//Combine along with vertex lighting for the base lighting pass
 	fixed3 lighting = ambient + diffuse + input.vertexLighting;
-	
+
 	APPLY_EMISSION(lighting, input.texcoord)
-	
+
 	fixed4 pixel = calculateLitPixel(texureColor, input.color, lighting);
-	
+
 #endif
-	
+
 #if defined(_RIM_LIGHTING)
 	pixel.rgb = applyRimLighting(input.posWorld, normalWorld, pixel);
 #endif
-	
+
 	COLORISE(pixel)
 	APPLY_FOG(pixel, input)
-	
+
 	return pixel;
 }
 
 fixed4 fragAdd(VertexOutput input) : SV_Target
 {
 	fixed4 texureColor = calculateTexturePixel(input.texcoord);
-	
+
 #if defined(_COLOR_ADJUST)
 	texureColor = adjustColor(texureColor);
-#endif // _COLOR_ADJUST	
+#endif // _COLOR_ADJUST
 
 	ALPHA_CLIP(texureColor, input.color)
-	
+
 	//Get normal direction
 	fixed3 normalWorld = calculateNormalWorld(input);
-		
+
 #if defined(SPECULAR)
-	
+
 	//For directional lights _WorldSpaceLightPos0.w is set to zero
 	float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
 	float attenuation = LIGHT_ATTENUATION(input);
-	
+
 	half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz);
 	fixed4 pixel = calculateSpecularLightAdditive(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation);
-	
+
 #else
-	
+
 	//Get light diffuse
 	fixed3 lighting = calculateLightDiffuse(input, normalWorld, texureColor);
 	fixed4 pixel = calculateAdditiveLitPixel(texureColor, input.color, lighting);
-	
+
 #endif
-	
+
 	COLORISE_ADDITIVE(pixel)
 	APPLY_FOG_ADDITIVE(pixel, input)
-	
+
 	return pixel;
 }
 
 
-#endif // SPRITE_PIXEL_LIGHTING_INCLUDED
+#endif // SPRITE_PIXEL_LIGHTING_INCLUDED

+ 10 - 14
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc

@@ -6,7 +6,7 @@
 ////////////////////////////////////////
 // Vertex structs
 //
-				
+
 struct VertexInput
 {
 	float4 vertex : POSITION;
@@ -22,7 +22,7 @@ struct VertexOutput
 	fixed4 color : COLOR;
 #if defined(_FOG)
 	UNITY_FOG_COORDS(1)
-#endif // _FOG	
+#endif // _FOG
 
 	UNITY_VERTEX_OUTPUT_STEREO
 };
@@ -34,39 +34,35 @@ struct VertexOutput
 VertexOutput vert(VertexInput input)
 {
 	VertexOutput output;
-	
+
 	UNITY_SETUP_INSTANCE_ID(input);
     UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-	
-	output.pos = calculateLocalPos(input.vertex);	
+
+	output.pos = calculateLocalPos(input.vertex);
 	output.texcoord = calculateTextureCoord(input.texcoord);
 	output.color = calculateVertexColor(input.color);
 
 #if defined(_FOG)
 	UNITY_TRANSFER_FOG(output,output.pos);
 #endif // _FOG
-	
+
 	return output;
 }
 
 ////////////////////////////////////////
 // Fragment program
 //
-
-
-
-
 fixed4 frag(VertexOutput input) : SV_Target
 {
 	fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
+	RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.color) // shall be called before ALPHA_CLIP
 	ALPHA_CLIP(texureColor, input.color)
-
 	fixed4 pixel = calculatePixel(texureColor, input.color);
-	
+
 	COLORISE(pixel)
 	APPLY_FOG(pixel, input)
-	
+
 	return pixel;
 }
 
-#endif // SPRITE_UNLIT_INCLUDED
+#endif // SPRITE_UNLIT_INCLUDED

+ 1 - 1
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc

@@ -399,10 +399,10 @@ VertexOutput vert(VertexInput input)
 ////////////////////////////////////////
 // Fragment program
 //
-
 fixed4 frag(VertexOutput input) : SV_Target
 {
 	fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
+	RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.color) // shall be called before ALPHA_CLIP
 	ALPHA_CLIP(texureColor, input.color)
 
 #if defined(PER_PIXEL_LIGHTING)

+ 20 - 15
spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/Shaders/CGIncludes/Spine-SkeletonLit-ForwardPass-LW.hlsl

@@ -59,6 +59,8 @@ VertexOutput vert(appdata v) {
 	float3 positionWS = TransformObjectToWorld(v.pos);
 	half3 fixedNormal = half3(0, 0, -1);
 	half3 normalWS = normalize(mul((float3x3)unity_ObjectToWorld, fixedNormal));
+	o.uv0 = v.uv0;
+	o.pos = TransformWorldToHClip(positionWS);
 
 #ifdef _DOUBLE_SIDED_LIGHTING
 	// unfortunately we have to compute the sign here in the vertex shader
@@ -69,7 +71,16 @@ VertexOutput vert(appdata v) {
 #endif
 
 	half3 shadowedColor;
-	color.rgb = LightweightLightVertexSimplified(positionWS, normalWS, shadowedColor);
+	if (color.a == 0) {
+		o.color = color;
+#if defined(SKELETONLIT_RECEIVE_SHADOWS)
+		o.shadowedColor = color;
+		o.shadowCoord = float4(0, 0, 0, 0);
+#endif
+		return o;
+	}
+
+	color.rgb *= LightweightLightVertexSimplified(positionWS, normalWS, shadowedColor);
 #if defined(SKELETONLIT_RECEIVE_SHADOWS)
 	o.shadowedColor = shadowedColor;
 #endif
@@ -78,10 +89,7 @@ VertexOutput vert(appdata v) {
 	half3 vertexSH;
 	OUTPUT_SH(normalWS.xyz, vertexSH);
 	color.rgb += SAMPLE_GI(input.lightmapUV, vertexSH, normalWS);
-
 	o.color = color;
-	o.uv0 = v.uv0;
-	o.pos = TransformWorldToHClip(positionWS);
 
 #if defined(SKELETONLIT_RECEIVE_SHADOWS)
 	VertexPositionInputs vertexInput;
@@ -94,22 +102,19 @@ VertexOutput vert(appdata v) {
 
 half4 frag(VertexOutput i) : SV_Target{
 	half4 tex = tex2D(_MainTex, i.uv0);
-	half4 col;
+	#if defined(_STRAIGHT_ALPHA_INPUT)
+	tex.rgb *= tex.a;
+	#endif
+
+	if (i.color.a == 0)
+		return tex * i.color;
 
 #if defined(SKELETONLIT_RECEIVE_SHADOWS)
 	half shadowAttenuation = MainLightRealtimeShadow(i.shadowCoord);
 	i.color.rgb = lerp(i.shadowedColor, i.color.rgb, shadowAttenuation);
 #endif
-
-	#if defined(_STRAIGHT_ALPHA_INPUT)
-	col.rgb = tex.rgb * i.color.rgb * tex.a;
-	#else
-	col.rgb = tex.rgb * i.color.rgb;
-	#endif
-
-
-	col.a = tex.a * i.color.a;
-	return col;
+	return tex * i.color;
 }
 
+
 #endif

+ 1 - 0
spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/Shaders/CGIncludes/Spine-Sprite-ForwardPass-LW.hlsl

@@ -212,6 +212,7 @@ half4 ForwardPassFragmentSprite(VertexOutputLWRP input) : SV_Target
 	UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
 
 	fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
+	RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.vertexColor) // shall be called before ALPHA_CLIP
 	ALPHA_CLIP(texureColor, input.vertexColor)
 
 	// fill out InputData struct

+ 2 - 2
spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/package-2019.1.json

@@ -1,8 +1,8 @@
 {
 	"name": "com.esotericsoftware.spine.lwrp-shaders", 
 	"displayName": "Spine Lightweight RP Shaders",
-	"description": "This plugin provides lightweight render pipeline (LWRP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 3.8.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
-	"version": "3.8.1",
+	"description": "This plugin provides lightweight render pipeline (LWRP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 4.0.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
+	"version": "4.0.2",
 	"unity": "2019.1",
 	"author": {
 		"name": "Esoteric Software",

+ 2 - 2
spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/package-2019.2.json

@@ -1,8 +1,8 @@
 {
 	"name": "com.esotericsoftware.spine.lwrp-shaders", 
 	"displayName": "Spine Lightweight RP Shaders",
-	"description": "This plugin provides lightweight render pipeline (LWRP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 3.8.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
-	"version": "3.8.1",
+	"description": "This plugin provides lightweight render pipeline (LWRP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 4.0.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
+	"version": "4.0.2",
 	"unity": "2019.2",
 	"author": {
 		"name": "Esoteric Software",

+ 2 - 2
spine-unity/Modules/com.esotericsoftware.spine.lwrp-shaders/package.json

@@ -1,8 +1,8 @@
 {
 	"name": "com.esotericsoftware.spine.lwrp-shaders", 
 	"displayName": "Spine Lightweight RP Shaders",
-	"description": "This plugin provides lightweight render pipeline (LWRP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 3.8.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
-	"version": "3.8.1",
+	"description": "This plugin provides lightweight render pipeline (LWRP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 4.0.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
+	"version": "4.0.2",
 	"unity": "2019.1",
 	"author": {
 		"name": "Esoteric Software",

+ 2 - 2
spine-unity/Modules/com.esotericsoftware.spine.timeline/package.json

@@ -1,8 +1,8 @@
 {
 	"name": "com.esotericsoftware.spine.timeline", 
 	"displayName": "Spine Timeline Extensions",
-	"description": "This plugin provides integration of spine-unity for the Unity Timeline.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 3.8 from 2019-10-03 or newer.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
-	"version": "3.8.2",
+	"description": "This plugin provides integration of spine-unity for the Unity Timeline.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 4.0.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
+	"version": "4.0.2",
 	"unity": "2018.3",
 	"author": {
 		"name": "Esoteric Software",

+ 2 - 0
spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/2D/Include/Spine-Sprite-StandardPass-URP-2D.hlsl

@@ -87,7 +87,9 @@ VertexOutputSpriteURP2D CombinedShapeLightVertex(VertexInput input)
 half4 CombinedShapeLightFragment(VertexOutputSpriteURP2D input) : SV_Target
 {
 	fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
+	RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.vertexColor) // shall be called before ALPHA_CLIP
 	ALPHA_CLIP(texureColor, input.vertexColor)
+
 	texureColor *= input.vertexColor;
 
 	half4 mask = SAMPLE_TEXTURE2D(_MaskTex, sampler_MaskTex, input.texcoord.xy);

+ 5 - 6
spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/2D/Spine-SkeletonLit-URP-2D.shader

@@ -98,14 +98,13 @@
 			half4 CombinedShapeLightFragment(Varyings i) : SV_Target
 			{
 				half4 tex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
-
-				half4 main;
 				#if defined(_STRAIGHT_ALPHA_INPUT)
-				main.rgb = tex.rgb * i.color.rgb * tex.a;
-				#else
-				main.rgb = tex.rgb * i.color.rgb;
+				tex.rgb *= tex.a;
 				#endif
-				main.a = tex.a * i.color.a;
+
+				half4 main = tex * i.color;
+				if (i.color.a == 0)
+					return main;
 
 				half4 mask = SAMPLE_TEXTURE2D(_MaskTex, sampler_MaskTex, i.uv);
 				return CombinedShapeLightShared(main, mask, i.lightingUV);

+ 19 - 15
spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/Include/Spine-SkeletonLit-ForwardPass-URP.hlsl

@@ -59,6 +59,8 @@ VertexOutput vert(appdata v) {
 	float3 positionWS = TransformObjectToWorld(v.pos);
 	half3 fixedNormal = half3(0, 0, -1);
 	half3 normalWS = normalize(mul((float3x3)unity_ObjectToWorld, fixedNormal));
+	o.uv0 = v.uv0;
+	o.pos = TransformWorldToHClip(positionWS);
 
 #ifdef _DOUBLE_SIDED_LIGHTING
 	// unfortunately we have to compute the sign here in the vertex shader
@@ -69,7 +71,16 @@ VertexOutput vert(appdata v) {
 #endif
 
 	half3 shadowedColor;
-	color.rgb = LightweightLightVertexSimplified(positionWS, normalWS, shadowedColor);
+	if (color.a == 0) {
+		o.color = color;
+#if defined(SKELETONLIT_RECEIVE_SHADOWS)
+		o.shadowedColor = color;
+		o.shadowCoord = float4(0, 0, 0, 0);
+#endif
+		return o;
+	}
+
+	color.rgb *= LightweightLightVertexSimplified(positionWS, normalWS, shadowedColor);
 #if defined(SKELETONLIT_RECEIVE_SHADOWS)
 	o.shadowedColor = shadowedColor;
 #endif
@@ -78,10 +89,7 @@ VertexOutput vert(appdata v) {
 	half3 vertexSH;
 	OUTPUT_SH(normalWS.xyz, vertexSH);
 	color.rgb += SAMPLE_GI(input.lightmapUV, vertexSH, normalWS);
-
 	o.color = color;
-	o.uv0 = v.uv0;
-	o.pos = TransformWorldToHClip(positionWS);
 
 #if defined(SKELETONLIT_RECEIVE_SHADOWS)
 	VertexPositionInputs vertexInput;
@@ -94,22 +102,18 @@ VertexOutput vert(appdata v) {
 
 half4 frag(VertexOutput i) : SV_Target{
 	half4 tex = tex2D(_MainTex, i.uv0);
-	half4 col;
+	#if defined(_STRAIGHT_ALPHA_INPUT)
+	tex.rgb *= tex.a;
+	#endif
+
+	if (i.color.a == 0)
+		return tex * i.color;
 
 #if defined(SKELETONLIT_RECEIVE_SHADOWS)
 	half shadowAttenuation = MainLightRealtimeShadow(i.shadowCoord);
 	i.color.rgb = lerp(i.shadowedColor, i.color.rgb, shadowAttenuation);
 #endif
-
-	#if defined(_STRAIGHT_ALPHA_INPUT)
-	col.rgb = tex.rgb * i.color.rgb * tex.a;
-	#else
-	col.rgb = tex.rgb * i.color.rgb;
-	#endif
-
-
-	col.a = tex.a * i.color.a;
-	return col;
+	return tex * i.color;
 }
 
 #endif

+ 1 - 0
spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/Include/Spine-Sprite-ForwardPass-URP.hlsl

@@ -222,6 +222,7 @@ half4 ForwardPassFragmentSprite(VertexOutputLWRP input) : SV_Target
 	UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
 
 	fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
+	RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.vertexColor) // shall be called before ALPHA_CLIP
 	ALPHA_CLIP(texureColor, input.vertexColor)
 
 	// fill out InputData struct

+ 2 - 2
spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/package.json

@@ -1,8 +1,8 @@
 {
   "name": "com.esotericsoftware.spine.urp-shaders",
   "displayName": "Spine Universal RP Shaders",
-  "description": "This plugin provides universal render pipeline (URP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 3.8.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
-  "version": "3.8.1",
+  "description": "This plugin provides universal render pipeline (URP) shaders for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 4.0.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)",
+  "version": "4.0.2",
   "unity": "2019.3",
   "author": {
     "name": "Esoteric Software",