/**
 * Copyright(c) Live2D Inc. All rights reserved.
 *
 * Use of this source code is governed by the Live2D Open Software license
 * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
 */
using Live2D.Cubism.Core.Unmanaged;
using UnityEngine;
namespace Live2D.Cubism.Core
{
    /// 
    /// Dynamic  data.
    /// 
    public sealed class CubismDynamicDrawableData
    {
        #region Factory Methods
        /// 
        /// Creates buffer for dynamic  data.
        /// 
        /// Unmanaged model to create buffer for.
        /// Buffer.
        internal static CubismDynamicDrawableData[] CreateData(CubismUnmanagedModel unmanagedModel)
        {
            var unmanagedDrawables = unmanagedModel.Drawables;
            var buffer = new CubismDynamicDrawableData[unmanagedDrawables.Count];
            // Initialize buffers.
            var vertexCounts = unmanagedDrawables.VertexCounts;
            for (var i = 0; i < buffer.Length; ++i)
            {
                buffer[i] = new CubismDynamicDrawableData
                {
                    VertexPositions = new Vector3[vertexCounts[i]]
                };
            }
            return buffer;
        }
        #endregion
        /// 
        /// Dirty flags.
        /// 
        internal byte Flags { private get; set; }
        /// 
        /// Current opacity.
        /// 
        public float Opacity { get; internal set; }
        /// 
        /// Current draw order.
        /// 
        public int DrawOrder { get; internal set; }
        /// 
        /// Current render order.
        /// 
        public int RenderOrder { get; internal set; }
        /// 
        /// Current vertex position.
        /// 
        public Vector3[] VertexPositions { get; internal set; }
        /// 
        /// True if currently visible.
        /// 
        public bool IsVisible
        {
            get { return Flags.HasIsVisibleFlag(); }
        }
        /// 
        /// True if  did change.
        /// 
        public bool IsVisibilityDirty
        {
            get { return Flags.HasVisibilityDidChangeFlag(); }
        }
        /// 
        /// True if  did change.
        /// 
        public bool IsOpacityDirty
        {
            get { return Flags.HasOpacityDidChangeFlag(); }
        }
        /// 
        /// True if  did change.
        /// 
        public bool IsDrawOrderDirty
        {
            get { return Flags.HasDrawOrderDidChangeFlag(); }
        }
        /// 
        /// True if  did change.
        /// 
        public bool IsRenderOrderDirty
        {
            get { return Flags.HasRenderOrderDidChangeFlag(); }
        }
        /// 
        /// True if  did change.
        /// 
        public bool AreVertexPositionsDirty
        {
            get { return Flags.HasVertexPositionsDidChangeFlag(); }
        }
        /// 
        /// True if any data did change.
        /// 
        public bool IsAnyDirty
        {
            get { return Flags != 0; }
        }
    }
}