📄 nv_algebra.cpp
字号:
/*********************************************************************NVMH1****File:nv_algebra.cppCopyright (C) 1999, 2000 NVIDIA CorporationThis file is provided without support, instruction, or implied warranty of anykind. NVIDIA makes no guarantee of its fitness for a particular purpose and isnot liable under any circumstances for any damages or loss whatsoever arisingfrom the use or inability to use this file or items derived from it.Comments: ******************************************************************************/#ifndef _nv_algebra_h_#include <nv_math/nv_math.h>#endif#ifndef _WIN32#define _isnan isnan#define _finite finite#endifmat3::mat3(){}mat3::mat3(const nv_scalar* array){ memcpy(mat_array, array, sizeof(nv_scalar) * 9);}mat3::mat3(const mat3 & M){ memcpy(mat_array, M.mat_array, sizeof(nv_scalar) * 9);}mat4::mat4(){}mat4::mat4(const nv_scalar* array){ memcpy(mat_array, array, sizeof(nv_scalar) * 16);}mat4::mat4(const mat4& M){ memcpy(mat_array, M.mat_array, sizeof(nv_scalar) * 16);}vec3 & cross(vec3 & u, const vec3 & v, const vec3 & w){ u.x = v.y*w.z - v.z*w.y; u.y = v.z*w.x - v.x*w.z; u.z = v.x*w.y - v.y*w.x; return u;}nv_scalar & dot(nv_scalar& u, const vec3& v, const vec3& w){ u = v.x*w.x + v.y*w.y + v.z*w.z; return u;}nv_scalar dot(const vec3& v, const vec3& w){ return v.x*w.x + v.y*w.y + v.z*w.z;}nv_scalar & dot(nv_scalar& u, const vec4& v, const vec4& w){ u = v.x*w.x + v.y*w.y + v.z*w.z + v.w*w.w; return u;}nv_scalar dot(const vec4& v, const vec4& w){ return v.x*w.x + v.y*w.y + v.z*w.z + v.w*w.w;}nv_scalar & dot(nv_scalar& u, const vec3& v, const vec4& w){ u = v.x*w.x + v.y*w.y + v.z*w.z; return u;}nv_scalar dot(const vec3& v, const vec4& w){ return v.x*w.x + v.y*w.y + v.z*w.z;}nv_scalar & dot(nv_scalar& u, const vec4& v, const vec3& w){ u = v.x*w.x + v.y*w.y + v.z*w.z; return u;}nv_scalar dot(const vec4& v, const vec3& w){ return v.x*w.x + v.y*w.y + v.z*w.z;}vec3 & reflect(vec3& r, const vec3& n, const vec3& l){ nv_scalar n_dot_l; n_dot_l = nv_two * dot(n_dot_l,n,l); mult(r,l,-nv_one); madd(r,n,n_dot_l); return r;}vec3 & madd(vec3 & u, const vec3& v, const nv_scalar& lambda){ u.x += v.x*lambda; u.y += v.y*lambda; u.z += v.z*lambda; return u;}vec3 & mult(vec3 & u, const vec3& v, const nv_scalar& lambda){ u.x = v.x*lambda; u.y = v.y*lambda; u.z = v.z*lambda; return u;}vec3 & mult(vec3 & u, const vec3& v, const vec3& w){ u.x = v.x*w.x; u.y = v.y*w.y; u.z = v.z*w.z; return u;}vec3 & sub(vec3 & u, const vec3& v, const vec3& w){ u.x = v.x - w.x; u.y = v.y - w.y; u.z = v.z - w.z; return u;}vec3 & add(vec3 & u, const vec3& v, const vec3& w){ u.x = v.x + w.x; u.y = v.y + w.y; u.z = v.z + w.z; return u;}nv_scalar vec3::normalize(){ nv_scalar norm = sqrtf(x * x + y * y + z * z); if (norm > nv_eps) norm = nv_one / norm; else norm = nv_zero; x *= norm; y *= norm; z *= norm; return norm;}vec3 & scale(vec3& u, const nv_scalar s){ u.x *= s; u.y *= s; u.z *= s; return u;}vec4 & scale(vec4& u, const nv_scalar s){ u.x *= s; u.y *= s; u.z *= s; u.w *= s; return u;}vec3 & mult(vec3& u, const mat3& M, const vec3& v){ u.x = M.a00 * v.x + M.a01 * v.y + M.a02 * v.z; u.y = M.a10 * v.x + M.a11 * v.y + M.a12 * v.z; u.z = M.a20 * v.x + M.a21 * v.y + M.a22 * v.z; return u;}vec3 & mult(vec3& u, const vec3& v, const mat3& M){ u.x = M.a00 * v.x + M.a10 * v.y + M.a20 * v.z; u.y = M.a01 * v.x + M.a11 * v.y + M.a21 * v.z; u.z = M.a02 * v.x + M.a12 * v.y + M.a22 * v.z; return u;}const vec3 operator*(const mat3& M, const vec3& v){ vec3 u; u.x = M.a00 * v.x + M.a01 * v.y + M.a02 * v.z; u.y = M.a10 * v.x + M.a11 * v.y + M.a12 * v.z; u.z = M.a20 * v.x + M.a21 * v.y + M.a22 * v.z; return u;}const vec3 operator*(const vec3& v, const mat3& M){ vec3 u; u.x = M.a00 * v.x + M.a10 * v.y + M.a20 * v.z; u.y = M.a01 * v.x + M.a11 * v.y + M.a21 * v.z; u.z = M.a02 * v.x + M.a12 * v.y + M.a22 * v.z; return u;}vec4 & mult(vec4& u, const mat4& M, const vec4& v){ u.x = M.a00 * v.x + M.a01 * v.y + M.a02 * v.z + M.a03 * v.w; u.y = M.a10 * v.x + M.a11 * v.y + M.a12 * v.z + M.a13 * v.w; u.z = M.a20 * v.x + M.a21 * v.y + M.a22 * v.z + M.a23 * v.w; u.w = M.a30 * v.x + M.a31 * v.y + M.a32 * v.z + M.a33 * v.w; return u;}vec4 & mult(vec4& u, const vec4& v, const mat4& M){ u.x = M.a00 * v.x + M.a10 * v.y + M.a20 * v.z + M.a30 * v.w; u.y = M.a01 * v.x + M.a11 * v.y + M.a21 * v.z + M.a31 * v.w; u.z = M.a02 * v.x + M.a12 * v.y + M.a22 * v.z + M.a32 * v.w; u.w = M.a03 * v.x + M.a13 * v.y + M.a23 * v.z + M.a33 * v.w; return u;}const vec4 operator*(const mat4& M, const vec4& v){ vec4 u; u.x = M.a00 * v.x + M.a01 * v.y + M.a02 * v.z + M.a03 * v.w; u.y = M.a10 * v.x + M.a11 * v.y + M.a12 * v.z + M.a13 * v.w; u.z = M.a20 * v.x + M.a21 * v.y + M.a22 * v.z + M.a23 * v.w; u.w = M.a30 * v.x + M.a31 * v.y + M.a32 * v.z + M.a33 * v.w; return u;}const vec4 operator*(const vec4& v, const mat4& M){ vec4 u; u.x = M.a00 * v.x + M.a10 * v.y + M.a20 * v.z + M.a30 * v.w; u.y = M.a01 * v.x + M.a11 * v.y + M.a21 * v.z + M.a31 * v.w; u.z = M.a02 * v.x + M.a12 * v.y + M.a22 * v.z + M.a32 * v.w; u.w = M.a03 * v.x + M.a13 * v.y + M.a23 * v.z + M.a33 * v.w; return u;}vec3 & mult_pos(vec3& u, const mat4& M, const vec3& v){ nv_scalar oow = nv_one / (v.x * M.a30 + v.y * M.a31 + v.z * M.a32 + M.a33); u.x = (M.a00 * v.x + M.a01 * v.y + M.a02 * v.z + M.a03) * oow; u.y = (M.a10 * v.x + M.a11 * v.y + M.a12 * v.z + M.a13) * oow; u.z = (M.a20 * v.x + M.a21 * v.y + M.a22 * v.z + M.a23) * oow; return u;}vec3 & mult_pos(vec3& u, const vec3& v, const mat4& M){ nv_scalar oow = nv_one / (v.x * M.a03 + v.y * M.a13 + v.z * M.a23 + M.a33); u.x = (M.a00 * v.x + M.a10 * v.y + M.a20 * v.z + M.a30) * oow; u.y = (M.a01 * v.x + M.a11 * v.y + M.a21 * v.z + M.a31) * oow; u.z = (M.a02 * v.x + M.a12 * v.y + M.a22 * v.z + M.a32) * oow; return u;}vec3 & mult_dir(vec3& u, const mat4& M, const vec3& v){ u.x = M.a00 * v.x + M.a01 * v.y + M.a02 * v.z; u.y = M.a10 * v.x + M.a11 * v.y + M.a12 * v.z; u.z = M.a20 * v.x + M.a21 * v.y + M.a22 * v.z; return u;}vec3 & mult_dir(vec3& u, const vec3& v, const mat4& M){ u.x = M.a00 * v.x + M.a10 * v.y + M.a20 * v.z; u.y = M.a01 * v.x + M.a11 * v.y + M.a21 * v.z; u.z = M.a02 * v.x + M.a12 * v.y + M.a22 * v.z; return u;}vec3 & mult(vec3& u, const mat4& M, const vec3& v){ u.x = M.a00 * v.x + M.a01 * v.y + M.a02 * v.z + M.a03; u.y = M.a10 * v.x + M.a11 * v.y + M.a12 * v.z + M.a13; u.z = M.a20 * v.x + M.a21 * v.y + M.a22 * v.z + M.a23; return u;}vec3 & mult(vec3& u, const vec3& v, const mat4& M){ u.x = M.a00 * v.x + M.a10 * v.y + M.a20 * v.z + M.a30; u.y = M.a01 * v.x + M.a11 * v.y + M.a21 * v.z + M.a31; u.z = M.a02 * v.x + M.a12 * v.y + M.a22 * v.z + M.a32; return u;}mat4 & add(mat4& A, const mat4& B){ A.a00 += B.a00; A.a10 += B.a10; A.a20 += B.a20; A.a30 += B.a30; A.a01 += B.a01; A.a11 += B.a11; A.a21 += B.a21; A.a31 += B.a31; A.a02 += B.a02; A.a12 += B.a12; A.a22 += B.a22; A.a32 += B.a32; A.a03 += B.a03; A.a13 += B.a13; A.a23 += B.a23; A.a33 += B.a33; return A;}mat3 & add(mat3& A, const mat3& B){ A.a00 += B.a00; A.a10 += B.a10; A.a20 += B.a20; A.a01 += B.a01; A.a11 += B.a11; A.a21 += B.a21; A.a02 += B.a02; A.a12 += B.a12; A.a22 += B.a22; return A;}// C = A * B// C.a00 C.a01 C.a02 C.a03 A.a00 A.a01 A.a02 A.a03 B.a00 B.a01 B.a02 B.a03// // C.a10 C.a11 C.a12 C.a13 A.a10 A.a11 A.a12 A.a13 B.a10 B.a11 B.a12 B.a13// // C.a20 C.a21 C.a22 C.a23 A.a20 A.a21 A.a22 A.a23 B.a20 B.a21 B.a22 B.a23 // // C.a30 C.a31 C.a32 C.a33 = A.a30 A.a31 A.a32 A.a33 * B.a30 B.a31 B.a32 B.a33mat4 & mult(mat4& C, const mat4& A, const mat4& B){ C.a00 = A.a00 * B.a00 + A.a01 * B.a10 + A.a02 * B.a20 + A.a03 * B.a30; C.a10 = A.a10 * B.a00 + A.a11 * B.a10 + A.a12 * B.a20 + A.a13 * B.a30; C.a20 = A.a20 * B.a00 + A.a21 * B.a10 + A.a22 * B.a20 + A.a23 * B.a30; C.a30 = A.a30 * B.a00 + A.a31 * B.a10 + A.a32 * B.a20 + A.a33 * B.a30; C.a01 = A.a00 * B.a01 + A.a01 * B.a11 + A.a02 * B.a21 + A.a03 * B.a31; C.a11 = A.a10 * B.a01 + A.a11 * B.a11 + A.a12 * B.a21 + A.a13 * B.a31; C.a21 = A.a20 * B.a01 + A.a21 * B.a11 + A.a22 * B.a21 + A.a23 * B.a31; C.a31 = A.a30 * B.a01 + A.a31 * B.a11 + A.a32 * B.a21 + A.a33 * B.a31; C.a02 = A.a00 * B.a02 + A.a01 * B.a12 + A.a02 * B.a22 + A.a03 * B.a32; C.a12 = A.a10 * B.a02 + A.a11 * B.a12 + A.a12 * B.a22 + A.a13 * B.a32; C.a22 = A.a20 * B.a02 + A.a21 * B.a12 + A.a22 * B.a22 + A.a23 * B.a32; C.a32 = A.a30 * B.a02 + A.a31 * B.a12 + A.a32 * B.a22 + A.a33 * B.a32; C.a03 = A.a00 * B.a03 + A.a01 * B.a13 + A.a02 * B.a23 + A.a03 * B.a33; C.a13 = A.a10 * B.a03 + A.a11 * B.a13 + A.a12 * B.a23 + A.a13 * B.a33; C.a23 = A.a20 * B.a03 + A.a21 * B.a13 + A.a22 * B.a23 + A.a23 * B.a33; C.a33 = A.a30 * B.a03 + A.a31 * B.a13 + A.a32 * B.a23 + A.a33 * B.a33; return C;}mat4 mat4::operator*(const mat4& B) const{ mat4 C; C.a00 = a00 * B.a00 + a01 * B.a10 + a02 * B.a20 + a03 * B.a30; C.a10 = a10 * B.a00 + a11 * B.a10 + a12 * B.a20 + a13 * B.a30; C.a20 = a20 * B.a00 + a21 * B.a10 + a22 * B.a20 + a23 * B.a30; C.a30 = a30 * B.a00 + a31 * B.a10 + a32 * B.a20 + a33 * B.a30; C.a01 = a00 * B.a01 + a01 * B.a11 + a02 * B.a21 + a03 * B.a31; C.a11 = a10 * B.a01 + a11 * B.a11 + a12 * B.a21 + a13 * B.a31; C.a21 = a20 * B.a01 + a21 * B.a11 + a22 * B.a21 + a23 * B.a31; C.a31 = a30 * B.a01 + a31 * B.a11 + a32 * B.a21 + a33 * B.a31; C.a02 = a00 * B.a02 + a01 * B.a12 + a02 * B.a22 + a03 * B.a32; C.a12 = a10 * B.a02 + a11 * B.a12 + a12 * B.a22 + a13 * B.a32; C.a22 = a20 * B.a02 + a21 * B.a12 + a22 * B.a22 + a23 * B.a32; C.a32 = a30 * B.a02 + a31 * B.a12 + a32 * B.a22 + a33 * B.a32; C.a03 = a00 * B.a03 + a01 * B.a13 + a02 * B.a23 + a03 * B.a33; C.a13 = a10 * B.a03 + a11 * B.a13 + a12 * B.a23 + a13 * B.a33; C.a23 = a20 * B.a03 + a21 * B.a13 + a22 * B.a23 + a23 * B.a33; C.a33 = a30 * B.a03 + a31 * B.a13 + a32 * B.a23 + a33 * B.a33; return C;}// C = A * B// C.a00 C.a01 C.a02 A.a00 A.a01 A.a02 B.a00 B.a01 B.a02// // C.a10 C.a11 C.a12 A.a10 A.a11 A.a12 B.a10 B.a11 B.a12// // C.a20 C.a21 C.a22 = A.a20 A.a21 A.a22 * B.a20 B.a21 B.a22mat3 & mult(mat3& C, const mat3& A, const mat3& B){ C.a00 = A.a00 * B.a00 + A.a01 * B.a10 + A.a02 * B.a20; C.a10 = A.a10 * B.a00 + A.a11 * B.a10 + A.a12 * B.a20; C.a20 = A.a20 * B.a00 + A.a21 * B.a10 + A.a22 * B.a20; C.a01 = A.a00 * B.a01 + A.a01 * B.a11 + A.a02 * B.a21; C.a11 = A.a10 * B.a01 + A.a11 * B.a11 + A.a12 * B.a21; C.a21 = A.a20 * B.a01 + A.a21 * B.a11 + A.a22 * B.a21; C.a02 = A.a00 * B.a02 + A.a01 * B.a12 + A.a02 * B.a22; C.a12 = A.a10 * B.a02 + A.a11 * B.a12 + A.a12 * B.a22; C.a22 = A.a20 * B.a02 + A.a21 * B.a12 + A.a22 * B.a22; return C;}mat3 & transpose(mat3& A){ nv_scalar tmp; tmp = A.a01; A.a01 = A.a10; A.a10 = tmp; tmp = A.a02; A.a02 = A.a20; A.a20 = tmp; tmp = A.a12; A.a12 = A.a21; A.a21 = tmp; return A;}mat4 & transpose(mat4& A){ nv_scalar tmp; tmp = A.a01; A.a01 = A.a10; A.a10 = tmp; tmp = A.a02; A.a02 = A.a20; A.a20 = tmp; tmp = A.a03; A.a03 = A.a30; A.a30 = tmp; tmp = A.a12; A.a12 = A.a21; A.a21 = tmp; tmp = A.a13; A.a13 = A.a31; A.a31 = tmp; tmp = A.a23; A.a23 = A.a32; A.a32 = tmp; return A;}mat4 & transpose(mat4& B, const mat4& A){ B.a00 = A.a00; B.a01 = A.a10; B.a02 = A.a20; B.a03 = A.a30; B.a10 = A.a01; B.a11 = A.a11; B.a12 = A.a21; B.a13 = A.a31; B.a20 = A.a02; B.a21 = A.a12; B.a22 = A.a22; B.a23 = A.a32; B.a30 = A.a03; B.a31 = A.a13; B.a32 = A.a23; B.a33 = A.a33; return B;}mat3 & transpose(mat3& B, const mat3& A){ B.a00 = A.a00; B.a01 = A.a10; B.a02 = A.a20; B.a10 = A.a01; B.a11 = A.a11; B.a12 = A.a21;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -