Пример #1
0
        void DrawBatch(int startSpriteIndex, int spriteCount)
        {
            DataBox mappedData = _deviceContext.MapSubresource(_VB, 0, MapMode.WriteDiscard, MapFlags.None);

            // Update the vertices
            unsafe
            {
                SpriteVertex *v = (SpriteVertex *)mappedData.DataPointer.ToPointer();

                for (int i = 0; i < spriteCount; ++i)
                {
                    Sprite sprite = _spriteList[startSpriteIndex + i];

                    SpriteVertex[] quad = new SpriteVertex[4];

                    BuildSpriteQuad(sprite, ref quad);

                    v[i * 4]     = quad[0];
                    v[i * 4 + 1] = quad[1];
                    v[i * 4 + 2] = quad[2];
                    v[i * 4 + 3] = quad[3];
                }
            }

            _deviceContext.UnmapSubresource(_VB, 0);

            _deviceContext.DrawIndexed(spriteCount * 6, 0, 0);
        }
Пример #2
0
        private void DrawBatch(Int32 startSpriteIndex, Int32 spriteCount)
        {
            DataBox mappedData = DeviceContext.MapSubresource(this.VertexBuffer, 0, MapMode.WriteDiscard, MapFlags.None);

            // Update the vertices
            unsafe
            {
                SpriteVertex *spriteVertex = (SpriteVertex *)mappedData.DataPointer.ToPointer();

                for (Int32 index = 0; index < spriteCount; index++)
                {
                    Sprite         sprite = this.SpriteList[startSpriteIndex + index];
                    SpriteVertex[] quad   = new SpriteVertex[4];

                    this.BuildSpriteQuad(sprite, ref quad);

                    spriteVertex[index * 4]       = quad[0];
                    spriteVertex[(index * 4) + 1] = quad[1];
                    spriteVertex[(index * 4) + 2] = quad[2];
                    spriteVertex[(index * 4) + 3] = quad[3];
                }
            }

            DeviceContext.UnmapSubresource(this.VertexBuffer, 0);
            DeviceContext.DrawIndexed(spriteCount * 6, 0, 0);
        }
Пример #3
0
        public unsafe bool DrawSprite(Texture2D texture, SpriteVertex[] vertices, Techniques technique = Techniques.Default, Rectangle?scissorRectangle = null)
        {
            if (texture == null || texture.IsDisposed)
            {
                return(false);
            }
            bool draw = false;

            for (byte i = 0; i < 4; i++)
            {
                if (_drawingArea.Contains(vertices[i].Position) == ContainmentType.Contains)
                {
                    draw = true;

                    break;
                }
            }

            if (!draw)
            {
                return(false);
            }

            if (_numSprites >= MAX_SPRITES)
            {
                Flush();
            }
#if !ORIONSORT
            vertices[0].Position.Z = vertices[1].Position.Z = vertices[2].Position.Z = vertices[3].Position.Z = GetZ();
#endif
            _textureInfo[_numSprites] = new DrawInfo(texture, scissorRectangle.HasValue, scissorRectangle);

            fixed(SpriteVertex *p = &_vertexInfo[_numSprites * 4])
            {
                fixed(SpriteVertex *t = &vertices[0])
                {
                    SpriteVertex *ptr0 = p;

                    ptr0[0] = t[0];
                    ptr0[1] = t[1];
                    ptr0[2] = t[2];
                    ptr0[3] = t[3];
                }
            }

            _numSprites++;

            return(true);
        }
Пример #4
0
        private unsafe void Push(Texture2D texture, SpriteVertex[] vertices, Techniques technique)
        {
            AddQuadrilateralIndices(_vertexCount);

            if (_vertexCount + VERTEX_COUNT > _vertices.Length || _indicesCount + INDEX_COUNT > _indices.Length)
            {
                Flush();
            }

            DrawCallInfo call = new DrawCallInfo(texture, technique, _indicesCount, PRIMITIVES_COUNT, 0);


            fixed(SpriteVertex *p = &_vertices[_vertexCount])
            {
                fixed(SpriteVertex *t = &vertices[0])
                {
                    SpriteVertex *ptr  = p;
                    SpriteVertex *tptr = t;

                    *ptr++ = *tptr++;
                    *ptr++ = *tptr++;
                    *ptr++ = *tptr++;
                    *ptr   = *tptr;
                }
            }

            fixed(short *p = &_indices[_indicesCount])
            {
                fixed(short *t = &_geometryIndices[0])
                {
                    short *ptr  = p;
                    short *tptr = t;

                    *ptr++ = *tptr++;
                    *ptr++ = *tptr++;
                    *ptr++ = *tptr++;
                    *ptr++ = *tptr++;
                    *ptr++ = *tptr++;
                    *ptr   = *tptr;
                }
            }

            _vertexCount  += VERTEX_COUNT;
            _indicesCount += INDEX_COUNT;

            Enqueue(ref call);
        }
Пример #5
0
        public unsafe bool DrawSprite(Texture2D texture, SpriteVertex[] vertices, Techniques technique = Techniques.Default)
        {
            if (texture == null || texture.IsDisposed)
            {
                return(false);
            }
            bool draw = false;

            for (byte i = 0; i < 4; i++)
            {
                if (_drawingArea.Contains(vertices[i].Position) == ContainmentType.Contains)
                {
                    draw = true;

                    break;
                }
            }

            if (!draw)
            {
                return(false);
            }

            if (_numSprites >= MAX_SPRITES)
            {
                Flush();
            }

            _textureInfo[_numSprites] = texture;

            fixed(SpriteVertex *p = &_vertexInfo[_numSprites * 4])
            {
                fixed(SpriteVertex *t = &vertices[0])
                {
                    SpriteVertex *ptr0 = p;

                    ptr0[0] = t[0];
                    ptr0[1] = t[1];
                    ptr0[2] = t[2];
                    ptr0[3] = t[3];
                }
            }

            _numSprites++;

            return(true);
        }
Пример #6
0
        public unsafe void DrawShadow(Texture2D texture, SpriteVertex[] vertices, Vector2 position, bool flip, float z)
        {
            if (texture == null || texture.IsDisposed)
            {
                return;
            }

            if (_numSprites >= MAX_SPRITES)
            {
                Flush();
            }
#if !ORIONSORT
            vertices[0].Position.Z = vertices[1].Position.Z = vertices[2].Position.Z = vertices[3].Position.Z = z;
#endif
            float skewHorizTop    = (vertices[0].Position.Y - position.Y) * .5f;
            float skewHorizBottom = (vertices[3].Position.Y - position.Y) * .5f;

            vertices[0].Position.X            -= skewHorizTop;
            vertices[0].Position.Y            -= skewHorizTop;
            vertices[flip ? 2 : 1].Position.X -= skewHorizTop;
            vertices[flip ? 2 : 1].Position.Y -= skewHorizTop;
            vertices[flip ? 1 : 2].Position.X -= skewHorizBottom;
            vertices[flip ? 1 : 2].Position.Y -= skewHorizBottom;
            vertices[3].Position.X            -= skewHorizBottom;
            vertices[3].Position.Y            -= skewHorizBottom;
            _textureInfo[_numSprites]          = new DrawInfo(texture);

            fixed(SpriteVertex *p = &_vertexInfo[_numSprites * 4])
            {
                fixed(SpriteVertex *t = &vertices[0])
                {
                    SpriteVertex *ptr0 = p;

                    ptr0[0] = t[0];
                    ptr0[1] = t[1];
                    ptr0[2] = t[2];
                    ptr0[3] = t[3];
                }
            }

            _numSprites++;
        }