Beispiel #1
0
 /// <summary>
 /// セット
 /// </summary>
 /// <param name="pos">頂点</param>
 /// <param name="color">色</param>
 /// <param name="fU">テクスチャU座標</param>
 /// <param name="fV">テクスチャV座標</param>
 public void Set(MCVector3 pos, Color4 color, float fU, float fV)
 {
     p = pos;
     c = color;
     u = fU;
     v = fV;
 }
Beispiel #2
0
 /// <summary>
 /// 初期化
 /// </summary>
 public void Init()
 {
     p  = new MCVector3();
     c  = new Color4();
     u0 = v0 = 0;
     u1 = v1 = 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="width">対象テクスチャーの幅</param>
        /// <param name="height">対象テクスチャーの高さ</param>
        public void SetTextureSize(int width, int height)
        {
            float halfW, halfH;

            //
            m_width  = width;
            m_height = height;
            //
            halfW = m_width * 0.5f;
            halfH = m_height * 0.5f;
            //アスペクト比(高さを1としたときの幅)
            m_aspect = width / (float)height;
            //視野をZ=0でデバイスの幅と高さに合わせる
            m_FOV = 45.0f * UtilMathMC.INV_RADIAN;
            //奥行き
            m_depth = (float)(halfH / System.Math.Tan(m_FOV * 0.5f));
            //
            m_nearPlane = 1.0f;
            m_farPlane  = 10001.0f;
            base.SetProjParams(m_FOV, m_aspect, m_nearPlane, m_farPlane);

            // ビュー・マトリックスにセット属性
            m_eye    = new MCVector3(halfW, halfH, -m_depth);
            m_lookAt = new MCVector3(halfW, halfH, 0.0f);
            m_up     = new MCVector3(0.0f, 1.0f, 0.0f);
            base.SetViewParams(m_eye, m_lookAt, m_up);
        }
Beispiel #5
0
        /// <summary>
        /// 視錐台内に球体があるかの衝突判定
        /// </summary>
        /// <param name="sphere"></param>
        /// <param name="pZ"></param>
        /// <returns></returns>
        public override bool CollisionSphere(Sphere sphere, out float z)
        {
            MCVector3 vOP = sphere.c - m_eye;

            // vOP と前方ベクトルの内積
            z = vOP.Dot(m_viewForward);// / m_vViewForward.Length();
            if (z < m_nearPlane - sphere.r || m_farPlane + sphere.r < z)
            {
                return(false);
            }

            // 最適化されていないが理解しやすい
            float r      = vOP.Dot(m_viewRight);// / m_vViewRight.Length();
            float rLimit = m_rightFactor * (z);
            float rTop   = rLimit + sphere.r;

            if (r < -rTop || rTop < r)
            {
                return(false);
            }

            // 最適化 ( 減算処理を取り除いた )
            float u      = vOP.Dot(m_viewUp);// / m_vViewUp.Length();
            float uLimit = m_upFactor * (z);
            float uTop   = uLimit + sphere.r;

            if (u < -uTop || uTop < u)
            {
                return(false);
            }

            return(true);
        }
Beispiel #6
0
        //protected void CreateNearFarVertex(void);

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public MCCamera(Application app)
        {
            App        = app;
            m_camelFlg = 0;

            m_worldYaw   = 0.0f;
            m_worldPitch = 0.0f;
            m_worldRoll  = 0.0f;

            m_FOV       = 0.0f;
            m_aspect    = 0.0f;
            m_nearPlane = 0.0f;
            m_farPlane  = 0.0f;

            m_rightFactor = 0.0f;
            m_upFactor    = 0.0f;
            // フラグ
            m_camelFlg = (int)V4CAMERAFLG.LH;

            // ビュー・マトリックスにセット属性
            MCVector3 vEyePt    = new MCVector3(0.0f, 0.0f, 0.0f);
            MCVector3 vLookatPt = new MCVector3(0.0f, 0.0f, 2.0f);
            MCVector3 vUp       = new MCVector3(0.0f, 1.0f, 0.0f);

            // ビューマトリックスをセットアップする
            SetViewParams(vEyePt, vLookatPt, vUp);

            // プロジェクションマトリックスをセットアップする
            SetProjParams(Math.UtilMathMC.PI / 4, 1.0f, 0.1f, 1000.0f);

            //
            m_isAnyPause = false;
        }
Beispiel #7
0
        /// <summary>
        /// 視錐台内から 指定した点(pvPoint)から Z値を取得する
        /// </summary>
        /// <param name="point">点の位置</param>
        /// <param name="z">オブジェクトの位置からカメラのEye位置の値からZ値を取得するポインタ</param>
        public void GetZValue(MCVector3 point, out float z)
        {
            MCVector3 vOP = point - m_eye;

            // vOP と前方ベクトルの内積
            z = vOP.Dot(m_viewForward);
        }
Beispiel #8
0
        //-------------------------------------
        //! @name MCBaseCamera 仮想関数
        //@{
        /// <summary>
        /// 視錐台内に点があるかの衝突判定
        /// </summary>
        /// <param name="point">点の位置</param>
        /// <param name="pZ">オブジェクトの位置からカメラのEye位置の値からZ値を取得</param>
        /// <returns>錐台内に点がある場合はtrueを返す</returns>
        public override bool CollisionPoint(MCVector3 point, out float z)

        {
            MCVector3 vOP = point - m_eye;

            // vOP と前方ベクトルの内積
            z = vOP.Dot(m_viewForward);
            if (z < m_nearPlane || m_farPlane < z)
            {
                return(false);
            }

            // vOP と右方ベクトルの内積
            float r      = vOP.Dot(m_viewRight);
            float rLimit = m_rightFactor * z;

            if (r < -rLimit || rLimit < r)
            {
                return(false);
            }

            // vOP と上方ベクトルの内積
            float u      = vOP.Dot(m_viewUp);
            float uLimit = m_upFactor * z;

            if (u < -uLimit || uLimit < u)
            {
                return(false);
            }

            // ここまで来れば点は錐台にある
            return(true);
        }
Beispiel #9
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="pos">頂点</param>
 /// <param name="color">色</param>
 /// <param name="fU">テクスチャU座標</param>
 /// <param name="fV">テクスチャV座標</param>
 public MC_VERTEX_PCTx(MCVector3 pos, Color4 color, float fU, float fV)
 {
     p = pos;
     c = color;
     u = fU;
     v = fV;
 }
Beispiel #10
0
        /// <summary>
        /// Eyeから指定ポイントまでの長さを取得する
        /// </summary>
        /// <param name="point">点の位置</param>
        /// <param name="len">オブジェクトの位置からカメラのEye位置の値からZ値を取得</param>
        public void GetEyeFromLength(MCVector3 point, out float len)
        {
            MCVector3 vTmp;

            // vOP と前方ベクトルの内積
            vTmp = point - m_eye;
            len  = vTmp.Length();
        }
Beispiel #11
0
 public int GetScaling(
     float periodicPosition,
     int anmIdx,
     MCVector3 scale
     )
 {
     return(0);
 }
Beispiel #12
0
 public int GetTranslate(
     float periodicPosition,
     int anmIdx,
     MCVector3 translate
     )
 {
     return(0);
 }
Beispiel #13
0
        /// <summary>
        /// クライアントは、カメラの位置および方向を変更するためにこれを呼ぶ。
        /// </summary>
        /// <param name="eyePt">カメラ・注目位置</param>
        /// <param name="lookatPt">カメラの位置</param>
        /// <param name="up"></param>
        public void SetViewParams(MCVector3 eyePt, MCVector3 lookatPt, MCVector3 up)
        {
            m_defaultEye    = m_eye = eyePt;
            m_defaultLookAt = m_lookAt = lookatPt;


            // ビューマトリックスをセット
            if ((m_camelFlg & (int)V4CAMERAFLG.LH) != 0)
            {
                // 左手座標系
                m_view.MakeCameraLookAtLH(eyePt, lookatPt, up);
            }
            else
            {
                // 右手座標系
                m_view.MakeCameraLookAtRH(eyePt, lookatPt, up);
            }
            // 逆行列を得る
            float det;

            m_view.GetInverse(out det, out m_cameraWorld);

            // 角度を取得
            MCVector3 vDeg;

            m_cameraWorld.GetRotationYZX(out vDeg);
            m_worldYaw   = vDeg.Y;
            m_worldPitch = vDeg.X;
            m_worldRoll  = vDeg.Z;

            //==============================
            // View×Proj
            //==============================
            m_viewProj = m_view * m_proj;



            //===========================================
            // 変換後の視錐台頂点を得る
            //===========================================
            MCMatrix3x3 m33 = new MCMatrix3x3();

            m33.ClipMCXMATRIX(m_cameraWorld);

            for (int i = 0; i < 4; ++i)
            {
                m_aTrNear[i]  = m33.Multiply(m_aNear[i]);
                m_aTrNear[i] += eyePt;
                m_aTrFar[i]   = m33.Multiply(m_aFar[i]);
                m_aTrFar[i]  += eyePt;
            }
            // m_viewの右方部分ポインタ
            m_viewRight = new MCVector3(m_cameraWorld.M11, m_cameraWorld.M12, m_cameraWorld.M13);
            // m_viewの上方部分ポインタ
            m_viewUp = new MCVector3(m_cameraWorld.M21, m_cameraWorld.M22, m_cameraWorld.M23);
            // m_viewの前方部分ポインタ
            m_viewForward = new MCVector3(m_cameraWorld.M31, m_cameraWorld.M32, m_cameraWorld.M33);
        }
Beispiel #14
0
 // SRT
 public int GetSRT(
     float periodicPosition,
     int anmIdx,
     MCVector3 scale,
     MCQuaternion rotation,
     MCVector3 position)
 {
     return(0);
 }
Beispiel #15
0
        /// <summary>
        /// RenderStart()→m_effect->Begin()→m_effect->BeginPass()
        ///  の呼び出した後に呼び出される。この関数後に描画コマンドが呼ばれる。
        /// </summary>
        /// <param name="device"></param>
        /// <param name="immediateContext"></param>
        /// <param name="totalTime">アプリケーションが開始してからの経過時間 (秒単位) です。</param>
        /// <param name="elapsedTime">最後のフレームからの経過時間 (秒単位) です。</param>
        /// <param name="callNum">GetCallRenderNumの数だけ呼び出される。0~x</param>
        /// <param name="passCnt">テクニックのパスカウント</param>
        /// <returns>通常、エラーが発生しなかった場合は 0 を返す。</returns>
        internal override int OnRenderBetweenBefore(SharpDX.Direct3D11.Device device, DeviceContext immediateContext, double totalTime, float elapsedTime, int callNum, int passCnt)
        {
            int hr  = 0;
            int tNo = GetCurrentTechnicNo();

            if (tNo == (int)EffectID.ZoomBloom ||
                tNo == (int)EffectID.DirectionalBloom ||
                tNo == (int)EffectID.Ripple)
            {
                if (passCnt == 0)
                {
                    hr = SetCurrentRenderTargetState(m_hTx, m_oldRenderTarget);
                    // テクスチャーのサーフェイスをクリアする
                    m_hTx.ClearDepthStencilView();
                    m_hTx.ClearRenderTargetView();

                    IsCurrentPassCallDraw2D3D = true;
                }
                else if (passCnt == 1)
                {
                    if (m_effectKind == (int)DCRL.D2S_CONST)
                    {
                    }
                    else
                    {
                        // 現在のカメラ座標を取得
                        MCVector3 v = GetCurrentCamera().EyePt;
                        m_drawSprite.Position = new MCVector3(v.X, v.Y, 0.0f);
                    }

                    DrawingSprite(m_drawSprite, GetSpriteTypeNo());
                    IsCurrentPassCallDraw2D3D = false;
                }
            }
            else
            {
                // if (m_effectKind == DCRL_2DS_CONST)
                // {
                //  int n;
                //  n = 9;
                // }
                // else
                // {
                //  // 現在のカメラ座標を取得
                //  const MCVector3 v = this.GetCurrentCamera().EyePt;
                //  m_hDrawSprite.Position(MCVector3(v.x, v.y, 0.0f));
                // }
                IsCurrentPassCallDraw2D3D = true;
            }
            if (tNo == (int)EffectID.DisolveTransition ||
                tNo == (int)EffectID.RadialBlurTransition)
            {
                //SetDiffuse
                //Diffuse2DTexture = m_hTx;
            }
            return(hr);
        }
Beispiel #16
0
 /// <summary>VectorF3型の値をセットする</summary>
 /// <param name="v">VectorF3値</param>
 /// <return>成功した場合trueを返す</return>
 public bool SetVectorF3(MCVector3 v)
 {
     if (m_type != UtilValueType.FLOAT3)
     {
         return(false);
     }
     m_float[0] = v.X; m_float[1] = v.Y; m_float[2] = v.X;
     return(true);
 }
Beispiel #17
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="pos">頂点</param>
 /// <param name="color">色</param>
 /// <param name="fU0">テクスチャU座標</param>
 /// <param name="fV0">テクスチャV座標</param>
 /// <param name="fU1">テクスチャU座標</param>
 /// <param name="fV1">テクスチャV座標</param>
 public MC_VERTEX_PCTxTx(MCVector3 pos, Color4 color, float fU0, float fV0, float fU1, float fV1)
 {
     p  = pos;
     c  = color;
     u0 = fU0;
     v0 = fV0;
     u1 = fU1;
     v1 = fV1;
 }
Beispiel #18
0
 /// <summary>
 /// 複製セット
 /// </summary>
 /// <param name="pos">頂点</param>
 /// <param name="color">色</param>
 /// <param name="fU0">テクスチャU座標</param>
 /// <param name="fV0">テクスチャV座標</param>
 /// <param name="fU1">テクスチャU座標</param>
 /// <param name="fV1">テクスチャV座標</param>
 public void Set(MCVector3 pos, Color4 color, float fU0, float fV0, float fU1, float fV1)
 {
     p  = pos;
     c  = color;
     u0 = fU0;
     v0 = fV0;
     u1 = fU1;
     v1 = fV1;
 }
Beispiel #19
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);
        }
 /// <summary>
 /// 値を複製セットする
 /// </summary>
 /// <param name="r"></param>
 public void Set(MCDrawSpriteBase r)
 {
     IsBillbord       = r.IsBillbord;
     IsBillbordConstX = r.IsBillbordConstX;
     IsBillbordConstY = r.IsBillbordConstY;
     BlendState       = r.BlendState;
     Flip             = r.Flip;
     m_anchor         = r.m_anchor;
     m_angle          = r.m_angle;
     m_scale          = r.m_scale;
     m_position       = r.m_position;
     m_BVSphere       = r.m_BVSphere;
     m_visible        = r.m_visible;
 }
