Ejemplo n.º 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;
            }
        }
        /// <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);
        }