/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ #if UNITY_5_3_OR_NEWER #define IS_UNITY #endif using System; namespace Spine { #if IS_UNITY using Color32F = UnityEngine.Color; #endif /// /// Stores a slot's pose. Slots organize attachments for purposes and provide a place to store state /// for an attachment. State cannot be stored in an attachment itself because attachments are stateless and may be shared across /// multiple skeletons. /// public class SlotPose : IPose { // Color is a struct, thus set to protected to prevent // Color color = slot.color; color.a = 0.5; modifying just a copy of the struct instead of the original // object as in reference implementation. protected Color32F color = new Color32F(1, 1, 1, 1); protected Color32F? darkColor = null; internal Attachment attachment; // Not used in setup pose. internal int sequenceIndex; internal readonly ExposedList deform = new ExposedList(); internal SlotPose () { } public void Set (SlotPose pose) { if (pose == null) throw new ArgumentNullException("pose", "pose cannot be null."); color = pose.color; if (darkColor.HasValue) darkColor = pose.darkColor; attachment = pose.attachment; sequenceIndex = pose.sequenceIndex; deform.Clear(false); deform.AddRange(pose.deform); } /// A copy of the color used to tint the slot's attachment. If is set, this is used as the light color for two /// color tinting. public Color32F GetColor () { return color; } /// Sets the color used to tint the slot's attachment. If is set, this is used as the light color for two /// color tinting. public void SetColor (Color32F color) { this.color = color; } /// Clamps the color used to tint the slot's attachment to the 0-1 range. public void ClampColor () { color.Clamp(); } /// A copy of the dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark /// color's alpha is not used. public Color32F? GetDarkColor () { return darkColor; } /// Sets the dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark /// color's alpha is not used. public void SetDarkColor (Color32F? darkColor) { this.darkColor = darkColor; } /// Clamps the dark color used to tint the slot's attachment to the 0-1 range. public void ClampDarkColor () { if (darkColor.HasValue) darkColor = darkColor.Value.Clamp(); } /// /// The current attachment for the slot, or null if the slot has no attachment. /// If the attachment is changed, resets and clears the . /// The deform is not cleared if the old attachment has the same as the /// specified attachment. public Attachment Attachment { /// The current attachment for the slot, or null if the slot has no attachment. get { return attachment; } /// /// Sets the slot's attachment and, if the attachment changed, resets and clears the . /// The deform is not cleared if the old attachment has the same as the /// specified attachment. /// May be null. set { if (attachment == value) return; if (!(value is VertexAttachment) || !(this.attachment is VertexAttachment) || ((VertexAttachment)value).TimelineAttachment != ((VertexAttachment)this.attachment).TimelineAttachment) { deform.Clear(); } this.attachment = value; sequenceIndex = -1; } } /// /// The index of the texture region to display when the slot's attachment has a . -1 represents the /// . /// public int SequenceIndex { get { return sequenceIndex; } set { sequenceIndex = value; } } /// Vertices to deform the slot's attachment. For an unweighted mesh, the entries are local positions for each vertex. For a /// weighted mesh, the entries are an offset for each vertex which will be added to the mesh's local vertex positions. /// /// See and . public ExposedList Deform { get { return deform; } } } }