mirror of
https://github.com/sbrl/Nibriboard.git
synced 2018-01-10 21:33:49 +00:00
Update DrawnLine & Plane to allow line addition.
This commit is contained in:
parent
d8677a6e4b
commit
b35a11a2ee
2 changed files with 71 additions and 2 deletions
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
namespace Nibriboard.RippleSpace
|
namespace Nibriboard.RippleSpace
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -7,6 +8,25 @@ namespace Nibriboard.RippleSpace
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DrawnLine
|
public class DrawnLine
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The id of line that this <see cref="Nibriboard.RippleSpace.DrawnLine" /> is part of.
|
||||||
|
/// Note that this id may not be unique - several lines that were all
|
||||||
|
/// drawn at once may also have the same id. This is such that a single
|
||||||
|
/// line that was split across multiple chunks can still be referenced.
|
||||||
|
/// </summary>
|
||||||
|
public readonly Guid LineId;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The width of the line.
|
||||||
|
/// </summary>
|
||||||
|
public int LineWidth;
|
||||||
|
/// <summary>
|
||||||
|
/// The colour of the line.
|
||||||
|
/// </summary>
|
||||||
|
public string Colour;
|
||||||
|
/// <summary>
|
||||||
|
/// The points that represent the line.
|
||||||
|
/// </summary>
|
||||||
public List<LocationReference> Points = new List<LocationReference>();
|
public List<LocationReference> Points = new List<LocationReference>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -39,9 +59,41 @@ namespace Nibriboard.RippleSpace
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public DrawnLine()
|
public DrawnLine() : this(Guid.NewGuid())
|
||||||
{
|
{
|
||||||
|
}
|
||||||
|
protected DrawnLine(Guid inLineId)
|
||||||
|
{
|
||||||
|
LineId = inLineId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DrawnLine> SplitOnChunks(int chunkSize)
|
||||||
|
{
|
||||||
|
List<DrawnLine> results = new List<DrawnLine>();
|
||||||
|
|
||||||
|
// Don't bother splitting the line up if it all falls in the same chunk
|
||||||
|
if (!SpansMultipleChunks)
|
||||||
|
{
|
||||||
|
results.Add(this);
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawnLine nextLine = new DrawnLine();
|
||||||
|
ChunkReference currentChunk = null;
|
||||||
|
foreach(LocationReference point in Points)
|
||||||
|
{
|
||||||
|
if(currentChunk != null && point.ContainingChunk != currentChunk)
|
||||||
|
{
|
||||||
|
// We're heading into a new chunk! Split the line up here.
|
||||||
|
// TODO: Add connecting lines to each DrawnLine instance to prevent gaps
|
||||||
|
results.Add(nextLine);
|
||||||
|
nextLine = new DrawnLine(LineId);
|
||||||
|
}
|
||||||
|
|
||||||
|
nextLine.Points.Add(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,5 +65,22 @@ namespace Nibriboard.RippleSpace
|
||||||
|
|
||||||
return loadedChunk;
|
return loadedChunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task AddLine(DrawnLine newLine)
|
||||||
|
{
|
||||||
|
List<DrawnLine> chunkedLine;
|
||||||
|
// Split the line up into chunked pieces if neccessary
|
||||||
|
if(newLine.SpansMultipleChunks)
|
||||||
|
chunkedLine = newLine.SplitOnChunks(ChunkSize);
|
||||||
|
else
|
||||||
|
chunkedLine = new List<DrawnLine>() { newLine };
|
||||||
|
|
||||||
|
// Add each segment to the appropriate chunk
|
||||||
|
foreach(DrawnLine newLineSegment in chunkedLine)
|
||||||
|
{
|
||||||
|
Chunk containingChunk = await FetchChunk(newLineSegment.ContainingChunk);
|
||||||
|
containingChunk.Add(newLineSegment);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue