About Monkey 2 › Forums › Monkey 2 Programming Help › cpp Math
This topic contains 8 replies, has 3 voices, and was last updated by
abakobo
1 year, 9 months ago.
-
AuthorPosts
-
June 28, 2017 at 12:49 am #8976
I just installed the new build after a break so whats new in the c++ compatibility can i just include this as a .h?
i could just redo it in monkey but why reinvent the wheel when i have a math lib of my own already done.
[/crayon]Monkey123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116[crayon-5cb9bc5d2eff9259458774 inline="true" ]struct sVector3{float x, y, z;//sVector3() = default;//sVector3(float a, float b, float c){x = a;y = b;z = c;}//Float& operator [](int i){return ((&x)[i]);}//const float& operator [](int i) const{return ((&x)[i]);}//sVector3& operator *=(float s){x *= s;y *= s;z *= s;return (*this);}//sVector3& operator /=(float s){s = 1.0F / s;x *= s;y *= s;z *= s;return (*this);}//sVector3& operator +=(const sVector3& v){x += v.x;y += v.y;z += v.z;return (*this);}//sVector3& operator -=(const sVector3& v){x -= v.x;y -= v.y;z -= v.z;return (*this);}};//inline sVector3 operator *(const sVector3& v, float s){return (sVector3(v.x * s, v.y * s, v.z * s));}//inline sVector3 operator /(const sVector3& v, float s){s = 1.0F / s;return (sVector3(v.x * s, v.y * s, v.z * s));}//inline sVector3 operator -(const sVector3& v){return (sVector3(-v.x, -v.y, -v.z));}//inline float Dot(const sVector3& a, const sVector3& b){return (a.x * b.x + a.y * b.y + a.z * b.z);}//inline sVector3 Cross(const sVector3& a, const sVector3& b){return (sVector3(a.y * b.z - a.z * b.y,a.z * b.x - a.x * b.z,a.x * b.y - a.y * b.x));}//inline sVector3 Project(const sVector3& a, const sVector3& b){return (b * (Dot(a, b) / Dot(b, b)));}//inline sVector3 Reject(const sVector3& a, const sVector3& b){return (a - b * (Dot(a, b) / Dot(b, b)));}//inline float Magnitude(const sVector3& v){return (sqrt(v.x * v.x + v.y * v.y + v.z * v.z));}//inline sVector3 Normalize(const sVector3& v){return (v / Magnitude(v));}//inline sVector3 operator +(const sVector3& a, const sVector3& b){return (Vector3D(a.x + b.x, a.y + b.y, a.z + b.z));}//inline sVector3 operator -(const sVector3& a, const sVector3& b){return (sVector3(a.x - b.x, a.y - b.y, a.z - b.z));}June 28, 2017 at 1:45 am #8977You will have to write a monkey ‘extern wrapper’ for it, or you could try using std.geom.Vec3f.
June 28, 2017 at 2:05 am #8979ok i can live with that i spent a damn long time learning the maths to create thee lib so il be damned if i dont get some use out of it.
its using grassmann algebra for matrix3/4, translation, reflection, Quaternions etc
just want to put it to use.
June 28, 2017 at 7:05 pm #8998ok so far i have got a few things done BUT whats the best way to bring in the operators from cpp to mx2?
i.e.[/crayon]Monkey123456789101112131415161718192021222324252627282930313233343536373839404142434445[crayon-5cb9bc5d3c6db738667057 inline="true" ]struct sMatrix3{private:float n[3][3];public:sMatrix3() = default;//sMatrix3(float p_InputN00, float p_InputN01, float p_InputN02,float p_InputN10, float p_InputN11, float p_InputN12,float p_InputN20, float p_InputN21, float p_InputN22){n[0][0] = p_InputN00; n[0][1] = p_InputN10; n[0][2] = p_InputN20;n[1][0] = p_InputN01; n[1][1] = p_InputN11; n[1][2] = p_InputN21;n[2][0] = p_InputN20; n[2][1] = p_InputN12; n[2][2] = p_InputN22;}//sMatrix3(const sVector3& p_InputA, const sVector3& p_InputB, const sVector3& p_InputC){n[0][0] = p_InputA.x; n[0][1] = p_InputA.y; n[0][2] = p_InputA.z;n[1][0] = p_InputB.x; n[1][1] = p_InputB.y; n[1][2] = p_InputB.z;n[2][0] = p_InputC.x; n[2][1] = p_InputC.y; n[2][2] = p_InputC.z;}//float& operator ()(int p_InputI, int p_InputJ){return (n[p_InputJ][p_InputI]);}//const float& operator ()(int p_InputI, int p_InputJ) const{return (n[p_InputJ][p_InputI]);}//sVector3& operator [](int p_InputJ){return (*reinterpret_cast<sVector3 *>(n[p_InputJ]));}//const sVector3& operator [](int p_InputJ) const{return (*reinterpret_cast<const sVector3 *>(n[p_InputJ]));}};[/crayon]Monkey123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241[crayon-5cb9bc5d3c6e4380372862 inline="true" ]'////////////////////////////////////////////////////////////////////////////////////////////////////////////'//'// Damian Yarker 2017'//'//'/////////////////////////////////////////////////////////////////////////////////////////////////////////////#Import "<std>"#Import "<mojo>"'/////////////////////////////////////////////////////////////////////////////////////////////////////////////#Import "Math.h"'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Using std..Using mojo..'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Extern'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sVector2'//Field x:Float, y:Float'//Method New:sVector2()'//Method New:sVector2(p_InputA:Float, p_InputB:Float)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sVector3'//Field x:float, y:Float, z:Float'//Method New:sVector3()'//Method New:sVector3(p_InputA:Float, p_InputB:Float, p_InputC:Float)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sVector4'//Field x:float, y:Float, z:Float, w:Float'//Method New:sVector4()'//Method New:sVector4(p_InputA:Float, p_InputB:Float, p_InputC:Float, p_InputW:Float)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sPoint2'//Method New:sPoint2()'//Method New:sPoint2(p_InputA:Float, p_InputB:Float)'//'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sPoint3'//Method New:sPoint3()'//Method New:sPoint3(p_InputA:Float, p_InputB:Float, p_InputC:Float)'//'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sPoint4'//Method New:sPoint4()'//Method New:sPoint4(p_InputA:Float, p_InputB:Float, p_InputC:Float, p_InputW:Float)'//'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sMatrix3'//Method New:sMatrix3()'//Method New:sMatrix3(p_InputN00:Float, p_InputN01:Float, p_InputN02:float,p_InputN10:Float, p_InputN11:Float, p_InputN12:float,p_InputN20:Float, p_InputN21:Float, p_InputN22:float)'//Method New:sMatrix3(p_InputA:sVector3, p_InputB:sVector3, p_InputC:sVector3)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sMatrix4'//Method New:sMatrix4()'//Method New:sMatrix4(p_InputN00:Float, p_InputN01:Float, p_InputN02:Float, p_InputN03:Float,p_InputN10:Float, p_InputN11:Float, p_InputN12:Float, p_InputN13:Float,p_InputN20:Float, p_InputN21:Float, p_InputN22:Float, p_InputN23:Float,p_InputN30:Float, p_InputN31:Float, p_InputN32:Float, p_InputN33:Float)'//Method New:sMatrix4(p_InputA:sVector4, p_InputB:sVector4, p_InputC:sVector4, p_InputD:sVector4)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sTransform4'//Method New:sTransform4()'//Method New:sTransform4(p_InputN00:Float, p_InputN01:Float, p_InputN02:Float, p_InputN03:Float,p_InputN10:Float, p_InputN11:Float, p_InputN12:Float, p_InputN13:Float,p_InputN20:Float, p_InputN21:Float, p_InputN22:Float, p_InputN23:Float)'//Method sTransform4(p_InputA:sVector3, p_InputB:sVector3,p_InputC:sVector3, p_InputP:sVector3)'//Method viGetTranslation:sPoint3(Void)'//Method viSetTranslation:void(p_InputP:sPoint3)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sQuaternion'//Field x:float, y:Float, z:Float, w:Float'//Method New:sQuaternion()'//Method New:sQuaternion(p_InputA:Float, p_InputB:Float, p_InputC:Float, p_InputS:Float)'//Method New:sQuaternion(p_InputV:sVector3, p_InputS:Float)'//Method viGetVectorPart:sVector3(void)'//Method viGetRotationMatrix:sMatrix3(void)'//Method viSetRotationMatrix:Void(p_InputM:sMatrix3)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sPlane'//Field x:float, y:Float, z:Float, w:Float'//Method New:sPlane()'//Method New:sPlane(p_InputNX:Float, p_InputNY:Float, p_InputNZ:Float, p_InputD:Float)'//Method New:sPlane(p_InputN:sVector3, p_InputD:Float)'//Method viGetNormal:sVector3(void)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Struct sLine'//Method New:sLine()'//Method New:sLine(p_InputVX:Float, p_InputVY:Float, p_InputVZ:Float, p_InputMX:Float, p_InputMY:Float, p_InputMZ:Float)'//Method New:sLine(p_InputV:sVector3, p_InputM:sVector3)'//End Struct'/////////////////////////////////////////////////////////////////////////////////////////////////////////////Function viDot:Float(p_InputV1:sVector2, p_InputV2:sVector2)'//Function viProjectOnto:sVector2(p_InputV1:sVector2, p_InputV2:sVector2)'//Function viMagnitude:Float(p_InputV:sVector2)'//Function viNormalize:sVector2(p_InputV:sVector2)'//Function viSquaredMag:Float(p_InputV:sVector2)'//Function viDot:Float(p_InputV1:sVector3, p_InputV2:sVector3)'//Function viCross:sVector3(p_InputA:sVector3, p_InputB:sVector3)'//Function viMagnitude:Float(p_InputV:sVector3)'//Function viNormalize:sVector3(p_InputV:sVector3)'//Function viProject:sVector3(p_InputA:sVector3, p_InputB:sVector3)'//Function viReject:sVector3(p_InputA:sVector3, p_InputB:sVector3)'//Function viDeterminant:Float(p_InputM:sMatrix3)'//Function viInverse:sMatrix3(p_InputM:sMatrix3)'//Function viInverse:sMatrix4(p_InputM:sMatrix4)'//Function viMakeRotationX:sMatrix3(p_InputT:Float)'//Function viMakeRotationY:sMatrix3(p_InputT:Float)'//Function viMakeRotationZ:sMatrix3(p_InputT:Float)'//Function viMakeRotation:sMatrix3(p_InputT:Float, p_InputA:sVector3)'//Function viMakeReflections:sMatrix3(p_InputA:sVector3)'//Function viMakeInvolution:sMatrix3(p_InputA:sVector3)'//Function viMakeScale:sMatrix3(p_InputSX:Float, p_InputSY:Float, p_InputSZ:Float)'//Function viMakeScale:sMatrix3(p_InputS:Float, p_InputA:sVector3)'//Function viMakeSkew:sMatrix3(p_InputT:Float, p_InputA:sVector3, p_InputB:sVector3)'//Function viInverse:sTransform4(p_InputH:sTransform4)'//Function viTransform:sVector3(p_InputV:sVector3, p_InputQ:sQuaternion)'//Function viGetRotationMatrix:sMatrix3(void)'//Function viSetRotationMatrix:void(p_InputM:sMatrix3)'//Function viDistPointLine:Float(p_InputQ:sPoint3, p_InputP:sPoint3, p_InputV:sVector3)'//Function viDistLineLine:Float(p_InputP1:sPoint3, p_InputV1:sVector3, p_InputP2:sPoint3, p_InputV2:sVector3)'//Function viDot:Float(p_InputF:sPlane, p_InputV:sVector3)'//Function viDot:Float(p_InputF:sPlane, p_InputP:sPoint3)'//Function viMakeReflection:sTransform4(p_InputF:sPlane)'//Function viIntersectLinePlane:Float(p_InputP:sPoint3, p_InputV:sVector3, p_InputF:sPlane, p_InputQ:sPoint3)'//Function viIntersectThreePlanes:bool(p_InputF1:sPlane, p_InputF2:sPlane, p_InputF3:sPlane, p_InputP:sPoint3)'//Function viIntersectTwoPlanes:Bool(p_InputF1:sPlane, p_InputF2:sPlane, p_InputP:sPoint3, p_InputV:sVector3)'//Function viTransform:sLine(p_InputLine:sLine, p_InputH:sTransform4)'//PublicFunction Main:Void()New AppInstanceApp.Run()End FunctionJune 28, 2017 at 8:49 pm #9000There is no way to extern operators.
Monkey2 is not a cpp ‘translator’ or emulator, it is its own language that generates simplified c++ behind the scenes.
It does not support all c++ functionality and there are many things you can do in c++ that you cannot do in monkey2.
Why not just stick with c++? What are you hoping to gain by wrapping highly specialized c++ code in monkey2?
June 28, 2017 at 9:07 pm #9008I wanted to reuse as much code from my c++ libs as i can rather than full remakes so the better MX2 supports c++ the easier to bring it in.
Also i now agree with this last statement i will stick with c++ i just wanted a toy to rad stuff and mx2 supposedly supports c++ the docs dont even say what you can or cant do.
Well if that’s the case why even bother being able to use c++? Drop it full stop why bother if it wont fully be compatible.
Partial c++ support is not a great advertisement point.
Go big or go home!June 28, 2017 at 9:15 pm #9009Quite understand!
I am actually only aiming for ‘useful c++ support’. Full c++ support would be impossible without duplicating all of c++’s features (and quirks). But there’s enough in there to be able to use bullet, litehtml, libtheora etc. from monkey2 which is what I was aiming for.
Will update docs too to at least mention what you can’t do with extern.
June 28, 2017 at 9:29 pm #9010This is what i wanted to import but all i get are errors as i overload the operators the code is not that advanced but for speed i want to keep it as cpp.
its the math lib i built for my dx framework that i was trying to also bring in but MX2 didnt like directx math so i built one but seems like it dont like my maths also lol.
[/crayon]Monkey1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162[crayon-5cb9bc5d52c4c839706590 inline="true" ]//namespace viEngineSDK {//struct sVector2{float x, y;//sVector2() = default;//sVector2(float p_InputA, float p_InputS){x = p_InputA;y = p_InputS;}//float& operator [](long p_InputK){return ((&x)[p_InputK]);}//const float& operator [](long p_InputK) const{return ((&x)[p_InputK]);}//sVector2& operator +=(const sVector2& p_InputV){x += p_InputV.x;y += p_InputV.y;return (*this);}//sVector2& operator -=(const sVector2& p_InputV){x -= p_InputV.x;y -= p_InputV.y;return (*this);}//sVector2& operator *=(float p_InputT){x *= p_InputT;y *= p_InputT;return (*this);}//sVector2& operator /=(float p_InputT){float f = 1.0F / p_InputT;x *= f;y *= f;return (*this);}//sVector2& operator &=(const sVector2& p_InputV){x *= p_InputV.x;y *= p_InputV.y;return (*this);}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sVector3{float x, y, z;//sVector3() = default;//sVector3(float p_InputA, float p_InputB, float p_InputC){x = p_InputA;y = p_InputB;z = p_InputC;}//float& operator [](int p_InputI){return ((&x)[p_InputI]);}//const float& operator [](int p_InputI) const{return ((&x)[p_InputI]);}//sVector3& operator *=(float p_InputS){x *= p_InputS;y *= p_InputS;z *= p_InputS;return (*this);}//sVector3& operator /=(float p_InputS){p_InputS = 1.0F / p_InputS;x *= p_InputS;y *= p_InputS;z *= p_InputS;return (*this);}//sVector3& operator +=(const sVector3& p_InputV){x += p_InputV.x;y += p_InputV.y;z += p_InputV.z;return (*this);}//sVector3& operator -=(const sVector3& p_InputV){x -= p_InputV.x;y -= p_InputV.y;z -= p_InputV.z;return (*this);}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sVector4{float x, y, z, w;//sVector4() = default;//sVector4(float p_InputA, float p_InputB, float p_InputC, float p_InputD){x = p_InputA;y = p_InputB;z = p_InputC;w = p_InputD;}//float& operator [](int p_InputI){return ((&x)[p_InputI]);}//const float& operator [](int p_InputI) const{return ((&x)[p_InputI]);}//sVector4& operator *=(float p_InputS){x *= p_InputS;y *= p_InputS;z *= p_InputS;w *= p_InputS;return (*this);}//sVector4& operator /=(float p_InputS){p_InputS = 1.0F / p_InputS;x *= p_InputS;y *= p_InputS;z *= p_InputS;w *= p_InputS;return (*this);}//sVector4& operator +=(const sVector4& p_InputV){x += p_InputV.x;y += p_InputV.y;z += p_InputV.z;w += p_InputV.w;return (*this);}//sVector4& operator -=(const sVector4& p_InputV){x -= p_InputV.x;y -= p_InputV.y;z -= p_InputV.z;w -= p_InputV.w;return (*this);}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sPoint2 : sVector2{sPoint2() = default;//sPoint2(float p_InputA, float p_InputS) : sVector2(p_InputA, p_InputS) {}//sPoint2& operator =(const sVector2& p_InputV){x = p_InputV.x;y = p_InputV.y;return (*this);}//sPoint2& operator *=(float p_InputT){x *= p_InputT;y *= p_InputT;return (*this);}//sPoint2& operator /=(float p_InputT){float f = 1.0F / p_InputT;x *= f;y *= f;return (*this);}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sPoint3 : sVector3{sPoint3() = default;//sPoint3(float p_InputA, float p_InputB, float p_InputC) : sVector3(p_InputA, p_InputB, p_InputC) {}//sPoint3& operator =(const sVector3& p_InputV){x = p_InputV.x;y = p_InputV.y;z = p_InputV.z;return (*this);}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sPoint4 : sVector4{sPoint4() = default;//sPoint4(float p_InputA, float p_InputB, float p_InputC, float p_InputD) : sVector4(p_InputA, p_InputB, p_InputC, p_InputD) {}//sPoint4& operator =(const sVector4& p_InputV){x = p_InputV.x;y = p_InputV.y;z = p_InputV.z;w = p_InputV.w;return (*this);}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sMatrix3{private:float n[3][3];public:sMatrix3() = default;//sMatrix3(float p_InputN00, float p_InputN01, float p_InputN02,float p_InputN10, float p_InputN11, float p_InputN12,float p_InputN20, float p_InputN21, float p_InputN22){n[0][0] = p_InputN00; n[0][1] = p_InputN10; n[0][2] = p_InputN20;n[1][0] = p_InputN01; n[1][1] = p_InputN11; n[1][2] = p_InputN21;n[2][0] = p_InputN20; n[2][1] = p_InputN12; n[2][2] = p_InputN22;}//sMatrix3(const sVector3& p_InputA, const sVector3& p_InputB, const sVector3& p_InputC){n[0][0] = p_InputA.x; n[0][1] = p_InputA.y; n[0][2] = p_InputA.z;n[1][0] = p_InputB.x; n[1][1] = p_InputB.y; n[1][2] = p_InputB.z;n[2][0] = p_InputC.x; n[2][1] = p_InputC.y; n[2][2] = p_InputC.z;}//float& operator ()(int p_InputI, int p_InputJ){return (n[p_InputJ][p_InputI]);}//const float& operator ()(int p_InputI, int p_InputJ) const{return (n[p_InputJ][p_InputI]);}//sVector3& operator [](int p_InputJ){return (*reinterpret_cast<sVector3 *>(n[p_InputJ]));}//const sVector3& operator [](int p_InputJ) const{return (*reinterpret_cast<const sVector3 *>(n[p_InputJ]));}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sMatrix4{protected:float n[4][4];public:sMatrix4() = default;//sMatrix4(float p_InputN00, float p_InputN01, float p_InputN02, float p_InputN03,float p_InputN10, float p_InputN11, float p_InputN12, float p_InputN13,float p_InputN20, float p_InputN21, float p_InputN22, float p_InputN23,float p_InputN30, float p_InputN31, float p_InputN32, float p_InputN33){n[0][0] = p_InputN00; n[0][1] = p_InputN10; n[0][2] = p_InputN20; n[0][3] = p_InputN30;n[1][0] = p_InputN01; n[1][1] = p_InputN11; n[1][2] = p_InputN21; n[1][3] = p_InputN31;n[2][0] = p_InputN02; n[2][1] = p_InputN12; n[2][2] = p_InputN22; n[2][3] = p_InputN32;n[3][0] = p_InputN03; n[3][1] = p_InputN13; n[3][2] = p_InputN23; n[3][3] = p_InputN33;}//sMatrix4(const sVector4& p_InputA, const sVector4& p_InputB, const sVector4& p_InputC, const sVector4& p_InputD){n[0][0] = p_InputA.x; n[0][1] = p_InputA.y; n[0][2] = p_InputA.z; n[0][3] = p_InputA.w;n[1][0] = p_InputB.x; n[1][1] = p_InputB.y; n[1][2] = p_InputB.z; n[1][3] = p_InputB.w;n[2][0] = p_InputC.x; n[2][1] = p_InputC.y; n[2][2] = p_InputC.z; n[2][3] = p_InputC.w;n[3][0] = p_InputD.x; n[3][1] = p_InputD.y; n[3][2] = p_InputD.z; n[3][3] = p_InputD.w;}//float& operator ()(int p_InputI, int p_InputJ){return (n[p_InputJ][p_InputI]);}//const float& operator ()(int p_InputI, int p_InputJ) const{return (n[p_InputJ][p_InputI]);}//sVector4& operator [](int p_InputJ){return (*reinterpret_cast<sVector4 *>(n[p_InputJ]));}//const sVector4& operator [](int p_InputJ) const{return (*reinterpret_cast<const sVector4 *>(n[p_InputJ]));}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sTransform4 : sMatrix4{sTransform4() = default;//sTransform4(float p_InputN00, float p_InputN01, float p_InputN02, float p_InputN03,float p_InputN10, float p_InputN11, float p_InputN12, float p_InputN13,float p_InputN20, float p_InputN21, float p_InputN22, float p_InputN23){n[0][0] = p_InputN00; n[0][1] = p_InputN10; n[0][2] = p_InputN20;n[1][0] = p_InputN01; n[1][1] = p_InputN11; n[1][2] = p_InputN21;n[2][0] = p_InputN02; n[2][1] = p_InputN12; n[2][2] = p_InputN22;n[3][0] = p_InputN03; n[3][1] = p_InputN13; n[3][2] = p_InputN23;//n[0][3] = n[1][3] = n[2][3] = 0.0F;n[3][3] = 1.0F;}//sTransform4(const sVector3& p_InputA, const sVector3& p_InputB,const sVector3& p_InputC, const sPoint3& p_InputP){n[0][0] = p_InputA.x; n[0][1] = p_InputA.y; n[0][2] = p_InputA.z;n[1][0] = p_InputB.x; n[1][1] = p_InputB.y; n[1][2] = p_InputB.z;n[2][0] = p_InputC.x; n[2][1] = p_InputC.y; n[2][2] = p_InputC.z;n[3][0] = p_InputP.x; n[3][1] = p_InputP.y; n[3][2] = p_InputP.z;//n[0][3] = n[1][3] = n[2][3] = 0.0F;n[3][3] = 1.0F;}//sVector3& operator [](int p_InputJ){return (*reinterpret_cast<sVector3 *>(n[p_InputJ]));}//const sVector3& operator [](int p_InputJ) const{return (*reinterpret_cast<const sVector3 *>(n[p_InputJ]));}//const sPoint3& viGetTranslation(void) const{return (*reinterpret_cast<const sPoint3 *>(n[3]));}//void viSetTranslation(const sPoint3& p_InputP){n[3][0] = p_InputP.x;n[3][1] = p_InputP.y;n[3][2] = p_InputP.z;}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sQuaternion{float x, y, z, w;//sQuaternion() = default;//sQuaternion(float p_InputA, float p_InputB, float p_InputC, float p_InputS){x = p_InputA; y = p_InputB; z = p_InputC;w = p_InputS;}//sQuaternion(const sVector3& p_InputV, float p_InputS){x = p_InputV.x; y = p_InputV.y; z = p_InputV.z;w = p_InputS;}//sVector3& viGetVectorPart(void){return (reinterpret_cast<sVector3&>(x));}//const sVector3& viGetVectorPart(void) const{return (reinterpret_cast<const sVector3&>(x));}//sMatrix3 viGetRotationMatrix(void);void viSetRotationMatrix(const sMatrix3& p_InputM);};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sPlane{float x, y, z, w;//sPlane() = default;//sPlane(float p_InputNX, float p_InputNY, float p_InputNZ, float p_InputD){x = p_InputNX;y = p_InputNY;z = p_InputNZ;w = p_InputD;}//sPlane(const sVector3& p_InputN, float p_InputD){x = p_InputN.x;y = p_InputN.y;z = p_InputN.z;w = p_InputD;}//const sVector3& viGetNormal(void) const{return (reinterpret_cast<const sVector3&>(x));}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////struct sLine{sVector3 direction;sVector3 moment;//sLine() = default;//sLine(float p_InputVX, float p_InputVY, float p_InputVZ, float p_InputMX, float p_InputMY, float p_InputMZ) :direction(p_InputVX, p_InputVY, p_InputVZ), moment(p_InputMX, p_InputMY, p_InputMZ){}//sLine(const sVector3& p_InputV, const sVector3& p_InputM){direction = p_InputV;moment = p_InputM;}};/////////////////////////////////////////////////////////////////////////////////////////////////////////////inline sPoint2 operator -(const sPoint2& p_InputP){return (sPoint2(-p_InputP.x, -p_InputP.y));}//inline sPoint2 operator +(const sPoint2& p_InputP1, const sPoint2& p_InputP2){return (sPoint2(p_InputP1.x + p_InputP2.x, p_InputP1.y + p_InputP2.y));}//inline sPoint2 operator +(const sPoint2& p_InputP, const sVector2& p_InputV){return (sPoint2(p_InputP.x + p_InputV.x, p_InputP.y + p_InputV.y));}//inline sPoint2 operator -(const sPoint2& p_InputP, const sVector2& p_InputV){return (sPoint2(p_InputP.x - p_InputV.x, p_InputP.y - p_InputV.y));}//inline sVector2 operator -(const sPoint2& p_InputP1, const sPoint2& p_InputP2){return (sVector2(p_InputP1.x - p_InputP2.x, p_InputP1.y - p_InputP2.y));}//inline sPoint2 operator *(const sPoint2& p_InputP, float p_InputT){return (sPoint2(p_InputP.x * p_InputT, p_InputP.y * p_InputT));}//inline sPoint2 operator *(float p_InputT, const sPoint2& p_InputP){return (sPoint2(p_InputT * p_InputP.x, p_InputT * p_InputP.y));}//inline sPoint2 operator /(const sPoint2& p_InputP, float p_InputT){float f = 1.0F / p_InputT;return (sPoint2(p_InputP.x * f, p_InputP.y * f));}//inline float viDot(const sVector2& p_InputV1, const sVector2& p_InputV2){return (p_InputV1 * p_InputV2);}//inline sVector2 viProjectOnto(const sVector2& p_InputV1, const sVector2& p_InputV2){return (p_InputV2 * (p_InputV1 * p_InputV2));}//inline float viMagnitude(const sVector2& p_InputV){return (sqrt(p_InputV.x * p_InputV.x + p_InputV.y * p_InputV.y));}//inline sVector2 viNormalize(const sVector2& p_InputV){return (p_InputV / viMagnitude(p_InputV));}//inline float viSquaredMag(const sVector2& p_InputV){return (p_InputV.x * p_InputV.x + p_InputV.y * p_InputV.y);}//inline sVector2 operator -(const sVector2& p_InputV){return (sVector2(-p_InputV.x, -p_InputV.y));}//inline sVector2 operator +(const sVector2& p_InputV1, const sVector2& p_InputV2){return (sVector2(p_InputV1.x + p_InputV2.x, p_InputV1.y + p_InputV2.y));}//inline sVector2 operator -(const sVector2& p_InputV1, const sVector2& p_InputV2){return (sVector2(p_InputV1.x - p_InputV2.x, p_InputV1.y - p_InputV2.y));}//inline sVector2 operator *(const sVector2& p_InputV, float p_InputT){return (sVector2(p_InputV.x * p_InputT, p_InputV.y * p_InputT));}//inline sVector2 operator *(float p_InputT, const sVector2& p_InputV){return (sVector2(p_InputT * p_InputV.x, p_InputT * p_InputV.y));}//inline sVector2 operator /(const sVector2& p_InputV, float p_InputT){float f = 1.0F / p_InputT;return (sVector2(p_InputV.x * f, p_InputV.y * f));}//inline float operator *(const sVector2& p_InputV1, const sVector2& p_InputV2){return (p_InputV1.x * p_InputV2.x + p_InputV1.y * p_InputV2.y);}//inline sVector2 operator &(const sVector2& p_InputV1, const sVector2& p_InputV2){return (sVector2(p_InputV1.x * p_InputV2.x, p_InputV1.y * p_InputV2.y));}//inline bool operator ==(const sVector2& p_InputV1, const sVector2& p_InputV2){return ((p_InputV1.x == p_InputV2.x) && (p_InputV1.y == p_InputV2.y));}//inline bool operator !=(const sVector2& p_InputV1, const sVector2& p_InputV2){return ((p_InputV1.x != p_InputV2.x) || (p_InputV1.y != p_InputV2.y));}//inline sVector3 operator *(const sVector3& p_InputV, float p_InputS){return (sVector3(p_InputV.x * p_InputS, p_InputV.y * p_InputS, p_InputV.z * p_InputS));}//inline sVector3 operator /(const sVector3& p_InputV, float p_InputS){p_InputS = 1.0F / p_InputS;return (sVector3(p_InputV.x * p_InputS, p_InputV.y * p_InputS, p_InputV.z * p_InputS));}//inline sVector3 operator -(const sVector3& p_InputV){return (sVector3(-p_InputV.x, -p_InputV.y, -p_InputV.z));}//inline float viMagnitude(const sVector3& p_InputV){return (sqrt(p_InputV.x * p_InputV.x + p_InputV.y * p_InputV.y + p_InputV.z * p_InputV.z));}//inline sVector3 viNormalize(const sVector3& p_InputV){return (p_InputV / viMagnitude(p_InputV));}//inline sVector3 operator +(const sVector3& p_InputA, const sVector3& p_InputB){return (sVector3(p_InputA.x + p_InputB.x, p_InputA.y + p_InputB.y, p_InputA.z + p_InputB.z));}//inline sVector3 operator -(const sVector3& p_InputA, const sVector3& p_InputB){return (sVector3(p_InputA.x - p_InputB.x, p_InputA.y - p_InputB.y, p_InputA.z - p_InputB.z));}//sMatrix3 operator *(const sMatrix3& p_InputA, const sMatrix3& p_InputB){return (sMatrix3(p_InputA(0, 0) * p_InputB(0, 0) + p_InputA(0, 1) * p_InputB(1, 0) + p_InputA(0, 2) * p_InputB(2, 0),p_InputA(0, 0) * p_InputB(0, 1) + p_InputA(0, 1) * p_InputB(1, 1) + p_InputA(0, 2) * p_InputB(2, 1),p_InputA(0, 0) * p_InputB(0, 2) + p_InputA(0, 1) * p_InputB(1, 2) + p_InputA(0, 2) * p_InputB(2, 2),p_InputA(1, 0) * p_InputB(0, 0) + p_InputA(1, 1) * p_InputB(1, 0) + p_InputA(1, 2) * p_InputB(2, 0),p_InputA(1, 0) * p_InputB(0, 1) + p_InputA(1, 1) * p_InputB(1, 1) + p_InputA(1, 2) * p_InputB(2, 1),p_InputA(1, 0) * p_InputB(0, 2) + p_InputA(1, 1) * p_InputB(1, 2) + p_InputA(1, 2) * p_InputB(2, 2),p_InputA(2, 0) * p_InputB(0, 0) + p_InputA(2, 1) * p_InputB(1, 0) + p_InputA(2, 2) * p_InputB(2, 0),p_InputA(2, 0) * p_InputB(0, 1) + p_InputA(2, 1) * p_InputB(1, 1) + p_InputA(2, 2) * p_InputB(2, 1),p_InputA(2, 0) * p_InputB(0, 2) + p_InputA(2, 1) * p_InputB(1, 2) + p_InputA(2, 2) * p_InputB(2, 2)));}//sVector3 operator *(const sMatrix3& p_InputM, const sVector3& p_InputV){return (sVector3(p_InputM(0, 0) * p_InputV.x + p_InputM(0, 1) * p_InputV.y + p_InputM(0, 2) * p_InputV.z,p_InputM(1, 0) * p_InputV.x + p_InputM(1, 1) * p_InputV.y + p_InputM(1, 2) * p_InputV.z,p_InputM(2, 0) * p_InputV.x + p_InputM(2, 1) * p_InputV.y + p_InputM(2, 2) * p_InputV.z));}//inline float viDot(const sVector3& p_InputA, const sVector3& p_InputB){return (p_InputA.x * p_InputB.x + p_InputA.y * p_InputB.y + p_InputA.z * p_InputB.z);}//inline sVector3 viCross(const sVector3& p_InputA, const sVector3& p_InputB){return (sVector3(p_InputA.y * p_InputB.z - p_InputA.z * p_InputB.y,p_InputA.z * p_InputB.x - p_InputA.x * p_InputB.z,p_InputA.x * p_InputB.y - p_InputA.y * p_InputB.x));}//inline sVector3 viProject(const sVector3& p_InputA, const sVector3& p_InputB){return (p_InputB * (viDot(p_InputA, p_InputB) / viDot(p_InputB, p_InputB)));}//inline sVector3 viReject(const sVector3& p_InputA, const sVector3& p_InputB){return (p_InputA - p_InputB * (viDot(p_InputA, p_InputB) / viDot(p_InputB, p_InputB)));}//float viDeterminant(const sMatrix3& p_InputM){return (p_InputM(0, 0) * (p_InputM(1, 1) * p_InputM(2, 2) - p_InputM(1, 2) * p_InputM(2, 1))+ p_InputM(0, 1) * (p_InputM(1, 2) * p_InputM(2, 0) - p_InputM(1, 0) * p_InputM(2, 2))+ p_InputM(0, 2) * (p_InputM(1, 0) * p_InputM(2, 1) - p_InputM(1, 1) * p_InputM(2, 0)));}//sMatrix3 viInverse(const sMatrix3& p_InputM){const sVector3& a = p_InputM[0];const sVector3& b = p_InputM[1];const sVector3& c = p_InputM[2];sVector3 r0 = viCross(b, c);sVector3 r1 = viCross(c, a);sVector3 r2 = viCross(a, b);float invDet = 1.0F / viDot(r2, c);return (sMatrix3(r0.x * invDet, r0.y * invDet, r0.z * invDet,r1.x * invDet, r1.y * invDet, r1.z * invDet,r2.x * invDet, r2.y * invDet, r2.z * invDet));}//sMatrix4 viInverse(const sMatrix4& p_InputM){const sVector3& a = reinterpret_cast<const sVector3&>(p_InputM[0]);const sVector3& b = reinterpret_cast<const sVector3&>(p_InputM[1]);const sVector3& c = reinterpret_cast<const sVector3&>(p_InputM[2]);const sVector3& d = reinterpret_cast<const sVector3&>(p_InputM[3]);//const float& x = p_InputM(3, 0);const float& y = p_InputM(3, 1);const float& z = p_InputM(3, 2);const float& w = p_InputM(3, 3);//sVector3 s = viCross(a, b);sVector3 t = viCross(c, d);sVector3 u = a * y - b * x;sVector3 v = c * w - d * z;//float invDet = 1.0F / (viDot(s, v) + viDot(t, u));s *= invDet;t *= invDet;u *= invDet;v *= invDet;//sVector3 r0 = viCross(b, v) + t * y;sVector3 r1 = viCross(v, a) - t * x;sVector3 r2 = viCross(d, u) + s * w;sVector3 r3 = viCross(u, c) - s * z;//return (sMatrix4(r0.x, r0.y, r0.z, -viDot(b, t),r1.x, r1.y, r1.z, viDot(a, t),r2.x, r2.y, r2.z, -viDot(d, s),r3.x, r3.y, r3.z, viDot(c, s)));}//sMatrix3 viMakeRotationX(float p_InputT){float c = cos(p_InputT);float s = sin(p_InputT);//return (sMatrix3(1.0F, 0.0F, 0.0F,0.0F, c, -s,0.0F, s, c));}//sMatrix3 viMakeRotationY(float p_InputT){float c = cos(p_InputT);float s = sin(p_InputT);//return (sMatrix3(c, 0.0F, s,0.0F, 1.0F, 0.0F,-s, 0.0F, c));}//sMatrix3 viMakeRotationZ(float p_InputT){float c = cos(p_InputT);float s = sin(p_InputT);//return (sMatrix3(c, -s, 0.0F,s, c, 0.0F,0.0F, 0.0F, 1.0F));}//sMatrix3 viMakeRotation(float p_InputT, const sVector3& p_InputA){float c = cos(p_InputT);float s = sin(p_InputT);float d = 1.0F - c;//float x = p_InputA.x * d;float y = p_InputA.y * d;float z = p_InputA.z * d;float axay = x * p_InputA.y;float axaz = x * p_InputA.z;float ayaz = y * p_InputA.z;//return (sMatrix3(c + x * p_InputA.x, axay - s * p_InputA.z, axaz + s * p_InputA.y,axay + s * p_InputA.z, c + y * p_InputA.y, ayaz - s * p_InputA.x,axaz - s * p_InputA.y, ayaz + s * p_InputA.x, c + z * p_InputA.z));}//sMatrix3 viMakeReflection(const sVector3& p_InputA){float x = p_InputA.x * -2.0F;float y = p_InputA.y * -2.0F;float z = p_InputA.z * -2.0F;float axay = x * p_InputA.y;float axaz = x * p_InputA.z;float ayaz = y * p_InputA.z;//return (sMatrix3(x * p_InputA.x + 1.0F, axay, axaz,axay, y * p_InputA.y + 1.0F, ayaz,axaz, ayaz, z * p_InputA.z + 1.0F));}//sMatrix3 viMakeInvolution(const sVector3& p_InputA){float x = p_InputA.x * 2.0F;float y = p_InputA.y * 2.0F;float z = p_InputA.z * 2.0F;float axay = x * p_InputA.y;float axaz = x * p_InputA.z;float ayaz = y * p_InputA.z;//return (sMatrix3(x * p_InputA.x - 1.0F, axay, axaz,axay, y * p_InputA.y - 1.0F, ayaz,axaz, ayaz, z * p_InputA.z - 1.0F));}//sMatrix3 viMakeScale(float p_InputSX, float p_InputSY, float p_InputSZ){return (sMatrix3(p_InputSX, 0.0F, 0.0F, 0.0F, p_InputSY, 0.0F, 0.0F, 0.0F, p_InputSZ));}//sMatrix3 viMakeScale(float p_InputS, const sVector3& p_InputA){p_InputS -= 1.0F;float x = p_InputA.x * p_InputS;float y = p_InputA.y * p_InputS;float z = p_InputA.z * p_InputS;float axay = x * p_InputA.y;float axaz = x * p_InputA.z;float ayaz = y * p_InputA.z;//return (sMatrix3(x * p_InputA.x + 1.0F, axay, axaz,axay, y * p_InputA.y + 1.0F, ayaz,axaz, ayaz, z * p_InputA.z + 1.0F));}//sMatrix3 viMakeSkew(float p_InputT, const sVector3& p_InputA, const sVector3& p_InputB){p_InputT = tan(p_InputT);float x = p_InputA.x * p_InputT;float y = p_InputA.y * p_InputT;float z = p_InputA.z * p_InputT;//return (sMatrix3(x * p_InputB.x + 1.0F, x * p_InputB.y, x * p_InputB.z,y * p_InputB.x, y * p_InputB.y + 1.0F, y * p_InputB.z,z * p_InputB.x, z * p_InputB.y, z * p_InputB.z + 1.0F));}//inline sPoint3 operator +(const sPoint3& p_InputA, const sVector3& p_InputB){return (sPoint3(p_InputA.x + p_InputB.x, p_InputA.y + p_InputB.y, p_InputA.z + p_InputB.z));}//inline sPoint3 operator -(const sPoint3& p_InputA, const sVector3& p_InputB){return (sPoint3(p_InputA.x - p_InputB.x, p_InputA.y - p_InputB.y, p_InputA.z - p_InputB.z));}//inline sVector3 operator -(const sPoint3& p_InputA, const sPoint3& p_InputB){return (sVector3(p_InputA.x - p_InputB.x, p_InputA.y - p_InputB.y, p_InputA.z - p_InputB.z));}//sTransform4 viInverse(const sTransform4& p_InputH){const sVector3& a = p_InputH[0];const sVector3& b = p_InputH[1];const sVector3& c = p_InputH[2];const sVector3& d = p_InputH[3];//sVector3 s = viCross(a, b);sVector3 t = viCross(c, d);//float invDet = 1.0F / viDot(s, c);//s *= invDet;t *= invDet;sVector3 v = c * invDet;//sVector3 r0 = viCross(b, v);sVector3 r1 = viCross(v, a);//return (sTransform4(r0.x, r0.y, r0.z, -viDot(b, t),r1.x, r1.y, r1.z, viDot(a, t),s.x, s.y, s.z, -viDot(d, s)));}//sTransform4 operator *(const sTransform4& p_InputA, const sTransform4& p_InputB){return (sTransform4(p_InputA(0, 0) * p_InputB(0, 0) + p_InputA(0, 1) * p_InputB(1, 0) + p_InputA(0, 2) * p_InputB(2, 0),p_InputA(0, 0) * p_InputB(0, 1) + p_InputA(0, 1) * p_InputB(1, 1) + p_InputA(0, 2) * p_InputB(2, 1),p_InputA(0, 0) * p_InputB(0, 2) + p_InputA(0, 1) * p_InputB(1, 2) + p_InputA(0, 2) * p_InputB(2, 2),p_InputA(0, 0) * p_InputB(0, 3) + p_InputA(0, 1) * p_InputB(1, 3) + p_InputA(0, 2) * p_InputB(2, 3) + p_InputA(0, 3),p_InputA(1, 0) * p_InputB(0, 0) + p_InputA(1, 1) * p_InputB(1, 0) + p_InputA(1, 2) * p_InputB(2, 0),p_InputA(1, 0) * p_InputB(0, 1) + p_InputA(1, 1) * p_InputB(1, 1) + p_InputA(1, 2) * p_InputB(2, 1),p_InputA(1, 0) * p_InputB(0, 2) + p_InputA(1, 1) * p_InputB(1, 2) + p_InputA(1, 2) * p_InputB(2, 2),p_InputA(1, 0) * p_InputB(0, 3) + p_InputA(1, 1) * p_InputB(1, 3) + p_InputA(1, 2) * p_InputB(2, 3) + p_InputA(1, 3),p_InputA(2, 0) * p_InputB(0, 0) + p_InputA(2, 1) * p_InputB(1, 0) + p_InputA(2, 2) * p_InputB(2, 0),p_InputA(2, 0) * p_InputB(0, 1) + p_InputA(2, 1) * p_InputB(1, 1) + p_InputA(2, 2) * p_InputB(2, 1),p_InputA(2, 0) * p_InputB(0, 2) + p_InputA(2, 1) * p_InputB(1, 2) + p_InputA(2, 2) * p_InputB(2, 2),p_InputA(2, 0) * p_InputB(0, 3) + p_InputA(2, 1) * p_InputB(1, 3) + p_InputA(2, 2) * p_InputB(2, 3) + p_InputA(2, 3)));}//sVector3 operator *(const sTransform4& p_InputH, const sVector3& p_InputV){return (sVector3(p_InputH(0, 0) * p_InputV.x + p_InputH(0, 1) * p_InputV.y + p_InputH(0, 2) * p_InputV.z,p_InputH(1, 0) * p_InputV.x + p_InputH(1, 1) * p_InputV.y + p_InputH(1, 2) * p_InputV.z,p_InputH(2, 0) * p_InputV.x + p_InputH(2, 1) * p_InputV.y + p_InputH(2, 2) * p_InputV.z));}//sPoint3 operator *(const sTransform4& p_InputH, const sPoint3& p_InputP){return (sPoint3(p_InputH(0, 0) * p_InputP.x + p_InputH(0, 1) * p_InputP.y + p_InputH(0, 2) * p_InputP.z + p_InputH(0, 3),p_InputH(1, 0) * p_InputP.x + p_InputH(1, 1) * p_InputP.y + p_InputH(1, 2) * p_InputP.z + p_InputH(1, 3),p_InputH(2, 0) * p_InputP.x + p_InputH(2, 1) * p_InputP.y + p_InputH(2, 2) * p_InputP.z + p_InputH(2, 3)));}//sQuaternion operator *(const sQuaternion& p_InputQ1, const sQuaternion& p_InputQ2){return (sQuaternion(p_InputQ1.w * p_InputQ2.x + p_InputQ1.x * p_InputQ2.w + p_InputQ1.y * p_InputQ2.z - p_InputQ1.z * p_InputQ2.y,p_InputQ1.w * p_InputQ2.y - p_InputQ1.x * p_InputQ2.z + p_InputQ1.y * p_InputQ2.w + p_InputQ1.z * p_InputQ2.x,p_InputQ1.w * p_InputQ2.z + p_InputQ1.x * p_InputQ2.y - p_InputQ1.y * p_InputQ2.x + p_InputQ1.z * p_InputQ2.w,p_InputQ1.w * p_InputQ2.w - p_InputQ1.x * p_InputQ2.x - p_InputQ1.y * p_InputQ2.y - p_InputQ1.z * p_InputQ2.z));}//sVector3 viTransform(const sVector3& p_InputV, const sQuaternion& p_InputQ){const sVector3& b = p_InputQ.viGetVectorPart();float b2 = b.x * b.x + b.y * b.y + b.z * b.z;return (p_InputV * (p_InputQ.w * p_InputQ.w - b2) + b * (viDot(p_InputV, b) * 2.0F)+ viCross(b, p_InputV) * (p_InputQ.w * 2.0F));}//sMatrix3 sQuaternion::viGetRotationMatrix(void){float x2 = x * x;float y2 = y * y;float z2 = z * z;float xy = x * y;float xz = x * z;float yz = y * z;float wx = w * x;float wy = w * y;float wz = w * z;//return (sMatrix3(1.0F - 2.0F * (y2 + z2), 2.0F * (xy - wz), 2.0F * (xz + wy),2.0F * (xy + wz), 1.0F - 2.0F * (x2 + z2), 2.0F * (yz - wx),2.0F * (xz - wy), 2.0F * (yz + wx), 1.0F - 2.0F * (x2 + y2)));}//void sQuaternion::viSetRotationMatrix(const sMatrix3& p_InputM){float m00 = p_InputM(0, 0);float m11 = p_InputM(1, 1);float m22 = p_InputM(2, 2);float sum = m00 + m11 + m22;//if (sum > 0.0F){w = sqrt(sum + 1.0F) * 0.5F;float f = 0.25F / w;//x = (p_InputM(2, 1) - p_InputM(1, 2)) * f;y = (p_InputM(0, 2) - p_InputM(2, 0)) * f;z = (p_InputM(1, 0) - p_InputM(0, 1)) * f;}else if ((m00 > m11) && (m00 > m22)){x = sqrt(m00 - m11 - m22 + 1.0F) * 0.5F;float f = 0.25F / x;//y = (p_InputM(1, 0) + p_InputM(0, 1)) * f;z = (p_InputM(0, 2) + p_InputM(2, 0)) * f;w = (p_InputM(2, 1) - p_InputM(1, 2)) * f;}else if (m11 > m22){y = sqrt(m11 - m00 - m22 + 1.0F) * 0.5F;float f = 0.25F / y;//x = (p_InputM(1, 0) + p_InputM(0, 1)) * f;z = (p_InputM(2, 1) + p_InputM(1, 2)) * f;w = (p_InputM(0, 2) - p_InputM(2, 0)) * f;}else{z = sqrt(m22 - m00 - m11 + 1.0F) * 0.5F;float f = 0.25F / z;//x = (p_InputM(0, 2) + p_InputM(2, 0)) * f;y = (p_InputM(2, 1) + p_InputM(1, 2)) * f;w = (p_InputM(1, 0) - p_InputM(0, 1)) * f;}}//sVector3 operator *(const sVector3& p_InputN, const sTransform4& p_InputH){return (sVector3(p_InputN.x * p_InputH(0, 0) + p_InputN.y * p_InputH(1, 0) + p_InputN.z * p_InputH(2, 0),p_InputN.x * p_InputH(0, 1) + p_InputN.y * p_InputH(1, 1) + p_InputN.z * p_InputH(2, 1),p_InputN.x * p_InputH(0, 2) + p_InputN.y * p_InputH(1, 2) + p_InputN.z * p_InputH(2, 2)));}//float viDistPointLine(const sPoint3& p_InputQ, const sPoint3& p_InputP, const sVector3& p_InputV){sVector3 a = viCross(p_InputQ - p_InputP, p_InputV);return (sqrt(viDot(a, a) / viDot(p_InputV, p_InputV)));}//float viDistLineLine(const sPoint3& p_InputP1, const sVector3& p_InputV1,const sPoint3& p_InputP2, const sVector3& p_InputV2){sVector3 dp = p_InputP2 - p_InputP1;//float v12 = viDot(p_InputV1, p_InputV1);float v22 = viDot(p_InputV2, p_InputV2);float v1v2 = viDot(p_InputV1, p_InputV1);float det = v1v2 * v1v2 - v12 * v22;//if (fabs(det) > FLT_MIN){det = 1.0F / det;//float dpv1 = viDot(dp, p_InputV1);float dpv2 = viDot(dp, p_InputV2);float t1 = (v1v2 * dpv2 - v22 * dpv1) * det;float t2 = (v12 * dpv2 - v1v2 * dpv1) * det;//return (viMagnitude(dp + p_InputV2 * t2 - p_InputV1 * t1));}//sVector3 a = viCross(dp, p_InputV1);return (sqrt(viDot(a, a) / v12));}//float viDot(const sPlane& p_InputF, const sVector3& p_InputV){return (p_InputF.x * p_InputV.x + p_InputF.y * p_InputV.y + p_InputF.z * p_InputV.z);}//float viDot(const sPlane& p_InputF, const sPoint3& p_InputP){return (p_InputF.x * p_InputP.x + p_InputF.y * p_InputP.y + p_InputF.z * p_InputP.z + p_InputF.w);}//sTransform4 viMakeReflection(const sPlane& p_InputF){float x = p_InputF.x * -2.0F;float y = p_InputF.y * -2.0F;float z = p_InputF.z * -2.0F;float nxny = x * p_InputF.y;float nxnz = x * p_InputF.z;float nynz = y * p_InputF.z;//return (sTransform4(x * p_InputF.x + 1.0F, nxny, nxnz, x * p_InputF.w,nxny, y * p_InputF.y + 1.0F, nynz, y * p_InputF.w,nxnz, nynz, z * p_InputF.z + 1.0F, z * p_InputF.w));}//float viIntersectLinePlane(const sPoint3& p_InputP, const sVector3& p_InputV,const sPlane& p_InputF, sPoint3 *p_InputQ){float fv = viDot(p_InputF, p_InputV);//if (fabs(fv) > FLT_MIN){*p_InputQ = p_InputP - p_InputV * (viDot(p_InputF, p_InputP) / fv);return (true);}return (false);}//bool viIntersectThreePlanes(const sPlane& p_InputF1, const sPlane& p_InputF2,const sPlane& p_InputF3, sPoint3 *p_InputP){const sVector3& n1 = p_InputF1.viGetNormal();const sVector3& n2 = p_InputF2.viGetNormal();const sVector3& n3 = p_InputF3.viGetNormal();//sVector3 n1xn2 = viCross(n1, n2);float det = viDot(n1xn2, n3);if (fabs(det) > FLT_MIN){*p_InputP = (viCross(n3, n2) * p_InputF1.w + viCross(n1, n3) * p_InputF2.w- n1xn2 * p_InputF3.w) / det;return (true);}return (false);}//bool viIntersectTwoPlanes(const sPlane& p_InputF1, const sPlane& p_InputF2,sPoint3 *p_InputP, sVector3 *p_InputV){const sVector3& n1 = p_InputF1.viGetNormal();const sVector3& n2 = p_InputF2.viGetNormal();//*p_InputV = viCross(n1, n2);float det = viDot(*p_InputV, *p_InputV);if (fabs(det) > FLT_MIN){*p_InputP = (viCross(*p_InputV, n2) * p_InputF1.w + viCross(n1, *p_InputV) * p_InputF2.w) / det;return (true);}return (false);}//sPlane operator *(const sPlane& p_InputF, const sTransform4& p_InputH){return (sPlane(p_InputF.x * p_InputH(0, 0) + p_InputF.y * p_InputH(1, 0) + p_InputF.z * p_InputH(2, 0),p_InputF.x * p_InputH(0, 1) + p_InputF.y * p_InputH(1, 1) + p_InputF.z * p_InputH(2, 1),p_InputF.x * p_InputH(0, 2) + p_InputF.y * p_InputH(1, 2) + p_InputF.z * p_InputH(2, 2),p_InputF.x * p_InputH(0, 3) + p_InputF.y * p_InputH(1, 3) + p_InputF.z * p_InputH(2, 3) + p_InputF.w));}//sLine viTransform(const sLine& p_InputLine, const sTransform4& p_InputH){sMatrix3 adj(viCross(p_InputH[1], p_InputH[2]), viCross(p_InputH[2], p_InputH[0]), viCross(p_InputH[0], p_InputH[1]));const sPoint3& t = p_InputH.viGetTranslation();//sVector3 v = p_InputH * p_InputLine.direction;sVector3 m = adj * p_InputLine.moment + viCross(t, v);return (sLine(v, m));}//inline sLine operator ^(const sPoint3& p_InputP, const sPoint3& p_InputQ){return (sLine(p_InputQ.x - p_InputP.x, p_InputQ.y - p_InputP.y, p_InputQ.z - p_InputP.z,p_InputP.y * p_InputQ.z - p_InputP.z * p_InputQ.y, p_InputP.z * p_InputQ.x - p_InputP.x * p_InputQ.z, p_InputP.x * p_InputQ.y - p_InputP.y * p_InputQ.x));}//inline sLine operator ^(const sPlane& p_InputF, const sPlane& p_InputG){return (sLine(p_InputF.y * p_InputG.z - p_InputF.z * p_InputG.y,p_InputF.z * p_InputG.x - p_InputF.x * p_InputG.z,p_InputF.x * p_InputG.y - p_InputF.y * p_InputG.x,p_InputG.x * p_InputF.w - p_InputF.x * p_InputG.w,p_InputG.y * p_InputF.w - p_InputF.y * p_InputG.w,p_InputG.z * p_InputF.w - p_InputF.z * p_InputG.w));}//inline sPlane operator ^(const sLine& p_InputL, const sPoint3& p_InputP){return (sPlane(p_InputL.direction.y * p_InputP.z - p_InputL.direction.z * p_InputP.y + p_InputL.moment.x,p_InputL.direction.z * p_InputP.x - p_InputL.direction.x * p_InputP.z + p_InputL.moment.y,p_InputL.direction.x * p_InputP.y - p_InputL.direction.y * p_InputP.x + p_InputL.moment.z,-p_InputL.moment.x * p_InputP.x - p_InputL.moment.y * p_InputP.y - p_InputL.moment.z * p_InputP.z));}//inline sPlane operator ^(const sPoint3& p_InputP, const sLine& p_InputL){return (p_InputL ^ p_InputP);}//inline sVector4 operator ^(const sLine& p_InputL, const sPlane& p_InputF){return (sVector4(p_InputL.moment.y * p_InputF.z - p_InputL.moment.z * p_InputF.y + p_InputL.direction.x * p_InputF.w,p_InputL.moment.z * p_InputF.x - p_InputL.moment.x * p_InputF.z + p_InputL.direction.y * p_InputF.w,p_InputL.moment.x * p_InputF.y - p_InputL.moment.y * p_InputF.x + p_InputL.direction.z * p_InputF.w,-p_InputL.direction.x * p_InputF.x - p_InputL.direction.y * p_InputF.y - p_InputL.direction.z * p_InputF.z));}//inline sVector4 operator ^(const sPlane& p_InputF, const sLine& p_InputL){return (p_InputL ^ p_InputF);}//inline float operator ^(const sLine& p_InputL1, const sLine& p_InputL2){return (-(viDot(p_InputL1.direction, p_InputL2.moment) + viDot(p_InputL2.direction, p_InputL1.moment)));}//inline float operator ^(const sPoint3& p_InputP, const sPlane& p_InputF){return (p_InputP.x * p_InputF.x + p_InputP.y * p_InputF.y + p_InputP.z * p_InputF.z + p_InputF.w);}//inline float operator ^(const sPlane& p_InputF, const sPoint3& p_InputP){}//}/////////////////////////////////////////////////////////////////////////////////////////////////////////////June 29, 2017 at 10:06 am #9038I am actually only aiming for ‘useful c++ support’. Full c++ support would be impossible without duplicating all of c++’s features (and quirks)
Operator is a monkey2 feature! (some tokens are not available like ^)
and when I tried to use external operators it looked like it’s almost there. The cpp was showing errors but it’s not far from the good result:
[/crayon]Monkey1234[crayon-5cb9bc5d9c488720569008 inline="true" ]this->m_s3b.+=this->m_s3.+(this->m_s3b.*(15.0f)); //when a class fieldl_s3b.+=(l_s3.+(l_s3b.*(15.0f))); // when inside a functwich should just be
[/crayon]Monkey1234[crayon-5cb9bc5d9c48e405406713 inline="true" ]this->m_s3b+=this->m_s3+this->m_s3b*15.0f;l_s3b+=l_s3+l_s3b*15.0f;That is just not adding the postfix.member token and not adding the brackets when the method is an operator.
In that regard I thought I would post a feature request as it looks not so hard to implement.The fact that we can add an operator ‘To’ by creating extension is great though, it let us use mx2’s Vec types with that kind of libraries (in my case box2D) without hassle.
-
AuthorPosts
You must be logged in to reply to this topic.