mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-24 21:48:35 +01:00
Compare commits
2 commits
08bd443c36
...
04dc2bf2d0
Author | SHA1 | Date | |
---|---|---|---|
04dc2bf2d0 | |||
b271518956 |
3 changed files with 21 additions and 14 deletions
|
@ -13,6 +13,9 @@ Additions
|
||||||
- Added GenericFont SplitStringSeparate which differentiates between existing newline characters and splits due to maximum width
|
- Added GenericFont SplitStringSeparate which differentiates between existing newline characters and splits due to maximum width
|
||||||
- Added StaticSpriteBatch class
|
- Added StaticSpriteBatch class
|
||||||
|
|
||||||
|
Improvements
|
||||||
|
- Exposed Camera's RoundPosition
|
||||||
|
|
||||||
### MLEM.Ui
|
### MLEM.Ui
|
||||||
Additions
|
Additions
|
||||||
- Allow specifying a maximum amount of characters for a TextField
|
- Allow specifying a maximum amount of characters for a TextField
|
||||||
|
|
|
@ -58,7 +58,7 @@ namespace MLEM.Cameras {
|
||||||
get {
|
get {
|
||||||
var sc = this.ActualScale;
|
var sc = this.ActualScale;
|
||||||
var pos = -this.Position * sc;
|
var pos = -this.Position * sc;
|
||||||
if (this.roundPosition)
|
if (this.RoundPosition)
|
||||||
pos = pos.FloorCopy();
|
pos = pos.FloorCopy();
|
||||||
return Matrix.CreateScale(sc, sc, 1) * Matrix.CreateTranslation(new Vector3(pos, 0));
|
return Matrix.CreateScale(sc, sc, 1) * Matrix.CreateTranslation(new Vector3(pos, 0));
|
||||||
}
|
}
|
||||||
|
@ -82,9 +82,13 @@ namespace MLEM.Cameras {
|
||||||
/// The viewport of this camera, based on the game's <see cref="GraphicsDevice.Viewport"/> and this camera's <see cref="ActualScale"/>
|
/// The viewport of this camera, based on the game's <see cref="GraphicsDevice.Viewport"/> and this camera's <see cref="ActualScale"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Vector2 ScaledViewport => new Vector2(this.Viewport.Width, this.Viewport.Height) / this.ActualScale;
|
public Vector2 ScaledViewport => new Vector2(this.Viewport.Width, this.Viewport.Height) / this.ActualScale;
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the camera's <see cref="Position"/> should be rounded to full integers when calculating the <see cref="ViewMatrix"/>.
|
||||||
|
/// If this value is true, the occurence of rendering fragments due to floating point rounding might be reduced.
|
||||||
|
/// </summary>
|
||||||
|
public bool RoundPosition;
|
||||||
|
|
||||||
private Rectangle Viewport => this.graphicsDevice.Viewport.Bounds;
|
private Rectangle Viewport => this.graphicsDevice.Viewport.Bounds;
|
||||||
private readonly bool roundPosition;
|
|
||||||
private readonly GraphicsDevice graphicsDevice;
|
private readonly GraphicsDevice graphicsDevice;
|
||||||
private float scale = 1;
|
private float scale = 1;
|
||||||
|
|
||||||
|
@ -92,11 +96,11 @@ namespace MLEM.Cameras {
|
||||||
/// Creates a new camera.
|
/// Creates a new camera.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="graphicsDevice">The game's graphics device</param>
|
/// <param name="graphicsDevice">The game's graphics device</param>
|
||||||
/// <param name="roundPosition">If this is true, the camera's <see cref="Position"/> and related properties will be rounded to full integers.</param>
|
/// <param name="roundPosition">Whether the camera's <see cref="Position"/> should be rounded to full integers when calculating the <see cref="ViewMatrix"/></param>
|
||||||
public Camera(GraphicsDevice graphicsDevice, bool roundPosition = true) {
|
public Camera(GraphicsDevice graphicsDevice, bool roundPosition = true) {
|
||||||
this.graphicsDevice = graphicsDevice;
|
this.graphicsDevice = graphicsDevice;
|
||||||
this.AutoScaleReferenceSize = this.Viewport.Size;
|
this.AutoScaleReferenceSize = this.Viewport.Size;
|
||||||
this.roundPosition = roundPosition;
|
this.RoundPosition = roundPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -12,6 +12,10 @@ namespace MLEM.Misc {
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class StaticSpriteBatch : IDisposable {
|
public class StaticSpriteBatch : IDisposable {
|
||||||
|
|
||||||
|
// this maximum is limited by indices being a short
|
||||||
|
private const int MaxBatchItems = short.MaxValue / 6;
|
||||||
|
private static readonly VertexPositionColorTexture[] Data = new VertexPositionColorTexture[MaxBatchItems * 4];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The amount of vertices that are currently batched
|
/// The amount of vertices that are currently batched
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -63,28 +67,24 @@ namespace MLEM.Misc {
|
||||||
return;
|
return;
|
||||||
this.batchChanged = false;
|
this.batchChanged = false;
|
||||||
|
|
||||||
// this maximum is limited by indices being a short
|
|
||||||
const int maxBatchItems = short.MaxValue / 6;
|
|
||||||
|
|
||||||
// ensure we have enough vertex buffers
|
// ensure we have enough vertex buffers
|
||||||
var requiredBuffers = (this.vertices.Count / (maxBatchItems * 4F)).Ceil();
|
var requiredBuffers = (this.vertices.Count / (MaxBatchItems * 4F)).Ceil();
|
||||||
while (this.vertexBuffers.Count < requiredBuffers)
|
while (this.vertexBuffers.Count < requiredBuffers)
|
||||||
this.vertexBuffers.Add(new VertexBuffer(this.graphicsDevice, VertexPositionColorTexture.VertexDeclaration, maxBatchItems * 4, BufferUsage.WriteOnly));
|
this.vertexBuffers.Add(new VertexBuffer(this.graphicsDevice, VertexPositionColorTexture.VertexDeclaration, MaxBatchItems * 4, BufferUsage.WriteOnly));
|
||||||
|
|
||||||
// fill vertex buffers
|
// fill vertex buffers
|
||||||
var arrayIndex = 0;
|
var arrayIndex = 0;
|
||||||
var totalIndex = 0;
|
var totalIndex = 0;
|
||||||
var data = new VertexPositionColorTexture[maxBatchItems * 4];
|
|
||||||
while (totalIndex < this.vertices.Count) {
|
while (totalIndex < this.vertices.Count) {
|
||||||
var now = Math.Min(this.vertices.Count - totalIndex, data.Length);
|
var now = Math.Min(this.vertices.Count - totalIndex, Data.Length);
|
||||||
for (var i = 0; i < now; i++)
|
for (var i = 0; i < now; i++)
|
||||||
data[i] = this.vertices[totalIndex + i];
|
Data[i] = this.vertices[totalIndex + i];
|
||||||
this.vertexBuffers[arrayIndex++].SetData(data);
|
this.vertexBuffers[arrayIndex++].SetData(Data);
|
||||||
totalIndex += now;
|
totalIndex += now;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure we have enough indices
|
// ensure we have enough indices
|
||||||
var maxItems = Math.Min(this.vertices.Count / 4, maxBatchItems);
|
var maxItems = Math.Min(this.vertices.Count / 4, MaxBatchItems);
|
||||||
// each item has 2 triangles which each have 3 indices
|
// each item has 2 triangles which each have 3 indices
|
||||||
if (this.indices == null || this.indices.IndexCount < 6 * maxItems) {
|
if (this.indices == null || this.indices.IndexCount < 6 * maxItems) {
|
||||||
var newIndices = new short[6 * maxItems];
|
var newIndices = new short[6 * maxItems];
|
||||||
|
|
Loading…
Reference in a new issue