Browse Source

basic matrix vector lib

Kajetan Johannes Hammerle 4 years ago
parent
commit
9d95e75d5a

+ 10 - 0
src/me/hammerle/snuviscript/code/FunctionRegistry.java

@@ -130,6 +130,16 @@ public class FunctionRegistry {
         });
         registerFunction("math.min", (sc, in) -> Math.min(in[0].getDouble(sc), in[1].getDouble(sc)));
         registerFunction("math.max", (sc, in) -> Math.max(in[0].getDouble(sc), in[1].getDouble(sc)));
+        registerFunction("matrix.new", (sc, in) -> new Matrix());
+        registerFunction("matrix.newrotationy", (sc, in) -> Matrix.getRotationY(in[0].getDouble(sc)));
+        registerFunction("matrix.newrotationx", (sc, in) -> Matrix.getRotationX(in[0].getDouble(sc)));
+        registerFunction("matrix.mul", (sc, in) -> ((Matrix) in[0].get(sc)).mul((Matrix) in[1].get(sc)));
+        registerConsumer("matrix.mulvector", (sc, in) -> ((Matrix) in[0].get(sc)).mul((Vector) in[1].get(sc)));
+        registerFunction("vector.new", (sc, in) -> new Vector(in[0].getDouble(sc), in[1].getDouble(sc), in[2].getDouble(sc)));
+        registerConsumer("vector.set", (sc, in) -> ((Vector) in[0].get(sc)).set(in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc)));
+        registerFunction("vector.getx", (sc, in) -> ((Vector) in[0].get(sc)).getX());
+        registerFunction("vector.gety", (sc, in) -> ((Vector) in[0].get(sc)).getY());
+        registerFunction("vector.getz", (sc, in) -> ((Vector) in[0].get(sc)).getZ());
         registerFunction("list.new", (sc, in) -> {
             if(in.length == 0) {
                 return new ArrayList<>();

+ 83 - 0
src/me/hammerle/snuviscript/code/Matrix.java

@@ -0,0 +1,83 @@
+package me.hammerle.snuviscript.code;
+
+public final class Matrix {
+    private final double[] data;
+
+    private Matrix(double[] data) {
+        this.data = data;
+    }
+
+    public Matrix() {
+        data = new double[9];
+        setIdentity();
+    }
+
+    public static Matrix getRotationY(double angle) {
+        double[] a = new double[9];
+        a[0] = Math.cos(angle);
+        a[1] = 0.0;
+        a[2] = -Math.sin(angle);
+        a[3] = 0.0;
+        a[4] = 1.0;
+        a[5] = 0.0;
+        a[6] = -a[2];
+        a[7] = 0.0;
+        a[8] = a[0];
+        return new Matrix(a);
+    }
+    
+    public static Matrix getRotationX(double angle) {
+        double[] a = new double[9];
+        a[0] = 1.0;
+        a[1] = 0.0;
+        a[2] = 0.0;
+        a[3] = 0.0;
+        a[4] = Math.cos(angle);
+        a[5] = -Math.sin(angle);
+        a[6] = 0.0;
+        a[7] = -a[5];
+        a[8] = a[4];
+        return new Matrix(a);
+    }
+
+    public void setIdentity() {
+        data[0] = 1;
+        data[1] = 0;
+        data[2] = 0;
+        data[3] = 0;
+        data[4] = 1;
+        data[5] = 0;
+        data[6] = 0;
+        data[7] = 0;
+        data[8] = 1;
+    }
+
+    public void mul(Vector v) {
+        double x = v.getX();
+        double y = v.getY();
+        double z = v.getZ();
+        v.set(data[0] * x + data[3] * y + data[6] * z,
+                data[1] * x + data[4] * y + data[7] * z,
+                data[2] * x + data[5] * y + data[8] * z);
+    }
+
+    public Matrix mul(Matrix m) {
+        double[] a = new double[9];
+        a[0] = data[0] * m.data[0] + data[3] * m.data[1] + data[6] * m.data[2];
+        a[1] = data[1] * m.data[0] + data[4] * m.data[1] + data[7] * m.data[2];
+        a[2] = data[2] * m.data[0] + data[5] * m.data[1] + data[8] * m.data[2];
+        a[3] = data[0] * m.data[3] + data[3] * m.data[4] + data[6] * m.data[5];
+        a[4] = data[1] * m.data[3] + data[4] * m.data[4] + data[7] * m.data[5];
+        a[5] = data[2] * m.data[3] + data[5] * m.data[4] + data[8] * m.data[5];
+        a[6] = data[0] * m.data[6] + data[3] * m.data[7] + data[6] * m.data[8];
+        a[7] = data[1] * m.data[6] + data[4] * m.data[7] + data[7] * m.data[8];
+        a[8] = data[2] * m.data[6] + data[5] * m.data[7] + data[8] * m.data[8];
+        return new Matrix(a);
+    }
+
+    @Override
+    public String toString() {
+        return String.format("[%.3f %.3f %.3f, %.3f %.3f %.3f, %.3f %.3f %.3f]", 
+                data[0], data[3], data[6], data[1], data[4], data[7], data[2], data[5], data[8]);
+    }
+}

+ 29 - 0
src/me/hammerle/snuviscript/code/Vector.java

@@ -0,0 +1,29 @@
+package me.hammerle.snuviscript.code;
+
+public final class Vector {
+    private double x;
+    private double y;
+    private double z;
+
+    public Vector(double x, double y, double z) {
+        set(x, y, z);
+    }
+
+    public void set(double x, double y, double z) {
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+
+    public double getX() {
+        return x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public double getZ() {
+        return z;
+    }
+}