コード例 #1
0
        /// <summary>
        /// メンバー変数から構築する
        /// </summary>
        internal void Build()
        {
#if DEBUG
            Debug.Assert(m_spSprite != null);

            if (m_spSprite.flags.SpriteType == (uint)MC_SPRITE_DATA.DIVISION && m_divNo == -1)
            {
                Debug.Assert(false);
            }
#endif
            Is3D = false;

            if (IsBillbord)
            {
                // スプライトデータ取得
                // 球体の計算
                MCVector3 vTmp = new MCVector3(0, 0, 0);
                float     fS   = (m_scale.X + m_scale.Y) * 0.5f;
                m_BVSphere.r = fS * m_spSprite.Sphere.r;
                if (m_angle != vTmp && m_spSprite.flags.AnchorType == (uint)MC_SPRITE_ANCHOR.CUSTOM)
                {
                    MCMatrix4x4 matR = MCMatrix4x4.Identity;
                    MCVector3   vC   = new MCVector3(m_spSprite.Anchor.X, m_spSprite.Anchor.Y, 0);
                    matR.MakeRotationXZY(m_angle);
                    vTmp         = matR.TransformVector3(vC);
                    m_BVSphere.c = vTmp;
                }
                m_BVSphere.c += m_position;
            }
        }
コード例 #2
0
        /// <summary>
        /// 描画時に呼び出されるスプライト処理
        /// </summary>
        /// <param name="totalTime"></param>
        /// <param name="elapsedTime"></param>
        /// <param name="render"></param>
        /// <param name="cbd"></param>
        /// <returns></returns>
        internal override int CallDrawingSprite(
            double totalTime,
            float elapsedTime,
            IMCSpriteRender render,
            MCCallBatchDrawing cbd
            )
        {
            MCVector3   pos          = new MCVector3();
            MCMatrix4x4 mWVP         = MCMatrix4x4.Identity;
            var         spriteRender = (MCRenderAlphanumericSprite)render;

            // 頂点値を更新
            spriteRender.VertexUpdate(this, out pos);

            // 位置の計算
            if (IsBillbord)
            {
                // ビルボードである(使用できない
                Debug.Assert(false);
            }
            else
            {
                MCMatrix4x4 mTmp = MCMatrix4x4.Identity;
                // 通常スプライト
                mTmp.MakeRotationYawPitchRoll(m_angle.Y, m_angle.X, m_angle.Z);


                // 位置
                mTmp.M41 += m_position.X;
                mTmp.M42 += m_position.Y;
                mTmp.M43 += m_position.Z;
                // スケール値
                mTmp.M11 *= m_scale.X; mTmp.M21 *= m_scale.Y;
                mTmp.M12 *= m_scale.X; mTmp.M22 *= m_scale.Y;
                mTmp.M13 *= m_scale.X; mTmp.M23 *= m_scale.Y;
                mTmp.M14 *= m_scale.X; mTmp.M24 *= m_scale.Y;

                mWVP = mTmp * cbd.GetCurrentCamera().ViewProjMatrix;
            }

            cbd.SetWVP(ref mWVP);
            cbd.SetUniqueValue(m_uniquetValue);
            Sprite.Texture00.SetResource(cbd.GetDiffuseTexture());

            EffectPass pass = cbd.GetEffect().GetCurrentEffectPass();

            App.LayoutMgr.IASetInputLayout(pass, (int)spriteRender.GetLayoutKind());
            pass.Apply(App.ImmediateContext);
            if (BlendState != (uint)BLENDSTATE.UNDEFINED)
            {
                App.BlendStateMgr.OMSetBlendState(BlendState);
            }
            spriteRender.Render(App.ImmediateContext, pass, this);

            return(0);
        }
コード例 #3
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 public MCMeshTree()
 {
     m_dwInfoFlgs    = 0;
     m_ppmBonePtr    = null;
     m_ppmBoneOffset = null;
     m_parent        = null;
     m_sibling       = null;
     m_firstChild    = null;
     m_mKeyFrame     = MCMatrix4x4.Identity;
     m_mNewTransform = MCMatrix4x4.Identity;
     m_mOldTransform = MCMatrix4x4.Identity;
     m_MCFrameData.Init();
 }
