📄 nv_algebra.h
字号:
mat_array[i * 3 + 2] = v.z; } void set_rot(const nv_scalar & theta, const vec3 & v); void set_rot(const vec3 & u, const vec3 & v); union { struct { nv_scalar a00, a10, a20; // standard names for components nv_scalar a01, a11, a21; // standard names for components nv_scalar a02, a12, a22; // standard names for components }; nv_scalar mat_array[9]; // array access };};const vec3 operator*(const mat3&, const vec3&);const vec3 operator*(const vec3&, const mat3&);struct DECLSPEC_NV_MATH mat4{ mat4(); mat4(const nv_scalar * array); mat4(const mat4 & M); mat4( const nv_scalar& f0, const nv_scalar& f1, const nv_scalar& f2, const nv_scalar& f3, const nv_scalar& f4, const nv_scalar& f5, const nv_scalar& f6, const nv_scalar& f7, const nv_scalar& f8, const nv_scalar& f9, const nv_scalar& f10, const nv_scalar& f11, const nv_scalar& f12, const nv_scalar& f13, const nv_scalar& f14, const nv_scalar& f15 ) : a00( f0 ), a10( f1 ), a20( f2 ), a30( f3 ), a01( f4 ), a11( f5 ), a21( f6 ), a31( f7 ), a02( f8 ), a12( f9 ), a22( f10), a32( f11), a03( f12), a13( f13), a23( f14), a33( f15) { } const vec4 col(const int i) const { return vec4(&mat_array[i * 4]); } const vec4 operator[](const int& i) const { return vec4(mat_array[i], mat_array[i + 4], mat_array[i + 8], mat_array[i + 12]); } const nv_scalar& operator()(const int& i, const int& j) const { return mat_array[ j * 4 + i ]; } nv_scalar& operator()(const int& i, const int& j) { return mat_array[ j * 4 + i ]; } void set_col(int i, const vec4 & v) { mat_array[i * 4] = v.x; mat_array[i * 4 + 1] = v.y; mat_array[i * 4 + 2] = v.z; mat_array[i * 4 + 3] = v.w; } void set_row(int i, const vec4 & v) { mat_array[i] = v.x; mat_array[i + 4] = v.y; mat_array[i + 8] = v.z; mat_array[i + 12] = v.w; } mat3 & get_rot(mat3 & M) const; quat & get_rot(quat & q) const; void set_rot(const quat & q); void set_rot(const mat3 & M); void set_rot(const nv_scalar & theta, const vec3 & v); void set_rot(const vec3 & u, const vec3 & v); void set_translation(const vec3 & t); vec3 & get_translation(vec3 & t) const; mat4 operator*(const mat4&) const; union { struct { nv_scalar a00, a10, a20, a30; // standard names for components nv_scalar a01, a11, a21, a31; // standard names for components nv_scalar a02, a12, a22, a32; // standard names for components nv_scalar a03, a13, a23, a33; // standard names for components }; struct { nv_scalar _11, _12, _13, _14; // standard names for components nv_scalar _21, _22, _23, _24; // standard names for components nv_scalar _31, _32, _33, _34; // standard names for components nv_scalar _41, _42, _43, _44; // standard names for components }; union { struct { nv_scalar b00, b10, b20, p; // standard names for components nv_scalar b01, b11, b21, q; // standard names for components nv_scalar b02, b12, b22, r; // standard names for components nv_scalar x, y, z, w; // standard names for components }; }; nv_scalar mat_array[16]; // array access };};const vec4 operator*(const mat4&, const vec4&);const vec4 operator*(const vec4&, const mat4&);// quaternionstruct DECLSPEC_NV_MATH quat {public: quat(nv_scalar x = 0, nv_scalar y = 0, nv_scalar z = 0, nv_scalar w = 1); quat(const quat& quat); quat(const vec3& axis, nv_scalar angle); quat(const mat3& rot); quat& operator=(const quat& quat); quat operator-() { return quat(-x, -y, -z, -w); } quat Inverse(); void Normalize(); void FromMatrix(const mat3& mat); void ToMatrix(mat3& mat) const; quat& operator*=(const quat& quat); static const quat Identity; nv_scalar& operator[](int i) { return comp[i]; } const nv_scalar operator[](int i) const { return comp[i]; } union { struct { nv_scalar x, y, z, w; }; nv_scalar comp[4]; };};const quat operator*(const quat&, const quat&);extern quat & conj(quat & p, const quat & q);extern quat & add_quats(quat & p, const quat & q1, const quat & q2);extern nv_scalar dot(const quat & p, const quat & q);extern quat & dot(nv_scalar s, const quat & p, const quat & q);extern quat & slerp_quats(quat & p, nv_scalar s, const quat & q1, const quat & q2);extern quat & axis_to_quat(quat & q, const vec3 & a, const nv_scalar phi);extern mat3 & quat_2_mat(mat3 &M, const quat &q );extern quat & mat_2_quat(quat &q,const mat3 &M);// constant algebraic valuesconst nv_scalar array16_id[] = { nv_one, nv_zero, nv_zero, nv_zero, nv_zero, nv_one, nv_zero, nv_zero, nv_zero, nv_zero, nv_one, nv_zero, nv_zero, nv_zero, nv_zero, nv_one};const nv_scalar array16_null[] = { nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero};const nv_scalar array16_scale_bias[] = { nv_zero_5, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero_5, nv_zero, nv_zero, nv_zero, nv_zero, nv_zero_5, nv_zero, nv_zero_5, nv_zero_5, nv_zero_5, nv_one};const nv_scalar array9_id[] = { nv_one, nv_zero, nv_zero, nv_zero, nv_one, nv_zero, nv_zero, nv_zero, nv_one};const vec2 vec2_null(nv_zero,nv_zero);const vec4 vec4_one(nv_one,nv_one,nv_one,nv_one);const vec3 vec3_one(nv_one,nv_one,nv_one);const vec3 vec3_null(nv_zero,nv_zero,nv_zero);const vec3 vec3_x(nv_one,nv_zero,nv_zero);const vec3 vec3_y(nv_zero,nv_one,nv_zero);const vec3 vec3_z(nv_zero,nv_zero,nv_one);const vec3 vec3_neg_x(-nv_one,nv_zero,nv_zero);const vec3 vec3_neg_y(nv_zero,-nv_one,nv_zero);const vec3 vec3_neg_z(nv_zero,nv_zero,-nv_one);const vec4 vec4_null(nv_zero,nv_zero,nv_zero,nv_zero);const vec4 vec4_x(nv_one,nv_zero,nv_zero,nv_zero);const vec4 vec4_neg_x(-nv_one,nv_zero,nv_zero,nv_zero);const vec4 vec4_y(nv_zero,nv_one,nv_zero,nv_zero);const vec4 vec4_neg_y(nv_zero,-nv_one,nv_zero,nv_zero);const vec4 vec4_z(nv_zero,nv_zero,nv_one,nv_zero);const vec4 vec4_neg_z(nv_zero,nv_zero,-nv_one,nv_zero);const vec4 vec4_w(nv_zero,nv_zero,nv_zero,nv_one);const vec4 vec4_neg_w(nv_zero,nv_zero,nv_zero,-nv_one);const quat quat_id(nv_zero,nv_zero,nv_zero,nv_one);const mat4 mat4_id(array16_id);const mat3 mat3_id(array9_id);const mat4 mat4_null(array16_null);const mat4 mat4_scale_bias(array16_scale_bias);// normalizes a vector and return a reference of itselfextern vec3 & normalize(vec3 & u);extern vec4 & normalize(vec4 & u);// Computes the squared magnitudeinline nv_scalar nv_sq_norm(const vec3 & n){ return n.x * n.x + n.y * n.y + n.z * n.z; }inline nv_scalar nv_sq_norm(const vec4 & n){ return n.x * n.x + n.y * n.y + n.z * n.z + n.w * n.w; }// Computes the magnitudeinline nv_scalar nv_norm(const vec3 & n){ return sqrtf(nv_sq_norm(n)); }inline nv_scalar nv_norm(const vec4 & n){ return sqrtf(nv_sq_norm(n)); }// computes the cross product ( v cross w) and stores the result in u// i.e. u = v cross wextern vec3 & cross(vec3 & u, const vec3 & v, const vec3 & w);// computes the dot product ( v dot w) and stores the result in u// i.e. u = v dot wextern nv_scalar & dot(nv_scalar & u, const vec3 & v, const vec3 & w);extern nv_scalar dot(const vec3 & v, const vec3 & w);extern nv_scalar & dot(nv_scalar & u, const vec4 & v, const vec4 & w);extern nv_scalar dot(const vec4 & v, const vec4 & w);extern nv_scalar & dot(nv_scalar & u, const vec3 & v, const vec4 & w);extern nv_scalar dot(const vec3 & v, const vec4 & w);extern nv_scalar & dot(nv_scalar & u, const vec4 & v, const vec3 & w);extern nv_scalar dot(const vec4 & v, const vec3 & w);// compute the reflected vector R of L w.r.t N - vectors need to be // normalized//// R N L// _ _// |\ ^ /|// \ | /// \ | /// \|/// +extern vec3 & reflect(vec3 & r, const vec3 & n, const vec3 & l);// Computes u = v * lambda + uextern vec3 & madd(vec3 & u, const vec3 & v, const nv_scalar & lambda);// Computes u = v * lambdaextern vec3 & mult(vec3 & u, const vec3 & v, const nv_scalar & lambda);// Computes u = v * wextern vec3 & mult(vec3 & u, const vec3 & v, const vec3 & w);// Computes u = v + wextern vec3 & add(vec3 & u, const vec3 & v, const vec3 & w);// Computes u = v - wextern vec3 & sub(vec3 & u, const vec3 & v, const vec3 & w);// Computes u = u * sextern vec3 & scale(vec3 & u, const nv_scalar s);extern vec4 & scale(vec4 & u, const nv_scalar s);// Computes u = M * vextern vec3 & mult(vec3 & u, const mat3 & M, const vec3 & v);extern vec4 & mult(vec4 & u, const mat4 & M, const vec4 & v);// Computes u = v * Mextern vec3 & mult(vec3 & u, const vec3 & v, const mat3 & M);extern vec4 & mult(vec4 & u, const vec4 & v, const mat4 & M);// Computes u = M(4x4) * v and divides by wextern vec3 & mult_pos(vec3 & u, const mat4 & M, const vec3 & v);// Computes u = M(4x4) * vextern vec3 & mult_dir(vec3 & u, const mat4 & M, const vec3 & v);// Computes u = M(4x4) * v and does not divide by w (assumed to be 1)extern vec3 & mult(vec3& u, const mat4& M, const vec3& v);// Computes u = v * M(4x4) and divides by wextern vec3 & mult_pos(vec3 & u, const vec3 & v, const mat4 & M);// Computes u = v * M(4x4)extern vec3 & mult_dir(vec3 & u, const vec3 & v, const mat4 & M);// Computes u = v * M(4x4) and does not divide by w (assumed to be 1)extern vec3 & mult(vec3& u, const vec3& v, const mat4& M);// Computes A += Bextern mat4 & add(mat4 & A, const mat4 & B);extern mat3 & add(mat3 & A, const mat3 & B);// Computes C = A * Bextern mat4 & mult(mat4 & C, const mat4 & A, const mat4 & B);extern mat3 & mult(mat3 & C, const mat3 & A, const mat3 & B);// Computes B = Transpose(A)// T// B = Aextern mat3 & transpose(mat3 & B, const mat3 & A);extern mat4 & transpose(mat4 & B, const mat4 & A);extern mat3 & transpose(mat3 & B);extern mat4 & transpose(mat4 & B);// Computes B = inverse(A)// -1// B = Aextern mat4 & invert(mat4 & B, const mat4 & A);extern mat3 & invert(mat3 & B, const mat3 & A);// Computes B = inverse(A)// T T// (R t) (R -R t)// assuming that A = (0 1) so that B = (0 1)// B = Aextern mat4 & invert_rot_trans(mat4 & B, const mat4 & A);extern mat4 & look_at(mat4 & M, const vec3 & eye, const vec3 & center, const vec3 & up);extern mat4 & frustum(mat4 & M, const nv_scalar l, const nv_scalar r, const nv_scalar b, const nv_scalar t, const nv_scalar n, const nv_scalar f);extern mat4 & perspective(mat4 & M, const nv_scalar fovy, const nv_scalar aspect, const nv_scalar n, const nv_scalar f);// quaternionextern quat & normalize(quat & p);extern quat & conj(quat & p);extern quat & conj(quat & p, const quat & q);extern quat & add_quats(quat & p, const quat & q1, const quat & q2);extern quat & axis_to_quat(quat & q, const vec3 & a, const nv_scalar phi);extern mat3 & quat_2_mat(mat3 &M, const quat &q );extern quat & mat_2_quat(quat &q,const mat3 &M);extern quat & mat_2_quat(quat &q,const mat4 &M);// surface propertiesextern mat3 & tangent_basis(mat3 & basis,const vec3 & v0,const vec3 & v1,const vec3 & v2,const vec2 & t0,const vec2 & t1,const vec2 & t2, const vec3 & n);// linear interpolationinline nv_scalar lerp(nv_scalar t, nv_scalar a, nv_scalar b){ return a * (nv_one - t) + t * b; }inline vec3 & lerp(vec3 & w, const nv_scalar & t, const vec3 & u, const vec3 & v){ w.x = lerp(t, u.x, v.x); w.y = lerp(t, u.y, v.y); w.z = lerp(t, u.z, v.z); return w; }// utilitiesinline nv_scalar nv_min(const nv_scalar & lambda, const nv_scalar & n){ return (lambda < n ) ? lambda : n; }inline nv_scalar nv_max(const nv_scalar & lambda, const nv_scalar & n){ return (lambda > n ) ? lambda : n; }inline nv_scalar nv_clamp(nv_scalar u, const nv_scalar min, const nv_scalar max){ u = (u < min) ? min : u; u = (u > max) ? max : u; return u; }extern nv_scalar nv_random();extern quat & trackball(quat & q, vec2 & pt1, vec2 & pt2, nv_scalar trackballsize);extern vec3 & cube_map_normal(int i, int x, int y, int cubesize, vec3 & v);// geometry// computes the area of a triangleextern nv_scalar nv_area(const vec3 & v1, const vec3 & v2, const vec3 &v3);// computes the perimeter of a triangleextern nv_scalar nv_perimeter(const vec3 & v1, const vec3 & v2, const vec3 &v3);// find the inscribed circleextern nv_scalar nv_find_in_circle( vec3 & center, const vec3 & v1, const vec3 & v2, const vec3 &v3);// find the circumscribed circleextern nv_scalar nv_find_circ_circle( vec3 & center, const vec3 & v1, const vec3 & v2, const vec3 &v3);// fast cosine functionsextern nv_scalar fast_cos(const nv_scalar x);extern nv_scalar ffast_cos(const nv_scalar x);// determinantnv_scalar det(const mat3 & A);extern void nv_is_valid(const vec3& v);extern void nv_is_valid(nv_scalar lambda);#endif //_nv_algebra_h_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -