aboutsummaryrefslogtreecommitdiff
path: root/src/sfml/system/vector.zig
diff options
context:
space:
mode:
authortslil clingman <>2021-09-01 12:59:50 -0400
committertslil clingman <>2021-09-01 12:59:50 -0400
commit6a2d132873ce7b40405a3dc000a12539fffd969b (patch)
tree3b730360b348900fbc937bd44b89c293c39ca00c /src/sfml/system/vector.zig
Init
Diffstat (limited to 'src/sfml/system/vector.zig')
-rw-r--r--src/sfml/system/vector.zig104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/sfml/system/vector.zig b/src/sfml/system/vector.zig
new file mode 100644
index 0000000..7e3e500
--- /dev/null
+++ b/src/sfml/system/vector.zig
@@ -0,0 +1,104 @@
+//! Utility struct for manipulating 2-dimensional vectors.
+
+const sf = @import("../sfml_import.zig");
+
+pub fn Vector2(comptime T: type) type {
+ return packed struct {
+ const Self = @This();
+
+ /// The CSFML vector type equivalent
+ const CsfmlEquivalent = switch (T) {
+ c_uint => sf.c.sfVector2u,
+ c_int => sf.c.sfVector2i,
+ f32 => sf.c.sfVector2f,
+ else => void,
+ };
+
+ /// Makes a CSFML vector with this vector (only if the corresponding type exists)
+ /// This is mainly for the inner workings of this wrapper
+ pub fn toCSFML(self: Self) CsfmlEquivalent {
+ if (CsfmlEquivalent == void) @compileError("This vector type doesn't have a CSFML equivalent.");
+ return @bitCast(CsfmlEquivalent, self);
+ }
+
+ /// Creates a vector from a CSFML one (only if the corresponding type exists)
+ /// This is mainly for the inner workings of this wrapper
+ pub fn fromCSFML(vec: CsfmlEquivalent) Self {
+ if (CsfmlEquivalent == void) @compileError("This vector type doesn't have a CSFML equivalent.");
+ return @bitCast(Self, vec);
+ }
+
+ /// Adds two vectors
+ pub fn add(self: Self, other: Self) Self {
+ return Self{ .x = self.x + other.x, .y = self.y + other.y };
+ }
+
+ /// Substracts two vectors
+ pub fn substract(self: Self, other: Self) Self {
+ return Self{ .x = self.x - other.x, .y = self.y - other.y };
+ }
+
+ /// Scales a vector
+ pub fn scale(self: Self, scalar: T) Self {
+ return Self{ .x = self.x * scalar, .y = self.y * scalar };
+ }
+
+ /// x component of the vector
+ x: T,
+ /// y component of the vector
+ y: T
+ };
+}
+
+pub const Vector3f = struct {
+ const Self = @This();
+
+ /// Makes a CSFML vector with this vector (only if the corresponding type exists)
+ /// This is mainly for the inner workings of this wrapper
+ pub fn toCSFML(self: Self) sf.c.sfVector3f {
+ return @bitCast(sf.c.sfVector3f, self);
+ }
+
+ /// Creates a vector from a CSFML one (only if the corresponding type exists)
+ /// This is mainly for the inner workings of this wrapper
+ pub fn fromCSFML(vec: sf.c.sfVector3f) Self {
+ return @bitCast(Self, vec);
+ }
+
+ /// x component of the vector
+ x: f32,
+ /// y component of the vector
+ y: f32,
+ /// z component of the vector
+ z: f32,
+};
+
+test "vector: sane from/to CSFML vectors" {
+ const tst = @import("std").testing;
+
+ inline for ([_]type{ c_int, c_uint, f32 }) |T| {
+ const VecT = Vector2(T);
+ const vec = VecT{ .x = 1, .y = 3 };
+ const cvec = vec.toCSFML();
+
+ try tst.expectEqual(vec.x, cvec.x);
+ try tst.expectEqual(vec.y, cvec.y);
+
+ const vec2 = VecT.fromCSFML(cvec);
+
+ try tst.expectEqual(vec, vec2);
+ }
+
+ {
+ const vec = Vector3f{ .x = 1, .y = 3.5, .z = -12 };
+ const cvec = vec.toCSFML();
+
+ try tst.expectEqual(vec.x, cvec.x);
+ try tst.expectEqual(vec.y, cvec.y);
+ try tst.expectEqual(vec.z, cvec.z);
+
+ const vec2 = Vector3f.fromCSFML(cvec);
+
+ try tst.expectEqual(vec, vec2);
+ }
+}