예제 #1
0
        // 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
        }
예제 #2
0
	// 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 );
	}