Beispiel #21
0
        /// <summary>
        /// 入力パラメーターに基づいたプロジェクション・マトリックスを計算する。
        /// </summary>
        /// <param name="fFOV">視野の角度のラジアン</param>
        /// <param name="fAspect">アスペクト比</param>
        /// <param name="fNearPlane">ニアプレーン(近くの面)</param>
        /// <param name="fFarPlane">ファープレーン(遠くの面)</param>
        public void SetProjParams(float fFOV, float fAspect, float fNearPlane, float fFarPlane)
        {
            // プロジェクション・マトリックスのセット属性
            m_FOV       = fFOV;
            m_aspect    = fAspect;
            m_nearPlane = fNearPlane;
            m_farPlane  = fFarPlane;

            // ファクターの計算
            m_rightFactor = (float)System.Math.Tan((fFOV * 0.5f) * 57.29577951308232286465f);
            m_upFactor    = m_rightFactor * fAspect;



            float fFR, fFU, fNR, fNU;

            if ((m_camelFlg & (int)V4CAMERAFLG.LH) != 0)
            {
                // 左手座標系
                m_proj.MakePerspectiveFovLH(fFOV, fAspect, fNearPlane, fFarPlane);
            }
            else
            {
                // 右手座標系
                m_proj.MakePerspectiveFovRH(fFOV, fAspect, fNearPlane, fFarPlane);
            }
            //===============================
            // 視錐台の各頂点の計算
            //===============================
            fNR = m_nearPlane * m_rightFactor;
            fNU = m_nearPlane * m_upFactor;
            fFR = m_farPlane * m_rightFactor;
            fFU = m_farPlane * m_upFactor;

            m_aNear[0] = new MCVector3(fNU, fNR, m_nearPlane);
            m_aNear[1] = new MCVector3(-fNU, fNR, m_nearPlane);
            m_aNear[2] = new MCVector3(-fNU, -fNR, m_nearPlane);
            m_aNear[3] = new MCVector3(fNU, -fNR, m_nearPlane);

            m_aFar[0] = new MCVector3(fFU, fFR, m_farPlane);
            m_aFar[1] = new MCVector3(-fFU, fFR, m_farPlane);
            m_aFar[2] = new MCVector3(-fFU, -fFR, m_farPlane);
            m_aFar[3] = new MCVector3(fFU, -fFR, m_farPlane);
        }
