From cd22906a5b663ab9d7792f2ee879c0cfdd9c6376 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Fri, 30 Jan 2026 12:26:45 +0100 Subject: [PATCH] [unity] Added support for blend modes at Spine Visual Element (UI Toolkit). Closes #3019. See #1943. --- CHANGELOG.md | 3 + .../Editor/Utility/SkeletonGraphicUtility.cs | 6 +- spine-unity/Assets/Spine/package.json | 2 +- .../SpineVisualElementAttributeDrawers.cs | 104 ++ .../Materials.meta | 8 + .../Materials/Spine-UITK-Additive-PMA.mat | 43 + .../Spine-UITK-Additive-PMA.mat.meta | 8 + .../Spine-UITK-Additive-Straight.mat | 43 + .../Spine-UITK-Additive-Straight.mat.meta | 8 + .../Materials/Spine-UITK-Multiply-PMA.mat | 43 + .../Spine-UITK-Multiply-PMA.mat.meta | 8 + .../Spine-UITK-Multiply-Straight.mat | 43 + .../Spine-UITK-Multiply-Straight.mat.meta | 8 + .../Materials/Spine-UITK-Normal-PMA.mat | 43 + .../Materials/Spine-UITK-Normal-PMA.mat.meta | 8 + .../Materials/Spine-UITK-Normal-Straight.mat | 43 + .../Spine-UITK-Normal-Straight.mat.meta | 8 + .../Materials/Spine-UITK-Screen-PMA.mat | 64 + .../Materials/Spine-UITK-Screen-PMA.mat.meta | 8 + .../Materials/Spine-UITK-Screen-Straight.mat | 63 + .../Spine-UITK-Screen-Straight.mat.meta | 8 + .../Runtime/SpineVisualElement.cs | 242 ++- .../Samples~/Examples/PaneSettings.asset | 17 +- .../Spine Skeletons/Raptor/raptor.png.meta | 15 +- .../Spine Skeletons/Raptor/raptor_Atlas.asset | 1 + .../Raptor/raptor_Material.mat | 6 +- .../Spine Skeletons/whirlyblendmodes.meta | 8 + .../whirlyblendmodes.atlas.txt | 5 + .../whirlyblendmodes.atlas.txt.meta | 7 + .../whirlyblendmodes/whirlyblendmodes.json | 74 + .../whirlyblendmodes.json.meta | 7 + .../whirlyblendmodes/whirlyblendmodes.png | Bin 0 -> 87165 bytes .../whirlyblendmodes.png.meta | 117 ++ .../whirlyblendmodes_Atlas.asset | 20 + .../whirlyblendmodes_Atlas.asset.meta | 8 + .../whirlyblendmodes_Material-Multiply.mat | 57 + ...hirlyblendmodes_Material-Multiply.mat.meta | 8 + .../whirlyblendmodes_Material-Screen.mat | 57 + .../whirlyblendmodes_Material-Screen.mat.meta | 8 + .../whirlyblendmodes_Material.mat | 50 + .../whirlyblendmodes_Material.mat.meta | 8 + .../whirlyblendmodes_SkeletonData.asset | 35 + .../whirlyblendmodes_SkeletonData.asset.meta | 8 + .../Samples~/Examples/SpineUIToolkit.uxml | 27 +- .../Shaders.meta | 8 + .../Shaders/Spine-UITK-Additive.shader | 439 +++++ .../Shaders/Spine-UITK-Additive.shader.meta | 9 + .../Shaders/Spine-UITK-Multiply.shader | 439 +++++ .../Shaders/Spine-UITK-Multiply.shader.meta | 9 + .../Shaders/Spine-UITK-Normal.shadergraph | 1601 +++++++++++++++++ .../Spine-UITK-Normal.shadergraph.meta | 18 + .../Shaders/Spine-UITK-Screen.shader | 439 +++++ .../Shaders/Spine-UITK-Screen.shader.meta | 9 + .../package.json | 8 +- 54 files changed, 4263 insertions(+), 73 deletions(-) create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.png create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.png.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph.meta create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader create mode 100644 spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader.meta diff --git a/CHANGELOG.md b/CHANGELOG.md index a066b942a..508e268c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -366,6 +366,9 @@ - Added define `SPINE_DISABLE_THREADING` to disable threaded animation and mesh generation entirely, removing the respective code. This define can be set as `Scripting Define Symbols` globally or for selective build profiles where desired. - Added automatic load balancing (work stealing) for improved performance when using threaded animation and mesh generation, enabled by default. Load balancing can be disabled via a new Spine preferences parameter `Threading Defaults - Load Balancing` setting a build define accordingly. Additional configuration parameters `SkeletonUpdateSystem.UpdateChunksPerThread` and `LateUpdateChunksPerThread` are available to fine-tune the chunk count for load balancing. A minimum of 8 chunks is recommended with load balancing enabled. Higher values add higher overhead with potentially detrimental effect on performance. + - Spine UI Toolkit UPM package now supports rendering back-face triangles. Enable `Flip Back Faces` to automatically fix back-face geometry in an additional pass (defaults to enabled). Disable the setting to save additional processing overhead. + - Spine UI Toolkit UPM package now supports PMA atlas textures. At the `SpineVisualElement` expand `Blend Mode Materials` and hit `Detect Materials` to automatically assign the proper PMA or straight alpha material at `Normal Material`. Unity minimum version increased to 6000.3 which added support for UI Toolkit materials. + - Spine UI Toolkit UPM package now supports all Spine blend modes via blend mode materials and multiple materials per skeleton. Enable `Multiple Materials` (enabled by default), expand `Blend Mode Materials` and hit `Detect Materials` to automatically assign the correct PMA or straight alpha blend mode materials. - **Deprecated** diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SkeletonGraphicUtility.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SkeletonGraphicUtility.cs index ab7eef85c..4c8f56943 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SkeletonGraphicUtility.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/SkeletonGraphicUtility.cs @@ -100,11 +100,15 @@ namespace Spine.Unity.Editor { public static bool IsSkeletonTexturePMA (SkeletonGraphic skeletonGraphic, out bool detectionSucceeded) { Texture texture = skeletonGraphic.mainTexture; + return IsSkeletonTexturePMA(texture, skeletonGraphic.name, out detectionSucceeded); + } + + public static bool IsSkeletonTexturePMA (Texture texture, string skeletonName, out bool detectionSucceeded) { string texturePath = AssetDatabase.GetAssetPath(texture.GetInstanceID()); TextureImporter importer = (TextureImporter)TextureImporter.GetAtPath(texturePath); if (importer.alphaIsTransparency != importer.sRGBTexture) { Debug.LogWarning(string.Format("Texture '{0}' at skeleton '{1}' is neither configured correctly for " + - "PMA nor Straight Alpha.", texture, skeletonGraphic), texture); + "PMA nor Straight Alpha.", texture, skeletonName), texture); detectionSucceeded = false; return false; } diff --git a/spine-unity/Assets/Spine/package.json b/spine-unity/Assets/Spine/package.json index bf4d01e05..2c9b5ef65 100644 --- a/spine-unity/Assets/Spine/package.json +++ b/spine-unity/Assets/Spine/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-unity", "displayName": "spine-unity Runtime", "description": "This plugin provides the spine-unity runtime core and examples. Spine Examples can be installed via the Samples tab.", - "version": "4.3.41", + "version": "4.3.42", "unity": "2018.3", "author": { "name": "Esoteric Software", diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Editor/SpineVisualElementAttributeDrawers.cs b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Editor/SpineVisualElementAttributeDrawers.cs index 86f0fab7c..64f7c368a 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Editor/SpineVisualElementAttributeDrawers.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Editor/SpineVisualElementAttributeDrawers.cs @@ -29,6 +29,7 @@ //#define CHANGE_BOUNDS_ON_ANIMATION_CHANGE +using System.Linq; using UnityEditor; using UnityEditor.UIElements; using UnityEngine; @@ -36,6 +37,109 @@ using UnityEngine.UIElements; namespace Spine.Unity.Editor { + [CustomPropertyDrawer(typeof(UITKBlendModeMaterialsAttribute))] + public class UITKBlendModeMaterialsAttributeDrawer : PropertyDrawer { + + protected UITKBlendModeMaterialsAttribute TargetAttribute { get { return (UITKBlendModeMaterialsAttribute)attribute; } } + + public override VisualElement CreatePropertyGUI (SerializedProperty materialsProperty) { + var container = new VisualElement(); + PropertyField blendModeMaterials = new PropertyField(); + blendModeMaterials.BindProperty(materialsProperty); + + SerializedProperty normalMaterialProperty = materialsProperty.FindPropertyRelative("normalMaterial"); + SerializedProperty additiveMaterialProperty = materialsProperty.FindPropertyRelative("additiveMaterial"); + SerializedProperty multiplyMaterialProperty = materialsProperty.FindPropertyRelative("multiplyMaterial"); + SerializedProperty screenMaterialProperty = materialsProperty.FindPropertyRelative("screenMaterial"); + PropertyField normalField = new PropertyField(); + PropertyField additiveField = new PropertyField(); + PropertyField multiplyField = new PropertyField(); + PropertyField screenField = new PropertyField(); + + normalField.BindProperty(normalMaterialProperty); + additiveField.BindProperty(additiveMaterialProperty); + multiplyField.BindProperty(multiplyMaterialProperty); + screenField.BindProperty(screenMaterialProperty); + + var parentPropertyPath = materialsProperty.propertyPath.Substring(0, materialsProperty.propertyPath.LastIndexOf('.')); + var parent = materialsProperty.serializedObject.FindProperty(parentPropertyPath); + SerializedProperty skeletonDataProperty = parent.FindPropertyRelative(TargetAttribute.dataField); + + Button detectMaterialsButton = new Button(() => { + DetectMaterials(materialsProperty, (SkeletonDataAsset)skeletonDataProperty.objectReferenceValue); + }); + detectMaterialsButton.text = "Detect Materials"; + container.Add(detectMaterialsButton); + + //container.Add(blendModeMaterials); + container.Add(normalField); + container.Add(additiveField); + container.Add(multiplyField); + container.Add(screenField); + + container.Bind(materialsProperty.serializedObject); + return container; + } + + protected void DetectMaterials (SerializedProperty materialsProperty, SkeletonDataAsset skeletonDataAsset) { + if (!skeletonDataAsset) + return; + + SerializedProperty normalMaterialProperty = materialsProperty.FindPropertyRelative("normalMaterial"); + SerializedProperty additiveMaterialProperty = materialsProperty.FindPropertyRelative("additiveMaterial"); + SerializedProperty multiplyMaterialProperty = materialsProperty.FindPropertyRelative("multiplyMaterial"); + SerializedProperty screenMaterialProperty = materialsProperty.FindPropertyRelative("screenMaterial"); + bool hasPMATextures = HasPMATextures(skeletonDataAsset); + + if (hasPMATextures) { + AssignMaterial(normalMaterialProperty, "Spine-UITK-Normal-PMA"); + } else { + AssignMaterial(normalMaterialProperty, "Spine-UITK-Normal-Straight"); + } + + if (!skeletonDataAsset.blendModeMaterials.RequiresBlendModeMaterials) { + additiveMaterialProperty.objectReferenceValue = null; + multiplyMaterialProperty.objectReferenceValue = null; + screenMaterialProperty.objectReferenceValue = null; + } else { + if (hasPMATextures) { + AssignMaterial(additiveMaterialProperty, "Spine-UITK-Additive-PMA"); + AssignMaterial(multiplyMaterialProperty, "Spine-UITK-Multiply-PMA"); + AssignMaterial(screenMaterialProperty, "Spine-UITK-Screen-PMA"); + } else { + AssignMaterial(additiveMaterialProperty, "Spine-UITK-Additive-Straight"); + AssignMaterial(multiplyMaterialProperty, "Spine-UITK-Multiply-Straight"); + AssignMaterial(screenMaterialProperty, "Spine-UITK-Screen-Straight"); + } + } + materialsProperty.serializedObject.ApplyModifiedProperties(); + } + + bool HasPMATextures (SkeletonDataAsset skeletonDataAsset) { + if (skeletonDataAsset.atlasAssets.Length == 0) return false; + AtlasAssetBase firstAtlasAsset = skeletonDataAsset.atlasAssets[0]; + if (firstAtlasAsset.MaterialCount == 0) return false; + + Texture texture = firstAtlasAsset.Materials.First().mainTexture; + bool detectionSucceeded; + return IsSkeletonTexturePMA(texture, skeletonDataAsset.name, out detectionSucceeded); + } + + void AssignMaterial (SerializedProperty property, string name) { + Material material = MaterialWithName(name); + if (material != null) + property.objectReferenceValue = material; + } + + public static Material MaterialWithName (string name) { + return SkeletonGraphicUtility.MaterialWithName(name); + } + + public static bool IsSkeletonTexturePMA (Texture texture, string skeletonName, out bool detectionSucceeded) { + return SkeletonGraphicUtility.IsSkeletonTexturePMA(texture, skeletonName, out detectionSucceeded); + } + } + [CustomPropertyDrawer(typeof(BoundsFromAnimationAttribute))] public class BoundsFromAnimationAttributeDrawer : PropertyDrawer { diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials.meta new file mode 100644 index 000000000..f0b0c8663 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 10a53051ebab05b49aefe40657f93ea6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat new file mode 100644 index 000000000..41e9b0c68 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Additive-PMA + m_Shader: {fileID: 4800000, guid: 9818276b7a7ab2148a8a3ed86c9ac555, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _StraightAlphaTexture: 0 + m_Colors: [] + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat.meta new file mode 100644 index 000000000..2322fada5 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-PMA.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c65757e42907f4b45bad666a80868c27 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat new file mode 100644 index 000000000..d54555939 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Additive-Straight + m_Shader: {fileID: 4800000, guid: 9818276b7a7ab2148a8a3ed86c9ac555, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _StraightAlphaTexture: 1 + m_Colors: [] + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat.meta new file mode 100644 index 000000000..bd9cb3210 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Additive-Straight.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 079fc4bc98abfbd43ac9f3e385474bcd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat new file mode 100644 index 000000000..426d1c9ad --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Multiply-PMA + m_Shader: {fileID: 4800000, guid: ed93aea253bcdc94a84ee09cd390c587, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _StraightAlphaTexture: 0 + m_Colors: [] + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat.meta new file mode 100644 index 000000000..0e2138621 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-PMA.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a8bca9a46bcb36d4a82140b67bfd09c1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat new file mode 100644 index 000000000..8c2f654c7 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Multiply-Straight + m_Shader: {fileID: 4800000, guid: ed93aea253bcdc94a84ee09cd390c587, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _StraightAlphaTexture: 1 + m_Colors: [] + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat.meta new file mode 100644 index 000000000..85fe54814 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Multiply-Straight.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6096595964896114b99904ecc8796e30 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat new file mode 100644 index 000000000..d180dc86f --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Normal-PMA + m_Shader: {fileID: -6465566751694194690, guid: 1baeaee5c1b883a418362717b2ca2fb7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _StraightAlphaTexture: 0 + m_Colors: [] + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat.meta new file mode 100644 index 000000000..4ca9a0113 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-PMA.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac3524f1da29e4047a8b2b09bd7717b0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat new file mode 100644 index 000000000..83702857f --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Normal-Straight + m_Shader: {fileID: -6465566751694194690, guid: 1baeaee5c1b883a418362717b2ca2fb7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _StraightAlphaTexture: 1 + m_Colors: [] + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat.meta new file mode 100644 index 000000000..986b659cb --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Normal-Straight.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f5a60758b7c3be44b646c262eed02f0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat new file mode 100644 index 000000000..c83891d9b --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Screen-PMA + m_Shader: {fileID: 4800000, guid: b0198c7d0f7c55c4992b84a4c94afaac, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MaskTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _EnableExternalAlpha: 0 + - _StraightAlphaTexture: 0 + - _Straight_Alpha_Texture: 0 + - _ZWrite: 0 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _RendererColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat.meta new file mode 100644 index 000000000..6d1739de3 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-PMA.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b3d3e71e32136e448a5eacadc8b9b966 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat new file mode 100644 index 000000000..d00eda6ad --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Spine-UITK-Screen-Straight + m_Shader: {fileID: 4800000, guid: b0198c7d0f7c55c4992b84a4c94afaac, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MaskTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _EnableExternalAlpha: 0 + - _Straight_Alpha_Texture: 0 + - _ZWrite: 0 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _RendererColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat.meta new file mode 100644 index 000000000..234930aef --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Materials/Spine-UITK-Screen-Straight.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fb35db9efd634bd4287a2fef3bbec26a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Runtime/SpineVisualElement.cs b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Runtime/SpineVisualElement.cs index dc2262dc2..0cc628ffb 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Runtime/SpineVisualElement.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Runtime/SpineVisualElement.cs @@ -28,6 +28,7 @@ *****************************************************************************/ using System; +using System.Collections.Generic; using Unity.Collections; using UnityEngine; using UnityEngine.UIElements; @@ -35,6 +36,13 @@ using UIVertex = UnityEngine.UIElements.Vertex; namespace Spine.Unity { + public class UITKBlendModeMaterialsAttribute : PropertyAttribute { + public readonly string dataField; + public UITKBlendModeMaterialsAttribute (string dataField = "skeletonDataAsset") { + this.dataField = dataField; + } + } + public class BoundsFromAnimationAttribute : PropertyAttribute { public readonly string animationField; @@ -48,6 +56,19 @@ namespace Spine.Unity { } } + [UxmlObject] + [System.Serializable] + public partial class UITKBlendModeMaterials { + [UxmlAttribute] + public Material normalMaterial; + [UxmlAttribute] + public Material additiveMaterial; + [UxmlAttribute] + public Material multiplyMaterial; + [UxmlAttribute] + public Material screenMaterial; + } + [UxmlElement] public partial class SpineVisualElement : VisualElement { @@ -58,28 +79,14 @@ namespace Spine.Unity { if (skeletonDataAsset == value) return; skeletonDataAsset = value; #if UNITY_EDITOR - if (!Application.isPlaying) + if (!Application.isPlaying) { Initialize(true); + } #endif } } public SkeletonDataAsset skeletonDataAsset; - [SpineAnimation(dataField: "SkeletonDataAsset", avoidGenericMenu: true)] - [UxmlAttribute] - public string StartingAnimation { - get { return startingAnimation; } - set { - if (startingAnimation == value) return; - startingAnimation = value; -#if UNITY_EDITOR - if (!Application.isPlaying) - Initialize(true); -#endif - } - } - public string startingAnimation = ""; - [SpineSkin(dataField: "SkeletonDataAsset", defaultAsEmptyString: true, avoidGenericMenu: true)] [UxmlAttribute] public string InitialSkinName { @@ -95,11 +102,46 @@ namespace Spine.Unity { } public string initialSkinName; + [SpineAnimation(dataField: "SkeletonDataAsset", avoidGenericMenu: true)] + [UxmlAttribute] + public string StartingAnimation { + get { return startingAnimation; } + set { + if (startingAnimation == value) return; + startingAnimation = value; +#if UNITY_EDITOR + if (!Application.isPlaying) + Initialize(true); +#endif + } + } + public string startingAnimation = ""; + [UxmlAttribute] public bool startingLoop { get; set; } = true; + [UxmlAttribute] public float timeScale { get; set; } = 1.0f; + [UxmlAttribute] public bool unscaledTime { get; set; } + [UxmlAttribute] public bool freeze { get; set; } + + [UxmlAttribute] public bool MultipleMaterials { + get { return supportMultipleMaterials; } + set { + if (supportMultipleMaterials == value) return; + supportMultipleMaterials = value; + if (!supportMultipleMaterials) { + RemoveMultiMaterialRendererElements(); + } else { + Update(0); + } + } + } + public bool supportMultipleMaterials = true; + + [UxmlObjectReference("blend-mode-materials")] + [UITKBlendModeMaterials(dataField: "SkeletonDataAsset")] + public UITKBlendModeMaterials blendModeMaterials = new UITKBlendModeMaterials(); + /// Flip indices of back-faces to correct winding order during mesh generation. /// UI Elements otherwise does not draw back-faces. [UxmlAttribute] public bool flipBackFaces { get; set; } = true; - [UxmlAttribute] public bool startingLoop { get; set; } = true; - [UxmlAttribute] public float timeScale { get; set; } = 1.0f; [SpineAnimation(dataField: "SkeletonDataAsset", avoidGenericMenu: true)] [UxmlAttribute] @@ -133,7 +175,8 @@ namespace Spine.Unity { referenceMeshBounds = value; if (!this.IsValid) return; - AdjustOffsetScaleToMeshBounds(rendererElement); + for (int i = 0, count = rendererElements.Count; i < count; ++i) + AdjustOffsetScaleToMeshBounds(rendererElements.Items[i]); } } public Bounds referenceMeshBounds; @@ -144,21 +187,17 @@ namespace Spine.Unity { return state; } } - [UxmlAttribute] - public bool freeze { get; set; } - [UxmlAttribute] - public bool unscaledTime { get; set; } - + /// Update mode to optionally limit updates to e.g. only apply animations but not update the mesh. public UpdateMode UpdateMode { get { return updateMode; } set { updateMode = value; } } protected UpdateMode updateMode = UpdateMode.FullUpdate; protected AnimationState state = null; protected Skeleton skeleton = null; - protected SkeletonRendererInstruction currentInstructions = new();// to match existing code better + protected SkeletonRendererInstruction currentInstructions = new(); protected Spine.Unity.MeshGeneratorUIElements meshGenerator = new MeshGeneratorUIElements(); - protected VisualElement rendererElement; + protected ExposedList rendererElements = new ExposedList(1); IVisualElementScheduledItem scheduledItem; protected float scale = 100; protected float offsetX, offsetY; @@ -169,8 +208,33 @@ namespace Spine.Unity { RegisterCallback(OnAttachedCallback); RegisterCallback(OnDetatchedCallback); - rendererElement = new VisualElement(); - rendererElement.generateVisualContent += GenerateVisualContents; + AddRendererElement(); + } + + protected void SetActiveRendererCount (int count) { + if (count == rendererElements.Count) + return; + else if (count > rendererElements.Count) { + int oldCount = rendererElements.Count; + int reactivateCount = Math.Min(count, rendererElements.Capacity); + for (int i = oldCount; i < reactivateCount; ++i) { + EnableRenderElement(rendererElements.Items[i]); + } + rendererElements.EnsureCapacity(count); + for (int i = reactivateCount; i < count; ++i) { + AddRendererElement(); + } + } else { // new count < old count + for (int i = count, oldCount = rendererElements.Count; i < oldCount; ++i) + DisableRenderElement(rendererElements.Items[i]); + } + rendererElements.Count = count; + } + + protected VisualElement AddRendererElement () { + VisualElement rendererElement = new VisualElement(); + int index = rendererElements.Count; + rendererElement.generateVisualContent += (context) => GenerateVisualContents(context, index); rendererElement.pickingMode = PickingMode.Ignore; rendererElement.style.position = Position.Absolute; rendererElement.style.top = 0; @@ -180,6 +244,26 @@ namespace Spine.Unity { Add(rendererElement); rendererElement.RegisterCallback(OnGeometryChanged); + rendererElements.Add(rendererElement); + return rendererElement; + } + + protected void EnableRenderElement (VisualElement rendererElement) { + rendererElement.enabledSelf = true; + rendererElement.RegisterCallback(OnGeometryChanged); + } + + protected void DisableRenderElement (VisualElement rendererElement) { + rendererElement.enabledSelf = false; + rendererElement.UnregisterCallback(OnGeometryChanged); + } + + protected void RemoveMultiMaterialRendererElements () { + for (int i = rendererElements.Capacity - 1; i > 0; --i) { + rendererElements.Items[i].RemoveFromHierarchy(); + } + rendererElements.Count = 1; + rendererElements.TrimExcess(); } void OnGeometryChanged (GeometryChangedEvent evt) { @@ -187,7 +271,8 @@ namespace Spine.Unity { if (referenceMeshBounds.size.x == 0 || referenceMeshBounds.size.y == 0) { AdjustReferenceMeshBounds(); } - AdjustOffsetScaleToMeshBounds(rendererElement); + for (int i = 0, count = rendererElements.Count; i < count; ++i) + AdjustOffsetScaleToMeshBounds(rendererElements.Items[i]); } void OnAttachedCallback (AttachToPanelEvent evt) { @@ -212,7 +297,7 @@ namespace Spine.Unity { #endif if (freeze) return; Update(unscaledTime ? Time.unscaledDeltaTime : Time.deltaTime); - rendererElement.MarkDirtyRepaint(); + MarkAllDirtyAndRepaint(); } public virtual void Update (float deltaTime) { @@ -225,6 +310,7 @@ namespace Spine.Unity { if (updateMode == UpdateMode.OnlyAnimationStatus) return; ApplyAnimation(); + PrepareInstructionsAndRenderers(); } protected void UpdateAnimationStatus (float deltaTime) { @@ -234,7 +320,6 @@ namespace Spine.Unity { } protected void ApplyAnimation () { - if (updateMode != UpdateMode.OnlyEventTimelines) state.Apply(skeleton); else @@ -264,8 +349,16 @@ namespace Spine.Unity { }; // Set the initial Skin and Animation - if (!string.IsNullOrEmpty(initialSkinName)) + if (!string.IsNullOrEmpty(initialSkinName)) { +#if UNITY_EDITOR + if (!Application.isPlaying) { + if (skeletonData.FindSkin(initialSkinName) == null) { + initialSkinName = "default"; + } + } +#endif skeleton.SetSkin(initialSkinName); + } string displayedAnimation = Application.isPlaying ? startingAnimation : boundsAnimation; if (!string.IsNullOrEmpty(displayedAnimation)) { @@ -276,7 +369,8 @@ namespace Spine.Unity { } if (referenceMeshBounds.size.x == 0 || referenceMeshBounds.size.y == 0) { AdjustReferenceMeshBounds(); - AdjustOffsetScaleToMeshBounds(rendererElement); + for (int i = 0, count = rendererElements.Count; i < count; ++i) + AdjustOffsetScaleToMeshBounds(rendererElements.Items[i]); } if (scheduledItem == null) @@ -285,7 +379,14 @@ namespace Spine.Unity { if (!Application.isPlaying) Update(0.0f); - rendererElement.MarkDirtyRepaint(); + MarkAllDirtyAndRepaint(); + } + + protected void MarkAllDirtyAndRepaint () { + for (int i = 0, count = rendererElements.Count; i < count; ++i) { + var rendererElement = rendererElements.Items[i]; + if (rendererElement != null) rendererElement.MarkDirtyRepaint(); + } } protected void UpdateAnimation () { @@ -301,11 +402,33 @@ namespace Spine.Unity { } if (referenceMeshBounds.size.x == 0 || referenceMeshBounds.size.y == 0) { AdjustReferenceMeshBounds(); - AdjustOffsetScaleToMeshBounds(rendererElement); + for (int i = 0, count = rendererElements.Count; i < count; ++i) + AdjustOffsetScaleToMeshBounds(rendererElements.Items[i]); } Update(0.0f); + MarkAllDirtyAndRepaint(); + } - rendererElement.MarkDirtyRepaint(); + protected void PrepareInstructionsAndRenderers () { + MeshGeneratorUIElements.GenerateSkeletonRendererInstruction(currentInstructions, skeleton, null, + null, false, false); + + int submeshCount = currentInstructions.submeshInstructions.Count; + PrepareUISubmeshCount(submeshCount); + + if (supportMultipleMaterials) { + SetActiveRendererCount(submeshCount); + if (supportMultipleMaterials) { + for (int i = 0, count = rendererElements.Count; i < count; ++i) { + AssignBlendModeMaterial(i, currentInstructions.submeshInstructions.Items[i].material); + } + } + } else if (rendererElements.Count > 0) { + if (blendModeMaterials != null && blendModeMaterials.normalMaterial) + rendererElements.Items[0].style.unityMaterial = blendModeMaterials.normalMaterial; + else + rendererElements.Items[0].style.unityMaterial = null; + } } protected class UISubmesh { @@ -317,40 +440,58 @@ namespace Spine.Unity { } protected readonly ExposedList uiSubmeshes = new ExposedList(); - protected void GenerateVisualContents (MeshGenerationContext context) { + protected void GenerateVisualContents (MeshGenerationContext context, int rendererElementIndex) { if (!this.IsValid) return; + if (!context.visualElement.enabledInHierarchy) return; - MeshGeneratorUIElements.GenerateSkeletonRendererInstruction(currentInstructions, skeleton, null, - null, - false, - false); + int submeshesPerRenderer = supportMultipleMaterials ? 1 : currentInstructions.submeshInstructions.Count; + int submeshOffset = rendererElementIndex; - int submeshCount = currentInstructions.submeshInstructions.Count; - PrepareUISubmeshCount(submeshCount); - - // Generate meshes. - for (int i = 0; i < submeshCount; i++) { + meshGenerator.settings.pmaVertexColors = false; + for (int i = submeshOffset; i < submeshOffset + submeshesPerRenderer; i++) { var submeshInstructionItem = currentInstructions.submeshInstructions.Items[i]; UISubmesh uiSubmesh = uiSubmeshes.Items[i]; meshGenerator.Begin(); meshGenerator.AddSubmesh(submeshInstructionItem); - // clipping is done, vertex counts are final. PrepareUISubmesh(uiSubmesh, meshGenerator.VertexCount, meshGenerator.SubmeshIndexCount(0)); if (flipBackFaces) meshGenerator.FlipBackfaceWindingOrder(); meshGenerator.FillVertexData(ref uiSubmesh.verticesSlice); meshGenerator.FillTrianglesSingleSubmesh(ref uiSubmesh.indicesSlice); - + var submeshMaterial = submeshInstructionItem.material; - Texture usedTexture = submeshMaterial.mainTexture; - FillContext(context, uiSubmesh, usedTexture); } } + protected void AssignBlendModeMaterial (int rendererElementIndex, Material originalSubmeshMaterial) { + if (skeletonDataAsset == null) return; + VisualElement rendererElement = rendererElements.Items[rendererElementIndex]; + if (blendModeMaterials == null) { + rendererElement.style.unityMaterial = null; + return; + } + BlendModeMaterials requiredBlendModeMaterials = skeletonDataAsset.blendModeMaterials; + if (!requiredBlendModeMaterials.RequiresBlendModeMaterials) { + rendererElement.style.unityMaterial = blendModeMaterials.normalMaterial; + return; + } + Material material = null; + BlendMode blendMode = requiredBlendModeMaterials.BlendModeForMaterial(originalSubmeshMaterial); + if (blendMode == BlendMode.Normal) + material = blendModeMaterials.normalMaterial; + else if (blendMode == BlendMode.Additive) + material = blendModeMaterials.additiveMaterial; + else if (blendMode == BlendMode.Multiply) + material = blendModeMaterials.multiplyMaterial; + else if (blendMode == BlendMode.Screen) + material = blendModeMaterials.screenMaterial; + rendererElement.style.unityMaterial = material; + } + protected void PrepareUISubmeshCount (int targetCount) { int oldCount = uiSubmeshes.Count; uiSubmeshes.EnsureCapacity(targetCount); @@ -427,6 +568,7 @@ namespace Spine.Unity { } void AdjustOffsetScaleToMeshBounds (VisualElement visualElement) { + if (visualElement == null) return; Rect targetRect = visualElement.layout; if (float.IsNaN(targetRect.width)) return; diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/PaneSettings.asset b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/PaneSettings.asset index a5c47e745..cb5024518 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/PaneSettings.asset +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/PaneSettings.asset @@ -12,10 +12,12 @@ MonoBehaviour: m_Script: {fileID: 19101, guid: 0000000000000000e000000000000000, type: 0} m_Name: PaneSettings m_EditorClassIdentifier: - themeUss: {fileID: -4733365628477956816, guid: 6fd02a62ce112e547aa19d3af6f42b02, type: 3} + themeUss: {fileID: -4733365628477956816, guid: 979e15cdd57e0ce42b2b97c7a4361084, type: 3} + m_DisableNoThemeWarning: 0 m_TargetTexture: {fileID: 0} m_RenderMode: 0 - m_WorldSpaceLayer: 0 + m_ColliderUpdateMode: 0 + m_ColliderIsTrigger: 1 m_ScaleMode: 1 m_ReferenceSpritePixelsPerUnit: 100 m_PixelsPerUnit: 100 @@ -32,12 +34,19 @@ MonoBehaviour: m_ClearColor: 0 m_ColorClearValue: {r: 0, g: 0, b: 0, a: 0} m_VertexBudget: 0 + m_TextureSlotCount: 8 m_DynamicAtlasSettings: m_MinAtlasSize: 64 m_MaxAtlasSize: 4096 m_MaxSubTextureSize: 64 m_ActiveFilters: -1 m_AtlasBlitShader: {fileID: 9101, guid: 0000000000000000f000000000000000, type: 0} - m_RuntimeShader: {fileID: 9100, guid: 0000000000000000f000000000000000, type: 0} - m_RuntimeWorldShader: {fileID: 9102, guid: 0000000000000000f000000000000000, type: 0} + m_DefaultShader: {fileID: 9100, guid: 0000000000000000f000000000000000, type: 0} + m_RuntimeGaussianBlurShader: {fileID: 20300, guid: 0000000000000000f000000000000000, type: 0} + m_RuntimeColorEffectShader: {fileID: 20301, guid: 0000000000000000f000000000000000, type: 0} + m_SDFShader: {fileID: 19011, guid: 0000000000000000f000000000000000, type: 0} + m_BitmapShader: {fileID: 9001, guid: 0000000000000000f000000000000000, type: 0} + m_SpriteShader: {fileID: 19012, guid: 0000000000000000f000000000000000, type: 0} + m_ICUDataAsset: {fileID: 0} + forceGammaRendering: 0 textSettings: {fileID: 0} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor.png.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor.png.meta index 9a9073716..451bc791b 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor.png.meta +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor.png.meta @@ -121,7 +121,7 @@ TextureImporter: mipmaps: mipMapMode: 0 enableMipMap: 0 - sRGBTexture: 0 + sRGBTexture: 1 linearTexture: 0 fadeOut: 0 borderMipMap: 0 @@ -166,7 +166,7 @@ TextureImporter: spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 - alphaIsTransparency: 0 + alphaIsTransparency: 1 spriteTessellationDetail: -1 textureType: 0 textureShape: 1 @@ -181,7 +181,7 @@ TextureImporter: swizzle: 50462976 cookieLightType: 0 platformSettings: - - serializedVersion: 3 + - serializedVersion: 4 buildTarget: DefaultTexturePlatform maxTextureSize: 2048 resizeAlgorithm: 0 @@ -193,8 +193,8 @@ TextureImporter: overridden: 0 ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 1 - - serializedVersion: 3 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 buildTarget: Standalone maxTextureSize: 2048 resizeAlgorithm: 0 @@ -206,11 +206,12 @@ TextureImporter: overridden: 0 ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 1 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] outline: [] + customData: physicsShape: [] bones: [] spriteID: @@ -220,6 +221,8 @@ TextureImporter: edges: [] weights: [] secondaryTextures: [] + spriteCustomMetadata: + entries: [] nameFileIdTable: {} mipmapLimitGroupName: pSDRemoveMatte: 0 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Atlas.asset b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Atlas.asset index 23c98a039..0d310ca1b 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Atlas.asset +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Atlas.asset @@ -12,6 +12,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a6b194f808b1af6499c93410e504af42, type: 3} m_Name: raptor_Atlas m_EditorClassIdentifier: + serializedMaterialOverrides: [] textureLoadingMode: 0 onDemandTextureLoader: {fileID: 0} atlasFile: {fileID: 4900000, guid: 93456ae5f468800499b80d92a05282f3, type: 3} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Material.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Material.mat index 6b6a6c377..5cb830f27 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Material.mat +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/Raptor/raptor_Material.mat @@ -11,7 +11,8 @@ Material: m_Shader: {fileID: 4800000, guid: 1e8a610c9e01c3648bac42585e5fc676, type: 3} m_Parent: {fileID: 0} m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] + m_ValidKeywords: + - _STRAIGHT_ALPHA_INPUT m_InvalidKeywords: - _USE8NEIGHBOURHOOD_ON m_LightmapFlags: 4 @@ -31,6 +32,7 @@ Material: m_Ints: [] m_Floats: - _Cutoff: 0.1 + - _Fill: 0 - _OutlineMipLevel: 0 - _OutlineOpaqueAlpha: 1 - _OutlineReferenceTexWidth: 1024 @@ -38,7 +40,7 @@ Material: - _OutlineWidth: 3 - _StencilComp: 8 - _StencilRef: 1 - - _StraightAlphaInput: 0 + - _StraightAlphaInput: 1 - _ThresholdEnd: 0.25 - _Use8Neighbourhood: 1 - _UseScreenSpaceOutlineWidth: 0 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes.meta new file mode 100644 index 000000000..d6329b5af --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37b659b9642ed194497999a637a62c17 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt new file mode 100644 index 000000000..d45879f2b --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt @@ -0,0 +1,5 @@ +whirlyblendmodes.png + size: 512, 512 + filter: Linear, Linear +whirly + bounds: 2, 2, 256, 256 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt.meta new file mode 100644 index 000000000..d7ba3bfe3 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.atlas.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d4fe1661c50e86b4a951b11855a4f44f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json new file mode 100644 index 000000000..553551842 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json @@ -0,0 +1,74 @@ +{ +"skeleton": { + "hash": "acq/cF9RZNM", + "spine": "4.3.39-beta", + "x": -252.71397, + "y": -232.55397, + "width": 456.70795, + "height": 360.68793, + "images": "./images/", + "audio": null +}, +"bones": [ + { "name": "root" }, + { "name": "_rotation", "parent": "root", "color": "abe323ff" }, + { "name": "additive", "parent": "root", "x": -37.18, "y": -104.42 }, + { "name": "multiply", "parent": "root", "x": 75.86 }, + { "name": "normal", "parent": "root" }, + { "name": "screen", "parent": "root", "x": -124.58 } +], +"slots": [ + { "name": "normal", "bone": "normal", "color": "ff9100ff", "attachment": "whirly" }, + { "name": "multiply", "bone": "multiply", "color": "905e9eff", "attachment": "whirly", "blend": "multiply" }, + { "name": "screen", "bone": "screen", "color": "0670c6ff", "attachment": "whirly", "blend": "screen" }, + { "name": "additive", "bone": "additive", "color": "0670c6ff", "attachment": "whirly", "blend": "additive" } +], +"constraints": [ + { + "type": "transform", + "name": "rotation", + "source": "_rotation", + "bones": [ "additive", "multiply", "normal", "screen" ], + "properties": { + "rotate": { + "to": { + "rotate": { "max": 100 } + } + } + } + } +], +"skins": [ + { + "name": "default", + "attachments": { + "additive": { + "whirly": { "rotation": -0.06, "width": 256, "height": 256 } + }, + "multiply": { + "whirly": { "rotation": -0.06, "width": 256, "height": 256 } + }, + "normal": { + "whirly": { "rotation": -0.06, "width": 256, "height": 256 } + }, + "screen": { + "whirly": { "rotation": -0.06, "width": 256, "height": 256 } + } + } + } +], +"animations": { + "animation": { + "bones": { + "_rotation": { + "rotate": [ + {}, + { "time": 0.33333334, "value": -120 }, + { "time": 0.6666667, "value": -240 }, + { "time": 1, "value": -360 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json.meta new file mode 100644 index 000000000..e552ab679 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9e190d520b56f3c4d823981b48c3e131 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.png b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.png new file mode 100644 index 0000000000000000000000000000000000000000..70194960f1b87d4202340314855368b9aa68c38c GIT binary patch literal 87165 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ⅆ8AE78A6J+aCAfhiGB zdb4XXuy^>-)}B*3#3SrwzPub9o>gE#uDIHPMbBBe>c5tpJj#uPuJ}O#xaCSX#uZBz zq6BKn!NbZ)s3A}4*|{3-cuA;z|5;pIA-Da6qmmj|OU#XQSGx}O#6e!zHX3N6yQ%e4pU4j1=jeF(K)nyBtZ!$+EE-}%69)a$Z3gMrRL z>-qm=IW&v8`GyT@=8RHZ#p+sQ(@4{|pslTM7cR0M!>!LY%l_|hPn)=iPS=#&lSL{# z*GK_~USD`<##V1UEgyp0nHDhhnFK~qD*a!=mB6|_E679+0QY0ol_9EWiz5G$XA_ZF29N+QN4h-cjHjWe4%eDFGlr%44AW zdXzC#EXC&hhYj{*HiRxoTLaz4%n>4DUa)<#Y!RXSEK*-V@2T!c6=NQz?dcx=oxyF2 zddO+IN>2TOc01$Q?%=}?gNxW4(MLR5hcn(BB3H76$R#F`vB4i|U3VnCRE=VT2Jyt`AYz$tK_^R=;GJslY__9uQl zOB}r+dkY*s#lfuCSs$)`GNw%wlOCO46J=Jep-r+(16rNckJU<0ascs)b82|+VT`7V zOKLuv72MKf`MxPmVg$L-A5_L?AbcK`7XSA}DOhWBQn2HFkbY()z#+DLs20injK2)= zi;t7>ed-f^B%DD#!$*ui`C*MGPV!&sFY{qNJEl5jJJ3@s1eIx-e9%I@N<((6&Qh@p z!BM{fy!CD(aMAMwA@t2tY%eK3aG&3gl6TXV;KCWjQ+|(UE(?-Rgr~h6`mRv*FCPmB z91vq16|8;zI-BXu2?QokU!f>W%Z_w~I_e;hgQ5G`R%(R<`)Oe61l(+WT}lN%4L5_T zxn)1YJ>A5&lAH^VOglf-yn~Fib?}-Q0su|^;Go;=!FgToxkFPsQHu|7>;1(6OjH4C z%=&UW4F_*f&nrnFUO_p_1Jh=kVZTpakJ?m~klj4CARWSxRs=lD71vg!*pr^Hi;6l! z&+W+eoD^1eZd4H56(1I9SzO67WjoLfqjaBU)7nO(H0G1~29GGyzGj7QQ#=hH!HrqoC`UsZiD+sA4o zh>pN+d9`DTNg>)_#>T(c9QXWn+}eEt(+^q%K>H^hM;uYvjp32R{NVcNL2f{ zIa*8U%WAb*iz_#ZACqd5zRturKL5l|o&{4!LC6lW$UTj)E+OA`ss!l1Z9CpU?T8_U z;I=kDj(}p5CaSjcGKpPN3svQd8CD-}?-0R~hYh~W^EW(iD@WZ51A%Oh3X%myoK`+^7hL{k5Erb@sk+YXjcffML z+Xf~2|NYb=mz=oU8myM61MFE&oaQ4Q!!XvWgFUY`@zA;ihS=DCKfyag=-c#T1J{&~0{;>kre!fS)S?wxVXT7GxW8%*tG z3&Q-SRoTVe6KOV`k^Y!Wy#G)DEI&Xg;o>+tof9Ptgh=5ffB()-8x&+yf$d&g=yEg% z>01Z%Yyfbc0O?;Wftf-_Ft92j^1o!~o7@2%Vc@8eENcGpY4jzFQyS+b{rfwT^?+r4 ze+?^W8~&yOmoM_Oqsue7ng{#~x&0u(6g1+}55x5}Ck=-}F~zedtMS0K|wnO9FS@r8u77R8?8{&Qhka6#80ZtZC*8J<9|~&HiLB>1WJSa}V?K z`k8}=`k43SK>I97R1y3Xho6dzao+!Ob^aST{q=Gy2miFhWz!uK$L)aPF=y3abqzy@Y<_2=$oiyh;su8d+UiRF1@zg0y!nXqaH=`@$0h`?J|$WMV?a=#IuFX95!l`NpwS{byUr>)s-m-} z;+8xC4jX^!{>4w8J!AELr`s1UMy5?WlC;Y_)$X>BB>=>tZf-wt5Ku1tLCL6iK-E~A(3LRexQ%|E z3fj0PP_3?@29E;=oV3r{ZJTu%1Mgb4bOucY18y_Sw}1FU4AzD61)s>QRk?-eNK3{& zgWxl1y_DjLF{e^RZZxz0P5J_2kjO)u1U3(Wf}gy^jSvILcI^ z%`cIrnjbn@FoblVj(@HKcyOm>DAlGl$=33yO}93>rg0^@6cF0$KZZxDY4+R;l<@F+ zvNiB#VC>QzhLLXN`{|yZTMB4J8%btkF7Phwzj#drM*Zv`f%HF3LwxY4cln$7(qvkG zmS2qD(bA^s`Y+E>$uSF{)#q?aFcPB}UM*q^ghp8?5I6|eMG_D`> zvQ+hBe~vB$e=%2yEIqV|=%dqTwoDJTvKyNuGl1;=3|5|zH|M=nDNk_A)_aYL4#P9` z^_7l1kvagBPspR{$@J9ZH5(KievkaSZ4VrY?n-OX)2;Yy5o3Q_nNPiIot;RI^vC2rsZ)HgkU zI{wpd6C%LP>J;^Be4z(ouL?uI`dM{ACAL^%(}_=f)v4k79~3g7mwpBke6Vc^NH8{5 z!(>73IJO=Ii0vx~*^qU9yUy7Y>Uj3$)D*jh z7tBcv{7};2_WWgF4m|!HqHcrZf=0{yrf~%{b!~F50?WyGM0I09XF;Ti18%J~U~7+L z-F_X^@c&_;hT*Hf6cQg;MYEAgheL63>@yMnndb^DB0@*l$yuZX5t9VcORfw=vjWm= z-BTmN_VzU4aWkC&$<$c|ne}aps`u|$ zVAXa9X_W(}T6;eq92XaM}2q1#`z>3OK$R)nwtXq1Gf*>2>7aV|ETvdu(Rbqd#qtFRmcSL1# zRFH0_3P$~b!Rum{;#WQv7)?!Qj^gL~u6WHse%D9XniKIwxg2Pg;qB746xLk@toEmy zrNay;B0X{!AlZc`0io}72;Iq=;(wva~iXzlf%1doi%@*qTVF8UZnxAbV z@@3+@0}a-{TK?Iq7r%aY^KJ0&{r28*Bk?1$PT(m-M3ud~hrvQVm5;Xa)q^7`@Rb=t zXd2fTRDXlqW-~HB1{FNvhFAL$C-*;5+PutveD*ZgMuJM^?jg@&=Er!&g(H=|{afnA zokK$^q!2WmgDU${;9&2N(lxz>`3Wxggg)oi1`(NEqiF&I3e$)nIXEBQTJ_LU&(1cl%z0^#D= zn9h&}$)J&ofFoL>>-d>xmV6Sk=-H~yTStl&PlKsD(2Ki>Nd+P;54}41l7n~`GT+{w?E$>mmeD6{RHm0+wE0%6%>A^Iw@sa>S zmRlUcxY0P<@)B5ZJmkKtzsBHU!ual#A7CT;S*$o2l%h@~&S*KNtDt1WM+?!hUWY88 z_A*`e^&d}L^=Gl4+CP|qUL*igs92vv`Li?8PXFRg6K)6B#Qe490; z=ctT@Jx1MiUdaJx;K2>#XZTHN1E@A#<76CrNS?E+MjEyeCo&$Vj%{hZ#HBu-D-S>i z&-k_Zx2+z8I&onr)%K42d-;4reU9^HcV4mx{oLEk0dSN{c`sQ)&Uf&myM-jSTD_;& zY%c->6%^V{f%PiyP^96nS7phS{tcgX7l$NtFc>!3#ra3I!bBn{{mKUlvArEC@Xg9{ z%w=}6Z+LoI)#rmiC)5_sYo={#(eLF!SC$ZoO%QO7RdN?ci})2a7ohht=}df}68Zp^ zrN<4k0$${!kU1_3ZQGN-DI?(uus^<&g{&GdY3du^p`tH-KD7E$P3{x*^SgY! zKgtqboRI7}Wt^^<<|^<@0AhKn0cbc_Q?6&j!q?2S2P^%^2*gy-CbWUuLAdcVsB zM<13CcdnV4Wg~kw+fbHA2G9OMHLqONjmJv?QQ)K7Lw<%nB(g4>4j@P~Cel$~@i@~A z0~m#nGA6l>Xfxv>~1r^k%^^hkr#bV50NJrxk>uB_ycGvhDV z=vM^EQf!B@_xt0l2Gie29K}C?u^75B+2wOv`Gwy{AvOc(7fT^{a5#!By%ciO&0t~M zga7WVM6agaJ_5VEz*PsJYxq(y6Y;j-1qBa2+~C38P>cuitOvliff_c#NH8}m^mj`* z|0w*j60kV}wS_aoUYnQ#?dAlGFSu(m%+u)l!g#bsFB~d)oTMWdrQ&@@;f#|d(Brme zr~9C|7PVutI`%CexYXUb>}S~$Jw=bX+v5u>*p`aXZp$l^MY8JJQ5x^=zsZ2Rz6@ALW58qe(qP^R)a#x|+ej5uNbY#-RYsy0w zxAz_S+#v0ms9F%A!eFSO&HR4$kOxQUg%Wp`u3Q7CKj~#3=+dV}+U_o- zc3tBfMzBvdMAZJjs~GyhRYwZMFk2*Xf+1FT47Q#n6JdQp_ioApBJxsL-IS1G{VCdTPI$n@Y%I81@Cyu2BmuX9XpZ@Fh>M`}U@Pb6a zjXvi~94JDCV(E9cPVfDIGIO3Fx7SNgedn2WYJQ&Jfob$uslFrm`h)KzQ4V%V+1|#VcXsJ`(gm1P$zYI zH(*{#so{5^a?A-N44`|Sem-E)R;7*C)IB`ME&yPJlPFP@j;_h@#C~4F$+=SKDjPkZ z6tG!EX{PYQLqnP4sP??}+4PXu&oJfQkB-0H-`^t}%TOxZ*}-A-jie-;$c(~z?JZQr zb(SBle5IcL-P4fr7zo|-g)3!x8S-@dWAyW~)#bkMJs#MA?cA6?`uNdE&OmPv*B%9V zaiA;}5TvyHZ&|j>aAtQB|L-?gK;gviRDr&mM=vpl zh}7&uF)_Tf+XW?IF_eJE1*w8vIx*afXz!z^bbZ}$C-n(nWB!YTy(S9^SbHUIwV{Z} z&K|*S|EBHRw2QN;$0Y=s@WZ$B4sPW$NA#8DcY=|T^RxfNUHbk4z0LH#2*|C<4c4H! zjumzR)w6Z87p?UbGUP2Dmw~}IqQ-(?!{$-#6heO~x5%(Fejmc$qtk~_A#n&1C0rsjz|OS?0m&z<6j z>yy|(C1_AOR+p!r#5A-(|EhL8s5;0GCzyQz4CK^54oYm3*!6ggE-1vL;Dz1~_31 zxiEZFHr*1+O@jaQ~SW{LwS;qe8* zql3JTPi(c5*dJUvvb)mlM1KO1(Gl|yN#jG^>Q<<4ZUgX4nXJkivog(B5lPsFZc07K?79LrlcgZhLfL^D z0%7e(Js(;w+m6TDVX8|zE60l7dy^q3oi7y-^E^Phl>>&tiU~zmztmw);0x5<&j?yC zJQCOrl%d2IvbhQ?f+q>z&yTrDvCp_+YV&txW5Rq3Rav;o!Ol-NkPuOf3ow%E%>XXA zgq?2gt!~eEMIm32Np~dA^_~>=sR{f?H)ZIYqhBj;miif|{F#lWR5#16Y|m*@9YZ1~xyJ( zHj?Nxv2G;Ri6r(O0J8Sj&zY?J3wrrrV!st6cq2Opk$N1t1_Qs|+VLoGHQ!@DtnV^7v?-bZD{DOR0k_xOJa>a7!;|1X}ng)s6+HuqPS0N8$AON)H+d|>#pm;qH6 zQv8CnpN?eIU5F27zH`u*BDDl+s};3@S5qm3m7?j6Q~EZ@RwVtR5;Hiezd4yOy2o60 z1yL`mj6idM-ak|rSf3^(c8&j4eEA`zdLs=3o8NUsBqi(pDI%lX&m=NFpEsbog{Mgg ze*_1xQ6kY$?*=Q>`^i5!w5ZK+^S-VD)%1_joA?SI4Ct=NeE|P#XVK>-r24rLK$7k} zg`E+JA2XrxjP#!=+W;;(c*F1^ z$ocshnTvi!x$yn+hfSo<6kBWv!Bs`|_q6;DtK2VCU{7lLYJ^FeC#gPC_j@<8yt^Ba zKO(Z*l7~Y^CvDr4;yzAElX{k(BHCE{VZN`LSQyO;HwKN%h$#9g((XKX@_T#h>dfnV zgB!f}aJ?7_o(xi@7lT^-b`4ao(qbj<$9jL-Mp6oBgwcu=5wJx+ayhnhBuYFwZ);i* z(5~pT{^)j)P%m2j(GwddO*S{DN!kDK-}=0vEkGATfp;#R!)FQ5{;RiuPT{Aj;fsOd z1^tnpJE6;I0c8CBolx5dX5mrHwRPgb5zmp&vQ_E6108<{w z9y4QhjP8p%LI6g>?cp;<$m{#K^7+$Ge5C2qYZxNdo^PeJb#iLQ2CxB9$2krCDz$n`I@`6-9tmG#y zT}%xxjE!g96s{4|E~NH#SlpQ$_;DRjCDXYBCC>@$fBR;y!VxUWCJjst zFkQQP{y>OG8jgjJ9%1-pt`nolKj~m(HlgrZiMVgtfvxxYF@;imsasvz>XX>t#JkHP z16yNbaiPm6M+>ROIhzBF3;gw5%)hq~!bDX_LsBNyJKZ%g=76h~d32t&454 z)K%)K?>i@LAo>NwqY`vCsA&MRFUUP6DUZ3fLgfJch=}lDUfqO4$Av6AMrVG;ao6_> zsD zL2&y(y`5)%YyqaY^b5~rF!lR)?NTC``je(UzpMIMe)FtG1XCw4>V$jMS-Ef2?){j4 zCxFhE=-a$Z`@jWc`^Aq>StNZ{@ zuHj4fkIzkwixnff9d5IO2p_==e&I|!`s*071+76Z3JqCDrV7sF>Qs&f!C_H7ZNt$1 z77Xzw%UtpnEeN+rMSs`{3jy!=4#Tbk3(sdl?u z(jW85`CmKxU&Z|*6;h*4&ylWJUNCAXPENr0G`zdL_v82PsD8jdY8V;qqSpPKAxX&W zEYmVInFH*g6j{n;rfFsVMjDyH$&cE$M1EaeChbza)hxKsd^-2u^=@iVyZ{UJ-O7#U zAItb3UT)g~#nZ&2HH>lpg@#wSo}aqgmC{$%8^wFJUOzrMt>IUH_$fle{B6{M-~oEP zm`juz&foCF#kEijQ41{n%{%M+1e02%TG@PwmwY*s&i-u4N1FWnt}k-5)-!Z%q>&3A z!vCs)4zc|ees8zNi6M3>`zSKxsXG_riZ(6{64vtHeR`J;rQqp>a(}ttgRTaJq>5;I zoFHn$2+pToI8;9?nToliGZaq%yjP}Zbv=qsfNqe3KQ~p4XIe zkK+uMp%M=GnD+gVH=%n>mPv2T3`^kPh&D(Dm?>fIbHQ!LukBmXqY0nK)Pf|dNtqXR z)^}MbB_HP^OIBEO-yTWDN2vtq8I;hsgkzMZUi{p#frTChX;ZfR^z4f8Q?4iZQgQFi zX9juGh1RgkwJb%hLXuH#b)@+sJm7DpO?r@15I*$OPk!upx*TJwnqK8VStG)<0Kd1#X~v_nc1 zyJNa3otDw&$q}+ypkyC!W3uPN^1$m&6BM!0mT7X};hsK<2w9tiGHUY` zP)A){6{mlgww9WfObWW)wQ!( zOoRnI5?GjXJtsERL`Z`zJ?p`5I4}1GE0@I#0wwQzTwtR+ZNA&@`Ov&T2b_m=RXE>y zeW{yr7n|#LAq#JKb~=uL1UrW9ZE_x2oe-q2pNp z$ZhaTG5y)dB1^D+!8&<)7u|U1abz_GD<6W-y-Mt$u?>S#5E?laxI?^@Ks)bQB@qeO z(b@SX_e7JtB2}qF1;P`YrR}nYG-}j=hD{&qDkWBT95<>Ug$O0t%Gs_X%Wa$2L1z>h zWP?LlxmNI9030Dkt2p`{Va;4`?xP{4Mf3X%;LBT{DjLJeI#}`XSuCpahJaDU7@|YP zfP-%SGC>B8?nETwd4SXV2h8=})5$6peAN6U%nNvK-OSey?bpQsA2dJX6^^&?S*HSb zu3}uWIIueFt1FRvk*;7YSr?v~!FcY9mm|$41a~?h~0Hf2$=`++kV7!G;b$gz?GffXbwO_K4#KmCt2?4=|(|IjZ*n#vIIl zgyXKn8G;m%Bk$j`$EK=aKedSiRl4{%;xuuHz`=4xAFQ1_LWP5+UnQ&H!yvKl9a|Aq zjx@=3y>T`$!b3>lMj!q{E

