// SpriteManager public SpriteManager() { #if !RELEASE RasterizerState_WireFrame = new RasterizerState(); RasterizerState_WireFrame.FillMode = FillMode.WireFrame; #endif GraphicsDevice = _UI.Game.GraphicsDevice; PresentationParameters pp = GraphicsDevice.PresentationParameters; BackBufferSize = new Vector2(pp.BackBufferWidth, pp.BackBufferHeight); SpriteCountMax = _UI.Settings.Sprite_Count; Sprites = new Sprite[SpriteCountMax]; SpriteCount = 0; CurrentSprite = 0; HasBatched = new bool[_UI.Settings.Sprite_RenderPassCount]; TopLayer = _UI.Settings.Sprite_LayerCount - 1; RenderPassLayerSprites = new List <List <int>[]>(_UI.Settings.Sprite_RenderPassCount); RenderPass3dMask = _UI.Settings.Sprite_RenderPass3dMask; for (int i = 0; i < _UI.Settings.Sprite_RenderPassCount; ++i) { List <int>[] layerSprites = new List <int> [_UI.Settings.Sprite_LayerCount]; for (int j = 0; j < layerSprites.Length; ++j) { layerSprites[j] = new List <int>(); } RenderPassLayerSprites.Add(layerSprites); } PreMatrixPool = new Matrix[_UI.Settings.Sprite_PreMatrixCount]; PreMatrixCount = 0; PostMatrixPool = new Matrix[_UI.Settings.Sprite_PostMatrixCount]; PostMatrixCount = 0; Matrix identity = Matrix.Identity; // reserve identity StorePreMatrix(ref identity); StorePostMatrix(ref identity); RenderStatePool = new object[_UI.Settings.Sprite_RenderStateCount]; RenderStateCount = 0; // default renderstates StoreRenderState(DepthStencilState.None); StoreRenderState(RasterizerState.CullNone); RenderStateStack_Blend = new Stack <int>(_UI.Settings.Sprite_RenderStateStackCount); RenderStateStack_DepthStencil = new Stack <int>(_UI.Settings.Sprite_RenderStateStackCount); RenderStateStack_Rasterizer = new Stack <int>(_UI.Settings.Sprite_RenderStateStackCount); VertexCorners = new Vector2[VertexCount] { new Vector2(0.0f, 0.0f), new Vector2(1.0f, 0.0f), new Vector2(1.0f, 1.0f), new Vector2(0.0f, 1.0f), }; VertexCornersFlipped = new Vector2[VertexCount] { new Vector2(0.0f, 1.0f), new Vector2(1.0f, 1.0f), new Vector2(1.0f, 0.0f), new Vector2(0.0f, 0.0f), }; VertexOffsetAligned = new Vector2[(int)E_Align.Count] { new Vector2(0.0f, 0.0f), // None new Vector2(0.0f, 0.0f), // TopLeft new Vector2(0.5f, 0.0f), // TopCentre new Vector2(1.0f, 0.0f), // TopRight new Vector2(0.0f, 0.5f), // MiddleLeft new Vector2(0.5f, 0.5f), // MiddleCentre new Vector2(1.0f, 0.5f), // MiddleRight new Vector2(0.0f, 1.0f), // BottomLeft new Vector2(0.5f, 1.0f), // BottomCentre new Vector2(1.0f, 1.0f), // BottomRight }; VertexOffsetAlignedFlipped = new Vector2[(int)E_Align.Count] { new Vector2(0.0f, 1.0f), // None new Vector2(0.0f, 1.0f), // TopLeft new Vector2(0.5f, 1.0f), // TopCentre new Vector2(1.0f, 1.0f), // TopRight new Vector2(0.0f, 0.5f), // MiddleLeft new Vector2(0.5f, 0.5f), // MiddleCentre new Vector2(1.0f, 0.5f), // MiddleRight new Vector2(0.0f, 0.0f), // BottomLeft new Vector2(0.5f, 0.0f), // BottomCentre new Vector2(1.0f, 0.0f), // BottomRight }; VertexCornersAligned = new Vector3[(int)E_Align.Count][]; for (int i = 0; i < VertexCornersAligned.Length; ++i) { VertexCornersAligned[i] = new Vector3[VertexCount]; } VertexCornersAlignedFlipped = new Vector3[(int)E_Align.Count][]; for (int i = 0; i < VertexCornersAlignedFlipped.Length; ++i) { VertexCornersAlignedFlipped[i] = new Vector3[VertexCount]; } for (int i = 0; i < (int)E_Align.Count; ++i) { for (int j = 0; j < VertexCount; ++j) { VertexCornersAligned[i][j] = new Vector3(VertexCorners[j] - VertexOffsetAligned[i], 0.0f); VertexCornersAlignedFlipped[i][j] = new Vector3(VertexCornersFlipped[j] - VertexOffsetAlignedFlipped[i], 0.0f); } } TransformMatrix2D = Matrix.CreateTranslation(-0.5f, -0.5f, 0.0f) * Matrix.CreateOrthographicOffCenter(0.0f, pp.BackBufferWidth, pp.BackBufferHeight, 0.0f, -1500.0f, 1500.0f); TransformMatrix = TransformMatrix2D; // default RenderPassTransformMatrix = new Matrix[_UI.Settings.Sprite_RenderPassCount]; for (int i = 0; i < RenderPassTransformMatrix.Length; ++i) { RenderPassTransformMatrix[i] = Matrix.Identity; } AutoTransformIndex = 0; AutoTransformOffset = new Vector3(); VertexData = new VertexSprite[VertexCount * SpriteCountMax]; VertexPosition = 0; DynamicVB = new DynamicVertexBuffer(GraphicsDevice, VertexSprite.VertexDeclaration, SpriteCountMax * VertexCount, BufferUsage.WriteOnly); #if WINDOWS DynamicVB.ContentLost += ((sender, e) => { VertexPosition = 0; }); #endif short primitiveCount = 0; short[] dataIB = new short[SpriteCountMax * IndexCount]; for (int i = 0; i < dataIB.Length;) { short offset = (short)(primitiveCount * VertexCount); dataIB[i++] = (short)(0 + offset); dataIB[i++] = (short)(1 + offset); dataIB[i++] = (short)(2 + offset); dataIB[i++] = (short)(2 + offset); dataIB[i++] = (short)(3 + offset); dataIB[i++] = (short)(0 + offset); ++primitiveCount; } DynamicIB = new DynamicIndexBuffer(GraphicsDevice, IndexElementSize.SixteenBits, SpriteCountMax * IndexCount, BufferUsage.WriteOnly); DynamicIB.SetData(dataIB); #if WINDOWS DataIB = dataIB; DynamicIB.ContentLost += ((sender, e) => { DynamicIB.SetData(DataIB); }); #endif }
// SpriteManager public SpriteManager() { #if !RELEASE RasterizerState_WireFrame = new RasterizerState(); RasterizerState_WireFrame.FillMode = FillMode.WireFrame; #endif GraphicsDevice = _UI.Game.GraphicsDevice; PresentationParameters pp = GraphicsDevice.PresentationParameters; BackBufferSize = new Vector2( pp.BackBufferWidth, pp.BackBufferHeight ); SpriteCountMax = _UI.Settings.Sprite_Count; Sprites = new Sprite[ SpriteCountMax ]; SpriteCount = 0; CurrentSprite = 0; TopLayer = _UI.Settings.Sprite_LayerCount - 1; RenderPassLayerSprites = new List< List< int >[] >( _UI.Settings.Sprite_RenderPassCount ); RenderPass3dMask = _UI.Settings.Sprite_RenderPass3dMask; for ( int i = 0; i < _UI.Settings.Sprite_RenderPassCount; ++i ) { List< int >[] layerSprites = new List< int >[ _UI.Settings.Sprite_LayerCount ]; for ( int j = 0; j < layerSprites.Length; ++j ) layerSprites[ j ] = new List< int >(); RenderPassLayerSprites.Add( layerSprites ); } PreMatrixPool = new Matrix[ _UI.Settings.Sprite_PreMatrixCount ]; PreMatrixCount = 0; PostMatrixPool = new Matrix[ _UI.Settings.Sprite_PostMatrixCount ]; PostMatrixCount = 0; Matrix identity = Matrix.Identity; // reserve identity StorePreMatrix( ref identity ); StorePostMatrix( ref identity ); RenderStatePool = new object[ _UI.Settings.Sprite_RenderStateCount ]; RenderStateCount = 0; // default renderstates StoreRenderState( DepthStencilState.None ); StoreRenderState( RasterizerState.CullNone ); RenderStateStack_Blend = new Stack< int >( _UI.Settings.Sprite_RenderStateStackCount ); RenderStateStack_DepthStencil = new Stack< int >( _UI.Settings.Sprite_RenderStateStackCount ); RenderStateStack_Rasterizer = new Stack< int >( _UI.Settings.Sprite_RenderStateStackCount ); VertexCorners = new Vector2[ VertexCount ] { new Vector2( 0.0f, 0.0f ), new Vector2( 1.0f, 0.0f ), new Vector2( 1.0f, 1.0f ), new Vector2( 0.0f, 1.0f ), }; VertexCornersFlipped = new Vector2[ VertexCount ] { new Vector2( 0.0f, 1.0f ), new Vector2( 1.0f, 1.0f ), new Vector2( 1.0f, 0.0f ), new Vector2( 0.0f, 0.0f ), }; VertexOffsetAligned = new Vector2[ (int)E_Align.Count ] { new Vector2( 0.0f, 0.0f ), // None new Vector2( 0.0f, 0.0f ), // TopLeft new Vector2( 0.5f, 0.0f ), // TopCentre new Vector2( 1.0f, 0.0f ), // TopRight new Vector2( 0.0f, 0.5f ), // MiddleLeft new Vector2( 0.5f, 0.5f ), // MiddleCentre new Vector2( 1.0f, 0.5f ), // MiddleRight new Vector2( 0.0f, 1.0f ), // BottomLeft new Vector2( 0.5f, 1.0f ), // BottomCentre new Vector2( 1.0f, 1.0f ), // BottomRight }; VertexOffsetAlignedFlipped = new Vector2[ (int)E_Align.Count ] { new Vector2( 0.0f, 1.0f ), // None new Vector2( 0.0f, 1.0f ), // TopLeft new Vector2( 0.5f, 1.0f ), // TopCentre new Vector2( 1.0f, 1.0f ), // TopRight new Vector2( 0.0f, 0.5f ), // MiddleLeft new Vector2( 0.5f, 0.5f ), // MiddleCentre new Vector2( 1.0f, 0.5f ), // MiddleRight new Vector2( 0.0f, 0.0f ), // BottomLeft new Vector2( 0.5f, 0.0f ), // BottomCentre new Vector2( 1.0f, 0.0f ), // BottomRight }; VertexCornersAligned = new Vector3[ (int)E_Align.Count ][]; for ( int i = 0; i < VertexCornersAligned.Length; ++i ) VertexCornersAligned[ i ] = new Vector3[ VertexCount ]; VertexCornersAlignedFlipped = new Vector3[ (int)E_Align.Count ][]; for ( int i = 0; i < VertexCornersAlignedFlipped.Length; ++i ) VertexCornersAlignedFlipped[ i ] = new Vector3[ VertexCount ]; for ( int i = 0; i < (int)E_Align.Count; ++i ) { for ( int j = 0; j < VertexCount; ++j ) { VertexCornersAligned[ i ][ j ] = new Vector3( VertexCorners[ j ] - VertexOffsetAligned[ i ], 0.0f ); VertexCornersAlignedFlipped[ i ][ j ] = new Vector3( VertexCornersFlipped[ j ] - VertexOffsetAlignedFlipped[ i ], 0.0f ); } } TransformMatrix2D = Matrix.CreateTranslation( -0.5f, -0.5f, 0.0f ) * Matrix.CreateOrthographicOffCenter( 0.0f, pp.BackBufferWidth, pp.BackBufferHeight, 0.0f, -1500.0f, 1500.0f ); TransformMatrix = TransformMatrix2D; // default AutoTransformIndex = 0; AutoTransformOffset = new Vector3(); VertexData = new VertexSprite[ VertexCount * SpriteCountMax ]; VertexPosition = 0; DynamicVB = new DynamicVertexBuffer( GraphicsDevice, VertexSprite.VertexDeclaration, SpriteCountMax * VertexCount, BufferUsage.WriteOnly ); DynamicIB = new DynamicIndexBuffer( GraphicsDevice, IndexElementSize.SixteenBits, SpriteCountMax * IndexCount, BufferUsage.WriteOnly ); // IB never changes short[] dataIB = new short[ SpriteCountMax * IndexCount ]; short primitiveCount = 0; for ( int i = 0; i < dataIB.Length; ) { short offset = (short)( primitiveCount * VertexCount ); dataIB[ i++ ] = (short)( 0 + offset ); dataIB[ i++ ] = (short)( 1 + offset ); dataIB[ i++ ] = (short)( 2 + offset ); dataIB[ i++ ] = (short)( 2 + offset ); dataIB[ i++ ] = (short)( 3 + offset ); dataIB[ i++ ] = (short)( 0 + offset ); ++primitiveCount; } DynamicIB.SetData( dataIB ); }