Vector.Transform. Batcher Matrix Stack. Image component

This commit is contained in:
Maddy Thorson 2021-02-08 22:36:48 -08:00
parent ccf4db2f9f
commit 9f1f04358b
4 changed files with 189 additions and 48 deletions

View File

@ -0,0 +1,26 @@
namespace Strawberry
{
public class Image : Component, IDraw
{
public Texture Texture;
public Point Offset;
public Point Origin;
public float Rotation;
public Vector Scale = .One;
public this(Texture texture, Point origin = .Zero, Point offset = .Zero)
{
Texture = texture;
Origin = origin;
Offset = offset;
}
public Point DrawPosition => Entity.Position + Offset - Origin;
public void Draw()
{
if (Texture != null)
Game.Batcher.Tex(Texture, DrawPosition);
}
}
}

View File

@ -1,4 +1,5 @@
using System.Collections; using System.Collections;
using System.Diagnostics;
namespace Strawberry namespace Strawberry
{ {
@ -7,8 +8,9 @@ namespace Strawberry
protected List<Batch> batches = new .() ~ delete _; protected List<Batch> batches = new .() ~ delete _;
protected List<Vertex> vertices = new .() ~ delete _; protected List<Vertex> vertices = new .() ~ delete _;
protected List<uint32> indices = new .() ~ delete _; protected List<uint32> indices = new .() ~ delete _;
private List<Mat4x4> matrixStack = new .(20) ~ delete _;
public Mat4x4 Matrix; public Mat4x4 Matrix => matrixStack.Back;
public this() public this()
{ {
@ -17,12 +19,30 @@ namespace Strawberry
public void Reset() public void Reset()
{ {
Matrix = Game.PlatformLayer.ScreenMatrix; ClearMatrix();
batches.Clear(); batches.Clear();
vertices.Clear(); vertices.Clear();
indices.Clear(); indices.Clear();
} }
public void ClearMatrix()
{
matrixStack.Clear();
matrixStack.Add(Game.PlatformLayer.ScreenMatrix);
}
public void PushMatrix(Mat4x4 mat)
{
matrixStack.Add(mat * matrixStack.Back);
}
public void PopMatrix()
{
Debug.Assert(matrixStack.Count > 0, "Cannot pop the Matrix Stack when it is empty");
matrixStack.PopBack();
}
public abstract void Draw(); public abstract void Draw();
protected ref Batch GetBatch(BatchModes mode, Texture texture) protected ref Batch GetBatch(BatchModes mode, Texture texture)
@ -71,13 +91,23 @@ namespace Strawberry
.Shape(d, color)); .Shape(d, color));
} }
public void Tex(Texture texture, float x, float y) public void Tex(Texture texture, Vector pos)
{ {
PushQuad(.TextureTint, texture, PushQuad(.TextureTint, texture,
.Tex(.(x, y), .(0, 0), Color.White), .Tex(.(pos.X, pos.Y), .(0, 0), Color.White),
.Tex(.(x + texture.Width, y), .(1, 0), Color.White), .Tex(.(pos.X + texture.Width, pos.Y), .(1, 0), Color.White),
.Tex(.(x + texture.Width, y + texture.Height), .(1, 1), Color.White), .Tex(.(pos.X + texture.Width, pos.Y + texture.Height), .(1, 1), Color.White),
.Tex(.(x, y + texture.Height), .(0, 1), Color.White)); .Tex(.(pos.X, pos.Y + texture.Height), .(0, 1), Color.White));
}
public void Tex(Texture texture, Vector pos, Vector origin, Vector scale, float rotation)
{
//TODO!
PushQuad(.TextureTint, texture,
.Tex(.(pos.X, pos.Y), .(0, 0), Color.White),
.Tex(.(pos.X + texture.Width, pos.Y), .(1, 0), Color.White),
.Tex(.(pos.X + texture.Width, pos.Y + texture.Height), .(1, 1), Color.White),
.Tex(.(pos.X, pos.Y + texture.Height), .(0, 1), Color.White));
} }
} }
} }

View File

