From 0ec11e20acedcb0ab6091f2e094f7d7a5a187443 Mon Sep 17 00:00:00 2001 From: Froxwin <56168224+Froxwin@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:35:29 +0530 Subject: [PATCH] Intial commit --- .envrc | 5 ++++ .gitignore | 7 +++++ flake.lock | 27 +++++++++++++++++ flake.nix | 34 +++++++++++++++++++++ meson.build | 27 +++++++++++++++++ src/main.c | 26 ++++++++++++++++ src/matrix.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/matrix.h | 24 +++++++++++++++ src/vector.h | 47 +++++++++++++++++++++++++++++ 9 files changed, 280 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 meson.build create mode 100644 src/main.c create mode 100644 src/matrix.c create mode 100644 src/matrix.h create mode 100644 src/vector.h diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..dda0f70 --- /dev/null +++ b/.envrc @@ -0,0 +1,5 @@ +if ! has nix_direnv_version || ! nix_direnv_version 3.1.0; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.1.0/direnvrc" "sha256-yMJ2OVMzrFaDPn7q8nCBZFRYpL/f0RcHzhmw/i6btJM=" +fi + +use flake diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..241b9ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.idea +*.log +tmp/ +.cache/ +build/ +.direnv/ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..7303ed2 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1772433332, + "narHash": "sha256-izhTDFKsg6KeVBxJS9EblGeQ8y+O8eCa6RcW874vxEc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "cf59864ef8aa2e178cccedbe2c178185b0365705", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..c431f09 --- /dev/null +++ b/flake.nix @@ -0,0 +1,34 @@ +{ + description = "Vektor flake"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + outputs = + { + self, + nixpkgs, + }: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { inherit system; }; + in + { + devShells.${system}.default = pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + gcc + clang-tools + lldb + + meson + ninja + pkg-config + + gtk4 + + gdb + ]; + + shellHook = ""; + }; + }; +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..70c467e --- /dev/null +++ b/meson.build @@ -0,0 +1,27 @@ +project( + 'vektor', + 'c', + version: '0.0.0', + meson_version: '>=0.63', + default_options: [ + 'c_std=c23', + 'warning_level=3', + 'buildtype=debug', + ], +) + +gtk = dependency('gtk4', required: true) + +src = files( + 'src/main.c', + 'src/matrix.c' +) + +executable( + 'vektor', + src, + dependencies: [gtk], + link_args: ['-lm'], + install: true, +) + diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..b12a6d2 --- /dev/null +++ b/src/main.c @@ -0,0 +1,26 @@ +#include "gtk/gtk.h" +#include "stdio.h" + +static void activate(GtkApplication *app, gpointer user_data) { + GtkWidget *window; + + window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW(window), "Vektor"); + gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); + + gtk_window_present(GTK_WINDOW(window)); +} + +int main(int argc, char **argv) { + printf("\x1b[1;46m IGNITION \x1b[0m\n"); + + GtkApplication *app; + int status; + + app = gtk_application_new("dev.frox.vektor", G_APPLICATION_DEFAULT_FLAGS); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + + return status; +} diff --git a/src/matrix.c b/src/matrix.c new file mode 100644 index 0000000..949bd24 --- /dev/null +++ b/src/matrix.c @@ -0,0 +1,83 @@ +#include "matrix.h" +#include + +inline M33 m33_identity(void) { + return (M33){{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}}; +} + +inline M33 m33_translate(double tx, double ty) { + return (M33){{{1, 0, tx}, {0, 1, ty}, {0, 0, 1}}}; +} + +inline M33 m33_scale(double sx, double sy) { + return (M33){{{sx, 0, 0}, {0, sy, 0}, {0, 0, 1}}}; +} + +inline M33 m33_rotate(double theta) { + return (M33){ + {{cos(theta), -sin(theta), 0}, {sin(theta), cos(theta), 0}, {0, 0, 1}}}; +} + +M33 m33_add(const M33 m1, const M33 m2) { + M33 res; + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + res.m[i][j] = m1.m[i][j] + m2.m[i][j]; + return res; +} + +M33 m33_sub(const M33 m1, const M33 m2) { + M33 res; + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + res.m[i][j] = m1.m[i][j] - m2.m[i][j]; + return res; +} + +M33 m33_mul(const M33 m1, const M33 m2) { + M33 res = {{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}}; + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + for (int k = 0; k < 3; ++k) + res.m[i][j] += m1.m[i][k] * m2.m[k][j]; + return res; +} + +M33 m33_transpose(const M33 m) { + M33 res; + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + res.m[i][j] = m.m[j][i]; + return res; +} + +// 2D affine transform inversion (not general 3x3 inversion) +M33 m33_inverse(const M33 m) { + M33 inv; + double det; + + det = m.m[0][0] * m.m[1][1] - m.m[0][1] * m.m[1][0]; + if (det == 0.0) { + return m33_identity(); + } + double invDet = 1.0 / det; + + inv.m[0][0] = m.m[1][1] * invDet; + inv.m[0][1] = -m.m[0][1] * invDet; + inv.m[1][0] = -m.m[1][0] * invDet; + inv.m[1][1] = m.m[0][0] * invDet; + + inv.m[0][2] = -(inv.m[0][0] * m.m[0][2] + inv.m[0][1] * m.m[1][2]); + inv.m[1][2] = -(inv.m[1][0] * m.m[0][2] + inv.m[1][1] * m.m[1][2]); + + inv.m[2][0] = 0; + inv.m[2][1] = 0; + inv.m[2][2] = 1; + + return inv; +} + +V2 m33_transform(const M33 mat, const V2 v) { + return (V2){mat.m[0][0] * v.x + mat.m[0][1] * v.y + mat.m[0][2], + mat.m[1][0] * v.x + mat.m[1][1] * v.y + mat.m[1][2]}; +} diff --git a/src/matrix.h b/src/matrix.h new file mode 100644 index 0000000..de372d6 --- /dev/null +++ b/src/matrix.h @@ -0,0 +1,24 @@ +#ifndef MATRIX_H_ +#define MATRIX_H_ + +#include "vector.h" + +// Row major 3x3 matricies +typedef struct { + double m[3][3]; +} M33; + +M33 m33_identity(void); +M33 m33_translate(double tx, double ty); +M33 m33_scale(double sx, double sy); +M33 m33_rotate(double rad); + +M33 m33_add(const M33 m1, const M33 m2); +M33 m33_sub(const M33 m1, const M33 m2); +M33 m33_mul(const M33 m1, const M33 m2); +M33 m33_transpose(const M33 m); +M33 m33_inverse(const M33 m); + +V2 m33_transform(const M33 mat, const V2 v); + +#endif // MATRIX_H_ diff --git a/src/vector.h b/src/vector.h new file mode 100644 index 0000000..7ab7b6b --- /dev/null +++ b/src/vector.h @@ -0,0 +1,47 @@ +#ifndef VECTOR_H_ +#define VECTOR_H_ + +#include "math.h" + +typedef struct { + double x; + double y; +} V2; + +static inline V2 vec2_add(const V2 v1, const V2 v2) { + return (V2){v1.x + v2.x, v1.y + v2.y}; +} + +static inline V2 vec2_sub(const V2 v1, const V2 v2) { + return (V2){v1.x - v2.x, v1.y - v2.y}; +} + +static inline V2 vec2_mul(const V2 v1, const V2 v2) { + return (V2){v1.x * v2.x, v1.y * v2.y}; +} + +static inline V2 vec2_scale(const V2 v, const double k) { + return (V2){v.x * k, v.y * k}; +} + +static inline double vec2_dot(const V2 v1, const V2 v2) { + return v1.x * v2.x + v1.y * v2.y; +} + +static inline double vec2_cross(const V2 a, const V2 b) { + return a.x * b.y - a.y * b.x; +} + +static inline double vec2_norm(const V2 v) { + return sqrt(v.x * v.x + v.y * v.y); +} + +static inline double vec2_quadrance(const V2 v) { + return (v.x * v.x + v.y * v.y); +} + +static inline V2 vec2_normalize(const V2 v) { + return vec2_scale(v, 1 / vec2_norm(v)); +} + +#endif // VECTOR_H_