using System;
using Microsoft.Xna.Framework;
using MikuMikuDance.XNA.Model.ModelData;
//using BulletX.Dynamics;
//using BulletX;

namespace MikuMikuDance.XNA.Model
{
    /// <summary>
    /// 剛体の球体
    /// </summary>
    class MMDPhisicsSphere : MMDPhisicsObject
    {
    //    public MMDPhisicsSphere(MMDRigid rigid, MMDModel model, DynamicsWorld world)
    //        :base(rigid,model)
    //    {
    //        //衝突スキンの作成
    //        collision = new SphereShape(rigid.ShapeWidth);
    //        //初期の姿勢を計算
    //        Matrix startTransform;
    //        if (rigid.RelatedBoneIndex != 0xffff)
    //            startTransform = model.BoneManager[rigid.RelatedBoneIndex].WorldTransform.CreateMatrix();
    //        else
    //        {
    //            if (model.BoneManager.ContainsBone("センター"))
    //                startTransform = model.BoneManager["センター"].WorldTransform.CreateMatrix();
    //            else
    //                startTransform = Matrix.Identity;
    //        }
    //        startTransform = BulletX.MathHelper.GetDisplayMatrix(CreateOrientation(rigid) * startTransform * Model.World);

    //        //初期の姿勢をMotionStateに設定
    //        DefaultMotionState motionState = new DefaultMotionState(startTransform, Matrix.Identity);

    //        Vector3 localInertia = Vector3.Zero;
    //        //イナーシャの計算
    //        if (rigid.Type != 0)
    //            collision.CalculateLocalInertia(rigid.Weight, out localInertia);
    //        //関連ボーン番号を取得しておく
    //        RelatedBone = rigid.RelatedBoneIndex;
            
    //        //body.Immovable = true;

    //        //剛体を作成
    //        body = new RigidBody(0/*(rigid.Type != 0 ? rigid.Weight : 0)*/, motionState, collision,
    //            localInertia, rigid.LinerDamping, rigid.AngularDamping, rigid.Friction, rigid.Restitution);
    //        //ボーン追従型はImmovableにする
    //        if (rigid.Type == 0)
    //            body.CollisionFlags = CollisionOptions.StaticObject;
            
    //        //グループのフラグをセット
    //        ushort group = (ushort)Math.Pow(2, Rigid.GroupIndex);

    //        //ボディを有効化し、グループとマスクを適応
    //        world.AddRigidBody(body, group, rigid.GroupTarget);
    //    }

    //    internal override void ApplyRigitToBone()
    //    {
    //        if (RelatedBone == 0xffff)
    //            return;
    //        if (Rigid.Type != 0 && Rigid.RelatedBoneIndex < Model.BoneManager.Count)
    //        {
    //            //メモ：剛体の回転は対象ボーンの全ての子に、移動は対象ボーンに適応する
    //            //方法：親のボーンの回転と移動を適応する。適応する時にボーン座標系に直す
    //            //まずは対象ボーンの親の座標変換を取得する
    //            QuatTransform transform = new QuatTransform(Quaternion.Identity, Vector3.Zero);
    //            if (Model.BoneManager[Rigid.RelatedBoneIndex].BoneData.SkeletonHierarchy >= 0)
    //                transform = Model.BoneManager.GetWorldQuatTransform(Model.BoneManager[Rigid.RelatedBoneIndex].BoneData.SkeletonHierarchy);

    //            Matrix rmat = BulletX.MathHelper.GetDisplayMatrix(((DefaultMotionState)body.MotionState).GraphicsWorldTransform);
    //            rmat = Matrix.Invert(CreateOrientation(Rigid)) * rmat * Matrix.Invert(Model.World);

    //            //Matrix rmat = body.WorldTransform * Matrix.Invert(Model.World) * Matrix.Invert(CreateOrientation(Rigid));
    //            Model.BoneManager[Rigid.RelatedBoneIndex].WorldTransform = QuatTransform.FromMatrix(rmat);
    //            Model.BoneManager[Rigid.RelatedBoneIndex].BoneTransform = QuatTransform.FromMatrix(rmat * Matrix.Invert(transform.CreateMatrix()));
                
    //            //それを元に回転と移動を計算する
    //            //Vector3 pos = body.Position;
    //            //Matrix rot = body.Orientation ;
    //            ////補正……
    //            //pos += -Vector3.Transform(new Vector3(Rigid.Position[0], Rigid.Position[1], Rigid.Position[2]), body.Orientation);
    //            //Quaternion rotation;
    //            //Vector3 temp1, temp2;
    //            //rot.Decompose(out temp1, out rotation, out temp2);
    //            //Model.BoneManager[Rigid.RelatedBoneIndex].WorldTransform = new QuatTransform(rotation, pos);
    //            ////ボーン座標でのボーンの移動
    //            //Matrix bonemat = (new QuatTransform(rotation, pos).CreateMatrix()) * Matrix.Invert(transform.CreateMatrix());
    //            //Model.BoneManager[Rigid.RelatedBoneIndex].BoneTransform = QuatTransform.FromMatrix(bonemat);
    //        }
    //        base.ApplyRigitToBone();
    //    }
    //    internal override void ApplyBoneToRigit()
    //    {
    //        if (RelatedBone == 0xffff)
    //            return;
    //        if (Rigid.Type == 0 && Rigid.RelatedBoneIndex < Model.BoneManager.Count)
    //        {
    //            //メモ：この段階ですでにボーンのワールドのトランスフォームが確定しているので
    //            //ボーンの座標から生成してく
    //            Matrix bone = Model.BoneManager[Rigid.RelatedBoneIndex].WorldTransform.CreateMatrix();
    //            bone = BulletX.MathHelper.GetDisplayMatrix(CreateOrientation(Rigid) * bone * Model.World);
    //            body.MotionState.SetWorldTransform(bone);
    //            body.WorldTransform = bone;

    //            /*QuatTransform bone = Model.BoneManager[Rigid.RelatedBoneIndex].WorldTransform;
    //            body.Position = bone.Translation + Vector3.Transform(new Vector3(Rigid.Position[0], Rigid.Position[1], Rigid.Position[2]), body.Orientation);
    //            body.Orientation = Matrix.CreateFromQuaternion(bone.Rotation);*/
    //        }
    //        base.ApplyBoneToRigit();
    //    }
    }
}
