blob: 086d148348c0dbdd5168d169e8ac8ec8119a4055 [file] [log] [blame]
/*
VectorMath.dart
Copyright (C) 2012 John McCutchan <john@johnmccutchan.com>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
class vec3 {
num x;
num y;
num z;
/// Constructs a new [vec3]. Follows GLSL constructor syntax so many combinations are possible
vec3([Dynamic x_, Dynamic y_, Dynamic z_]) {
x = y = z = 0.0;
if (x_ is vec2 && y_ is num) {
this.xy = x_.xy;
this.z = y_;
}
if (x_ is num && y_ is vec2) {
this.x = x_;
this.yz = y_.xy;
}
if (x_ is vec2 && y_ == null) {
this.xy = x_.xy;
this.z = 0;
}
if (x_ is vec3) {
xyz = x_.xyz;
return;
}
if (x_ is num && y_ is num && z_ is num) {
x = x_;
y = y_;
z = z_;
return;
}
if (x_ is num) {
x = y = z = x_;
return;
}
}
/// Constructs a new [vec3] filled with 0.
vec3.zero() {
x = 0.0;
y = 0.0;
z = 0.0;
}
/// Constructs a new [vec3] that is a copy of [other].
vec3.copy(vec3 other) {
x = other.x;
y = other.y;
z = other.z;
}
/// Constructs a new [vec3] that is initialized with passed in values.
vec3.raw(num x_, num y_, num z_) {
x = x_;
y = y_;
z = z_;
}
/// Constructs a new [vec3] that is initialized with values from [array] starting at [offset].
vec3.array(Float32Array array, [int offset=0]) {
int i = offset;
x = array[i];
i++;
y = array[i];
i++;
z = array[i];
i++;
}
/// Splats a scalar into all lanes of the vector.
vec3 splat(num arg) {
x = arg;
y = arg;
z = arg;
return this;
}
/// Returns a printable string
String toString() => '$x,$y,$z';
/// Returns a new vec3 from -this
vec3 operator negate() => new vec3(-x, -y, -z);
/// Returns a new vec3 from this - [other]
vec3 operator-(vec3 other) => new vec3(x - other.x, y - other.y, z - other.z);
/// Returns a new vec3 from this + [other]
vec3 operator+(vec3 other) => new vec3(x + other.x, y + other.y, z + other.z);
/// Returns a new vec3 divided by [other]
vec3 operator/(Dynamic other) {
if (other is num) {
return new vec3(x / other, y / other, z / other);
}
if (other is vec3) {
return new vec3(x / other.x, y / other.y, z / other.z);
}
}
/// Returns a new vec3 scaled by [other]
vec3 operator*(Dynamic other) {
if (other is num) {
return new vec3(x * other, y * other, z * other);
}
if (other is vec3) {
return new vec3(x * other.x, y * other.y, z * other.z);
}
}
/// Returns a component from vec3. This is indexed as an array with [i]
num operator[](int i) {
assert(i >= 0 && i < 3);
switch (i) {
case 0: return x;
case 1: return y;
case 2: return z;
};
return 0.0;
}
/// Assigns a component in vec3 the value in [v]. This is indexed as an array with [i]
void operator[]=(int i, num v) {
assert(i >= 0 && i < 3);
switch (i) {
case 0: x = v; break;
case 1: y = v; break;
case 2: z = v; break;
};
}
/// Returns length of this
num get length() {
num sum = 0.0;
sum += (x * x);
sum += (y * y);
sum += (z * z);
return Math.sqrt(sum);
}
/// Returns squared length of this
num get length2() {
num sum = 0.0;
sum += (x * x);
sum += (y * y);
sum += (z * z);
return sum;
}
/// Normalizes this
void normalize() {
num l = length;
if (l == 0.0) {
return;
}
x /= l;
y /= l;
z /= l;
}
/// Returns the dot product of [this] and [other]
num dot(vec3 other) {
num sum = 0.0;
sum += (x * other.x);
sum += (y * other.y);
sum += (z * other.z);
return sum;
}
/// Returns the cross product of [this] and [other]
vec3 cross(vec3 other) {
return new vec3.raw(y * other.z - z * other.y, z * other.x - x * other.z, x * other.y - y * other.x);
}
/// Returns the relative error between [this] and [correct]
num relativeError(vec3 correct) {
num this_norm = length;
num correct_norm = correct.length;
num diff_norm = (this_norm - correct_norm).abs();
return diff_norm/correct_norm;
}
/// Returns the absolute error between [this] and [correct]
num absoluteError(vec3 correct) {
num this_norm = length;
num correct_norm = correct.length;
num diff_norm = (this_norm - correct_norm).abs();
return diff_norm;
}
set xy(vec2 arg) {
x = arg.x;
y = arg.y;
}
set xz(vec2 arg) {
x = arg.x;
z = arg.y;
}
set yx(vec2 arg) {
y = arg.x;
x = arg.y;
}
set yz(vec2 arg) {
y = arg.x;
z = arg.y;
}
set zx(vec2 arg) {
z = arg.x;
x = arg.y;
}
set zy(vec2 arg) {
z = arg.x;
y = arg.y;
}
set xyz(vec3 arg) {
x = arg.x;
y = arg.y;
z = arg.z;
}
set xzy(vec3 arg) {
x = arg.x;
z = arg.y;
y = arg.z;
}
set yxz(vec3 arg) {
y = arg.x;
x = arg.y;
z = arg.z;
}
set yzx(vec3 arg) {
y = arg.x;
z = arg.y;
x = arg.z;
}
set zxy(vec3 arg) {
z = arg.x;
x = arg.y;
y = arg.z;
}
set zyx(vec3 arg) {
z = arg.x;
y = arg.y;
x = arg.z;
}
/// Returns true if any component is infinite.
bool isInfinite() {
bool is_infinite = false;
is_infinite = is_infinite || x.isInfinite();
is_infinite = is_infinite || y.isInfinite();
is_infinite = is_infinite || z.isInfinite();
return is_infinite;
}
/// Returns true if any component is NaN.
bool isNaN() {
bool is_nan = false;
is_nan = is_nan || x.isNaN();
is_nan = is_nan || y.isNaN();
is_nan = is_nan || z.isNaN();
return is_nan;
}
set r(num arg) => x = arg;
set g(num arg) => y = arg;
set b(num arg) => z = arg;
set s(num arg) => x = arg;
set t(num arg) => y = arg;
set p(num arg) => z = arg;
set rg(vec2 arg) {
r = arg.r;
g = arg.g;
}
set rb(vec2 arg) {
r = arg.r;
b = arg.g;
}
set gr(vec2 arg) {
g = arg.r;
r = arg.g;
}
set gb(vec2 arg) {
g = arg.r;
b = arg.g;
}
set br(vec2 arg) {
b = arg.r;
r = arg.g;
}
set bg(vec2 arg) {
b = arg.r;
g = arg.g;
}
set rgb(vec3 arg) {
r = arg.r;
g = arg.g;
b = arg.b;
}
set rbg(vec3 arg) {
r = arg.r;
b = arg.g;
g = arg.b;
}
set grb(vec3 arg) {
g = arg.r;
r = arg.g;
b = arg.b;
}
set gbr(vec3 arg) {
g = arg.r;
b = arg.g;
r = arg.b;
}
set brg(vec3 arg) {
b = arg.r;
r = arg.g;
g = arg.b;
}
set bgr(vec3 arg) {
b = arg.r;
g = arg.g;
r = arg.b;
}
set st(vec2 arg) {
s = arg.s;
t = arg.t;
}
set sp(vec2 arg) {
s = arg.s;
p = arg.t;
}
set ts(vec2 arg) {
t = arg.s;
s = arg.t;
}
set tp(vec2 arg) {
t = arg.s;
p = arg.t;
}
set ps(vec2 arg) {
p = arg.s;
s = arg.t;
}
set pt(vec2 arg) {
p = arg.s;
t = arg.t;
}
set stp(vec3 arg) {
s = arg.s;
t = arg.t;
p = arg.p;
}
set spt(vec3 arg) {
s = arg.s;
p = arg.t;
t = arg.p;
}
set tsp(vec3 arg) {
t = arg.s;
s = arg.t;
p = arg.p;
}
set tps(vec3 arg) {
t = arg.s;
p = arg.t;
s = arg.p;
}
set pst(vec3 arg) {
p = arg.s;
s = arg.t;
t = arg.p;
}
set pts(vec3 arg) {
p = arg.s;
t = arg.t;
s = arg.p;
}
vec2 get xx() => new vec2(x, x);
vec2 get xy() => new vec2(x, y);
vec2 get xz() => new vec2(x, z);
vec2 get yx() => new vec2(y, x);
vec2 get yy() => new vec2(y, y);
vec2 get yz() => new vec2(y, z);
vec2 get zx() => new vec2(z, x);
vec2 get zy() => new vec2(z, y);
vec2 get zz() => new vec2(z, z);
vec3 get xxx() => new vec3(x, x, x);
vec3 get xxy() => new vec3(x, x, y);
vec3 get xxz() => new vec3(x, x, z);
vec3 get xyx() => new vec3(x, y, x);
vec3 get xyy() => new vec3(x, y, y);
vec3 get xyz() => new vec3(x, y, z);
vec3 get xzx() => new vec3(x, z, x);
vec3 get xzy() => new vec3(x, z, y);
vec3 get xzz() => new vec3(x, z, z);
vec3 get yxx() => new vec3(y, x, x);
vec3 get yxy() => new vec3(y, x, y);
vec3 get yxz() => new vec3(y, x, z);
vec3 get yyx() => new vec3(y, y, x);
vec3 get yyy() => new vec3(y, y, y);
vec3 get yyz() => new vec3(y, y, z);
vec3 get yzx() => new vec3(y, z, x);
vec3 get yzy() => new vec3(y, z, y);
vec3 get yzz() => new vec3(y, z, z);
vec3 get zxx() => new vec3(z, x, x);
vec3 get zxy() => new vec3(z, x, y);
vec3 get zxz() => new vec3(z, x, z);
vec3 get zyx() => new vec3(z, y, x);
vec3 get zyy() => new vec3(z, y, y);
vec3 get zyz() => new vec3(z, y, z);
vec3 get zzx() => new vec3(z, z, x);
vec3 get zzy() => new vec3(z, z, y);
vec3 get zzz() => new vec3(z, z, z);
vec4 get xxxx() => new vec4(x, x, x, x);
vec4 get xxxy() => new vec4(x, x, x, y);
vec4 get xxxz() => new vec4(x, x, x, z);
vec4 get xxyx() => new vec4(x, x, y, x);
vec4 get xxyy() => new vec4(x, x, y, y);
vec4 get xxyz() => new vec4(x, x, y, z);
vec4 get xxzx() => new vec4(x, x, z, x);
vec4 get xxzy() => new vec4(x, x, z, y);
vec4 get xxzz() => new vec4(x, x, z, z);
vec4 get xyxx() => new vec4(x, y, x, x);
vec4 get xyxy() => new vec4(x, y, x, y);
vec4 get xyxz() => new vec4(x, y, x, z);
vec4 get xyyx() => new vec4(x, y, y, x);
vec4 get xyyy() => new vec4(x, y, y, y);
vec4 get xyyz() => new vec4(x, y, y, z);
vec4 get xyzx() => new vec4(x, y, z, x);
vec4 get xyzy() => new vec4(x, y, z, y);
vec4 get xyzz() => new vec4(x, y, z, z);
vec4 get xzxx() => new vec4(x, z, x, x);
vec4 get xzxy() => new vec4(x, z, x, y);
vec4 get xzxz() => new vec4(x, z, x, z);
vec4 get xzyx() => new vec4(x, z, y, x);
vec4 get xzyy() => new vec4(x, z, y, y);
vec4 get xzyz() => new vec4(x, z, y, z);
vec4 get xzzx() => new vec4(x, z, z, x);
vec4 get xzzy() => new vec4(x, z, z, y);
vec4 get xzzz() => new vec4(x, z, z, z);
vec4 get yxxx() => new vec4(y, x, x, x);
vec4 get yxxy() => new vec4(y, x, x, y);
vec4 get yxxz() => new vec4(y, x, x, z);
vec4 get yxyx() => new vec4(y, x, y, x);
vec4 get yxyy() => new vec4(y, x, y, y);
vec4 get yxyz() => new vec4(y, x, y, z);
vec4 get yxzx() => new vec4(y, x, z, x);
vec4 get yxzy() => new vec4(y, x, z, y);
vec4 get yxzz() => new vec4(y, x, z, z);
vec4 get yyxx() => new vec4(y, y, x, x);
vec4 get yyxy() => new vec4(y, y, x, y);
vec4 get yyxz() => new vec4(y, y, x, z);
vec4 get yyyx() => new vec4(y, y, y, x);
vec4 get yyyy() => new vec4(y, y, y, y);
vec4 get yyyz() => new vec4(y, y, y, z);
vec4 get yyzx() => new vec4(y, y, z, x);
vec4 get yyzy() => new vec4(y, y, z, y);
vec4 get yyzz() => new vec4(y, y, z, z);
vec4 get yzxx() => new vec4(y, z, x, x);
vec4 get yzxy() => new vec4(y, z, x, y);
vec4 get yzxz() => new vec4(y, z, x, z);
vec4 get yzyx() => new vec4(y, z, y, x);
vec4 get yzyy() => new vec4(y, z, y, y);
vec4 get yzyz() => new vec4(y, z, y, z);
vec4 get yzzx() => new vec4(y, z, z, x);
vec4 get yzzy() => new vec4(y, z, z, y);
vec4 get yzzz() => new vec4(y, z, z, z);
vec4 get zxxx() => new vec4(z, x, x, x);
vec4 get zxxy() => new vec4(z, x, x, y);
vec4 get zxxz() => new vec4(z, x, x, z);
vec4 get zxyx() => new vec4(z, x, y, x);
vec4 get zxyy() => new vec4(z, x, y, y);
vec4 get zxyz() => new vec4(z, x, y, z);
vec4 get zxzx() => new vec4(z, x, z, x);
vec4 get zxzy() => new vec4(z, x, z, y);
vec4 get zxzz() => new vec4(z, x, z, z);
vec4 get zyxx() => new vec4(z, y, x, x);
vec4 get zyxy() => new vec4(z, y, x, y);
vec4 get zyxz() => new vec4(z, y, x, z);
vec4 get zyyx() => new vec4(z, y, y, x);
vec4 get zyyy() => new vec4(z, y, y, y);
vec4 get zyyz() => new vec4(z, y, y, z);
vec4 get zyzx() => new vec4(z, y, z, x);
vec4 get zyzy() => new vec4(z, y, z, y);
vec4 get zyzz() => new vec4(z, y, z, z);
vec4 get zzxx() => new vec4(z, z, x, x);
vec4 get zzxy() => new vec4(z, z, x, y);
vec4 get zzxz() => new vec4(z, z, x, z);
vec4 get zzyx() => new vec4(z, z, y, x);
vec4 get zzyy() => new vec4(z, z, y, y);
vec4 get zzyz() => new vec4(z, z, y, z);
vec4 get zzzx() => new vec4(z, z, z, x);
vec4 get zzzy() => new vec4(z, z, z, y);
vec4 get zzzz() => new vec4(z, z, z, z);
num get r() => x;
num get g() => y;
num get b() => z;
num get s() => x;
num get t() => y;
num get p() => z;
vec2 get rr() => new vec2(r, r);
vec2 get rg() => new vec2(r, g);
vec2 get rb() => new vec2(r, b);
vec2 get gr() => new vec2(g, r);
vec2 get gg() => new vec2(g, g);
vec2 get gb() => new vec2(g, b);
vec2 get br() => new vec2(b, r);
vec2 get bg() => new vec2(b, g);
vec2 get bb() => new vec2(b, b);
vec3 get rrr() => new vec3(r, r, r);
vec3 get rrg() => new vec3(r, r, g);
vec3 get rrb() => new vec3(r, r, b);
vec3 get rgr() => new vec3(r, g, r);
vec3 get rgg() => new vec3(r, g, g);
vec3 get rgb() => new vec3(r, g, b);
vec3 get rbr() => new vec3(r, b, r);
vec3 get rbg() => new vec3(r, b, g);
vec3 get rbb() => new vec3(r, b, b);
vec3 get grr() => new vec3(g, r, r);
vec3 get grg() => new vec3(g, r, g);
vec3 get grb() => new vec3(g, r, b);
vec3 get ggr() => new vec3(g, g, r);
vec3 get ggg() => new vec3(g, g, g);
vec3 get ggb() => new vec3(g, g, b);
vec3 get gbr() => new vec3(g, b, r);
vec3 get gbg() => new vec3(g, b, g);
vec3 get gbb() => new vec3(g, b, b);
vec3 get brr() => new vec3(b, r, r);
vec3 get brg() => new vec3(b, r, g);
vec3 get brb() => new vec3(b, r, b);
vec3 get bgr() => new vec3(b, g, r);
vec3 get bgg() => new vec3(b, g, g);
vec3 get bgb() => new vec3(b, g, b);
vec3 get bbr() => new vec3(b, b, r);
vec3 get bbg() => new vec3(b, b, g);
vec3 get bbb() => new vec3(b, b, b);
vec4 get rrrr() => new vec4(r, r, r, r);
vec4 get rrrg() => new vec4(r, r, r, g);
vec4 get rrrb() => new vec4(r, r, r, b);
vec4 get rrgr() => new vec4(r, r, g, r);
vec4 get rrgg() => new vec4(r, r, g, g);
vec4 get rrgb() => new vec4(r, r, g, b);
vec4 get rrbr() => new vec4(r, r, b, r);
vec4 get rrbg() => new vec4(r, r, b, g);
vec4 get rrbb() => new vec4(r, r, b, b);
vec4 get rgrr() => new vec4(r, g, r, r);
vec4 get rgrg() => new vec4(r, g, r, g);
vec4 get rgrb() => new vec4(r, g, r, b);
vec4 get rggr() => new vec4(r, g, g, r);
vec4 get rggg() => new vec4(r, g, g, g);
vec4 get rggb() => new vec4(r, g, g, b);
vec4 get rgbr() => new vec4(r, g, b, r);
vec4 get rgbg() => new vec4(r, g, b, g);
vec4 get rgbb() => new vec4(r, g, b, b);
vec4 get rbrr() => new vec4(r, b, r, r);
vec4 get rbrg() => new vec4(r, b, r, g);
vec4 get rbrb() => new vec4(r, b, r, b);
vec4 get rbgr() => new vec4(r, b, g, r);
vec4 get rbgg() => new vec4(r, b, g, g);
vec4 get rbgb() => new vec4(r, b, g, b);
vec4 get rbbr() => new vec4(r, b, b, r);
vec4 get rbbg() => new vec4(r, b, b, g);
vec4 get rbbb() => new vec4(r, b, b, b);
vec4 get grrr() => new vec4(g, r, r, r);
vec4 get grrg() => new vec4(g, r, r, g);
vec4 get grrb() => new vec4(g, r, r, b);
vec4 get grgr() => new vec4(g, r, g, r);
vec4 get grgg() => new vec4(g, r, g, g);
vec4 get grgb() => new vec4(g, r, g, b);
vec4 get grbr() => new vec4(g, r, b, r);
vec4 get grbg() => new vec4(g, r, b, g);
vec4 get grbb() => new vec4(g, r, b, b);
vec4 get ggrr() => new vec4(g, g, r, r);
vec4 get ggrg() => new vec4(g, g, r, g);
vec4 get ggrb() => new vec4(g, g, r, b);
vec4 get gggr() => new vec4(g, g, g, r);
vec4 get gggg() => new vec4(g, g, g, g);
vec4 get gggb() => new vec4(g, g, g, b);
vec4 get ggbr() => new vec4(g, g, b, r);
vec4 get ggbg() => new vec4(g, g, b, g);
vec4 get ggbb() => new vec4(g, g, b, b);
vec4 get gbrr() => new vec4(g, b, r, r);
vec4 get gbrg() => new vec4(g, b, r, g);
vec4 get gbrb() => new vec4(g, b, r, b);
vec4 get gbgr() => new vec4(g, b, g, r);
vec4 get gbgg() => new vec4(g, b, g, g);
vec4 get gbgb() => new vec4(g, b, g, b);
vec4 get gbbr() => new vec4(g, b, b, r);
vec4 get gbbg() => new vec4(g, b, b, g);
vec4 get gbbb() => new vec4(g, b, b, b);
vec4 get brrr() => new vec4(b, r, r, r);
vec4 get brrg() => new vec4(b, r, r, g);
vec4 get brrb() => new vec4(b, r, r, b);
vec4 get brgr() => new vec4(b, r, g, r);
vec4 get brgg() => new vec4(b, r, g, g);
vec4 get brgb() => new vec4(b, r, g, b);
vec4 get brbr() => new vec4(b, r, b, r);
vec4 get brbg() => new vec4(b, r, b, g);
vec4 get brbb() => new vec4(b, r, b, b);
vec4 get bgrr() => new vec4(b, g, r, r);
vec4 get bgrg() => new vec4(b, g, r, g);
vec4 get bgrb() => new vec4(b, g, r, b);
vec4 get bggr() => new vec4(b, g, g, r);
vec4 get bggg() => new vec4(b, g, g, g);
vec4 get bggb() => new vec4(b, g, g, b);
vec4 get bgbr() => new vec4(b, g, b, r);
vec4 get bgbg() => new vec4(b, g, b, g);
vec4 get bgbb() => new vec4(b, g, b, b);
vec4 get bbrr() => new vec4(b, b, r, r);
vec4 get bbrg() => new vec4(b, b, r, g);
vec4 get bbrb() => new vec4(b, b, r, b);
vec4 get bbgr() => new vec4(b, b, g, r);
vec4 get bbgg() => new vec4(b, b, g, g);
vec4 get bbgb() => new vec4(b, b, g, b);
vec4 get bbbr() => new vec4(b, b, b, r);
vec4 get bbbg() => new vec4(b, b, b, g);
vec4 get bbbb() => new vec4(b, b, b, b);
vec2 get ss() => new vec2(s, s);
vec2 get st() => new vec2(s, t);
vec2 get sp() => new vec2(s, p);
vec2 get ts() => new vec2(t, s);
vec2 get tt() => new vec2(t, t);
vec2 get tp() => new vec2(t, p);
vec2 get ps() => new vec2(p, s);
vec2 get pt() => new vec2(p, t);
vec2 get pp() => new vec2(p, p);
vec3 get sss() => new vec3(s, s, s);
vec3 get sst() => new vec3(s, s, t);
vec3 get ssp() => new vec3(s, s, p);
vec3 get sts() => new vec3(s, t, s);
vec3 get stt() => new vec3(s, t, t);
vec3 get stp() => new vec3(s, t, p);
vec3 get sps() => new vec3(s, p, s);
vec3 get spt() => new vec3(s, p, t);
vec3 get spp() => new vec3(s, p, p);
vec3 get tss() => new vec3(t, s, s);
vec3 get tst() => new vec3(t, s, t);
vec3 get tsp() => new vec3(t, s, p);
vec3 get tts() => new vec3(t, t, s);
vec3 get ttt() => new vec3(t, t, t);
vec3 get ttp() => new vec3(t, t, p);
vec3 get tps() => new vec3(t, p, s);
vec3 get tpt() => new vec3(t, p, t);
vec3 get tpp() => new vec3(t, p, p);
vec3 get pss() => new vec3(p, s, s);
vec3 get pst() => new vec3(p, s, t);
vec3 get psp() => new vec3(p, s, p);
vec3 get pts() => new vec3(p, t, s);
vec3 get ptt() => new vec3(p, t, t);
vec3 get ptp() => new vec3(p, t, p);
vec3 get pps() => new vec3(p, p, s);
vec3 get ppt() => new vec3(p, p, t);
vec3 get ppp() => new vec3(p, p, p);
vec4 get ssss() => new vec4(s, s, s, s);
vec4 get ssst() => new vec4(s, s, s, t);
vec4 get sssp() => new vec4(s, s, s, p);
vec4 get ssts() => new vec4(s, s, t, s);
vec4 get sstt() => new vec4(s, s, t, t);
vec4 get sstp() => new vec4(s, s, t, p);
vec4 get ssps() => new vec4(s, s, p, s);
vec4 get sspt() => new vec4(s, s, p, t);
vec4 get sspp() => new vec4(s, s, p, p);
vec4 get stss() => new vec4(s, t, s, s);
vec4 get stst() => new vec4(s, t, s, t);
vec4 get stsp() => new vec4(s, t, s, p);
vec4 get stts() => new vec4(s, t, t, s);
vec4 get sttt() => new vec4(s, t, t, t);
vec4 get sttp() => new vec4(s, t, t, p);
vec4 get stps() => new vec4(s, t, p, s);
vec4 get stpt() => new vec4(s, t, p, t);
vec4 get stpp() => new vec4(s, t, p, p);
vec4 get spss() => new vec4(s, p, s, s);
vec4 get spst() => new vec4(s, p, s, t);
vec4 get spsp() => new vec4(s, p, s, p);
vec4 get spts() => new vec4(s, p, t, s);
vec4 get sptt() => new vec4(s, p, t, t);
vec4 get sptp() => new vec4(s, p, t, p);
vec4 get spps() => new vec4(s, p, p, s);
vec4 get sppt() => new vec4(s, p, p, t);
vec4 get sppp() => new vec4(s, p, p, p);
vec4 get tsss() => new vec4(t, s, s, s);
vec4 get tsst() => new vec4(t, s, s, t);
vec4 get tssp() => new vec4(t, s, s, p);
vec4 get tsts() => new vec4(t, s, t, s);
vec4 get tstt() => new vec4(t, s, t, t);
vec4 get tstp() => new vec4(t, s, t, p);
vec4 get tsps() => new vec4(t, s, p, s);
vec4 get tspt() => new vec4(t, s, p, t);
vec4 get tspp() => new vec4(t, s, p, p);
vec4 get ttss() => new vec4(t, t, s, s);
vec4 get ttst() => new vec4(t, t, s, t);
vec4 get ttsp() => new vec4(t, t, s, p);
vec4 get ttts() => new vec4(t, t, t, s);
vec4 get tttt() => new vec4(t, t, t, t);
vec4 get tttp() => new vec4(t, t, t, p);
vec4 get ttps() => new vec4(t, t, p, s);
vec4 get ttpt() => new vec4(t, t, p, t);
vec4 get ttpp() => new vec4(t, t, p, p);
vec4 get tpss() => new vec4(t, p, s, s);
vec4 get tpst() => new vec4(t, p, s, t);
vec4 get tpsp() => new vec4(t, p, s, p);
vec4 get tpts() => new vec4(t, p, t, s);
vec4 get tptt() => new vec4(t, p, t, t);
vec4 get tptp() => new vec4(t, p, t, p);
vec4 get tpps() => new vec4(t, p, p, s);
vec4 get tppt() => new vec4(t, p, p, t);
vec4 get tppp() => new vec4(t, p, p, p);
vec4 get psss() => new vec4(p, s, s, s);
vec4 get psst() => new vec4(p, s, s, t);
vec4 get pssp() => new vec4(p, s, s, p);
vec4 get psts() => new vec4(p, s, t, s);
vec4 get pstt() => new vec4(p, s, t, t);
vec4 get pstp() => new vec4(p, s, t, p);
vec4 get psps() => new vec4(p, s, p, s);
vec4 get pspt() => new vec4(p, s, p, t);
vec4 get pspp() => new vec4(p, s, p, p);
vec4 get ptss() => new vec4(p, t, s, s);
vec4 get ptst() => new vec4(p, t, s, t);
vec4 get ptsp() => new vec4(p, t, s, p);
vec4 get ptts() => new vec4(p, t, t, s);
vec4 get pttt() => new vec4(p, t, t, t);
vec4 get pttp() => new vec4(p, t, t, p);
vec4 get ptps() => new vec4(p, t, p, s);
vec4 get ptpt() => new vec4(p, t, p, t);
vec4 get ptpp() => new vec4(p, t, p, p);
vec4 get ppss() => new vec4(p, p, s, s);
vec4 get ppst() => new vec4(p, p, s, t);
vec4 get ppsp() => new vec4(p, p, s, p);
vec4 get ppts() => new vec4(p, p, t, s);
vec4 get pptt() => new vec4(p, p, t, t);
vec4 get pptp() => new vec4(p, p, t, p);
vec4 get ppps() => new vec4(p, p, p, s);
vec4 get pppt() => new vec4(p, p, p, t);
vec4 get pppp() => new vec4(p, p, p, p);
vec3 selfAdd(vec3 arg) {
x = x + arg.x;
y = y + arg.y;
z = z + arg.z;
return this;
}
vec3 selfSub(vec3 arg) {
x = x - arg.x;
y = y - arg.y;
z = z - arg.z;
return this;
}
vec3 selfMul(vec3 arg) {
x = x * arg.x;
y = y * arg.y;
z = z * arg.z;
return this;
}
vec3 selfDiv(vec3 arg) {
x = x / arg.x;
y = y / arg.y;
z = z / arg.z;
return this;
}
vec3 selfScale(num arg) {
x = x * arg;
y = y * arg;
z = z * arg;
return this;
}
vec3 selfNegate() {
x = -x;
y = -y;
z = -z;
return this;
}
vec3 selfAbsolute() {
x = x.abs();
y = y.abs();
z = z.abs();
return this;
}
vec3 copy() {
vec3 c = new vec3.copy(this);
return c;
}
vec3 copyInto(vec3 arg) {
arg.x = x;
arg.y = y;
arg.z = z;
return arg;
}
vec3 copyFrom(vec3 arg) {
x = arg.x;
y = arg.y;
z = arg.z;
return this;
}
vec3 set(vec3 arg) {
x = arg.x;
y = arg.y;
z = arg.z;
return this;
}
/// Copies [this] into [array] starting at [offset].
void copyIntoArray(Float32Array array, [int offset=0]) {
int i = offset;
array[i] = x;
i++;
array[i] = y;
i++;
array[i] = z;
i++;
}
/// Returns a copy of [this] as a [Float32Array].
Float32Array copyAsArray() {
Float32Array array = new Float32Array(3);
int i = 0;
array[i] = x;
i++;
array[i] = y;
i++;
array[i] = z;
i++;
return array;
}
/// Copies elements from [array] into [this] starting at [offset].
void copyFromArray(Float32Array array, [int offset=0]) {
int i = offset;
x = array[i];
i++;
y = array[i];
i++;
z = array[i];
i++;
}
}