diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Materials/SkeletonGraphicFill.mat b/spine-unity/Assets/Spine/Runtime/spine-unity/Materials/SkeletonGraphicFill.mat new file mode 100644 index 000000000..5eda12ecb --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Materials/SkeletonGraphicFill.mat @@ -0,0 +1,101 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SkeletonGraphicFill + m_Shader: {fileID: 4800000, guid: c02377d9afbb50e49ab27049e59fb5f8, type: 3} + m_ShaderKeywords: _USE8NEIGHBOURHOOD_ON + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + 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} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - PixelSnap: 0 + - _BumpScale: 1 + - _CanvasGroupCompatible: 0 + - _ColorMask: 15 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnableExternalAlpha: 0 + - _FillPhase: 1 + - _Glossiness: 0.5 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _OutlineMipLevel: 0 + - _OutlineOpaqueAlpha: 1 + - _OutlineReferenceTexWidth: 1024 + - _OutlineSmoothness: 1 + - _OutlineWidth: 3 + - _Parallax: 0.02 + - _SrcBlend: 1 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _StraightAlphaInput: 0 + - _ThresholdEnd: 0.25 + - _UVSec: 0 + - _Use8Neighbourhood: 1 + - _UseUIAlphaClip: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _FillColor: {r: 1, g: 1, b: 1, a: 1} + - _Flip: {r: 1, g: 1, b: 1, a: 1} + - _OutlineColor: {r: 1, g: 1, b: 0, a: 1} + - _RendererColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Materials/SkeletonGraphicFill.mat.meta b/spine-unity/Assets/Spine/Runtime/spine-unity/Materials/SkeletonGraphicFill.mat.meta new file mode 100644 index 000000000..0d4571e1c --- /dev/null +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Materials/SkeletonGraphicFill.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c4cd84769cae11444b3d759bea3d1644 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs index 54f3f63cd..a8cb8aeb5 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs @@ -505,14 +505,14 @@ namespace Spine.Unity.AttachmentTools { newSkin.Constraints.AddRange(o.Constraints); inoutAttachments.Clear(); - foreach (var entry in o.Attachments) { + foreach (var entry in skinAttachments) { inoutAttachments.Add(entry.Attachment); } GetRepackedAttachments(inoutAttachments, inoutAttachments, materialPropertySource, out outputMaterial, out outputTexture, maxAtlasSize, padding, textureFormat, mipmaps, newName, clearCache, useOriginalNonrenderables, additionalTexturePropertyIDsToCopy, additionalOutputTextures, additionalTextureFormats, additionalTextureIsLinear); int i = 0; - foreach (var originalSkinEntry in o.Attachments) { + foreach (var originalSkinEntry in skinAttachments) { var newAttachment = inoutAttachments[i++]; newSkin.SetAttachment(originalSkinEntry.SlotIndex, originalSkinEntry.Name, newAttachment); } @@ -680,7 +680,13 @@ namespace Spine.Unity.AttachmentTools { /// /// Returns a Rect of the AtlasRegion according to Spine texture coordinates. (x-right, y-down) static Rect GetSpineAtlasRect (this AtlasRegion region, bool includeRotate = true) { - return new Rect(region.x, region.y, region.packedWidth, region.packedHeight); + float width = region.packedWidth; + float height = region.packedHeight; + if (includeRotate && region.degrees == 270) { + width = region.packedHeight; + height = region.packedWidth; + } + return new Rect(region.x, region.y, width, height); } /// @@ -706,13 +712,20 @@ namespace Spine.Unity.AttachmentTools { /// /// Creates a new Spine AtlasRegion according to a Unity UV Rect (x-right, y-up, uv-normalized). static AtlasRegion UVRectToAtlasRegion (Rect uvRect, AtlasRegion referenceRegion, AtlasPage page) { - var tr = UVRectToTextureRect(uvRect, page.width, page.height); - var rr = tr.SpineUnityFlipRect(page.height); + Rect tr = UVRectToTextureRect(uvRect, page.width, page.height); + Rect rr = tr.SpineUnityFlipRect(page.height); int x = (int)rr.x; int y = (int)rr.y; int w = (int)rr.width; int h = (int)rr.height; + + if (referenceRegion.degrees == 270) { + int tempW = w; + w = h; + h = tempW; + } + // Note: originalW and originalH need to be scaled according to the // repacked width and height, repacking can mess with aspect ratio, etc. int originalW = Mathf.RoundToInt((float)w * ((float)referenceRegion.originalWidth / (float)referenceRegion.width)); @@ -726,6 +739,14 @@ namespace Spine.Unity.AttachmentTools { float v = uvRect.yMax; float v2 = uvRect.yMin; + if (referenceRegion.degrees == 270) { + // at a 270 degree region, u2/v2 deltas are swapped, and delta-v is negative. + float du = u2 - u; + float dv = v - v2; + u2 = u + dv; + v2 = v - du; + } + return new AtlasRegion { page = page, name = referenceRegion.name,