/// <summary> /// Compiles the grid's geometry from the given <see cref="Pen"/> and overall dimensions into a <see cref="DrawCache"/> object. /// </summary> /// <param name="pen">The <see cref="Pen"/> to render the grid's lines with.</param> /// <param name="left">The ledge edge of the grid.</param> /// <param name="top">The top edge of the grid.</param> /// <param name="width">The width of the grid.</param> /// <param name="height">The height of the grid.</param> /// <returns>A <see cref="DrawCache"/> with the compiled geometry.</returns> /// <remarks>Only the most recently compiled <see cref="DrawCache"/> is valid for any given <see cref="Grid"/>.</remarks> public DrawCache Compile(Pen pen, float left, float top, float width, float height) { short vIndex = 0; short iIndex = 0; float w2 = pen.Width / 2; for (int y = 0; y <= _rows; y++) { for (int x = 0; x <= _columns; x++) { float px = left + (width / _columns) * x; float py = top + (height / _rows) * y; AddVertex(_vertexBuffer, vIndex + 0, px - w2, py - w2, pen.ColorAt(0, 0, 0)); AddVertex(_vertexBuffer, vIndex + 1, px + w2, py - w2, pen.ColorAt(0, 0, 0)); AddVertex(_vertexBuffer, vIndex + 2, px - w2, py + w2, pen.ColorAt(0, 0, 0)); AddVertex(_vertexBuffer, vIndex + 3, px + w2, py + w2, pen.ColorAt(0, 0, 0)); AddQuad(_indexBuffer, iIndex, vIndex); vIndex += 4; iIndex += 6; } } for (int y = 0; y < _rows; y++) { for (int x = 0; x <= _columns; x++) { int baseV1 = (y * (_columns + 1) + x) * 4; int baseV2 = ((y + 1) * (_columns + 1) + x) * 4; AddQuad(_indexBuffer, iIndex, (short)(baseV1 + 2), (short)(baseV1 + 3), (short)(baseV2 + 0), (short)(baseV2 + 1)); iIndex += 6; } } for (int y = 0; y <= _rows; y++) { for (int x = 0; x < _columns; x++) { int baseV1 = (y * (_columns + 1) + x) * 4; int baseV2 = baseV1 + 4; AddQuad(_indexBuffer, iIndex, (short)(baseV1 + 1), (short)(baseV2 + 0), (short)(baseV1 + 3), (short)(baseV2 + 2)); iIndex += 6; } } _serial[0]++; DrawCache cache = new DrawCache(); cache.AddUnit(new GridCacheUnit(_vertexBuffer, _indexBuffer, pen.Brush.Texture, _serial)); return(cache); }
/// <summary> /// Compiles the grid's geometry from the given <see cref="Pen"/> and overall dimensions into a <see cref="DrawCache"/> object. /// </summary> /// <param name="pen">The <see cref="Pen"/> to render the grid's lines with.</param> /// <param name="left">The ledge edge of the grid.</param> /// <param name="top">The top edge of the grid.</param> /// <param name="width">The width of the grid.</param> /// <param name="height">The height of the grid.</param> /// <returns>A <see cref="DrawCache"/> with the compiled geometry.</returns> /// <remarks>Only the most recently compiled <see cref="DrawCache"/> is valid for any given <see cref="Grid"/>.</remarks> public DrawCache Compile (Pen pen, float left, float top, float width, float height) { short vIndex = 0; short iIndex = 0; float w2 = pen.Width / 2; for (int y = 0; y <= _rows; y++) { for (int x = 0; x <= _columns; x++) { float px = left + (width / _columns) * x; float py = top + (height / _rows) * y; AddVertex(_vertexBuffer, vIndex + 0, px - w2, py - w2, pen.ColorAt(0, 0, 0)); AddVertex(_vertexBuffer, vIndex + 1, px + w2, py - w2, pen.ColorAt(0, 0, 0)); AddVertex(_vertexBuffer, vIndex + 2, px - w2, py + w2, pen.ColorAt(0, 0, 0)); AddVertex(_vertexBuffer, vIndex + 3, px + w2, py + w2, pen.ColorAt(0, 0, 0)); AddQuad(_indexBuffer, iIndex, vIndex); vIndex += 4; iIndex += 6; } } for (int y = 0; y < _rows; y++) { for (int x = 0; x <= _columns; x++) { int baseV1 = (y * (_columns + 1) + x) * 4; int baseV2 = ((y + 1) * (_columns + 1) + x) * 4; AddQuad(_indexBuffer, iIndex, (short)(baseV1 + 2), (short)(baseV1 + 3), (short)(baseV2 + 0), (short)(baseV2 + 1)); iIndex += 6; } } for (int y = 0; y <= _rows; y++) { for (int x = 0; x < _columns; x++) { int baseV1 = (y * (_columns + 1) + x) * 4; int baseV2 = baseV1 + 4; AddQuad(_indexBuffer, iIndex, (short)(baseV1 + 1), (short)(baseV2 + 0), (short)(baseV1 + 3), (short)(baseV2 + 2)); iIndex += 6; } } _serial[0]++; DrawCache cache = new DrawCache(); cache.AddUnit(new GridCacheUnit(_vertexBuffer, _indexBuffer, pen.Brush.Texture, _serial)); return cache; }