コード例 #4
0
ファイル: OBB3D.cs プロジェクト: kaoken/mc2d-stage-editor
        /// <summary>マトリクスから、OBBを変形させる</summary>
        /// <param name="rMat">対象マトリクス</param>
        /// <return>なし</return>
        public void MyTransform(out MCMatrix4x4 m)
        {
            MCMatrix4x4 mTmp = MCMatrix4x4.Identity;

            m = MCMatrix4x4.Identity;

            mTmp.M11 = u[0].X;
            mTmp.M12 = u[1].X;
            mTmp.M13 = u[2].X;
            mTmp.M14 = 0;

            mTmp.M21 = u[0].Y;
            mTmp.M22 = u[1].Y;
            mTmp.M23 = u[2].Y;
            mTmp.M24 = 0;

            mTmp.M31 = u[0].Z;
            mTmp.M32 = u[1].Z;
            mTmp.M33 = u[2].Z;
            mTmp.M34 = 0;

            mTmp.M41 = c.X;
            mTmp.M42 = c.Y;
            mTmp.M43 = c.Z;
            mTmp.M44 = 1.0f;

            mTmp = mTmp * m;

            u[0].X = mTmp.M11;
            u[1].X = mTmp.M12;
            u[2].X = mTmp.M13;

            u[0].Y = mTmp.M21;
            u[1].Y = mTmp.M22;
            u[2].Y = mTmp.M23;

            u[0].Z = mTmp.M31;
            u[1].Z = mTmp.M32;
            u[2].Z = mTmp.M33;

            c.X = mTmp.M41;
            c.Y = mTmp.M42;
            c.Z = mTmp.M43;
        }
コード例 #5
0
        /// <summary>
        /// 描画時に呼び出されるスプライト処理
        /// </summary>
        /// <param name="totalTime">アプリケーションが開始してからの経過時間 (秒単位) です。</param>
        /// <param name="elapsedTime">最後のフレームからの経過時間 (秒単位) です。</param>
        /// <param name="render">スプライトのレンダー</param>
        /// <param name="bd"></param>
        /// <returns></returns>
        internal override int CallDrawingSprite(
            double totalTime,
            float elapsedTime,
            IMCSpriteRender render,
            MCCallBatchDrawing cbd
            )
        {
            int         hr = 0;
            MCMatrix4x4 mTmp = MCMatrix4x4.Identity, mWVP = MCMatrix4x4.Identity;
            var         spriteRender = (MCRenderSquareTilesSprite)render;

            // 頂点値を更新
            spriteRender.VertexUpdate(this);

            // 位置の計算
            if (IsBillbord)
            {
                // ビルボードである(使用できない
                Debug.Assert(false);
            }
            else
            {
                // 通常スプライト
                // 位置
                mTmp.M41 += m_position.X;
                mTmp.M42 += m_position.Y;
                mTmp.M43 += m_position.Z;

                mWVP = mTmp * cbd.GetCurrentCamera().ViewProjMatrix;
            }


            cbd.SetWVP(ref mWVP);
            cbd.SetUniqueValue(m_uniquetValue);

            Sprite.Texture00.SetResource(cbd.GetDiffuseTexture());
            EffectPass pass = cbd.GetEffect().GetCurrentEffectPass();

            hr = App.LayoutMgr.IASetInputLayout(pass, (int)spriteRender.GetLayoutKind());
            spriteRender.VertexUpdate(this);
            spriteRender.Render(App.ImmediateContext, pass, this);
            return(hr);
        }
コード例 #6
0
        /// <summary>マトリクスを元にmcAABB2Dを作り直す</summary>
        /// <param name="rM">マトリクス</param>
        /// <return>変形後のmcAABB2Dを返す</return>
        public AABB3D GetReMakeAABB(MCMatrix4x4 rM)
        {
            int i;

            MCVector3[] aV;
            MCVector3   vMx = new MCVector3(), vMn = new MCVector3();


            Get8Vertexs(out aV);

            for (i = 0; i < 8; ++i)
            {
                MCVector3 o = new MCVector3();
                o.X = aV[i].X * rM.M11 + aV[i].Y * rM.M21 + aV[i].Z * rM.M31 + rM.M41;
                o.Y = aV[i].X * rM.M12 + aV[i].Y * rM.M22 + aV[i].Z * rM.M32 + rM.M42;
                o.Z = aV[i].X * rM.M13 + aV[i].Y * rM.M23 + aV[i].Z * rM.M33 + rM.M43;

                aV[i] = o;
                vMx.SetMax(aV[i]);
                vMn.SetMax(aV[i]);
            }
            return(new AABB3D(vMn, vMx));
        }
