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); }
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); }
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); }
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); }
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); }
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++; }