@ -33,19 +33,25 @@ namespace Strawberry
} }
[Inline]
public Point Perpendicular() public Point Perpendicular()
{ {
return .(-Y, X); return .(-Y, X);
} }
[Inline]
public float Length => Math.Sqrt(LengthSquared); public float Length => Math.Sqrt(LengthSquared);
[Inline]
public int LengthSquared => X * X + Y * Y; public int LengthSquared => X * X + Y * Y;
[Inline]
public Vector Normalized() public Vector Normalized()
{ {
return ((Vector)this).Normalized(); return ((Vector)this).Normalized();
} }
[Inline]
public override void ToString(String strBuffer) public override void ToString(String strBuffer)
{ {
strBuffer.Set("Point [ "); strBuffer.Set("Point [ ");
@ -55,56 +61,73 @@ namespace Strawberry
strBuffer.Append(" ]"); strBuffer.Append(" ]");
} }
[Inline]
static public explicit operator Point(Vector a) static public explicit operator Point(Vector a)
{ {
return Point((int)a.X, (int)a.Y); return Point((int)a.X, (int)a.Y);
} }
[Inline]
static public implicit operator SDL2.SDL.Point(Point a) static public implicit operator SDL2.SDL.Point(Point a)
{ {
return .((int32)a.X, (int32)a.Y); return .((int32)a.X, (int32)a.Y);
} }
[Inline]
static public bool operator==(Point a, Point b) static public bool operator==(Point a, Point b)
{ {
return a.X == b.X && a.Y == b.Y; return a.X == b.X && a.Y == b.Y;
} }
[Inline]
static public Point operator+(Point a, Point b) static public Point operator+(Point a, Point b)
{ {
return Point(a.X + b.X, a.Y + b.Y); return Point(a.X + b.X, a.Y + b.Y);
} }
[Inline]
static public Point operator-(Point a, Point b) static public Point operator-(Point a, Point b)
{ {
return Point(a.X - b.X, a.Y - b.Y); return Point(a.X - b.X, a.Y - b.Y);
} }
[Inline, Commutable]
static public Point operator*(Point a, int b) static public Point operator*(Point a, int b)
{ {
return Point(a.X * b, a.Y * b); return Point(a.X * b, a.Y * b);
} }
[Inline]
static public Point operator*(Point a, Point b) static public Point operator*(Point a, Point b)
{ {
return Point(a.X * b.X, a.Y * b.Y); return Point(a.X * b.X, a.Y * b.Y);
} }
[Inline]
static public Point operator/(Point a, int b) static public Point operator/(Point a, int b)
{ {
return Point(a.X / b, a.Y / b); return Point(a.X / b, a.Y / b);
} }
[Inline]
static public Point operator/(Point a, Point b) static public Point operator/(Point a, Point b)
{ {
return Point(a.X / b.X, a.Y / b.Y); return Point(a.X / b.X, a.Y / b.Y);
} }
[Inline, Commutable]
static public Point operator*(Point a, Facings f) static public Point operator*(Point a, Facings f)
{ {
return .(a.X * (int)f, a.Y); return .(a.X * (int)f, a.Y);
} }
[Inline]
static public Point operator-(Point p)
{
return .(-p.X, -p.Y);
}
[Inline]
public int GetHashCode() public int GetHashCode()
{ {
return X + 9973 * Y; return X + 9973 * Y;

View File

@ -28,11 +28,13 @@ namespace Strawberry
Y = y; Y = y;
} }
[Inline]
public Vector Perpendicular() public Vector Perpendicular()
{ {
return .(-Y, X); return .(-Y, X);
} }
[Inline]
public Vector Normalized() public Vector Normalized()
{ {
if (X == 0 && Y == 0) if (X == 0 && Y == 0)
@ -41,15 +43,31 @@ namespace Strawberry
return this / Length; return this / Length;
} }
[Inline]
public float Length => Math.Sqrt(LengthSquared); public float Length => Math.Sqrt(LengthSquared);
[Inline]
public float LengthSquared => X * X + Y * Y; public float LengthSquared => X * X + Y * Y;
[Inline] [Inline]
public Point Round() public Point Round()
{ {
return Point((int)Math.Round(X), (int)Math.Round(Y)); return .((int)Math.Round(X), (int)Math.Round(Y));
} }
[Inline]
public Vector Transform(Mat3x2 mat)
{
return Transform(this, mat);
}
[Inline]
public Vector Transform(Mat4x4 mat)
{
return Transform(this, mat);
}
[Inline]
static public Vector Lerp(Vector a, Vector b, float t) static public Vector Lerp(Vector a, Vector b, float t)
{ {
if (t == 0) if (t == 0)
@ -60,46 +78,7 @@ namespace Strawberry
return a + (b - a) * t; return a + (b - a) * t;
} }
public override void ToString(String strBuffer) [Inline]
{
strBuffer.Set("Vector [ ");
X.ToString(strBuffer);
strBuffer.Append(", ");
Y.ToString(strBuffer);
strBuffer.Append(" ]");
}
static public operator Vector(Point a)
{
return Vector(a.X, a.Y);
}
[Commutable]
static public bool operator==(Vector a, Vector b)
{
return a.X == b.X && a.Y == b.Y;
}
static public Vector operator+(Vector a, Vector b)
{
return Vector(a.X + b.X, a.Y + b.Y);
}
static public Vector operator-(Vector a, Vector b)
{
return Vector(a.X - b.X, a.Y - b.Y);
}
static public Vector operator*(Vector a, float b)
{
return Vector(a.X * b, a.Y * b);
}
static public Vector operator/(Vector a, float b)
{
return Vector(a.X / b, a.Y / b);
}
static public Vector Approach(Vector value, Vector target, float maxDelta) static public Vector Approach(Vector value, Vector target, float maxDelta)
{ {
Vector diff = target - value; Vector diff = target - value;
@ -109,9 +88,92 @@ namespace Strawberry
return value + diff.Normalized() * maxDelta; return value + diff.Normalized() * maxDelta;
} }
[Inline]
static public void Approach(Vector* value, Vector target, float maxDelta) static public void Approach(Vector* value, Vector target, float maxDelta)
{ {
*value = Approach(*value, target, maxDelta); *value = Approach(*value, target, maxDelta);
} }
[Inline]
public static Vector Transform(Vector v, Mat3x2 matrix)
{
return .(
v.X * matrix.M11 + v.Y * matrix.M21 + matrix.M31,
v.X * matrix.M12 + v.Y * matrix.M22 + matrix.M32
);
}
[Inline]
public static Vector Transform(Vector v, Mat4x4 matrix)
{
return .(
v.X * matrix.M11 + v.Y * matrix.M21 + matrix.M41,
v.X * matrix.M12 + v.Y * matrix.M22 + matrix.M42
);
}
[Inline]
public override void ToString(String strBuffer)
{
strBuffer.Set("Vector [ ");
X.ToString(strBuffer);
strBuffer.Append(", ");
Y.ToString(strBuffer);
strBuffer.Append(" ]");
}
[Inline]
static public operator Vector(Point a)
{
return .(a.X, a.Y);
}
[Inline]
static public bool operator==(Vector a, Vector b)
{
return a.X == b.X && a.Y == b.Y;
}
[Inline]
static public Vector operator+(Vector a, Vector b)
{
return .(a.X + b.X, a.Y + b.Y);
}
[Inline]
static public Vector operator-(Vector a, Vector b)
{
return .(a.X - b.X, a.Y - b.Y);
}
[Inline, Commutable]
static public Vector operator*(Vector a, float b)
{
return .(a.X * b, a.Y * b);
}
[Inline]
static public Vector operator/(Vector a, float b)
{
return .(a.X / b, a.Y / b);
}
[Inline]
static public Vector operator*(Vector a, Mat3x2 b)
{
return Transform(a, b);
}
[Inline]
static public Vector operator*(Vector a, Mat4x4 b)
{
return Transform(a, b);
}
[Inline]
static public Vector operator-(Vector v)
{
return .(-v.X, -v.Y);
}
} }
} }