45 vec2(
float x,
float y) : x(x), y(y) {}
49 float &operator[](
int i) {
return v[i]; }
50 float operator[](
int i)
const {
return v[i]; }
52 bool operator==(
const vec2 &o)
const {
return x == o.x && y == o.y; }
53 bool operator!=(
const vec2 &o)
const {
return x != o.x || y != o.y; }
55 bool iszero()
const {
return x==0 && y==0; }
56 float dot(
const vec2 &o)
const {
return x*o.x + y*o.y; }
57 float squaredlen()
const {
return dot(*
this); }
58 float magnitude()
const {
return sqrtf(squaredlen()); }
59 vec2 &normalize() { mul(1/magnitude());
return *
this; }
60 vec2 &safenormalize() {
float m = magnitude();
if(m) mul(1/m);
return *
this; }
61 float cross(
const vec2 &o)
const {
return x*o.y - y*o.x; }
62 float squaredist(
const vec2 &e)
const {
return vec2(*this).sub(e).squaredlen(); }
63 float dist(
const vec2 &e)
const {
return sqrtf(squaredist(e)); }
65 vec2 &mul(
float f) { x *= f; y *= f;
return *
this; }
66 vec2 &mul(
const vec2 &o) { x *= o.x; y *= o.y;
return *
this; }
67 vec2 &square() { mul(*
this);
return *
this; }
68 vec2 &div(
float f) { x /= f; y /= f;
return *
this; }
69 vec2 &div(
const vec2 &o) { x /= o.x; y /= o.y;
return *
this; }
70 vec2 &recip() { x = 1/x; y = 1/y;
return *
this; }
71 vec2 &add(
float f) { x += f; y += f;
return *
this; }
72 vec2 &add(
const vec2 &o) { x += o.x; y += o.y;
return *
this; }
73 vec2 &sub(
float f) { x -= f; y -= f;
return *
this; }
74 vec2 &sub(
const vec2 &o) { x -= o.x; y -= o.y;
return *
this; }
75 vec2 &neg() { x = -x; y = -y;
return *
this; }
76 vec2 &min(
const vec2 &o) { x = ::min(x, o.x); y = ::min(y, o.y);
return *
this; }
77 vec2 &max(
const vec2 &o) { x = ::max(x, o.x); y = ::max(y, o.y);
return *
this; }
78 vec2 &min(
float f) { x = ::min(x, f); y = ::min(y, f);
return *
this; }
79 vec2 &max(
float f) { x = ::max(x, f); y = ::max(y, f);
return *
this; }
80 vec2 &abs() { x = fabs(x); y = fabs(y);
return *
this; }
81 vec2 &clamp(
float l,
float h) { x = ::std::clamp(x, l, h); y = ::std::clamp(y, l, h);
return *
this; }
82 vec2 &reflect(
const vec2 &n) {
float k = 2*dot(n); x -= k*n.x; y -= k*n.y;
return *
this; }
112 x = a.x + (b.x-a.x)*t;
113 y = a.y + (b.y-a.y)*t;
117 vec2 &avg(
const vec2 &b) { add(b); mul(0.5f);
return *
this; }
119 vec2 operator+(
const vec2 &v2)
const
121 return vec2(x+v2.x, y+v2.y);
124 vec2 operator-(
const vec2 &v2)
const
126 return vec2(x-v2.x, y-v2.y);
129 vec2 operator-()
const
135 vec2 operator*(
const T &n)
137 return vec2(n*x, n*y);
142 return vec2(x*v2.x, y*v2.y);
146 vec2 operator/(
const T &n)
148 return vec2(x/n, y/n);
153 return vec2(x/v2.x, y/v2.y);
157 vec2 &madd(
const vec2 &a,
const B &b) {
return add(
vec2(a).mul(b)); }
160 vec2 &msub(
const vec2 &a,
const B &b) {
return sub(
vec2(a).mul(b)); }
162 vec2 &rotate_around_z(
float c,
float s) {
float rx = x, ry = y; x = c*rx-s*ry; y = c*ry+s*rx;
return *
this; }
163 vec2 &rotate_around_z(
float angle) {
return rotate_around_z(cosf(angle), std::sin(angle)); }
164 vec2 &rotate_around_z(
const vec2 &sc) {
return rotate_around_z(sc.x, sc.y); }
200 explicit vec(
int a) : x(a), y(a), z(a) {}
201 explicit vec(
float a) : x(a), y(a), z(a) {}
202 vec(
float a,
float b,
float c) : x(a), y(b), z(c) {}
203 explicit vec(
int v[3]) : x(v[0]), y(v[1]), z(v[2]) {}
204 explicit vec(
const float *v) : x(v[0]), y(v[1]), z(v[2]) {}
205 explicit vec(
const vec2 &v,
float z = 0) : x(v.x), y(v.y), z(z) {}
210 vec(
float yaw,
float pitch) : x(-std::sin(yaw)*cosf(pitch)), y(cosf(yaw)*cosf(pitch)), z(std::sin(pitch)) {}
211 vec &set(
int i,
float f) { v[i] = f;
return *
this; }
214 float &operator[](
int i) {
return v[i]; }
215 float operator[](
int i)
const {
return v[i]; }
216 bool operator==(
const vec &o)
const {
return x == o.x && y == o.y && z == o.z; }
217 bool operator!=(
const vec &o)
const {
return x != o.x || y != o.y || z != o.z; }
219 vec operator+(
const vec &v2)
221 return vec(x+v2.x, y+v2.y, z+v2.z);
224 vec operator-(
const vec &v2)
226 return vec(x-v2.x, y-v2.y, z-v2.z);
231 return vec(-x, -y, -z);
235 vec operator*(
const T &n)
237 return vec(n*x, n*y, n*z);
240 vec operator*(
const vec &v2)
242 return vec(x*v2.x, y*v2.y, z*v2.z);
246 vec operator/(
const T &n)
248 return vec(x/n, y/n, z/n);
251 vec operator/(
const vec &v2)
253 return vec(x/v2.x, y/v2.y, z/v2.z);
269 return x==0 && y==0 && z==0;
288 vec &neg2() { x = -x; y = -y;
return *
this; }
289 vec &neg() { x = -x; y = -y; z = -z;
return *
this; }
290 vec &abs() { x = fabs(x); y = fabs(y); z = fabs(z);
return *
this; }
291 vec &recip() { x = 1/x; y = 1/y; z = 1/z;
return *
this; }
292 float magnitude2()
const {
return sqrtf(dot2(*
this)); }
293 float magnitude()
const {
return sqrtf(
squaredlen()); }
294 vec &normalize() { div(magnitude());
return *
this; }
295 vec &safenormalize() {
float m = magnitude();
if(m) div(m);
return *
this; }
296 bool isnormalized()
const {
float m =
squaredlen();
return (m>0.99f && m<1.01f); }
299 vec &mul(
float f) { x *= f; y *= f; z *= f;
return *
this; }
300 vec &mul2(
float f) { x *= f; y *= f;
return *
this; }
301 vec &div(
float f) { x /= f; y /= f; z /= f;
return *
this; }
302 vec &div2(
float f) { x /= f; y /= f;
return *
this; }
303 vec &add(
float f) { x += f; y += f; z += f;
return *
this; }
304 vec &add2(
float f) { x += f; y += f;
return *
this; }
305 vec &addz(
float f) { z += f;
return *
this; }
306 vec &sub(
float f) { x -= f; y -= f; z -= f;
return *
this; }
307 vec &sub2(
float f) { x -= f; y -= f;
return *
this; }
308 vec &subz(
float f) { z -= f;
return *
this; }
309 vec &min(
float f) { x = ::min(x, f); y = ::min(y, f); z = ::min(z, f);
return *
this; }
310 vec &max(
float f) { x = ::max(x, f); y = ::max(y, f); z = ::max(z, f);
return *
this; }
311 vec &clamp(
float l,
float h) { x = ::std::clamp(x, l, h); y = ::std::clamp(y, l, h); z = ::std::clamp(z, l, h);
return *
this; }
314 vec &mul(
const vec &o) { x *= o.x; y *= o.y; z *= o.z;
return *
this; }
315 vec &div(
const vec &o) { x /= o.x; y /= o.y; z /= o.z;
return *
this; }
316 vec &add(
const vec &o) { x += o.x; y += o.y; z += o.z;
return *
this; }
317 vec &sub(
const vec &o) { x -= o.x; y -= o.y; z -= o.z;
return *
this; }
318 vec &min(
const vec &o) { x = ::min(x, o.x); y = ::min(y, o.y); z = ::min(z, o.z);
return *
this; }
319 vec &max(
const vec &o) { x = ::max(x, o.x); y = ::max(y, o.y); z = ::max(z, o.z);
return *
this; }
322 float dot2(
const vec2 &o)
const {
return x*o.x + y*o.y; }
323 float dot2(
const vec &o)
const {
return x*o.x + y*o.y; }
324 float dot(
const vec &o)
const {
return x*o.x + y*o.y + z*o.z; }
325 float squaredot(
const vec &o)
const {
float k = dot(o);
return k*k; }
326 float absdot(
const vec &o)
const {
return fabs(x*o.x) + fabs(y*o.y) + fabs(z*o.z); }
327 float zdot(
const vec &o)
const {
return z*o.z; }
330 float squaredist(
const vec &e)
const {
return vec(*this).sub(e).
squaredlen(); }
331 float dist(
const vec &e)
const {
return sqrtf(squaredist(e)); }
332 float dist(
const vec &e,
vec &t)
const { t = *
this; t.sub(e);
return t.magnitude(); }
333 float dist2(
const vec &o)
const {
float dx = x-o.x, dy = y-o.y;
return sqrtf(dx*dx + dy*dy); }
352 return x>o.x+r || x<o.x-r || y>o.y+r || y<o.y-r;
355 template<
class A,
class B>
356 vec &cross(
const A &a,
const B &b) { x = a.y*b.z-a.z*b.y; y = a.z*b.x-a.x*b.z; z = a.x*b.y-a.y*b.x;
return *
this; }
358 vec &cross(
const vec &o,
const vec &a,
const vec &b) {
return cross(
vec(a).sub(o),
vec(b).sub(o)); }
363 float scalartriple(
const vec &a,
const vec &b)
const {
return x*(a.y*b.z-a.z*b.y) + y*(a.z*b.x-a.x*b.z) + z*(a.x*b.y-a.y*b.x); }
371 vec &reflectz(
float rz) { z = 2*rz - z;
return *
this; }
372 vec &reflect(
const vec &n) {
float k = 2*dot(n); x -= k*n.x; y -= k*n.y; z -= k*n.z;
return *
this; }
373 vec &project(
const vec &n) {
float k = dot(n); x -= k*n.x; y -= k*n.y; z -= k*n.z;
return *
this; }
374 vec &projectxydir(
const vec &n) {
if(n.z) z = -(x*n.x/n.z + y*n.y/n.z);
return *
this; }
375 vec &projectxy(
const vec &n)
379 rescale(sqrtf(::max(m - k*k, 0.0f)));
382 vec &projectxy(
const vec &n,
float threshold)
384 float m =
squaredlen(), k = ::min(dot(n), threshold);
386 rescale(sqrtf(::max(m - k*k, 0.0f)));
419 x = a.x + (b.x-a.x)*t;
420 y = a.y + (b.y-a.y)*t;
421 z = a.z + (b.z-a.z)*t;
440 vec &madd(
const vec &a,
const B &b) {
return add(
vec(a).mul(b)); }
443 vec &msub(
const vec &a,
const B &b) {
return sub(
vec(a).mul(b)); }
445 vec &rescale(
float k)
447 float mag = magnitude();
448 if(mag > 1e-6f) mul(k / mag);
453 vec &rotate_around_z(
float c,
float s)
462 vec &rotate_around_x(
float c,
float s)
471 vec &rotate_around_y(
float c,
float s)
480 vec &rotate_around_z(
float angle)
482 return rotate_around_z(cosf(angle), std::sin(angle));
485 vec &rotate_around_x(
float angle)
487 return rotate_around_x(cosf(angle), std::sin(angle));
490 vec &rotate_around_y(
float angle)
492 return rotate_around_y(cosf(angle), std::sin(angle));
495 vec &rotate_around_z(
const vec2 &sc)
497 return rotate_around_z(sc.x, sc.y);
500 vec &rotate_around_x(
const vec2 &sc)
502 return rotate_around_x(sc.x, sc.y);
505 vec &rotate_around_y(
const vec2 &sc)
507 return rotate_around_y(sc.x, sc.y);
510 vec &rotate(
float c,
float s,
const vec &d)
512 *
this =
vec(x*(d.x*d.x*(1-c)+c) + y*(d.x*d.y*(1-c)-d.z*s) + z*(d.x*d.z*(1-c)+d.y*s),
513 x*(d.y*d.x*(1-c)+d.z*s) + y*(d.y*d.y*(1-c)+c) + z*(d.y*d.z*(1-c)-d.x*s),
514 x*(d.x*d.z*(1-c)-d.y*s) + y*(d.y*d.z*(1-c)+d.x*s) + z*(d.z*d.z*(1-c)+c));
517 vec &rotate(
float angle,
const vec &d)
519 return rotate(cosf(angle), std::sin(angle), d);
524 return rotate(sc.x, sc.y, d);
527 void orthogonal(
const vec &d)
529 *
this = fabs(d.x) > fabs(d.z) ?
vec(-d.y, d.x, 0) :
vec(0, -d.z, d.y);
532 void orthonormalize(
vec &s,
vec &t)
const
535 t.project(*this).project(s);
539 bool insidebb(
const T &bbmin,
const T &bbmax)
const
541 return x >= bbmin.x && x <= bbmax.x && y >= bbmin.y && y <= bbmax.y && z >= bbmin.z && z <= bbmax.z;
544 template<
class T,
class U>
545 bool insidebb(
const T &bbmin,
const T &bbmax, U margin)
const
547 return x >= bbmin.x-margin && x <= bbmax.x+margin && y >= bbmin.y-margin && y <= bbmax.y+margin && z >= bbmin.z-margin && z <= bbmax.z+margin;
579 float dist_to_bb(
const ivec &min,
const ivec &max)
const;
596 static vec hexcolor(
int color)
598 return vec(((color>>16)&0xFF)*(1.0f/255.0f), ((color>>8)&0xFF)*(1.0f/255.0f), (color&0xFF)*(1.0f/255.0f));
601 int tohexcolor()
const
603 return (
static_cast<int>(::std::clamp(r, 0.0f, 1.0f)*255)<<16) |
604 (
static_cast<int>(::std::clamp(g, 0.0f, 1.0f)*255)<<8) |
605 static_cast<int>(::std::clamp(b, 0.0f, 1.0f)*255);
609inline vec2::vec2(
const vec &v) : x(v.x), y(v.y) {}
614 size_t operator()(
const vec& k)
const
616 union { uint i;
float f; } x, y, z;
620 uint v = x.i^y.i^z.i;
652 bvec(uchar x, uchar y, uchar z) : x(x), y(y), z(z) {}
653 explicit bvec(
const vec &v) : x(
static_cast<uchar
>((v.x+1)*(255.0f/2.0f))), y(
static_cast<uchar
>((v.y+1)*(255.0f/2.0f))), z(
static_cast<uchar
>((v.z+1)*(255.0f/2.0f))) {}
656 uchar &operator[](
int i) {
return v[i]; }
657 uchar operator[](
int i)
const {
return v[i]; }
659 bool operator==(
const bvec &v)
const {
return x==v.x && y==v.y && z==v.z; }
660 bool operator!=(
const bvec &v)
const {
return x!=v.x || y!=v.y || z!=v.z; }
662 bool iszero()
const {
return x==0 && y==0 && z==0; }
664 vec tonormal()
const {
return vec(x*(2.0f/255.0f)-1.0f, y*(2.0f/255.0f)-1.0f, z*(2.0f/255.0f)-1.0f); }
668 vec n(x-127.5f, y-127.5f, z-127.5f);
669 float mag = 127.5f/n.magnitude();
670 x =
static_cast<uchar
>(n.x*mag+127.5f);
671 y =
static_cast<uchar
>(n.y*mag+127.5f);
672 z =
static_cast<uchar
>(n.z*mag+127.5f);
676 void lerp(
const bvec &a,
const bvec &b,
float t)
678 x =
static_cast<uchar
>(a.x + (b.x-a.x)*t);
679 y =
static_cast<uchar
>(a.y + (b.y-a.y)*t);
680 z =
static_cast<uchar
>(a.z + (b.z-a.z)*t);
683 void lerp(
const bvec &a,
const bvec &b,
int ka,
int kb,
int d)
685 x =
static_cast<uchar
>((a.x*ka + b.x*kb)/d);
686 y =
static_cast<uchar
>((a.y*ka + b.y*kb)/d);
687 z =
static_cast<uchar
>((a.z*ka + b.z*kb)/d);
697 void scale(
int k,
int d)
699 x =
static_cast<uchar
>((x*k)/d);
700 y =
static_cast<uchar
>((y*k)/d);
701 z =
static_cast<uchar
>((z*k)/d);
719 static bvec fromcolor(
const vec &v)
721 return bvec(
static_cast<uchar
>(v.x*255.0f),
static_cast<uchar
>(v.y*255.0f),
static_cast<uchar
>(v.z*255.0f));
726 return vec(x*(1.0f/255.0f), y*(1.0f/255.0f), z*(1.0f/255.0f));
729 static bvec from565(ushort c)
731 return bvec((((c>>11)&0x1F)*527 + 15) >> 6, (((c>>5)&0x3F)*259 + 35) >> 6, ((c&0x1F)*527 + 15) >> 6);
734 static bvec hexcolor(
int color)
736 return bvec((color>>16)&0xFF, (color>>8)&0xFF, color&0xFF);
739 int tohexcolor()
const
741 return (
static_cast<int>(r)<<16)|(
static_cast<int>(g)<<8)|
static_cast<int>(b);
758 struct { T x, y, z, w; };
759 struct { T r, g, b, a; };
765 explicit vec4(
const vec &p, T w = 0) : x(p.x), y(p.y), z(p.z), w(w) {}
766 explicit vec4(
const vec2 &p, T z = 0, T w = 0) : x(p.x), y(p.y), z(z), w(w) {}
767 vec4(T x, T y = 0, T z = 0, T w = 0) : x(x), y(y), z(z), w(w) {}
783 explicit vec4(
const T *
v) : x(
v[0]), y(
v[1]), z(
v[2]), w(
v[3]) {}
786 vec4(
const vec4<U> &p) : x(p.x), y(p.y), z(p.z), w(p.w) {}
791 return vec4<U>(
static_cast<U
>(this->x),
792 static_cast<U
>(this->y),
793 static_cast<U
>(this->z),
794 static_cast<U
>(this->w));
797 T &operator[](
int i) {
return v[i]; }
798 T operator[](
int i)
const {
return v[i]; }
800 bool operator==(
const vec4 &o)
const {
return x == o.x && y == o.y && z == o.z && w == o.w; }
801 bool operator!=(
const vec4 &o)
const {
return x != o.x || y != o.y || z != o.z || w != o.w; }
813 T
dot3(
const vec4 &o)
const {
return x*o.x + y*o.y + z*o.z; }
825 T
dot3(
const vec &o)
const {
return x*o.x + y*o.y + z*o.z; }
848 T
dot(
const vec &o)
const {
return x*o.x + y*o.y + z*o.z + w; }
900 x =
static_cast<uchar
>(a.x + (b.x-a.x)*t);
901 y =
static_cast<uchar
>(a.y + (b.y-a.y)*t);
902 z =
static_cast<uchar
>(a.z + (b.z-a.z)*t);
908 x =
static_cast<uchar
>((a.x*ka + b.x*kb)/d);
909 y =
static_cast<uchar
>((a.y*ka + b.y*kb)/d);
910 z =
static_cast<uchar
>((a.z*ka + b.z*kb)/d);
916 x =
static_cast<uchar
>(a.x*ta + b.x*tb + c.x*tc);
917 y =
static_cast<uchar
>(a.y*ta + b.y*tb + c.y*tc);
918 z =
static_cast<uchar
>(a.z*ta + b.z*tb + c.z*tc);
919 w =
static_cast<uchar
>(a.w*ta + b.w*tb + c.w*tc);
975 vec4 &
mul3(T f) { x *= f; y *= f; z *= f;
return *
this; }
1000 vec4 &
mul(
const vec4 &o) { x *= o.x; y *= o.y; z *= o.z; w *= o.w;
return *
this; }
1013 vec4 &
mul(
const vec &o) { x *= o.x; y *= o.y; z *= o.z;
return *
this; }
1036 vec4 &
div3(T f) { x /= f; y /= f; z /= f;
return *
this; }
1060 vec4 &
div(
const vec4 &o) { x /= o.x; y /= o.y; z /= o.z; w /= o.w;
return *
this; }
1072 vec4 &
div(
const vec &o) { x /= o.x; y /= o.y; z /= o.z;
return *
this; }
1082 vec4 &
recip() { x = 1/x; y = 1/y; z = 1/z; w = 1/w;
return *
this; }
1094 vec4 &
add(
const vec4 &o) { x += o.x; y += o.y; z += o.z; w += o.w;
return *
this; }
1107 vec4 &
add(
const vec &o) { x += o.x; y += o.y; z += o.z;
return *
this; }
1119 vec4 &
add3(T f) { x += f; y += f; z += f;
return *
this; }
1155 vec4 &
sub(
const vec4 &o) { x -= o.x; y -= o.y; z -= o.z; w -= o.w;
return *
this; }
1167 vec4 &
sub(
const vec &o) { x -= o.x; y -= o.y; z -= o.z;
return *
this; }
1215 vec4 &clamp(T l, T h)
1217 x = ::std::clamp(x, l, h);
1218 y = ::std::clamp(y, l, h);
1219 z = ::std::clamp(z, l, h);
1220 w = ::std::clamp(w, l, h);
1224 vec4 operator+(
const vec4 &v2)
const
1226 return vec4(x+v2.x, y+v2.y, z+v2.z, w+v2.w);
1229 vec4 operator-(
const vec4 &v2)
const
1231 return vec4(x-v2.x, y-v2.y, z-v2.z, w-v2.w);
1234 vec4 operator-()
const
1236 return vec4(-x, -y, -z, -w);
1239 template<
typename U>
1240 vec4 operator*(
const U &n)
const
1242 return vec4(n*x, n*y, n*z, n*w);
1245 vec4 operator*(
const vec4 &v2)
const
1247 return vec4(x*v2.x, y*v2.y, z*v2.z, w*v2.w);
1250 template<
typename U>
1251 vec4 operator/(
const U &n)
const
1253 return vec4(x/n, y/n, z/n, w/n);
1256 vec4 operator/(
const vec4 &v2)
const
1258 return vec4(x/v2.x, y/v2.y, z/v2.z, w/v2.w);
1262 template<
class A,
class B>
1263 vec4 &cross(
const A &a,
const B &b)
1265 x = a.y*b.z-a.z*b.y;
1266 y = a.z*b.x-a.x*b.z;
1267 z = a.x*b.y-a.y*b.x;
1276 void setxyz(
const vec &
v)
1367 vec tonormal()
const
1369 return vec(x*(2.0f/255.0f)-1.0f, y*(2.0f/255.0f)-1.0f, z*(2.0f/255.0f)-1.0f);
1374inline vec2::vec2(
const vec4<float> &v) : x(v.x), y(v.y) {}
1375inline vec::vec(
const vec4<float> &v) : x(v.x), y(v.y), z(v.z) {}
1766 void setyaw(
float ck,
float sk);
1939 void translate(
const vec &p);
1940 void translate(
float x,
float y,
float z);
1941 void translate(
const vec &p,
float scale);
1942 void accumulate(
const matrix4x3 &m,
float k);
2004 void rotate(
float angle,
const vec &d);
2006 void rotate(
float ck,
float sk,
const vec &axis);
2008 void rotate_around_x(
float ck,
float sk);
2009 void rotate_around_x(
float angle);
2011 void rotate_around_x(
const vec2 &sc);
2013 void rotate_around_y(
float ck,
float sk);
2014 void rotate_around_y(
float angle);
2015 void rotate_around_y(
const vec2 &sc);
2017 void rotate_around_z(
float ck,
float sk);
2018 void rotate_around_z(
float angle);
2019 void rotate_around_z(
const vec2 &sc);
2021 vec transposedtransform(
const vec &o)
const;
2022 vec transformnormal(
const vec &o)
const;
2023 vec transposedtransformnormal(
const vec &o)
const;
2024 vec transform(
const vec &o)
const;
2025 vec transform(
const vec2 &o)
const;
2067const int R[3] = {1, 2, 0};
2068const int C[3] = {2, 0, 1};
2069const int D[3] = {0, 1, 2};
2090 explicit ivec(
const vec &v) : x(
static_cast<int>(v.x)), y(
static_cast<int>(v.y)), z(
static_cast<int>(v.z)) {}
2091 ivec(
int a,
int b,
int c) : x(a), y(b), z(c) {}
2092 ivec(
int d,
int row,
int col,
int depth)
2098 ivec(
int i,
const ivec &co,
int size) : x(co.x+((i&1)>>0)*size), y(co.y+((i&2)>>1)*size), z(co.z +((i&4)>>2)*size) {}
2099 explicit ivec(
const ivec2 &v,
int z = 0);
2102 int &operator[](
int i) {
return v[i]; }
2103 int operator[](
int i)
const {
return v[i]; }
2106 bool operator==(
const ivec &v)
const {
return x==v.x && y==v.y && z==v.z; }
2107 bool operator!=(
const ivec &v)
const {
return x!=v.x || y!=v.y || z!=v.z; }
2108 ivec operator+(
const ivec &v)
const {
return ivec(x+v.x, y+v.y, z+v.z); }
2116 explicit operator bool()
const {
return !(x==0 && y==0 && z==0); }
2117 ivec &shl(
int n) { x<<= n; y<<= n; z<<= n;
return *
this; }
2118 ivec &shr(
int n) { x>>= n; y>>= n; z>>= n;
return *
this; }
2119 ivec &mul(
int n) { x *= n; y *= n; z *= n;
return *
this; }
2120 ivec &div(
int n) { x /= n; y /= n; z /= n;
return *
this; }
2121 ivec &add(
int n) { x += n; y += n; z += n;
return *
this; }
2122 ivec &sub(
int n) { x -= n; y -= n; z -= n;
return *
this; }
2123 ivec &mul(
const ivec &v) { x *= v.x; y *= v.y; z *= v.z;
return *
this; }
2124 ivec &div(
const ivec &v) { x /= v.x; y /= v.y; z /= v.z;
return *
this; }
2125 ivec &add(
const ivec &v) { x += v.x; y += v.y; z += v.z;
return *
this; }
2126 ivec &sub(
const ivec &v) { x -= v.x; y -= v.y; z -= v.z;
return *
this; }
2127 ivec &mask(
int n) { x &= n; y &= n; z &= n;
return *
this; }
2128 ivec &neg() { x = -x; y = -y; z = -z;
return *
this; }
2129 ivec &min(
const ivec &o) { x = ::min(x, o.x); y = ::min(y, o.y); z = ::min(z, o.z);
return *
this; }
2130 ivec &max(
const ivec &o) { x = ::max(x, o.x); y = ::max(y, o.y); z = ::max(z, o.z);
return *
this; }
2131 ivec &min(
int n) { x = ::min(x, n); y = ::min(y, n); z = ::min(z, n);
return *
this; }
2132 ivec &max(
int n) { x = ::max(x, n); y = ::max(y, n); z = ::max(z, n);
return *
this; }
2133 ivec &abs() { x = ::abs(x); y = ::abs(y); z = ::abs(z);
return *
this; }
2134 ivec &clamp(
int l,
int h) { x = ::std::clamp(x, l, h); y = ::std::clamp(y, l, h); z = ::std::clamp(z, l, h);
return *
this; }
2135 ivec &cross(
const ivec &a,
const ivec &b) { x = a.y*b.z-a.z*b.y; y = a.z*b.x-a.x*b.z; z = a.x*b.y-a.y*b.x;
return *
this; }
2136 int dot(
const ivec &o)
const {
return x*o.x + y*o.y + z*o.z; }
2137 float dist(
const plane &p)
const;
2139 static inline ivec floor(
const vec &o) {
return ivec(
static_cast<int>(::floor(o.x)),
static_cast<int>(::floor(o.y)),
static_cast<int>(::floor(o.z))); }
2140 static inline ivec ceil(
const vec &o) {
return ivec(
static_cast<int>(::ceil(o.x)),
static_cast<int>(::ceil(o.y)),
static_cast<int>(::ceil(o.z))); }
2143inline vec::vec(
const ivec &v) : x(v.x), y(v.y), z(v.z) {}
2148 size_t operator()(
const ivec &k)
const
2161 struct {
int x, y; };
2166 ivec2(
int x,
int y) : x(x), y(y) {}
2167 explicit ivec2(
const vec2 &v) : x(
static_cast<int>(v.x)), y(
static_cast<int>(v.y)) {}
2168 explicit ivec2(
const ivec &v) : x(v.x), y(v.y) {}
2170 int &operator[](
int i) {
return v[i]; }
2171 int operator[](
int i)
const {
return v[i]; }
2173 bool operator==(
const ivec2 &o)
const {
return x == o.x && y == o.y; }
2174 bool operator!=(
const ivec2 &o)
const {
return x != o.x || y != o.y; }
2176 bool iszero()
const {
return x==0 && y==0; }
2177 ivec2 &shl(
int n) { x<<= n; y<<= n;
return *
this; }
2178 ivec2 &shr(
int n) { x>>= n; y>>= n;
return *
this; }
2179 ivec2 &mul(
int n) { x *= n; y *= n;
return *
this; }
2180 ivec2 &div(
int n) { x /= n; y /= n;
return *
this; }
2181 ivec2 &add(
int n) { x += n; y += n;
return *
this; }
2182 ivec2 &sub(
int n) { x -= n; y -= n;
return *
this; }
2183 ivec2 &mul(
const ivec2 &v) { x *= v.x; y *= v.y;
return *
this; }
2184 ivec2 &div(
const ivec2 &v) { x /= v.x; y /= v.y;
return *
this; }
2185 ivec2 &add(
const ivec2 &v) { x += v.x; y += v.y;
return *
this; }
2186 ivec2 &sub(
const ivec2 &v) { x -= v.x; y -= v.y;
return *
this; }
2187 ivec2 &mask(
int n) { x &= n; y &= n;
return *
this; }
2188 ivec2 &neg() { x = -x; y = -y;
return *
this; }
2189 ivec2 &min(
const ivec2 &o) { x = ::min(x, o.x); y = ::min(y, o.y);
return *
this; }
2190 ivec2 &max(
const ivec2 &o) { x = ::max(x, o.x); y = ::max(y, o.y);
return *
this; }
2191 ivec2 &min(
int n) { x = ::min(x, n); y = ::min(y, n);
return *
this; }
2192 ivec2 &max(
int n) { x = ::max(x, n); y = ::max(y, n);
return *
this; }
2193 ivec2 &abs() { x = ::abs(x); y = ::abs(y);
return *
this; }
2194 int dot(
const ivec2 &o)
const {
return x*o.x + y*o.y; }
2195 int cross(
const ivec2 &o)
const {
return x*o.y - y*o.x; }
2198inline ivec::ivec(
const ivec2 &v,
int z) : x(v.x), y(v.y), z(z) {}
2200inline bvec::bvec(
const vec4<uchar> &v) : x(v.x), y(v.y), z(v.z) {}
2209 struct {
short x, y, z; };
2214 svec(
short x,
short y,
short z) : x(x), y(y), z(z) {}
2215 explicit svec(
const ivec &v) : x(v.x), y(v.y), z(v.z) {}
2217 short &operator[](
int i) {
return v[i]; }
2218 short operator[](
int i)
const {
return v[i]; }
2221inline vec::vec(
const svec &v) : x(v.x), y(v.y), z(v.z) {}
2222inline ivec::ivec(
const svec &v) : x(v.x), y(v.y), z(v.z) {}
2231 template<
class T,
class U>
2232 T transformnormal(
const U &in)
const
2235 transformnormal(in, v);
2239 template<
class T,
class U>
2240 T transform(
const U &in)
const
2248 vec perspectivetransform(
const T &in)
const
2252 return vec(v).div(v.w);
2258 a = T(x.a).
mul(y.a.x).madd(x.b, y.a.y).madd(x.c, y.a.z).madd(x.d, y.a.w);
2259 b = T(x.a).
mul(y.b.x).madd(x.b, y.b.y).madd(x.c, y.b.z).madd(x.d, y.b.w);
2260 c = T(x.a).
mul(y.c.x).madd(x.b, y.c.y).madd(x.c, y.c.z).madd(x.d, y.c.w);
2261 d = T(x.a).
mul(y.d.x).madd(x.b, y.d.y).madd(x.c, y.d.z).madd(x.d, y.d.w);
2314 void rotate_around_x(
float ck,
float sk);
2315 void rotate_around_x(
float angle);
2316 void rotate_around_x(
const vec2 &sc);
2317 void rotate_around_y(
float ck,
float sk);
2318 void rotate_around_y(
float angle);
2319 void rotate_around_y(
const vec2 &sc);
2321 void rotate_around_z(
float ck,
float sk);
2322 void rotate_around_z(
float angle);
2323 void rotate_around_z(
const vec2 &sc);
2325 void rotate(
float ck,
float sk,
const vec &axis);
2326 void rotate(
float angle,
const vec &dir);
2327 void rotate(
const vec2 &sc,
const vec &dir);
2343 void settranslation(
const vec &v);
2344 void settranslation(
float x,
float y,
float z);
2345 void translate(
const vec &p);
2346 void translate(
float x,
float y,
float z);
2347 void translate(
const vec &p,
float scale);
2348 void setscale(
float x,
float y,
float z);
2349 void setscale(
const vec &v);
2350 void setscale(
float n);
2351 void scale(
float x,
float y,
float z);
2352 void scale(
const vec &v);
2353 void scale(
float n);
2355 void scalez(
float k);
2357 void jitter(
float x,
float y);
2385 void frustum(
float left,
float right,
float bottom,
float top,
float znear,
float zfar);
2386 void perspective(
float fovy,
float aspect,
float znear,
float zfar);
2388 void ortho(
float left,
float right,
float bottom,
float top,
float znear,
float zfar);
2390 void transform(
const vec &in,
vec &out)
const;
2395 void transformnormal(
const vec &in,
vec &out)
const;
2398 void transposedtransform(
const vec &in,
vec &out)
const;
2399 void transposedtransformnormal(
const vec &in,
vec &out)
const;
2400 void transposedtransform(
const plane &in, plane &out)
const;
2402 vec gettranslation()
const;
2465 vec2 lineardepthscale()
const;
2469 : a(m.a), b(m.b), c(m.c)
2473 : a(m.a), b(m.b), c(m.c), d(m.d)
2488 bool operator==(
const GenericVec2 &h)
const {
return x == h.x && y == h.y; }
2489 bool operator!=(
const GenericVec2 &h)
const {
return x != h.x || y != h.y; }
2506 bool operator==(
const GenericVec3<T> &h)
const {
return x == h.x && y == h.y && z == h.z; }
2507 bool operator!=(
const GenericVec3<T> &h)
const {
return x != h.x || y != h.y || z != h.z; }
2508 bool operator>(
const GenericVec3<T> &h)
const {
return x > h.x && y > h.y && z > h.z; }
2509 bool operator<(
const GenericVec3<T> &h)
const {
return x < h.x && y < h.y && z < h.z; }
2510 bool operator>=(
const GenericVec3<T> &h)
const {
return x >= h.x && y >= h.y && z >= h.z; }
2511 bool operator<=(
const GenericVec3<T> &h)
const {
return x <= h.x && y <= h.y && z <= h.z; }
2514extern bool raysphereintersect(
const vec ¢er,
float radius,
const vec &o,
const vec &ray,
float &dist);
2515extern bool rayboxintersect(
const vec &b,
const vec &s,
const vec &o,
const vec &ray,
float &dist,
int &orient);
2550extern int polyclip(
const vec *in,
int numin,
const vec &dir,
float below,
float above,
vec *out);
2567 angle = 360 + (angle <= -360 ? angle%360 : angle);
2569 else if(angle >= 360)
matrix3: 3x3 matrix comprised of three vec3 vectors arranged as follows: [ a1 b1 c1 a2 b2 c2 a3 b3 c3...
Definition geom.h:1388
matrix3(const vec &a, const vec &b, const vec &c)
Creates a new matrix with the given vectors.
bool calcangleaxis(float tr, float &angle, vec &axis, float threshold=1e-16f) const
Calculates the axis and angle from a rotation matrix.
void rotate_around_z(const vec2 &sc)
Rotates the matrix values around the Z axis.
vec rowx() const
Returns the first (top) row of the matrix.
void rotate_around_y(float angle)
Rotates the matrix values around the Y axis.
vec a
the three vectors making up the rows of the matrix
Definition geom.h:1397
void scale(float k)
Multiplies each element of the matrix by the scale factor given.
vec abstransform(const vec &o) const
Sets the matrix to the absolute value of the transform.
vec transform(const vec &o) const
Sets the matrix to the transform of the matrix.
void invert(const matrix3 &o)
Inverts the matrix using another matrix for the scale factor.
void rotate_around_x(float angle)
Rotates the matrix values around the X axis.
void identity()
Sets the matrix to be the identity matrix.
void normalize()
Normalizes each of the three rows to a magnitude of 1.
void rotate_around_z(float angle)
Rotates the matrix values around the Z axis.
void invert()
Inverts the matrix using itself for the scale factor.
vec transform(const vec2 &o) const
Returns the transform of the matrix.
float trace() const
Returns the trace of the matrix.
vec transposedtransform(const vec2 &o) const
Returns the transposed transform of the matrix.
bool calcangleaxis(float &angle, vec &axis, float threshold=1e-16f) const
Calculates the axis and angle from a rotation matrix.
void rotate(float ck, float sk, const vec &axis)
Rotates the matrix around the given axis by the given angle.
void transposemul(const matrix3 &m, const matrix3 &n)
Calculates the transpose-multiplication with another two matrices.
vec abstransposedtransform(const vec &o) const
Sets the matrix to the absolute value of the transpose-transform.
vec rowz() const
Returns the third (bottom) row of the matrix.
void rotate_around_x(const vec2 &sc)
Rotates the matrix values around the X axis.
matrix3()
Creates an empty matrix.
void mul(const matrix3 &m, const matrix3 &n)
Calculates the product of three matrices.
void setyaw(float angle)
Sets the matrix to a 2D rotation matrix.
void transpose()
Transposes the matrix.
void transposemul(const matrix3 &n)
Calculates the transpose-multiplication with another matrix.
void rotate(float angle, const vec &axis)
Rotates the matrix around the given axis by the given angle.
void mul(const matrix3 &n)
Multiplies the matrix by another.
vec transposedtransform(const vec &o) const
Sets the matrix to the transpose-transform.
matrix3(const quat &q)
Creates a 3d rotation matrix given a quaternion object.
matrix3(float angle, const vec &axis)
Creates a new matrix as a rotation matrix.
void multranspose(const matrix3 &n)
Calculates the multiplication-transpose with another matrix.
void rotate_around_y(const vec2 &sc)
Rotates the matrix values around the Y axis.
vec rowy() const
Returns the second (middle) row of the matrix.
float sin360(int angle)
Returns the sine for an angle (in degrees)
Definition geom.h:2605
int mod360(int angle)
Returns the angle passed to it, clamped to 0...360.
Definition geom.h:2563
const vec2 & sincosmod360(int angle)
Returns a vec2 containing (cos, sine) for a given integral angle.
Definition geom.h:2583
float cotan360(int angle)
Returns the cotangent for an angle (in degrees)
Definition geom.h:2627
float cos360(int angle)
Returns the cosine for an angle (in degrees)
Definition geom.h:2594
const int R[3]
Definition geom.h:2067
const int C[3]
Definition geom.h:2068
bool linecylinderintersect(const vec &from, const vec &to, const vec &start, const vec &end, float radius, float &dist)
Determines whether a line segment intersects a specified cylinder.
const int D[3]
Definition geom.h:2069
float tan360(int angle)
Returns the tangent for an angle (in degrees)
Definition geom.h:2616
three dimensional Cartesian byte vector
Definition geom.h:637
integer vector2
Definition geom.h:2158
floating point 4x4 array object
Definition geom.h:2228
vec4< float > rowz() const
Returns the third row of the matrix.
vec4< float > roww() const
Returns the fourth row of the matrix.
void transpose()
Transposes the matrix along the diagonal.
vec4< float > rowx() const
Returns the first row of the matrix.
void mul(const matrix4 &x, const matrix4 &y)
Sets this matrix to the product of the two matrices provided.
matrix4 inverse(double mindet=1.0e-12) const
Returns the inverse of the matrix.
void muld(const matrix4 &y)
Sets this matrix to the product of this and another matrix.
bool invert(const matrix4 &m, double mindet=1.0e-12)
Sets this matrix to the inverse of the provided matrix.
vec4< float > rowy() const
Returns the second row of the matrix.
void muld(const matrix4 &x, const matrix4 &y)
Sets this matrix to the product of the two matrices provided.
void identity()
Sets the matrix to I, the identity matrix.
void transpose(const matrix4 &m)
Copies the transpose of the given matrix4 to this
void mul(const matrix4 &y)
Sets this matrix to the product of this and another matrix.
floating point 4x3 matrix object defined as four column vectors, a-d takes the form as follows: [ a1 ...
Definition geom.h:1811
void setscale(float x, float y, float z)
Sets the diagonals a.x, b.y, c.z to the given values.
void lerp(const matrix4x3 &from, const matrix4x3 &to, float t)
Linearly interpolates between two other matrices according to scale t.
void setscale(const vec &v)
Sets the diagonals a.x, b.y, c.z to the given vector's x, y, z values.
vec4< float > rowz() const
Returns the z values of the four vectors as a four-vector.
matrix4x3(const dualquat &dq)
Creates a matrix4x3 that represents a dual quaternion transformation.
matrix4x3()
Creates an empty matrix4x3 object.
void setscale(float n)
Sets the diagonals a.x, b.y, c.z identically to a given value.
void settranslation(float x, float y, float z)
Copies x, y, z into the fourth column vector (d).
void scale(float x, float y, float z)
Scales the first three vectors by x, y, and z respectively.
matrix4x3(const vec &a, const vec &b, const vec &c, const vec &d)
Creates a matrix4x3 from four three-dimensional vec objects.
void normalize()
Normalizes the first three column vectors.
void scale(float n)
Scales the first three vector elements in the matrix by the specified amount.
void lerp(const matrix4x3 &to, float t)
Linearly interpolates between the two matrices according to scale t.
vec4< float > rowx() const
Returns the x values of the four vectors as a four-vector.
vec4< float > rowy() const
Returns the y values of the four vectors as a four-vector.
matrix4x3(const matrix3 &rot, const vec &trans)
Creates a matrix4x3 from a rotation matrix and a translation vector.
void settranslation(const vec &p)
Copies the p vector into the fourth column vector (d).
void identity()
Sets this matrix to the identity matrix.
void mul(float k)
Multiplies all values inside the matrix by a scalar constant.
void scale(const vec &v)
Multiplies the first three vectors by v.x, v.y, and v.z respectively.
short integer three-vector object
Definition geom.h:2206
two dimensional Cartesian vector object
Definition geom.h:34
vec2 & lerp(const vec2 &a, const vec2 &b, float t)
Linearly interpolates between two other vec2s according to scale t.
Definition geom.h:110
vec2 & lerp(const vec2 &b, float t)
Linearly interpolates between another vec2 according to scale t.
Definition geom.h:93
A four dimensional Cartesian-space vector template.
Definition geom.h:755
T dot3(const vec &o) const
Returns the 3 dimensional dot product between this and a 3D vec.
Definition geom.h:825
vec4 & safenormalize()
Scales the vector to have a magnitude of 1.
Definition geom.h:896
T dot(const vec &o) const
Returns the dot product of this and a vec3, assuming o.w = 1.
Definition geom.h:848
T dot(const vec4 &o) const
Returns the scalar product with another vec4.
Definition geom.h:837
T v[4]
Definition geom.h:760
vec4 & div(T f)
Calculates the elementwise quotient.
Definition geom.h:1048
vec4 & add(const vec4 &o)
Calculates the elementwise sum.
Definition geom.h:1094
void flip()
Flips a vec4<uchar> by using the mask type pun.
Definition geom.h:927
vec4 & normalize()
Scales the vector to have a magnitude of 1.
Definition geom.h:887
vec4 & sub(const vec4 &o)
Subtracts from this the vec4 passed.
Definition geom.h:1155
vec4 & recip()
Calculates the elementwise reciprocal.
Definition geom.h:1082
vec4 & div3(T f)
Calculates the elementwise quotient.
Definition geom.h:1036
vec4 & sub3(T f)
Subtracts from the first three entries this the svalue passed.
Definition geom.h:1179
T squaredlen() const
Returns the square of the magnitude of the vector.
Definition geom.h:858
vec4 & rotate_around_x(T c, T s)
Rotates the given 3-vector around the x-axis.
Definition geom.h:1310
vec4 & addw(T f)
Adds to the fourth value of the vector (w/a).
Definition geom.h:1143
vec4 & div(const vec &o)
Calculates the elementwise quotient.
Definition geom.h:1072
vec4 & mul(T f)
Calculates the elementwise product.
Definition geom.h:987
vec4 & sub(const vec &o)
Subtracts from this the vec passed.
Definition geom.h:1167
vec4 & mul3(T f)
Calculates the elementwise product.
Definition geom.h:975
vec4 & add(const vec &o)
Calculates the elementwise sum.
Definition geom.h:1107
vec4 & mul(const vec &o)
Calculates the elementwise product.
Definition geom.h:1013
T magnitude3() const
Returns the magnitude of the vector, ignoring the w dimension.
Definition geom.h:878
T dot3(const vec4 &o) const
Returns the 3 dimensional dot product between two 4-vecs.
Definition geom.h:813
vec4 & div(const vec4 &o)
Calculates the elementwise quotient.
Definition geom.h:1060
vec4 & rotate_around_y(T c, T s)
Rotates the given 3-vector around the y-axis.
Definition geom.h:1328
vec4 & rotate_around_z(T c, T s)
Rotates the given 3-vector around the z-axis.
Definition geom.h:1292
uint mask
Definition geom.h:761
vec4 & square()
Calculates the elementwise square.
Definition geom.h:1023
vec4 & add(T f)
Calculates the elementwise sum.
Definition geom.h:1131
T magnitude() const
Returns the magnitude of the vector.
Definition geom.h:868
vec4 & mul(const vec4 &o)
Calculates the elementwise product.
Definition geom.h:1000
vec4 & add3(T f)
Calculates the elementwise sum.
Definition geom.h:1119
vec4 & avg(const vec4 &b)
Calculates the elementwise arithmetic mean.
Definition geom.h:957
three dimensional Cartesian vector object
Definition geom.h:185
float squaredlen() const
Returns the square of this vec's magnitude.
Definition geom.h:278
vec & square()
Sets this vec to its elementwise square.
Definition geom.h:287
vec & lerp(const vec &a, const vec &b, float t)
Linearly interpolates between two other vecs according to scale t.
Definition geom.h:417
vec & lerp(const vec &b, float t)
Linearly interpolates between another vec2 according to scale t.
Definition geom.h:399
bool insidebb(const ivec &o, int size) const
Determines whether this vec is within the boundaries {o, o+size}.
bool reject(const vec &o, float r) const
Checks whether the x,y dimensions are outside a distance from a vec.
Definition geom.h:350
float scalartriple(const vec &a, const vec &b) const
scalar triple product A*(BxC)
Definition geom.h:363
bool iszero() const
Returns whether this vec is exactly zero in all axes.
Definition geom.h:267
bool insidebb(const ivec &o, int size, int margin) const
Determines whether this vec is within the boundaries {o-margin, o+size+margin}.
vec & avg(const vec &b)
Sets this vec to the arithmetic mean of itself and another vec.
Definition geom.h:432
float zscalartriple(const vec &a, const vec &b) const
z component only of scalar triple product (A*(BxC))
Definition geom.h:368
float project_bb(const ivec &min, const ivec &max) const
Returns the dot product of this and min/max, depending on sign.