/// <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; }
/// <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); }
/// <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); }
//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; }
/// <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); }
//------------------------------------- //! @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); }
/// <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; }
/// <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(); }
public int GetScaling( float periodicPosition, int anmIdx, MCVector3 scale ) { return(0); }
public int GetTranslate( float periodicPosition, int anmIdx, MCVector3 translate ) { return(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); }
// SRT public int GetSRT( float periodicPosition, int anmIdx, MCVector3 scale, MCQuaternion rotation, MCVector3 position) { return(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); }
/// <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); }
/// <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; }
/// <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; }
/// <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; }
/// <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); }
/// <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);
/// <summary> /// コンストラクタ /// </summary> /// <param name="pos">頂点</param> public MC_VERTEX_P(MCVector3 pos) { p = pos; }
/// <summary> /// 初期化 /// </summary> public void Init() { p = new MCVector3(); c = new Color4(); u = v = 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; }
/// <summary> /// 初期化 /// </summary> public void Init() { p = new MCVector3(); n = new MCVector3(); c = new Color4(); }
/// <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); }
/// <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; }