Beispiel #22
0
 /// <summary>
 /// 初期化
 /// </summary>
 public void Init()
 {
     p = new MCVector3();
     u = v = 0;
 }
 /// <summary>
 /// 視錐台内に点があるかの衝突判定
 /// </summary>
 /// <param name="point">点の位置</param>
 /// <param name="z">オブジェクトの位置からカメラのEye位置の値からZ値を取得する</param>
 /// <returns></returns>
 public abstract bool CollisionPoint(MCVector3 point, out float z);
Beispiel #24
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="pos">頂点</param>
 public MC_VERTEX_P(MCVector3 pos)
 {
     p = pos;
 }
Beispiel #25
0
 /// <summary>
 /// 初期化
 /// </summary>
 public void Init()
 {
     p = new MCVector3();
     c = new Color4();
     u = v = 0;
 }
Beispiel #26
0
 /// <summary>
 /// 複製セット
 /// </summary>
 /// <param name="pos">頂点</param>
 /// <param name="fU">テクスチャU座標</param>
 /// <param name="fV">テクスチャV座標</param>
 public void Set(MCVector3 pos, float fU, float fV)
 {
     p = pos;
     u = fU;
     v = fV;
 }
Beispiel #27
0
 /// <summary>
 /// 初期化
 /// </summary>
 public void Init()
 {
     p = new MCVector3();
     n = new MCVector3();
     c = new Color4();
 }
