Transforms.h tdm/Computations.h tdm/Types.h TDM.h tdm::projective::axis_angle tdm tdm::affine tdm::projective //CopyrightEpicGames,Inc.AllRightsReserved. #pragmaonce #include"tdm/Computations.h" #include"tdm/Types.h" namespacetdm{ inlineconstexprdoublepi(){ return3.14159265358979323846; } template<typenameT> inlinetypenamestd::enable_if<std::is_floating_point<T>::value,T>::typedegrees(Tradians){ staticconstexprconstautoc=static_cast<T>(180.0/pi()); returnc*radians; } template<typenameT> inlinetypenamestd::enable_if<std::is_floating_point<T>::value,T>::typeradians(Tdegrees){ staticconstexprconstautoc=static_cast<T>(pi()/180.0); returnc*degrees; } namespaceaffine{ template<dim_tL,typenameT> inlinemat<L, L, T>scale(constvec<L, T>&factors){ returnmat<L, L, T>::diagonal(factors); } template<dim_tL,typenameT> inlinemat<L, L, T>scale(constmat<L, L, T>&m,constvec<L, T>&factors){ returnm*scale(factors); } template<dim_tL,typenameT> inlinemat<L, L, T>scale(Tfactor){ returnscale(vec<L, T>{factor}); } template<dim_tL,typenameT> inlinemat<L, L, T>scale(constmat<L, L, T>&m,Tfactor){ returnscale(m,vec<L, T>{factor}); } }//namespaceaffine inlinenamespaceprojective{ template<typenameT> inlinemat4<T>rotate(constvec3<T>&axis,Tradians,handednessh=handedness::right){ constTc=std::cos(radians); constTs=std::sin(radians)*static_cast<T>(h); constTone_minus_c=static_cast<T>(1)-c; constvec3<T>n=normalize(axis); returnmat4<T>{n[0]*n[0]*one_minus_c+c, n[1]*n[0]*one_minus_c-n[2]*s, n[2]*n[0]*one_minus_c+n[1]*s, static_cast<T>(0), n[0]*n[1]*one_minus_c+n[2]*s, n[1]*n[1]*one_minus_c+c, n[2]*n[1]*one_minus_c-n[0]*s, static_cast<T>(0), n[0]*n[2]*one_minus_c-n[1]*s, n[1]*n[2]*one_minus_c+n[0]*s, n[2]*n[2]*one_minus_c+c, static_cast<T>(0), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0), static_cast<T>(1)}; } template<typenameT> inlinemat4<T>rotate(constmat4<T>&m,constvec3<T>&axis,Tradians,handednessh=handedness::right){ returnm*rotate(axis,radians,h); } template<typenameT> inlinemat4<T>rotate(TxRadians,TyRadians,TzRadians,handednessh=handedness::right){ constTsx=std::sin(xRadians)*static_cast<T>(h); constTsy=std::sin(yRadians)*static_cast<T>(h); constTsz=std::sin(zRadians)*static_cast<T>(h); constTcx=std::cos(xRadians); constTcy=std::cos(yRadians); constTcz=std::cos(zRadians); autorx=mat4<T>::identity(); rx(1,1)=cx; rx(1,2)=sx; rx(2,1)=-sx; rx(2,2)=cx; autory=mat4<T>::identity(); ry(0,0)=cy; ry(0,2)=-sy; ry(2,0)=sy; ry(2,2)=cy; autorz=mat4<T>::identity(); rz(0,0)=cz; rz(0,1)=sz; rz(1,0)=-sz; rz(1,1)=cz; returnrx*ry*rz; } template<typenameT> inlinemat4<T>rotate(constmat4<T>&m,TxRadians,TyRadians,TzRadians,handednessh=handedness::right){ returnm*rotate(xRadians,yRadians,zRadians,h); } template<typenameT> inlinemat4<T>rotate(constvec3<T>&radians,handednessh=handedness::right){ returnrotate(radians[0],radians[1],radians[2],h); } template<typenameT> inlinemat4<T>rotate(constmat4<T>&m,constvec3<T>&radians,handednessh=handedness::right){ returnm*rotate(radians[0],radians[1],radians[2],h); } template<dim_tL,typenameT> inlinemat<L + 1, L + 1, T>scale(constvec<L, T>&factors){ vec<L + 1, T>diagonal{static_cast<T>(1)}; factors.apply([&diagonal](constT&value,dim_ti){ diagonal[i]=value; }); returnmat<L + 1, L + 1, T>::diagonal(diagonal); } template<dim_tL,typenameT> inlinemat<L + 1, L + 1, T>scale(constmat<L + 1, L + 1, T>&m,constvec<L, T>&factors){ returnm*scale(factors); } template<dim_tL,typenameT> inlinemat<L + 1, L + 1, T>scale(Tfactor){ returnscale(vec<L, T>{factor}); } template<dim_tL,typenameT> inlinemat<L, L, T>scale(constmat<L, L, T>&m,Tfactor){ returnscale(m,vec<L - 1, T>{factor}); } template<dim_tL,typenameT> inlinemat<L + 1, L + 1, T>translate(constvec<L, T>&position){ autom=mat<L + 1, L + 1, T>::identity(); position.apply([&m](constT&value,dim_ti){ m(L,i)=value; }); returnm; } template<dim_tL,typenameT> inlinemat<L + 1, L + 1, T>translate(constmat<L + 1, L + 1, T>&m,constvec<L, T>&position){ returnm*translate(position); } template<typenameT> structaxis_angle{ tdm::vec3<T>axis; Tradians; }; template<typenameT> axis_angle<T>xyz2AxisAngle(TxRadians,TyRadians,TzRadians,handednessh=handedness::right){ constmat4<T>m=rotate(xRadians,yRadians,zRadians,h); constTradians=std::acos((trace(m.templatesubmat<3,3>(0,0))-static_cast<T>(1))/static_cast<T>(2)); constTfactor=static_cast<T>(1)/(static_cast<T>(2)*std::sin(radians)); constTx=factor*(m(2,1)-m(1,2)); constTy=factor*(m(0,2)-m(2,0)); constTz=factor*(m(1,0)-m(0,1)); return{{x,y,z},radians}; } template<typenameT> axis_angle<T>xyz2AxisAngle(constvec3<T>&radians,handednessh=handedness::right){ returnxyz2AxisAngle(radians[0],radians[1],radians[2],h); } }//namespaceprojective }//namespacetdm