0eK@Mr~mxLqG8D%J|B+52Iila}9n3#0CbQST9)%G~AX*PunQWzyI%AaFzL zxp@$NpOGMRh5?wCKl!Zg4x)kJ*bVzp?l_v)d%$(0YQ2srPq3b>e4FhSKuD*S$n?_h zOo9o&7y`tFkILijd0F0a#dyQ*^0Rs9@fYc|0YdFv`DTObbxClvFq5MIdJif#qZi(8 z(G$*vbmlMy3G{}A`&>YG0a(AAHh^O}A7P|akz7R?`7i0=100w6YxKdT&G>5a^=`n+qV?xyaUko zJS-C3f4H%1EuA~lqRABhRq$LjnG=)T z=W}O}d_Er>8V5C?0?+c)2xQ?b4iHXD7rnAzGGeNjY+k~!$Wd&TOQhes`lt&wQ^5Ar z(-zETw}t+IM|G3&-CZp;polx9W|5!OKl^w}_mgx1Xz!BPmk^HN!uos!2gy(ikiszk zu-DnoI+{w#yUrb*BAlM04#?|2zJHi|nw`T^sRAe`8S#ETucq+|K(m$1*0aVJgUl*M8@YBG&^k+gjLW_lfr;u;5B-M`31D*+~{r;ZZ)A~2rO<=e-$R=oQ@zr3wG%VdYa`#eS-H>e9P?%w$+#0sdV zv4NRTIMZt=hwt6m7{B<-Y+FH;TiVAhGSfxpsu*ioQUxd`=tERDJO|j?I;L;Xa=u*& zW(<=ve1Hgr2Hc_3$bzeYxzB)BvmxqdhPhkX&^e-%4JEoU zOY6d=;GRqpn8<*~c(;HRBCn76bSb4=^x6*m{dFzn7*#MCyM=K-wc+#zz*;ey!sO|+ zVaR}-g@#?>Mxt1xS{xiQPikfTD&tMMfW~G1B5-?4=v#dO zU~$*eC^{a$=n=r0wHlZLb!afK+WS+J7$D3*VEwpy?gYA-a{)IyoGgl?2u9Js7fAuSin+ENmlOR%hw7Qk++;K6lIf4732H1rXk!$YTnOy# zRv}<_j$rW1n=v;kb@#s@(Z=JCfKxhI;soYNU68c1ku|&) z{R#K(jooI>O?=mLYY?BAfiS|P>Ah_p!^IWzSbq^XN3kv0E_-c0M;W8e47f@7(Igdb zdab{(*$_?Wj3OBoG%=PZ&7M7L(XkI3Oo#{JysXTGQhNs6v zdWTNjjUY`iAm|<0GPFMWCceh~my@6b3PW`lX(bSK0C`qz7+$4)#6s@jgfP__;PGfVNvkeUx@)wO)OVZZ5|0o`maY2 z>4owbtNGAVvLZRo_oK@R(sYE{uXDNr)gt{au-SS(^yi$d44BH;MR&&NLD>kTfWD(u zuMNajy_++ozXkM{56mg{Y(j?zoacv3L>7z1zaI;k7V804a5D}I(L?(0gmR_Q0HZZZ zr(MZtG1jEUORrw3?4>y2CfnC?F*UcqJ4pZFcTeo@p}W-mIJSr;jdG9cHS3fGoiRH1 z;*Q+rCBo<4=2-2Ruhvl;NXx$Q*|^C>)G+nitDh@4sbm##|Gu1f%z5E3MRSl6*6r(r zy!e6tK|)S;B~F$$w=Kp?|EArYMd&Q?#2R@IoIjR!wAw|#eeNBmkliFieX)nxFpI+* z5s6_?(e$wa?=4|>6)6!vtb+@v7 zxhEdmiOO@ww;LHP!NAg<_a7NYis+a7&T5C=)T?pF+Vf0ZMd{ljK*_T=oqzP^AFB15@Pw0jd z9?Lm*UMUx{gJ<0%K7lTQAJ{Wk!+NwUJLK*9e5J-pc*eI?YaGC_l1TFfEumY#6z~{9 zi#{L7H#~ves|&{m{gM^h8b0wow10{eqF0@B!h7=oxia<29u?}$+f{LB))rH~e$kG9!ho-CwFv-)QNqMu-0;}OT zMj|(t(>y%3)j>;^pl$Wzn??xYF#1Ymw~Cav%+7vUrrq)}n|6j5qsD|Pk6lL+yBFU6 z)B}&AFrXKwc)oym25LAfFE8BVya#cgjG=PcrcFwLdzQgSz>k)GSN6Y?(8pgiJEaLP zgz{VTc+r-Ol5Uk-J_vkX+ee1TSw2YDQag=w0-Ry9DK`6xFi%r9hG5qx0eg9FjC)4# zIl{M~Gl`X+2k;w-E<^2>fT-<)U2YJc_O$y9vLoNCn_eCco!B0e#V!86u=$rTTDQgt zi`v60fWMc?-pcwkkf<(CN)OI$`XwvrefU*|+gX3g$Bj4-IH z7XCmlHqmP%$wvR5E#Df5rA1Mboa^nI*Z2HuZN}(oYKk%d&-$Wb$Q4PSy2#?*Uh|hNWK{*a}o#_+4iq0(E)kGT@2vy39)0#0w0dB!T~W@X%I`m(krMugYAE z++taXgQ=>E1R;>0&BXF!Lr3dG^;ia5xHO`}Qh-#|^k?@6- z4^lR^kN1&mFV43`Wo|XkEDxK(pkLpAHitQ~qIDX8SD{cx7PDD^Xs3?Q@LhczVI-{X z`&iriE!)3CPIOS^cdQVHzfs?Iq^8J%-_pA1HwAi|uU!lhvH7+C7x|$G{l#C>Cex^P z9EaP}dj}wTaaIEutw6k2hGs;j5*7R#(g388`2KfDi-6!l>Gr>MFs)gXu#Y*qp`BD6 z1&N=>pe%}N`%)ZG)mY?cyk>&!!B;t8TY2eW1RFffzRLsx6ub`QPb0nlq&W?bUAuUF zqvM%L=E3b}Va)q9y#;B!$giisd$wC+f|d6wGrjpavL?8*SgyimtLTmwwc|XOyL&2( zZo9w0(Jto$ufSlIcxRghL}4l`8LB%>5N6l zxb=m5#+G%%*HxH3za~6enA6$#6X=lp z=#hJtWJdx4Z2%ZE{?rYgN!%^g<$eF>+2jq7<#0dDjY6gsEF79)+$j4OE!O3{+iByq z|Kdoe^I&Zud4^7c{lqsvkUFxM|7 zjHB$9F*N1CX3zH|&I(8e%NfAA(z;5kKVT_;CHYRrE@AYkzt|sozS;xy=Lh|>l}kUg z8%C01l?KVN$Czr+n@Kx7JFMQNU)I`+pURm94g~dR30=3m1~t#_#eGjdK#p$P+vW!y zSSe$&`6(n%C4dFmu(LfYQ8XWQaH&=0YbG^wG|fJce3x)P1lG@9rfXzL%_76L)` z`C&>3K$-5I8SwoV9DRiw{R%e978mDpmO9X3Yr;F#=2STz$EcoO)SMy#%SC;iQ(~&AEG0fXb zXK4K%`CjXK=-6D}OT@-5Dtj~ezi6Rd^Y2cr+o#Uk)XbotEdFM+`7zB%lkNt1a=YhD zp|^7pV!lr>3xlJjYiOmrT^zj?-!5q&5OMy@XP0F|NRq)!|j zoA}fEk+DP^eIB`}hVnU(cK?Wx5Ee-qQBQ)bU%ltRtSpISuhJa8I@4`~fCH$sIUlZ# zEi}N$xZzvxZpbUf3z#`U{y=VH@9EFbN<`gNJK6kh29tM8HBY+&6 zNj#=i@&MR_*aT;oBw%N7Q#sWb`#BY6N8hoioyCj{pp$2XUdUMsEHkWFj}AD2S;kqw z&JP309c(7Wdq=?V`h(4aT7xP%2JOJo?7=_wM*ZZ4{Td&e!Uj22P~{X56?JgB z1l%ujHhC6y=@)rBeHT;RqJHuaDy5oC6i)wsbWNI}pU4CQ>i7@tH>UsGiaz~QP+)Gy zE#(-K4$mFjpyL516Q|Yr!z2*+Ir|Aj7sr=7#I_&M9O@L$hkU5oZ-1)Zt;9C+%(lT@ z?u^@$6R*xyO*~u}%W@m*j z-~Q*Ree2FOE<%PX1AhJO@^`{fkX;Br|G#I9bK#z^%iJ1Cy1Ctfi= z_cMY(CgRF>rX0@d;@zq?FJgXi%wT(%QBX4srMS?qNBo&uuQA^q+_Y{vsxVg?>en)J z?+;Cu^z$YTsn;F76FA3s&S}D@dTT@-H*;fEnf7zeclOU0^Z7AWx!FTXcR>vaG&2Mn z55T|yOs9xjg1e@W|PIP%nlzg_=QKiQmK-u(3ipv{LCL`Ah; zd#iP^O(r7;FEW=2);wCEN`bx^pj`CP%=t_7u1qtOL)d5^r5rP?P)a(Br#l6=3qA^F z0UDWa14mQ96&;`-xj#eS9v+AUu*a*RQBLOwHy=g;1SbO|Am{m9>-Lxf#(_5%Qq|0W z1S^*uAsIStdaMc%3)evp<(0Te(tZE=G;8Y|o#%H&J>LJF>!+#=-?xQ1Yds|p*!;f{u)%7ebE zLCV77B4>-{dq@)AVJ+5D60SD3^X6-QKdwFstTQTr5Av~# zvF)z-lg2tP5mS!9ivPrUegG$*|2I0H+8QdYhOBU~ao$%JE2U_osBG|+%qOrtk`!18-t_b%L1=@d zqDJMX;paP9HJ#+!!?dEMQKwq=f#Y50bvd{A2gaE)b-4qD^FB(~uhRL^62F_M>{h=O z0IFR-t8}`qeH*EvoUhhWtN+#$e(R6xN#NlGDkOG8DlVcAx`$UVN>r51i0qn?U-HOF z(C8C>gWXcQnSGMt!J+PKixlX!y?YZP5q0ChhgIT0(xI2l$QgRV`BV{C!eY8Lvv8wm z_(`=E%WxtgGeOv*4dAe+hu&StD{?=Eub?o!_cIH(qbrx;Hva#>7`6UWzcMmYZxf)~@mU23v%`VuzAqbfA z$XE6~N+>C`onJqeRy=BJ{6G{J72RKdVA-sIXD|QFnX^4_hq7M&-qaZ5`CrbL{gLvV zh%k1VOXt)Zl4;4Yh{(}GHts65Wi>hH6sJwF{pI}}r({U>9HNN{injV%r`&rSGf8P* z!TH?Vi(UM1a9IIJXGk;?5)K0k1v6h;I`ujI9VLC}88|mYO&snQC{3BZBScNA#OXs} zm#N`jTex0YYzp~QKKM2GFS@hZ7JkzeYS)>8hz^@`6G8vW7g5(k5Qk!31yOqB$gz1XAQLE=d715ZhGdkS=JMPOJy8K--k}tAm^!FOWxdk$JXxN zAU@5Lj&ujK@JnBpwbV-%{G6O?@9CV^rr41e3V%7^P1NFG*4u$Dr1TQGst2k;_m!~| zOvaWM;)1LC!JuNVe{giYdui;$f2N(*8;VXR=V_%?#@*nI&P}{-T(vMQaqTLm<{zTzbc#|B z6UDm_4ba+ryJ>EQ420aV0h}CAbM@@8Vk{h@+aS^B_j93|+anlvp(sF`C*a(ZiWz}4 zXH?rFwHsdl${Es12{rox@(h4@eQ042@tLj4#Xge-J2VSE1#$_r&)M?|uX(s5ZXCb~ zt2Y8a;P+PgJfZY0EdB2Q7Gg~-U-bGtUM;#J1bm{7VQ;zJQt{FoYMSOmWH1brrKSUF z4MC4`i~mUhqA@ML*YgJhCA_bQt9ZV3bI2Etfs`rrRRMcnbJ19)OA>@f0mSR}s@8Ih zHEMjRxEyt@m0-F&o9fqnN*fK+sxClkn2G|N?tNxXTVYF3glX0;r(0<1*_98Mc4PVZ z^U6&lUUH<zCe$aU zr})0$H)B_ZOe86Jg>rGCxZ<14=V-~Ji}|=hFm*hK1NL;}V&+DQcY1()r^NZ(gq}Y`!%)GIke%V{#Qgv$nJ#i$YG4TbvW}Hj<mTyCH|4p{11y-g z(V5c|BBX6^yH|hX0qO|xfFo@7Utx_1?D0U3t`vb8FQ};6&rWkiS2HMRQl*8tV_`RS zpEn38?f74{H+^IZWYHLvt78@-+}HAvSQ2b@XZ6UXtqc47;SXU4AgQGHCZw`k|NF63 zoI0}bxB1?770a%#XOi|E!%MRU1j22M&8W=0jv!`hJg|t>#wBZ{NnGo$JbxC6_l5aM zNt-P{PEPgEfrVQmHlP4Jxl)&t7L@S*sW)>}1)Bv+$DuLq$Byrktak(4Oz$Jv9FX6~ zwD?mb6jL4<6BXqg{&8L^W2`pSsd}~#F1!32{}Pn7w}0AVtfNP<-MvODl$UU{DtHIhKk5;3vQSKlweGKgCG=sutOIvU{r{iPz=>CU*8fsE(yF`p!m z9He-^Wu0Xp{N@3!o|bcw1B_uBT!cpv*xP~VjCaC< za7z|^esHMy&C3ahKc|Y|qRirWDv))L$>^H{<2RVbX<(py$iGU0n^0Nh_tiS6MKWCz z=6Mh{$<;^N`G9?Qc2a~;L9%xSN`1q%FnudI>oJyYf$a!tY8{%ZYGG@=g?`iGPLdZ7x`uGeeV^%Wn`Bh2!TL3_2oOlC$L_+LRKFBpXFcrFS2xvzwIs5e#e2W*iFp~ z?DF#QpcA=l%Ch4Jm@jrS?l@|9FqYLO4OBI41YGpvdR!-1r;-*NTl=@Jrj(nW!EeV* zE|cluwhmYFnnx|$7~OLg=d+S<2O`qwL@axo@o07-$i3WnZn-;Aol=q3x)>ka)Ki){ zAKfSOiaDrm8?`bYN>BMJ?OWjeXXXZqyl}-4Eg_#+bioyQVV$VyJWnjr^Gj@LH%7C4 zOBpV`T3Yo$R-yA#rI;#>E3TSLHM}ISYBKmsXM85u`8+f4UIC5i7Ngw=DD226y7&*{ zjF*IZCV}T@&PF=jRF=b9<^b>DM3KIg8D_ljL~?J=G7Z|iLo~fT+uL5KNXf8PBPuRt ziakW~FPW2lOe!9X4?EQhc1anz2Zo$)YJz0v<^(a|;IKU-X}1U-bY`ani%UWr*d9K# z-oAMn2=a9obO_x02*h2Gg4j$gx|A^$M-_Tl|F}?C{+AIEaH2AVAZjlFJ$)WIK|)4Q zm5?Rg)xI%|Z(#Y;Bp31~`iNrp)qs&=GLsQ|#{uVX^Mxy1>?29`>!thU(Yej?k2LVmw@JQM}r* zs6+i=B)w1CZ>Po{JIUJYt)-!yPt|w9DKj7#y0Waho~u(9Tv2`MFX536PG*zF+G72v zzDs3l6whZ*Z$}id55F>K!LI4Kb$K`%2x!R$PB7N41)V8Y5L{~2wWyo0$A9ZO$N%g8 zy6H5;+CJKRHi)scKpJx=8e*dNRJhS+XB53>j``}KXW=t zg4^Bvl>LiHfN($!Sw|QWrp35?N$xWJv)jO*Kb)jHcy-*?sPv zI>+E+1DMlpfOQ7CSOP?U7xW|mS;0)E%+fK4T)jf%)wl?aEkObax@ZDfEnc`t+3AEH zqkH*}`eKaVaJ^CEnpGw%l}g4xGslIZ& zv1LmBz9s}H2Nf^)<4$dm!o7!o&ViA=IS$9!ly?y6oLQy>BM27GI0sw^p`(Pogxm39 zM2}waz~o`dGwPrqgiO?{YO&i*1w}Pnfqbi_dPN3pmt-m)j@N}K8aqXF1;7LIqm@HD zd+@?$8m?LbFodN9OYbcDsWYXnasM`l2_xxa!!C-Oc73fn*Cf3%EROFZYd`?Z82t7=ZvFrI)O;w`PFEhCqm`GsUT2v3|aPDw+q@TC$DV_4S zU#soQWW82Sqnx&dur1P2R!CN8H5vPB1&^ZKuuh6jPP@JFRXYBG+40Bd{*SX|;`g@$ zm2lP0Z%NFbArq$MI9W@y<46^egIP^Xp`S^*y`Sr zXvD*#U(w%3$%@CQ904lQDWd4{ubaw0|567xTql>^{Aj}bN|(AC`Lmk1fuPMZ4BBzD zij=h?5{kdd-&12hPIE-Xu4%Uy3~($eS-!^W46j)iKilPBVY^GZ3WZ0ac(a;7aLgqrfj28CIAQG+Jolm$ zpvtqtP+%(s%u)ZT}u%#US3AL$W|K09(HLNSHyQ zayHyfJc~h?y2=BS^GXP3aoMY};uAJu(5BB_(m=R4AlXIiwVq|uh-3+JvsXRY5s?%0?czr>~P0<^dG`2U$#PCRm zH~gameeJntv$dFxyA$pomH4tJj8%=lmfx}FYh6h6T|Ii*mQ%+y$&5JAZ{?;HKJ%qb zejs>v3hzbD^b86gMCEueD6nx8t!;jViSFiydqE-ybNWEec}IO*29opf4;GG-Z?lw^ zDoorbRAf1cIo4T*DBmpudn5rAxxWcRN~vUo*;IU zXTaO|A#Aed#kWs2%-vX244xTGVs2 zqnUu|-@dlw-UJ)F9O9>*DeC5oY3R+*z(-?^`2cJ7?gcX*z)Tu=09~aJ*T@6twU{mL zKzFNx!um$kmx~^OEciDjCqKG?gj5DXCT&^$_z|ps(&@3##Z4xAHM5N9*qMDv||oM1STby`xgc_fA-{Ck0$$H9vDTm_f%4j zB0I&`n)lqv0J&ueDwO_d(8oPpsEpXL_OE;%k$1hh^DYP7cabD z_j_yXISCB=Lv9%`jj73uYWi*ciq2U(tKqs>`w&>erk?r$i?$^Y~6;-L3m_voWfUrp?3|d43hz6tfvtpcAf6y6Se8 z#>7voI6$#ZdZ>eCHdasp^d|^bM&*awsn0C-84^s-Zh=xb^6AhYHjblEi`x7{HQcr^fuMLz)PbKHw{G=MtM;CB#SeqhGmz0?B5qV z6=7(GHGb-_wuL~QORar9&7_BM?!Q7`vAy{!UGd?Iv4_}o23EU4A}Jvj{gg*{Nz9R@ zBqz(Bk67Fty|%4?b;0tc-Bqn+P#t(AK3d;~_``2HM8ennP3Dymf3kfQE{?ike2PWXEf`@|f9T zan+l2py0g}(!|e*P7J=ZXwKJI3nab$!L`2jY0H3*t*@mK?Kh z$G=}#cX%}0owagSzrIgQQ!73l5EQmxHX!WIe{_Ems$eHBJjPN&Sd@a9a7Him*em0? zkDVood;b8!TWW^$8q223-Ip;Uy9&#bRH;aJt93zQ&C~uDk;n!)$?vyWn5Ow=>YyZ# zBP2eU7VH^ilIt&ZE|+VM2wOPxV8_q$z%DCO1`5eH!~H1XvjfsJVe?bI)Tyf0peoSV zvkE*H(q=%lJfN>WF_WKj$pBJ!c(y`j+^k8Nzn?X(^x1diyr3xNb$L^(k3y{JiTf7| zY3A#+jpHJc%Lt?~FDyv>_X(oe-FevIxgXj+f4MDI_S$5&P5-wAt1AlZ5RD}@@h5>c zqltbr>~Y{FI%FY@VVRQ{%x*-@D^OC0vI^^zN7t6OLE9vj-Wk@lO)B`h4TOC540i({ zRNnivo}5Mk!{%2kJ)|VkJ(OTD?JzR^Y)x)J>Y^T8Z0 zh%&R3Pl2LSk3Qi!GI|0_YyplCD4FK&HagX34x9V&>Ny6qn}A}fN2?ty8bXG&KWLUlO?hD|PwAkQee(Hi%r~HjBSR!Tr~&t9 zyE7+byk5QKK`DAN}{$M+-OB7sc<_5fuUy84=7txO(R zpGR5C=W!3QWX9&z(8FJ?Z|(F4g%N&&62|&T%Vj*bhFr5Df4$K3Y%-Jhb1JJabraiW z+AP(lvl%vCuMu(@mAufZt=h}r>0tLvvvX1TXcFGbs$I~RadZ*;T`^@^?w_`>TK5M7 zvn$tO>*-vx@vv%1rc|Y^oE|bcYo*;;CyCHbuWAXacpNHjtDI>V&R&$mY{JkFOg=bE(fePI zrFG&}Qk6Cfz=6mE5FY>*z#0Blw(x)1ZY#)?xt0xWHW9W8Kttdb8;oF9 zv3}9LbLCI2U!D7@tkZeZRu&xEXDIwnhQFloj@@u%coz$GYslKrQ2la3-NG9!ElybL z_x}C(v(H)CE*vI)Xq~APo8^)P%oUyidN9>a;_aB(~*HJ%w z5>leUzQmGpn2nkQdU3ZwyFCY^94fpto7CKCD<};9E~Yz(`N<^|JM!+Z4*eJXPQv)tVNQz-G{!$INYkZ7lKQiqE}6**==fria< zpiIb4j|ZUXYs)3yje+SPfhd2EgYtRVli3R64b4w*v=VE-3O_5pg!YloYp-c;fKaZl zZSbOj5Duum&-b1v*P-u!57nF3e7GTrZ^I}{&i2nn5==HAF~WwP5dVtlA<`^{*Suk3R-%l$MXCyldZKcp`#BkbdzttO;!rScIA00ou> zF8eg!0BDvV+4y}P&`5kCYKv%5XJl3@MD8L$^QONNkF{h<_CaZhFQOagpmT?Kpq-Q zng_-Me1hx~c*>8(d2~x=NVFsfhakf3h5!9UhyI_+sFDtV)zW@@O7&+c`%);NUyPam z4Y6uVe|Rgt3R?XOU_8>%@w<)f#W`L9=5qsli~aL%$iFyGpTgmiKhf~9()54?KPS@> zONvF{eK#Us`sqb2Elp@_HMm^EJJ^Mb-rn&$?m!T(j2u5W{wIJv*3gYp&=Ck>2ueul z&1v66#w?%w((@hFSN)&sfK~Ms%-gNJ*fm)*9qf#3-n8cIrqXxIOFs`mF5R-LF`@Nr zv4MM!r&mKl5~-}_+@HdS$=OKBYD3kqr2WmP1yt)oF+R@n*^Q3fy(dDyKUPU{KbyH5 zJ>x{5N)mk6cNy_Ysw3fsk(7PgxI$)QNwaft>9^XT1k0lzS2CY?gx@QcY1?@O+*&vYA?sc!7@Sv^XJ+5MZDcA;*D4ah6N%w2C#1KIVRDmMcpH!doQ z36nB5S}tDLpvuz8+bv`FE_dC$K}}N{wRul2b&*%g(!=TQB^Q;e+cce~QoDT`On~j} zY>*fpdLTPZ+8#bL= z0q)I9P^(HnR5jD=>)`$q`H=uZ91lm|rDto+q+^$w`gzPzr@)4|?hJFix@y~V8xY<# zm7<^RPcA@c7lTS$tXI34R8RLdHP-*?c|Wt_Os`E}vl$U*GWWGKD(*;A_^&ey)LFkx zjEbYnq!UALvE)Zhnf+w>5{Y=5bor^$?d_MAycQNnnfFM-h?98!PIsR8{RO#P{@Jgg zs>G2M$67lChreQ0kh&sWLTjyAvP3|7Qv0&cLkZDrWnp#k<6rsN%XnLD}^6kB$Ab46011QrdQU4={>IaaKGw-&dtn4b+@90WWm{g>#19| z+pHTeut%7GA8g4d?^}nOM3g8He)eWD@yW~hPq=N7b+=RS z+5T3K!)E87%C~^GwL>_a+dx7qU4$V6z*M5qI1o?(@QYSSAJDnqgoN{u+emj-XLYkGcSf)90GB71UG-1QCFy6gOy|oLo~d1ymzS2tB(VSF=0a|8kRai9r{S{{JtX7`rEUu%VwmO%ax&ks zyVyEBo$El0K9UHbx0!%)V6Sj(XOstjj>$$}g@oMVSZ*gpo3U=;OwQQhZsU^S{l&<~ z(}fj*1k@$JXX9Y=>knpfe7orRt#@l8ntZ&Mz5w0>I;pU(T@H*YmHFqY;<#zR!NOCm zmUEcUtt%>{?WpZ2AUMYSlv$x2+2KO_u}>jJmX&La&-t$Ad{Qr(~$~tHv9@Nz!msaF87!XmfEsp$`xjSyEUapI zvaX(=(N^;DTh-vwoLAE+T{{6L+D;9M=A5%c$RTEW*ivLnBUDw{2WWD7?U*%6TJxuw zch-l-?S1jMpiL1GVT?_3axL5GEFAVYNNih4c)R(i9CL6?jow@`g>P(#fOVmJrQ=Ye znN8y-JTF%m>?&rtG#FK%0TwF^c(MZFjK0~T4R8xNbm=n-9N?fD#dU;hb7{i}J_HN+ zY)p-39pX?V7m*9Nu9dxf*%jIRarW%l07u`n4-&x`zeknXLQ8c0*B`k1sET&9DJV0( zX(7vRT2J!a{dOKL1)p6h(PKF=Q>_gVXwXG;TbsFab6vwkNK$MN(MFJFq{Yt>x=Vp) zMzd)TeEuUDb)Lb37f*WF{XzF*GHHmgfL)7;+l73V*^h3k?pMr^4s&-WUG_iwtmE;L zhOL?}Oo9y_4*@Q9j8aEhBl;`ZhY1_5%B?>&3O8Q1F}749VI2sby1&0Hi3hq`9IZNX ztyfPgoO*hhC3$30fL4=_@!L1uT_#VZ)4FA*sL0ckF*|2O598yB>9jiCd{iEdAt(AJ`(O`#@nI)93v-vr~`e7R$f=G?k}IdY+--Rcj)%8gNRe{@ZACD?7JSrW`6}M z{|2bK>D-(B`QNz^4)M+Oeqx^}C&$TLD#j7ZA?;OZoGPX&SK6BtK?1dIQ#hNqoS5-- zXDtqMGFO042b071bWGYNnZ!@i|hso9E%q}L>$H*L5 z;uWvRP83m}-gZ9Ef`=YEG06F*=PF1biyQ0Nxx7tE#au5MrdyBH%n=7XXEK0UMrCK9 z>J39~EgN2i1wWJ+@jZ|CWORp2=dHC2Fh2F}t%wOQ;iHA2|}3oqFy?-tnbh zezd`yitKP%_f9%x@a*ct(Za-sq!7e#kl9^ zv19D{k5t?09^$kkdi2!l6V5ZP+!&JpVvp%XWJL2vuS`mZyh(?>VZN8IQI>b+!U8iK zft2l8Z67I+ldZCT!*;Hn>x4dhdSvrFeg6M(bRPax{_h_@$2|5CWjn^FD6`1sSfP~B zrZQ5<78&83V~?^TBjZ@5W$%n*6LE-a4xP$6ILA1~S-<=Hdpyn`;JEMeeqYz?dcB@k zU3r4jw1L+kE?BQX{~A->G+tw_+jze7djw%^V71UvCqlGuXsyPeFfbvNyvWcQKtBt< zj;&#rzPnv6)xGmqIpK}2!$<;M)wK>*dqHnCbu|E7cvwYjZ4u7R{32zq+!H{fom``E zQPgKhsR?vpszl1~AvZm;tq~|wWA+Y|=boU(jLPmNL9vkS*?J?pJ%wN}dZOY{ZGDjj z)1Wnw=f8U~nMN>np|nHZ8M_MRAZXLgAfB036E;)>vaKF5;Tt67@Wu1-t07v)E4N%Q z@e?B>0!WRj1(iTU;yZ2t@PfRM(z;;-8gfmTX*qOfKfrnX4A|+k1BkoxB!ee1yywc~ z3l){~AbFO?b4<{733Z?)m1qxQ1@_!_OMQsS`{sRi82r%^{Z3CZ!JTwklF!thTJ~u+ zi1X)hxh)IO7`*|xjpF@BOQ43PNG0)&vji@u4IQDlmnUEJ&NYARq{r2taKp8UqMTsU zwikYWnlc+(=4I`#c~6Z~Z*B{8((LMxaqqzik-LdCE)g+#yTVW7Pk{?AiLtNrZk`dG zvj-mg=h<<`ZX=V7@LtK+c^v79IqL?loH!hB`8&4wq_0;dui3819ccILRd!=-V+XwZ z_l8Z+mHfxQ1<%sMrf%|$k*pI^4;K5-&y3^p{_dn4*2qOgM^G1H#H5&f;(9uq?-ni& zo*L47_dR@43V!cFe$D3)9mSz`EkVr0e@Ek;ZcNEtga? zBKqg>U-`2SlW>e3XQ2sFX=cFH7p;%jBZ*fvH({33&CD*W5(s_vBiQN}HVz_Qg&brZXE zFH-D04`SZ?2FuayRfh-spsLR2fah2IE8pGpLD2Q9oS-(No#~&Rly8Hcz5i~3SoonV zAVB7=793mjosI(=8L`ADg37!6Eo|%?3aH=kk=`1G?@@LwLDYRc-B}KhY2IatGc|kS zGAo%g=FrQy>(bR`2 zak??oK5G%KHeG0xOpE;W{x!i{&5}7_*IUNxR3GT(2DXR8)%tb$s($~V*xC5^gG`gE zy4BTE_I<}E;+I$kbaGSj+=y})@9ZSMO4Q1c3l*#5cukOIVoQGmvq~mPi=SH#kO-+{ z4*4PTL{#H<=pQAel)J3uSZ9MS66H2rOw#wN4nlIrrFW-<&fWUX7T&>lTdj~L(hO{T zyO0p6kY3R&8ntnaZY6Zu4D;ZjQ?|?rLn)u;Ytz^Q8Kn%p_DJ~nZjCR`b4w?aqcXba zShQnXSg&elRefgmIz@LcfWA(hxIj?I{S~CjP7gf5Q&uk9M(rc6v`0jJLbly?h}BQD zU<_1wQpIXB+6#t88T|0(A-?Jo(BN;^Bk zBO>A?;5O)}eoadSG)K$oyr2TQ_DI(-ADr_$mECMSi@THO6O)s=0BQ}MfTA0PMKU?5 zZiC%DH)`=Am!w)Wv;cAa6>zF9ycYC-Zq~VbN%t*a*L~}Y9ckK;($O!_2RA@L4F#@m zKN_*~6K~q@_vFq7(FtCZt^NyQ10A5C%JMsNil#rX-Q$ep0oImY*N67|x(RU#>(G_g zN&imIWca!A`1z>i^54IEY9vmrRmd^>j1`Ymg=5rk*ou^+gQIiu^*ZZiDGAdh%jKAK z*84H_T5?Pu>K>v3kC_&#n18!msAKaxQIk6-u46iK+v>l3f*OZFgej1#d3Izuc2{j9 zz9t>Zw;dY8i{vTf>ir4YATJ&v6j~@C4B9`@*}z2$(K^a=z>xx-gW-Lw0B-YW@VKlj)z zQ*(a37>`cD)L{`53vP1z-77tXgO&A*c`pezW{iUfa$<5tqvuXF?Q7k1$LL37$bav) ztV`=td;2d=ovpT?(Go5|M*7kz+ZuFa5Q!NTxNi+1k)xMUcr) zSZEY5tVKZ#pM+`@Z~{wuK^9jSsB-2sk-=DcCs3Wa^qK56MGk0=nctEW~ z$$)TSyhG5`<&(vbe4)Ep_eJA5ySkS6%E=&>eooQ+=X^5D3(XImlA+-1^HoMcQl6oS z-sJOPZgl|*dQqX$vFQ5bJGLrH?H5G<`S)>rmxme0Bu6~^WveiBj&>BfNm{4_2t68s zWW0eM;4Gr%E!39bCP)FFVUi5a%nQn^Iyesb-0RC4a4p0W@aVt*#*ppLYKGdDctR2S z#*bPx?RYR#9|s7MvPZ1T-`vW-b2dl^p^57`giD-#i(b{7t1|urhhsas2VuO7TXmZA zau31?g@xeO^f=71$ROvV46l>TBmc=eODEl)Ki$4? z0z=5*U&>+8jDq%Xfn{Zc@EC=@iBpY%G9>=XrvZ+mibb5Y;k@j55Op<#$*BR(sdWKF z?4McYV-4(c`ywC$s*_kAtGdpKDuWDq);@NmX99Ln1 zgg1N~>&G`?Ut-pwja=5q zyyM1v^zOahg!O|MG&mKx_=FRrar}P%X{jyp-6O5D!wB8W1Il>?Zudq;lM(S>`%e4K zWfwp3=Rn|ArT2CN5(+2EU1#~;%nhC`(k&l$U z0^natI>fH!5dZ;79ux&xTWc73t3-B5LY?g+hib|?wMziN33~?Zp=8V;{U|YS3*yS` zH(wiPl?j#t*#N2Q9bTvM(n4^QCv}#1a zemTKjAr{{%*ShqM|NE$OD(L4)q2mE_q3T;b{cjGv9 z3kPV%BS@plElg3T!T5}`+*IJ4tvYopC1y>RqbjjAo#TkZL2j!$sW=2@%Kue(6a(Bk zMKK4HOY4}b`eMl}vhJo>&CX|4D{rJlOO8t}{~dps1YQUpdagwSo@lf8_RysV@jKd(i?*Fl zO`DNst~?XRP~p=F8=hbJMh{2Jy1ES7ng=E9!iR#laJ;LC`7eOKSJG2Ssde-QzV3&8 z8RJXIbIm$&ZqL@*jxPBR-~6n zdsQN$wZ0hO*)APZV(*C`hw%_@`%);jGnC_xj&fkYkBg*(!9;pyZP&H~D4(lU^e)ST zl~n74P-)eeVbLk3@X6B$`!n%CxJ_)|5KxxRGCee1vh zILosV2s&gdT0*J;4NWP`Ji3PgjC`_xjO~hU@tPKy1Ko@?3c}FQYPom+lp$MDOUbV| zppX=>+7uOCW&5gBCl_Lm5&@eI4^L-aQRyOn__DkOC}1j!&Jue?be`DP$?0{zRU{iO*~@-*f=0{sv3`;N~RKB%|3j&V(oF+fs# zUn5=Ho4WTxHp0^zEa@UyQ8a${cO%n%htRw`_+W=ezdWuSEh_aKJcV*upVpWa@Y@wK zEDO&Ac$b9|!}z>}HMH9hdP+3)r=3^8Q*=00dkHMPxd)ae8{PKB6>+|F|tH~Tmy)}Z0x+JrMRl=;<$PH9&4O#IXA zcPZ{16~$`ysf6KgSw0GpJ-CGhZw2=wUFFT~rk49+nnaIm~k}g0QM4p z?bV)WS&fW-vzwz#7CQ7Y0F1V=Nk3@Hj7Abqe#EseTiOZMXr8PiyE<~j)0KeVmDrM3 z53aGJ&<>S3FU%wH`+s^(hCljFbK9aOyX$W}d}X)0H)nYeLt+D~CTCw=MZcy47bDqs zm$`a>8%)vmDL0%se+N(i#(sLb88pq2Ib=Wwzr()h5;&7ktXIgFC#!)RieW_gi2HgX zfLEdh7_k6WUf!qRCtRafHp28umRbUR-j6hDH+6lG6_p%#Zw%$I?)ZI=djcqPEar1h z%X`(k7D@`U%W=w42Uw4TG>5>4vWtu-gWOWrkepUj5i*w)zFPEe>}h#cs)3ffXyK-- z&y>lvjwm~3<$1gNPFShuZnqpq+rlaH|Gs_X!M-pal$UymIX6Sq3(F~eZQ{XbxG|1y zCZ(ktlu}QhB@>cvhJ8@2sV}d-D5~t0^wNL!S~>PA0(yG2n!WqiQP0Uz{aU=@#qhm{s299JcMAck8<{-$47ZMlmOi0;=TLC`vI!c95plRthk z(R=Uu{&iNHINfO}7+C@qsE6g}qC)&^CX)s!81yB%FpYN&cN5{L%ddDyWXopEw@8_Tz!0 zbHFI0F)R`U=6QDfApOJ6`Kx6o!|o#*we^FQeS7*7cHasl#o>so zjL=GCcw9lJ?XdXzuree0bdX5x8KHaiS5&0Kc9~d=q%Wz(`q3AUBI=HJ&-)ydHXPau zP3s4=smL$_IkoTW#&q6LH)VKo=9Q+7h5Sh!DR%zpxRC{)Gi&o%+m{wb3||5{xD_OF z-&Q|`WBcyhR~;L;Z6Ror__QN@iB%;E%e`ezL25Yyhc$hJIFX%w_9 z3W*$;fu-GXQ)#{$CAP)Bpa2Y|w@n2fC8?kA3<|$q#e5PLNnlEmii3nmmCk8&e%D;lZjcpAQ{zpMh$?aqxN$oR=cF&M z^5l2uNDS&@!CMziHe2vO_|@w7XUQ`gm%_jzCL)Yd{2QKQ4z!CC&7C(;NfI?v{qG^B`S7Klg?4) z*;xQ2$xW6R+b*BGhQ=Unp4QQwc*&ghr}u53V0BJVSv2fD#C@aYRyPMY2~<|-7=kE` z$V_p4mMg(67jdD0&tp>M(&-!gowbHJB2YGVX?=uQP{jV~l`BDPwVuEsB^=5CJim6eznexz2sKhEiOR;~IS5YVjxqo5sW9_=<@YZbj{I@#)$m^$qdo|eJEV<&}852m< zXv0(T11fdrkfu=ZTkTBq%Ioyco4sqMq+)T}xL^=)X% zU2F2h<_JDNkJ>hJcY*rw{tk)82r-?a5W+&e96h)UvDufavYuO zY;T7)kD=evldIkv-~pCQ!xTRdn{_>q;sg~!ghi7OITx60_?F-hP}u>d5HNCB@G#<- zfb*?0l=z4i^hpR*Zjk5PIxf%TM^S5O7}w0`Lh2csh(ck-W*R}Y}5v(M_PO) zHyBn)ATnF$`ss<;E+ZWFqh?c=Bt8*bcIaD}_0+8c1wbvBPJ2&9e*-8x`unnPm#!Es zi?NsQ3W7a$g5Ten>&?DISbg1jo{8AJF393XT_t^#NEO-rrt1O8%kZ6+eULUP!V=;j z0cGk_*9qEIbXt_eeiCGQpXP|ZCG^ym#&{PVq|`_U~TLTdmkGh zBsk+M{oj32t;@L^=8bp`Jvwe?(K=dq!+PpC@6-##BsKTvPE?Mk*G9_SVir{nO!>}A zuzn2gMS!LCzRWH9V48Sa;}CDuEtPdb!=?>qGw*bslLW0N>r9;CO08O`%oDA?Hv_ab zi2IYzFh>NdI6^rUo$_J{{`c~T5u9>-OXb~;N(}UYh~&O9oM)@FLxc#zfkMQW43SC0 zly=ZE^sUc=27%SE6z)O;GKn=QPf3D6-F>7P7~BDPih~e0fv#$7$r~prUi%n`LJ1HJ zZ{$fBUxdaO`ZR1|y+G67M^zFGOu(S>1F4NsGybtTfjdAr1~|%?u8ah+H*t0+!iSeY zqdXry>fZiU8b4Kd#_%@9TkD^i=AC(OL1yQY<+uy2Vve_B>M3u%(s~XbLX7+*D6DIN z=h^OGfV4BKo03?)>PzKwGF&h!Ue)%Kn<|fIQD*)iTR(|drj1Pj(m@0iq}@#Ty=o)6 z?B5oY6#cg^NVB(pp~URV2a^A@K(cz-3G&BI;`N?bAXNP-&&g|p%L-<^JTRd-Zzm6b zXyI?tCGh$aLYY{6C)jlJ*~p_QKo_tq`Chd+KlP6Gu+;Hd9c~JE`~On?XJfJYSLf&a zG0RlaoNl+{(poA=GFRvCO$dM-o_+bD(+%VfBLgLJDjorX+r-M==Ic2)n`nSKrhCGN zElu63K6G5|F&9rGa6oJy4T1!N=GbRo&`V$=ZW|Uu(Cr$zqA&1oZS`+Q5F`#T0LjkA z=kTDI;X$|V1Zs)z1G;1LqI=-&m1e1A8K>QIx=(=Wzw4Y4C%6nFB)#}3d6F)GpPuLU z`)NIPzMI4PPga-e^#m7RTNU5mQqr2{MI$=tC+J~9=ReUVx8-_{Jc3-p0#_91zQbcp zx9K@5@nX|jO^oW(x&rg~kxRzaZE@}bEGCjX=NSvvpPX@j*!o~W{FmQL=ex-xD5Avx zcDAcD%x}T1CJc9D!$lSyd=zfQ^@{MOFZN-dXU3FlY1euL)Dp+r5aDz4iAwJrr!MRh zrIffQ5xIJF+1}$D(jg_{Z5($O9tyrwPwsGU=E@2L5=p#XBgc5MnHin*1oQES#GZ?Z zyrr?~6RwmGHT2XUBTMr-n{ZVp$K6%hPO)m=Ch6=$M3k8Fz{`sG57QM}{Xn4=%smeU z&C9WL3Q=u}e7jSuIYIXWN?4#QoqQp)({3=B!cEVHX8tta?eBBStf1i5_^rrKGDQFt z!o;1Mu-y>wW`L!Y-TP8Jt1XL^{SqvNDwxG0s=Ku<#iVocHBm+i5_#T^{P)edR<=&to$T*kk;B63_Gc(u#E5|PeNuSR z3UONcIpbG1b?vzZ@om!_v{pD23XX;TM+>3b0VU+O1v-;kM3S0TnCKO*0)yTz5^%{p zmW+Mq$p6S-l*c@&!)U-dp3io#!frN591)K(wOc;*H_m52(~l-!+N4_^tKjhkXGD85_GFmbvOG%L7EGIEhE?4=gM8}Uq` z3V%qsrF8Xw9V7LSwBzByX?rTZECfuH)S?4?q0SCI-E8K~xpovysVGV%K0QmMj7majc0qf7c7JxJ=nkBEpUOQa3;^EE(X)1nP>?pYFK_Pu~ zx|O|nipB6A`h|=)gH@+eilw7$Gcye$NIX^|?a?=i;yiD|&m`{O^j+ zFvp-&psiGM-Qm(XpIX?2&CMK;fBM~}GY7SV&QMmh+EVncr+<6qNEqUsv)XnOTX)%) z&q^LfWG7LU&ft)kR4ceCCGeL)jbYH0GEOCKlTUgY_Ad%oLE*q_8Ex-3ET3CDKaViciE zWqA#GQTR%HQ|?y(^`CeDQFp#?BWGqE$|N_uSDPq|MyRpZTkm8V%}sLHaeIxmGqU46 z5$^yBAL2sYNPOExqkC?XvybWHHzyh$xu@->Z)k)_pQe^efx4HA${;A&`!BH`VZPSr zNBKHB!Xh!#@+|V8Yhr|=e^$E5GDS#vE6ZDe9usr1JMeK`0KrM;av4R%_!~_#|G&Xo z%!8b5Yy(=+@4*h;vl5A!G+9L+7LyTr=DQ%zm{Kag3@x83vhMlT5!*F)a~$km{gvItnrkoL6fN8f9uEQx!U+_$*= zMCPtBi{ks0&=)^jrt8fs>>7gPU_vQj;g25Qg!y0^IG=JlRBa~B`OQjtP*i+g^YU52 zg*C~svJn#jTWPtoW8HuJ+jn8w*f-@rj@k2$3Kpw(g3+fUIX+lia^FFUx^qr)iwbT{Gm0AIwF zrQUDL5^bQFC3N1ubrj!G1ekJZk<;AqUl>@2IxW#XJk13<%nfnS{n>og2zq>{QeBI| zH7lk%CAuO7TK?g!afBKT9Fi+1cBR_z-n*fp& z^NJ~bVCOn;lck8I`t_sjW<}t@VnImDY`v0aTShT-USvp&`~V6dC@X$eZ}60nN%`d- zj(f5a3_(fC+7(u^OD1cj%ZUVU=-!*hl+ZQV`;R;@O1^bpr8wOKw@)i&6}Bk}UpgI- z`^@l+lfgX+S<8#}7k%De8PO<=8>BS>H4Iwp+i#b!5UUr2r=1aMq&BvPNajMZuQKZ7 zu49-fSGlZlFRX+HCB^F?ZKET~t7ok`caX{zzEbu$O~HyC(dq~8mQpNh`>pI-Cr^ej zZmQq(%Bas0j_JRMKYT%G$I%^T@%}UnS&!joIdACD|cg1Bb_NN&|DXQ@%Gr zgftn@(#YQA4_+do`62dgSF_iiV{ihd&FQuIV#?)(GC;u%cd38RS0t3}DG#cx+gdy> zXmq;?s2b*I=aZbrMPZ$zD^GJyr`_>|8H+f1K*8D#jlhbO)EO~U{qB1s7O8jb2G{w^ zAR*p$5zk+=NEoxnuOT__@#yl8c}gUFRZ;X!rgQWAfdN-zrBagsmslyzmizSsU-ny& zua(tm>FH}GpPW42I~w;s@7jG#xmd>n6|Zy8^B`Q(Gdm;0xI>UFk`D0W&kvyy9yax^ z-M7C{{(>luXtr+F7rw+gAstSmO#f5g|y`!_nmU7kz79|JF;^)xmt0q=D$rc>;I z8z6}B((w|}ART57K6fj(_~a0dZs;peFu%;kx|eXTx2KjRFmz6#h9;q$RHTx849|n?;?Hjm zZ+XGI@5LyBFF~4QCWsOra4Yo+A>R$6vNdL=TWWKx^kyAxmL6x2B3k+V0oMDN@kpVg zrAedHqbpx-7?Mlm=m^{Qb-cp`xi02v-SI?WY=6J%8Ii*;D2tZUn7r!=SuND#`~$no zrUL@6#Pkn5_UhBY$tY9xfdt9PNDoim`;zcG8X(coFKvFxmi| zw0U>h7}RC~UY27=ge!s#-!P#B7T<6^ddXhu%K}DOJkOqd4l3!lGD{1jTIezqLvL4q zo9_@bHN00<5Nm%dG#6Hiz9fqpWXLg-v;)aZdZJc5EYiSCP>{B|A}2*@MSFMT-x6}xOiNabKEd>~!#USfXG=V>2|9*f=@Z`;jbs2)mvtQmC<@LV` z<0cAOR+l0NkOmMI(E{x-?x^V1hfI~TSNfea;4n$KXEhT|oLVQ@wmR#6V$jyFf^e>i zv==Z4hF^;y1C-W9j8q z)`lG0nHuRgdG-b$^DH(wNcAROsPrz9`zAxqdbrWLOPXxUqAJ^&nr?+GF8Z!alvzIJ zxkGMOy(eX0<_@&kYN78y)3TxiQ0pJ{(d`yFxsQBTt(OEPQY`cp%DXCmr|X(+dZ~M@ zCC#}jDiO({$3YLh%PYDfG);b7hcr-tcHZ*qB0GEPYPO~4dh(pS@d9tm_Qy8@&-G_D`>OyWnIKWGPUSUk+`loCRwu21@_ynPi_f_w!MJY=SNcU_ zD2&3Y@~~k>LmWuQy@?C()d4D^AEO-n1}_ANy6F||=_m8JEftlx0z5klZ3syRc)JUC zC8yokymUvOA96inD^U_#(qJ#gjd_QiEoVOg_(niTZ_-;re|+V8X;gwwD&GXNGzf8b z{4pB8Tom%jMxC1%fHb9M-p9+AwEACaniSzg`JdrlB~UdjK4E$% zwZzGEiyqu5S56ks^~Q#Zc3Ts(nG(EBCM~gM!Qc|0Xy^38zdqulKo~8|JX+ zQ5kT#&A!@EJ84x^<6|v{ZmUv&AF&yj?jCj?-wXBRPDea&ynS_Z?UlVBMeoDmdDj^V zNV>YZ6<+vz8q>Fu8Zr+72dYhzf0K>rODFhQnsbTcAJ=0(yUTRR<3(n&0;Fjva>bnk zfyuaFi!ERAS1x89NWI<@sqSFj&S2Bzf8P7SZ;($6KrG#z>8TF9UkLx#bcU=~cO#_W zQOfXM_#vFNYc;}ph;cOi$31aF;sARAxO%LXR{*h~fD9!i1#2n*2r{yW#y zq6lhgIp}5T+zQ0~xEdA6>t_$J*8r_mtR_~F=~sKBFT*J?bfXQV_1QcMGU#33u6sfd zYFh&ALpFe)&hU8xv;y+D_*0M7zu6#Vk>BFrOtGn-+F4Cz@V+hUpT~I8=a8%BN!-1j z&W)V`Vp|#SmB?Xb^X5|jWy$=43t%ycDZ-;+FA{p!zlQ!v(PvGV^UM*k(0LK=&0%VI z6%qaD`s!%a$~zZG5>ux7OD@q;$M}J3mlHB6%S2D$qeCfu_aqaW+Uisg(a1X*vH0gY zMQVbQK;4PV*e>?=j)NoEO@K=wpUswd4}doryeLF&TxS$JPtW8&{5P?lr*BTZhLc7g zf8RH!W?fR~bwP?>-paeKJ+tb}I63(&lo!@%z%xHwPQ|TCFe-OGB7v*?h|!nlF8Jr? zTa{zY)eNdPLRW#fB5q(vRPB= zWPJ^?0;Yu81?=ZaF|oxh_?rmz$-FNR0FK5l9x1#)ice@ak6@St3a9l1CJ2HR`Ij3p zUAY~n-u*G&bNbx%o!sfHGWxOBMIK0Mxa~a}6s$%Uee01dnTP|0oG~ue(eg)heC?|= zZ7deYsmXmA9fhFr1J#^*u5Jz)wEx6^Sz7%o{S`R3qZ?L{7WcY;QnegzdP0ky8oUvK zcz|oDx0$cntgiC$jf=N-gff#qpQ83ZW z_al7|y=Qq}_|sPI?s0qL?hCp9DosG9PYq~T2b6ty+kXitpI1N{)B$v#zpBSyg2OE! zU}FKKb*O7>=Jcpx3v7;%WCe+D*?hzJ)-31x6l}U2(fWkP(5yNEljzGyt20` z_S)Wk(Dg@gve~i!5C$ew1jA&og+Gi(lSr&BjRQ$ZN-p7{ZEw=y2Jn3|en#Wn<2Y`^ zlGRc^5xqGxUc6m!u7VlPLCtB?o2>+{qj$whJl?hsa$wLH(8O{xqfS41{1xHl>UFTz z;F%;8z@!DdM2i6Q1Ew|EHf9PL(D4l_jsS8SKfe$r{2FQ1g>TO3*27c2$%f}U{Bj)_ zw@Y>Or5Fq9O^-d*y!5=>(0!-wuY%+DF7Fi(28n5971_=J?IkMlKH>U``Z z!?xvDBO}IZUjJA3xV~uoe@37u_~Wl}6@5D%-j~$gRQvcoT6&i+{nQ#i=&JGfXLDcr zNCcu8dk{k186yUNUR$fyclS?*&&3RvH(wGB+VfkO8OUVZb83ol?eK20T*%kqp)!Oa2o3jJOMOSVZtevQkBhwDviy+$F3}(z1FH_n}5W~ zpm?G?q*Fdo)s~4nPl5n!#?*LAm=uIbR6<3Ze9MQ^8U4uE1jy^kfUxf&=?6cS2ahj) z^|Q~4Na(NE#{^kbZjHF=8=R?ST^%FtP1ae$*O${dLYPwLyXpg95er+l`XQLk%iVz|ep=R23dHzH*=WBwq5rNJ zhBj^80MZ18KU+u;F<(9z)YRnD0jZk|OMrgP<%VpX*U@^C7Y$jHtft6w>QD$WGskTX z6Rz=wEDu}Gh(wn`i)4cbHscg4Y8QELOfIwMYC{e;*P4cH>_gs8=joQhj1|8E5rN09 zks|Tq114-t*y2p%qW4(k>pDSt|NaYFlXV%_RTX|)u0ty`(jthzUZ?f@=;mlZU!k5J zN&M2jsQUPoc1&VpgFVKYG7;CtbEM1w`xcMF1%CiMe%jrub81Ubc=)(4`VZ6RMFDeq z(B6lS4uH@w0d!HSmx=l-0ZT!y$w&o9Ou*0pCYJU_j5U{)SQ@v=3LcwwLtm3P)x&m4 zYrS-xxbhL9-JjmIDsVRP3!og~{n9Wi0|#5=#3zBT22a-h_!}pI7J~j0-+yF5K?VQ- z@s?1gXba>(Iph+54gAr(kK+f(+6{tC=V4B5^ zUFq&pv3rIBEQB4q6}R$oZEE0f*fE7d^p7@KJ?ve58B$Wr8+CS_F#97xv72zzhPbV* z^`!4=JUWniH4lZ(yF3339oyr$QZYJzZAQvVLR_z+Fl&yGZI8Ep=$7a<=9~Uwe~KlK zt9443K?$A2!VW1NP5LyM&%t5yMx&0vKjsFt)c2#yb;yFxS0ArJ=uE#$o18yQw0$V4W|~X`})=S5Kb#{#}4AApOI@ zmcTRS8q{DEN_bU`)9aFAu?^%d4%moMy?oH7LlJI0c=lo|NI2}2Jj;*4822Vtrj)`0o~eDTrf$M!!|%4@f00z;~to<#k!`#a8IE zO|&FZY(WqImSgl2u}=X}eDna#kb2(RDhKc=tG2jSZ~kCY!#r3{{ltV)V~&Cp`D^Hx zY~yS}e)baLkF6j3jre^AIbB=G=Kj!Q=i5ABJ|GBQniKJE)n<;?K;z>>+gq`SSzRYS zF8~ykAyd>aZ)NM%j z&L*dH0Cwl1m4Jv4NiKImrSI~Xa$H9$x=9#r`PMgPq51NFbvexIE2+JH9QSF(MVNjj zqfLLO0{dW%=(|78xaLbBVtVF%+ay-E@({f{ODoN=Eewru4WJiYYP01t+{IVC=3PQ~ zrltcS{tm~(3|5u>^p#K5_XN;5-OF46sFn@QAMz3B#h7%776h;8n2&XT+DW#cJ_Z&O zUz@7uzv7s!^QgLH(IAoXx5Xs}3KnGP$gR%E1p@zT&!?6O@UYkPNgyLb)VYWMP0oFP zBgoKQxyWn&mbA==I)ia0IxqxXPn{Uv$PO;ZKOU?>S7~Rm6c`lUi@ps?p2YjAR{wdJ{d{h5?OBww>0@d3ZR zUdIJg=eq^ch$X&1A|#E3>wT}T@{j%W#o+AgRRV+cqVnp5n>Y#~8nbT|(BbPx8DHMN2m*fiOT2A%s|@Vq zeSmRX*@4fqL%nKt>EshSx%%7SygApSKS=h}yyMN_DXnzkOE(s`#&Gqg$rf2amXy@o z8?w?U4IujJ%HEHjE|RWbcxw#}v_ph<>Od2-@MQ{QgP6k?$Y+Y_KM2g?(|XffflV># zjR>{Ni|~3{xYa%H9t#CqLL2xlok#|ivutIfvK0HEd|-eN89$UPHx;OFIg4=rJ7nM__MK0Au|+x5=bGn4~Nl6yEM zbJd?`3+7Kx#4M7Rg2+|bhz+@e018@}!2nrY8O z|0%HFJDjOE!yHicSz1>j0#<$*vGnrloM9h?`2AiQan=O;AUgn75U?bx0Inov_0Co= zpP>3RzZ;y*<2+>$3rfYuR+W+jdpiAqEy7|#(y{oL`EeGjsRK*7$*E@#$kL)dn8-8e zl_qhGomi!aPqv7F)Gd>qodaXvdjV;D$|~ds;`hebMtCIxdkPkC41ou_$G{QxTj>Wz zc*OUxD*qf2h8#!J=+#2t@(})N-`@tUsU)pKZk{Xfeb2bm7#C4^|EI{)E8m2`P4PED zr8wsl=^z;?kN1$y0j`Xm*r)VZxI*qXHxt>8>Hb3cT0AvpIGre-)s@x# z*^hyLc0(cvu<>6LK^GB=SB|Z&rx4z+1Yh!b@C=dS`XRI&sovXpwui*u;X<8r7$qVX z=J)8k=ir3ZMLLyUNpGlK6-Jt0p#i0J5Z)2Wt9z~zGaZcB*%acD7%n!-=gw}%7Cs2g z_agH&yF{7+c%r8utBwM%K=-(?S0z+|V+i*iVwmNm z440HlxunrJSDEnHGn~U2`aa5yc$}#B0+3uC2fT-yxX&g5(Tc9qfrBd=WEsKWS@viC z0fm-~dz7k*gWoc{sgC)A;L5nvQ;_7mqoa#Mr*XwC`wWZQaaHJ114!ll55&j&5k=N;VwUq<-dj`cB%^v>3?Nzi9r zxU9OyV)jsmXoqr8VGD)ji#cO})AfSym2+N`VzF(=D z-1nQQx)hN1LwQoxxLo=aaw>IcD>f%2>Q%5iVud$Vu@Uf-BQ25=$dZ&xg%e#1S&(>y z;)td`{TJW1-2j`#lQULjzk+Au-3w^rZp5(T|MKKal98_%a2FG(TEHr zc59%TG58u$Km(+?CjJiX*KU|YVjf!yQ;=IBmvsx4_q=0p5$?a$6HY${+(uAqz~{lu zIRZaqnwEdkn!{re-XSA;8a%oZWo|fx;e%#>K=GgPJICwPm zq9|YLMO81iWlxn2(Q0hDfkED$A8wlZyg*t-`5gWtJu9c%d^4^>#PXwRd+Goj&5PW> zZ7N6`&7IwGhJUbS8PoWEcx`jzIVQ|(Gd_fp)UNjK=!fXger{)Ejt9Q>+L^J2t^?VbSby`2=}{?WpqtGhv2SKQ^J!{1`q zMTfy>9^_yc9lfRE+FAzW`}ZQr9~EL^g3!Uz0{d{gyt@q%k#P z_4OB?uFwWuBicnCAH9n=f9%p&G6cD#{J(=|_@S4jZW?$fmg{t~ z>D4(dcT7;H-Imvldao`NttFR|xmpZN79Z_{H0i}bSZ)n~DRvt1xWH43Y z-o1$k(VJWyUf5gw**rK{7>6xLrSSM0T6+b_r5gTz8HZe&a7yhejQ!i=v$skPo*UXx zRNs%qhrukul}+~m51vREC4km?wzs?W&vGo#ThCt=m!7BJSPF(a`qC|i$X(;VYMb?> zudsx7I&Qyf<{4G@h-CJTyA#Uq_v@}{=W4qNmYhQ6Pf;MhII^TAEf~+VN89f6JTw?I zGaWtOxr!X7u_gZOKAf$G=qiifx&A1wx2n%YZ!7uitM7`JdtIA|r{I)RIPvczVX4p0 z^AWzhCN%A~hWVC^BBPqxZiBXzQ5;=F4}9^^}ux6?_4g1{bm8`yxeyeDuXJGnhF8YheR&K0Bbt)|a*-_49h zA6&fJOwSbJAk4t4cwg*8Nqa7CF6xIh|3OpsNTg;c2X@QOS3A)sT*KU<8=p>3_~YoL zNjc^aZ{BYJ3>dJLt>Go|u}a8Q4&aq+txo>cC>~r11FY%BgEwQcpb%*B}+Rn=00`326@7jNwzM?o~Okk4< zgG3Q|zeZqyBCi!FAf!A7RmldKvf?VQ4Q!Q1A(WPfSdo`99VlXlbR%^_VJw!6(#D2T zK%iS7DncpGl@7|+GHCm4zwLM5n*9|E_lNt#JvlcwpL0&mx%ZQs^H|GXDZ=zbZ^{QM z1#^*CLPiVQ&iOGg3aHE#EqMAO?C8&~$y8K$ z^W=rYg^-m>Y5&7*ZSL6e2yDd;FcRV}Fl!FLXe%i)*xVM+PdjhMTvWT)>lF9K%{<~w z9A!oQ8&M8{^xS36?nUW_?gQ$MJ29#)$R`ex@i#kxmSfer8^SY?SzJh@lZ=>*R7DTO z+AX|fQmnLp03#o{%t!v5fCUbGaq!ZW)C^6;ps7eBgTPRblh~)1_}@KbXt6e$Z<&$t z*>A~@l|)W&@bf!%HvJs(7}{e?IwTI|T4WVh_TX5IktWglo!=R=T{=;Atz^KUJ*q$3 z=?j@M+1GkdO;WTnLX{+cdL&b0UbjVn7KgPAy&o}Dr-hpgW$WJDx=WGHDT}I4iRRvB z!af?m6?E1Ov#`;~3&4jUE(c|Zw~3~MI|Gk6WNL+1)Y5cAmE-rG?**8q?y~mJKz4$T zXG%S0-F=r0?uB=6ck5-P`}zAg-M#UcVoKoLU;25iL?FIhw%DQ-Wgn-qdno`JtWMHB zpXmZmMU!^Bcrc3g&1y0PLSoIt=*Nsq?uc(bj73rkx&yvktj1YXDQaic-F4*oH)~*i z36MhJc95G{SZn!@G*h$~4ItdQhxf@8pn+$3l|9N7C?NIgY3v%~?W`u&-j(^1ob=I3 zVmXvad6p&WZA@BnT^W@EifBxP{1Zl{#Z1)Y_e=Nr>`wiDU|Y;D6-Z2TBNLmxPW$=r zPW!3iyy3Z+ID<+u(rtKp6jg9*f#x7BGRLRGB!NA!iQXcs)brB~bw|qS5KaH8F=PQ` zmlL13r`FGqC1d}*_VN2-^$!nXj|VU0@LoAi!;7lz$GdG=KZ0lAp8{+UcO%9d9PR0a z@xNZMK`r!9@xTf7-pn;3;3DPs?hTRq7AjCSNw$Dh_95r1d}*$wDk023_Dl`lZofGx z4IWdM;YfQEyTS~7+L+JVGRoj~frXeq3J)H!~31UoR8A zg=h1<2F>7tSCqfMTD&WwCWlijt&wB6Rp(pv8N*}7T@HDgzN@2xh$XToUSWuIRXVjG zyq{!->|qU@ZH+`B&D)H=WLIxulsevut1{{axaA@QBqA}YbIiZBLvp|C(n^BKyOo3K qKWGksH~_*JA_so(zsI1=TM3(t5`x{+2^%L&kdYXl8rK(_Rr4>-dT*cr literal 0 HcmV?d00001 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.png.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.png.meta new file mode 100644 index 000000000..ef78a7544 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 56f5f2fbc1025d64f8ac75874c48b4e1 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset new file mode 100644 index 000000000..3fdd44144 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6b194f808b1af6499c93410e504af42, type: 3} + m_Name: whirlyblendmodes_Atlas + m_EditorClassIdentifier: spine-unity::Spine.Unity.SpineAtlasAsset + serializedMaterialOverrides: [] + textureLoadingMode: 0 + onDemandTextureLoader: {fileID: 0} + atlasFile: {fileID: 4900000, guid: d4fe1661c50e86b4a951b11855a4f44f, type: 3} + materials: + - {fileID: 2100000, guid: 17b5573ded7e02d49a155f13d7e8a6a6, type: 2} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset.meta new file mode 100644 index 000000000..72454ec9d --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Atlas.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8c363a61a0bc21d43b6a0ebef815e9dc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat new file mode 100644 index 000000000..f5a73a90c --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat @@ -0,0 +1,57 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: whirlyblendmodes_Material-Multiply + m_Shader: {fileID: 4800000, guid: 8bdcdc7ee298e594a9c20c61d25c33b6, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _STRAIGHT_ALPHA_INPUT + m_InvalidKeywords: + - _USE8NEIGHBOURHOOD_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - : + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 56f5f2fbc1025d64f8ac75874c48b4e1, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - : 0 + - _Cutoff: 0.1 + - _Fill: 0 + - _OutlineMipLevel: 0 + - _OutlineOpaqueAlpha: 1 + - _OutlineReferenceTexWidth: 1024 + - _OutlineSmoothness: 1 + - _OutlineWidth: 3 + - _StencilComp: 8 + - _StencilRef: 1 + - _StraightAlphaInput: 1 + - _ThresholdEnd: 0.25 + - _Use8Neighbourhood: 1 + - _UseScreenSpaceOutlineWidth: 0 + m_Colors: + - : {r: 0, g: 2.018574, b: 1e-45, a: 0.000007110106} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _OutlineColor: {r: 1, g: 1, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat.meta new file mode 100644 index 000000000..ab6f6ed21 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Multiply.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c3ebf8286d77e014ab400e79cbe037b9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat new file mode 100644 index 000000000..4c0266fff --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat @@ -0,0 +1,57 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: whirlyblendmodes_Material-Screen + m_Shader: {fileID: 4800000, guid: 4e8caa36c07aacf4ab270da00784e4d9, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _STRAIGHT_ALPHA_INPUT + m_InvalidKeywords: + - _USE8NEIGHBOURHOOD_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - : + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 56f5f2fbc1025d64f8ac75874c48b4e1, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - : 0 + - _Cutoff: 0.1 + - _Fill: 0 + - _OutlineMipLevel: 0 + - _OutlineOpaqueAlpha: 1 + - _OutlineReferenceTexWidth: 1024 + - _OutlineSmoothness: 1 + - _OutlineWidth: 3 + - _StencilComp: 8 + - _StencilRef: 1 + - _StraightAlphaInput: 1 + - _ThresholdEnd: 0.25 + - _Use8Neighbourhood: 1 + - _UseScreenSpaceOutlineWidth: 0 + m_Colors: + - : {r: 0, g: 2.018574, b: 1e-45, a: 0.000007121922} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _OutlineColor: {r: 1, g: 1, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat.meta new file mode 100644 index 000000000..a123ad2d5 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material-Screen.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2b67e1dec82fb464c87254223445e12a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat new file mode 100644 index 000000000..ab5621220 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat @@ -0,0 +1,50 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: whirlyblendmodes_Material + m_Shader: {fileID: 4800000, guid: 1e8a610c9e01c3648bac42585e5fc676, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _STRAIGHT_ALPHA_INPUT + m_InvalidKeywords: + - _USE8NEIGHBOURHOOD_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 2800000, guid: 56f5f2fbc1025d64f8ac75874c48b4e1, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _Cutoff: 0.1 + - _Fill: 0 + - _OutlineMipLevel: 0 + - _OutlineOpaqueAlpha: 1 + - _OutlineReferenceTexWidth: 1024 + - _OutlineSmoothness: 1 + - _OutlineWidth: 3 + - _StencilComp: 8 + - _StencilRef: 1 + - _StraightAlphaInput: 1 + - _ThresholdEnd: 0.25 + - _Use8Neighbourhood: 1 + - _UseScreenSpaceOutlineWidth: 0 + m_Colors: + - _OutlineColor: {r: 1, g: 1, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat.meta new file mode 100644 index 000000000..b088dbae5 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_Material.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 17b5573ded7e02d49a155f13d7e8a6a6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset new file mode 100644 index 000000000..27d2aeed8 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f1b3b4b945939a54ea0b23d3396115fb, type: 3} + m_Name: whirlyblendmodes_SkeletonData + m_EditorClassIdentifier: spine-unity::Spine.Unity.SkeletonDataAsset + atlasAssets: + - {fileID: 11400000, guid: 8c363a61a0bc21d43b6a0ebef815e9dc, type: 2} + scale: 0.01 + skeletonJSON: {fileID: 4900000, guid: 9e190d520b56f3c4d823981b48c3e131, type: 3} + isUpgradingBlendModeMaterials: 0 + blendModeMaterials: + requiresBlendModeMaterials: 1 + applyAdditiveMaterial: 0 + additiveMaterials: [] + multiplyMaterials: + - pageName: whirlyblendmodes.png + material: {fileID: 2100000, guid: c3ebf8286d77e014ab400e79cbe037b9, type: 2} + screenMaterials: + - pageName: whirlyblendmodes.png + material: {fileID: 2100000, guid: 2b67e1dec82fb464c87254223445e12a, type: 2} + skeletonDataModifiers: [] + fromAnimation: [] + toAnimation: [] + duration: [] + defaultMix: 0.2 + controller: {fileID: 0} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset.meta new file mode 100644 index 000000000..703303e30 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/Spine Skeletons/whirlyblendmodes/whirlyblendmodes_SkeletonData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad972744e16a88445ac76c691dbfc937 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/SpineUIToolkit.uxml b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/SpineUIToolkit.uxml index 0af34ac93..06d95ece0 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/SpineUIToolkit.uxml +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Samples~/Examples/SpineUIToolkit.uxml @@ -1,11 +1,28 @@ - + - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders.meta new file mode 100644 index 000000000..84fb27914 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a0478fd21e9daa047b9426b503d9098f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader new file mode 100644 index 000000000..bc9884498 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader @@ -0,0 +1,439 @@ +Shader "Spine/UITK/Additive" +{ + Properties + { + [ToggleUI]_StraightAlphaTexture("Straight Alpha Texture", Float) = 1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + } + SubShader + { + Tags + { + "RenderPipeline"="UniversalPipeline" + "RenderType"="Transparent" + "Queue"="Transparent" + // DisableBatching: + "ShaderGraphShader"="true" + "ShaderGraphTargetId"="" + "IgnoreProjector"="True" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Pass + { + Name "Default" + Tags + { + // LightMode: + } + + // Render State + Cull Off + Blend One One + ZWrite Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 3.5 + #pragma vertex uie_custom_vert + #pragma fragment uie_custom_frag + + // Keywords + #pragma multi_compile_local _ _UIE_FORCE_GAMMA + #pragma multi_compile_local _ _UIE_TEXTURE_SLOT_COUNT_4 _UIE_TEXTURE_SLOT_COUNT_2 _UIE_TEXTURE_SLOT_COUNT_1 + #pragma multi_compile_local _ _UIE_RENDER_TYPE_SOLID _UIE_RENDER_TYPE_TEXTURE _UIE_RENDER_TYPE_TEXT _UIE_RENDER_TYPE_GRADIENT + // GraphKeywords: + + #define UITK_SHADERGRAPH + + // Defines + #define _SURFACE_TYPE_TRANSPARENT 1 + #define _ALPHAPREMULTIPLY_ON 1 + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define FEATURES_GRAPH_VERTEX + + #define REQUIRE_DEPTH_TEXTURE + #define REQUIRE_NORMAL_TEXTURE + + #define SHADERPASS SHADERPASS_CUSTOM_UI + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/UIShim.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + + struct Attributes + { + float3 positionOS : POSITION; + float4 color : COLOR; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 uv4 : TEXCOORD4; + float4 uv5 : TEXCOORD5; + float4 uv6 : TEXCOORD6; + float4 uv7 : TEXCOORD7; + #if UNITY_ANY_INSTANCING_ENABLED || defined(ATTRIBUTES_NEED_INSTANCEID) + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 color; + float4 typeTexSettings; + float2 textCoreLoc; + float4 circle; + float4 uvClip; + float2 layoutUV; + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float4 texCoord0; + float4 texCoord1; + float4 texCoord3; + float4 texCoord4; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + }; + struct VertexDescriptionInputs + { + float4 vertexPosition; + float4 vertexColor; + float4 uv; + float4 xformClipPages; + float4 ids; + float4 flags; + float4 opacityColorPages; + float4 settingIndex; + float4 circle; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float4 texCoord0 : INTERP0; + float4 texCoord1 : INTERP1; + float4 texCoord3 : INTERP2; + float4 texCoord4 : INTERP3; + float4 color : INTERP4; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.texCoord0.xyzw = input.texCoord0; + output.texCoord1.xyzw = input.texCoord1; + output.texCoord3.xyzw = input.texCoord3; + output.texCoord4.xyzw = input.texCoord4; + output.color.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.texCoord0 = input.texCoord0.xyzw; + output.texCoord1 = input.texCoord1.xyzw; + output.texCoord3 = input.texCoord3.xyzw; + output.texCoord4 = input.texCoord4.xyzw; + output.color = input.color.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + return output; + } + + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + //UGUI has no keyword for when a renderer has "bloom", so its nessecary to hardcore it here, like all the base UI shaders. + half4 _TextureSampleAdd; + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float _StraightAlphaTexture; + UNITY_TEXTURE_STREAMING_DEBUG_VARS; + CBUFFER_END + + + // Object and Global properties + + // Graph Includes + // GraphIncludes: + + // Graph Functions + + void Unity_Branch_float(float Predicate, float True, float False, out float Out) + { + Out = Predicate ? True : False; + } + + void Unity_Multiply_float3_float3(float3 A, float3 B, out float3 Out) + { + Out = A * B; + } + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + return description; + } + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreSurface' */ + + // Graph Pixel + struct SurfaceDescription + { + float3 BaseColor; + float Alpha; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4 = float4(1, 1, 0, 1); + [branch] if (_UIE_RENDER_TYPE_SOLID || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeSolid) + { + SolidFragInput Unity_UIE_EvaluateSolidNode_Input; + Unity_UIE_EvaluateSolidNode_Input.tint = IN.color; + Unity_UIE_EvaluateSolidNode_Input.isArc = false; + Unity_UIE_EvaluateSolidNode_Input.outer = float2(-10000, -10000); + Unity_UIE_EvaluateSolidNode_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_EvaluateSolidNode_Output = uie_std_frag_solid(Unity_UIE_EvaluateSolidNode_Input); + _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4 = Unity_UIE_EvaluateSolidNode_Output.color; + } + float4 _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4 = float4(1, 1, 0, 1); + [branch] if (_UIE_RENDER_TYPE_TEXTURE || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeTexture) + { + TextureFragInput Unity_UIE_EvaluateTextureNode_Input; + Unity_UIE_EvaluateTextureNode_Input.tint = IN.color; + Unity_UIE_EvaluateTextureNode_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_EvaluateTextureNode_Input.uv = IN.uvClip.xy; + Unity_UIE_EvaluateTextureNode_Input.isArc = false; + Unity_UIE_EvaluateTextureNode_Input.outer = float2(-10000, -10000); + Unity_UIE_EvaluateTextureNode_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_EvaluateTextureNode_Output = uie_std_frag_texture(Unity_UIE_EvaluateTextureNode_Input); + _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4 = Unity_UIE_EvaluateTextureNode_Output.color; + } + float3 _Swizzle_c3b6fc22d71a49e49cdeae1847c155da_Out_1_Vector3 = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4.xyz; + float _Property_4e9c19f167f743a2a7022781a02d70f9_Out_0_Boolean = _StraightAlphaTexture; + float _Split_775865f90de4425e89b1219e16b8b1b8_R_1_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[0]; + float _Split_775865f90de4425e89b1219e16b8b1b8_G_2_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[1]; + float _Split_775865f90de4425e89b1219e16b8b1b8_B_3_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[2]; + float _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[3]; + float _Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float; + Unity_Branch_float(_Property_4e9c19f167f743a2a7022781a02d70f9_Out_0_Boolean, _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float, float(1), _Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float); + float3 _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3; + Unity_Multiply_float3_float3(_Swizzle_c3b6fc22d71a49e49cdeae1847c155da_Out_1_Vector3, (_Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float.xxx), _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3); + float4 _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4 = float4( _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3.xyz, _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float.x ); + float3 _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = float3(0, 0, 0); + float _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = 1.0; + [branch] if (_UIE_RENDER_TYPE_SOLID || _UIE_RENDER_TYPE_ANY && TestType(IN.typeTexSettings.x, k_FragTypeSolid)) + { + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4.a; + } + else [branch] if (_UIE_RENDER_TYPE_TEXTURE || _UIE_RENDER_TYPE_ANY && TestType(IN.typeTexSettings.x, k_FragTypeTexture)) + { + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4.a; + } + else [branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && TestType(IN.typeTexSettings.x, k_FragTypeText)) + { + [branch] if (GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0) + { + SdfTextFragInput Unity_UIE_RenderTypeSwitchNode_SdfText_Input; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.tint = IN.color; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.extraDilate = IN.circle.x; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textCoreLoc = round(IN.textCoreLoc); + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.opacity = IN.typeTexSettings.z; + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_sdf_text(Unity_UIE_RenderTypeSwitchNode_SdfText_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a; + } + else + { + BitmapTextFragInput Unity_UIE_RenderTypeSwitchNode_BitmapText_Input; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.tint = IN.color; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.opacity = IN.typeTexSettings.z; + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_bitmap_text(Unity_UIE_RenderTypeSwitchNode_BitmapText_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a; + } + } + else + { + SvgGradientFragInput Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.settingIndex = round(IN.typeTexSettings.z); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.textureSlot = round(IN.typeTexSettings.y); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.isArc = false; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.outer = float2(-10000, -10000); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_svg_gradient(Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb * IN.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a * IN.color.a; + } + surface.BaseColor = _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3; + surface.Alpha = _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + #if UNITY_ANY_INSTANCING_ENABLED + #else // TODO: XR support for procedural instancing because in this case UNITY_ANY_INSTANCING_ENABLED is not defined and instanceID is incorrect. + #endif + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorCopyToSDI' */ + + + + + + + #if UNITY_UV_STARTS_AT_TOP + #else + #endif + + + + #if defined(UNITY_UIE_INCLUDED) + #else + #endif + + + output.color = input.color; + output.uvClip = input.texCoord0; + output.typeTexSettings = input.texCoord1; + output.textCoreLoc = input.texCoord3.xy; + output.layoutUV = input.texCoord3.zw; + + output.circle = input.texCoord4; + + #if UNITY_ANY_INSTANCING_ENABLED + #else // TODO: XR support for procedural instancing because in this case UNITY_ANY_INSTANCING_ENABLED is not defined and instanceID is incorrect. + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UITKPass.hlsl" + + ENDHLSL + } + } + CustomEditor "UnityEditor.ShaderGraph.GenericShaderGraphMaterialGUI" + FallBack off +} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader.meta new file mode 100644 index 000000000..27007601e --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Additive.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9818276b7a7ab2148a8a3ed86c9ac555 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader new file mode 100644 index 000000000..2504c7322 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader @@ -0,0 +1,439 @@ +Shader "Spine/UITK/Multiply" +{ + Properties + { + [ToggleUI]_StraightAlphaTexture("Straight Alpha Texture", Float) = 1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + } + SubShader + { + Tags + { + "RenderPipeline"="UniversalPipeline" + "RenderType"="Transparent" + "Queue"="Transparent" + // DisableBatching: + "ShaderGraphShader"="true" + "ShaderGraphTargetId"="" + "IgnoreProjector"="True" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Pass + { + Name "Default" + Tags + { + // LightMode: + } + + // Render State + Cull Off + Blend DstColor OneMinusSrcAlpha + ZWrite Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 3.5 + #pragma vertex uie_custom_vert + #pragma fragment uie_custom_frag + + // Keywords + #pragma multi_compile_local _ _UIE_FORCE_GAMMA + #pragma multi_compile_local _ _UIE_TEXTURE_SLOT_COUNT_4 _UIE_TEXTURE_SLOT_COUNT_2 _UIE_TEXTURE_SLOT_COUNT_1 + #pragma multi_compile_local _ _UIE_RENDER_TYPE_SOLID _UIE_RENDER_TYPE_TEXTURE _UIE_RENDER_TYPE_TEXT _UIE_RENDER_TYPE_GRADIENT + // GraphKeywords: + + #define UITK_SHADERGRAPH + + // Defines + #define _SURFACE_TYPE_TRANSPARENT 1 + #define _ALPHAPREMULTIPLY_ON 1 + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define FEATURES_GRAPH_VERTEX + + #define REQUIRE_DEPTH_TEXTURE + #define REQUIRE_NORMAL_TEXTURE + + #define SHADERPASS SHADERPASS_CUSTOM_UI + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/UIShim.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + + struct Attributes + { + float3 positionOS : POSITION; + float4 color : COLOR; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 uv4 : TEXCOORD4; + float4 uv5 : TEXCOORD5; + float4 uv6 : TEXCOORD6; + float4 uv7 : TEXCOORD7; + #if UNITY_ANY_INSTANCING_ENABLED || defined(ATTRIBUTES_NEED_INSTANCEID) + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 color; + float4 typeTexSettings; + float2 textCoreLoc; + float4 circle; + float4 uvClip; + float2 layoutUV; + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float4 texCoord0; + float4 texCoord1; + float4 texCoord3; + float4 texCoord4; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + }; + struct VertexDescriptionInputs + { + float4 vertexPosition; + float4 vertexColor; + float4 uv; + float4 xformClipPages; + float4 ids; + float4 flags; + float4 opacityColorPages; + float4 settingIndex; + float4 circle; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float4 texCoord0 : INTERP0; + float4 texCoord1 : INTERP1; + float4 texCoord3 : INTERP2; + float4 texCoord4 : INTERP3; + float4 color : INTERP4; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.texCoord0.xyzw = input.texCoord0; + output.texCoord1.xyzw = input.texCoord1; + output.texCoord3.xyzw = input.texCoord3; + output.texCoord4.xyzw = input.texCoord4; + output.color.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.texCoord0 = input.texCoord0.xyzw; + output.texCoord1 = input.texCoord1.xyzw; + output.texCoord3 = input.texCoord3.xyzw; + output.texCoord4 = input.texCoord4.xyzw; + output.color = input.color.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + return output; + } + + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + //UGUI has no keyword for when a renderer has "bloom", so its nessecary to hardcore it here, like all the base UI shaders. + half4 _TextureSampleAdd; + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float _StraightAlphaTexture; + UNITY_TEXTURE_STREAMING_DEBUG_VARS; + CBUFFER_END + + + // Object and Global properties + + // Graph Includes + // GraphIncludes: + + // Graph Functions + + void Unity_Branch_float(float Predicate, float True, float False, out float Out) + { + Out = Predicate ? True : False; + } + + void Unity_Multiply_float3_float3(float3 A, float3 B, out float3 Out) + { + Out = A * B; + } + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + return description; + } + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreSurface' */ + + // Graph Pixel + struct SurfaceDescription + { + float3 BaseColor; + float Alpha; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4 = float4(1, 1, 0, 1); + [branch] if (_UIE_RENDER_TYPE_SOLID || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeSolid) + { + SolidFragInput Unity_UIE_EvaluateSolidNode_Input; + Unity_UIE_EvaluateSolidNode_Input.tint = IN.color; + Unity_UIE_EvaluateSolidNode_Input.isArc = false; + Unity_UIE_EvaluateSolidNode_Input.outer = float2(-10000, -10000); + Unity_UIE_EvaluateSolidNode_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_EvaluateSolidNode_Output = uie_std_frag_solid(Unity_UIE_EvaluateSolidNode_Input); + _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4 = Unity_UIE_EvaluateSolidNode_Output.color; + } + float4 _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4 = float4(1, 1, 0, 1); + [branch] if (_UIE_RENDER_TYPE_TEXTURE || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeTexture) + { + TextureFragInput Unity_UIE_EvaluateTextureNode_Input; + Unity_UIE_EvaluateTextureNode_Input.tint = IN.color; + Unity_UIE_EvaluateTextureNode_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_EvaluateTextureNode_Input.uv = IN.uvClip.xy; + Unity_UIE_EvaluateTextureNode_Input.isArc = false; + Unity_UIE_EvaluateTextureNode_Input.outer = float2(-10000, -10000); + Unity_UIE_EvaluateTextureNode_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_EvaluateTextureNode_Output = uie_std_frag_texture(Unity_UIE_EvaluateTextureNode_Input); + _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4 = Unity_UIE_EvaluateTextureNode_Output.color; + } + float3 _Swizzle_c3b6fc22d71a49e49cdeae1847c155da_Out_1_Vector3 = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4.xyz; + float _Property_4e9c19f167f743a2a7022781a02d70f9_Out_0_Boolean = _StraightAlphaTexture; + float _Split_775865f90de4425e89b1219e16b8b1b8_R_1_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[0]; + float _Split_775865f90de4425e89b1219e16b8b1b8_G_2_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[1]; + float _Split_775865f90de4425e89b1219e16b8b1b8_B_3_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[2]; + float _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[3]; + float _Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float; + Unity_Branch_float(_Property_4e9c19f167f743a2a7022781a02d70f9_Out_0_Boolean, _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float, float(1), _Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float); + float3 _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3; + Unity_Multiply_float3_float3(_Swizzle_c3b6fc22d71a49e49cdeae1847c155da_Out_1_Vector3, (_Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float.xxx), _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3); + float4 _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4 = float4( _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3.xyz, _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float.x ); + float3 _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = float3(0, 0, 0); + float _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = 1.0; + [branch] if (_UIE_RENDER_TYPE_SOLID || _UIE_RENDER_TYPE_ANY && TestType(IN.typeTexSettings.x, k_FragTypeSolid)) + { + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4.a; + } + else [branch] if (_UIE_RENDER_TYPE_TEXTURE || _UIE_RENDER_TYPE_ANY && TestType(IN.typeTexSettings.x, k_FragTypeTexture)) + { + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4.a; + } + else [branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && TestType(IN.typeTexSettings.x, k_FragTypeText)) + { + [branch] if (GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0) + { + SdfTextFragInput Unity_UIE_RenderTypeSwitchNode_SdfText_Input; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.tint = IN.color; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.extraDilate = IN.circle.x; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textCoreLoc = round(IN.textCoreLoc); + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.opacity = IN.typeTexSettings.z; + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_sdf_text(Unity_UIE_RenderTypeSwitchNode_SdfText_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a; + } + else + { + BitmapTextFragInput Unity_UIE_RenderTypeSwitchNode_BitmapText_Input; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.tint = IN.color; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.opacity = IN.typeTexSettings.z; + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_bitmap_text(Unity_UIE_RenderTypeSwitchNode_BitmapText_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a; + } + } + else + { + SvgGradientFragInput Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.settingIndex = round(IN.typeTexSettings.z); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.textureSlot = round(IN.typeTexSettings.y); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.isArc = false; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.outer = float2(-10000, -10000); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_svg_gradient(Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb * IN.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a * IN.color.a; + } + surface.BaseColor = _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3; + surface.Alpha = _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + #if UNITY_ANY_INSTANCING_ENABLED + #else // TODO: XR support for procedural instancing because in this case UNITY_ANY_INSTANCING_ENABLED is not defined and instanceID is incorrect. + #endif + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorCopyToSDI' */ + + + + + + + #if UNITY_UV_STARTS_AT_TOP + #else + #endif + + + + #if defined(UNITY_UIE_INCLUDED) + #else + #endif + + + output.color = input.color; + output.uvClip = input.texCoord0; + output.typeTexSettings = input.texCoord1; + output.textCoreLoc = input.texCoord3.xy; + output.layoutUV = input.texCoord3.zw; + + output.circle = input.texCoord4; + + #if UNITY_ANY_INSTANCING_ENABLED + #else // TODO: XR support for procedural instancing because in this case UNITY_ANY_INSTANCING_ENABLED is not defined and instanceID is incorrect. + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UITKPass.hlsl" + + ENDHLSL + } + } + CustomEditor "UnityEditor.ShaderGraph.GenericShaderGraphMaterialGUI" + FallBack off +} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader.meta new file mode 100644 index 000000000..43e5fcd65 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Multiply.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ed93aea253bcdc94a84ee09cd390c587 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph new file mode 100644 index 000000000..170a3a275 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph @@ -0,0 +1,1601 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "f4de081a32f94489b4543e4b45df06eb", + "m_Properties": [ + { + "m_Id": "b8efffcdb161493ea29d9857dbdcee96" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "266e0514b7e64b689fea5f4a76386338" + } + ], + "m_Nodes": [ + { + "m_Id": "4f813a8c3d56482789a2bcbecd1b6fe0" + }, + { + "m_Id": "3ca104e183d441e18505d765a037afa8" + }, + { + "m_Id": "532ba7da13274f1d9adcf8b9b5924c01" + }, + { + "m_Id": "e5d4725ba3424f12a78b05bd317dacfe" + }, + { + "m_Id": "0ff00ac4ba3f46138bd69732235d2fb4" + }, + { + "m_Id": "775865f90de4425e89b1219e16b8b1b8" + }, + { + "m_Id": "d99b3fd6d1a849ea8b7ba160b4f11ece" + }, + { + "m_Id": "4e9c19f167f743a2a7022781a02d70f9" + }, + { + "m_Id": "497e29be0ebf40e7991f43fc57bf1a3e" + }, + { + "m_Id": "c3b6fc22d71a49e49cdeae1847c155da" + }, + { + "m_Id": "1a863cc20632474aa4fef9f0995dc8c9" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [ + { + "m_Id": "29736332519042679a717e4faaa6ce5b" + } + ], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0ff00ac4ba3f46138bd69732235d2fb4" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "775865f90de4425e89b1219e16b8b1b8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0ff00ac4ba3f46138bd69732235d2fb4" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c3b6fc22d71a49e49cdeae1847c155da" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1a863cc20632474aa4fef9f0995dc8c9" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "532ba7da13274f1d9adcf8b9b5924c01" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "497e29be0ebf40e7991f43fc57bf1a3e" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d99b3fd6d1a849ea8b7ba160b4f11ece" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4e9c19f167f743a2a7022781a02d70f9" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "497e29be0ebf40e7991f43fc57bf1a3e" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "532ba7da13274f1d9adcf8b9b5924c01" + }, + "m_SlotId": 5 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4f813a8c3d56482789a2bcbecd1b6fe0" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "532ba7da13274f1d9adcf8b9b5924c01" + }, + "m_SlotId": 6 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3ca104e183d441e18505d765a037afa8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "775865f90de4425e89b1219e16b8b1b8" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "1a863cc20632474aa4fef9f0995dc8c9" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "775865f90de4425e89b1219e16b8b1b8" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "497e29be0ebf40e7991f43fc57bf1a3e" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c3b6fc22d71a49e49cdeae1847c155da" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d99b3fd6d1a849ea8b7ba160b4f11ece" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d99b3fd6d1a849ea8b7ba160b4f11ece" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "1a863cc20632474aa4fef9f0995dc8c9" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e5d4725ba3424f12a78b05bd317dacfe" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "532ba7da13274f1d9adcf8b9b5924c01" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 254.0000457763672, + "y": 23.000017166137697 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 391.9999694824219, + "y": 286.0 + }, + "m_Blocks": [ + { + "m_Id": "4f813a8c3d56482789a2bcbecd1b6fe0" + }, + { + "m_Id": "3ca104e183d441e18505d765a037afa8" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_SubDatas": [], + "m_ActiveTargets": [ + { + "m_Id": "d7e31537adc443cc9e6bcdb02c8a3074" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "07054ca48f7d4ab6ad2468c54e6083cf", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "08413eea3d654e509dd509f85012b8c6", + "m_Id": 6, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultTextureNode", + "m_ObjectId": "0ff00ac4ba3f46138bd69732235d2fb4", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Default Texture", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -1056.0, + "y": 184.99998474121095, + "width": 164.00006103515626, + "height": 100.99998474121094 + } + }, + "m_Slots": [ + { + "m_Id": "be5459bf033c4291b925892b508968fc" + }, + { + "m_Id": "662fce56901046ce9b9d9f7b35f11ec2" + }, + { + "m_Id": "2437d2c7e618447784b00b47279c36aa" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1993d85a77c745ccaddd69314f966124", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AppendVectorNode", + "m_ObjectId": "1a863cc20632474aa4fef9f0995dc8c9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Append", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -231.00001525878907, + "y": 271.0, + "width": 129.99996948242188, + "height": 117.99996948242188 + } + }, + "m_Slots": [ + { + "m_Id": "7d26e74e52fe44b98575e5694eeb88a3" + }, + { + "m_Id": "dc4af3eafede4050b415df3f29270e07" + }, + { + "m_Id": "68e2a96b35b24fbe94187bf7941f3388" + } + ], + "synonyms": [ + "join", + "combine" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBAMaterialSlot", + "m_ObjectId": "2437d2c7e618447784b00b47279c36aa", + "m_Id": 2, + "m_DisplayName": "Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 2, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "266e0514b7e64b689fea5f4a76386338", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "b8efffcdb161493ea29d9857dbdcee96" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.StickyNoteData", + "m_ObjectId": "29736332519042679a717e4faaa6ce5b", + "m_Title": "PMA Texture", + "m_Content": "if (straightAlphaTexture)\n texture.rgb *= texture.a;", + "m_TextSize": 1, + "m_Theme": 0, + "m_Position": { + "serializedVersion": "2", + "x": -1144.0, + "y": 23.0, + "width": 1080.0, + "height": 499.8832092285156 + }, + "m_Group": { + "m_Id": "" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "36cedeec57ff465bac4282c237af14f0", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "37cb1ab9eace4a59b8aee182c37dde1d", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3ca104e183d441e18505d765a037afa8", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "5da51d9f840a4ddc8b6541da6376ad65" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3e5ee2b1bacc46f4a483ea61ef68c058", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BranchNode", + "m_ObjectId": "497e29be0ebf40e7991f43fc57bf1a3e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Branch", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -621.0, + "y": 219.00001525878907, + "width": 170.00003051757813, + "height": 141.9999542236328 + } + }, + "m_Slots": [ + { + "m_Id": "4ce5e80e11b94e948933751a627bc2cc" + }, + { + "m_Id": "751a372a8dea499b9f87f9059859f8e9" + }, + { + "m_Id": "f7e65ffb1dcd49cdbe10ba2e021a6e45" + }, + { + "m_Id": "7b23876812744b27b424d9c29c569f86" + } + ], + "synonyms": [ + "switch", + "if", + "else" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "4ce5e80e11b94e948933751a627bc2cc", + "m_Id": 0, + "m_DisplayName": "Predicate", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Predicate", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4e9c19f167f743a2a7022781a02d70f9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -850.9999389648438, + "y": 252.0, + "width": 193.0, + "height": 33.999969482421878 + } + }, + "m_Slots": [ + { + "m_Id": "ac8fbb25895245e2ba09c61739da0e1a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "b8efffcdb161493ea29d9857dbdcee96" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "4f813a8c3d56482789a2bcbecd1b6fe0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "5cc6d14de9cf4423b02705b90f845cf3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.RenderTypeBranchNode", + "m_ObjectId": "532ba7da13274f1d9adcf8b9b5924c01", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Render Type Branch", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 61.000038146972659, + "y": 286.0, + "width": 193.0, + "height": 173.00006103515626 + } + }, + "m_Slots": [ + { + "m_Id": "f7083f60458d44b596d25a3e6401bd26" + }, + { + "m_Id": "ade3fc5a902749bd905185a4bb36f3f5" + }, + { + "m_Id": "c37711e96a764ea691ff2503bb672c50" + }, + { + "m_Id": "939d2ef0a2d7421d80a88fe6fec4452f" + }, + { + "m_Id": "8234cfac6a2f480da91e65ff5135bdd6" + }, + { + "m_Id": "5f0aff867e0a4da9a27746fbdbb3c37e" + }, + { + "m_Id": "08413eea3d654e509dd509f85012b8c6" + } + ], + "synonyms": [ + "toggle", + "uber" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "58192af92eff47ebae53fda06eb96d96", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "5cc6d14de9cf4423b02705b90f845cf3", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5da51d9f840a4ddc8b6541da6376ad65", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "5f0aff867e0a4da9a27746fbdbb3c37e", + "m_Id": 5, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 2, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + }, + "m_DefaultValue": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultVector4MaterialSlot", + "m_ObjectId": "662fce56901046ce9b9d9f7b35f11ec2", + "m_Id": 1, + "m_DisplayName": "Tint", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tint", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_DefaultLabel": "Default" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "68e2a96b35b24fbe94187bf7941f3388", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6f6b9bf9cf3c4aa2a13e9cd2476d54a8", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "751a372a8dea499b9f87f9059859f8e9", + "m_Id": 1, + "m_DisplayName": "True", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "True", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "775865f90de4425e89b1219e16b8b1b8", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -834.9999389648438, + "y": 342.0, + "width": 119.99993896484375, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "6f6b9bf9cf3c4aa2a13e9cd2476d54a8" + }, + { + "m_Id": "58192af92eff47ebae53fda06eb96d96" + }, + { + "m_Id": "1993d85a77c745ccaddd69314f966124" + }, + { + "m_Id": "37cb1ab9eace4a59b8aee182c37dde1d" + }, + { + "m_Id": "36cedeec57ff465bac4282c237af14f0" + } + ], + "synonyms": [ + "separate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7b23876812744b27b424d9c29c569f86", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7d26e74e52fe44b98575e5694eeb88a3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultVector4MaterialSlot", + "m_ObjectId": "8234cfac6a2f480da91e65ff5135bdd6", + "m_Id": 4, + "m_DisplayName": "Gradient", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Gradient", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_DefaultLabel": "Default" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBAMaterialSlot", + "m_ObjectId": "8b2cdcd8838448798a39a38765437766", + "m_Id": 0, + "m_DisplayName": "Solid", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Solid", + "m_StageCapability": 2, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUISubTarget", + "m_ObjectId": "8f7f9a1d028e4fce8ac9fa38d1cc4fd0" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "921c30d183ab4862947ba4551265d5a8", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultVector4MaterialSlot", + "m_ObjectId": "939d2ef0a2d7421d80a88fe6fec4452f", + "m_Id": 3, + "m_DisplayName": "Bitmap Text", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Bitmap Text", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_DefaultLabel": "Default" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.UITK.ShaderGraph.UIData", + "m_ObjectId": "ab0855ef9bdb471a8eb85efbdfe3fb12", + "m_Version": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "ac8fbb25895245e2ba09c61739da0e1a", + "m_Id": 0, + "m_DisplayName": "Straight Alpha Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultVector4MaterialSlot", + "m_ObjectId": "ade3fc5a902749bd905185a4bb36f3f5", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_DefaultLabel": "Default" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b5a6010865274b6ba2016feb05e41448", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "b8efffcdb161493ea29d9857dbdcee96", + "m_Guid": { + "m_GuidSerialized": "5ddb173a-7e47-4892-9c17-2bb3693da035" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "Straight Alpha Texture", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "Straight Alpha Texture", + "m_DefaultReferenceName": "_Straight_Alpha_Texture", + "m_OverrideReferenceName": "_StraightAlphaTexture", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "bc433a99b2f54f87b0c864209323dbdf", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultVector2MaterialSlot", + "m_ObjectId": "be5459bf033c4291b925892b508968fc", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_DefaultLabel": "Default" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultVector4MaterialSlot", + "m_ObjectId": "c37711e96a764ea691ff2503bb672c50", + "m_Id": 2, + "m_DisplayName": "SDF Text", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDF Text", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_DefaultLabel": "Default" +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.SwizzleNode", + "m_ObjectId": "c3b6fc22d71a49e49cdeae1847c155da", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Swizzle", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -715.0, + "y": 86.00001525878906, + "width": 132.0, + "height": 121.99996948242188 + } + }, + "m_Slots": [ + { + "m_Id": "3e5ee2b1bacc46f4a483ea61ef68c058" + }, + { + "m_Id": "921c30d183ab4862947ba4551265d5a8" + } + ], + "synonyms": [ + "swap", + "reorder", + "component mask" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "_maskInput": "xyz", + "convertedMask": "xyz" +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "d7e31537adc443cc9e6bcdb02c8a3074", + "m_Datas": [ + { + "m_Id": "ab0855ef9bdb471a8eb85efbdfe3fb12" + } + ], + "m_ActiveSubTarget": { + "m_Id": "8f7f9a1d028e4fce8ac9fa38d1cc4fd0" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 1, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_DisableTint": false, + "m_Sort3DAs2DCompatible": false, + "m_AdditionalMotionVectorMode": 0, + "m_AlembicMotionVectors": false, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "d99b3fd6d1a849ea8b7ba160b4f11ece", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -401.9999694824219, + "y": 207.99998474121095, + "width": 129.99996948242188, + "height": 118.00001525878906 + } + }, + "m_Slots": [ + { + "m_Id": "bc433a99b2f54f87b0c864209323dbdf" + }, + { + "m_Id": "b5a6010865274b6ba2016feb05e41448" + }, + { + "m_Id": "07054ca48f7d4ab6ad2468c54e6083cf" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "dc4af3eafede4050b415df3f29270e07", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultSolidNode", + "m_ObjectId": "e5d4725ba3424f12a78b05bd317dacfe", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Default Solid", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -120.00006866455078, + "y": -35.99998092651367, + "width": 119.00006103515625, + "height": 76.99998474121094 + } + }, + "m_Slots": [ + { + "m_Id": "8b2cdcd8838448798a39a38765437766" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DefaultVector4MaterialSlot", + "m_ObjectId": "f7083f60458d44b596d25a3e6401bd26", + "m_Id": 0, + "m_DisplayName": "Solid", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Solid", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_DefaultLabel": "Default" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f7e65ffb1dcd49cdbe10ba2e021a6e45", + "m_Id": 2, + "m_DisplayName": "False", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "False", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph.meta new file mode 100644 index 000000000..306b69b2d --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Normal.shadergraph.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 1baeaee5c1b883a418362717b2ca2fb7 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} + useAsTemplate: 0 + exposeTemplateAsShader: 0 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader new file mode 100644 index 000000000..9846f2962 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader @@ -0,0 +1,439 @@ +Shader "Spine/UITK/Screen" +{ + Properties + { + [ToggleUI]_StraightAlphaTexture("Straight Alpha Texture", Float) = 1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + } + SubShader + { + Tags + { + "RenderPipeline"="UniversalPipeline" + "RenderType"="Transparent" + "Queue"="Transparent" + // DisableBatching: + "ShaderGraphShader"="true" + "ShaderGraphTargetId"="" + "IgnoreProjector"="True" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Pass + { + Name "Default" + Tags + { + // LightMode: + } + + // Render State + Cull Off + Blend One OneMinusSrcColor + ZWrite Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 3.5 + #pragma vertex uie_custom_vert + #pragma fragment uie_custom_frag + + // Keywords + #pragma multi_compile_local _ _UIE_FORCE_GAMMA + #pragma multi_compile_local _ _UIE_TEXTURE_SLOT_COUNT_4 _UIE_TEXTURE_SLOT_COUNT_2 _UIE_TEXTURE_SLOT_COUNT_1 + #pragma multi_compile_local _ _UIE_RENDER_TYPE_SOLID _UIE_RENDER_TYPE_TEXTURE _UIE_RENDER_TYPE_TEXT _UIE_RENDER_TYPE_GRADIENT + // GraphKeywords: + + #define UITK_SHADERGRAPH + + // Defines + #define _SURFACE_TYPE_TRANSPARENT 1 + #define _ALPHAPREMULTIPLY_ON 1 + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define FEATURES_GRAPH_VERTEX + + #define REQUIRE_DEPTH_TEXTURE + #define REQUIRE_NORMAL_TEXTURE + + #define SHADERPASS SHADERPASS_CUSTOM_UI + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/UIShim.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + + struct Attributes + { + float3 positionOS : POSITION; + float4 color : COLOR; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 uv4 : TEXCOORD4; + float4 uv5 : TEXCOORD5; + float4 uv6 : TEXCOORD6; + float4 uv7 : TEXCOORD7; + #if UNITY_ANY_INSTANCING_ENABLED || defined(ATTRIBUTES_NEED_INSTANCEID) + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 color; + float4 typeTexSettings; + float2 textCoreLoc; + float4 circle; + float4 uvClip; + float2 layoutUV; + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float4 texCoord0; + float4 texCoord1; + float4 texCoord3; + float4 texCoord4; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + }; + struct VertexDescriptionInputs + { + float4 vertexPosition; + float4 vertexColor; + float4 uv; + float4 xformClipPages; + float4 ids; + float4 flags; + float4 opacityColorPages; + float4 settingIndex; + float4 circle; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float4 texCoord0 : INTERP0; + float4 texCoord1 : INTERP1; + float4 texCoord3 : INTERP2; + float4 texCoord4 : INTERP3; + float4 color : INTERP4; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.texCoord0.xyzw = input.texCoord0; + output.texCoord1.xyzw = input.texCoord1; + output.texCoord3.xyzw = input.texCoord3; + output.texCoord4.xyzw = input.texCoord4; + output.color.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.texCoord0 = input.texCoord0.xyzw; + output.texCoord1 = input.texCoord1.xyzw; + output.texCoord3 = input.texCoord3.xyzw; + output.texCoord4 = input.texCoord4.xyzw; + output.color = input.color.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED || defined(VARYINGS_NEED_INSTANCEID) + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + return output; + } + + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + //UGUI has no keyword for when a renderer has "bloom", so its nessecary to hardcore it here, like all the base UI shaders. + half4 _TextureSampleAdd; + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float _StraightAlphaTexture; + UNITY_TEXTURE_STREAMING_DEBUG_VARS; + CBUFFER_END + + + // Object and Global properties + + // Graph Includes + // GraphIncludes: + + // Graph Functions + + void Unity_Branch_float(float Predicate, float True, float False, out float Out) + { + Out = Predicate ? True : False; + } + + void Unity_Multiply_float3_float3(float3 A, float3 B, out float3 Out) + { + Out = A * B; + } + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + return description; + } + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreSurface' */ + + // Graph Pixel + struct SurfaceDescription + { + float3 BaseColor; + float Alpha; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4 = float4(1, 1, 0, 1); + [branch] if (_UIE_RENDER_TYPE_SOLID || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeSolid) + { + SolidFragInput Unity_UIE_EvaluateSolidNode_Input; + Unity_UIE_EvaluateSolidNode_Input.tint = IN.color; + Unity_UIE_EvaluateSolidNode_Input.isArc = false; + Unity_UIE_EvaluateSolidNode_Input.outer = float2(-10000, -10000); + Unity_UIE_EvaluateSolidNode_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_EvaluateSolidNode_Output = uie_std_frag_solid(Unity_UIE_EvaluateSolidNode_Input); + _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4 = Unity_UIE_EvaluateSolidNode_Output.color; + } + float4 _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4 = float4(1, 1, 0, 1); + [branch] if (_UIE_RENDER_TYPE_TEXTURE || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeTexture) + { + TextureFragInput Unity_UIE_EvaluateTextureNode_Input; + Unity_UIE_EvaluateTextureNode_Input.tint = IN.color; + Unity_UIE_EvaluateTextureNode_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_EvaluateTextureNode_Input.uv = IN.uvClip.xy; + Unity_UIE_EvaluateTextureNode_Input.isArc = false; + Unity_UIE_EvaluateTextureNode_Input.outer = float2(-10000, -10000); + Unity_UIE_EvaluateTextureNode_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_EvaluateTextureNode_Output = uie_std_frag_texture(Unity_UIE_EvaluateTextureNode_Input); + _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4 = Unity_UIE_EvaluateTextureNode_Output.color; + } + float3 _Swizzle_c3b6fc22d71a49e49cdeae1847c155da_Out_1_Vector3 = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4.xyz; + float _Property_4e9c19f167f743a2a7022781a02d70f9_Out_0_Boolean = _StraightAlphaTexture; + float _Split_775865f90de4425e89b1219e16b8b1b8_R_1_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[0]; + float _Split_775865f90de4425e89b1219e16b8b1b8_G_2_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[1]; + float _Split_775865f90de4425e89b1219e16b8b1b8_B_3_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[2]; + float _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float = _DefaultTexture_0ff00ac4ba3f46138bd69732235d2fb4_Texture_2_Vector4[3]; + float _Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float; + Unity_Branch_float(_Property_4e9c19f167f743a2a7022781a02d70f9_Out_0_Boolean, _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float, float(1), _Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float); + float3 _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3; + Unity_Multiply_float3_float3(_Swizzle_c3b6fc22d71a49e49cdeae1847c155da_Out_1_Vector3, (_Branch_497e29be0ebf40e7991f43fc57bf1a3e_Out_3_Float.xxx), _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3); + float4 _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4 = float4( _Multiply_d99b3fd6d1a849ea8b7ba160b4f11ece_Out_2_Vector3.xyz, _Split_775865f90de4425e89b1219e16b8b1b8_A_4_Float.x ); + float3 _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = float3(0, 0, 0); + float _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = 1.0; + [branch] if (_UIE_RENDER_TYPE_SOLID || _UIE_RENDER_TYPE_ANY && TestType(IN.typeTexSettings.x, k_FragTypeSolid)) + { + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = _DefaultSolid_e5d4725ba3424f12a78b05bd317dacfe_Solid_0_Vector4.a; + } + else [branch] if (_UIE_RENDER_TYPE_TEXTURE || _UIE_RENDER_TYPE_ANY && TestType(IN.typeTexSettings.x, k_FragTypeTexture)) + { + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = _Append_1a863cc20632474aa4fef9f0995dc8c9_Out_2_Vector4.a; + } + else [branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && TestType(IN.typeTexSettings.x, k_FragTypeText)) + { + [branch] if (GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0) + { + SdfTextFragInput Unity_UIE_RenderTypeSwitchNode_SdfText_Input; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.tint = IN.color; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.extraDilate = IN.circle.x; + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textCoreLoc = round(IN.textCoreLoc); + Unity_UIE_RenderTypeSwitchNode_SdfText_Input.opacity = IN.typeTexSettings.z; + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_sdf_text(Unity_UIE_RenderTypeSwitchNode_SdfText_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a; + } + else + { + BitmapTextFragInput Unity_UIE_RenderTypeSwitchNode_BitmapText_Input; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.tint = IN.color; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.textureSlot = IN.typeTexSettings.y; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.opacity = IN.typeTexSettings.z; + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_bitmap_text(Unity_UIE_RenderTypeSwitchNode_BitmapText_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a; + } + } + else + { + SvgGradientFragInput Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.settingIndex = round(IN.typeTexSettings.z); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.textureSlot = round(IN.typeTexSettings.y); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.uv = IN.uvClip.xy; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.isArc = false; + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.outer = float2(-10000, -10000); + Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input.inner = float2(-10000, -10000); + CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_svg_gradient(Unity_UIE_RenderTypeSwitchNode_SvgGradient_Input); + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3 = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb * IN.color.rgb; + _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float = Unity_UIE_RenderTypeSwitchNode_Output.color.a * IN.color.a; + } + surface.BaseColor = _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Color_5_Vector3; + surface.Alpha = _RenderTypeBranch_532ba7da13274f1d9adcf8b9b5924c01_Alpha_6_Float; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + #if UNITY_ANY_INSTANCING_ENABLED + #else // TODO: XR support for procedural instancing because in this case UNITY_ANY_INSTANCING_ENABLED is not defined and instanceID is incorrect. + #endif + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorCopyToSDI' */ + + + + + + + #if UNITY_UV_STARTS_AT_TOP + #else + #endif + + + + #if defined(UNITY_UIE_INCLUDED) + #else + #endif + + + output.color = input.color; + output.uvClip = input.texCoord0; + output.typeTexSettings = input.texCoord1; + output.textCoreLoc = input.texCoord3.xy; + output.layoutUV = input.texCoord3.zw; + + output.circle = input.texCoord4; + + #if UNITY_ANY_INSTANCING_ENABLED + #else // TODO: XR support for procedural instancing because in this case UNITY_ANY_INSTANCING_ENABLED is not defined and instanceID is incorrect. + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UITKPass.hlsl" + + ENDHLSL + } + } + CustomEditor "UnityEditor.ShaderGraph.GenericShaderGraphMaterialGUI" + FallBack off +} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader.meta b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader.meta new file mode 100644 index 000000000..09f9eff75 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/Shaders/Spine-UITK-Screen.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b0198c7d0f7c55c4992b84a4c94afaac +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/package.json b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/package.json index 360b86043..973fe560d 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/package.json +++ b/spine-unity/Modules/com.esotericsoftware.spine.ui-toolkit/package.json @@ -1,9 +1,9 @@ { "name": "com.esotericsoftware.spine.ui-toolkit", "displayName": "Spine UI Toolkit [Experimental]", - "description": "This plugin provides UI Toolkit integration for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 4.3.0 or newer and Unity 6000.0.16 or newer (requires [this bugfix](https://issuetracker.unity3d.com/issues/some-default-uxmlconverters-are-dependent-on-the-current-culture)).\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)", - "version": "4.3.0-preview.4", - "unity": "6000.0", + "description": "This plugin provides UI Toolkit integration for the spine-unity runtime.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime, version 4.3.42 or newer and Unity 6000.3 or newer (requires [this bugfix](https://issuetracker.unity3d.com/issues/some-default-uxmlconverters-are-dependent-on-the-current-culture)).\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)", + "version": "4.3.0-preview.5", + "unity": "6000.3", "author": { "name": "Esoteric Software", "email": "contact@esotericsoftware.com", @@ -11,7 +11,7 @@ }, "dependencies": { "com.unity.modules.uielements": "1.0.0", - "com.esotericsoftware.spine.spine-unity": "4.3.41" + "com.esotericsoftware.spine.spine-unity": "4.3.42" }, "keywords": [ "spine",