/// <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; } }
/// <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); }
/// <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(); }
/// <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; }
/// <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); }
/// <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)); }
/// <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); }
/// <summary> /// プロジェクションマトリックス /// </summary> /// <param name="m"></param> public void SetProjection(ref MCMatrix4x4 m) { m_projection.SetMatrix(ref m); }
/// <summary> /// ワールド×ビュー×プロジェクション /// </summary> /// <param name="m"></param> public void SetWVP(ref MCMatrix4x4 m) { m_WVP.SetMatrix(ref m); }
/// <summary> /// ビュー×プロジェクション /// </summary> /// <param name="m"></param> public void SetViewProjectionHandle(ref MCMatrix4x4 m) { m_viewProjection.SetMatrix(ref m); }
/// <summary> /// ビューマトリックスハンドル /// </summary> /// <param name="m"></param> public void SetView(ref MCMatrix4x4 m) { m_view.SetMatrix(ref m); }
/// <summary> /// ワールドマトリックスハンドル /// </summary> /// <param name="m"></param> public void SetWorld(ref MCMatrix4x4 m) { m_world.SetMatrix(ref m); }
public abstract bool VSearchNewTransformForFrameName(MCMatrix4x4 newTransform, out string pstrOut);
/// <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; }
public abstract void UpdateFrames(MCMatrix4x4 pmxBase);
/// <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); }
public abstract bool VSearchTransformMatrix(string pFrameName, out MCMatrix4x4 outMt);
/// <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; }