using Microsoft.Xna.Framework;
using XNAModel = Microsoft.Xna.Framework.Graphics.Model;
using MikuMikuDance.XNA.Motion.MotionData;
using System.Collections.Generic;

namespace MikuMikuDance.XNA.Model.ModelData
{
    /// <summary>
    /// MMDモデルデータクラス(内部用)
    /// </summary>
    public class MMDModelData//このクラスは参照型にする。なぜならこのクラスの受け渡しが多いため
    {
        /// <summary>
        /// Reachモードかどうか。
        /// </summary>
        public bool IsReach;
        /// <summary>
        /// モデルデータ
        /// </summary>
        public XNAModel ModelData;
        /// <summary>
        /// MMD用のボーン情報
        /// </summary>
        public MMDBoneData[] Bones;
        /// <summary>
        /// MMD用の表情情報
        /// </summary>
        public MMDSkinData[] Skins;
        /// <summary>
        /// 表情用の頂点数
        /// </summary>
        public int NumVertexForFace;
        /// <summary>
        /// MMD用の剛体情報
        /// </summary>
        public MMDRigid[] Rigids;
        /// <summary>
        /// MMD用のジョイント情報
        /// </summary>
        public MMDJoint[] Joints;
        /// <summary>
        /// シェーダに渡す表情頂点情報
        /// </summary>
        public Vector4[] FaceData;
        /// <summary>
        /// シェーダに表情頂点情報を渡す際に使用する頂点テクスチャサイズX
        /// </summary>
        public int FaceDataTextureSizeX;
        /// <summary>
        /// シェーダに渡す際に使用する頂点テクスチャサイズY
        /// </summary>
        public int FaceDataTextureSizeY;
        /// <summary>
        /// シェーダに表情頂点位置を渡す際に使用する頂点テクスチャサイズX
        /// </summary>
        public int FaceVertTextureSizeX;
        /// <summary>
        /// シェーダに表情頂点位置を渡す際に使用する頂点テクスチャサイズY
        /// </summary>
        public int FaceVertTextureSizeY;
        /// <summary>
        /// パーツの中心リスト
        /// </summary>
        public PartCenter[] PartCenters;
        /// <summary>
        /// パーツの中心を使用したZソートを行うかどうか
        /// </summary>
        public bool UsePartCenterZSort;
        /// <summary>
        /// モデルに付随したモーションデータ
        /// </summary>
        public Dictionary<string, MMDMotionData> Motions;

        internal void CalcDrawOrder(Matrix World, Matrix View, PartCenterCompare ZCompare)
        {
            Matrix WorldView;
            Matrix.Multiply(ref World, ref View, out WorldView);
            foreach (var partcenter in PartCenters)
                partcenter.Calc(ref WorldView);
        }
    }
}
