/// <summary> /// レンダーターゲット&深度ステンシルテクスチャーを取得または作成 /// </summary> /// <param name="name">テクスチャー名。</param> /// <param name="w">幅</param> /// <param name="h">高さ</param> /// <returns>失敗した場合はnullを返す。同じ名前かつレンダーターゲット属性が有り、同じ幅、高さの場合は、取得します。</returns> protected MCBaseTexture GetCreateRenderTargetTexture2D(string name, int w, int h) { //===================================== // テクスチャー作成 MCBaseTexture spBTx; if (!App.ImageMgr.GetTexture(name, out spBTx)) { Texture2DDescription desc; MCBaseTexture.SimpleD2DescInit(w, h, out desc); desc.BindFlags |= BindFlags.DepthStencil | BindFlags.RenderTarget | BindFlags.ShaderResource; desc.Format = App.BackBuffer.Description.Format; spBTx = MCTexture.CreateTexture2D(App, name, desc); if (spBTx == null) { throw new Exception(name + " 作成失敗"); } } else { if (spBTx.GetID() != MCTexture.TextureID || !spBTx.IsRenderTarget || !spBTx.Is2DTexture || spBTx.GetWidth() != w || spBTx.GetHeight() != h) { return(null); } } // テクスチャーの深度&レンダーターゲットをクリアする spBTx.ClearRenderTargetView(); spBTx.ClearDepthStencilView(); return(spBTx); }
/// <summary> /// 初期化 /// </summary> public virtual void Init() { Name = ""; Anchor = new MCVector2(); Width = Height = 0; Texture00 = null; Sphere.Init(); TextureInvW = TextureInvH = 0; }
/// <summary> /// 指定した幅高さで、スプライトを作成する /// </summary> /// <param name="name">スプライト名</param> /// <param name="hTx"></param> /// <param name="w">幅、省略時1024</param> /// <param name="h">高さ、省略時1024</param> /// <returns></returns> protected MCDrawSprite CreateSpriteType1(string name, MCBaseTexture hTx, int w = 1024, int h = 1024) { //===================================== // マップチップ用のスプライト作成 MCRect rc = new MCRect(); rc.SetXYWH(0, 0, w, h); return(CreateSpriteType2(hTx, name, rc, w / 2, h / 2)); }
/// <summary> /// テクスチャーの場合は、通常代入ではなく、こちらは使う /// </summary> /// <param name=""></param> /// <param name=""></param> public void SetTexture(MCBaseTexture tx) { Texture00 = tx; if (Texture00 != null) { TextureInvW = 1.0f / Texture00.GetWidth(); TextureInvH = 1.0f / Texture00.GetHeight(); } }
/// <summary> /// セットする /// </summary> /// <param name="obj"></param> public void Set(MCBaseSprite obj) { Name = obj.Name; Anchor = obj.Anchor; Width = obj.Width; Height = obj.Height; Texture00 = obj.Texture00; TextureInvW = obj.TextureInvW; TextureInvH = obj.TextureInvH; }
/// <summary> /// 指定した幅高さで、スプライトを作成する /// </summary> /// <param name="hTx"></param> /// <param name="name">スプライト名</param> /// <param name="rc"></param> /// <param name="x">X座標</param> /// <param name="y">Y座標</param> /// <returns></returns> protected MCDrawSprite CreateSpriteType2(MCBaseTexture hTx, string name, MCRect rc, float x, float y) { MCDrawSprite draw = new MCDrawSprite(App); var handle = m_spriteRegister.CreateSpriteFromTextureName(name, rc.X, rc.Y, rc.Width, rc.Heith); draw = m_spriteRegister.CreateDrawSprite(handle); //===================================== // マップチップ用のスプライト作成 draw.D2RenderType = (int)SPRITE_TYPE.DEFAULT; draw.Position = new MCVector3(x, y, 0); return(draw); }
/// <summary> /// スプライトの作成 /// </summary> /// <param name="name">取得、または作成するスプライト名</param> /// <param name="tx">基本テクスチャーハンドル</param> /// <param name="rc">テクスチャーから切り取る短径</param> /// <param name="x">アンカー位置X</param> /// <param name="y">アンカー表示位置Y</param> /// <returns>描画するスプライトMCDrawSprite</returns> public MCSprite GetCreateSprite(string name, MCBaseTexture tx, MCRect rc, float x = float.MinValue, float y = float.MinValue) { MCSprite sprite = null; bool ret; if (tx == null) { return(null); } //===================================== // スプライト作成 MCBaseSprite spTmp; if (App.SpriteMgr.GetSpriteData(name, out spTmp)) { MCRect rect; if (spTmp.GetID() != MCSprite.SpriteID) { return(null); } sprite = (MCSprite)spTmp; if (sprite.flags.SpriteType != (int)MC_SPRITE_DATA.SIMPLE) { throw new Exception(name + " スプライトは、分割タイプ"); } sprite.GetRect(out rect); if (!(rc == rect)) { return(sprite); } } else { if (x == float.MinValue || y == float.MinValue) { sprite = MCSprite.CreateSprite(App, name, tx, rc, MC_SPRITE_ANCHOR.CENTER); } else { sprite = MCSprite.CreateSprite(App, name, tx, rc, MC_SPRITE_ANCHOR.CUSTOM, x, y); } if (sprite == null) { return(null); } } return(sprite); }
public static MCAlphanumericSprite CreateSprite( Application app, string spriteName, MCBaseTexture tx, int divW, int divH, MC_ANC useFlgsANC ) { MCAlphanumericSprite sp = new MCAlphanumericSprite(); // 登録済みのスプライトか? if (app.SpriteMgr.IsSprite(spriteName)) { return(sp); } sp.Texture00 = tx; // テクスチャーの情報を取得する var desc = sp.Texture00.GetDesc(); sp.Name = spriteName; sp.Width = desc.Width; sp.Height = desc.Height; sp.div.DivW_U = (float)divW / desc.Width; sp.div.DivH_V = (float)divH / desc.Height; // 行と列の数 sp.div.Col = desc.Width / divW; sp.div.Row = desc.Height / divH; // 球体を作る float fWW = divW * 0.5f; float fHH = divH * 0.5f; float r = (float)System.Math.Sqrt(fWW + fHH); var s = sp.Sphere; s.r = r; s.c = new MCVector3(r * 0.5f, -r * 0.5f, 0.0f); sp.Sphere = s; // 登録 if (app.SpriteMgr.RegisterSprite(spriteName, sp)) { return(sp); } return(sp); }
/// <summary> /// スプライトの作成 /// </summary> /// <param name="name">取得、または作成するスプライト名</param> /// <param name="tx">基本テクスチャーハンドル</param> /// <param name="rc">テクスチャーから切り取る短径</param> /// <param name="x">アンカー位置X</param> /// <param name="y">アンカー表示位置Y</param> /// <returns>描画するスプライトMCDrawSprite</returns> public MCSprite GetCreateSpriteDiv(string name, MCBaseTexture tx, int divW, int divH, float x = float.MinValue, float y = float.MinValue) { MCSprite sprite = null; bool ret; if (tx == null) { return(null); } //===================================== // スプライト作成 MCBaseSprite spTmp; if (App.SpriteMgr.GetSpriteData(name, out spTmp)) { if (spTmp.GetID() != MCSprite.SpriteID) { return(null); } sprite = (MCSprite)spTmp; if (sprite.flags.SpriteType == (int)MC_SPRITE_DATA.DIVISION) { return(sprite); } else { throw new Exception(name + " スプライトは、分割タイプでは無い"); } } else { if (x == float.MinValue || y == float.MinValue) { sprite = MCSprite.CreateSpriteDiv(App, name, tx, divW, divH, MC_SPRITE_ANCHOR.CENTER); } else { sprite = MCSprite.CreateSpriteDiv(App, name, tx, divW, divH, MC_SPRITE_ANCHOR.CUSTOM, x, y); } if (sprite == null) { return(null); } } return(sprite); }
/// <summary> /// テクスチャーを指定し、分割スプライトを作成する /// </summary> /// <param name="app">アプリ</param> /// <param name="spriteName">スプライト名</param> /// <param name="texture">テクスチャー</param> /// <param name="divW">分割時の幅</param> /// <param name="divH">分割時の高さ</param> /// <param name="anchorType"> /// MC_SPRITE_ANCHOR_CUSTOM の場合 アンカー位置は \a centerX および \a centerY の値によってきまる。 /// MC_SPRITE_ANCHOR_CENTER の場合 自動的にアンカー位置になる /// </param> /// <param name="centerX">中心座標 X anchorTypeの値が \ref MC_SPRITE_ANCHOR_CUSTOM の時だけ有効</param> /// <param name="centerY">中心座標 Y anchorTypeの値が \ref MC_SPRITE_ANCHOR_CUSTOM の時だけ有効</param> /// <returns>成功した場合は、インスタンス を返す。失敗した場合は、nullを返す。</returns> public static MCSprite CreateSpriteDiv( Application app, string spriteName, MCBaseTexture texture, int divW, int divH, MC_SPRITE_ANCHOR anchorType = MC_SPRITE_ANCHOR.CUSTOM, float centerX = 0.0f, float centerY = 0.0f ) { return(CreateSpriteDiv( app, spriteName, texture, 0, 0, divW, divH, anchorType, centerX, centerY)); }
/// <summary> /// 現在のレンダーターゲットの状態をセットする /// </summary> /// <param name="current">現行レンダーレンダーターゲット</param> /// <param name="old">戻す対象のレンダーターゲット</param> /// <returns></returns> protected int SetCurrentRenderTargetState(MCBaseTexture current, MCRenderTargetState old) { if (current == null) { throw new ArgumentNullException(); } else if (!current.IsRenderTarget) { throw new ArgumentNullException(); } if (old != null) { current.SetRenderTargets(old); } else { current.SetRenderTargets(); } return(0); }
/// <summary> /// スワップチェーンが変更された時に呼び出される /// </summary> /// <param name="device"></param> /// <param name="swapChain"></param> /// <param name="desc">変更後のスワップチェーン情報</param> public override void OnSwapChainResized(SharpDX.Direct3D11.Device device, SwapChain swapChain, SwapChainDescription desc) { if (!m_isCreated) { return; } int mx = (int)(System.Math.Max(desc.ModeDescription.Width, desc.ModeDescription.Height)); int r = 2; while ((r *= 2) < mx) { ; } if (r != m_mainTxLenght) { m_mainTxLenght = r; //===================================== // テクスチャー作成 if (m_hMainRT == null) { App.ImageMgr.GetTexture("2D_main_screen", out m_hMainRT); } if (m_hTx == null) { m_hTx = GetCreateRenderTargetTexture2D("2D_Technique", m_mainTxLenght, m_mainTxLenght); } else { m_hTx.ReSize2D(m_mainTxLenght, m_mainTxLenght); } if (m_hPrintSTx == null) { App.ImageMgr.GetTexture("PrintScreen", out m_hPrintSTx); } //===================================== // 通常スプライト作成 if (m_drawSprite == null) { MCRect rc = new MCRect(); rc.SetXYWH(0, 0, m_mainTxLenght, m_mainTxLenght); m_sprite = (MCSprite)m_spriteRegister.CreateSpriteFromTextureName("2D_Technique", rc.X, rc.Y, rc.Width, rc.Heith); m_drawSprite = m_spriteRegister.CreateDrawSprite(m_sprite); //===================================== // マップチップ用のスプライト作成 m_drawSprite.D2RenderType = (int)SPRITE_TYPE.DEFAULT; m_drawSprite.Position = new MCVector3( (float)System.Math.Ceiling(m_mainTxLenght * 0.5f), (float)System.Math.Ceiling(m_mainTxLenght * 0.5f), 0 ); } else { MCRect rc = new MCRect(); rc.SetXYWH(0, 0, m_mainTxLenght, m_mainTxLenght); m_sprite.ResetRect(rc); m_drawSprite.Position = new MCVector3( (float)System.Math.Ceiling(m_mainTxLenght * 0.5f), (float)System.Math.Ceiling(m_mainTxLenght * 0.5f), 0 ); } //===================================== // カメラの作成 if (m_isConstCoordinate) { if (m_hTxCamera == null) { CreateViewTextureCamera("FixedCameraSpriteD2Screen"); } } else { if (m_hTxCamera == null) { CreateViewTextureCamera("MCTexture"); } } if (m_hTxCamera != null) { MCTextureCamera hTmp = (MCTextureCamera)m_hTxCamera; hTmp.SetTextureSize(m_mainTxLenght, m_mainTxLenght); } // ビューポートの設定 m_aVP = new RawViewportF[] { new RawViewportF() { X = 0, Y = 0, Width = m_mainTxLenght, Height = m_mainTxLenght, MinDepth = 0, MaxDepth = 1.0f, } }; } }
/// <summary> /// スワップチェーンが変更された時に呼び出される /// </summary> /// <param name="device"></param> /// <param name="swapChain"></param> /// <param name="desc">変更後のスワップチェーン情報</param> public override void OnSwapChainResized(SharpDX.Direct3D11.Device device, SwapChain swapChain, SwapChainDescription desc) { if (!m_isCreated) { return; } int mx = (int)(System.Math.Max(desc.ModeDescription.Width, desc.ModeDescription.Height)); int r = 2; while ((r *= 2) < mx) { ; } if (r != m_mainTxLenght) { m_mainTxLenght = r; //===================================== // テクスチャー作成 if (m_mainScreenTx == null) { m_mainScreenTx = GetCreateRenderTargetTexture2D("2D_main_screen", m_mainTxLenght, m_mainTxLenght); } else { m_mainScreenTx.ReSize2D(m_mainTxLenght, m_mainTxLenght); } //--------------------------------------- // メインスクリーン用常駐描画スプライト作成 //--------------------------------------- if (m_backSprite == null) { m_backSprite = (MCSprite)m_spriteRegister.CreateSpriteFromTextureName("2D_main_screen", 0, 0, m_mainTxLenght, m_mainTxLenght, 0, 0); } else { MCRect rc = new MCRect(); rc.SetXYWH(0, 0, m_mainTxLenght, m_mainTxLenght); m_backSprite.ResetRect(rc); } RawViewportF[] v; GetCurrentViewPort(out v); if (m_backDrawSprite == null) { m_backDrawSprite = m_spriteRegister.CreateDrawSprite(m_backSprite); m_backDrawSprite.Effect = (int)DCRL.DEF_SPRITE; m_backDrawSprite.Position = new MCVector3( (float)System.Math.Ceiling((m_mainTxLenght - v[0].Width) * -0.5f), (float)System.Math.Ceiling((m_mainTxLenght - v[0].Height) * 0.5f), 0 ); } else { m_backDrawSprite.Position = new MCVector3( (float)System.Math.Ceiling((m_mainTxLenght - v[0].Width) * -0.5f), (float)System.Math.Ceiling((m_mainTxLenght - v[0].Height) * 0.5f), 0 ); } //===================================== // カメラの作成 if (m_hTxCamera == null) { CreateTextureCamera("MCTexture", m_mainTxLenght, m_mainTxLenght); } else { MCTextureCamera hTmp = (MCTextureCamera)m_hTxCamera; hTmp.SetTextureSize(m_mainTxLenght, m_mainTxLenght); } } }
public static MCSprite CreateSprite( Application app, string spriteName, MCBaseTexture texture, MCRect rc, MC_SPRITE_ANCHOR anchorType = MC_SPRITE_ANCHOR.CUSTOM, float centerX = 0.0f, float centerY = 0.0f ) { MCSprite sp = new MCSprite(); // 登録済みのスプライトか? if (app.SpriteMgr.IsSprite(spriteName)) { return(sp); } sp.SetTexture(texture); // テクスチャーの情報を取得する Texture2DDescription d2TxDesc = texture.GetDesc().D2; sp.flags.AnchorType = (uint)anchorType; sp.flags.SpriteType = (uint)MC_SPRITE_DATA.SIMPLE; sp.Name = spriteName; sp.Width = rc.Width; sp.Height = rc.Heith; if (anchorType == MC_SPRITE_ANCHOR.CUSTOM) { sp.Anchor = new MCVector2(centerX, centerY); } else { sp.Anchor = new MCVector2(rc.Width >> 1, rc.Heith >> 1); } // UV座標作成 float fFW = 1.0f / (d2TxDesc.Width); float fFH = 1.0f / (d2TxDesc.Height); sp.TextureInvW = fFW; sp.TextureInvH = fFH; sp.spl = new MCSauceSprite(); sp.spl.StartU = rc.left * fFW; sp.spl.StartV = rc.top * fFH; sp.spl.EndU = (rc.right + 1) * fFW; sp.spl.EndV = (rc.bottom + 1) * fFH; // 基準となる球体を作る float r = (float)System.Math.Sqrt(sp.Width * sp.Width + sp.Height * sp.Height); sp.Sphere = new Sphere( new MCVector3(r * 0.5f, -r * 0.5f, 0.0f), r ); // 登録 if (app.SpriteMgr.RegisterSprite(spriteName, sp)) { return(sp); } return(sp); }
public static MCSprite CreateSpriteDiv( Application app, string spriteName, MCBaseTexture texture, int baseW, int baseH, int divW, int divH, MC_SPRITE_ANCHOR anchorType = MC_SPRITE_ANCHOR.CUSTOM, float centerX = 0.0f, float centerY = 0.0f ) { MCSprite sp = new MCSprite(); // 登録済みのスプライトか? if (app.SpriteMgr.IsSprite(spriteName)) { return(sp); } sp.Texture00 = texture; // テクスチャーの情報を取得する Texture2DDescription ImgInfo = sp.Texture00.GetDesc().D2; sp.Name = spriteName; sp.Width = ImgInfo.Width; sp.Height = ImgInfo.Height; if (anchorType == MC_SPRITE_ANCHOR.CUSTOM) { var a = sp.Anchor; a.X = -centerX; a.Y = centerY; } else { var a = sp.Anchor; a.X = -(float)(divW >> 1); a.Y = (float)(divH >> 1); } // sp.flags.AnchorType = (uint)anchorType; sp.flags.SpriteType = (uint)MC_SPRITE_DATA.DIVISION; sp.div = new MCSauceConsecutiveSprite(); sp.div.DivW_U = (float)divW / ImgInfo.Width; sp.div.DivH_V = (float)divH / ImgInfo.Height; if (baseW == 0 || baseH == 0) { // 行と列の数 sp.div.Col = ImgInfo.Width / divW; sp.div.Row = ImgInfo.Height / divH; } else { // 行と列の数 sp.div.Col = baseW / divW; sp.div.Row = baseH / divH; } // 球体を作る float fWW = (float)(divW) * 0.5f; float fHH = (float)(divH) * 0.5f; float r = (float)System.Math.Sqrt(fWW + fHH); var s = sp.Sphere; s.r = r; s.c = new MCVector3(r * 0.5f, -r * 0.5f, 0.0f); sp.Sphere = s; // 登録 if (app.SpriteMgr.RegisterSprite(spriteName, sp)) { return(sp); } return(sp); }