コード例 #7
0
ファイル: OBB3D.cs プロジェクト: kaoken/mc2d-stage-editor
        /// <summary>自身のOBB と OBB(rB)によるあたり判定</summary>
        /// <param name="rB">OBB3D構造体 B</param>
        /// <return>重なっている場合は 1を返し、 重なっていない場合は0を返す</return>
        public bool OBB_OBB(OBB3D rB)
        {
            float fRA, fRB;

            u = new MCVector3[3];
            MCMatrix4x4 mR = MCMatrix4x4.Identity, mAbsR = MCMatrix4x4.Identity;


            // aの座標フレームの中でbを表現する回転行列を計算
            mR.M11 = u[0].Dot(rB.u[0]);
            mR.M12 = u[0].Dot(rB.u[1]);
            mR.M13 = u[0].Dot(rB.u[2]);
            mR.M21 = u[1].Dot(rB.u[0]);
            mR.M22 = u[1].Dot(rB.u[1]);
            mR.M23 = u[1].Dot(rB.u[2]);
            mR.M31 = u[2].Dot(rB.u[0]);
            mR.M32 = u[2].Dot(rB.u[1]);
            mR.M33 = u[2].Dot(rB.u[2]);


            // 平行移動ベクトルvTを計算計算
            MCVector3 vT = rB.c - c;

            // 平行移動をaの座標フレームに変換
            vT = new MCVector3(vT.Dot(u[0]), vT.Dot(u[1]), vT.Dot(u[2]));

            // 共通の部分式を計算。
            // 2つの辺が平行でそれらの外積がゼロベクトル(あるいはそれに近いベクトル)になる時に
            // 演算エラーが起きないようにイプシロンの項を追加(詳しくは本文を参照)
            mAbsR.M11 = Mt.Abs(mR.M11) + 0.0001f;
            mAbsR.M12 = Mt.Abs(mR.M12) + 0.0001f;
            mAbsR.M13 = Mt.Abs(mR.M13) + 0.0001f;
            mAbsR.M21 = Mt.Abs(mR.M21) + 0.0001f;
            mAbsR.M22 = Mt.Abs(mR.M22) + 0.0001f;
            mAbsR.M23 = Mt.Abs(mR.M23) + 0.0001f;
            mAbsR.M31 = Mt.Abs(mR.M31) + 0.0001f;
            mAbsR.M32 = Mt.Abs(mR.M32) + 0.0001f;
            mAbsR.M33 = Mt.Abs(mR.M33) + 0.0001f;


            // 軸L = A0, L = A1, L = A2を判定
            {
                fRA = e.X;
                fRB = rB.e.X * mAbsR.M11 + rB.e.Y * mAbsR.M12 + rB.e.Z * mAbsR.M13;
                if (Mt.Abs(vT.X) > fRA + fRB)
                {
                    return(false);
                }
                //
                fRA = e.Y;
                fRB = rB.e.X * mAbsR.M21 + rB.e.Y * mAbsR.M22 + rB.e.Z * mAbsR.M23;
                if (Mt.Abs(vT.Y) > fRA + fRB)
                {
                    return(false);
                }
                //
                fRA = e.Z;
                fRB = rB.e.X * mAbsR.M31 + rB.e.Y * mAbsR.M32 + rB.e.Z * mAbsR.M33;
                if (Mt.Abs(vT.Z) > fRA + fRB)
                {
                    return(false);
                }
            }

            // 軸L = B0, L = B1, L = B2を判定
            {
                fRA = e.X * mAbsR.M11 + e.Y * mAbsR.M21 + e.Z * mAbsR.M31;
                fRB = rB.e.X;
                if (Mt.Abs(vT.X * mR.M11 + vT.Y * mR.M21 + vT.Z * mR.M31) > fRA + fRB)
                {
                    return(false);
                }
                //
                fRA = e.X * mAbsR.M12 + e.Y * mAbsR.M22 + e.Z * mAbsR.M32;
                fRB = rB.e.Y;
                if (Mt.Abs(vT.X * mR.M12 + vT.Y * mR.M22 + vT.Z * mR.M32) > fRA + fRB)
                {
                    return(false);
                }
                //
                fRA = e.X * mAbsR.M13 + e.Y * mAbsR.M23 + e.Z * mAbsR.M33;
                fRB = rB.e.Z;
                if (Mt.Abs(vT.X * mR.M13 + vT.Y * mR.M23 + vT.Z * mR.M33) > fRA + fRB)
                {
                    return(false);
                }
            }

            // 軸L = A0 X B0を判定
            fRA = e.Y * mAbsR.M31 + e.Z * mAbsR.M21;
            fRB = rB.e.Y * mAbsR.M13 + rB.e.Z * mAbsR.M12;
            if (Mt.Abs(vT.Z * mR.M21 - vT.Y * mR.M31) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A0 X B1を判定
            fRA = e.Y * mAbsR.M32 + e.Z * mAbsR.M22;
            fRB = rB.e.X * mAbsR.M13 + rB.e.Z * mAbsR.M11;
            if (Mt.Abs(vT.Z * mR.M22 - vT.Y * mR.M32) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A0 X B2を判定
            fRA = e.Y * mAbsR.M33 + e.Z * mAbsR.M23;
            fRB = rB.e.X * mAbsR.M12 + rB.e.Y * mAbsR.M11;
            if (Mt.Abs(vT.Z * mR.M23 - vT.Y * mR.M33) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A1 X B0を判定
            fRA = e.X * mAbsR.M31 + e.Z * mAbsR.M11;
            fRB = rB.e.Y * mAbsR.M23 + rB.e.Z * mAbsR.M22;
            if (Mt.Abs(vT.X * mR.M31 - vT.Z * mR.M11) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A1 X B1を判定
            fRA = e.X * mAbsR.M32 + e.Z * mAbsR.M12;
            fRB = rB.e.X * mAbsR.M23 + rB.e.Z * mAbsR.M21;
            if (Mt.Abs(vT.X * mR.M32 - vT.Z * mR.M12) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A1 X B2を判定
            fRA = e.X * mAbsR.M33 + e.Z * mAbsR.M13;
            fRB = rB.e.X * mAbsR.M22 + rB.e.Y * mAbsR.M21;
            if (Mt.Abs(vT.X * mR.M33 - vT.Z * mR.M13) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A2 X B0を判定
            fRA = e.X * mAbsR.M21 + e.Y * mAbsR.M11;
            fRB = rB.e.Y * mAbsR.M33 + rB.e.Z * mAbsR.M32;
            if (Mt.Abs(vT.Y * mR.M11 - vT.X * mR.M21) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A2 X B1を判定
            fRA = e.X * mAbsR.M22 + e.Y * mAbsR.M12;
            fRB = rB.e.X * mAbsR.M33 + rB.e.Z * mAbsR.M31;
            if (Mt.Abs(vT.Y * mR.M12 - vT.X * mR.M22) > fRA + fRB)
            {
                return(false);
            }

            // 軸L = A2 X B2を判定
            fRA = e.X * mAbsR.M23 + e.Y * mAbsR.M13;
            fRB = rB.e.X * mAbsR.M32 + rB.e.Y * mAbsR.M31;
            if (Mt.Abs(vT.Y * mR.M13 - vT.X * mR.M23) > fRA + fRB)
            {
                return(false);
            }

            // 分離軸が見つからないので、OBBは交差している
            return(true);
        }
コード例 #8
0
 /// <summary>
 /// プロジェクションマトリックス
 /// </summary>
 /// <param name="m"></param>
 public void SetProjection(ref MCMatrix4x4 m)
 {
     m_projection.SetMatrix(ref m);
 }
コード例 #9
0
 /// <summary>
 /// ワールド×ビュー×プロジェクション
 /// </summary>
 /// <param name="m"></param>
 public void SetWVP(ref MCMatrix4x4 m)
 {
     m_WVP.SetMatrix(ref m);
 }
コード例 #10
0
 /// <summary>
 /// ビュー×プロジェクション
 /// </summary>
 /// <param name="m"></param>
 public void SetViewProjectionHandle(ref MCMatrix4x4 m)
 {
     m_viewProjection.SetMatrix(ref m);
 }
コード例 #11
0
 /// <summary>
 /// ビューマトリックスハンドル
 /// </summary>
 /// <param name="m"></param>
 public void SetView(ref MCMatrix4x4 m)
 {
     m_view.SetMatrix(ref m);
 }
コード例 #12
0
 /// <summary>
 /// ワールドマトリックスハンドル
 /// </summary>
 /// <param name="m"></param>
 public void SetWorld(ref MCMatrix4x4 m)
 {
     m_world.SetMatrix(ref m);
 }
コード例 #13
0
 public abstract bool VSearchNewTransformForFrameName(MCMatrix4x4 newTransform, out string pstrOut);
コード例 #14
0
 /// <summary>
 /// 4x4行列を2x2行列にクリップする
 /// </summary>
 /// <param name="m">MCMatrix4x4</param>
 /// <return>なし</return>
 public void ClipMCXMATRIX(MCMatrix4x4 m)
 {
     M11 = m.M11; M12 = m.M12;
     M21 = m.M21; M22 = m.M22;
 }
コード例 #15
0
 public abstract void UpdateFrames(MCMatrix4x4 pmxBase);
コード例 #16
0
        /// <summary>
        /// 描画時に呼び出されるスプライト処理
        /// </summary>
        /// <param name="totalTime">アプリケーションが開始してからの経過時間 (秒単位) です。</param>
        /// <param name="elapsedTime">最後のフレームからの経過時間 (秒単位) です。</param>
        /// <param name="render">スプライトのレンダー</param>
        /// <param name="bd"></param>
        /// <returns></returns>
        internal override int CallDrawingSprite(
            double totalTime,
            float elapsedTime,
            IMCSpriteRender render,
            MCCallBatchDrawing cbd
            )
        {
            int         hr = 0;
            MCMatrix4x4 mTmp = MCMatrix4x4.Identity, mWVP;
            var         spriteRender = (MCRenderSquareAmountSprite)render;


            // 頂点値を更新
            spriteRender.VertexUpdate(this);

            // 位置の計算
            if (IsBillbord)
            {
                // ビルボードである
                if (IsBillbordConstX)
                {
                    m_angle.X = cbd.GetCurrentCamera().WorldPitch;
                }

                if (IsBillbordConstY)
                {
                    m_angle.Y = cbd.GetCurrentCamera().WorldYaw;
                }

                m_angle.Z += cbd.GetCurrentCamera().WorldRoll;
                if (m_angle.Z >= UtilMathMC.PI2)
                {
                    m_angle.Z -= UtilMathMC.PI2;
                }

                mTmp.MakeRotationXZY(m_angle);

                // 位置
                mTmp.M41 = m_position.X;
                mTmp.M42 = m_position.Y;
                mTmp.M43 = m_position.Z;
                // スケール値
                mTmp.M11 *= m_scale.X; mTmp.M21 *= m_scale.Y;
                mTmp.M12 *= m_scale.X; mTmp.M22 *= m_scale.Y;
                mTmp.M13 *= m_scale.X; mTmp.M23 *= m_scale.Y;
                mTmp.M14 *= m_scale.X; mTmp.M24 *= m_scale.Y;

                mWVP = mTmp * cbd.GetCurrentCamera().ViewProjMatrix;
            }
            else
            {
                // 通常スプライト
                //if( !(m_angle.Y == m_angle.X && m_angle.X == m_angle.Y && m_angle.Y == 0.0f) )
                mTmp.MakeRotationYawPitchRoll(m_angle.Y, m_angle.X, m_angle.Z);

                // 位置
                mTmp.M41 += m_position.X;
                mTmp.M42 += m_position.Y;
                mTmp.M43 += m_position.Z;
                // スケール値
                mTmp.M11 *= m_scale.X; mTmp.M21 *= m_scale.Y;
                mTmp.M12 *= m_scale.X; mTmp.M22 *= m_scale.Y;
                mTmp.M13 *= m_scale.X; mTmp.M23 *= m_scale.Y;
                mTmp.M14 *= m_scale.X; mTmp.M24 *= m_scale.Y;

                mWVP = mTmp * cbd.GetCurrentCamera().ViewProjMatrix;
            }

            cbd.SetWVP(ref mWVP);
            cbd.SetUniqueValue(m_uniquetValue);
            Sprite.Texture00.SetResource(cbd.GetDiffuseTexture());

            EffectPass pass = cbd.GetEffect().GetCurrentEffectPass();

            hr = App.LayoutMgr.IASetInputLayout(pass, (int)spriteRender.GetLayoutKind());
            pass.Apply(App.ImmediateContext);
            if (BlendState != (uint)BLENDSTATE.UNDEFINED)
            {
                App.BlendStateMgr.OMSetBlendState((int)BlendState);
            }
            spriteRender.Render(App.ImmediateContext, pass, this);

            return(0);
        }
コード例 #17
0
 public abstract bool VSearchTransformMatrix(string pFrameName, out MCMatrix4x4 outMt);
コード例 #18
0
 /// <summary>
 /// 4x4行列を3x3行列にクリップする
 /// </summary>
 /// <param name="pMX">MCMatrix4x4ポインタ</param>
 /// <return>なし</return>
 public void ClipMCXMATRIX(MCMatrix4x4 pMX)
 {
     M11 = pMX.M11; M12 = pMX.M12; M13 = pMX.M13;
     M21 = pMX.M21; M22 = pMX.M22; M23 = pMX.M23;
     M31 = pMX.M31; M32 = pMX.M32; M33 = pMX.M33;
 }