Beispiel #28
0
 /// <summary>
 /// 複製セット
 /// </summary>
 /// <param name="pos">頂点</param>
 /// <param name="normal">法線</param>
 /// <param name="color">色</param>
 public void Set(MCVector3 pos, MCVector3 normal, Color4 color)
 {
     p = pos;
     n = normal;
     c = color;
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="spriteDraw"></param>
        /// <param name="pos"></param>
        /// <returns></returns>
        unsafe public int VertexUpdate(MCDrawAlphanumericSprite spriteDraw, out MCVector3 pos)
        {
            int hr = 0;

            pos = new MCVector3();
            int  divNo, tmpNo;
            byte uC;
            MCAlphanumericSprite spSprite = spriteDraw.Sprite;


            float startU, startV, endU, endV;
            float factorU, factorV;
            float startX, startY, fEndX, fEndY;

            float fW         = (spSprite.div.DivW_U * spSprite.Width);
            float fH         = (spSprite.div.DivH_V * spSprite.Height);
            float fCW        = fW * spSprite.charWidth;
            float fLH        = fH * spSprite.lineHeight;
            float deltaHalfW = (float)System.Math.Floor((fCW - fW) * 0.5f);
            float deltaHalfH = (float)System.Math.Floor((fLH - fH) * 0.5f);

            startX = deltaHalfW; // -0.5f;
            startY = deltaHalfH; // +0.5f;

            m_drawTriangleNum  = spriteDraw.Text.Length <= m_maxLength ? spriteDraw.Text.Length : m_maxLength;
            m_drawTriangleNum *= 2;

            // 配置による位置決め
            if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.USE_ALIGN) != 0)
            {
                List <float> vLineWidth = new List <float>();
                float        charWidth = 0, lineH = fH + deltaHalfH * 2.0f;
                float        rectX, rectY, rectWidht, rectHeight;

                rectX      = spriteDraw.Position.X;
                rectY      = spriteDraw.Position.Y;
                rectWidht  = spriteDraw.Box.X;
                rectHeight = spriteDraw.Box.X;

                pos.X = spriteDraw.Position.X + spriteDraw.Anchor.X;
                pos.Y = spriteDraw.Position.Y + spriteDraw.Anchor.Y;

                // 事前に文字の幅高さを計算
                for (int i = 0; i < m_maxLength && i < spriteDraw.Text.Length; ++i)
                {
                    uC = (byte)char.GetNumericValue(spriteDraw.Text[0]);

                    if (uC == 0x0A)
                    {
                        // 改行
                        vLineWidth.Add(charWidth);
                        charWidth = 0;
                        lineH    += fH + deltaHalfH * 2.0f;
                    }
                    else
                    {
                        charWidth += fW + deltaHalfW * 2.0f;
                    }
                }
                vLineWidth.Add(charWidth);

                // 縦軸
                if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.MIDDLE) != 0)
                {   // 縦:中央揃え
                    startY += spriteDraw.Angle.Y - (rectHeight - lineH) * 0.5f;
                }
                else if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.BOTTOM) != 0)
                {   // 下揃え
                    startY += spriteDraw.Angle.Y - (rectHeight - lineH);
                }
                else //if( spriteDraw.AlignFlags & MC_ANC.TOP )
                {   //上揃え
                    startY += spriteDraw.Angle.Y;
                }
                DataStream MappedResource;
                var        box = App.ImmediateContext.MapSubresource(
                    m_vertexBuffer,
                    MapMode.WriteDiscard,
                    SharpDX.Direct3D11.MapFlags.None,
                    out MappedResource);


                MC_VERTEX_PCTx *pV = (MC_VERTEX_PCTx *)MappedResource.DataPointer;

                for (int i = 0; i < m_allVertex; ++i)
                {
                    pV[i].Init();
                }

                bool bLnInit  = false;
                int  nNewLine = 0;
                for (int i = 0; i < m_maxLength && i < spriteDraw.Text.Length; ++i)
                {
                    var pTmp = &pV[i * 4];
                    uC = (byte)char.GetNumericValue(spriteDraw.Text[i]);

                    if (uC <= 0x1F || uC >= 0x7F)
                    {
                        divNo = 0;
                    }
                    else
                    {
                        divNo = m_aAncTable[(int)spSprite.useFlgsANC - 1][uC - 0x20];
                    }

                    if (!bLnInit)
                    {
                        if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.CENTER) != 0)
                        {   // 横:中央揃え
                            startX += (rectWidht - vLineWidth[nNewLine]) * 0.5f - spriteDraw.Angle.X;
                        }
                        else if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.RIGHT) != 0)
                        {   // 右寄り
                            startX += rectWidht - vLineWidth[nNewLine] - spriteDraw.Angle.X;
                        }
                        else //if( spriteDraw.AlignFlags & MC_ANC.LEFT )
                        {   //左寄り
                            startX -= spriteDraw.Angle.X;
                        }
                        bLnInit = true;
                    }
                    if (spSprite.div.Col == 0)
                    {
                        factorV = (1.0f / spSprite.div.Row);

                        startU = 0.0f;
                        startV = factorV * divNo;
                        endU   = 1.0f;
                        endV   = startV + factorV;
                    }
                    else if (spSprite.div.Row == 0)
                    {
                        factorU = (1.0f / spSprite.div.Col);

                        startU = factorU * divNo;
                        startV = 0.0f;
                        endU   = startU + factorU;
                        endV   = 1.0f;
                    }
                    else
                    {
                        tmpNo  = divNo % spSprite.div.Col;
                        startU = spSprite.div.DivW_U * tmpNo;
                        tmpNo  = divNo / spSprite.div.Col;
                        startV = spSprite.div.DivH_V * tmpNo;
                        endU   = startU + spSprite.div.DivW_U;
                        endV   = startV + spSprite.div.DivH_V;
                    }
                    // texturer uv
                    pTmp[0].u = startU; pTmp[0].v = startV;
                    pTmp[1].u = startU; pTmp[1].v = endV;
                    pTmp[2].u = endU; pTmp[2].v = startV;
                    pTmp[3].u = endU; pTmp[3].v = endV;
                    //
                    pTmp[0].c = spriteDraw.Color;
                    pTmp[1].c = spriteDraw.Color;
                    pTmp[2].c = spriteDraw.Color;
                    pTmp[3].c = spriteDraw.Color;
                    //
                    fEndX = startX + fW;
                    fEndY = startY - fH;

                    // 位置
                    pTmp[0].p.X = startX; pTmp[0].p.Y = startY; pTmp[0].p.Z = 0.0f;
                    pTmp[1].p.X = startX; pTmp[1].p.Y = fEndY; pTmp[1].p.Z = 0.0f;
                    pTmp[2].p.X = fEndX; pTmp[2].p.Y = startY; pTmp[2].p.Z = 0.0f;
                    pTmp[3].p.X = fEndX; pTmp[3].p.Y = fEndY; pTmp[3].p.Z = 0.0f;
                    if (uC == 0x0A)
                    {
                        startX  = deltaHalfW;// - 0.5f;
                        startY -= fH + deltaHalfH * 2.0f;
                        bLnInit = false;
                        ++nNewLine;
                    }
                    else
                    {
                        startX += fW + deltaHalfW * 2.0f;
                    }
                }
                App.ImmediateContext.UnmapSubresource(m_vertexBuffer, 0);
            }
            else
            {
                //-----------------------------------------------------
                // 通常
                //-----------------------------------------------------
                pos.X = spriteDraw.Position.X + spriteDraw.Anchor.X;
                pos.Y = spriteDraw.Position.Y + spriteDraw.Anchor.Y;

                DataStream MappedResource;
                var        box = App.ImmediateContext.MapSubresource(
                    m_vertexBuffer,
                    MapMode.WriteDiscard,
                    SharpDX.Direct3D11.MapFlags.None,
                    out MappedResource);


                MC_VERTEX_PCTx *pV = (MC_VERTEX_PCTx *)MappedResource.DataPointer;

                for (int i = 0; i < m_allVertex; ++i)
                {
                    pV[i].Init();
                }

                for (int i = 0; i < m_maxLength && i < spriteDraw.Text.Length; ++i)
                {
                    var pTmp = &pV[i * 4];
                    uC = (byte)spriteDraw.Text[i];

                    if (uC <= 0x1F || uC >= 0x7F)
                    {
                        divNo = 0;
                    }
                    else
                    {
                        divNo = m_aAncTable[(int)spSprite.useFlgsANC - 1][uC - 0x20];
                    }
                    //if( divNo == 0xFFFF )continue;
                    // UV
                    if (spSprite.div.Col == 0)
                    {
                        factorV = (1.0f / spSprite.div.Row);

                        startU = 0.0f;
                        startV = factorV * divNo;
                        endU   = 1.0f;
                        endV   = startV + factorV;
                    }
                    else if (spSprite.div.Row == 0)
                    {
                        factorU = (1.0f / spSprite.div.Col);

                        startU = factorU * divNo;
                        startV = 0.0f;
                        endU   = startU + factorU;
                        endV   = 1.0f;
                    }
                    else
                    {
                        tmpNo  = divNo % spSprite.div.Col;
                        startU = spSprite.div.DivW_U * tmpNo;
                        tmpNo  = divNo / spSprite.div.Col;
                        startV = spSprite.div.DivH_V * tmpNo;
                        endU   = startU + spSprite.div.DivW_U;
                        endV   = startV + spSprite.div.DivH_V;
                    }
                    // texturer uv
                    pTmp[0].u = startU; pTmp[0].v = startV;
                    pTmp[1].u = startU; pTmp[1].v = endV;
                    pTmp[2].u = endU;   pTmp[2].v = startV;
                    pTmp[3].u = endU;   pTmp[3].v = endV;
                    //
                    pTmp[0].c = spriteDraw.Color;
                    pTmp[1].c = spriteDraw.Color;
                    pTmp[2].c = spriteDraw.Color;
                    pTmp[3].c = spriteDraw.Color;
                    //
                    fEndX = startX + fW;
                    fEndY = startY - fH;

                    // 位置
                    pTmp[0].p.X = startX; pTmp[0].p.Y = startY; pTmp[0].p.Z = 0.0f;
                    pTmp[1].p.X = startX; pTmp[1].p.Y = fEndY;  pTmp[1].p.Z = 0.0f;
                    pTmp[2].p.X = fEndX;  pTmp[2].p.Y = startY; pTmp[2].p.Z = 0.0f;
                    pTmp[3].p.X = fEndX;  pTmp[3].p.Y = fEndY;  pTmp[3].p.Z = 0.0f;
                    if (uC == 0x0A)
                    {
                        // 改行
                        startX  = deltaHalfW;// - 0.5f;
                        startY -= fH + deltaHalfH * 2.0f;
                    }
                    else
                    {
                        startX += fW + deltaHalfW * 2.0f;
                    }
                }
                App.ImmediateContext.UnmapSubresource(m_vertexBuffer, 0);
            }

            return(hr);
        }
Beispiel #30
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="pos">頂点</param>
 /// <param name="normal">法線</param>
 /// <param name="color">色</param>
 public MC_VERTEX_PNC(MCVector3 pos, MCVector3 normal, Color4 color)
 {
     p = pos;
     n = normal;
     c = color;
 }