Vector.h 150 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522
  1. /******************************************************************************
  2. Use 'Vec2' to handle 2D vectors, Flt type
  3. Use 'Vec' to handle 3D vectors, Flt type
  4. Use 'Vec4' to handle 4D vectors, Flt type
  5. Use 'VecD2' to handle 2D vectors, Dbl type
  6. Use 'VecD' to handle 3D vectors, Dbl type
  7. Use 'VecD4' to handle 4D vectors, Dbl type
  8. Use 'VecI2' to handle 2D vectors, Int type
  9. Use 'VecI' to handle 3D vectors, Int type
  10. Use 'VecI4' to handle 4D vectors, Int type
  11. Use 'VecB2' to handle 2D vectors, Byte type
  12. Use 'VecB' to handle 3D vectors, Byte type
  13. Use 'VecB4' to handle 4D vectors, Byte type
  14. Use 'VecSB2' to handle 2D vectors, SByte type
  15. Use 'VecSB' to handle 3D vectors, SByte type
  16. Use 'VecSB4' to handle 4D vectors, SByte type
  17. /******************************************************************************/
  18. #define SIGN_BIT 0x80000000 // Float Sign Bit
  19. #define PI_6 0.5235987755982988f // PI/6 ( 30 deg) Flt
  20. #define PI_4 0.7853981633974483f // PI/4 ( 45 deg) Flt
  21. #define PI_3 1.0471975511965977f // PI/3 ( 60 deg) Flt
  22. #define PI_2 1.5707963267948966f // PI/2 ( 90 deg) Flt
  23. #define PI 3.1415926535897932f // PI (180 deg) Flt
  24. #define PI2 6.2831853071795864f // PI*2 (360 deg) Flt
  25. #define PID_6 0.5235987755982988 // PI/6 ( 30 deg) Dbl
  26. #define PID_4 0.7853981633974483 // PI/4 ( 45 deg) Dbl
  27. #define PID_3 1.0471975511965977 // PI/3 ( 60 deg) Dbl
  28. #define PID_2 1.5707963267948966 // PI/2 ( 90 deg) Dbl
  29. #define PID 3.1415926535897932 // PI (180 deg) Dbl
  30. #define PID2 6.2831853071795864 // PI*2 (360 deg) Dbl
  31. #define SQRT2 1.4142135623730950 // Sqrt(2)
  32. #define SQRT3 1.7320508075688773 // Sqrt(3)
  33. #define SQRT2_2 0.7071067811865475 // Sqrt(2)/2
  34. #define SQRT3_2 0.8660254037844386 // Sqrt(3)/2
  35. #define SQRT3_3 0.5773502691896257 // Sqrt(3)/3
  36. #define HEX_SIZE SQRT3_2 // distance between hexagonal cells along the smaller axis
  37. #define EPSD 0.0000000037252902984619141 // Dbl Epsilon (difference between 0x1000000 (16777216) and the nearest bigger 64-bit float value)
  38. #define EPS 0.000030517578125f // Flt Epsilon (difference between 0x0000100 ( 256) and the nearest bigger 32-bit float value)
  39. #define EPSL 0.0078125f // Low Precision Epsilon (difference between 0x0010000 ( 65536) and the nearest bigger 32-bit float value)
  40. #define EPS_MATERIAL_BUMP (1.0f/8192) // Material Bump Epsilon (default value used for ignoring Material.bump effect)
  41. #define EPS_ANIM_POS 0.0002f // Animation Position Epsilon (default value used for optimizing animation positions)
  42. #define EPS_ANIM_SCALE 0.0002f // Animation Scale Epsilon (default value used for optimizing animation scales)
  43. #define EPS_ANIM_ANGLE 0.001f // Animation Angle Epsilon (default value used for optimizing animation rotation angles)
  44. #define EPS_COL8 (0.5f/ 256) // Color Epsilon (this gives 8-bit color precision)
  45. #define EPS_COL (0.5f/1024) // Color Epsilon (this gives 10-bit color precision)
  46. #define EPS_COL8_COS (1-EPS_COL8) // Color Cos Epsilon (Dot product of 2 directional vectors giving 8-bit color precision)
  47. #define EPS_COL_COS (1-EPS_COL) // Color Cos Epsilon (Dot product of 2 directional vectors giving 10-bit color precision)
  48. #define EPS_COS 0.9999995f // Cos Flt Epsilon (Smallest Dot product of the same normalized directional Vec vector)
  49. #define EPSD_COS 0.999999999999999 // Cos Dbl Epsilon (Smallest Dot product of the same normalized directional VecD vector)
  50. #if EE_PRIVATE
  51. #define EPS_GPU (MOBILE ? HALF_EPS : FLT_EPS) // GPU Epsilon (Mobile GPU's may have only half precision)
  52. #define EPS_ANIM_BLEND (1.0f/4096) // Animation Blend Epsilon (default value used for ignoring animations)
  53. #define EPS_SKY_MIN_LERP_DIST (1.0f/8) // 12.5 cm
  54. #define EPS_SKY_MIN_VIEW_RANGE 0.999f // 0.999f was the biggest value that caused holes to disappear
  55. #define EPS_TAN_COS SQRT2_2 // Tangent Cos Epsilon = Cos(PI_4) 45 deg, used for Dot product of 2 directional vectors
  56. #endif
  57. /******************************************************************************/
  58. enum AXIS_TYPE
  59. {
  60. AXIS_X,
  61. AXIS_Y,
  62. AXIS_Z,
  63. };
  64. enum DIR_ENUM : Byte // Direction Enums
  65. {
  66. DIR_RIGHT , // right
  67. DIR_LEFT , // left
  68. DIR_UP , // up
  69. DIR_DOWN , // down
  70. DIR_FORWARD, // forward
  71. DIR_BACK , // backwards
  72. DIR_NUM , // number of directions
  73. };
  74. enum DIR_FLAG // Direction Flags
  75. {
  76. DIRF_RIGHT =1<<DIR_RIGHT , // right
  77. DIRF_LEFT =1<<DIR_LEFT , // left
  78. DIRF_UP =1<<DIR_UP , // up
  79. DIRF_DOWN =1<<DIR_DOWN , // down
  80. DIRF_FORWARD=1<<DIR_FORWARD, // forward
  81. DIRF_BACK =1<<DIR_BACK , // backwards
  82. DIRF_X=DIRF_RIGHT |DIRF_LEFT,
  83. DIRF_Y=DIRF_UP |DIRF_DOWN,
  84. DIRF_Z=DIRF_FORWARD|DIRF_BACK,
  85. DIRF_XYZ=DIRF_X|DIRF_Y|DIRF_Z,
  86. DIRF_ALL=DIRF_XYZ,
  87. };
  88. /******************************************************************************/
  89. // MINIMUM MAXIMUM AVERAGE
  90. /******************************************************************************/
  91. // get minimum/maximum value
  92. constexpr Int Min(Int x, Int y) {return (x<y) ? x : y;}
  93. constexpr Int Min(UInt x, Int y) {return (Long(x)<y) ? x : y;}
  94. constexpr Int Min(Int x, UInt y) {return (x<Long(y)) ? x : y;}
  95. constexpr UInt Min(UInt x, UInt y) {return (x<y) ? x : y;}
  96. constexpr Long Min(Int x, Long y) {return (x<y) ? x : y;}
  97. constexpr Long Min(UInt x, Long y) {return (x<y) ? x : y;}
  98. constexpr Long Min(Long x, Int y) {return (x<y) ? x : y;}
  99. constexpr Long Min(Long x, UInt y) {return (x<y) ? x : y;}
  100. constexpr Long Min(Long x, Long y) {return (x<y) ? x : y;}
  101. constexpr ULong Min(ULong x, ULong y) {return (x<y) ? x : y;}
  102. constexpr Int Min(Int x, ULong y) {return (x<=0) ? x : (Int)Min(ULong(x), y);}
  103. constexpr Int Min(ULong x, Int y) {return (y<=0) ? y : (Int)Min(ULong(y), x);}
  104. constexpr Flt Min(Flt x, Flt y) {return (x<y) ? x : y;}
  105. constexpr Flt Min(Int x, Flt y) {return (x<y) ? x : y;}
  106. constexpr Flt Min(Flt x, Int y) {return (x<y) ? x : y;}
  107. constexpr Dbl Min(Dbl x, Dbl y) {return (x<y) ? x : y;}
  108. constexpr Dbl Min(Int x, Dbl y) {return (x<y) ? x : y;}
  109. constexpr Dbl Min(Dbl x, Int y) {return (x<y) ? x : y;}
  110. constexpr Int Max(Int x, Int y) {return (x>y) ? x : y;}
  111. constexpr UInt Max(UInt x, Int y) {return (Long(x)>y) ? x : y;}
  112. constexpr UInt Max(Int x, UInt y) {return (x>Long(y)) ? x : y;}
  113. constexpr UInt Max(UInt x, UInt y) {return (x>y) ? x : y;}
  114. constexpr Long Max(Int x, Long y) {return (x>y) ? x : y;}
  115. constexpr Long Max(UInt x, Long y) {return (x>y) ? x : y;}
  116. constexpr Long Max(Long x, Int y) {return (x>y) ? x : y;}
  117. constexpr Long Max(Long x, UInt y) {return (x>y) ? x : y;}
  118. constexpr Long Max(Long x, Long y) {return (x>y) ? x : y;}
  119. constexpr ULong Max(ULong x, ULong y) {return (x>y) ? x : y;}
  120. constexpr ULong Max(Int x, ULong y) {return (x<=0) ? y : Max(ULong(x), y);}
  121. constexpr ULong Max(ULong x, Int y) {return (y<=0) ? x : Max(ULong(y), x);}
  122. constexpr Flt Max(Flt x, Flt y) {return (x>y) ? x : y;}
  123. constexpr Flt Max(Int x, Flt y) {return (x>y) ? x : y;}
  124. constexpr Flt Max(Flt x, Int y) {return (x>y) ? x : y;}
  125. constexpr Dbl Max(Dbl x, Dbl y) {return (x>y) ? x : y;}
  126. constexpr Dbl Max(Int x, Dbl y) {return (x>y) ? x : y;}
  127. constexpr Dbl Max(Dbl x, Int y) {return (x>y) ? x : y;}
  128. inline Int Min(Int x, Int y, Int z ) {return Min(x, Min(y, z));}
  129. inline Long Min(Long x, Long y, Long z ) {return Min(x, Min(y, z));}
  130. inline Flt Min(Flt x, Flt y, Flt z ) {return Min(x, Min(y, z));}
  131. inline Dbl Min(Dbl x, Dbl y, Dbl z ) {return Min(x, Min(y, z));}
  132. inline Int Max(Int x, Int y, Int z ) {return Max(x, Max(y, z));}
  133. inline Long Max(Long x, Long y, Long z ) {return Max(x, Max(y, z));}
  134. inline Flt Max(Flt x, Flt y, Flt z ) {return Max(x, Max(y, z));}
  135. inline Dbl Max(Dbl x, Dbl y, Dbl z ) {return Max(x, Max(y, z));}
  136. inline Int Min(Int x, Int y, Int z, Int w) {return Min(x, Min(y, z, w));}
  137. inline Long Min(Long x, Long y, Long z, Long w) {return Min(x, Min(y, z, w));}
  138. inline Flt Min(Flt x, Flt y, Flt z, Flt w) {return Min(x, Min(y, z, w));}
  139. inline Dbl Min(Dbl x, Dbl y, Dbl z, Dbl w) {return Min(x, Min(y, z, w));}
  140. inline Int Max(Int x, Int y, Int z, Int w) {return Max(x, Max(y, z, w));}
  141. inline Long Max(Long x, Long y, Long z, Long w) {return Max(x, Max(y, z, w));}
  142. inline Flt Max(Flt x, Flt y, Flt z, Flt w) {return Max(x, Max(y, z, w));}
  143. inline Dbl Max(Dbl x, Dbl y, Dbl z, Dbl w) {return Max(x, Max(y, z, w));}
  144. // minimize/maximize value
  145. T2(TA, TB) inline TA& MIN(TA &x, TB y) {if(y<x)x=y; return x;} // equal to: x=Min(x, y)
  146. T2(TA, TB) inline TA& MAX(TA &x, TB y) {if(y>x)x=y; return x;} // equal to: x=Max(x, y)
  147. // get index of minimum/maximum value (if the min/max value is shared between multiple values, then index of the first value is returned)
  148. Int MinI(Int x, Int y);
  149. Int MinI(Flt x, Flt y);
  150. Int MinI(Dbl x, Dbl y);
  151. Int MaxI(Int x, Int y);
  152. Int MaxI(Flt x, Flt y);
  153. Int MaxI(Dbl x, Dbl y);
  154. Int MinI(Int x, Int y, Int z);
  155. Int MinI(Flt x, Flt y, Flt z);
  156. Int MinI(Dbl x, Dbl y, Dbl z);
  157. Int MaxI(Int x, Int y, Int z);
  158. Int MaxI(Flt x, Flt y, Flt z);
  159. Int MaxI(Dbl x, Dbl y, Dbl z);
  160. Int MinI(Int x, Int y, Int z, Int w);
  161. Int MinI(Flt x, Flt y, Flt z, Flt w);
  162. Int MinI(Dbl x, Dbl y, Dbl z, Dbl w);
  163. Int MaxI(Int x, Int y, Int z, Int w);
  164. Int MaxI(Flt x, Flt y, Flt z, Flt w);
  165. Int MaxI(Dbl x, Dbl y, Dbl z, Dbl w);
  166. // get average value
  167. inline Int AvgI(Int x, Int y ) {return DivRound(x+y , 2 ) ;}
  168. inline UInt AvgI(UInt x, UInt y ) {return DivRound(x+y , 2u) ;}
  169. inline Flt AvgF(Int x, Int y ) {return (x+y )*0.5f ;}
  170. inline Flt Avg (Flt x, Flt y ) {return (x+y )*0.5f ;}
  171. inline Dbl Avg (Dbl x, Dbl y ) {return (x+y )*0.5 ;}
  172. inline Int AvgI(Int x, Int y, Int z ) {return DivRound(x+y+z , 3 ) ;}
  173. inline Byte AvgI(Byte x, Byte y, Byte z ) {return DivRound(UInt(x+y+z), 3u) ;}
  174. inline UInt AvgI(UInt x, UInt y, UInt z ) {return DivRound(x+y+z , 3u) ;}
  175. inline Flt AvgF(Int x, Int y, Int z ) {return (x+y+z )/3.0f ;}
  176. inline Flt Avg (Flt x, Flt y, Flt z ) {return (x+y+z )/3.0f ;}
  177. inline Dbl Avg (Dbl x, Dbl y, Dbl z ) {return (x+y+z )/3.0 ;}
  178. inline Int AvgI(Int x, Int y, Int z, Int w) {return DivRound(x+y+z+w, 4 ) ;}
  179. inline UInt AvgI(UInt x, UInt y, UInt z, UInt w) {return DivRound(x+y+z+w, 4u) ;}
  180. inline Flt AvgF(Int x, Int y, Int z, Int w) {return (x+y+z+w )*0.25f;}
  181. inline Flt Avg (Flt x, Flt y, Flt z, Flt w) {return (x+y+z+w )*0.25f;}
  182. inline Dbl Avg (Dbl x, Dbl y, Dbl z, Dbl w) {return (x+y+z+w )*0.25 ;}
  183. /******************************************************************************/
  184. // TESTING
  185. /******************************************************************************/
  186. // test if any of the parameters isn't zero
  187. inline Bool Any(C Half &x ); // faster version of "x!=0"
  188. inline Bool Any(C Half &x, C Half &y ); // faster version of "x!=0 || y!=0"
  189. inline Bool Any(C Half &x, C Half &y, C Half &z ); // faster version of "x!=0 || y!=0 || z!=0"
  190. inline Bool Any(C Half &x, C Half &y, C Half &z, C Half &w); // faster version of "x!=0 || y!=0 || z!=0 || w!=0"
  191. inline Bool Any(C Flt &x ); // faster version of "x!=0"
  192. inline Bool Any(C Flt &x, C Flt &y ); // faster version of "x!=0 || y!=0"
  193. inline Bool Any(C Flt &x, C Flt &y, C Flt &z ); // faster version of "x!=0 || y!=0 || z!=0"
  194. inline Bool Any(C Flt &x, C Flt &y, C Flt &z, C Flt &w); // faster version of "x!=0 || y!=0 || z!=0 || w!=0"
  195. inline Bool Any(C Dbl &x ); // faster version of "x!=0"
  196. inline Bool Any(C Dbl &x, C Dbl &y ); // faster version of "x!=0 || y!=0"
  197. inline Bool Any(C Dbl &x, C Dbl &y, C Dbl &z ); // faster version of "x!=0 || y!=0 || z!=0"
  198. inline Bool Any(C Dbl &x, C Dbl &y, C Dbl &z, C Dbl &w); // faster version of "x!=0 || y!=0 || z!=0 || w!=0"
  199. /******************************************************************************/
  200. // 16-BIT FLOAT
  201. /******************************************************************************/
  202. typedef struct Half
  203. {
  204. U16 data;
  205. Half() {}
  206. Half(Flt f); // create from float
  207. operator Flt()C; // convert to float
  208. Half& operator+=(Flt f) {T=Flt(T)+f; return T;}
  209. Half& operator-=(Flt f) {T=Flt(T)-f; return T;}
  210. Half& operator*=(Flt f) {T=Flt(T)*f; return T;}
  211. Half& operator/=(Flt f) {T=Flt(T)/f; return T;}
  212. Bool operator< (Flt f)C {return Flt(T)< f;}
  213. Bool operator<=(Flt f)C {return Flt(T)<=f;}
  214. Bool operator> (Flt f)C {return Flt(T)> f;}
  215. Bool operator>=(Flt f)C {return Flt(T)>=f;}
  216. Bool operator==(Flt f)C {return Flt(T)==f;}
  217. Bool operator==(Half h)C {return data ==h.data;}
  218. }F16;
  219. #if EE_PRIVATE
  220. extern const Half HalfZero, HalfOne;
  221. #endif
  222. /******************************************************************************/
  223. // VECTORS
  224. /******************************************************************************/
  225. struct Vec2 // Vector 2D
  226. {
  227. union
  228. {
  229. struct{Flt x, y;};
  230. struct{Flt c[2];}; // component
  231. };
  232. Vec2& zero( ) {x=y=0; return T;}
  233. Vec2& set (Flt r ) {x=y=r; return T;}
  234. Vec2& set (Flt x, Flt y) {T.x=x; T.y=y; return T;}
  235. Vec2& operator+=( Flt r) {x+= r; y+= r; return T;}
  236. Vec2& operator-=( Flt r) {x-= r; y-= r; return T;}
  237. Vec2& operator*=( Flt r) {x*= r; y*= r; return T;}
  238. Vec2& operator/=( Flt r) {x/= r; y/= r; return T;}
  239. Vec2& operator+=(C Vec2 &v) {x+=v.x; y+=v.y; return T;}
  240. Vec2& operator-=(C Vec2 &v) {x-=v.x; y-=v.y; return T;}
  241. Vec2& operator*=(C Vec2 &v) {x*=v.x; y*=v.y; return T;}
  242. Vec2& operator/=(C Vec2 &v) {x/=v.x; y/=v.y; return T;}
  243. Vec2& operator*=(C Matrix3 &m) {return mul(m);}
  244. Vec2& operator*=(C Matrix &m) {return mul(m);}
  245. Vec2& operator/=(C Matrix3 &m) {return div(m);}
  246. Vec2& operator/=(C Matrix &m) {return div(m);}
  247. Vec2& operator&=(C Rect &r) ; // intersect
  248. Bool operator==( Flt r)C;
  249. Bool operator!=( Flt r)C;
  250. Bool operator==(C Vec2 &v)C;
  251. Bool operator!=(C Vec2 &v)C;
  252. friend Vec2 operator+ (C Vec2 &v, Int i) {return Vec2(v.x+i, v.y+i);}
  253. friend Vec2 operator- (C Vec2 &v, Int i) {return Vec2(v.x-i, v.y-i);}
  254. friend Vec2 operator* (C Vec2 &v, Int i) {return Vec2(v.x*i, v.y*i);}
  255. friend Vec2 operator/ (C Vec2 &v, Int i) {return Vec2(v.x/i, v.y/i);}
  256. friend Vec2 operator+ (C Vec2 &v, Flt r) {return Vec2(v.x+r, v.y+r);}
  257. friend Vec2 operator- (C Vec2 &v, Flt r) {return Vec2(v.x-r, v.y-r);}
  258. friend Vec2 operator* (C Vec2 &v, Flt r) {return Vec2(v.x*r, v.y*r);}
  259. friend Vec2 operator/ (C Vec2 &v, Flt r) {return Vec2(v.x/r, v.y/r);}
  260. friend Vec2 operator+ (Int i, C Vec2 &v) {return Vec2(i+v.x, i+v.y);}
  261. friend Vec2 operator- (Int i, C Vec2 &v) {return Vec2(i-v.x, i-v.y);}
  262. friend Vec2 operator* (Int i, C Vec2 &v) {return Vec2(i*v.x, i*v.y);}
  263. friend Vec2 operator/ (Int i, C Vec2 &v) {return Vec2(i/v.x, i/v.y);}
  264. friend Vec2 operator+ (Flt r, C Vec2 &v) {return Vec2(r+v.x, r+v.y);}
  265. friend Vec2 operator- (Flt r, C Vec2 &v) {return Vec2(r-v.x, r-v.y);}
  266. friend Vec2 operator* (Flt r, C Vec2 &v) {return Vec2(r*v.x, r*v.y);}
  267. friend Vec2 operator/ (Flt r, C Vec2 &v) {return Vec2(r/v.x, r/v.y);}
  268. friend Vec2 operator+ (C Vec2 &a, C Vec2 &b) {return Vec2(a.x+b.x, a.y+b.y);}
  269. friend Vec2 operator- (C Vec2 &a, C Vec2 &b) {return Vec2(a.x-b.x, a.y-b.y);}
  270. friend Vec2 operator* (C Vec2 &a, C Vec2 &b) {return Vec2(a.x*b.x, a.y*b.y);}
  271. friend Vec2 operator/ (C Vec2 &a, C Vec2 &b) {return Vec2(a.x/b.x, a.y/b.y);}
  272. friend Vec2 operator* (C Vec2 &v, C Matrix3 &m) {return Vec2(v)*=m;}
  273. friend Vec2 operator* (C Vec2 &v, C Matrix &m) {return Vec2(v)*=m;}
  274. friend Vec2 operator/ (C Vec2 &v, C Matrix3 &m) {return Vec2(v)/=m;}
  275. friend Vec2 operator/ (C Vec2 &v, C Matrix &m) {return Vec2(v)/=m;}
  276. friend Vec2 operator& (C Vec2 &v, C Rect &r) {return Vec2(v)&=r;} // intersection
  277. friend Vec2 operator- (C Vec2 &v) {return Vec2(-v.x, -v.y);}
  278. friend Vec2 operator! (C Vec2 &v) { Vec2 ret=v; ret.normalize(); return ret;} // return normalized vector
  279. Vec2 yx ()C {return Vec2(y, x);} // return as Vec2(y, x)
  280. Vec xy0()C; // return as Vec (x, y, 0)
  281. Vec x0y()C; // return as Vec (x, 0, y)
  282. Vec _0xy()C; // return as Vec (0, x, y)
  283. Vec _0yx()C; // return as Vec (0, y, x)
  284. Bool any ( )C {return Any (x, y);} // if any component is non-zero
  285. Bool all ( )C {return x && y ;} // if all components are non-zero
  286. Bool allZero ( )C {return !x && !y ;} // if all components are zero
  287. Int minI ( )C {return MinI(x, y);} // components minimum index
  288. Int maxI ( )C {return MaxI(x, y);} // components maximum index
  289. Flt min ( )C {return Min (x, y);} // components minimum
  290. Flt max ( )C {return Max (x, y);} // components maximum
  291. Flt avg ( )C {return Avg (x, y);} // components average
  292. Flt sum ( )C {return x+ y ;} // components sum
  293. Flt mul ( )C {return x* y ;} // components multiplication
  294. Flt div ( )C {return x/ y ;} // components division
  295. Flt length ( )C; // get length
  296. Flt length2 ( )C {return x*x + y*y;} // get squared length
  297. Vec2& satLength ( ); // saturate length (clip it to 0..1)
  298. Flt setLength (Flt length ); // set length and return previous length
  299. Vec2& clipLength (Flt max_length ); // clip length to 0..max_length range
  300. Flt normalize ( ); // normalize length and return previous length
  301. Vec2& mul (C Matrix3 &m ); // transform by matrix
  302. Vec2& mul (C Matrix &m ); // transform by matrix
  303. Vec2& div (C Matrix3 &m ); // transform by matrix inverse
  304. Vec2& div (C Matrix &m ); // transform by matrix inverse
  305. Vec2& divNormalized(C Matrix3 &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  306. Vec2& divNormalized(C Matrix &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  307. Vec2& rotate (Flt angle ); // rotate by angle
  308. Vec2& rotateCosSin (Flt cos, Flt sin); // rotate by cos and sin of angle
  309. Vec2& chs ( ); // change sign of all components
  310. Vec2& abs ( ); // absolute all components
  311. Vec2& sat ( ); // saturate all components
  312. Vec2& swap ( ) {Swap(x, y); return T;} // swap components
  313. Str asText(Int precision=INT_MAX)C; // return as text
  314. #if EE_PRIVATE
  315. Vec2 asIso ()C {return Vec2(x+y , y-x );}
  316. Vec2 asIso2 ()C {return Vec2(x*2+y, y*2-x);}
  317. Vec2 asIso_2()C {return Vec2(x+y*2, y-x*2);}
  318. #endif
  319. // draw
  320. void draw(C Color &color, Flt r=0.007f)C; // this can be optionally called outside of Render function
  321. Vec2() {}
  322. Vec2(Flt r ) {set(r );}
  323. Vec2(Flt x, Flt y) {set(x, y);}
  324. Vec2(C VecH2 &v);
  325. Vec2(C VecD2 &v);
  326. Vec2(C VecI2 &v);
  327. Vec2(C VecB2 &v);
  328. Vec2(C VecSB2 &v);
  329. Vec2(C VecUS2 &v);
  330. };extern const Vec2
  331. Vec2Zero; // Vec2(0, 0)
  332. /******************************************************************************/
  333. struct VecD2 // Vector 2D (double precision)
  334. {
  335. union
  336. {
  337. struct{Dbl x, y;};
  338. struct{Dbl c[2];}; // component
  339. };
  340. VecD2& zero( ) {x=y=0; return T;}
  341. VecD2& set (Dbl r ) {x=y=r; return T;}
  342. VecD2& set (Dbl x, Dbl y) {T.x=x; T.y=y; return T;}
  343. VecD2& operator+=( Dbl r) {x+= r; y+= r; return T;}
  344. VecD2& operator-=( Dbl r) {x-= r; y-= r; return T;}
  345. VecD2& operator*=( Dbl r) {x*= r; y*= r; return T;}
  346. VecD2& operator/=( Dbl r) {x/= r; y/= r; return T;}
  347. VecD2& operator+=(C VecD2 &v) {x+=v.x; y+=v.y; return T;}
  348. VecD2& operator-=(C VecD2 &v) {x-=v.x; y-=v.y; return T;}
  349. VecD2& operator*=(C VecD2 &v) {x*=v.x; y*=v.y; return T;}
  350. VecD2& operator/=(C VecD2 &v) {x/=v.x; y/=v.y; return T;}
  351. VecD2& operator*=(C MatrixD3 &m) {return mul(m);}
  352. VecD2& operator*=(C MatrixD &m) {return mul(m);}
  353. VecD2& operator/=(C MatrixD3 &m) {return div(m);}
  354. VecD2& operator/=(C MatrixD &m) {return div(m);}
  355. Bool operator==(C VecD2 &v)C;
  356. Bool operator!=(C VecD2 &v)C;
  357. friend VecD2 operator+ (C VecD2 &v, Int i) {return VecD2(v.x+i, v.y+i);}
  358. friend VecD2 operator- (C VecD2 &v, Int i) {return VecD2(v.x-i, v.y-i);}
  359. friend VecD2 operator* (C VecD2 &v, Int i) {return VecD2(v.x*i, v.y*i);}
  360. friend VecD2 operator/ (C VecD2 &v, Int i) {return VecD2(v.x/i, v.y/i);}
  361. friend VecD2 operator+ (C VecD2 &v, Long i) {return VecD2(v.x+i, v.y+i);}
  362. friend VecD2 operator- (C VecD2 &v, Long i) {return VecD2(v.x-i, v.y-i);}
  363. friend VecD2 operator* (C VecD2 &v, Long i) {return VecD2(v.x*i, v.y*i);}
  364. friend VecD2 operator/ (C VecD2 &v, Long i) {return VecD2(v.x/i, v.y/i);}
  365. friend VecD2 operator+ (C VecD2 &v, Flt r) {return VecD2(v.x+r, v.y+r);}
  366. friend VecD2 operator- (C VecD2 &v, Flt r) {return VecD2(v.x-r, v.y-r);}
  367. friend VecD2 operator* (C VecD2 &v, Flt r) {return VecD2(v.x*r, v.y*r);}
  368. friend VecD2 operator/ (C VecD2 &v, Flt r) {return VecD2(v.x/r, v.y/r);}
  369. friend VecD2 operator+ (C VecD2 &v, Dbl r) {return VecD2(v.x+r, v.y+r);}
  370. friend VecD2 operator- (C VecD2 &v, Dbl r) {return VecD2(v.x-r, v.y-r);}
  371. friend VecD2 operator* (C VecD2 &v, Dbl r) {return VecD2(v.x*r, v.y*r);}
  372. friend VecD2 operator/ (C VecD2 &v, Dbl r) {return VecD2(v.x/r, v.y/r);}
  373. friend VecD2 operator+ (Int i, C VecD2 &v) {return VecD2(i+v.x, i+v.y);}
  374. friend VecD2 operator- (Int i, C VecD2 &v) {return VecD2(i-v.x, i-v.y);}
  375. friend VecD2 operator* (Int i, C VecD2 &v) {return VecD2(i*v.x, i*v.y);}
  376. friend VecD2 operator/ (Int i, C VecD2 &v) {return VecD2(i/v.x, i/v.y);}
  377. friend VecD2 operator+ (Long i, C VecD2 &v) {return VecD2(i+v.x, i+v.y);}
  378. friend VecD2 operator- (Long i, C VecD2 &v) {return VecD2(i-v.x, i-v.y);}
  379. friend VecD2 operator* (Long i, C VecD2 &v) {return VecD2(i*v.x, i*v.y);}
  380. friend VecD2 operator/ (Long i, C VecD2 &v) {return VecD2(i/v.x, i/v.y);}
  381. friend VecD2 operator+ (Flt r, C VecD2 &v) {return VecD2(r+v.x, r+v.y);}
  382. friend VecD2 operator- (Flt r, C VecD2 &v) {return VecD2(r-v.x, r-v.y);}
  383. friend VecD2 operator* (Flt r, C VecD2 &v) {return VecD2(r*v.x, r*v.y);}
  384. friend VecD2 operator/ (Flt r, C VecD2 &v) {return VecD2(r/v.x, r/v.y);}
  385. friend VecD2 operator+ (Dbl r, C VecD2 &v) {return VecD2(r+v.x, r+v.y);}
  386. friend VecD2 operator- (Dbl r, C VecD2 &v) {return VecD2(r-v.x, r-v.y);}
  387. friend VecD2 operator* (Dbl r, C VecD2 &v) {return VecD2(r*v.x, r*v.y);}
  388. friend VecD2 operator/ (Dbl r, C VecD2 &v) {return VecD2(r/v.x, r/v.y);}
  389. friend VecD2 operator+ (C VecD2 &a, C VecD2 &b) {return VecD2(a.x+b.x, a.y+b.y);}
  390. friend VecD2 operator- (C VecD2 &a, C VecD2 &b) {return VecD2(a.x-b.x, a.y-b.y);}
  391. friend VecD2 operator* (C VecD2 &a, C VecD2 &b) {return VecD2(a.x*b.x, a.y*b.y);}
  392. friend VecD2 operator/ (C VecD2 &a, C VecD2 &b) {return VecD2(a.x/b.x, a.y/b.y);}
  393. friend VecD2 operator* (C VecD2 &v, C MatrixD3 &m) {return VecD2(v)*=m;}
  394. friend VecD2 operator* (C VecD2 &v, C MatrixD &m) {return VecD2(v)*=m;}
  395. friend VecD2 operator/ (C VecD2 &v, C MatrixD3 &m) {return VecD2(v)/=m;}
  396. friend VecD2 operator/ (C VecD2 &v, C MatrixD &m) {return VecD2(v)/=m;}
  397. friend VecD2 operator- (C VecD2 &v) {return VecD2(-v.x, -v.y);}
  398. friend VecD2 operator! (C VecD2 &v) { VecD2 ret=v; ret.normalize(); return ret;} // return normalized vector
  399. VecD2 yx ()C {return VecD2(y, x);} // return as VecD2(y, x)
  400. VecD xy0()C; // return as VecD (x, y, 0)
  401. VecD x0y()C; // return as VecD (x, 0, y)
  402. VecD _0xy()C; // return as VecD (0, x, y)
  403. VecD _0yx()C; // return as VecD (0, y, x)
  404. Bool any ( )C {return x || y ;} // if any component is non-zero
  405. Bool all ( )C {return x && y ;} // if all components are non-zero
  406. Bool allZero ( )C {return !x && !y ;} // if all components are zero
  407. Int minI ( )C {return MinI(x, y);} // components minimum index
  408. Int maxI ( )C {return MaxI(x, y);} // components maximum index
  409. Dbl min ( )C {return Min (x, y);} // components minimum
  410. Dbl max ( )C {return Max (x, y);} // components maximum
  411. Dbl avg ( )C {return Avg (x, y);} // components average
  412. Dbl sum ( )C {return x+ y ;} // components sum
  413. Dbl mul ( )C {return x* y ;} // components multiplication
  414. Dbl div ( )C {return x/ y ;} // components division
  415. Dbl length ( )C; // get length
  416. Dbl length2 ( )C {return x*x + y*y;} // get squared length
  417. VecD2& satLength ( ); // saturate length (clip it to 0..1)
  418. Dbl setLength (Dbl length); // set length and return previous length
  419. VecD2& clipLength (Dbl max_length); // clip length to 0..max_length range
  420. Dbl normalize ( ); // normalize length and return previous length
  421. VecD2& mul (C MatrixD3 &m ); // transform by matrix
  422. VecD2& mul (C MatrixD &m ); // transform by matrix
  423. VecD2& div (C MatrixD3 &m ); // transform by matrix inverse
  424. VecD2& div (C MatrixD &m ); // transform by matrix inverse
  425. VecD2& divNormalized(C MatrixD3 &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  426. VecD2& divNormalized(C MatrixD &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  427. VecD2& chs ( ); // change sign of all components
  428. VecD2& abs ( ); // absolute all components
  429. VecD2& sat ( ); // saturate all components
  430. VecD2& swap ( ) {Swap(x, y); return T;} // swap components
  431. Str asText(Int precision=INT_MAX)C; // return as text
  432. // draw
  433. void draw(C Color &color, Flt r=0.007f)C; // this can be optionally called outside of Render function
  434. VecD2() {}
  435. VecD2(Dbl r ) {set(r );}
  436. VecD2(Dbl x, Dbl y) {set(x, y);}
  437. VecD2(C VecH2 &v);
  438. VecD2(C Vec2 &v);
  439. VecD2(C VecI2 &v);
  440. VecD2(C VecB2 &v);
  441. VecD2(C VecSB2 &v);
  442. VecD2(C VecUS2 &v);
  443. };
  444. /******************************************************************************/
  445. struct Vec // Vector 3D
  446. {
  447. union
  448. {
  449. struct{Flt x, y, z;};
  450. struct{Flt c[3] ;}; // component
  451. struct{Vec2 xy ;};
  452. };
  453. Vec& zero( ) {x=y=z=0; return T;}
  454. Vec& set (Flt r ) {x=y=z=r; return T;}
  455. Vec& set (Flt x, Flt y, Flt z) {T.x=x; T.y=y; T.z=z; return T;}
  456. Vec& set (C Vec2 &xy , Flt z) {T.xy=xy; T.z=z; return T;}
  457. Vec& operator+=( Flt r) {x+= r; y+= r; z+= r; return T;}
  458. Vec& operator-=( Flt r) {x-= r; y-= r; z-= r; return T;}
  459. Vec& operator*=( Flt r) {x*= r; y*= r; z*= r; return T;}
  460. Vec& operator/=( Flt r) {x/= r; y/= r; z/= r; return T;}
  461. Vec& operator+=(C Vec &v) {x+=v.x; y+=v.y; z+=v.z; return T;}
  462. Vec& operator-=(C Vec &v) {x-=v.x; y-=v.y; z-=v.z; return T;}
  463. Vec& operator*=(C Vec &v) {x*=v.x; y*=v.y; z*=v.z; return T;}
  464. Vec& operator/=(C Vec &v) {x/=v.x; y/=v.y; z/=v.z; return T;}
  465. Vec& operator*=(C Orient &o) {return mul(o);}
  466. Vec& operator*=(C OrientD &o) {return mul(o);}
  467. Vec& operator*=(C OrientP &o) {return mul(o);}
  468. Vec& operator*=(C OrientM &o) {return mul(o);}
  469. Vec& operator*=(C Matrix3 &m) {return mul(m);}
  470. Vec& operator/=(C Matrix3 &m) {return div(m);}
  471. Vec& operator*=(C MatrixD3 &m) {return mul(m);}
  472. Vec& operator/=(C MatrixD3 &m) {return div(m);}
  473. Vec& operator*=(C Matrix &m) {return mul(m);}
  474. Vec& operator/=(C Matrix &m) {return div(m);}
  475. Vec& operator*=(C MatrixM &m) {return mul(m);}
  476. Vec& operator/=(C MatrixM &m) {return div(m);}
  477. Vec& operator*=(C MatrixD &m) {return mul(m);}
  478. Vec& operator/=(C MatrixD &m) {return div(m);}
  479. Vec& operator&=(C Box &b) ; // intersect
  480. Vec& operator&=(C OBox &b) ; // intersect
  481. Bool operator==( Flt r)C;
  482. Bool operator!=( Flt r)C;
  483. Bool operator==(C Vec &v)C;
  484. Bool operator!=(C Vec &v)C;
  485. friend Vec operator+ (C Vec &v, Int i) {return Vec(v.x+i, v.y+i, v.z+i);}
  486. friend Vec operator- (C Vec &v, Int i) {return Vec(v.x-i, v.y-i, v.z-i);}
  487. friend Vec operator* (C Vec &v, Int i) {return Vec(v.x*i, v.y*i, v.z*i);}
  488. friend Vec operator/ (C Vec &v, Int i) {return Vec(v.x/i, v.y/i, v.z/i);}
  489. friend Vec operator+ (C Vec &v, Flt r) {return Vec(v.x+r, v.y+r, v.z+r);}
  490. friend Vec operator- (C Vec &v, Flt r) {return Vec(v.x-r, v.y-r, v.z-r);}
  491. friend Vec operator* (C Vec &v, Flt r) {return Vec(v.x*r, v.y*r, v.z*r);}
  492. friend Vec operator/ (C Vec &v, Flt r) {return Vec(v.x/r, v.y/r, v.z/r);}
  493. friend Vec operator+ (Int i, C Vec &v) {return Vec(i+v.x, i+v.y, i+v.z);}
  494. friend Vec operator- (Int i, C Vec &v) {return Vec(i-v.x, i-v.y, i-v.z);}
  495. friend Vec operator* (Int i, C Vec &v) {return Vec(i*v.x, i*v.y, i*v.z);}
  496. friend Vec operator/ (Int i, C Vec &v) {return Vec(i/v.x, i/v.y, i/v.z);}
  497. friend Vec operator+ (Flt r, C Vec &v) {return Vec(r+v.x, r+v.y, r+v.z);}
  498. friend Vec operator- (Flt r, C Vec &v) {return Vec(r-v.x, r-v.y, r-v.z);}
  499. friend Vec operator* (Flt r, C Vec &v) {return Vec(r*v.x, r*v.y, r*v.z);}
  500. friend Vec operator/ (Flt r, C Vec &v) {return Vec(r/v.x, r/v.y, r/v.z);}
  501. friend Vec operator+ (C Vec &a, C Vec &b) {return Vec(a.x+b.x, a.y+b.y, a.z+b.z);}
  502. friend Vec operator- (C Vec &a, C Vec &b) {return Vec(a.x-b.x, a.y-b.y, a.z-b.z);}
  503. friend Vec operator* (C Vec &a, C Vec &b) {return Vec(a.x*b.x, a.y*b.y, a.z*b.z);}
  504. friend Vec operator/ (C Vec &a, C Vec &b) {return Vec(a.x/b.x, a.y/b.y, a.z/b.z);}
  505. friend Vec operator* (C Vec &v, C Orient &o) {return Vec(v)*=o;}
  506. friend Vec operator* (C Vec &v, C OrientP &o) {return Vec(v)*=o;}
  507. friend Vec operator* (C Vec &v, C Matrix3 &m) {return Vec(v)*=m;}
  508. friend Vec operator* (C Vec &v, C Matrix &m) {return Vec(v)*=m;}
  509. friend Vec operator/ (C Vec &v, C Matrix3 &m) {return Vec(v)/=m;}
  510. friend Vec operator/ (C Vec &v, C Matrix &m) {return Vec(v)/=m;}
  511. friend Vec operator& (C Vec &v, C Box &b) {return Vec(v)&=b;} // intersection
  512. friend Vec operator& (C Vec &v, C OBox &b) {return Vec(v)&=b;} // intersection
  513. friend Vec operator- (C Vec &v) {return Vec(-v.x, -v.y, -v.z);}
  514. friend Vec operator! (C Vec &v) { Vec ret=v; ret.normalize(); return ret;} // return normalized vector
  515. Vec2 xz ()C {return Vec2(x, z );} // return as Vec2(x, z)
  516. Vec2 yx ()C {return Vec2(y, x );} // return as Vec2(y, x)
  517. Vec2 yz ()C {return Vec2(y, z );} // return as Vec2(y, z)
  518. Vec2 zx ()C {return Vec2(z, x );} // return as Vec2(z, x)
  519. Vec2 zy ()C {return Vec2(z, y );} // return as Vec2(z, y)
  520. Vec xzy()C {return Vec (x, z, y);} // return as Vec (x, z, y)
  521. Vec x0z()C {return Vec (x, 0, z);} // return as Vec (x, 0, z)
  522. Vec xy0()C {return Vec (x, y, 0);} // return as Vec (x, y, 0)
  523. Bool any ( )C {return Any (x, y, z);} // if any component is non-zero
  524. Bool all ( )C {return x && y && z;} // if all components are non-zero
  525. Bool allZero ( )C {return !x && !y && !z;} // if all components are zero
  526. Int minI ( )C {return MinI(x, y, z);} // components minimum index
  527. Int maxI ( )C {return MaxI(x, y, z);} // components maximum index
  528. Flt min ( )C {return Min (x, y, z);} // components minimum
  529. Flt max ( )C {return Max (x, y, z);} // components maximum
  530. Flt avg ( )C {return Avg (x, y, z);} // components average
  531. Flt sum ( )C {return x+ y+ z ;} // components sum
  532. Flt mul ( )C {return x* y* z ;} // components multiplication
  533. Flt length ( )C; // get length
  534. Flt length2 ( )C {return x*x + y*y + z*z;} // get squared length
  535. Vec& satLength ( ); // saturate length (clip it to 0..1)
  536. Flt setLength (Flt length); // set length and return previous length
  537. Vec& clipLength (Flt max_length); // clip length to 0..max_length range
  538. Flt normalize ( ); // normalize length and return previous length
  539. Vec& mul (C Orient &o ); // transform by orientation
  540. Vec& mul (C OrientD &o ); // transform by orientation
  541. Vec& mul (C OrientP &o ); // transform by orientation
  542. Vec& mul (C OrientM &o ); // transform by orientation
  543. Vec& mul (C Matrix3 &m ); // transform by matrix
  544. Vec& mul (C MatrixD3 &m ); // transform by matrix
  545. Vec& mul (C Matrix &m ); // transform by matrix
  546. Vec& mul (C MatrixM &m ); // transform by matrix
  547. Vec& mul (C MatrixD &m ); // transform by matrix
  548. Vec& div (C Matrix3 &m ); // transform by matrix inverse
  549. Vec& div (C MatrixD3 &m ); // transform by matrix inverse
  550. Vec& div (C Matrix &m ); // transform by matrix inverse
  551. Vec& div (C MatrixM &m ); // transform by matrix inverse
  552. Vec& div (C MatrixD &m ); // transform by matrix inverse
  553. Vec& divNormalized(C Matrix3 &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  554. Vec& divNormalized(C MatrixD3 &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  555. Vec& divNormalized(C Matrix &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  556. Vec& divNormalized(C MatrixM &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  557. Vec& divNormalized(C MatrixD &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  558. Vec& rotateX (Flt angle ); // rotate along X axis by angle
  559. Vec& rotateY (Flt angle ); // rotate along Y axis by angle
  560. Vec& rotateZ (Flt angle ); // rotate along Z axis by angle
  561. Vec& chs ( ); // change sign of all components
  562. Vec& abs ( ); // absolute all components
  563. Vec& sat ( ); // saturate all components
  564. Vec& swapYZ ( ) {Swap(y, z); return T;} // swap Y and Z components
  565. Vec& fromDiv (C Vec &v, C Matrix3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  566. Vec& fromDiv (C Vec &v, C MatrixD3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  567. Vec& fromDiv (C Vec &v, C Matrix &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  568. Vec& fromDiv (C Vec &v, C MatrixM &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  569. Vec& fromDiv (C Vec &v, C MatrixD &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  570. Vec& fromDiv (C VecD &v, C Matrix3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  571. Vec& fromDiv (C VecD &v, C MatrixD3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  572. Vec& fromDiv (C VecD &v, C Matrix &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  573. Vec& fromDiv (C VecD &v, C MatrixM &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  574. Vec& fromDiv (C VecD &v, C MatrixD &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix
  575. Vec& fromDivNormalized(C Vec &v, C Matrix3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  576. Vec& fromDivNormalized(C Vec &v, C MatrixD3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  577. Vec& fromDivNormalized(C Vec &v, C Matrix &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  578. Vec& fromDivNormalized(C Vec &v, C MatrixM &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  579. Vec& fromDivNormalized(C Vec &v, C MatrixD &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  580. Vec& fromDivNormalized(C VecD &v, C Matrix3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  581. Vec& fromDivNormalized(C VecD &v, C MatrixD3 &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  582. Vec& fromDivNormalized(C VecD &v, C Matrix &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  583. Vec& fromDivNormalized(C VecD &v, C MatrixM &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  584. Vec& fromDivNormalized(C VecD &v, C MatrixD &m); // set as "v/m", 'v' vector transformed by inverse of 'm' matrix , this method is faster than 'div' however 'm' must be normalized
  585. Vec& fromDivNormalized(C Vec &v, C Orient &o); // set as "v/o", 'v' vector transformed by inverse of 'o' orientation, this method is faster than 'div' however 'o' must be normalized
  586. Vec& fromDivNormalized(C Vec &v, C OrientD &o); // set as "v/o", 'v' vector transformed by inverse of 'o' orientation, this method is faster than 'div' however 'o' must be normalized
  587. Vec& fromDivNormalized(C Vec &v, C OrientP &o); // set as "v/o", 'v' vector transformed by inverse of 'o' orientation, this method is faster than 'div' however 'o' must be normalized
  588. Vec& fromDivNormalized(C Vec &v, C OrientM &o); // set as "v/o", 'v' vector transformed by inverse of 'o' orientation, this method is faster than 'div' however 'o' must be normalized
  589. #if EE_PRIVATE
  590. void rightToLeft(); // convert from right hand to left hand coordinate system
  591. #endif
  592. Str asText(Int precision=INT_MAX)C; // return as text
  593. // draw
  594. void draw (C Color &color, Flt r=0.007f)C; // draw , this can be optionally called outside of Render function, this relies on active object matrix which can be set using 'SetMatrix' function
  595. void drawP(C Color &color, Flt r=0.007f)C; // draw with perspective making size dependent on distance to camera, this can be optionally called outside of Render function, this relies on active object matrix which can be set using 'SetMatrix' function
  596. Vec() {}
  597. Vec(Flt r ) {set(r );}
  598. Vec(Flt x, Flt y, Flt z) {set(x, y, z);}
  599. Vec(C Vec2 &xy , Flt z) {set(xy , z);}
  600. Vec(C VecH &v);
  601. Vec(C VecD &v);
  602. Vec(C VecI &v);
  603. Vec(C VecB &v);
  604. Vec(C VecSB &v);
  605. };extern const Vec
  606. VecDir[DIR_NUM], // vector[DIR_ENUM] array
  607. VecZero , // Vec(0, 0, 0)
  608. VecOne ; // Vec(1, 1, 1)
  609. /******************************************************************************/
  610. struct VecD // Vector 3D (double precision)
  611. {
  612. union
  613. {
  614. struct{Dbl x, y, z;};
  615. struct{Dbl c[3] ;}; // component
  616. struct{VecD2 xy ;};
  617. };
  618. VecD& zero( ) {x=y=z=0; return T;}
  619. VecD& set (Dbl r ) {x=y=z=r; return T;}
  620. VecD& set (Dbl x, Dbl y, Dbl z) {T.x=x; T.y=y; T.z=z; return T;}
  621. VecD& set (C VecD2 &xy , Dbl z) {T.xy=xy; T.z=z; return T;}
  622. VecD& operator+=( Dbl r) {x+= r; y+= r; z+= r; return T;}
  623. VecD& operator-=( Dbl r) {x-= r; y-= r; z-= r; return T;}
  624. VecD& operator*=( Dbl r) {x*= r; y*= r; z*= r; return T;}
  625. VecD& operator/=( Dbl r) {x/= r; y/= r; z/= r; return T;}
  626. VecD& operator+=(C Vec &v) {x+=v.x; y+=v.y; z+=v.z; return T;}
  627. VecD& operator-=(C Vec &v) {x-=v.x; y-=v.y; z-=v.z; return T;}
  628. VecD& operator*=(C Vec &v) {x*=v.x; y*=v.y; z*=v.z; return T;}
  629. VecD& operator/=(C Vec &v) {x/=v.x; y/=v.y; z/=v.z; return T;}
  630. VecD& operator+=(C VecD &v) {x+=v.x; y+=v.y; z+=v.z; return T;}
  631. VecD& operator-=(C VecD &v) {x-=v.x; y-=v.y; z-=v.z; return T;}
  632. VecD& operator*=(C VecD &v) {x*=v.x; y*=v.y; z*=v.z; return T;}
  633. VecD& operator/=(C VecD &v) {x/=v.x; y/=v.y; z/=v.z; return T;}
  634. VecD& operator*=(C Orient &o) {return mul(o);}
  635. VecD& operator*=(C OrientD &o) {return mul(o);}
  636. VecD& operator*=(C OrientP &o) {return mul(o);}
  637. VecD& operator*=(C OrientM &o) {return mul(o);}
  638. VecD& operator*=(C Matrix3 &m) {return mul(m);}
  639. VecD& operator/=(C Matrix3 &m) {return div(m);}
  640. VecD& operator*=(C MatrixD3 &m) {return mul(m);}
  641. VecD& operator/=(C MatrixD3 &m) {return div(m);}
  642. VecD& operator*=(C Matrix &m) {return mul(m);}
  643. VecD& operator/=(C Matrix &m) {return div(m);}
  644. VecD& operator*=(C MatrixM &m) {return mul(m);}
  645. VecD& operator/=(C MatrixM &m) {return div(m);}
  646. VecD& operator*=(C MatrixD &m) {return mul(m);}
  647. VecD& operator/=(C MatrixD &m) {return div(m);}
  648. Bool operator==(C VecD &v)C;
  649. Bool operator!=(C VecD &v)C;
  650. friend VecD operator+ (C VecD &v, Int i) {return VecD(v.x+i, v.y+i, v.z+i);}
  651. friend VecD operator- (C VecD &v, Int i) {return VecD(v.x-i, v.y-i, v.z-i);}
  652. friend VecD operator* (C VecD &v, Int i) {return VecD(v.x*i, v.y*i, v.z*i);}
  653. friend VecD operator/ (C VecD &v, Int i) {return VecD(v.x/i, v.y/i, v.z/i);}
  654. friend VecD operator+ (C VecD &v, Long i) {return VecD(v.x+i, v.y+i, v.z+i);}
  655. friend VecD operator- (C VecD &v, Long i) {return VecD(v.x-i, v.y-i, v.z-i);}
  656. friend VecD operator* (C VecD &v, Long i) {return VecD(v.x*i, v.y*i, v.z*i);}
  657. friend VecD operator/ (C VecD &v, Long i) {return VecD(v.x/i, v.y/i, v.z/i);}
  658. friend VecD operator+ (C VecD &v, Flt r) {return VecD(v.x+r, v.y+r, v.z+r);}
  659. friend VecD operator- (C VecD &v, Flt r) {return VecD(v.x-r, v.y-r, v.z-r);}
  660. friend VecD operator* (C VecD &v, Flt r) {return VecD(v.x*r, v.y*r, v.z*r);}
  661. friend VecD operator/ (C VecD &v, Flt r) {return VecD(v.x/r, v.y/r, v.z/r);}
  662. friend VecD operator+ (C VecD &v, Dbl r) {return VecD(v.x+r, v.y+r, v.z+r);}
  663. friend VecD operator- (C VecD &v, Dbl r) {return VecD(v.x-r, v.y-r, v.z-r);}
  664. friend VecD operator* (C VecD &v, Dbl r) {return VecD(v.x*r, v.y*r, v.z*r);}
  665. friend VecD operator/ (C VecD &v, Dbl r) {return VecD(v.x/r, v.y/r, v.z/r);}
  666. friend VecD operator+ (Int i, C VecD &v) {return VecD(i+v.x, i+v.y, i+v.z);}
  667. friend VecD operator- (Int i, C VecD &v) {return VecD(i-v.x, i-v.y, i-v.z);}
  668. friend VecD operator* (Int i, C VecD &v) {return VecD(i*v.x, i*v.y, i*v.z);}
  669. friend VecD operator/ (Int i, C VecD &v) {return VecD(i/v.x, i/v.y, i/v.z);}
  670. friend VecD operator+ (Long i, C VecD &v) {return VecD(i+v.x, i+v.y, i+v.z);}
  671. friend VecD operator- (Long i, C VecD &v) {return VecD(i-v.x, i-v.y, i-v.z);}
  672. friend VecD operator* (Long i, C VecD &v) {return VecD(i*v.x, i*v.y, i*v.z);}
  673. friend VecD operator/ (Long i, C VecD &v) {return VecD(i/v.x, i/v.y, i/v.z);}
  674. friend VecD operator+ (Flt r, C VecD &v) {return VecD(r+v.x, r+v.y, r+v.z);}
  675. friend VecD operator- (Flt r, C VecD &v) {return VecD(r-v.x, r-v.y, r-v.z);}
  676. friend VecD operator* (Flt r, C VecD &v) {return VecD(r*v.x, r*v.y, r*v.z);}
  677. friend VecD operator/ (Flt r, C VecD &v) {return VecD(r/v.x, r/v.y, r/v.z);}
  678. friend VecD operator+ (Dbl r, C VecD &v) {return VecD(r+v.x, r+v.y, r+v.z);}
  679. friend VecD operator- (Dbl r, C VecD &v) {return VecD(r-v.x, r-v.y, r-v.z);}
  680. friend VecD operator* (Dbl r, C VecD &v) {return VecD(r*v.x, r*v.y, r*v.z);}
  681. friend VecD operator/ (Dbl r, C VecD &v) {return VecD(r/v.x, r/v.y, r/v.z);}
  682. friend VecD operator+ (C Vec &a, C VecD &b) {return VecD(a.x+b.x, a.y+b.y, a.z+b.z);}
  683. friend VecD operator- (C Vec &a, C VecD &b) {return VecD(a.x-b.x, a.y-b.y, a.z-b.z);}
  684. friend VecD operator* (C Vec &a, C VecD &b) {return VecD(a.x*b.x, a.y*b.y, a.z*b.z);}
  685. friend VecD operator/ (C Vec &a, C VecD &b) {return VecD(a.x/b.x, a.y/b.y, a.z/b.z);}
  686. friend VecD operator+ (C VecD &a, C Vec &b) {return VecD(a.x+b.x, a.y+b.y, a.z+b.z);}
  687. friend VecD operator- (C VecD &a, C Vec &b) {return VecD(a.x-b.x, a.y-b.y, a.z-b.z);}
  688. friend VecD operator* (C VecD &a, C Vec &b) {return VecD(a.x*b.x, a.y*b.y, a.z*b.z);}
  689. friend VecD operator/ (C VecD &a, C Vec &b) {return VecD(a.x/b.x, a.y/b.y, a.z/b.z);}
  690. friend VecD operator+ (C VecD &a, C VecD &b) {return VecD(a.x+b.x, a.y+b.y, a.z+b.z);}
  691. friend VecD operator- (C VecD &a, C VecD &b) {return VecD(a.x-b.x, a.y-b.y, a.z-b.z);}
  692. friend VecD operator* (C VecD &a, C VecD &b) {return VecD(a.x*b.x, a.y*b.y, a.z*b.z);}
  693. friend VecD operator/ (C VecD &a, C VecD &b) {return VecD(a.x/b.x, a.y/b.y, a.z/b.z);}
  694. friend VecD operator* (C VecD &v, C Orient &o) {return VecD(v)*=o;}
  695. friend VecD operator* (C VecD &v, C OrientD &o) {return VecD(v)*=o;}
  696. friend VecD operator* (C VecD &v, C OrientP &o) {return VecD(v)*=o;}
  697. friend VecD operator* (C VecD &v, C OrientM &o) {return VecD(v)*=o;}
  698. friend VecD operator* (C VecD &v, C Matrix3 &m) {return VecD(v)*=m;}
  699. friend VecD operator* (C VecD &v, C MatrixD3 &m) {return VecD(v)*=m;}
  700. friend VecD operator* (C VecD &v, C Matrix &m) {return VecD(v)*=m;}
  701. friend VecD operator* (C VecD &v, C MatrixM &m) {return VecD(v)*=m;}
  702. friend VecD operator* (C VecD &v, C MatrixD &m) {return VecD(v)*=m;}
  703. friend VecD operator/ (C VecD &v, C Matrix3 &m) {return VecD(v)/=m;}
  704. friend VecD operator/ (C VecD &v, C MatrixD3 &m) {return VecD(v)/=m;}
  705. friend VecD operator/ (C VecD &v, C Matrix &m) {return VecD(v)/=m;}
  706. friend VecD operator/ (C VecD &v, C MatrixM &m) {return VecD(v)/=m;}
  707. friend VecD operator/ (C VecD &v, C MatrixD &m) {return VecD(v)/=m;}
  708. friend VecD operator- (C VecD &v) {return VecD(-v.x, -v.y, -v.z);}
  709. friend VecD operator! (C VecD &v) { VecD ret=v; ret.normalize(); return ret;} // return normalized vector
  710. VecD2 xz()C {return VecD2(x, z);} // return as VecD2(x, z)
  711. VecD2 yx()C {return VecD2(y, x);} // return as VecD2(y, x)
  712. VecD2 yz()C {return VecD2(y, z);} // return as VecD2(y, z)
  713. VecD2 zx()C {return VecD2(z, x);} // return as VecD2(z, x)
  714. VecD2 zy()C {return VecD2(z, y);} // return as VecD2(z, y)
  715. Bool any ( )C {return x || y || z;} // if any component is non-zero
  716. Bool all ( )C {return x && y && z;} // if all components are non-zero
  717. Bool allZero ( )C {return !x && !y && !z;} // if all components are zero
  718. Int minI ( )C {return MinI(x, y, z);} // components minimum index
  719. Int maxI ( )C {return MaxI(x, y, z);} // components maximum index
  720. Dbl min ( )C {return Min (x, y, z);} // components minimum
  721. Dbl max ( )C {return Max (x, y, z);} // components maximum
  722. Dbl avg ( )C {return Avg (x, y, z);} // components average
  723. Dbl sum ( )C {return x+ y+ z ;} // components sum
  724. Dbl mul ( )C {return x* y* z ;} // components multiplication
  725. Dbl length ( )C; // get length
  726. Dbl length2 ( )C {return x*x + y*y + z*z;} // get squared length
  727. VecD& satLength ( ); // saturate length (clip it to 0..1)
  728. Dbl setLength (Dbl length); // set length and return previous length
  729. VecD& clipLength (Dbl max_length); // clip length to 0..max_length range
  730. Dbl normalize ( ); // normalize length and return previous length
  731. VecD& mul (C Orient &o ); // transform by orientation
  732. VecD& mul (C OrientD &o ); // transform by orientation
  733. VecD& mul (C OrientP &o ); // transform by orientation
  734. VecD& mul (C OrientM &o ); // transform by orientation
  735. VecD& mul (C Matrix3 &m ); // transform by matrix
  736. VecD& mul (C MatrixD3 &m ); // transform by matrix
  737. VecD& mul (C Matrix &m ); // transform by matrix
  738. VecD& mul (C MatrixM &m ); // transform by matrix
  739. VecD& mul (C MatrixD &m ); // transform by matrix
  740. VecD& div (C Matrix3 &m ); // transform by matrix inverse
  741. VecD& div (C MatrixD3 &m ); // transform by matrix inverse
  742. VecD& div (C Matrix &m ); // transform by matrix inverse
  743. VecD& div (C MatrixM &m ); // transform by matrix inverse
  744. VecD& div (C MatrixD &m ); // transform by matrix inverse
  745. VecD& divNormalized(C Matrix3 &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  746. VecD& divNormalized(C MatrixD3 &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  747. VecD& divNormalized(C Matrix &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  748. VecD& divNormalized(C MatrixM &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  749. VecD& divNormalized(C MatrixD &m ); // transform by matrix inverse, this method is faster than 'div' however 'm' must be normalized
  750. VecD& chs ( ); // change sign of all components
  751. VecD& abs ( ); // absolute all components
  752. VecD& sat ( ); // saturate all components
  753. VecD& swapYZ ( ) {Swap(y, z); return T;} // swap Y and Z components
  754. Str asText(Int precision=INT_MAX)C; // return as text
  755. // draw
  756. void draw (C Color &color, Flt r=0.007f)C; // draw , this can be optionally called outside of Render function, this relies on active object matrix which can be set using 'SetMatrix' function
  757. void drawP(C Color &color, Flt r=0.007f)C; // draw with perspective making size dependent on distance to camera, this can be optionally called outside of Render function, this relies on active object matrix which can be set using 'SetMatrix' function
  758. VecD() {}
  759. VecD(Dbl r ) {set(r );}
  760. VecD(Dbl x, Dbl y, Dbl z) {set(x, y, z);}
  761. VecD(C VecD2 &xy , Dbl z) {set(xy , z);}
  762. VecD(C VecH &v);
  763. VecD(C Vec &v);
  764. VecD(C VecI &v);
  765. VecD(C VecB &v);
  766. VecD(C VecSB &v);
  767. };
  768. /******************************************************************************/
  769. struct Vec4 // Vector 4D
  770. {
  771. union
  772. {
  773. struct{Flt x, y, z, w;};
  774. struct{Flt c[4] ;}; // component
  775. struct{Vec2 xy, zw ;};
  776. struct{Vec xyz ;};
  777. };
  778. Vec4& zero( ) {x=y=z=w=0; return T;}
  779. Vec4& set (Flt r ) {x=y=z=w=r; return T;}
  780. Vec4& set (Flt x, Flt y, Flt z, Flt w) {T.x=x; T.y=y; T.z=z; T.w=w; return T;}
  781. Vec4& set (C Vec2 &xy , Flt z, Flt w) {T.xy =xy ; T.z=z; T.w=w; return T;}
  782. Vec4& set (C Vec &xyz, Flt w) {T.xyz=xyz; T.w=w; return T;}
  783. Vec4& set (C Vec2 &xy , C Vec2 &zw ) {T.xy =xy ; T.zw=zw; return T;}
  784. Vec4& operator+=( Flt r) {x+= r; y+= r; z+= r; w+= r; return T;}
  785. Vec4& operator-=( Flt r) {x-= r; y-= r; z-= r; w-= r; return T;}
  786. Vec4& operator*=( Flt r) {x*= r; y*= r; z*= r; w*= r; return T;}
  787. Vec4& operator/=( Flt r) {x/= r; y/= r; z/= r; w/= r; return T;}
  788. Vec4& operator+=(C Vec4 &v) {x+=v.x; y+=v.y; z+=v.z; w+=v.w; return T;}
  789. Vec4& operator-=(C Vec4 &v) {x-=v.x; y-=v.y; z-=v.z; w-=v.w; return T;}
  790. Vec4& operator*=(C Vec4 &v) {x*=v.x; y*=v.y; z*=v.z; w*=v.w; return T;}
  791. Vec4& operator/=(C Vec4 &v) {x/=v.x; y/=v.y; z/=v.z; w/=v.w; return T;}
  792. Vec4& operator*=(C Matrix4 &m) {return mul(m);}
  793. Bool operator==( Flt r)C;
  794. Bool operator!=( Flt r)C;
  795. Bool operator==(C Vec4 &v)C;
  796. Bool operator!=(C Vec4 &v)C;
  797. friend Vec4 operator+ (C Vec4 &v, Int i) {return Vec4(v.x+i, v.y+i, v.z+i, v.w+i);}
  798. friend Vec4 operator- (C Vec4 &v, Int i) {return Vec4(v.x-i, v.y-i, v.z-i, v.w-i);}
  799. friend Vec4 operator* (C Vec4 &v, Int i) {return Vec4(v.x*i, v.y*i, v.z*i, v.w*i);}
  800. friend Vec4 operator/ (C Vec4 &v, Int i) {return Vec4(v.x/i, v.y/i, v.z/i, v.w/i);}
  801. friend Vec4 operator+ (C Vec4 &v, Flt r) {return Vec4(v.x+r, v.y+r, v.z+r, v.w+r);}
  802. friend Vec4 operator- (C Vec4 &v, Flt r) {return Vec4(v.x-r, v.y-r, v.z-r, v.w-r);}
  803. friend Vec4 operator* (C Vec4 &v, Flt r) {return Vec4(v.x*r, v.y*r, v.z*r, v.w*r);}
  804. friend Vec4 operator/ (C Vec4 &v, Flt r) {return Vec4(v.x/r, v.y/r, v.z/r, v.w/r);}
  805. friend Vec4 operator+ (Int i, C Vec4 &v) {return Vec4(i+v.x, i+v.y, i+v.z, i+v.w);}
  806. friend Vec4 operator- (Int i, C Vec4 &v) {return Vec4(i-v.x, i-v.y, i-v.z, i-v.w);}
  807. friend Vec4 operator* (Int i, C Vec4 &v) {return Vec4(i*v.x, i*v.y, i*v.z, i*v.w);}
  808. friend Vec4 operator/ (Int i, C Vec4 &v) {return Vec4(i/v.x, i/v.y, i/v.z, i/v.w);}
  809. friend Vec4 operator+ (Flt r, C Vec4 &v) {return Vec4(r+v.x, r+v.y, r+v.z, r+v.w);}
  810. friend Vec4 operator- (Flt r, C Vec4 &v) {return Vec4(r-v.x, r-v.y, r-v.z, r-v.w);}
  811. friend Vec4 operator* (Flt r, C Vec4 &v) {return Vec4(r*v.x, r*v.y, r*v.z, r*v.w);}
  812. friend Vec4 operator/ (Flt r, C Vec4 &v) {return Vec4(r/v.x, r/v.y, r/v.z, r/v.w);}
  813. friend Vec4 operator+ (C Vec4 &a, C Vec4 &b) {return Vec4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  814. friend Vec4 operator- (C Vec4 &a, C Vec4 &b) {return Vec4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  815. friend Vec4 operator* (C Vec4 &a, C Vec4 &b) {return Vec4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  816. friend Vec4 operator/ (C Vec4 &a, C Vec4 &b) {return Vec4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  817. friend Vec4 operator* (C Vec4 &v, C Matrix4 &m) {return Vec4(v)*=m;}
  818. friend Vec4 operator- (C Vec4 &v) {return Vec4(-v.x, -v.y, -v.z, -v.w);}
  819. friend Vec4 operator! (C Vec4 &v) { Vec4 ret=v; ret.normalize(); return ret;} // return normalized vector
  820. Bool any ()C {return Any (x, y, z, w);} // if any component is non-zero
  821. Bool all ()C {return x && y && z && w;} // if all components are non-zero
  822. Bool allZero ()C {return !x && !y && !z && !w;} // if all components are zero
  823. Int minI ()C {return MinI(x, y, z, w);} // components minimum index
  824. Int maxI ()C {return MaxI(x, y, z, w);} // components maximum index
  825. Flt min ()C {return Min (x, y, z, w);} // components minimum
  826. Flt max ()C {return Max (x, y, z, w);} // components maximum
  827. Flt avg ()C {return Avg (x, y, z, w);} // components average
  828. Flt sum ()C {return x+ y+ z+ w ;} // components sum
  829. Flt mul ()C {return x* y* z* w ;} // components multiplication
  830. Flt length ()C; // get length
  831. Flt length2 ()C {return x*x + y*y + z*z + w*w;} // get squared length
  832. Flt normalize(); // normalize and return previous length
  833. Vec4& mul (C Matrix4 &m); // transform by matrix
  834. Vec4& chs (); // change sign of all components
  835. Vec4& abs (); // absolute all components
  836. Vec4& sat (); // saturate all components
  837. Str asText(Int precision=INT_MAX)C; // return as text
  838. Vec4() {}
  839. Vec4(Flt r ) {set(r );}
  840. Vec4(Flt x, Flt y, Flt z, Flt w) {set(x, y, z, w);}
  841. Vec4(C Vec2 &xy , Flt z, Flt w) {set(xy , z, w);}
  842. Vec4(C Vec &xyz, Flt w) {set(xyz, w);}
  843. Vec4(C Vec2 &xy , C Vec2 &zw ) {set(xy , zw);}
  844. Vec4(C VecH4 &v);
  845. Vec4(C VecD4 &v);
  846. Vec4(C VecI4 &v);
  847. Vec4(C VecB4 &v);
  848. Vec4(C VecSB4 &v);
  849. };extern Vec4
  850. const Vec4Zero; // Vec4(0, 0, 0, 0)
  851. /******************************************************************************/
  852. struct VecD4 // Vector 4D (double precision)
  853. {
  854. union
  855. {
  856. struct{Dbl x, y, z, w;};
  857. struct{Dbl c[4] ;}; // component
  858. struct{VecD2 xy, zw ;};
  859. struct{VecD xyz ;};
  860. };
  861. VecD4& zero( ) {x=y=z=w=0; return T;}
  862. VecD4& set (Dbl r ) {x=y=z=w=r; return T;}
  863. VecD4& set (Dbl x, Dbl y, Dbl z, Dbl w) {T.x=x; T.y=y; T.z=z; T.w=w; return T;}
  864. VecD4& set (C VecD2 &xy , Dbl z, Dbl w) {T.xy =xy ; T.z=z; T.w=w; return T;}
  865. VecD4& set (C VecD &xyz, Dbl w) {T.xyz=xyz; T.w=w; return T;}
  866. VecD4& set (C VecD2 &xy , C VecD2 &zw ) {T.xy =xy ; T.zw=zw; return T;}
  867. VecD4& operator+=( Dbl r) {x+= r; y+= r; z+= r; w+= r; return T;}
  868. VecD4& operator-=( Dbl r) {x-= r; y-= r; z-= r; w-= r; return T;}
  869. VecD4& operator*=( Dbl r) {x*= r; y*= r; z*= r; w*= r; return T;}
  870. VecD4& operator/=( Dbl r) {x/= r; y/= r; z/= r; w/= r; return T;}
  871. VecD4& operator+=(C VecD4 &v) {x+=v.x; y+=v.y; z+=v.z; w+=v.w; return T;}
  872. VecD4& operator-=(C VecD4 &v) {x-=v.x; y-=v.y; z-=v.z; w-=v.w; return T;}
  873. VecD4& operator*=(C VecD4 &v) {x*=v.x; y*=v.y; z*=v.z; w*=v.w; return T;}
  874. VecD4& operator/=(C VecD4 &v) {x/=v.x; y/=v.y; z/=v.z; w/=v.w; return T;}
  875. Bool operator==(C VecD4 &v)C;
  876. Bool operator!=(C VecD4 &v)C;
  877. friend VecD4 operator+ (C VecD4 &v, Int i) {return VecD4(v.x+i, v.y+i, v.z+i, v.w+i);}
  878. friend VecD4 operator- (C VecD4 &v, Int i) {return VecD4(v.x-i, v.y-i, v.z-i, v.w-i);}
  879. friend VecD4 operator* (C VecD4 &v, Int i) {return VecD4(v.x*i, v.y*i, v.z*i, v.w*i);}
  880. friend VecD4 operator/ (C VecD4 &v, Int i) {return VecD4(v.x/i, v.y/i, v.z/i, v.w/i);}
  881. friend VecD4 operator+ (C VecD4 &v, Long i) {return VecD4(v.x+i, v.y+i, v.z+i, v.w+i);}
  882. friend VecD4 operator- (C VecD4 &v, Long i) {return VecD4(v.x-i, v.y-i, v.z-i, v.w-i);}
  883. friend VecD4 operator* (C VecD4 &v, Long i) {return VecD4(v.x*i, v.y*i, v.z*i, v.w*i);}
  884. friend VecD4 operator/ (C VecD4 &v, Long i) {return VecD4(v.x/i, v.y/i, v.z/i, v.w/i);}
  885. friend VecD4 operator+ (C VecD4 &v, Flt r) {return VecD4(v.x+r, v.y+r, v.z+r, v.w+r);}
  886. friend VecD4 operator- (C VecD4 &v, Flt r) {return VecD4(v.x-r, v.y-r, v.z-r, v.w-r);}
  887. friend VecD4 operator* (C VecD4 &v, Flt r) {return VecD4(v.x*r, v.y*r, v.z*r, v.w*r);}
  888. friend VecD4 operator/ (C VecD4 &v, Flt r) {return VecD4(v.x/r, v.y/r, v.z/r, v.w/r);}
  889. friend VecD4 operator+ (C VecD4 &v, Dbl r) {return VecD4(v.x+r, v.y+r, v.z+r, v.w+r);}
  890. friend VecD4 operator- (C VecD4 &v, Dbl r) {return VecD4(v.x-r, v.y-r, v.z-r, v.w-r);}
  891. friend VecD4 operator* (C VecD4 &v, Dbl r) {return VecD4(v.x*r, v.y*r, v.z*r, v.w*r);}
  892. friend VecD4 operator/ (C VecD4 &v, Dbl r) {return VecD4(v.x/r, v.y/r, v.z/r, v.w/r);}
  893. friend VecD4 operator+ (Int i, C VecD4 &v) {return VecD4(i+v.x, i+v.y, i+v.z, i+v.w);}
  894. friend VecD4 operator- (Int i, C VecD4 &v) {return VecD4(i-v.x, i-v.y, i-v.z, i-v.w);}
  895. friend VecD4 operator* (Int i, C VecD4 &v) {return VecD4(i*v.x, i*v.y, i*v.z, i*v.w);}
  896. friend VecD4 operator/ (Int i, C VecD4 &v) {return VecD4(i/v.x, i/v.y, i/v.z, i/v.w);}
  897. friend VecD4 operator+ (Long i, C VecD4 &v) {return VecD4(i+v.x, i+v.y, i+v.z, i+v.w);}
  898. friend VecD4 operator- (Long i, C VecD4 &v) {return VecD4(i-v.x, i-v.y, i-v.z, i-v.w);}
  899. friend VecD4 operator* (Long i, C VecD4 &v) {return VecD4(i*v.x, i*v.y, i*v.z, i*v.w);}
  900. friend VecD4 operator/ (Long i, C VecD4 &v) {return VecD4(i/v.x, i/v.y, i/v.z, i/v.w);}
  901. friend VecD4 operator+ (Flt r, C VecD4 &v) {return VecD4(r+v.x, r+v.y, r+v.z, r+v.w);}
  902. friend VecD4 operator- (Flt r, C VecD4 &v) {return VecD4(r-v.x, r-v.y, r-v.z, r-v.w);}
  903. friend VecD4 operator* (Flt r, C VecD4 &v) {return VecD4(r*v.x, r*v.y, r*v.z, r*v.w);}
  904. friend VecD4 operator/ (Flt r, C VecD4 &v) {return VecD4(r/v.x, r/v.y, r/v.z, r/v.w);}
  905. friend VecD4 operator+ (Dbl r, C VecD4 &v) {return VecD4(r+v.x, r+v.y, r+v.z, r+v.w);}
  906. friend VecD4 operator- (Dbl r, C VecD4 &v) {return VecD4(r-v.x, r-v.y, r-v.z, r-v.w);}
  907. friend VecD4 operator* (Dbl r, C VecD4 &v) {return VecD4(r*v.x, r*v.y, r*v.z, r*v.w);}
  908. friend VecD4 operator/ (Dbl r, C VecD4 &v) {return VecD4(r/v.x, r/v.y, r/v.z, r/v.w);}
  909. friend VecD4 operator+ (C VecD4 &a, C VecD4 &b) {return VecD4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  910. friend VecD4 operator- (C VecD4 &a, C VecD4 &b) {return VecD4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  911. friend VecD4 operator* (C VecD4 &a, C VecD4 &b) {return VecD4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  912. friend VecD4 operator/ (C VecD4 &a, C VecD4 &b) {return VecD4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  913. friend VecD4 operator- (C VecD4 &v) {return VecD4(-v.x, -v.y, -v.z, -v.w);}
  914. friend VecD4 operator! (C VecD4 &v) { VecD4 ret=v; ret.normalize(); return ret;} // return normalized vector
  915. Bool any ()C {return x || y || z || w;} // if any component is non-zero
  916. Bool all ()C {return x && y && z && w;} // if all components are non-zero
  917. Bool allZero ()C {return !x && !y && !z && !w;} // if all components are zero
  918. Int minI ()C {return MinI(x, y, z, w);} // components minimum index
  919. Int maxI ()C {return MaxI(x, y, z, w);} // components maximum index
  920. Dbl min ()C {return Min (x, y, z, w);} // components minimum
  921. Dbl max ()C {return Max (x, y, z, w);} // components maximum
  922. Dbl avg ()C {return Avg (x, y, z, w);} // components average
  923. Dbl sum ()C {return x+ y+ z+ w ;} // components sum
  924. Dbl mul ()C {return x* y* z* w ;} // components multiplication
  925. Dbl length ()C; // get length
  926. Dbl length2 ()C {return x*x + y*y + z*z + w*w;} // get squared length
  927. Dbl normalize(); // normalize and return previous length
  928. VecD4& chs (); // change sign of all components
  929. VecD4& abs (); // absolute all components
  930. VecD4& sat (); // saturate all components
  931. Str asText(Int precision=INT_MAX)C; // return as text
  932. VecD4() {}
  933. VecD4(Dbl r ) {set(r );}
  934. VecD4(Dbl x, Dbl y, Dbl z, Dbl w) {set(x, y, z, w);}
  935. VecD4(C VecD2 &xy , Dbl z, Dbl w) {set(xy , z, w);}
  936. VecD4(C VecD &xyz, Dbl w) {set(xyz, w);}
  937. VecD4(C VecD2 &xy , C VecD2 &zw ) {set(xy , zw);}
  938. VecD4(C VecH4 &v);
  939. VecD4(C Vec4 &v);
  940. VecD4(C VecI4 &v);
  941. VecD4(C VecB4 &v);
  942. VecD4(C VecSB4 &v);
  943. };
  944. /******************************************************************************/
  945. struct VecB2 // Vector 2D (Byte)
  946. {
  947. union
  948. {
  949. struct{Byte x, y;};
  950. struct{Byte c[2];}; // component
  951. };
  952. VecB2& zero( ) {x=y=0; return T;}
  953. VecB2& set (Byte i ) {x=y=i; return T;}
  954. VecB2& set (Byte x, Byte y) {T.x=x; T.y=y; return T;}
  955. Bool operator==(C VecB2 &v)C {return x==v.x && y==v.y;}
  956. Bool operator!=(C VecB2 &v)C {return x!=v.x || y!=v.y;}
  957. Bool any ()C {return x || y;} // if any component is non-zero
  958. Bool all ()C {return x && y;} // if all components are non-zero
  959. Bool allZero ()C {return !x && !y;} // if all components are zero
  960. Bool allDifferent()C {return x!=y ;} // if all components are different
  961. Int minI ()C {return MinI(x, y);} // components minimum index
  962. Int maxI ()C {return MaxI(x, y);} // components maximum index
  963. Int min ()C {return Min (x, y);} // components minimum
  964. Int max ()C {return Max (x, y);} // components maximum
  965. Int sum ()C {return x+ y ;} // components sum
  966. VecB2& reverse () {Swap(x, y); return T;} // reverse components order
  967. VecB2() {}
  968. VecB2(Byte i ) {set(i );}
  969. VecB2(Byte x, Byte y) {set(x, y);}
  970. };
  971. /******************************************************************************/
  972. struct VecSB2 // Vector 2D (SByte)
  973. {
  974. union
  975. {
  976. struct{SByte x, y;};
  977. struct{SByte c[2];}; // component
  978. };
  979. VecSB2& zero( ) {x=y=0; return T;}
  980. VecSB2& set (SByte i ) {x=y=i; return T;}
  981. VecSB2& set (SByte x, SByte y) {T.x=x; T.y=y; return T;}
  982. Bool operator==(C VecSB2 &v)C {return x==v.x && y==v.y;}
  983. Bool operator!=(C VecSB2 &v)C {return x!=v.x || y!=v.y;}
  984. Bool any ()C {return x || y;} // if any component is non-zero
  985. Bool all ()C {return x && y;} // if all components are non-zero
  986. Bool allZero ()C {return !x && !y;} // if all components are zero
  987. Bool allDifferent()C {return x!=y ;} // if all components are different
  988. Int minI ()C {return MinI(x, y);} // components minimum index
  989. Int maxI ()C {return MaxI(x, y);} // components maximum index
  990. Int min ()C {return Min (x, y);} // components minimum
  991. Int max ()C {return Max (x, y);} // components maximum
  992. Int sum ()C {return x+ y ;} // components sum
  993. VecSB2& reverse () {Swap(x, y); return T;} // reverse components order
  994. VecSB2() {}
  995. VecSB2(SByte i ) {set(i );}
  996. VecSB2(SByte x, SByte y) {set(x, y);}
  997. };
  998. /******************************************************************************/
  999. struct VecB // Vector 3D (Byte)
  1000. {
  1001. union
  1002. {
  1003. struct{Byte x, y, z;};
  1004. struct{Byte c[3] ;}; // component
  1005. struct{VecB2 xy ;};
  1006. };
  1007. VecB& zero( ) {x=y=z=0; return T;}
  1008. VecB& set (Byte i ) {x=y=z=i; return T;}
  1009. VecB& set (Byte x, Byte y, Byte z) {T.x=x; T.y=y; T.z=z; return T;}
  1010. Bool operator==(C VecB &v)C {return x==v.x && y==v.y && z==v.z;}
  1011. Bool operator!=(C VecB &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1012. Bool any ( )C {return x || y || z;} // if any component is non-zero
  1013. Bool all ( )C {return x && y && z;} // if all components are non-zero
  1014. Bool allZero ( )C {return !x && !y && !z;} // if all components are zero
  1015. Bool allDifferent( )C {return x!=y && x!=z && y!=z;} // if all components are different
  1016. Int minI ( )C {return MinI(x, y, z);} // components minimum index
  1017. Int maxI ( )C {return MaxI(x, y, z);} // components maximum index
  1018. Int min ( )C {return Min (x, y, z);} // components minimum
  1019. Int max ( )C {return Max (x, y, z);} // components maximum
  1020. Int sum ( )C {return x+ y+ z ;} // components sum
  1021. Int find (Int value)C; // get index of first component that equals 'value' (-1 if none)
  1022. VecB& reverse ( ) { Swap(x, z); return T;} // reverse components order
  1023. VecB() {}
  1024. VecB(Byte i ) {set(i );}
  1025. VecB(Byte x, Byte y, Byte z) {set(x, y, z);}
  1026. };
  1027. /******************************************************************************/
  1028. struct VecSB // Vector 3D (SByte)
  1029. {
  1030. union
  1031. {
  1032. struct{SByte x, y, z;};
  1033. struct{SByte c[3] ;}; // component
  1034. struct{VecSB2 xy ;};
  1035. };
  1036. VecSB& zero( ) {x=y=z=0; return T;}
  1037. VecSB& set (SByte i ) {x=y=z=i; return T;}
  1038. VecSB& set (SByte x, SByte y, SByte z) {T.x=x; T.y=y; T.z=z; return T;}
  1039. Bool operator==(C VecSB &v)C {return x==v.x && y==v.y && z==v.z;}
  1040. Bool operator!=(C VecSB &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1041. Bool any ( )C {return x || y || z;} // if any component is non-zero
  1042. Bool all ( )C {return x && y && z;} // if all components are non-zero
  1043. Bool allZero ( )C {return !x && !y && !z;} // if all components are zero
  1044. Bool allDifferent( )C {return x!=y && x!=z && y!=z;} // if all components are different
  1045. Int minI ( )C {return MinI(x, y, z);} // components minimum index
  1046. Int maxI ( )C {return MaxI(x, y, z);} // components maximum index
  1047. Int min ( )C {return Min (x, y, z);} // components minimum
  1048. Int max ( )C {return Max (x, y, z);} // components maximum
  1049. Int sum ( )C {return x+ y+ z ;} // components sum
  1050. Int find (Int value)C; // get index of first component that equals 'value' (-1 if none)
  1051. VecSB& reverse ( ) { Swap(x, z); return T;} // reverse components order
  1052. VecSB() {}
  1053. VecSB(SByte i ) {set(i );}
  1054. VecSB(SByte x, SByte y, SByte z) {set(x, y, z);}
  1055. };
  1056. /******************************************************************************/
  1057. struct VecB4 // Vector 4D (Byte)
  1058. {
  1059. union
  1060. {
  1061. struct{Byte x, y, z, w;};
  1062. struct{Byte c[4] ;}; // component
  1063. struct{UInt u ;};
  1064. struct{VecB2 xy, zw ;};
  1065. struct{VecB xyz ;};
  1066. };
  1067. VecB4& zero( ) {u=0; return T;}
  1068. VecB4& set (Byte i ) {x=y=z=w=i; return T;}
  1069. VecB4& set (Byte x, Byte y, Byte z, Byte w) {T.x=x; T.y=y; T.z=z; T.w=w; return T;}
  1070. void operator++( Int ) {x++ ; y++ ; z++ ; w++ ;}
  1071. void operator--( Int ) {x-- ; y-- ; z-- ; w-- ;}
  1072. VecB4& operator+=( Int i) {x+=i; y+=i; z+=i; w+=i; return T;}
  1073. VecB4& operator-=( Int i) {x-=i; y-=i; z-=i; w-=i; return T;}
  1074. Bool operator==(C VecB4 &v)C {return u==v.u;}
  1075. Bool operator!=(C VecB4 &v)C {return u!=v.u;}
  1076. friend VecB4 operator+ (C VecB4 &v, Int i) {return VecB4(v.x+i, v.y+i, v.z+i, v.w+i);}
  1077. friend VecB4 operator- (C VecB4 &v, Int i) {return VecB4(v.x-i, v.y-i, v.z-i, v.w-i);}
  1078. Bool any ( )C {return u!=0 ;} // if any component is non-zero, faster version of "x || y || z || w"
  1079. Bool all ( )C {return x && y && z && w;} // if all components are non-zero
  1080. Bool allZero ( )C {return u==0;} // if all components are zero
  1081. Bool allDifferent( )C {return x!=y && x!=z && x!=w && y!=z && y!=w && z!=w;} // if all components are different
  1082. Int minI ( )C {return MinI(x, y, z, w);} // components minimum index
  1083. Int maxI ( )C {return MaxI(x, y, z, w);} // components maximum index
  1084. Int min ( )C {return Min (x, y, z, w);} // components minimum
  1085. Int max ( )C {return Max (x, y, z, w);} // components maximum
  1086. Int sum ( )C {return x+ y+ z+ w ;} // components sum
  1087. Int find (Int value)C; // get index of first component that equals 'value' (-1 if none)
  1088. VecB4& reverse ( ) {Swap(c[0], c[3]); Swap(c[1], c[2]); return T;} // reverse components order
  1089. Str asTextDots()C; // return as text with components separated using dots "x.y.z.w"
  1090. VecB4() {}
  1091. VecB4(Byte i ) {set(i );}
  1092. VecB4(Byte x, Byte y, Byte z, Byte w) {set(x, y, z, w);}
  1093. };
  1094. /******************************************************************************/
  1095. struct VecSB4 // Vector 4D (SByte)
  1096. {
  1097. union
  1098. {
  1099. struct{SByte x, y, z, w;};
  1100. struct{SByte c[4] ;}; // component
  1101. struct{UInt u ;};
  1102. struct{VecSB2 xy, zw ;};
  1103. struct{VecSB xyz ;};
  1104. };
  1105. VecSB4& zero( ) {u=0; return T;}
  1106. VecSB4& set (SByte i ) {x=y=z=w=i; return T;}
  1107. VecSB4& set (SByte x, SByte y, SByte z, SByte w) {T.x=x; T.y=y; T.z=z; T.w=w; return T;}
  1108. Bool operator==(C VecSB4 &v)C {return u==v.u;}
  1109. Bool operator!=(C VecSB4 &v)C {return u!=v.u;}
  1110. Bool any ( )C {return u!=0 ;} // if any component is non-zero, faster version of "x || y || z || w"
  1111. Bool all ( )C {return x && y && z && w;} // if all components are non-zero
  1112. Bool allZero ( )C {return u==0;} // if all components are zero
  1113. Bool allDifferent( )C {return x!=y && x!=z && x!=w && y!=z && y!=w && z!=w;} // if all components are different
  1114. Int minI ( )C {return MinI(x, y, z, w);} // components minimum index
  1115. Int maxI ( )C {return MaxI(x, y, z, w);} // components maximum index
  1116. Int min ( )C {return Min (x, y, z, w);} // components minimum
  1117. Int max ( )C {return Max (x, y, z, w);} // components maximum
  1118. Int sum ( )C {return x+ y+ z+ w ;} // components sum
  1119. Int find (Int value)C; // get index of first component that equals 'value' (-1 if none)
  1120. VecSB4& reverse ( ) {Swap(c[0], c[3]); Swap(c[1], c[2]); return T;} // reverse components order
  1121. VecSB4() {}
  1122. VecSB4(SByte i ) {set(i );}
  1123. VecSB4(SByte x, SByte y, SByte z, SByte w) {set(x, y, z, w);}
  1124. };
  1125. /******************************************************************************/
  1126. struct VecUS2 // Vector 2D (Unsigned Short)
  1127. {
  1128. union
  1129. {
  1130. struct{UShort x, y;};
  1131. struct{UShort c[2];}; // component
  1132. };
  1133. VecUS2& zero( ) {x=y=0; return T;}
  1134. VecUS2& set (UShort u ) {x=y=u; return T;}
  1135. VecUS2& set (UShort x, UShort y) {T.x=x; T.y=y; return T;}
  1136. #if EE_PRIVATE
  1137. VecUS2& remap (C Int *map) {if(map){x=map[x]; y=map[y];} return T;} // remap if map is provided
  1138. VecUS2& remapAll(C MemPtr<Int> &map) {x=(InRange(x, map) ? map[x] : -1); y=(InRange(y, map) ? map[y] : -1); return T;} // remap all components
  1139. VecUS2& remapFit(C MemPtr<Int> &map) {if(InRange(x, map))x=map[x]; if(InRange(y, map))y=map[y]; return T;} // remap components which are in range of the remap array
  1140. #endif
  1141. VecUS2& operator+=(Int i) {x+=i; y+=i; return T;}
  1142. VecUS2& operator-=(Int i) {x-=i; y-=i; return T;}
  1143. VecUS2& operator*=(Int i) {x*=i; y*=i; return T;}
  1144. VecUS2& operator/=(Int i) {x/=i; y/=i; return T;}
  1145. VecUS2& operator%=(Int i) {x%=i; y%=i; return T;}
  1146. Bool operator==(C VecUS2 &v)C;
  1147. Bool operator!=(C VecUS2 &v)C;
  1148. Bool operator==(C VecB2 &v)C;
  1149. Bool operator!=(C VecB2 &v)C;
  1150. Bool operator==(C VecI2 &v)C;
  1151. Bool operator!=(C VecI2 &v)C;
  1152. friend VecUS2 operator+ (C VecUS2 &v, Int i) {return VecUS2(v.x+i, v.y+i);}
  1153. friend VecUS2 operator- (C VecUS2 &v, Int i) {return VecUS2(v.x-i, v.y-i);}
  1154. friend VecUS2 operator* (C VecUS2 &v, Int i) {return VecUS2(v.x*i, v.y*i);}
  1155. friend VecUS2 operator/ (C VecUS2 &v, Int i) {return VecUS2(v.x/i, v.y/i);}
  1156. friend VecUS2 operator% (C VecUS2 &v, Int i) {return VecUS2(v.x%i, v.y%i);}
  1157. friend Vec2 operator+ (C VecUS2 &v, Flt f) {return Vec2(v.x+f, v.y+f);}
  1158. friend Vec2 operator- (C VecUS2 &v, Flt f) {return Vec2(v.x-f, v.y-f);}
  1159. friend Vec2 operator* (C VecUS2 &v, Flt f) {return Vec2(v.x*f, v.y*f);}
  1160. friend Vec2 operator/ (C VecUS2 &v, Flt f) {return Vec2(v.x/f, v.y/f);}
  1161. friend VecUS2 operator+ (Int i, C VecUS2 &v) {return VecUS2(i+v.x, i+v.y);}
  1162. friend VecUS2 operator- (Int i, C VecUS2 &v) {return VecUS2(i-v.x, i-v.y);}
  1163. friend VecUS2 operator* (Int i, C VecUS2 &v) {return VecUS2(i*v.x, i*v.y);}
  1164. friend VecUS2 operator/ (Int i, C VecUS2 &v) {return VecUS2(i/v.x, i/v.y);}
  1165. friend Vec2 operator+ (Flt f, C VecUS2 &v) {return Vec2(f+v.x, f+v.y);}
  1166. friend Vec2 operator- (Flt f, C VecUS2 &v) {return Vec2(f-v.x, f-v.y);}
  1167. friend Vec2 operator* (Flt f, C VecUS2 &v) {return Vec2(f*v.x, f*v.y);}
  1168. friend Vec2 operator/ (Flt f, C VecUS2 &v) {return Vec2(f/v.x, f/v.y);}
  1169. Bool any()C {return x || y;} // if any component is non-zero
  1170. VecUS2() {}
  1171. VecUS2(UShort u ) {set(u );}
  1172. VecUS2(UShort x, UShort y) {set(x, y);}
  1173. VecUS2(C VecB2 &v);
  1174. VecUS2(C VecI2 &v);
  1175. };
  1176. struct VecUS // Vector 3D (Unsigned Short)
  1177. {
  1178. union
  1179. {
  1180. struct{UShort x, y, z;};
  1181. struct{UShort c[3] ;}; // component
  1182. struct{VecUS2 xy ;};
  1183. };
  1184. VecUS& zero( ) {x=y=z=0; return T;}
  1185. VecUS& set (UShort u ) {x=y=z=u; return T;}
  1186. VecUS& set (UShort x, UShort y, UShort z) {T.x=x; T.y=y; T.z=z; return T;}
  1187. VecUS& set (C VecUS2 &xy , UShort z) {T.xy=xy; T.z=z; return T;}
  1188. #if EE_PRIVATE
  1189. VecUS& remap (C Int *map) {if(map){x=map[x]; y=map[y]; z=map[z];} return T;} // remap if map is provided
  1190. VecUS& remapAll(C MemPtr<Int> &map) {x=(InRange(x, map) ? map[x] : -1); y=(InRange(y, map) ? map[y] : -1); z=(InRange(z, map) ? map[z] : -1); return T;} // remap all components
  1191. VecUS& remapFit(C MemPtr<Int> &map) {if(InRange(x, map))x=map[x]; if(InRange(y, map))y=map[y]; if(InRange(z, map))z=map[z]; return T;} // remap components which are in range of the remap array
  1192. #endif
  1193. VecUS& operator+=(Int i) {x+=i; y+=i; z+=i; return T;}
  1194. VecUS& operator-=(Int i) {x-=i; y-=i; z-=i; return T;}
  1195. VecUS& operator*=(Int i) {x*=i; y*=i; z*=i; return T;}
  1196. VecUS& operator/=(Int i) {x/=i; y/=i; z/=i; return T;}
  1197. VecUS& operator%=(Int i) {x%=i; y%=i; z%=i; return T;}
  1198. Bool operator==(C VecUS &v)C;
  1199. Bool operator!=(C VecUS &v)C;
  1200. Bool operator==(C VecB &v)C;
  1201. Bool operator!=(C VecB &v)C;
  1202. Bool operator==(C VecI &v)C;
  1203. Bool operator!=(C VecI &v)C;
  1204. friend VecUS operator+ (C VecUS &v, Int i) {return VecUS(v.x+i, v.y+i, v.z+i);}
  1205. friend VecUS operator- (C VecUS &v, Int i) {return VecUS(v.x-i, v.y-i, v.z-i);}
  1206. friend VecUS operator* (C VecUS &v, Int i) {return VecUS(v.x*i, v.y*i, v.z*i);}
  1207. friend VecUS operator/ (C VecUS &v, Int i) {return VecUS(v.x/i, v.y/i, v.z/i);}
  1208. friend VecUS operator% (C VecUS &v, Int i) {return VecUS(v.x%i, v.y%i, v.z%i);}
  1209. friend Vec operator+ (C VecUS &v, Flt f) {return Vec(v.x+f, v.y+f, v.z+f);}
  1210. friend Vec operator- (C VecUS &v, Flt f) {return Vec(v.x-f, v.y-f, v.z-f);}
  1211. friend Vec operator* (C VecUS &v, Flt f) {return Vec(v.x*f, v.y*f, v.z*f);}
  1212. friend Vec operator/ (C VecUS &v, Flt f) {return Vec(v.x/f, v.y/f, v.z/f);}
  1213. friend VecUS operator+ (Int i, C VecUS &v) {return VecUS(i+v.x, i+v.y, i+v.z);}
  1214. friend VecUS operator- (Int i, C VecUS &v) {return VecUS(i-v.x, i-v.y, i-v.z);}
  1215. friend VecUS operator* (Int i, C VecUS &v) {return VecUS(i*v.x, i*v.y, i*v.z);}
  1216. friend VecUS operator/ (Int i, C VecUS &v) {return VecUS(i/v.x, i/v.y, i/v.z);}
  1217. friend Vec operator+ (Flt f, C VecUS &v) {return Vec(f+v.x, f+v.y, f+v.z);}
  1218. friend Vec operator- (Flt f, C VecUS &v) {return Vec(f-v.x, f-v.y, f-v.z);}
  1219. friend Vec operator* (Flt f, C VecUS &v) {return Vec(f*v.x, f*v.y, f*v.z);}
  1220. friend Vec operator/ (Flt f, C VecUS &v) {return Vec(f/v.x, f/v.y, f/v.z);}
  1221. Bool any()C {return x || y || z;} // if any component is non-zero
  1222. VecUS() {}
  1223. VecUS(UShort u ) {set(u );}
  1224. VecUS(UShort x, UShort y, UShort z) {set(x, y, z);}
  1225. VecUS(C VecUS2 &xy , UShort z) {set( xy , z);}
  1226. VecUS(C VecB &v);
  1227. VecUS(C VecI &v);
  1228. };
  1229. /******************************************************************************/
  1230. struct VecH2 // Vector 2D (Half)
  1231. {
  1232. union
  1233. {
  1234. struct{Half x, y;};
  1235. struct{Half c[2];}; // component
  1236. };
  1237. VecH2& set( Flt f ) {x=y=f; return T;}
  1238. VecH2& set(C Half &h ) {x=y=h; return T;}
  1239. VecH2& set(C Half &x, C Half &y) {T.x=x; T.y=y; return T;}
  1240. Bool any()C {return Any(x, y);} // if any component is non-zero
  1241. Str asText(Int precision=INT_MAX)C; // return as text
  1242. VecH2() {}
  1243. VecH2( Flt f ) {set(f );}
  1244. VecH2(C Half &h ) {set(h );}
  1245. VecH2(C Half &x, C Half &y) {set( x, y);}
  1246. VecH2(C Vec2 &v ) {set(v.x, v.y);}
  1247. };
  1248. struct VecH // Vector 3D (Half)
  1249. {
  1250. union
  1251. {
  1252. struct{Half x, y, z;};
  1253. struct{Half c[3] ;}; // component
  1254. struct{VecH2 xy ;};
  1255. };
  1256. VecH& set( Flt f ) {x=y=z=f; return T;}
  1257. VecH& set(C Half &h ) {x=y=z=h; return T;}
  1258. VecH& set(C Half &x, C Half &y, C Half &z) {T.x=x; T.y=y; T.z=z; return T;}
  1259. VecH& set(C VecH2 &xy , C Half &z) {T.xy=xy; T.z=z; return T;}
  1260. Bool any()C {return Any(x, y, z);} // if any component is non-zero
  1261. Str asText(Int precision=INT_MAX)C; // return as text
  1262. VecH() {}
  1263. VecH( Flt f ) {set(f );}
  1264. VecH(C Half &h ) {set(h );}
  1265. VecH(C Half &x, C Half &y, C Half &z) {set( x, y, z);}
  1266. VecH(C VecH2 &xy , C Half &z) {set( xy , z);}
  1267. VecH(C Vec &v ) {set(v.x, v.y, v.z);}
  1268. };
  1269. struct VecH4 // Vector 4D (Half)
  1270. {
  1271. union
  1272. {
  1273. struct{Half x, y, z, w;};
  1274. struct{Half c[4] ;}; // component
  1275. struct{VecH2 xy, zw ;};
  1276. struct{VecH xyz ;};
  1277. };
  1278. VecH4& set( Flt f ) {x=y=z=w=f; return T;}
  1279. VecH4& set(C Half &h ) {x=y=z=w=h; return T;}
  1280. VecH4& set(C Half &x, C Half &y, C Half &z, C Half &w) {T.x=x; T.y=y; T.z=z; T.w=w; return T;}
  1281. VecH4& set(C VecH2 &xy , C Half &z, C Half &w) {T.xy =xy ; T.z=z; T.w=w; return T;}
  1282. VecH4& set(C VecH &xyz , C Half &w) {T.xyz=xyz; T.w=w; return T;}
  1283. VecH4& set(C VecH2 &xy , C VecH2 &zw ) {T.xy =xy ; T.zw=zw; return T;}
  1284. Bool any()C {return Any(x, y, z, w);} // if any component is non-zero
  1285. Str asText(Int precision=INT_MAX)C; // return as text
  1286. VecH4() {}
  1287. VecH4( Flt f ) {set(f );}
  1288. VecH4(C Half &h ) {set(h );}
  1289. VecH4(C Half &x, C Half &y, C Half &z, C Half &w) {set( x, y, z, w);}
  1290. VecH4(C VecH2 &xy , C Half &z, C Half &w) {set(xy , z, w);}
  1291. VecH4(C VecH &xyz , C Half &w) {set(xyz , w);}
  1292. VecH4(C VecH2 &xy , C VecH2 &zw ) {set(xy , zw );}
  1293. VecH4(C Vec4 &v ) {set(v.x, v.y, v.z, v.w);}
  1294. };
  1295. /******************************************************************************/
  1296. struct VecI2 // Vector 2D (integer)
  1297. {
  1298. union
  1299. {
  1300. struct{Int x, y;};
  1301. struct{Int c[2];}; // component
  1302. };
  1303. VecI2& zero( ) {x=y=0; return T;}
  1304. VecI2& set (Int i ) {x=y=i; return T;}
  1305. VecI2& set (Int x, Int y) {T.x=x; T.y=y; return T;}
  1306. VecI2& operator ++( Int ) {x++ ; y++ ; return T;}
  1307. VecI2& operator --( Int ) {x-- ; y-- ; return T;}
  1308. VecI2& operator +=( Int i) {x+= i; y+= i; return T;}
  1309. VecI2& operator -=( Int i) {x-= i; y-= i; return T;}
  1310. VecI2& operator *=( Int i) {x*= i; y*= i; return T;}
  1311. VecI2& operator /=( Int i) {x/= i; y/= i; return T;}
  1312. VecI2& operator %=( Int i) {x%= i; y%= i; return T;}
  1313. VecI2& operator +=(C VecI2 &v) {x+=v.x; y+=v.y; return T;}
  1314. VecI2& operator +=(C VecSB2 &v) {x+=v.x; y+=v.y; return T;}
  1315. VecI2& operator +=(C VecB2 &v) {x+=v.x; y+=v.y; return T;}
  1316. VecI2& operator -=(C VecI2 &v) {x-=v.x; y-=v.y; return T;}
  1317. VecI2& operator -=(C VecSB2 &v) {x-=v.x; y-=v.y; return T;}
  1318. VecI2& operator -=(C VecB2 &v) {x-=v.x; y-=v.y; return T;}
  1319. VecI2& operator *=(C VecI2 &v) {x*=v.x; y*=v.y; return T;}
  1320. VecI2& operator /=(C VecI2 &v) {x/=v.x; y/=v.y; return T;}
  1321. VecI2& operator %=(C VecI2 &v) {x%=v.x; y%=v.y; return T;}
  1322. VecI2& operator<<=( Int i) {x<<= i; y<<= i; return T;}
  1323. VecI2& operator>>=( Int i) {x>>= i; y>>= i; return T;}
  1324. VecI2& operator &=(C RectI &r); // intersect
  1325. Bool operator==(C VecI2 &v)C {return x==v.x && y==v.y;}
  1326. Bool operator!=(C VecI2 &v)C {return x!=v.x || y!=v.y;}
  1327. Bool operator==(C VecB2 &v)C {return x==v.x && y==v.y;}
  1328. Bool operator!=(C VecB2 &v)C {return x!=v.x || y!=v.y;}
  1329. Bool operator==(C VecUS2 &v)C {return x==v.x && y==v.y;}
  1330. Bool operator!=(C VecUS2 &v)C {return x!=v.x || y!=v.y;}
  1331. friend VecI2 operator+ (C VecI2 &v, Int i) {return VecI2(v.x+i, v.y+i);}
  1332. friend VecI2 operator- (C VecI2 &v, Int i) {return VecI2(v.x-i, v.y-i);}
  1333. friend VecI2 operator* (C VecI2 &v, Int i) {return VecI2(v.x*i, v.y*i);}
  1334. friend VecI2 operator/ (C VecI2 &v, Int i) {return VecI2(v.x/i, v.y/i);}
  1335. friend VecI2 operator% (C VecI2 &v, Int i) {return VecI2(v.x%i, v.y%i);}
  1336. friend Vec2 operator+ (C VecI2 &v, Flt f) {return Vec2(v.x+f, v.y+f);}
  1337. friend Vec2 operator- (C VecI2 &v, Flt f) {return Vec2(v.x-f, v.y-f);}
  1338. friend Vec2 operator* (C VecI2 &v, Flt f) {return Vec2(v.x*f, v.y*f);}
  1339. friend Vec2 operator/ (C VecI2 &v, Flt f) {return Vec2(v.x/f, v.y/f);}
  1340. friend VecD2 operator+ (C VecI2 &v, Dbl f) {return VecD2(v.x+f, v.y+f);}
  1341. friend VecD2 operator- (C VecI2 &v, Dbl f) {return VecD2(v.x-f, v.y-f);}
  1342. friend VecD2 operator* (C VecI2 &v, Dbl f) {return VecD2(v.x*f, v.y*f);}
  1343. friend VecD2 operator/ (C VecI2 &v, Dbl f) {return VecD2(v.x/f, v.y/f);}
  1344. friend VecI2 operator+ (Int i, C VecI2 &v) {return VecI2(i+v.x, i+v.y);}
  1345. friend VecI2 operator- (Int i, C VecI2 &v) {return VecI2(i-v.x, i-v.y);}
  1346. friend VecI2 operator* (Int i, C VecI2 &v) {return VecI2(i*v.x, i*v.y);}
  1347. friend VecI2 operator/ (Int i, C VecI2 &v) {return VecI2(i/v.x, i/v.y);}
  1348. friend Vec2 operator+ (Flt f, C VecI2 &v) {return Vec2(f+v.x, f+v.y);}
  1349. friend Vec2 operator- (Flt f, C VecI2 &v) {return Vec2(f-v.x, f-v.y);}
  1350. friend Vec2 operator* (Flt f, C VecI2 &v) {return Vec2(f*v.x, f*v.y);}
  1351. friend Vec2 operator/ (Flt f, C VecI2 &v) {return Vec2(f/v.x, f/v.y);}
  1352. friend VecD2 operator+ (Dbl f, C VecI2 &v) {return VecD2(f+v.x, f+v.y);}
  1353. friend VecD2 operator- (Dbl f, C VecI2 &v) {return VecD2(f-v.x, f-v.y);}
  1354. friend VecD2 operator* (Dbl f, C VecI2 &v) {return VecD2(f*v.x, f*v.y);}
  1355. friend VecD2 operator/ (Dbl f, C VecI2 &v) {return VecD2(f/v.x, f/v.y);}
  1356. friend VecI2 operator+ (C VecI2 &a, C VecI2 &b) {return VecI2(a.x+b.x, a.y+b.y);}
  1357. friend VecI2 operator- (C VecI2 &a, C VecI2 &b) {return VecI2(a.x-b.x, a.y-b.y);}
  1358. friend VecI2 operator* (C VecI2 &a, C VecI2 &b) {return VecI2(a.x*b.x, a.y*b.y);}
  1359. friend VecI2 operator/ (C VecI2 &a, C VecI2 &b) {return VecI2(a.x/b.x, a.y/b.y);}
  1360. friend VecI2 operator% (C VecI2 &a, C VecI2 &b) {return VecI2(a.x%b.x, a.y%b.y);}
  1361. friend VecI2 operator+ (C VecI2 &a, C VecSB2 &b) {return VecI2(a.x+b.x, a.y+b.y);}
  1362. friend VecI2 operator- (C VecI2 &a, C VecSB2 &b) {return VecI2(a.x-b.x, a.y-b.y);}
  1363. friend VecI2 operator* (C VecI2 &a, C VecSB2 &b) {return VecI2(a.x*b.x, a.y*b.y);}
  1364. friend VecI2 operator/ (C VecI2 &a, C VecSB2 &b) {return VecI2(a.x/b.x, a.y/b.y);}
  1365. friend VecI2 operator% (C VecI2 &a, C VecSB2 &b) {return VecI2(a.x%b.x, a.y%b.y);}
  1366. friend VecI2 operator+ (C VecSB2 &a, C VecI2 &b) {return VecI2(a.x+b.x, a.y+b.y);}
  1367. friend VecI2 operator- (C VecSB2 &a, C VecI2 &b) {return VecI2(a.x-b.x, a.y-b.y);}
  1368. friend VecI2 operator* (C VecSB2 &a, C VecI2 &b) {return VecI2(a.x*b.x, a.y*b.y);}
  1369. friend VecI2 operator/ (C VecSB2 &a, C VecI2 &b) {return VecI2(a.x/b.x, a.y/b.y);}
  1370. friend VecI2 operator% (C VecSB2 &a, C VecI2 &b) {return VecI2(a.x%b.x, a.y%b.y);}
  1371. friend VecI2 operator+ (C VecI2 &a, C VecB2 &b) {return VecI2(a.x+b.x, a.y+b.y);}
  1372. friend VecI2 operator- (C VecI2 &a, C VecB2 &b) {return VecI2(a.x-b.x, a.y-b.y);}
  1373. friend VecI2 operator* (C VecI2 &a, C VecB2 &b) {return VecI2(a.x*b.x, a.y*b.y);}
  1374. friend VecI2 operator/ (C VecI2 &a, C VecB2 &b) {return VecI2(a.x/b.x, a.y/b.y);}
  1375. friend VecI2 operator% (C VecI2 &a, C VecB2 &b) {return VecI2(a.x%b.x, a.y%b.y);}
  1376. friend VecI2 operator+ (C VecB2 &a, C VecI2 &b) {return VecI2(a.x+b.x, a.y+b.y);}
  1377. friend VecI2 operator- (C VecB2 &a, C VecI2 &b) {return VecI2(a.x-b.x, a.y-b.y);}
  1378. friend VecI2 operator* (C VecB2 &a, C VecI2 &b) {return VecI2(a.x*b.x, a.y*b.y);}
  1379. friend VecI2 operator/ (C VecB2 &a, C VecI2 &b) {return VecI2(a.x/b.x, a.y/b.y);}
  1380. friend VecI2 operator% (C VecB2 &a, C VecI2 &b) {return VecI2(a.x%b.x, a.y%b.y);}
  1381. friend Vec2 operator+ (C VecI2 &a, C Vec2 &b) {return Vec2(a.x+b.x, a.y+b.y);}
  1382. friend Vec2 operator- (C VecI2 &a, C Vec2 &b) {return Vec2(a.x-b.x, a.y-b.y);}
  1383. friend Vec2 operator* (C VecI2 &a, C Vec2 &b) {return Vec2(a.x*b.x, a.y*b.y);}
  1384. friend Vec2 operator/ (C VecI2 &a, C Vec2 &b) {return Vec2(a.x/b.x, a.y/b.y);}
  1385. friend Vec2 operator+ (C Vec2 &a, C VecI2 &b) {return Vec2(a.x+b.x, a.y+b.y);}
  1386. friend Vec2 operator- (C Vec2 &a, C VecI2 &b) {return Vec2(a.x-b.x, a.y-b.y);}
  1387. friend Vec2 operator* (C Vec2 &a, C VecI2 &b) {return Vec2(a.x*b.x, a.y*b.y);}
  1388. friend Vec2 operator/ (C Vec2 &a, C VecI2 &b) {return Vec2(a.x/b.x, a.y/b.y);}
  1389. friend VecI2 operator<< (C VecI2 &v, Int i) {return VecI2(v.x<<i, v.y<<i);}
  1390. friend VecI2 operator>> (C VecI2 &v, Int i) {return VecI2(v.x>>i, v.y>>i);}
  1391. friend VecI2 operator& (C VecI2 &v, C RectI &r) {return VecI2(v)&=r;} // intersection
  1392. friend VecI2 operator- (C VecI2 &v ) {return VecI2(-v.x, -v.y);}
  1393. VecI xy0()C; // return as VecI(x, y, 0)
  1394. VecI x0y()C; // return as VecI(x, 0, y)
  1395. VecI _0xy()C; // return as VecI(0, x, y)
  1396. VecI _0yx()C; // return as VecI(0, y, x)
  1397. Bool any ( )C {return x || y;} // if any component is non-zero
  1398. Bool all ( )C {return x && y;} // if all components are non-zero
  1399. Bool allZero ( )C {return !x && !y;} // if all components are zero
  1400. Bool allDifferent( )C {return x!=y ;} // if all components are different
  1401. Int minI ( )C {return MinI(x, y);} // components minimum index
  1402. Int maxI ( )C {return MaxI(x, y);} // components maximum index
  1403. Int min ( )C {return Min (x, y);} // components minimum
  1404. Int max ( )C {return Max (x, y);} // components maximum
  1405. Int avgI ( )C {return AvgI(x, y);} // components average
  1406. Flt avgF ( )C {return AvgF(x, y);} // components average
  1407. Int sum ( )C {return x+ y ;} // components sum
  1408. Int mul ( )C {return x* y ;} // components multiplication
  1409. Flt length ( )C; // get length
  1410. Int length2 ( )C {return x*x + y*y;} // get squared length
  1411. Int find (Int value)C; // get index of first component that equals 'value' (-1 if none)
  1412. VecI2& swap ( ) {Swap(c[0], c[1]); return T;} // swap components
  1413. VecI2& reverse ( ) {Swap(c[0], c[1]); return T;} // reverse components order
  1414. VecI2& rotateOrder ( ) {Swap(c[0], c[1]); return T;} // rotate components order
  1415. VecI2& chs ( ); // change sign of all components
  1416. VecI2& abs ( ); // absolute all components
  1417. VecI2& sat ( ); // saturate all components
  1418. #if EE_PRIVATE
  1419. VecI2& remap (C Int *map) {if(map){x=map[x]; y=map[y];} return T;} // remap if map is provided
  1420. VecI2& remapAll(C MemPtr<Int> &map) {x=(InRange(x, map) ? map[x] : -1); y=(InRange(y, map) ? map[y] : -1); return T;} // remap all components
  1421. VecI2& remapFit(C MemPtr<Int> &map) {if(InRange(x, map))x=map[x]; if(InRange(y, map))y=map[y]; return T;} // remap components which are in range of the remap array
  1422. VecI2 asIso ()C {return VecI2(x+y , y-x );}
  1423. VecI2 asIso2 ()C {return VecI2(x*2+y, y*2-x);}
  1424. VecI2 asIso_2()C {return VecI2(x+y*2, y-x*2);}
  1425. #endif
  1426. VecI2() {}
  1427. VecI2(Int i ) {set(i );}
  1428. VecI2(Int x, Int y) {set( x, y);}
  1429. VecI2(C VecB2 &v ) {set(v.x, v.y);}
  1430. VecI2(C VecSB2 &v ) {set(v.x, v.y);}
  1431. VecI2(C VecUS2 &v ) {set(v.x, v.y);}
  1432. };
  1433. /******************************************************************************/
  1434. struct VecI // Vector 3D (integer)
  1435. {
  1436. union
  1437. {
  1438. struct{Int x, y, z;};
  1439. struct{Int c[3] ;}; // component
  1440. struct{VecI2 xy ;};
  1441. };
  1442. VecI& zero( ) {x=y=z=0; return T;}
  1443. VecI& set (Int i ) {x=y=z=i; return T;}
  1444. VecI& set (Int x, Int y, Int z) {T.x=x; T.y=y; T.z=z; return T;}
  1445. VecI& set (C VecI2 &xy , Int z) {T.xy=xy; T.z=z; return T;}
  1446. VecI& operator ++( Int ) {x++ ; y++ ; z++ ; return T;}
  1447. VecI& operator --( Int ) {x-- ; y-- ; z-- ; return T;}
  1448. VecI& operator +=( Int i) {x+= i; y+= i; z+= i; return T;}
  1449. VecI& operator -=( Int i) {x-= i; y-= i; z-= i; return T;}
  1450. VecI& operator *=( Int i) {x*= i; y*= i; z*= i; return T;}
  1451. VecI& operator /=( Int i) {x/= i; y/= i; z/= i; return T;}
  1452. VecI& operator %=( Int i) {x%= i; y%= i; z%= i; return T;}
  1453. VecI& operator +=(C VecI &v) {x+=v.x; y+=v.y; z+=v.z; return T;}
  1454. VecI& operator +=(C VecSB &v) {x+=v.x; y+=v.y; z+=v.z; return T;}
  1455. VecI& operator +=(C VecB &v) {x+=v.x; y+=v.y; z+=v.z; return T;}
  1456. VecI& operator -=(C VecI &v) {x-=v.x; y-=v.y; z-=v.z; return T;}
  1457. VecI& operator -=(C VecSB &v) {x-=v.x; y-=v.y; z-=v.z; return T;}
  1458. VecI& operator -=(C VecB &v) {x-=v.x; y-=v.y; z-=v.z; return T;}
  1459. VecI& operator *=(C VecI &v) {x*=v.x; y*=v.y; z*=v.z; return T;}
  1460. VecI& operator /=(C VecI &v) {x/=v.x; y/=v.y; z/=v.z; return T;}
  1461. VecI& operator %=(C VecI &v) {x%=v.x; y%=v.y; z%=v.z; return T;}
  1462. VecI& operator<<=( Int i) {x<<= i; y<<= i; z<<= i; return T;}
  1463. VecI& operator>>=( Int i) {x>>= i; y>>= i; z>>= i; return T;}
  1464. VecI& operator &=(C BoxI &b); // intersect
  1465. Bool operator==(C VecI &v)C {return x==v.x && y==v.y && z==v.z;}
  1466. Bool operator!=(C VecI &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1467. Bool operator==(C VecB &v)C {return x==v.x && y==v.y && z==v.z;}
  1468. Bool operator!=(C VecB &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1469. Bool operator==(C VecUS &v)C {return x==v.x && y==v.y && z==v.z;}
  1470. Bool operator!=(C VecUS &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1471. friend VecI operator+ (C VecI &v, Int i) {return VecI(v.x+i, v.y+i, v.z+i);}
  1472. friend VecI operator- (C VecI &v, Int i) {return VecI(v.x-i, v.y-i, v.z-i);}
  1473. friend VecI operator* (C VecI &v, Int i) {return VecI(v.x*i, v.y*i, v.z*i);}
  1474. friend VecI operator/ (C VecI &v, Int i) {return VecI(v.x/i, v.y/i, v.z/i);}
  1475. friend VecI operator% (C VecI &v, Int i) {return VecI(v.x%i, v.y%i, v.z%i);}
  1476. friend Vec operator+ (C VecI &v, Flt f) {return Vec(v.x+f, v.y+f, v.z+f);}
  1477. friend Vec operator- (C VecI &v, Flt f) {return Vec(v.x-f, v.y-f, v.z-f);}
  1478. friend Vec operator* (C VecI &v, Flt f) {return Vec(v.x*f, v.y*f, v.z*f);}
  1479. friend Vec operator/ (C VecI &v, Flt f) {return Vec(v.x/f, v.y/f, v.z/f);}
  1480. friend VecD operator+ (C VecI &v, Dbl f) {return VecD(v.x+f, v.y+f, v.z+f);}
  1481. friend VecD operator- (C VecI &v, Dbl f) {return VecD(v.x-f, v.y-f, v.z-f);}
  1482. friend VecD operator* (C VecI &v, Dbl f) {return VecD(v.x*f, v.y*f, v.z*f);}
  1483. friend VecD operator/ (C VecI &v, Dbl f) {return VecD(v.x/f, v.y/f, v.z/f);}
  1484. friend VecI operator+ (Int i, C VecI &v) {return VecI(i+v.x, i+v.y, i+v.z);}
  1485. friend VecI operator- (Int i, C VecI &v) {return VecI(i-v.x, i-v.y, i-v.z);}
  1486. friend VecI operator* (Int i, C VecI &v) {return VecI(i*v.x, i*v.y, i*v.z);}
  1487. friend VecI operator/ (Int i, C VecI &v) {return VecI(i/v.x, i/v.y, i/v.z);}
  1488. friend Vec operator+ (Flt f, C VecI &v) {return Vec(f+v.x, f+v.y, f+v.z);}
  1489. friend Vec operator- (Flt f, C VecI &v) {return Vec(f-v.x, f-v.y, f-v.z);}
  1490. friend Vec operator* (Flt f, C VecI &v) {return Vec(f*v.x, f*v.y, f*v.z);}
  1491. friend Vec operator/ (Flt f, C VecI &v) {return Vec(f/v.x, f/v.y, f/v.z);}
  1492. friend VecD operator+ (Dbl f, C VecI &v) {return VecD(f+v.x, f+v.y, f+v.z);}
  1493. friend VecD operator- (Dbl f, C VecI &v) {return VecD(f-v.x, f-v.y, f-v.z);}
  1494. friend VecD operator* (Dbl f, C VecI &v) {return VecD(f*v.x, f*v.y, f*v.z);}
  1495. friend VecD operator/ (Dbl f, C VecI &v) {return VecD(f/v.x, f/v.y, f/v.z);}
  1496. friend VecI operator+ (C VecI &a, C VecI &b) {return VecI(a.x+b.x, a.y+b.y, a.z+b.z);}
  1497. friend VecI operator- (C VecI &a, C VecI &b) {return VecI(a.x-b.x, a.y-b.y, a.z-b.z);}
  1498. friend VecI operator* (C VecI &a, C VecI &b) {return VecI(a.x*b.x, a.y*b.y, a.z*b.z);}
  1499. friend VecI operator/ (C VecI &a, C VecI &b) {return VecI(a.x/b.x, a.y/b.y, a.z/b.z);}
  1500. friend VecI operator% (C VecI &a, C VecI &b) {return VecI(a.x%b.x, a.y%b.y, a.z%b.z);}
  1501. friend VecI operator+ (C VecI &a, C VecSB &b) {return VecI(a.x+b.x, a.y+b.y, a.z+b.z);}
  1502. friend VecI operator- (C VecI &a, C VecSB &b) {return VecI(a.x-b.x, a.y-b.y, a.z-b.z);}
  1503. friend VecI operator* (C VecI &a, C VecSB &b) {return VecI(a.x*b.x, a.y*b.y, a.z*b.z);}
  1504. friend VecI operator/ (C VecI &a, C VecSB &b) {return VecI(a.x/b.x, a.y/b.y, a.z/b.z);}
  1505. friend VecI operator% (C VecI &a, C VecSB &b) {return VecI(a.x%b.x, a.y%b.y, a.z%b.z);}
  1506. friend VecI operator+ (C VecSB &a, C VecI &b) {return VecI(a.x+b.x, a.y+b.y, a.z+b.z);}
  1507. friend VecI operator- (C VecSB &a, C VecI &b) {return VecI(a.x-b.x, a.y-b.y, a.z-b.z);}
  1508. friend VecI operator* (C VecSB &a, C VecI &b) {return VecI(a.x*b.x, a.y*b.y, a.z*b.z);}
  1509. friend VecI operator/ (C VecSB &a, C VecI &b) {return VecI(a.x/b.x, a.y/b.y, a.z/b.z);}
  1510. friend VecI operator% (C VecSB &a, C VecI &b) {return VecI(a.x%b.x, a.y%b.y, a.z%b.z);}
  1511. friend VecI operator+ (C VecI &a, C VecB &b) {return VecI(a.x+b.x, a.y+b.y, a.z+b.z);}
  1512. friend VecI operator- (C VecI &a, C VecB &b) {return VecI(a.x-b.x, a.y-b.y, a.z-b.z);}
  1513. friend VecI operator* (C VecI &a, C VecB &b) {return VecI(a.x*b.x, a.y*b.y, a.z*b.z);}
  1514. friend VecI operator/ (C VecI &a, C VecB &b) {return VecI(a.x/b.x, a.y/b.y, a.z/b.z);}
  1515. friend VecI operator% (C VecI &a, C VecB &b) {return VecI(a.x%b.x, a.y%b.y, a.z%b.z);}
  1516. friend VecI operator+ (C VecB &a, C VecI &b) {return VecI(a.x+b.x, a.y+b.y, a.z+b.z);}
  1517. friend VecI operator- (C VecB &a, C VecI &b) {return VecI(a.x-b.x, a.y-b.y, a.z-b.z);}
  1518. friend VecI operator* (C VecB &a, C VecI &b) {return VecI(a.x*b.x, a.y*b.y, a.z*b.z);}
  1519. friend VecI operator/ (C VecB &a, C VecI &b) {return VecI(a.x/b.x, a.y/b.y, a.z/b.z);}
  1520. friend VecI operator% (C VecB &a, C VecI &b) {return VecI(a.x%b.x, a.y%b.y, a.z%b.z);}
  1521. friend Vec operator+ (C VecI &a, C Vec &b) {return Vec(a.x+b.x, a.y+b.y, a.z+b.z);}
  1522. friend Vec operator- (C VecI &a, C Vec &b) {return Vec(a.x-b.x, a.y-b.y, a.z-b.z);}
  1523. friend Vec operator* (C VecI &a, C Vec &b) {return Vec(a.x*b.x, a.y*b.y, a.z*b.z);}
  1524. friend Vec operator/ (C VecI &a, C Vec &b) {return Vec(a.x/b.x, a.y/b.y, a.z/b.z);}
  1525. friend Vec operator+ (C Vec &a, C VecI &b) {return Vec(a.x+b.x, a.y+b.y, a.z+b.z);}
  1526. friend Vec operator- (C Vec &a, C VecI &b) {return Vec(a.x-b.x, a.y-b.y, a.z-b.z);}
  1527. friend Vec operator* (C Vec &a, C VecI &b) {return Vec(a.x*b.x, a.y*b.y, a.z*b.z);}
  1528. friend Vec operator/ (C Vec &a, C VecI &b) {return Vec(a.x/b.x, a.y/b.y, a.z/b.z);}
  1529. friend VecI operator<< (C VecI &v, Int i) {return VecI(v.x<<i, v.y<<i, v.z<<i);}
  1530. friend VecI operator>> (C VecI &v, Int i) {return VecI(v.x>>i, v.y>>i, v.z>>i);}
  1531. friend VecI operator& (C VecI &v, C BoxI &b) {return VecI(v)&=b;} // intersection
  1532. friend VecI operator- (C VecI &v ) {return VecI(-v.x, -v.y, -v.z);}
  1533. VecI2 xz ()C {return VecI2(x, z );} // return as VecI2(x, z)
  1534. VecI2 yx ()C {return VecI2(y, x );} // return as VecI2(y, x)
  1535. VecI2 yz ()C {return VecI2(y, z );} // return as VecI2(y, z)
  1536. VecI2 zx ()C {return VecI2(z, x );} // return as VecI2(z, x)
  1537. VecI2 zy ()C {return VecI2(z, y );} // return as VecI2(z, y)
  1538. VecI xzy()C {return VecI (x, z, y);} // return as VecI (x, z, y)
  1539. VecI x0z()C {return VecI (x, 0, z);} // return as VecI (x, 0, z)
  1540. VecI xy0()C {return VecI (x, y, 0);} // return as VecI (x, y, 0)
  1541. Bool any ( )C {return x || y || z;} // if any component is non-zero
  1542. Bool all ( )C {return x && y && z;} // if all components are non-zero
  1543. Bool allZero ( )C {return !x && !y && !z;} // if all components are zero
  1544. Bool allDifferent( )C {return x!=y && x!=z && y!=z;} // if all components are different
  1545. Int minI ( )C {return MinI(x, y, z);} // components minimum index
  1546. Int maxI ( )C {return MaxI(x, y, z);} // components maximum index
  1547. Int min ( )C {return Min (x, y, z);} // components minimum
  1548. Int max ( )C {return Max (x, y, z);} // components maximum
  1549. Int avgI ( )C {return AvgI(x, y, z);} // components average
  1550. Flt avgF ( )C {return AvgF(x, y, z);} // components average
  1551. Int sum ( )C {return x+ y+ z ;} // components sum
  1552. Int mul ( )C {return x* y* z ;} // components multiplication
  1553. Flt length ( )C; // get length
  1554. Int length2 ( )C {return x*x + y*y + z*z;} // get squared length
  1555. Int find (Int value)C; // get index of first component that equals 'value' (-1 if none)
  1556. VecI& swapXZ ( ) {Swap(c[0], c[2]); return T;} // swap X Z components
  1557. VecI& reverse ( ) {Swap(c[0], c[2]); return T;} // reverse components order
  1558. VecI& rotateOrder ( ); // rotate components order
  1559. VecI& chs ( ); // change sign of all components
  1560. VecI& abs ( ); // absolute all components
  1561. VecI& sat ( ); // saturate all components
  1562. #if EE_PRIVATE
  1563. VecI& remap (C Int *map) {if(map){x=map[x]; y=map[y]; z=map[z];} return T;} // remap if map is provided
  1564. VecI& remapAll(C MemPtr<Int> &map) {x=(InRange(x, map) ? map[x] : -1); y=(InRange(y, map) ? map[y] : -1); z=(InRange(z, map) ? map[z] : -1); return T;} // remap all components
  1565. VecI& remapFit(C MemPtr<Int> &map) {if(InRange(x, map))x=map[x]; if(InRange(y, map))y=map[y]; if(InRange(z, map))z=map[z]; return T;} // remap components which are in range of the remap array
  1566. #endif
  1567. VecI() {}
  1568. VecI(Int i ) {set(i );}
  1569. VecI(Int x, Int y, Int z) {set( x, y, z);}
  1570. VecI(C VecI2 &xy , Int z) {set(xy , z);}
  1571. VecI(C VecB &v ) {set(v.x, v.y, v.z);}
  1572. VecI(C VecSB &v ) {set(v.x, v.y, v.z);}
  1573. VecI(C VecUS &v ) {set(v.x, v.y, v.z);}
  1574. };
  1575. /******************************************************************************/
  1576. struct VecI4 // Vector 4D (integer)
  1577. {
  1578. union
  1579. {
  1580. struct{Int x, y, z, w;};
  1581. struct{Int c[4] ;}; // component
  1582. struct{VecI2 xy, zw ;};
  1583. struct{VecI xyz ;};
  1584. };
  1585. VecI4& zero( ) {x=y=z=w=0; return T;}
  1586. VecI4& set (Int i ) {x=y=z=w=i; return T;}
  1587. VecI4& set (Int x, Int y, Int z, Int w) {T.x=x; T.y=y; T.z=z; T.w=w; return T;}
  1588. VecI4& set (C VecI2 &xy , Int z, Int w) {T.xy =xy ; T.z=z; T.w=w; return T;}
  1589. VecI4& set (C VecI &xyz, Int w) {T.xyz=xyz; T.w=w; return T;}
  1590. VecI4& set (C VecI2 &xy , C VecI2 &zw ) {T.xy =xy ; T.zw=zw; return T;}
  1591. VecI4& operator ++( Int ) {x++ ; y++ ; z++ ; w++ ; return T;}
  1592. VecI4& operator --( Int ) {x-- ; y-- ; z-- ; w-- ; return T;}
  1593. VecI4& operator +=( Int i) {x+= i; y+= i; z+= i; w+= i; return T;}
  1594. VecI4& operator -=( Int i) {x-= i; y-= i; z-= i; w-= i; return T;}
  1595. VecI4& operator *=( Int i) {x*= i; y*= i; z*= i; w*= i; return T;}
  1596. VecI4& operator /=( Int i) {x/= i; y/= i; z/= i; w/= i; return T;}
  1597. VecI4& operator %=( Int i) {x%= i; y%= i; z%= i; w%= i; return T;}
  1598. VecI4& operator +=(C VecI4 &v) {x+=v.x; y+=v.y; z+=v.z; w+=v.w; return T;}
  1599. VecI4& operator +=(C VecSB4 &v) {x+=v.x; y+=v.y; z+=v.z; w+=v.w; return T;}
  1600. VecI4& operator +=(C VecB4 &v) {x+=v.x; y+=v.y; z+=v.z; w+=v.w; return T;}
  1601. VecI4& operator -=(C VecI4 &v) {x-=v.x; y-=v.y; z-=v.z; w-=v.w; return T;}
  1602. VecI4& operator -=(C VecSB4 &v) {x-=v.x; y-=v.y; z-=v.z; w-=v.w; return T;}
  1603. VecI4& operator -=(C VecB4 &v) {x-=v.x; y-=v.y; z-=v.z; w-=v.w; return T;}
  1604. VecI4& operator *=(C VecI4 &v) {x*=v.x; y*=v.y; z*=v.z; w*=v.w; return T;}
  1605. VecI4& operator /=(C VecI4 &v) {x/=v.x; y/=v.y; z/=v.z; w/=v.w; return T;}
  1606. VecI4& operator %=(C VecI4 &v) {x%=v.x; y%=v.y; z%=v.z; w%=v.w; return T;}
  1607. VecI4& operator<<=( Int i) {x<<= i; y<<= i; z<<= i; w<<= i; return T;}
  1608. VecI4& operator>>=( Int i) {x>>= i; y>>= i; z>>= i; w>>= i; return T;}
  1609. Bool operator ==(C VecI4 &v)C{return x==v.x && y==v.y && z==v.z && w==v.w;}
  1610. Bool operator !=(C VecI4 &v)C{return x!=v.x || y!=v.y || z!=v.z || w!=v.w;}
  1611. friend VecI4 operator+ (C VecI4 &v, Int i) {return VecI4(v.x+i, v.y+i, v.z+i, v.w+i);}
  1612. friend VecI4 operator- (C VecI4 &v, Int i) {return VecI4(v.x-i, v.y-i, v.z-i, v.w-i);}
  1613. friend VecI4 operator* (C VecI4 &v, Int i) {return VecI4(v.x*i, v.y*i, v.z*i, v.w*i);}
  1614. friend VecI4 operator/ (C VecI4 &v, Int i) {return VecI4(v.x/i, v.y/i, v.z/i, v.w/i);}
  1615. friend VecI4 operator% (C VecI4 &v, Int i) {return VecI4(v.x%i, v.y%i, v.z%i, v.w%i);}
  1616. friend Vec4 operator+ (C VecI4 &v, Flt f) {return Vec4(v.x+f, v.y+f, v.z+f, v.w+f);}
  1617. friend Vec4 operator- (C VecI4 &v, Flt f) {return Vec4(v.x-f, v.y-f, v.z-f, v.w-f);}
  1618. friend Vec4 operator* (C VecI4 &v, Flt f) {return Vec4(v.x*f, v.y*f, v.z*f, v.w*f);}
  1619. friend Vec4 operator/ (C VecI4 &v, Flt f) {return Vec4(v.x/f, v.y/f, v.z/f, v.w/f);}
  1620. friend VecD4 operator+ (C VecI4 &v, Dbl f) {return VecD4(v.x+f, v.y+f, v.z+f, v.w+f);}
  1621. friend VecD4 operator- (C VecI4 &v, Dbl f) {return VecD4(v.x-f, v.y-f, v.z-f, v.w-f);}
  1622. friend VecD4 operator* (C VecI4 &v, Dbl f) {return VecD4(v.x*f, v.y*f, v.z*f, v.w*f);}
  1623. friend VecD4 operator/ (C VecI4 &v, Dbl f) {return VecD4(v.x/f, v.y/f, v.z/f, v.w/f);}
  1624. friend VecI4 operator+ (Int i, C VecI4 &v) {return VecI4(i+v.x, i+v.y, i+v.z, i+v.w);}
  1625. friend VecI4 operator- (Int i, C VecI4 &v) {return VecI4(i-v.x, i-v.y, i-v.z, i-v.w);}
  1626. friend VecI4 operator* (Int i, C VecI4 &v) {return VecI4(i*v.x, i*v.y, i*v.z, i*v.w);}
  1627. friend VecI4 operator/ (Int i, C VecI4 &v) {return VecI4(i/v.x, i/v.y, i/v.z, i/v.w);}
  1628. friend Vec4 operator+ (Flt f, C VecI4 &v) {return Vec4(f+v.x, f+v.y, f+v.z, f+v.w);}
  1629. friend Vec4 operator- (Flt f, C VecI4 &v) {return Vec4(f-v.x, f-v.y, f-v.z, f-v.w);}
  1630. friend Vec4 operator* (Flt f, C VecI4 &v) {return Vec4(f*v.x, f*v.y, f*v.z, f*v.w);}
  1631. friend Vec4 operator/ (Flt f, C VecI4 &v) {return Vec4(f/v.x, f/v.y, f/v.z, f/v.w);}
  1632. friend VecD4 operator+ (Dbl f, C VecI4 &v) {return VecD4(f+v.x, f+v.y, f+v.z, f+v.w);}
  1633. friend VecD4 operator- (Dbl f, C VecI4 &v) {return VecD4(f-v.x, f-v.y, f-v.z, f-v.w);}
  1634. friend VecD4 operator* (Dbl f, C VecI4 &v) {return VecD4(f*v.x, f*v.y, f*v.z, f*v.w);}
  1635. friend VecD4 operator/ (Dbl f, C VecI4 &v) {return VecD4(f/v.x, f/v.y, f/v.z, f/v.w);}
  1636. friend VecI4 operator+ (C VecI4 &a, C VecI4 &b) {return VecI4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  1637. friend VecI4 operator- (C VecI4 &a, C VecI4 &b) {return VecI4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  1638. friend VecI4 operator* (C VecI4 &a, C VecI4 &b) {return VecI4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  1639. friend VecI4 operator/ (C VecI4 &a, C VecI4 &b) {return VecI4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  1640. friend VecI4 operator% (C VecI4 &a, C VecI4 &b) {return VecI4(a.x%b.x, a.y%b.y, a.z%b.z, a.w%b.w);}
  1641. friend VecI4 operator+ (C VecI4 &a, C VecSB4 &b) {return VecI4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  1642. friend VecI4 operator- (C VecI4 &a, C VecSB4 &b) {return VecI4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  1643. friend VecI4 operator* (C VecI4 &a, C VecSB4 &b) {return VecI4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  1644. friend VecI4 operator/ (C VecI4 &a, C VecSB4 &b) {return VecI4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  1645. friend VecI4 operator% (C VecI4 &a, C VecSB4 &b) {return VecI4(a.x%b.x, a.y%b.y, a.z%b.z, a.w%b.w);}
  1646. friend VecI4 operator+ (C VecSB4 &a, C VecI4 &b) {return VecI4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  1647. friend VecI4 operator- (C VecSB4 &a, C VecI4 &b) {return VecI4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  1648. friend VecI4 operator* (C VecSB4 &a, C VecI4 &b) {return VecI4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  1649. friend VecI4 operator/ (C VecSB4 &a, C VecI4 &b) {return VecI4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  1650. friend VecI4 operator% (C VecSB4 &a, C VecI4 &b) {return VecI4(a.x%b.x, a.y%b.y, a.z%b.z, a.w%b.w);}
  1651. friend VecI4 operator+ (C VecI4 &a, C VecB4 &b) {return VecI4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  1652. friend VecI4 operator- (C VecI4 &a, C VecB4 &b) {return VecI4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  1653. friend VecI4 operator* (C VecI4 &a, C VecB4 &b) {return VecI4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  1654. friend VecI4 operator/ (C VecI4 &a, C VecB4 &b) {return VecI4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  1655. friend VecI4 operator% (C VecI4 &a, C VecB4 &b) {return VecI4(a.x%b.x, a.y%b.y, a.z%b.z, a.w%b.w);}
  1656. friend VecI4 operator+ (C VecB4 &a, C VecI4 &b) {return VecI4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  1657. friend VecI4 operator- (C VecB4 &a, C VecI4 &b) {return VecI4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  1658. friend VecI4 operator* (C VecB4 &a, C VecI4 &b) {return VecI4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  1659. friend VecI4 operator/ (C VecB4 &a, C VecI4 &b) {return VecI4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  1660. friend VecI4 operator% (C VecB4 &a, C VecI4 &b) {return VecI4(a.x%b.x, a.y%b.y, a.z%b.z, a.w%b.w);}
  1661. friend Vec4 operator+ (C VecI4 &a, C Vec4 &b) {return Vec4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  1662. friend Vec4 operator- (C VecI4 &a, C Vec4 &b) {return Vec4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  1663. friend Vec4 operator* (C VecI4 &a, C Vec4 &b) {return Vec4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  1664. friend Vec4 operator/ (C VecI4 &a, C Vec4 &b) {return Vec4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  1665. friend Vec4 operator + (C Vec4 &a, C VecI4 &b) {return Vec4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);}
  1666. friend Vec4 operator - (C Vec4 &a, C VecI4 &b) {return Vec4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);}
  1667. friend Vec4 operator * (C Vec4 &a, C VecI4 &b) {return Vec4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);}
  1668. friend Vec4 operator / (C Vec4 &a, C VecI4 &b) {return Vec4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);}
  1669. friend VecI4 operator<< (C VecI4 &v, Int i) {return VecI4(v.x<<i, v.y<<i, v.z<<i, v.w<<i);}
  1670. friend VecI4 operator>> (C VecI4 &v, Int i) {return VecI4(v.x>>i, v.y>>i, v.z>>i, v.w>>i);}
  1671. friend VecI4 operator - (C VecI4 &v ) {return VecI4(-v.x, -v.y, -v.z, -v.w);}
  1672. Bool any ( )C {return x || y || z || w;} // if any component is non-zero
  1673. Bool all ( )C {return x && y && z && w;} // if all components are non-zero
  1674. Bool allZero ( )C {return !x && !y && !z && !w;} // if all components are zero
  1675. Bool allDifferent( )C {return x!=y && x!=z && x!=w && y!=z && y!=w && z!=w;} // if all components are different
  1676. Int minI ( )C {return MinI(x, y, z, w);} // components minimum index
  1677. Int maxI ( )C {return MaxI(x, y, z, w);} // components maximum index
  1678. Int min ( )C {return Min (x, y, z, w);} // components minimum
  1679. Int max ( )C {return Max (x, y, z, w);} // components maximum
  1680. Int avgI ( )C {return AvgI(x, y, z, w);} // components average
  1681. Flt avgF ( )C {return AvgF(x, y, z, w);} // components average
  1682. Int sum ( )C {return x+ y+ z+ w ;} // components sum
  1683. Int mul ( )C {return x* y* z* w ;} // components multiplication
  1684. Flt length ( )C; // get length
  1685. Int length2 ( )C {return x*x + y*y + z*z + w*w;} // get squared length
  1686. Int find (Int value)C; // get index of first component that equals 'value' (-1 if none)
  1687. VecI4& swapXZ ( ) {Swap(c[0], c[2]); return T;} // swap X Z components
  1688. VecI4& reverse ( ) {Swap(c[0], c[3]); Swap(c[1], c[2]); return T;} // reverse components order
  1689. VecI4& rotateOrder ( ); // rotate components order
  1690. VecI4& chs ( ); // change sign of all components
  1691. VecI4& abs ( ); // absolute all components
  1692. VecI4& sat ( ); // saturate all components
  1693. #if EE_PRIVATE
  1694. VecI4& remap (C Int *map) {if(map){x=map[x]; y=map[y]; z=map[z]; w=map[w];} return T;} // remap if map is provided
  1695. VecI4& remapAll(C MemPtr<Int> &map) {x=(InRange(x, map) ? map[x] : -1); y=(InRange(y, map) ? map[y] : -1); z=(InRange(z, map) ? map[z] : -1); w=(InRange(w, map) ? map[w] : -1); return T;} // remap all components
  1696. VecI4& remapFit(C MemPtr<Int> &map) {if(InRange(x, map))x=map[x]; if(InRange(y, map))y=map[y]; if(InRange(z, map))z=map[z]; if(InRange(w, map))w=map[w]; return T;} // remap components which are in range of the remap array
  1697. #endif
  1698. VecI tri0()C {return VecI(x, y, w);}
  1699. VecI tri1()C {return VecI(w, y, z);}
  1700. Str asTextDots()C; // return as text with components separated using dots "x.y.z.w"
  1701. VecI4() {}
  1702. VecI4(Int i ) {set(i );}
  1703. VecI4(Int x, Int y, Int z, Int w) {set( x, y, z, w);}
  1704. VecI4(C VecI2 &xy , Int z, Int w) {set(xy , z, w);}
  1705. VecI4(C VecI &xyz, Int w) {set(xyz , w);}
  1706. VecI4(C VecI2 &xy , C VecI2 &zw ) {set(xy , zw );}
  1707. VecI4(C VecB4 &v ) {set(v.x, v.y, v.z, v.w);}
  1708. VecI4(C VecSB4 &v ) {set(v.x, v.y, v.z, v.w);}
  1709. };
  1710. /******************************************************************************/
  1711. // ROUNDING
  1712. /******************************************************************************/
  1713. // truncate, remove fractional part, Sample Usage: Trunc(7.3) -> 7, Trunc(7.9) -> 7
  1714. #if EE_PRIVATE
  1715. Dbl TruncD ( Dbl x); // truncate and return as Dbl
  1716. #endif
  1717. inline Int Trunc ( Int x) {return x ;} // truncate and return as Int
  1718. inline Int Trunc ( Flt x) {return Int (x);} // truncate and return as Int
  1719. inline Int Trunc ( Dbl x) {return Int (x);} // truncate and return as Int
  1720. inline UInt TruncU ( UInt x) {return x ;} // truncate and return as UInt
  1721. inline UInt TruncU ( Flt x) {return UInt (x);} // truncate and return as UInt
  1722. inline UInt TruncU ( Dbl x) {return UInt (x);} // truncate and return as UInt
  1723. inline Long TruncL ( Dbl x) {return Long (x);} // truncate and return as Long
  1724. inline ULong TruncUL( Dbl x) {return ULong(x);} // truncate and return as ULong
  1725. inline VecI2 Trunc (C Vec2 &v) {return VecI2(Trunc(v.x), Trunc(v.y) );}
  1726. inline VecI2 Trunc (C VecD2 &v) {return VecI2(Trunc(v.x), Trunc(v.y) );}
  1727. inline VecI Trunc (C Vec &v) {return VecI (Trunc(v.x), Trunc(v.y), Trunc(v.z) );}
  1728. inline VecI Trunc (C VecD &v) {return VecI (Trunc(v.x), Trunc(v.y), Trunc(v.z) );}
  1729. inline VecI4 Trunc (C Vec4 &v) {return VecI4(Trunc(v.x), Trunc(v.y), Trunc(v.z), Trunc(v.w));}
  1730. inline VecI4 Trunc (C VecD4 &v) {return VecI4(Trunc(v.x), Trunc(v.y), Trunc(v.z), Trunc(v.w));}
  1731. // round, round to nearest integer, Sample Usage: Round(7.3) -> 7, Round(7.9) -> 8
  1732. inline Int Round ( Int x) {return x;}
  1733. inline Int Round ( Flt x) {return (x>=0) ? Trunc (x+0.5f) : Trunc (x-0.5f);} // faster than 'lroundf'
  1734. inline Int Round ( Dbl x) {return (x>=0) ? Trunc (x+0.5 ) : Trunc (x-0.5 );} // faster than 'lround'
  1735. inline UInt RoundU ( UInt x) {return x;}
  1736. inline UInt RoundU ( Flt x) {return TruncU (x+0.5f);}
  1737. inline UInt RoundU ( Dbl x) {return TruncU (x+0.5 );}
  1738. inline Long RoundL ( Dbl x) {return (x>=0) ? TruncL (x+0.5 ) : TruncL(x-0.5 );}
  1739. inline ULong RoundUL( Dbl x) {return TruncUL(x+0.5 );}
  1740. inline VecI2 Round (C Vec2 &x) {return VecI2(Round(x.x), Round(x.y) );}
  1741. inline VecI2 Round (C VecD2 &x) {return VecI2(Round(x.x), Round(x.y) );}
  1742. inline VecI Round (C Vec &x) {return VecI (Round(x.x), Round(x.y), Round(x.z) );}
  1743. inline VecI Round (C VecD &x) {return VecI (Round(x.x), Round(x.y), Round(x.z) );}
  1744. inline VecI4 Round (C Vec4 &x) {return VecI4(Round(x.x), Round(x.y), Round(x.z), Round(x.w));}
  1745. inline VecI4 Round (C VecD4 &x) {return VecI4(Round(x.x), Round(x.y), Round(x.z), Round(x.w));}
  1746. #if EE_PRIVATE
  1747. inline Int RoundEps( Flt x, Flt eps) {return (x>=0) ? Trunc(x+eps) : Trunc(x-eps);}
  1748. inline Int RoundPos( Flt x) {return Trunc(x+0.5f);} // doesn't care if round of negative value will not be precise, but unlike 'RoundU' the result will still be negative
  1749. inline Int RoundPos( Dbl x) {return Trunc(x+0.5 );} // doesn't care if round of negative value will not be precise, but unlike 'RoundU' the result will still be negative
  1750. inline Int RoundGPU( Flt x) {return Round(x-0.0001f);} // if the coordinate is located exactly between 2 pixels "Frac(x)==0.5" then due to numerical precision issues sometimes this can be rounded up and sometimes down, and flickering can occur for example when window is moved on the screen, to prevent that, apply a small offset, the value "0.0001f" has been tested having a Window and a button at 0.5 coordinates, then moving the window around the screen and noticing when does it stop flickering, keep as "-offset" instead of "+offset" because it works better with clipping (for example if Region draws a pixel border and it is located exactly between 2 pixels, then its children may overlap the border because the clipping has 1 extra pixel)
  1751. inline VecI2 RoundPos(C Vec2 &x) {return VecI2(RoundPos(x.x), RoundPos(x.y) );}
  1752. inline VecI RoundPos(C Vec &x) {return VecI (RoundPos(x.x), RoundPos(x.y), RoundPos(x.z));}
  1753. inline VecI2 RoundGPU(C Vec2 &v) {return VecI2(RoundGPU(v.x), RoundGPU(v.y) );}
  1754. #endif
  1755. // floor, round to nearest integer which is smaller or equal to value, Sample Usage: Floor(7.3) -> 7, Floor(7.9) -> 7
  1756. inline Int Floor ( Int x) {return x;}
  1757. inline Int Floor ( Flt x) {return floorf(x);}
  1758. inline Int Floor ( Dbl x) {return floor (x);}
  1759. inline Long FloorL( Dbl x) {return floor (x);}
  1760. inline VecI2 Floor (C Vec2 &x) {return VecI2(Floor(x.x), Floor(x.y) );}
  1761. inline VecI2 Floor (C VecD2 &x) {return VecI2(Floor(x.x), Floor(x.y) );}
  1762. inline VecI Floor (C Vec &x) {return VecI (Floor(x.x), Floor(x.y), Floor(x.z) );}
  1763. inline VecI Floor (C VecD &x) {return VecI (Floor(x.x), Floor(x.y), Floor(x.z) );}
  1764. inline VecI4 Floor (C Vec4 &x) {return VecI4(Floor(x.x), Floor(x.y), Floor(x.z), Floor(x.w));}
  1765. inline VecI4 Floor (C VecD4 &x) {return VecI4(Floor(x.x), Floor(x.y), Floor(x.z), Floor(x.w));}
  1766. // ceil, round to nearest integer which is greater or equal to value, Sample Usage: Ceil(7.3) -> 8, Ceil(7.9) -> 8
  1767. inline Int Ceil ( Int x) {return x;}
  1768. inline Int Ceil ( Flt x) {return ceilf(x);}
  1769. inline Int Ceil ( Dbl x) {return ceil (x);}
  1770. inline Long CeilL( Dbl x) {return ceil (x);}
  1771. inline VecI2 Ceil (C Vec2 &x) {return VecI2(Ceil(x.x), Ceil(x.y) );}
  1772. inline VecI2 Ceil (C VecD2 &x) {return VecI2(Ceil(x.x), Ceil(x.y) );}
  1773. inline VecI Ceil (C Vec &x) {return VecI (Ceil(x.x), Ceil(x.y), Ceil(x.z) );}
  1774. inline VecI Ceil (C VecD &x) {return VecI (Ceil(x.x), Ceil(x.y), Ceil(x.z) );}
  1775. inline VecI4 Ceil (C Vec4 &x) {return VecI4(Ceil(x.x), Ceil(x.y), Ceil(x.z), Ceil(x.w));}
  1776. inline VecI4 Ceil (C VecD4 &x) {return VecI4(Ceil(x.x), Ceil(x.y), Ceil(x.z), Ceil(x.w));}
  1777. #if EE_PRIVATE
  1778. inline Int FloorSpecial(Flt x) {return Ceil (x-1);} // this works in a similar way to "Floor(x)" however if a value falls exactly on integer (which means that fraction==0) then previous integer is chosen
  1779. inline Int CeilSpecial(Flt x) {return Floor(x+1);} // this works in a similar way to "Ceil (x)" however if a value falls exactly on integer (which means that fraction==0) then next integer is chosen
  1780. #endif
  1781. // get fraction, gets fractional part of a real value, Sample Usage: Frac(7.3) -> 0.3, Frac(7.9) -> 0.9
  1782. inline Flt Frac( Flt x) {return x-floorf(x);} // [0..1), use 'floorf' instead of 'Floor' to avoid conversion to Int (faster this way)
  1783. inline Dbl Frac( Dbl x) {return x-floor (x);} // [0..1), use 'floor' instead of 'Floor' to avoid conversion to Int (faster this way)
  1784. inline Vec2 Frac(C Vec2 &v) {return Vec2(Frac(v.x), Frac(v.y) );}
  1785. inline Vec Frac(C Vec &v) {return Vec (Frac(v.x), Frac(v.y), Frac(v.z) );}
  1786. inline Vec4 Frac(C Vec4 &v) {return Vec4(Frac(v.x), Frac(v.y), Frac(v.z), Frac(v.w));}
  1787. inline Flt FracS(Flt x) {return x-Trunc(x);} // (-1..1) (sign preserving)
  1788. inline Dbl FracS(Dbl x) {return x-Trunc(x);} // (-1..1) (sign preserving)
  1789. inline Flt Frac (Flt x, Flt range) {return Frac (x/range)*range;} // [ 0..range)
  1790. inline Dbl Frac (Dbl x, Dbl range) {return Frac (x/range)*range;} // [ 0..range)
  1791. inline Flt FracS(Flt x, Flt range) {return FracS(x/range)*range;} // (-range..range) (sign preserving)
  1792. inline Dbl FracS(Dbl x, Dbl range) {return FracS(x/range)*range;} // (-range..range) (sign preserving)
  1793. // align
  1794. inline Int AlignTrunc(Flt x, Int align) {return Trunc (x/align)*align;} // align 'x' to nearest multiple of 'align' using truncation
  1795. inline Flt AlignTrunc(Flt x, Flt align) {return Trunc (x/align)*align;} // align 'x' to nearest multiple of 'align' using truncation
  1796. inline Dbl AlignTrunc(Dbl x, Dbl align) {return Trunc (x/align)*align;} // align 'x' to nearest multiple of 'align' using truncation
  1797. inline Int AlignRound(Flt x, Int align) {return Round (x/align)*align;} // align 'x' to nearest multiple of 'align' using rounding
  1798. inline Flt AlignRound(Flt x, Flt align) {return Round (x/align)*align;} // align 'x' to nearest multiple of 'align' using rounding
  1799. inline Dbl AlignRound(Dbl x, Dbl align) {return Round (x/align)*align;} // align 'x' to nearest multiple of 'align' using rounding
  1800. inline Int AlignFloor(Flt x, Int align) {return Floor (x/align)*align;} // align 'x' to nearest multiple of 'align' using floor
  1801. inline Flt AlignFloor(Flt x, Flt align) {return floorf(x/align)*align;} // align 'x' to nearest multiple of 'align' using floor, use 'floorf' instead of 'Floor' to avoid conversion to Int (faster this way)
  1802. inline Dbl AlignFloor(Dbl x, Dbl align) {return floor (x/align)*align;} // align 'x' to nearest multiple of 'align' using floor, use 'floor' instead of 'Floor' to avoid conversion to Int (faster this way)
  1803. inline Int AlignCeil (Flt x, Int align) {return Ceil (x/align)*align;} // align 'x' to nearest multiple of 'align' using ceil
  1804. inline Flt AlignCeil (Flt x, Flt align) {return ceilf (x/align)*align;} // align 'x' to nearest multiple of 'align' using ceil , use 'ceilf' instead of 'Ceil' to avoid conversion to Int (faster this way)
  1805. inline Dbl AlignCeil (Dbl x, Dbl align) {return ceil (x/align)*align;} // align 'x' to nearest multiple of 'align' using ceil , use 'ceil' instead of 'Ceil' to avoid conversion to Int (faster this way)
  1806. /******************************************************************************/
  1807. // FUNCTIONS
  1808. /******************************************************************************/
  1809. inline VecUS2::VecUS2(C VecB2 &v) {set(v.x, v.y );}
  1810. inline VecUS2::VecUS2(C VecI2 &v) {set(v.x, v.y );}
  1811. inline VecUS ::VecUS (C VecB &v) {set(v.x, v.y, v.z );}
  1812. inline VecUS ::VecUS (C VecI &v) {set(v.x, v.y, v.z );}
  1813. inline Vec2 ::Vec2 (C VecH2 &v) {set(v.x, v.y );}
  1814. inline Vec2 ::Vec2 (C VecD2 &v) {set(v.x, v.y );}
  1815. inline Vec2 ::Vec2 (C VecI2 &v) {set(v.x, v.y );}
  1816. inline Vec2 ::Vec2 (C VecB2 &v) {set(v.x, v.y );}
  1817. inline Vec2 ::Vec2 (C VecSB2 &v) {set(v.x, v.y );}
  1818. inline Vec2 ::Vec2 (C VecUS2 &v) {set(v.x, v.y );}
  1819. inline VecD2 ::VecD2 (C VecH2 &v) {set(v.x, v.y );}
  1820. inline VecD2 ::VecD2 (C Vec2 &v) {set(v.x, v.y );}
  1821. inline VecD2 ::VecD2 (C VecI2 &v) {set(v.x, v.y );}
  1822. inline VecD2 ::VecD2 (C VecB2 &v) {set(v.x, v.y );}
  1823. inline VecD2 ::VecD2 (C VecSB2 &v) {set(v.x, v.y );}
  1824. inline VecD2 ::VecD2 (C VecUS2 &v) {set(v.x, v.y );}
  1825. inline Vec ::Vec (C VecH &v) {set(v.x, v.y, v.z );}
  1826. inline Vec ::Vec (C VecD &v) {set(v.x, v.y, v.z );}
  1827. inline Vec ::Vec (C VecI &v) {set(v.x, v.y, v.z );}
  1828. inline Vec ::Vec (C VecB &v) {set(v.x, v.y, v.z );}
  1829. inline Vec ::Vec (C VecSB &v) {set(v.x, v.y, v.z );}
  1830. inline VecD ::VecD (C VecH &v) {set(v.x, v.y, v.z );}
  1831. inline VecD ::VecD (C Vec &v) {set(v.x, v.y, v.z );}
  1832. inline VecD ::VecD (C VecI &v) {set(v.x, v.y, v.z );}
  1833. inline VecD ::VecD (C VecB &v) {set(v.x, v.y, v.z );}
  1834. inline VecD ::VecD (C VecSB &v) {set(v.x, v.y, v.z );}
  1835. inline Vec4 ::Vec4 (C VecH4 &v) {set(v.x, v.y, v.z, v.w);}
  1836. inline Vec4 ::Vec4 (C VecD4 &v) {set(v.x, v.y, v.z, v.w);}
  1837. inline Vec4 ::Vec4 (C VecI4 &v) {set(v.x, v.y, v.z, v.w);}
  1838. inline Vec4 ::Vec4 (C VecB4 &v) {set(v.x, v.y, v.z, v.w);}
  1839. inline Vec4 ::Vec4 (C VecSB4 &v) {set(v.x, v.y, v.z, v.w);}
  1840. inline VecD4 ::VecD4 (C VecH4 &v) {set(v.x, v.y, v.z, v.w);}
  1841. inline VecD4 ::VecD4 (C Vec4 &v) {set(v.x, v.y, v.z, v.w);}
  1842. inline VecD4 ::VecD4 (C VecI4 &v) {set(v.x, v.y, v.z, v.w);}
  1843. inline VecD4 ::VecD4 (C VecB4 &v) {set(v.x, v.y, v.z, v.w);}
  1844. inline VecD4 ::VecD4 (C VecSB4 &v) {set(v.x, v.y, v.z, v.w);}
  1845. inline Vec Vec2 :: xy0()C {return Vec (x, y, 0);}
  1846. inline Vec Vec2 :: x0y()C {return Vec (x, 0, y);}
  1847. inline Vec Vec2 ::_0xy()C {return Vec (0, x, y);}
  1848. inline Vec Vec2 ::_0yx()C {return Vec (0, y, x);}
  1849. inline VecD VecD2:: xy0()C {return VecD(x, y, 0);}
  1850. inline VecD VecD2:: x0y()C {return VecD(x, 0, y);}
  1851. inline VecD VecD2::_0xy()C {return VecD(0, x, y);}
  1852. inline VecD VecD2::_0yx()C {return VecD(0, y, x);}
  1853. inline VecI VecI2:: xy0()C {return VecI(x, y, 0);}
  1854. inline VecI VecI2:: x0y()C {return VecI(x, 0, y);}
  1855. inline VecI VecI2::_0xy()C {return VecI(0, x, y);}
  1856. inline VecI VecI2::_0yx()C {return VecI(0, y, x);}
  1857. inline Bool VecUS2::operator==(C VecUS2 &v)C {return x==v.x && y==v.y;}
  1858. inline Bool VecUS2::operator!=(C VecUS2 &v)C {return x!=v.x || y!=v.y;}
  1859. inline Bool VecUS2::operator==(C VecB2 &v)C {return x==v.x && y==v.y;}
  1860. inline Bool VecUS2::operator!=(C VecB2 &v)C {return x!=v.x || y!=v.y;}
  1861. inline Bool VecUS2::operator==(C VecI2 &v)C {return x==v.x && y==v.y;}
  1862. inline Bool VecUS2::operator!=(C VecI2 &v)C {return x!=v.x || y!=v.y;}
  1863. inline Bool VecUS::operator==(C VecUS &v)C {return x==v.x && y==v.y && z==v.z;}
  1864. inline Bool VecUS::operator!=(C VecUS &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1865. inline Bool VecUS::operator==(C VecB &v)C {return x==v.x && y==v.y && z==v.z;}
  1866. inline Bool VecUS::operator!=(C VecB &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1867. inline Bool VecUS::operator==(C VecI &v)C {return x==v.x && y==v.y && z==v.z;}
  1868. inline Bool VecUS::operator!=(C VecI &v)C {return x!=v.x || y!=v.y || z!=v.z;}
  1869. inline VecD operator+ (C Vec &v, Dbl r) {return VecD(v.x+r, v.y+r, v.z+r);}
  1870. inline VecD operator- (C Vec &v, Dbl r) {return VecD(v.x-r, v.y-r, v.z-r);}
  1871. inline VecD operator* (C Vec &v, Dbl r) {return VecD(v.x*r, v.y*r, v.z*r);}
  1872. inline VecD operator/ (C Vec &v, Dbl r) {return VecD(v.x/r, v.y/r, v.z/r);}
  1873. inline VecD operator+ (Dbl r, C Vec &v) {return VecD(r+v.x, r+v.y, r+v.z);}
  1874. inline VecD operator- (Dbl r, C Vec &v) {return VecD(r-v.x, r-v.y, r-v.z);}
  1875. inline VecD operator* (Dbl r, C Vec &v) {return VecD(r*v.x, r*v.y, r*v.z);}
  1876. inline VecD operator/ (Dbl r, C Vec &v) {return VecD(r/v.x, r/v.y, r/v.z);}
  1877. inline VecD operator* (C Vec &v, C OrientD &o) {return VecD(v)*=o;}
  1878. inline VecD operator* (C Vec &v, C OrientM &o) {return VecD(v)*=o;}
  1879. inline VecD operator* (C Vec &v, C MatrixD3 &m) {return VecD(v)*=m;}
  1880. inline VecD operator* (C Vec &v, C MatrixM &m) {return VecD(v)*=m;}
  1881. inline VecD operator* (C Vec &v, C MatrixD &m) {return VecD(v)*=m;}
  1882. inline VecD operator/ (C Vec &v, C MatrixD3 &m) {return VecD(v)/=m;}
  1883. inline VecD operator/ (C Vec &v, C MatrixM &m) {return VecD(v)/=m;}
  1884. inline VecD operator/ (C Vec &v, C MatrixD &m) {return VecD(v)/=m;}
  1885. // minimum & maximum
  1886. inline Vec2 Min(C Vec2 &a, C Vec2 &b) {return Vec2 (Min(a.x,b.x), Min(a.y,b.y) );}
  1887. inline VecI2 Min(C VecI2 &a, C VecI2 &b) {return VecI2(Min(a.x,b.x), Min(a.y,b.y) );}
  1888. inline Vec2 Max(C Vec2 &a, C Vec2 &b) {return Vec2 (Max(a.x,b.x), Max(a.y,b.y) );}
  1889. inline VecI2 Max(C VecI2 &a, C VecI2 &b) {return VecI2(Max(a.x,b.x), Max(a.y,b.y) );}
  1890. inline Vec Min(C Vec &a, C Vec &b) {return Vec (Min(a.x,b.x), Min(a.y,b.y), Min(a.z,b.z) );}
  1891. inline VecI Min(C VecI &a, C VecI &b) {return VecI (Min(a.x,b.x), Min(a.y,b.y), Min(a.z,b.z) );}
  1892. inline Vec Max(C Vec &a, C Vec &b) {return Vec (Max(a.x,b.x), Max(a.y,b.y), Max(a.z,b.z) );}
  1893. inline VecI Max(C VecI &a, C VecI &b) {return VecI (Max(a.x,b.x), Max(a.y,b.y), Max(a.z,b.z) );}
  1894. inline Vec4 Min(C Vec4 &a, C Vec4 &b) {return Vec4 (Min(a.x,b.x), Min(a.y,b.y), Min(a.z,b.z), Min(a.w,b.w));}
  1895. inline VecI4 Min(C VecI4 &a, C VecI4 &b) {return VecI4(Min(a.x,b.x), Min(a.y,b.y), Min(a.z,b.z), Min(a.w,b.w));}
  1896. inline Vec4 Max(C Vec4 &a, C Vec4 &b) {return Vec4 (Max(a.x,b.x), Max(a.y,b.y), Max(a.z,b.z), Max(a.w,b.w));}
  1897. inline VecI4 Max(C VecI4 &a, C VecI4 &b) {return VecI4(Max(a.x,b.x), Max(a.y,b.y), Max(a.z,b.z), Max(a.w,b.w));}
  1898. VecB4 Min(C VecB4 &a, C VecB4 &b);
  1899. VecB4 Max(C VecB4 &a, C VecB4 &b);
  1900. VecB4 Min(C VecB4 &a, C VecB4 &b, C VecB4 &c);
  1901. VecB4 Max(C VecB4 &a, C VecB4 &b, C VecB4 &c);
  1902. VecB4 Min(C VecB4 &a, C VecB4 &b, C VecB4 &c, C VecB4 &d);
  1903. VecB4 Max(C VecB4 &a, C VecB4 &b, C VecB4 &c, C VecB4 &d);
  1904. // average
  1905. inline Vec2 Avg(C Vec2 &a, C Vec2 &b ) {return (a+b )*0.5f ;}
  1906. inline VecD2 Avg(C VecD2 &a, C VecD2 &b ) {return (a+b )*0.5 ;}
  1907. inline Vec Avg(C Vec &a, C Vec &b ) {return (a+b )*0.5f ;}
  1908. inline VecD Avg(C VecD &a, C VecD &b ) {return (a+b )*0.5 ;}
  1909. inline Vec4 Avg(C Vec4 &a, C Vec4 &b ) {return (a+b )*0.5f ;}
  1910. inline VecD4 Avg(C VecD4 &a, C VecD4 &b ) {return (a+b )*0.5 ;}
  1911. inline Vec2 Avg(C Vec2 &a, C Vec2 &b, C Vec2 &c ) {return (a+b+c )/3.0f ;}
  1912. inline VecD2 Avg(C VecD2 &a, C VecD2 &b, C VecD2 &c ) {return (a+b+c )/3.0 ;}
  1913. inline Vec Avg(C Vec &a, C Vec &b, C Vec &c ) {return (a+b+c )/3.0f ;}
  1914. inline VecD Avg(C VecD &a, C VecD &b, C VecD &c ) {return (a+b+c )/3.0 ;}
  1915. inline Vec2 Avg(C Vec2 &a, C Vec2 &b, C Vec2 &c, C Vec2 &d) {return (a+b+c+d)*0.25f;}
  1916. inline VecD2 Avg(C VecD2 &a, C VecD2 &b, C VecD2 &c, C VecD2 &d) {return (a+b+c+d)*0.25 ;}
  1917. inline Vec Avg(C Vec &a, C Vec &b, C Vec &c, C Vec &d) {return (a+b+c+d)*0.25f;}
  1918. inline VecD Avg(C VecD &a, C VecD &b, C VecD &c, C VecD &d) {return (a+b+c+d)*0.25 ;}
  1919. VecB4 AvgI(C VecB4 &a, C VecB4 &b );
  1920. VecB4 AvgI(C VecB4 &a, C VecB4 &b, C VecB4 &c );
  1921. VecB4 AvgI(C VecB4 &a, C VecB4 &b, C VecB4 &c, C VecB4 &d);
  1922. VecI2 AvgI(C VecI2 &a, C VecI2 &b);
  1923. VecI AvgI(C VecI &a, C VecI &b);
  1924. VecI4 AvgI(C VecI4 &a, C VecI4 &b);
  1925. Vec2 AvgF(C VecI2 &a, C VecI2 &b);
  1926. Vec AvgF(C VecI &a, C VecI &b);
  1927. Vec4 AvgF(C VecI4 &a, C VecI4 &b);
  1928. // distance between 2 points
  1929. Flt Dist(C Vec2 &a, C Vec2 &b);
  1930. Flt Dist(C VecI2 &a, C Vec2 &b);
  1931. Flt Dist(C Vec2 &a, C VecI2 &b);
  1932. Dbl Dist(C VecD2 &a, C VecD2 &b);
  1933. Flt Dist(C VecI2 &a, C VecI2 &b);
  1934. Flt Dist(C Vec &a, C Vec &b);
  1935. Dbl Dist(C VecD &a, C Vec &b);
  1936. Dbl Dist(C Vec &a, C VecD &b);
  1937. Dbl Dist(C VecD &a, C VecD &b);
  1938. Flt Dist(C VecI &a, C VecI &b);
  1939. // squared distance between 2 points
  1940. Flt Dist2(C Vec2 &a, C Vec2 &b);
  1941. Flt Dist2(C VecI2 &a, C Vec2 &b);
  1942. Flt Dist2(C Vec2 &a, C VecI2 &b);
  1943. Dbl Dist2(C VecD2 &a, C VecD2 &b);
  1944. Int Dist2(C VecI2 &a, C VecI2 &b);
  1945. Flt Dist2(C Vec &a, C Vec &b);
  1946. Dbl Dist2(C VecD &a, C Vec &b);
  1947. Dbl Dist2(C Vec &a, C VecD &b);
  1948. Dbl Dist2(C VecD &a, C VecD &b);
  1949. Int Dist2(C VecI &a, C VecI &b);
  1950. Flt Dist2(C Vec4 &a, C Vec4 &b);
  1951. // dot product
  1952. inline Flt Dot(C Vec2 &a, C Vec2 &b) {return a.x*b.x + a.y*b.y ;}
  1953. inline Flt Dot(C Vec2 &a, C VecI2 &b) {return a.x*b.x + a.y*b.y ;}
  1954. inline Flt Dot(C VecI2 &a, C Vec2 &b) {return a.x*b.x + a.y*b.y ;}
  1955. inline Dbl Dot(C VecD2 &a, C VecD2 &b) {return a.x*b.x + a.y*b.y ;}
  1956. inline Int Dot(C VecI2 &a, C VecI2 &b) {return a.x*b.x + a.y*b.y ;}
  1957. inline Flt Dot(C Vec &a, C Vec &b) {return a.x*b.x + a.y*b.y + a.z*b.z ;}
  1958. inline Dbl Dot(C Vec &a, C VecD &b) {return a.x*b.x + a.y*b.y + a.z*b.z ;}
  1959. inline Dbl Dot(C VecD &a, C Vec &b) {return a.x*b.x + a.y*b.y + a.z*b.z ;}
  1960. inline Dbl Dot(C VecD &a, C VecD &b) {return a.x*b.x + a.y*b.y + a.z*b.z ;}
  1961. inline Int Dot(C VecI &a, C VecI &b) {return a.x*b.x + a.y*b.y + a.z*b.z ;}
  1962. inline Flt Dot(C Vec4 &a, C Vec4 &b) {return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;}
  1963. inline Dbl Dot(C VecD4 &a, C VecD4 &b) {return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;}
  1964. inline Int Dot(C VecI4 &a, C VecI4 &b) {return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;}
  1965. // cross product
  1966. Flt Cross(C Vec2 &a, C Vec2 &b);
  1967. Dbl Cross(C VecD2 &a, C VecD2 &b);
  1968. // cross product
  1969. Vec Cross(C Vec &a, C Vec &b);
  1970. VecD Cross(C VecD &a, C VecD &b);
  1971. // cross product normalized
  1972. Vec CrossN(C Vec &a, C Vec &b);
  1973. VecD CrossN(C VecD &a, C VecD &b);
  1974. // perpendicular vector
  1975. Vec2 Perp(C Vec2 &v); // returned vector is always rotated by 90 deg clockwise
  1976. VecD2 Perp(C VecD2 &v); // returned vector is always rotated by 90 deg clockwise
  1977. VecI2 Perp(C VecI2 &v); // returned vector is always rotated by 90 deg clockwise
  1978. Vec Perp(C Vec &v);
  1979. VecD Perp(C VecD &v);
  1980. // perpendicular vector normalized
  1981. Vec2 PerpN(C Vec2 &v); // returned vector is always rotated by 90 deg clockwise
  1982. VecD2 PerpN(C VecD2 &v); // returned vector is always rotated by 90 deg clockwise
  1983. Vec PerpN(C Vec &v);
  1984. VecD PerpN(C VecD &v);
  1985. // reflect vector (result is on the same side of the plane)
  1986. Vec2 Reflect(C Vec2 &vec, C Vec2 &plane_nrm); // here 'reflection_pos' is assumed to be (0,0)
  1987. VecD2 Reflect(C VecD2 &vec, C VecD2 &plane_nrm); // here 'reflection_pos' is assumed to be (0,0) | /result
  1988. Vec Reflect(C Vec &vec, C Vec &plane_nrm); // here 'reflection_pos' is assumed to be (0,0,0) | /
  1989. VecD Reflect(C VecD &vec, C VecD &plane_nrm); // here 'reflection_pos' is assumed to be (0,0,0) |/
  1990. Vec2 Reflect(C Vec2 &vec, C Vec2 &reflect_pos, C Vec2 &plane_nrm); // ReflectPos+----->normal
  1991. VecD2 Reflect(C VecD2 &vec, C VecD2 &reflect_pos, C VecD2 &plane_nrm); // |\ 
  1992. Vec Reflect(C Vec &vec, C Vec &reflect_pos, C Vec &plane_nrm); // | \ 
  1993. VecD Reflect(C VecD &vec, C VecD &reflect_pos, C VecD &plane_nrm); // | \vec
  1994. // mirror vector (result is on the other side of the plane)
  1995. Vec2 Mirror(C Vec2 &vec, C Vec2 &plane_nrm); // here 'plane_pos' is assumed to be (0,0)
  1996. VecD2 Mirror(C VecD2 &vec, C VecD2 &plane_nrm); // here 'plane_pos' is assumed to be (0,0) |
  1997. Vec Mirror(C Vec &vec, C Vec &plane_nrm); // here 'plane_pos' is assumed to be (0,0,0) |
  1998. VecD Mirror(C VecD &vec, C VecD &plane_nrm); // here 'plane_pos' is assumed to be (0,0,0) |
  1999. Vec2 Mirror(C Vec2 &vec, C Vec2 &plane_pos, C Vec2 &plane_nrm); // PlanePos+----->normal
  2000. VecD2 Mirror(C VecD2 &vec, C VecD2 &plane_pos, C VecD2 &plane_nrm); // /|\ 
  2001. Vec Mirror(C Vec &vec, C Vec &plane_pos, C Vec &plane_nrm); // / | \ 
  2002. VecD Mirror(C VecD &vec, C VecD &plane_pos, C Vec &plane_nrm); // result/ | \vec
  2003. VecD Mirror(C VecD &vec, C VecD &plane_pos, C VecD &plane_nrm); //
  2004. #if EE_PRIVATE
  2005. // index of closer point to 'p' (returns 1 if 'p1' is closer to 'p', and 0 if 'p0' is closer to 'p')
  2006. Int Closer(C Vec2 &p, C Vec2 &p0, C Vec2 &p1);
  2007. Int Closer(C VecD2 &p, C VecD2 &p0, C VecD2 &p1);
  2008. Int Closer(C Vec &p, C Vec &p0, C Vec &p1);
  2009. Int Closer(C VecD &p, C VecD &p0, C VecD &p1);
  2010. #endif
  2011. // if equal (epsilon=EPS)
  2012. Bool Equal( Flt r0, Flt r1);
  2013. Bool Equal(C Vec2 &v0, C Vec2 &v1);
  2014. Bool Equal(C Vec &v0, C Vec &v1);
  2015. Bool Equal(C Vec4 &v0, C Vec4 &v1);
  2016. // if equal (epsilon=EPSD)
  2017. Bool Equal( Dbl r0, Dbl r1);
  2018. Bool Equal(C VecD2 &v0, C VecD2 &v1);
  2019. Bool Equal(C VecD &v0, C VecD &v1);
  2020. Bool Equal(C VecD4 &v0, C VecD4 &v1);
  2021. // if equal (with custom epsilon)
  2022. Bool Equal( Flt r0, Flt r1, Flt epsilon);
  2023. Bool Equal( Dbl r0, Dbl r1, Dbl epsilon);
  2024. Bool Equal(C Vec2 &v0, C Vec2 &v1, Flt epsilon);
  2025. Bool Equal(C VecD2 &v0, C VecD2 &v1, Dbl epsilon);
  2026. Bool Equal(C Vec &v0, C Vec &v1, Flt epsilon);
  2027. Bool Equal(C VecD &v0, C VecD &v1, Dbl epsilon);
  2028. Bool Equal(C Vec4 &v0, C Vec4 &v1, Flt epsilon);
  2029. Bool Equal(C VecD4 &v0, C VecD4 &v1, Dbl epsilon);
  2030. // if equal using 0..1 wrapping (epsilon=EPS)
  2031. Bool EqualWrap( Flt r0, Flt r1);
  2032. Bool EqualWrap(C Vec2 &v0, C Vec2 &v1);
  2033. Bool EqualWrap(C Vec &v0, C Vec &v1);
  2034. // compare
  2035. Int Compare(C Vec2 &v0, C Vec2 &v1);
  2036. Int Compare(C VecD2 &v0, C VecD2 &v1);
  2037. Int Compare(C Vec &v0, C Vec &v1);
  2038. Int Compare(C VecD &v0, C VecD &v1);
  2039. Int Compare(C Vec4 &v0, C Vec4 &v1);
  2040. Int Compare(C VecD4 &v0, C VecD4 &v1);
  2041. Int Compare(C VecI2 &v0, C VecI2 &v1);
  2042. Int Compare(C VecB2 &v0, C VecB2 &v1);
  2043. Int Compare(C VecSB2 &v0, C VecSB2 &v1);
  2044. Int Compare(C VecUS2 &v0, C VecUS2 &v1);
  2045. Int Compare(C VecI &v0, C VecI &v1);
  2046. Int Compare(C VecB &v0, C VecB &v1);
  2047. Int Compare(C VecSB &v0, C VecSB &v1);
  2048. Int Compare(C VecUS &v0, C VecUS &v1);
  2049. Int Compare(C VecI4 &v0, C VecI4 &v1);
  2050. Int Compare(C VecB4 &v0, C VecB4 &v1);
  2051. Int Compare(C VecSB4 &v0, C VecSB4 &v1);
  2052. Int Compare(C Color &c0, C Color &c1);
  2053. Int Compare(C VecH2 &v0, C VecH2 &v1);
  2054. Int Compare(C VecH &v0, C VecH &v1);
  2055. Int Compare(C VecH4 &v0, C VecH4 &v1);
  2056. // normalize array of vectors
  2057. void Normalize(Vec2 *v, Int num);
  2058. void Normalize(VecD2 *v, Int num);
  2059. void Normalize(Vec *v, Int num);
  2060. void Normalize(VecD *v, Int num);
  2061. // transform vectors by matrix
  2062. void Transform(Vec2 *v, C Matrix3 &m, Int num);
  2063. void Transform(Vec2 *v, C Matrix &m, Int num);
  2064. void Transform(Vec *v, C Matrix3 &m, Int num);
  2065. void Transform(Vec *v, C Matrix &m, Int num);
  2066. void Transform(VecD *v, C MatrixM &m, Int num);
  2067. // change sign of vectors
  2068. void Chs(Vec2 *v, Int num);
  2069. void Chs(VecD2 *v, Int num);
  2070. void Chs(Vec *v, Int num);
  2071. void Chs(VecD *v, Int num);
  2072. // change sign of X component in vectors
  2073. void ChsX(Vec2 *v, Int num);
  2074. void ChsX(Vec *v, Int num);
  2075. // change sign of Y component in vectors
  2076. void ChsY(Vec2 *v, Int num);
  2077. void ChsY(Vec *v, Int num);
  2078. // change sign of Z component in vectors
  2079. void ChsZ(Vec *v, Int num);
  2080. // reverse components order in vectors
  2081. void Reverse(VecI2 *v, Int num);
  2082. void Reverse(VecI *v, Int num);
  2083. void Reverse(VecI4 *v, Int num);
  2084. // swap X Z components in vectors
  2085. void SwapXZ(VecI *v, Int num);
  2086. void SwapXZ(VecI4 *v, Int num);
  2087. // get minimum and maximum from array of vectors
  2088. Bool MinMax(C Vec2 *v, Int num, Vec2 &min, Vec2 &max);
  2089. Bool MinMax(C VecD2 *v, Int num, VecD2 &min, VecD2 &max);
  2090. Bool MinMax(C Vec *v, Int num, Vec &min, Vec &max);
  2091. Bool MinMax(C VecD *v, Int num, VecD &min, VecD &max);
  2092. Bool MinMax(C Vec4 *v, Int num, Vec4 &min, Vec4 &max);
  2093. Bool MinMax(C VecD4 *v, Int num, VecD4 &min, VecD4 &max);
  2094. #if EE_PRIVATE
  2095. // convert from right hand to left hand coordinate system
  2096. void RightToLeft(Vec *vec, Int num);
  2097. #endif
  2098. CChar8* DirToText(DIR_ENUM dir); // get direction in text format, "Right", "Left", "Up", "Down", "Forward", "Back"
  2099. inline UInt DirToFlag(DIR_ENUM dir) {return 1<<dir;} // convert DIR_ENUM to DIR_FLAG
  2100. AXIS_TYPE DirToAxis(DIR_ENUM dir); // convert DIR_ENUM to AXIS_TYPE
  2101. /******************************************************************************/
  2102. enum SMOOTH_VALUE_MODE : Byte // SmoothValue Mode
  2103. {
  2104. SV_NONE, // no smoothing
  2105. SV_WEIGHT2, // sets result equal to 2 previous values weighted average
  2106. SV_WEIGHT3, // sets result equal to 3 previous values weighted average
  2107. SV_WEIGHT4, // sets result equal to 4 previous values weighted average
  2108. SV_WEIGHT8, // sets result equal to 8 previous values weighted average
  2109. SV_AVERAGE2, // sets result equal to 2 previous values average
  2110. SV_AVERAGE3, // sets result equal to 3 previous values average
  2111. SV_AVERAGE4, // sets result equal to 4 previous values average
  2112. SV_AVERAGE8, // sets result equal to 8 previous values average
  2113. SV_NUM, // number of smoothing modes
  2114. };
  2115. struct SmoothValue
  2116. {
  2117. void mode (SMOOTH_VALUE_MODE mode); SMOOTH_VALUE_MODE mode()C {return _mode;} // set/get SMOOTH_VALUE_MODE
  2118. void init (Flt start_value); // init with starting value
  2119. Flt update(Flt current_value); // update by giving current raw value, returns smooth result based on SMOOTH_VALUE_MODE and previous values
  2120. explicit SmoothValue(SMOOTH_VALUE_MODE mode=SV_WEIGHT4);
  2121. private:
  2122. SMOOTH_VALUE_MODE _mode;
  2123. Byte _pos;
  2124. Flt _history[8];
  2125. };
  2126. struct SmoothValue2
  2127. {
  2128. void mode (SMOOTH_VALUE_MODE mode); SMOOTH_VALUE_MODE mode()C {return _mode;} // set/get SMOOTH_VALUE_MODE
  2129. void init (C Vec2 & start_value); // init with starting value
  2130. Vec2 update(C Vec2 & current_value); // update by giving current raw value, returns smooth result based on SMOOTH_VALUE_MODE and previous values
  2131. explicit SmoothValue2(SMOOTH_VALUE_MODE mode=SV_WEIGHT4);
  2132. private:
  2133. SMOOTH_VALUE_MODE _mode;
  2134. Byte _pos;
  2135. Vec2 _history[8];
  2136. };
  2137. /******************************************************************************/
  2138. struct SmoothValueTime
  2139. {
  2140. Flt update(Flt current_value, Flt dt); // update by giving current raw value, returns smooth result, 'dt'=time delta
  2141. #if EE_PRIVATE
  2142. SmoothValueTime& historyTime(Flt time); // set how long keep the values in history
  2143. #endif
  2144. explicit SmoothValueTime(Flt history_time=4.0f/60); // 'history_time'=how long keep the values in history
  2145. private:
  2146. Byte _pos;
  2147. Flt _step_time, _time, _time_total, _history[8];
  2148. };
  2149. struct SmoothValueTime2
  2150. {
  2151. Vec2 update(C Vec2 &current_value, Flt dt); // update by giving current raw value, returns smooth result, 'dt'=time delta
  2152. #if EE_PRIVATE
  2153. SmoothValueTime2& historyTime(Flt time); // set how long keep the values in history
  2154. #endif
  2155. explicit SmoothValueTime2(Flt history_time=4.0f/60); // 'history_time'=how long keep the values in history
  2156. private:
  2157. Byte _pos;
  2158. Flt _step_time, _time, _time_total;
  2159. Vec2 _history[8];
  2160. };
  2161. /******************************************************************************/
  2162. struct SmoothValueSettings
  2163. {
  2164. Flt time_delta , // time delta in this frame
  2165. max_accel , // max allowed acceleration
  2166. max_velocity; // max allowed velocity
  2167. void reset(Flt max_accel);
  2168. };
  2169. struct SmoothValueAccel
  2170. {
  2171. Flt value, velocity;
  2172. void update(Flt target, C SmoothValueSettings &settings);
  2173. SmoothValueAccel( ) : value( 0), velocity( 0) {}
  2174. SmoothValueAccel(Flt value, Flt velocity=0) : value(value), velocity(velocity) {}
  2175. };
  2176. struct SmoothValueAccel2
  2177. {
  2178. Vec2 value, velocity;
  2179. void update(C Vec2 &target, C SmoothValueSettings &settings);
  2180. SmoothValueAccel2( ) : value( 0), velocity( 0) {}
  2181. SmoothValueAccel2(C Vec2 &value, C Vec2 &velocity=Vec2Zero) : value(value), velocity(velocity) {}
  2182. };
  2183. struct SmoothValueAccel3
  2184. {
  2185. Vec value, velocity;
  2186. void update(C Vec &target, C SmoothValueSettings &settings);
  2187. SmoothValueAccel3( ) : value( 0), velocity( 0) {}
  2188. SmoothValueAccel3(C Vec &value, C Vec &velocity=VecZero) : value(value), velocity(velocity) {}
  2189. };
  2190. /******************************************************************************/
  2191. constexpr Int Elms(C VecH2 &v) {return 2;}
  2192. constexpr Int Elms(C Vec2 &v) {return 2;}
  2193. constexpr Int Elms(C VecD2 &v) {return 2;}
  2194. constexpr Int Elms(C VecI2 &v) {return 2;}
  2195. constexpr Int Elms(C VecB2 &v) {return 2;}
  2196. constexpr Int Elms(C VecSB2 &v) {return 2;}
  2197. constexpr Int Elms(C VecUS2 &v) {return 2;}
  2198. constexpr Int Elms(C VecH &v) {return 3;}
  2199. constexpr Int Elms(C Vec &v) {return 3;}
  2200. constexpr Int Elms(C VecD &v) {return 3;}
  2201. constexpr Int Elms(C VecI &v) {return 3;}
  2202. constexpr Int Elms(C VecB &v) {return 3;}
  2203. constexpr Int Elms(C VecSB &v) {return 3;}
  2204. constexpr Int Elms(C VecUS &v) {return 3;}
  2205. constexpr Int Elms(C VecH4 &v) {return 4;}
  2206. constexpr Int Elms(C Vec4 &v) {return 4;}
  2207. constexpr Int Elms(C VecD4 &v) {return 4;}
  2208. constexpr Int Elms(C VecI4 &v) {return 4;}
  2209. constexpr Int Elms(C VecB4 &v) {return 4;}
  2210. constexpr Int Elms(C VecSB4 &v) {return 4;}
  2211. /******************************************************************************/