| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826 |
- //
- // SPDX-License-Identifier: BSD-3-Clause
- // Copyright Contributors to the OpenEXR Project.
- //
- //
- // 2x2, 3x3, and 4x4 transformation matrix templates
- //
- #ifndef INCLUDED_IMATHMATRIX_H
- #define INCLUDED_IMATHMATRIX_H
- #include "ImathExport.h"
- #include "ImathNamespace.h"
- #include "ImathFun.h"
- #include "ImathPlatform.h"
- #include "ImathShear.h"
- #include "ImathVec.h"
- #include <cstring>
- #include <iomanip>
- #include <iostream>
- #include <limits>
- #include <string.h>
- #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
- // suppress exception specification warnings
- # pragma warning(disable : 4290)
- #endif
- IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
- /// Enum used to indicate uninitialized construction of Matrix22,
- /// Matrix33, Matrix44
- enum IMATH_EXPORT_ENUM Uninitialized
- {
- UNINITIALIZED
- };
- ///
- /// 2x2 transformation matrix
- ///
- template <class T> class IMATH_EXPORT_TEMPLATE_TYPE Matrix22
- {
- public:
- /// @{
- /// @name Direct access to elements
-
- /// Matrix elements
- T x[2][2];
- /// @}
-
- /// Row access
- IMATH_HOSTDEVICE T* operator[] (int i) IMATH_NOEXCEPT;
- /// Row access
- IMATH_HOSTDEVICE const T* operator[] (int i) const IMATH_NOEXCEPT;
- /// @{
- /// @name Constructors and Assignment
- /// Uninitialized
- IMATH_HOSTDEVICE Matrix22 (Uninitialized) IMATH_NOEXCEPT {}
- /// Default constructor: initialize to identity
- ///
- /// 1 0
- /// 0 1
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22() IMATH_NOEXCEPT;
- /// Initialize to scalar constant:
- ///
- /// a a
- /// a a
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22 (T a) IMATH_NOEXCEPT;
- /// Construct from 2x2 array:
- ///
- /// a[0][0] a[0][1]
- /// a[1][0] a[1][1]
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22 (const T a[2][2]) IMATH_NOEXCEPT;
- /// Construct from given scalar values:
- ///
- /// a b
- /// c d
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22 (T a, T b, T c, T d) IMATH_NOEXCEPT;
- /// Copy constructor
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22 (const Matrix22& v) IMATH_NOEXCEPT;
- /// Construct from Matrix22 of another base type
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 explicit Matrix22 (const Matrix22<S>& v) IMATH_NOEXCEPT;
- /// Assignment
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator= (const Matrix22& v) IMATH_NOEXCEPT;
- /// Assignment from scalar
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator= (T a) IMATH_NOEXCEPT;
- /// Destructor
- ~Matrix22() IMATH_NOEXCEPT = default;
- /// @}
- #if IMATH_FOREIGN_VECTOR_INTEROP
- /// @{
- /// @name Interoperability with other matrix types
- ///
- /// Construction and assignment are allowed from other classes that
- /// appear to be equivalent matrix types, provided that they support
- /// double-subscript (i.e., `m[j][i]`) giving the same type as the
- /// elements of this matrix, and their total size appears to be the
- /// right number of matrix elements.
- ///
- /// This functionality is disabled for gcc 4.x, which seems to have a
- /// compiler bug that results in spurious errors. It can also be
- /// disabled by defining IMATH_FOREIGN_VECTOR_INTEROP to be 0 prior to
- /// including any Imath header files.
- ///
- template<typename M, IMATH_ENABLE_IF(has_double_subscript<M,T,2,2>::value)>
- IMATH_HOSTDEVICE explicit Matrix22 (const M& m)
- : Matrix22(T(m[0][0]), T(m[0][1]), T(m[1][0]), T(m[1][1]))
- { }
- template<typename M, IMATH_ENABLE_IF(has_double_subscript<M,T,2,2>::value)>
- IMATH_HOSTDEVICE const Matrix22& operator= (const M& m)
- {
- *this = Matrix22(T(m[0][0]), T(m[0][1]), T(m[1][0]), T(m[1][1]));
- return *this;
- }
- /// @}
- #endif
- /// @{
- /// @name Compatibility with Sb
- /// Return a raw pointer to the array of values
- IMATH_HOSTDEVICE T* getValue() IMATH_NOEXCEPT;
- /// Return a raw pointer to the array of values
- IMATH_HOSTDEVICE const T* getValue() const IMATH_NOEXCEPT;
- /// Return the value in `v`
- template <class S> IMATH_HOSTDEVICE void getValue (Matrix22<S>& v) const IMATH_NOEXCEPT;
- /// Set the value
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22& setValue (const Matrix22<S>& v) IMATH_NOEXCEPT;
- /// Set the value
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22& setTheMatrix (const Matrix22<S>& v) IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Arithmetic and Comparison
-
- /// Equality
- IMATH_HOSTDEVICE constexpr bool operator== (const Matrix22& v) const IMATH_NOEXCEPT;
- /// Inequality
- IMATH_HOSTDEVICE constexpr bool operator!= (const Matrix22& v) const IMATH_NOEXCEPT;
- /// Compare two matrices and test if they are "approximately equal":
- /// @return True if the coefficients of this and `m` are the same
- /// with an absolute error of no more than e, i.e., for all i, j:
- ///
- /// abs (this[i][j] - m[i][j]) <= e
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool equalWithAbsError (const Matrix22<T>& v, T e) const IMATH_NOEXCEPT;
- /// Compare two matrices and test if they are "approximately equal":
- /// @return True if the coefficients of this and m are the same with
- /// a relative error of no more than e, i.e., for all i, j:
- ///
- /// abs (this[i] - v[i][j]) <= e * abs (this[i][j])
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool equalWithRelError (const Matrix22<T>& v, T e) const IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator+= (const Matrix22& v) IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator+= (T a) IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE constexpr Matrix22 operator+ (const Matrix22& v) const IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator-= (const Matrix22& v) IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator-= (T a) IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE constexpr Matrix22 operator- (const Matrix22& v) const IMATH_NOEXCEPT;
- /// Component-wise multiplication by -1
- IMATH_HOSTDEVICE constexpr Matrix22 operator-() const IMATH_NOEXCEPT;
- /// Component-wise multiplication by -1
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& negate() IMATH_NOEXCEPT;
- /// Component-wise multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator*= (T a) IMATH_NOEXCEPT;
- /// Component-wise multiplication
- IMATH_HOSTDEVICE constexpr Matrix22 operator* (T a) const IMATH_NOEXCEPT;
- /// Component-wise division
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator/= (T a) IMATH_NOEXCEPT;
- /// Component-wise division
- IMATH_HOSTDEVICE constexpr Matrix22 operator/ (T a) const IMATH_NOEXCEPT;
- /// Matrix-matrix multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& operator*= (const Matrix22& v) IMATH_NOEXCEPT;
- /// Matrix-matrix multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22 operator* (const Matrix22& v) const IMATH_NOEXCEPT;
- /// Vector * matrix multiplication
- /// @param[in] src Input vector
- /// @param[out] dst transformed vector
- template <class S> IMATH_HOSTDEVICE void multDirMatrix (const Vec2<S>& src, Vec2<S>& dst) const IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Maniplation
- /// Set to the identity
- IMATH_HOSTDEVICE void makeIdentity() IMATH_NOEXCEPT;
- /// Transpose
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& transpose() IMATH_NOEXCEPT;
- /// Return the transpose
- IMATH_HOSTDEVICE constexpr Matrix22 transposed() const IMATH_NOEXCEPT;
- /// Invert in place
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- /// @return const reference to this
- IMATH_CONSTEXPR14 const Matrix22& invert (bool singExc);
- /// Invert in place
- /// @return const reference to this
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& invert() IMATH_NOEXCEPT;
- /// Return the inverse, leaving this unmodified.
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- IMATH_CONSTEXPR14 Matrix22<T> inverse (bool singExc) const;
- /// Return the inverse, leaving this unmodified.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix22<T> inverse() const IMATH_NOEXCEPT;
- /// Determinant
- IMATH_HOSTDEVICE constexpr T determinant() const IMATH_NOEXCEPT;
- /// Trace
- IMATH_HOSTDEVICE constexpr T trace() const IMATH_NOEXCEPT;
- /// Set matrix to rotation by r (in radians)
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE const Matrix22& setRotation (S r) IMATH_NOEXCEPT;
- /// Rotate the given matrix by r (in radians)
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& rotate (S r) IMATH_NOEXCEPT;
- /// Set matrix to scale by given uniform factor
- /// @return const referenced to this
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& setScale (T s) IMATH_NOEXCEPT;
- /// Set matrix to scale by given vector
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& setScale (const Vec2<S>& s) IMATH_NOEXCEPT;
- // Scale the matrix by s
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix22& scale (const Vec2<S>& s) IMATH_NOEXCEPT;
- /// @}
-
- /// @{
- /// @name Numeric Limits
-
- /// Largest possible negative value
- IMATH_HOSTDEVICE constexpr static T baseTypeLowest() IMATH_NOEXCEPT { return std::numeric_limits<T>::lowest(); }
- /// Largest possible positive value
- IMATH_HOSTDEVICE constexpr static T baseTypeMax() IMATH_NOEXCEPT { return std::numeric_limits<T>::max(); }
- /// Smallest possible positive value
- IMATH_HOSTDEVICE constexpr static T baseTypeSmallest() IMATH_NOEXCEPT { return std::numeric_limits<T>::min(); }
- /// Smallest possible e for which 1+e != 1
- IMATH_HOSTDEVICE constexpr static T baseTypeEpsilon() IMATH_NOEXCEPT { return std::numeric_limits<T>::epsilon(); }
- /// @}
-
- /// Return the number of the row and column dimensions, i.e. 2.
- IMATH_HOSTDEVICE constexpr static unsigned int dimensions() IMATH_NOEXCEPT { return 2; }
- /// The base type: In templates that accept a parameter `V`, you
- /// can refer to `T` as `V::BaseType`
- typedef T BaseType;
- /// The base vector type
- typedef Vec2<T> BaseVecType;
- };
- ///
- /// 3x3 transformation matrix
- ///
- template <class T> class IMATH_EXPORT_TEMPLATE_TYPE Matrix33
- {
- public:
- /// @{
- /// @name Direct access to elements
-
- /// Matrix elements
- T x[3][3];
- /// @}
-
- /// Row access
- IMATH_HOSTDEVICE T* operator[] (int i) IMATH_NOEXCEPT;
- /// Row access
- IMATH_HOSTDEVICE const T* operator[] (int i) const IMATH_NOEXCEPT;
- /// @{
- /// @name Constructors and Assignment
- /// Uninitialized
- IMATH_HOSTDEVICE Matrix33 (Uninitialized) IMATH_NOEXCEPT {}
- /// Default constructor: initialize to identity
- /// 1 0 0
- /// 0 1 0
- /// 0 0 1
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33() IMATH_NOEXCEPT;
- /// Initialize to scalar constant
- /// a a a
- /// a a a
- /// a a a
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33 (T a) IMATH_NOEXCEPT;
- /// Construct from 3x3 array
- /// a[0][0] a[0][1] a[0][2]
- /// a[1][0] a[1][1] a[1][2]
- /// a[2][0] a[2][1] a[2][2]
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33 (const T a[3][3]) IMATH_NOEXCEPT;
- /// Construct from given scalar values
- /// a b c
- /// d e f
- /// g h i
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33 (T a, T b, T c, T d, T e, T f, T g, T h, T i) IMATH_NOEXCEPT;
- /// Copy constructor
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33 (const Matrix33& v) IMATH_NOEXCEPT;
- /// Construct from Matrix33 of another base type
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 explicit Matrix33 (const Matrix33<S>& v) IMATH_NOEXCEPT;
- /// Assignment operator
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator= (const Matrix33& v) IMATH_NOEXCEPT;
- /// Assignment from scalar
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator= (T a) IMATH_NOEXCEPT;
- /// Destructor
- ~Matrix33() IMATH_NOEXCEPT = default;
- /// @}
- #if IMATH_FOREIGN_VECTOR_INTEROP
- /// @{
- /// @name Interoperability with other matrix types
- ///
- /// Construction and assignment are allowed from other classes that
- /// appear to be equivalent matrix types, provided that they support
- /// double-subscript (i.e., `m[j][i]`) giving the same type as the
- /// elements of this matrix, and their total size appears to be the
- /// right number of matrix elements.
- ///
- /// This functionality is disabled for gcc 4.x, which seems to have a
- /// compiler bug that results in spurious errors. It can also be
- /// disabled by defining IMATH_FOREIGN_VECTOR_INTEROP to be 0 prior to
- /// including any Imath header files.
- ///
- template<typename M, IMATH_ENABLE_IF(has_double_subscript<M,T,3,3>::value)>
- IMATH_HOSTDEVICE explicit Matrix33 (const M& m)
- : Matrix33(T(m[0][0]), T(m[0][1]), T(m[0][2]),
- T(m[1][0]), T(m[1][1]), T(m[1][2]),
- T(m[2][0]), T(m[2][1]), T(m[2][2]))
- { }
- /// Interoperability assignment from another type that behaves as if it
- /// were an equivalent matrix.
- template<typename M, IMATH_ENABLE_IF(has_double_subscript<M,T,3,3>::value)>
- IMATH_HOSTDEVICE const Matrix33& operator= (const M& m)
- {
- *this = Matrix33(T(m[0][0]), T(m[0][1]), T(m[0][2]),
- T(m[1][0]), T(m[1][1]), T(m[1][2]),
- T(m[2][0]), T(m[2][1]), T(m[2][2]));
- return *this;
- }
- /// @}
- #endif
- /// @{
- /// @name Compatibility with Sb
- /// Return a raw pointer to the array of values
- IMATH_HOSTDEVICE T* getValue() IMATH_NOEXCEPT;
- /// Return a raw pointer to the array of values
- IMATH_HOSTDEVICE const T* getValue() const IMATH_NOEXCEPT;
- /// Return the value in `v`
- template <class S> IMATH_HOSTDEVICE void getValue (Matrix33<S>& v) const IMATH_NOEXCEPT;
- /// Set the value
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33& setValue (const Matrix33<S>& v) IMATH_NOEXCEPT;
- /// Set the value
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33& setTheMatrix (const Matrix33<S>& v) IMATH_NOEXCEPT;
- /// @}
-
- /// @{
- /// @name Arithmetic and Comparison
-
- /// Equality
- IMATH_HOSTDEVICE constexpr bool operator== (const Matrix33& v) const IMATH_NOEXCEPT;
- /// Inequality
- IMATH_HOSTDEVICE constexpr bool operator!= (const Matrix33& v) const IMATH_NOEXCEPT;
- /// Compare two matrices and test if they are "approximately equal":
- /// @return True if the coefficients of this and `m` are the same
- /// with an absolute error of no more than e, i.e., for all i, j:
- ///
- /// abs (this[i][j] - m[i][j]) <= e
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool equalWithAbsError (const Matrix33<T>& v, T e) const IMATH_NOEXCEPT;
- /// Compare two matrices and test if they are "approximately equal":
- /// @return True if the coefficients of this and m are the same with
- /// a relative error of no more than e, i.e., for all i, j:
- ///
- /// abs (this[i] - v[i][j]) <= e * abs (this[i][j])
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool equalWithRelError (const Matrix33<T>& v, T e) const IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator+= (const Matrix33& v) IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator+= (T a) IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE constexpr Matrix33 operator+ (const Matrix33& v) const IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator-= (const Matrix33& v) IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator-= (T a) IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE constexpr Matrix33 operator- (const Matrix33& v) const IMATH_NOEXCEPT;
- /// Component-wise multiplication by -1
- IMATH_HOSTDEVICE constexpr Matrix33 operator-() const IMATH_NOEXCEPT;
- /// Component-wise multiplication by -1
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& negate() IMATH_NOEXCEPT;
- /// Component-wise multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator*= (T a) IMATH_NOEXCEPT;
- /// Component-wise multiplication
- IMATH_HOSTDEVICE constexpr Matrix33 operator* (T a) const IMATH_NOEXCEPT;
- /// Component-wise division
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator/= (T a) IMATH_NOEXCEPT;
- /// Component-wise division
- IMATH_HOSTDEVICE constexpr Matrix33 operator/ (T a) const IMATH_NOEXCEPT;
- /// Matrix-matrix multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& operator*= (const Matrix33& v) IMATH_NOEXCEPT;
- /// Matrix-matrix multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33 operator* (const Matrix33& v) const IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: a homogeneous transformation
- /// by computing Vec3 (src.x, src.y, 1) * m and dividing by the
- /// result's third element.
- /// @param[in] src The input vector
- /// @param[out] dst The output vector
- template <class S> IMATH_HOSTDEVICE void multVecMatrix (const Vec2<S>& src, Vec2<S>& dst) const IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: multiply `src` by the upper left 2x2
- /// submatrix, ignoring the rest of matrix.
- /// @param[in] src The input vector
- /// @param[out] dst The output vector
- template <class S> IMATH_HOSTDEVICE void multDirMatrix (const Vec2<S>& src, Vec2<S>& dst) const IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Maniplation
- /// Set to the identity matrix
- IMATH_HOSTDEVICE void makeIdentity() IMATH_NOEXCEPT;
- /// Transpose
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& transpose() IMATH_NOEXCEPT;
- /// Return the transpose
- IMATH_HOSTDEVICE constexpr Matrix33 transposed() const IMATH_NOEXCEPT;
- /// Invert in place using the determinant.
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- /// @return const reference to this
- IMATH_CONSTEXPR14 const Matrix33& invert (bool singExc);
- /// Invert in place using the determinant.
- /// @return const reference to this
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& invert() IMATH_NOEXCEPT;
- /// Return the inverse using the determinant, leaving this unmodified.
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- IMATH_CONSTEXPR14 Matrix33<T> inverse (bool singExc) const;
- /// Return the inverse using the determinant, leaving this unmodified.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix33<T> inverse() const IMATH_NOEXCEPT;
- /// Invert in place using the Gauss-Jordan method. Significantly slower
- /// but more accurate than invert().
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- /// @return const reference to this
- const Matrix33& gjInvert (bool singExc);
-
- /// Invert in place using the Gauss-Jordan method. Significantly slower
- /// but more accurate than invert().
- /// @return const reference to this
- IMATH_HOSTDEVICE const Matrix33& gjInvert() IMATH_NOEXCEPT;
- /// Return the inverse using the Gauss-Jordan method, leaving this
- /// unmodified. Significantly slower but more accurate than inverse().
- Matrix33<T> gjInverse (bool singExc) const;
- /// Return the inverse using the Gauss-Jordan method. Significantly slower,
- /// leaving this unmodified. Slower but more accurate than inverse().
- IMATH_HOSTDEVICE Matrix33<T> gjInverse() const IMATH_NOEXCEPT;
- /// Calculate the matrix minor of the (r,c) element
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T minorOf (const int r, const int c) const IMATH_NOEXCEPT;
- /// Build a minor using the specified rows and columns
- IMATH_HOSTDEVICE
- constexpr T fastMinor (const int r0, const int r1, const int c0, const int c1) const IMATH_NOEXCEPT;
- /// Determinant
- IMATH_HOSTDEVICE constexpr T determinant() const IMATH_NOEXCEPT;
- /// Trace
- IMATH_HOSTDEVICE constexpr T trace() const IMATH_NOEXCEPT;
- /// Set matrix to rotation by r (in radians)
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE const Matrix33& setRotation (S r) IMATH_NOEXCEPT;
- // Rotate the given matrix by r (in radians)
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& rotate (S r) IMATH_NOEXCEPT;
- /// Set matrix to scale by given uniform factor
- /// @return const referenced to this
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& setScale (T s) IMATH_NOEXCEPT;
- /// Set matrix to scale by given vector
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& setScale (const Vec2<S>& s) IMATH_NOEXCEPT;
- /// Scale the matrix by s
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& scale (const Vec2<S>& s) IMATH_NOEXCEPT;
- /// Set matrix to translation by given vector
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& setTranslation (const Vec2<S>& t) IMATH_NOEXCEPT;
- /// Return the translation component
- IMATH_HOSTDEVICE constexpr Vec2<T> translation() const IMATH_NOEXCEPT;
- /// Translate the matrix by t
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& translate (const Vec2<S>& t) IMATH_NOEXCEPT;
- /// Set matrix to shear x for each y coord. by given factor xy
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& setShear (const S& h) IMATH_NOEXCEPT;
- /// Set matrix to shear x for each y coord. by given factor h.x
- /// and to shear y for each x coord. by given factor h.y
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& setShear (const Vec2<S>& h) IMATH_NOEXCEPT;
- /// Shear the matrix in x for each y coord. by given factor xy
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& shear (const S& xy) IMATH_NOEXCEPT;
- /// Shear the matrix in x for each y coord. by given factor xy
- /// and shear y for each x coord. by given factor yx
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix33& shear (const Vec2<S>& h) IMATH_NOEXCEPT;
- /// @}
-
- /// @{
- /// @name Numeric Limits
-
- /// Largest possible negative value
- IMATH_HOSTDEVICE constexpr static T baseTypeLowest() IMATH_NOEXCEPT { return std::numeric_limits<T>::lowest(); }
- /// Largest possible positive value
- IMATH_HOSTDEVICE constexpr static T baseTypeMax() IMATH_NOEXCEPT { return std::numeric_limits<T>::max(); }
- /// Smallest possible positive value
- IMATH_HOSTDEVICE constexpr static T baseTypeSmallest() IMATH_NOEXCEPT { return std::numeric_limits<T>::min(); }
- /// Smallest possible e for which 1+e != 1
- IMATH_HOSTDEVICE constexpr static T baseTypeEpsilon() IMATH_NOEXCEPT { return std::numeric_limits<T>::epsilon(); }
- /// @}
-
- /// Return the number of the row and column dimensions, i.e. 3.
- IMATH_HOSTDEVICE constexpr static unsigned int dimensions() IMATH_NOEXCEPT { return 3; }
- /// The base type: In templates that accept a parameter `V` (could be a Color4), you can refer to `T` as `V::BaseType`
- typedef T BaseType;
- /// The base vector type
- typedef Vec3<T> BaseVecType;
- };
- ///
- /// 4x4 transformation matrix
- ///
- template <class T> class IMATH_EXPORT_TEMPLATE_TYPE Matrix44
- {
- public:
- /// @{
- /// @name Direct access to elements
-
- /// Matrix elements
- T x[4][4];
- /// @}
-
- /// Row access
- IMATH_HOSTDEVICE T* operator[] (int i) IMATH_NOEXCEPT;
- /// Row access
- IMATH_HOSTDEVICE const T* operator[] (int i) const IMATH_NOEXCEPT;
- /// @{
- /// @name Constructors and Assignment
- /// Uninitialized
- IMATH_HOSTDEVICE constexpr Matrix44 (Uninitialized) IMATH_NOEXCEPT {}
- /// Default constructor: initialize to identity
- /// 1 0 0 0
- /// 0 1 0 0
- /// 0 0 1 0
- /// 0 0 0 1
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44() IMATH_NOEXCEPT;
- /// Initialize to scalar constant
- /// a a a a
- /// a a a a
- /// a a a a
- /// a a a a
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44 (T a) IMATH_NOEXCEPT;
- /// Construct from 4x4 array
- /// a[0][0] a[0][1] a[0][2] a[0][3]
- /// a[1][0] a[1][1] a[1][2] a[1][3]
- /// a[2][0] a[2][1] a[2][2] a[2][3]
- /// a[3][0] a[3][1] a[3][2] a[3][3]
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44 (const T a[4][4]) IMATH_NOEXCEPT;
- /// Construct from given scalar values
- /// a b c d
- /// e f g h
- /// i j k l
- /// m n o p
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14
- Matrix44 (T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p) IMATH_NOEXCEPT;
- /// Construct from a 3x3 rotation matrix and a translation vector
- /// r r r 0
- /// r r r 0
- /// r r r 0
- /// t t t 1
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44 (Matrix33<T> r, Vec3<T> t) IMATH_NOEXCEPT;
- /// Copy constructor
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44 (const Matrix44& v) IMATH_NOEXCEPT;
- /// Construct from Matrix44 of another base type
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 explicit Matrix44 (const Matrix44<S>& v) IMATH_NOEXCEPT;
- /// Assignment operator
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator= (const Matrix44& v) IMATH_NOEXCEPT;
- /// Assignment from scalar
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator= (T a) IMATH_NOEXCEPT;
- /// Destructor
- ~Matrix44() IMATH_NOEXCEPT = default;
- /// @}
- #if IMATH_FOREIGN_VECTOR_INTEROP
- /// @{
- /// @name Interoperability with other matrix types
- ///
- /// Construction and assignment are allowed from other classes that
- /// appear to be equivalent matrix types, provided that they support
- /// double-subscript (i.e., `m[j][i]`) giving the same type as the
- /// elements of this matrix, and their total size appears to be the
- /// right number of matrix elements.
- ///
- /// This functionality is disabled for gcc 4.x, which seems to have a
- /// compiler bug that results in spurious errors. It can also be
- /// disabled by defining IMATH_FOREIGN_VECTOR_INTEROP to be 0 prior to
- /// including any Imath header files.
- ///
- template<typename M, IMATH_ENABLE_IF(has_double_subscript<M,T,4,4>::value)>
- IMATH_HOSTDEVICE explicit Matrix44 (const M& m)
- : Matrix44(T(m[0][0]), T(m[0][1]), T(m[0][2]), T(m[0][3]),
- T(m[1][0]), T(m[1][1]), T(m[1][2]), T(m[1][3]),
- T(m[2][0]), T(m[2][1]), T(m[2][2]), T(m[2][3]),
- T(m[3][0]), T(m[3][1]), T(m[3][2]), T(m[3][3]))
- { }
- /// Interoperability assignment from another type that behaves as if it
- /// were an equivalent matrix.
- template<typename M, IMATH_ENABLE_IF(has_double_subscript<M,T,4,4>::value)>
- IMATH_HOSTDEVICE const Matrix44& operator= (const M& m)
- {
- *this = Matrix44(T(m[0][0]), T(m[0][1]), T(m[0][2]), T(m[0][3]),
- T(m[1][0]), T(m[1][1]), T(m[1][2]), T(m[1][3]),
- T(m[2][0]), T(m[2][1]), T(m[2][2]), T(m[2][3]),
- T(m[3][0]), T(m[3][1]), T(m[3][2]), T(m[3][3]));
- return *this;
- }
- /// @}
- #endif
- /// @{
- /// @name Compatibility with Sb
- /// Return a raw pointer to the array of values
- IMATH_HOSTDEVICE T* getValue() IMATH_NOEXCEPT;
- /// Return a raw pointer to the array of values
- IMATH_HOSTDEVICE const T* getValue() const IMATH_NOEXCEPT;
- /// Return the value in `v`
- template <class S> IMATH_HOSTDEVICE void getValue (Matrix44<S>& v) const IMATH_NOEXCEPT;
- /// Set the value
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44& setValue (const Matrix44<S>& v) IMATH_NOEXCEPT;
- /// Set the value
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44& setTheMatrix (const Matrix44<S>& v) IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Arithmetic and Comparison
-
- /// Equality
- IMATH_HOSTDEVICE constexpr bool operator== (const Matrix44& v) const IMATH_NOEXCEPT;
- /// Inequality
- IMATH_HOSTDEVICE constexpr bool operator!= (const Matrix44& v) const IMATH_NOEXCEPT;
- /// Compare two matrices and test if they are "approximately equal":
- /// @return True if the coefficients of this and `m` are the same
- /// with an absolute error of no more than e, i.e., for all i, j:
- ///
- /// abs (this[i][j] - m[i][j]) <= e
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool equalWithAbsError (const Matrix44<T>& v, T e) const IMATH_NOEXCEPT;
- /// Compare two matrices and test if they are "approximately equal":
- /// @return True if the coefficients of this and m are the same with
- /// a relative error of no more than e, i.e., for all i, j:
- ///
- /// abs (this[i] - v[i][j]) <= e * abs (this[i][j])
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool equalWithRelError (const Matrix44<T>& v, T e) const IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator+= (const Matrix44& v) IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator+= (T a) IMATH_NOEXCEPT;
- /// Component-wise addition
- IMATH_HOSTDEVICE constexpr Matrix44 operator+ (const Matrix44& v) const IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator-= (const Matrix44& v) IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator-= (T a) IMATH_NOEXCEPT;
- /// Component-wise subtraction
- IMATH_HOSTDEVICE constexpr Matrix44 operator- (const Matrix44& v) const IMATH_NOEXCEPT;
- /// Component-wise multiplication by -1
- IMATH_HOSTDEVICE constexpr Matrix44 operator-() const IMATH_NOEXCEPT;
- /// Component-wise multiplication by -1
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& negate() IMATH_NOEXCEPT;
- /// Component-wise multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator*= (T a) IMATH_NOEXCEPT;
- /// Component-wise multiplication
- IMATH_HOSTDEVICE constexpr Matrix44 operator* (T a) const IMATH_NOEXCEPT;
- /// Component-wise division
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator/= (T a) IMATH_NOEXCEPT;
- /// Component-wise division
- IMATH_HOSTDEVICE constexpr Matrix44 operator/ (T a) const IMATH_NOEXCEPT;
- /// Matrix-matrix multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& operator*= (const Matrix44& v) IMATH_NOEXCEPT;
- /// Matrix-matrix multiplication
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44 operator* (const Matrix44& v) const IMATH_NOEXCEPT;
- /// Matrix-matrix multiplication: compute c = a * b
- IMATH_HOSTDEVICE
- static void multiply (const Matrix44& a, // assumes that
- const Matrix44& b, // &a != &c and
- Matrix44& c) IMATH_NOEXCEPT; // &b != &c.
- /// Matrix-matrix multiplication returning a result.
- IMATH_HOSTDEVICE
- static IMATH_CONSTEXPR14 Matrix44 multiply (const Matrix44& a, const Matrix44& b) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: a homogeneous transformation
- /// by computing Vec3 (src.x, src.y, src.z, 1) * m and dividing by the
- /// result's third element.
- /// @param[in] src The input vector
- /// @param[out] dst The output vector
- template <class S> IMATH_HOSTDEVICE void multVecMatrix (const Vec3<S>& src, Vec3<S>& dst) const IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: multiply `src` by the upper left 2x2
- /// submatrix, ignoring the rest of matrix.
- /// @param[in] src The input vector
- /// @param[out] dst The output vector
- template <class S> IMATH_HOSTDEVICE void multDirMatrix (const Vec3<S>& src, Vec3<S>& dst) const IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Maniplation
- /// Set to the identity matrix
- IMATH_HOSTDEVICE void makeIdentity() IMATH_NOEXCEPT;
- /// Transpose
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& transpose() IMATH_NOEXCEPT;
- /// Return the transpose
- IMATH_HOSTDEVICE constexpr Matrix44 transposed() const IMATH_NOEXCEPT;
- /// Invert in place using the determinant.
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- /// @return const reference to this
- IMATH_CONSTEXPR14 const Matrix44& invert (bool singExc);
- /// Invert in place using the determinant.
- /// @return const reference to this
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& invert() IMATH_NOEXCEPT;
- /// Return the inverse using the determinant, leaving this unmodified.
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- IMATH_CONSTEXPR14 Matrix44<T> inverse (bool singExc) const;
- /// Return the inverse using the determinant, leaving this unmodified.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Matrix44<T> inverse() const IMATH_NOEXCEPT;
- /// Invert in place using the Gauss-Jordan method. Significantly slower
- /// but more accurate than invert().
- /// @param singExc If true, throw an exception if the matrix cannot be inverted.
- /// @return const reference to this
- IMATH_CONSTEXPR14 const Matrix44& gjInvert (bool singExc);
- /// Invert in place using the Gauss-Jordan method. Significantly slower
- /// but more accurate than invert().
- /// @return const reference to this
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& gjInvert() IMATH_NOEXCEPT;
- /// Return the inverse using the Gauss-Jordan method, leaving this
- /// unmodified. Significantly slower but more accurate than inverse().
- Matrix44<T> gjInverse (bool singExc) const;
- /// Return the inverse using the Gauss-Jordan method, leaving this
- /// unmodified Significantly slower but more accurate than inverse().
- IMATH_HOSTDEVICE Matrix44<T> gjInverse() const IMATH_NOEXCEPT;
- /// Calculate the matrix minor of the (r,c) element
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T minorOf (const int r, const int c) const IMATH_NOEXCEPT;
- /// Build a minor using the specified rows and columns
- IMATH_HOSTDEVICE
- constexpr T fastMinor (const int r0,
- const int r1,
- const int r2,
- const int c0,
- const int c1,
- const int c2) const IMATH_NOEXCEPT;
- /// Determinant
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T determinant() const IMATH_NOEXCEPT;
- /// Trace
- IMATH_HOSTDEVICE constexpr T trace() const IMATH_NOEXCEPT;
- /// Set matrix to rotation by XYZ euler angles (in radians)
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE const Matrix44& setEulerAngles (const Vec3<S>& r) IMATH_NOEXCEPT;
- /// Set matrix to rotation around given axis by given angle (in radians)
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& setAxisAngle (const Vec3<S>& ax, S ang) IMATH_NOEXCEPT;
- /// Rotate the matrix by XYZ euler angles in r (in radians)
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE const Matrix44& rotate (const Vec3<S>& r) IMATH_NOEXCEPT;
- /// Set matrix to scale by given uniform factor
- /// @return const referenced to this
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& setScale (T s) IMATH_NOEXCEPT;
- /// Set matrix to scale by given vector
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& setScale (const Vec3<S>& s) IMATH_NOEXCEPT;
- /// Scale the matrix by s
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& scale (const Vec3<S>& s) IMATH_NOEXCEPT;
- /// Set matrix to translation by given vector
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& setTranslation (const Vec3<S>& t) IMATH_NOEXCEPT;
- /// Return translation component
- IMATH_HOSTDEVICE constexpr const Vec3<T> translation() const IMATH_NOEXCEPT;
- /// Translate the matrix by t
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& translate (const Vec3<S>& t) IMATH_NOEXCEPT;
- /// Set matrix to shear by given vector h. The resulting matrix
- /// - will shear x for each y coord. by a factor of h[0] ;
- /// - will shear x for each z coord. by a factor of h[1] ;
- /// - will shear y for each z coord. by a factor of h[2] .
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& setShear (const Vec3<S>& h) IMATH_NOEXCEPT;
- /// Set matrix to shear by given factors. The resulting matrix
- /// - will shear x for each y coord. by a factor of h.xy ;
- /// - will shear x for each z coord. by a factor of h.xz ;
- /// - will shear y for each z coord. by a factor of h.yz ;
- /// - will shear y for each x coord. by a factor of h.yx ;
- /// - will shear z for each x coord. by a factor of h.zx ;
- /// - will shear z for each y coord. by a factor of h.zy .
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& setShear (const Shear6<S>& h) IMATH_NOEXCEPT;
- /// Shear the matrix by given vector. The composed matrix
- /// will be `shear` * `this`, where the shear matrix ...
- /// - will shear x for each y coord. by a factor of h[0] ;
- /// - will shear x for each z coord. by a factor of h[1] ;
- /// - will shear y for each z coord. by a factor of h[2] .
- /// @return const referenced to this
- template <class S> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& shear (const Vec3<S>& h) IMATH_NOEXCEPT;
- /// Shear the matrix by the given factors. The composed matrix
- /// will be `shear` * `this`, where the shear matrix ...
- /// - will shear x for each y coord. by a factor of h.xy ;
- /// - will shear x for each z coord. by a factor of h.xz ;
- /// - will shear y for each z coord. by a factor of h.yz ;
- /// - will shear y for each x coord. by a factor of h.yx ;
- /// - will shear z for each x coord. by a factor of h.zx ;
- /// - will shear z for each y coord. by a factor of h.zy .
- /// @return const referenced to this
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Matrix44& shear (const Shear6<S>& h) IMATH_NOEXCEPT;
- /// @}
-
- /// @{
- /// @name Numeric Limits
-
- /// Largest possible negative value
- IMATH_HOSTDEVICE constexpr static T baseTypeLowest() IMATH_NOEXCEPT { return std::numeric_limits<T>::lowest(); }
- /// Largest possible positive value
- IMATH_HOSTDEVICE constexpr static T baseTypeMax() IMATH_NOEXCEPT { return std::numeric_limits<T>::max(); }
- /// Smallest possible positive value
- IMATH_HOSTDEVICE constexpr static T baseTypeSmallest() IMATH_NOEXCEPT { return std::numeric_limits<T>::min(); }
- /// Smallest possible e for which 1+e != 1
- IMATH_HOSTDEVICE constexpr static T baseTypeEpsilon() IMATH_NOEXCEPT { return std::numeric_limits<T>::epsilon(); }
- /// @}
-
- /// Return the number of the row and column dimensions, i.e. 4
- IMATH_HOSTDEVICE constexpr static unsigned int dimensions() IMATH_NOEXCEPT { return 4; }
- /// The base type: In templates that accept a parameter `V` (could be a Color4), you can refer to `T` as `V::BaseType`
- typedef T BaseType;
- /// The base vector type
- typedef Vec4<T> BaseVecType;
- };
- /// Stream output, as:
- /// (m00 m01
- /// m10 m11)
- template <class T> std::ostream& operator<< (std::ostream& s, const Matrix22<T>& m);
- /// Stream output, as:
- /// (m00 m01 m02
- /// m10 m11 m12
- /// m20 m21 m22)
- template <class T> std::ostream& operator<< (std::ostream& s, const Matrix33<T>& m);
- /// Stream output, as:
- ///
- /// (m00 m01 m02 m03
- /// m10 m11 m12 m13
- /// m20 m21 m22 m23
- /// m30 m31 m32 m33)
- template <class T> std::ostream& operator<< (std::ostream& s, const Matrix44<T>& m);
- //---------------------------------------------
- // Vector-times-matrix multiplication operators
- //---------------------------------------------
- /// Vector-matrix multiplication: v *= m
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec2<S>& operator*= (Vec2<S>& v, const Matrix22<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: r = v * m
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec2<S> operator* (const Vec2<S>& v, const Matrix22<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: v *= m
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec2<S>& operator*= (Vec2<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: r = v * m
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec2<S> operator* (const Vec2<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: v *= m
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec3<S>& operator*= (Vec3<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: r = v * m
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec3<S> operator* (const Vec3<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: v *= m
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec3<S>& operator*= (Vec3<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: r = v * m
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec3<S> operator* (const Vec3<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: v *= m
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec4<S>& operator*= (Vec4<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT;
- /// Vector-matrix multiplication: r = v * m
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec4<S> operator* (const Vec4<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT;
- //-------------------------
- // Typedefs for convenience
- //-------------------------
- /// 2x2 matrix of float
- typedef Matrix22<float> M22f;
- /// 2x2 matrix of double
- typedef Matrix22<double> M22d;
- /// 3x3 matrix of float
- typedef Matrix33<float> M33f;
- /// 3x3 matrix of double
- typedef Matrix33<double> M33d;
- /// 4x4 matrix of float
- typedef Matrix44<float> M44f;
- /// 4x4 matrix of double
- typedef Matrix44<double> M44d;
- //---------------------------
- // Implementation of Matrix22
- //---------------------------
- template <class T>
- IMATH_HOSTDEVICE inline T*
- Matrix22<T>::operator[] (int i) IMATH_NOEXCEPT
- {
- return x[i];
- }
- template <class T>
- IMATH_HOSTDEVICE inline const T*
- Matrix22<T>::operator[] (int i) const IMATH_NOEXCEPT
- {
- return x[i];
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>::Matrix22() IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>::Matrix22 (T a) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = a;
- x[1][0] = a;
- x[1][1] = a;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>::Matrix22 (
- const T a[2][2]) IMATH_NOEXCEPT
- {
- // Function calls and aliasing issues can inhibit vectorization versus
- // straight assignment of data members, so instead of this:
- // memcpy (x, a, sizeof (x));
- // we do this:
- x[0][0] = a[0][0];
- x[0][1] = a[0][1];
- x[1][0] = a[1][0];
- x[1][1] = a[1][1];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>::Matrix22 (
- T a, T b, T c, T d) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = b;
- x[1][0] = c;
- x[1][1] = d;
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>::Matrix22 (const Matrix22& v) IMATH_NOEXCEPT
- {
- // Function calls and aliasing issues can inhibit vectorization versus
- // straight assignment of data members, so we don't do this:
- // memcpy (x, v.x, sizeof (x));
- // we do this:
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>::Matrix22 (const Matrix22<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = T (v.x[0][0]);
- x[0][1] = T (v.x[0][1]);
- x[1][0] = T (v.x[1][0]);
- x[1][1] = T (v.x[1][1]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator= (const Matrix22& v) IMATH_NOEXCEPT
- {
- // Function calls and aliasing issues can inhibit vectorization versus
- // straight assignment of data members, so we don't do this:
- // memcpy (x, v.x, sizeof (x));
- // we do this:
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator= (T a) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = a;
- x[1][0] = a;
- x[1][1] = a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE inline T*
- Matrix22<T>::getValue () IMATH_NOEXCEPT
- {
- return (T*) &x[0][0];
- }
- template <class T>
- IMATH_HOSTDEVICE inline const T*
- Matrix22<T>::getValue() const IMATH_NOEXCEPT
- {
- return (const T*) &x[0][0];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix22<T>::getValue (Matrix22<S>& v) const IMATH_NOEXCEPT
- {
- v.x[0][0] = x[0][0];
- v.x[0][1] = x[0][1];
- v.x[1][0] = x[1][0];
- v.x[1][1] = x[1][1];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>&
- Matrix22<T>::setValue (const Matrix22<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>&
- Matrix22<T>::setTheMatrix (const Matrix22<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Matrix22<T>::makeIdentity() IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Matrix22<T>::operator== (const Matrix22& v) const IMATH_NOEXCEPT
- {
- return x[0][0] == v.x[0][0] && x[0][1] == v.x[0][1] && x[1][0] == v.x[1][0] &&
- x[1][1] == v.x[1][1];
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Matrix22<T>::operator!= (const Matrix22& v) const IMATH_NOEXCEPT
- {
- return x[0][0] != v.x[0][0] || x[0][1] != v.x[0][1] || x[1][0] != v.x[1][0] ||
- x[1][1] != v.x[1][1];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Matrix22<T>::equalWithAbsError (const Matrix22<T>& m, T e) const IMATH_NOEXCEPT
- {
- for (int i = 0; i < 2; i++)
- for (int j = 0; j < 2; j++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this).x[i][j], m.x[i][j], e))
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Matrix22<T>::equalWithRelError (const Matrix22<T>& m, T e) const IMATH_NOEXCEPT
- {
- for (int i = 0; i < 2; i++)
- for (int j = 0; j < 2; j++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this).x[i][j], m.x[i][j], e))
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator+= (const Matrix22<T>& v) IMATH_NOEXCEPT
- {
- x[0][0] += v.x[0][0];
- x[0][1] += v.x[0][1];
- x[1][0] += v.x[1][0];
- x[1][1] += v.x[1][1];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator+= (T a) IMATH_NOEXCEPT
- {
- x[0][0] += a;
- x[0][1] += a;
- x[1][0] += a;
- x[1][1] += a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix22<T>
- Matrix22<T>::operator+ (const Matrix22<T>& v) const IMATH_NOEXCEPT
- {
- return Matrix22 (x[0][0] + v.x[0][0],
- x[0][1] + v.x[0][1],
- x[1][0] + v.x[1][0],
- x[1][1] + v.x[1][1]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator-= (const Matrix22<T>& v) IMATH_NOEXCEPT
- {
- x[0][0] -= v.x[0][0];
- x[0][1] -= v.x[0][1];
- x[1][0] -= v.x[1][0];
- x[1][1] -= v.x[1][1];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator-= (T a) IMATH_NOEXCEPT
- {
- x[0][0] -= a;
- x[0][1] -= a;
- x[1][0] -= a;
- x[1][1] -= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix22<T>
- Matrix22<T>::operator- (const Matrix22<T>& v) const IMATH_NOEXCEPT
- {
- return Matrix22 (x[0][0] - v.x[0][0],
- x[0][1] - v.x[0][1],
- x[1][0] - v.x[1][0],
- x[1][1] - v.x[1][1]);
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix22<T>
- Matrix22<T>::operator-() const IMATH_NOEXCEPT
- {
- return Matrix22 (-x[0][0], -x[0][1], -x[1][0], -x[1][1]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::negate() IMATH_NOEXCEPT
- {
- x[0][0] = -x[0][0];
- x[0][1] = -x[0][1];
- x[1][0] = -x[1][0];
- x[1][1] = -x[1][1];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator*= (T a) IMATH_NOEXCEPT
- {
- x[0][0] *= a;
- x[0][1] *= a;
- x[1][0] *= a;
- x[1][1] *= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix22<T>
- Matrix22<T>::operator* (T a) const IMATH_NOEXCEPT
- {
- return Matrix22 (x[0][0] * a, x[0][1] * a, x[1][0] * a, x[1][1] * a);
- }
- /// Matrix-scalar multiplication
- template <class T>
- IMATH_HOSTDEVICE inline Matrix22<T>
- operator* (T a, const Matrix22<T>& v) IMATH_NOEXCEPT
- {
- return v * a;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator*= (const Matrix22<T>& v) IMATH_NOEXCEPT
- {
- Matrix22 tmp (T (0));
- for (int i = 0; i < 2; i++)
- for (int j = 0; j < 2; j++)
- for (int k = 0; k < 2; k++)
- tmp.x[i][j] += x[i][k] * v.x[k][j];
- *this = tmp;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>
- Matrix22<T>::operator* (const Matrix22<T>& v) const IMATH_NOEXCEPT
- {
- Matrix22 tmp (T (0));
- for (int i = 0; i < 2; i++)
- for (int j = 0; j < 2; j++)
- for (int k = 0; k < 2; k++)
- tmp.x[i][j] += x[i][k] * v.x[k][j];
- return tmp;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix22<T>::multDirMatrix (const Vec2<S>& src, Vec2<S>& dst) const IMATH_NOEXCEPT
- {
- S a, b;
- a = src.x * x[0][0] + src.y * x[1][0];
- b = src.x * x[0][1] + src.y * x[1][1];
- dst.x = a;
- dst.y = b;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::operator/= (T a) IMATH_NOEXCEPT
- {
- x[0][0] /= a;
- x[0][1] /= a;
- x[1][0] /= a;
- x[1][1] /= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix22<T>
- Matrix22<T>::operator/ (T a) const IMATH_NOEXCEPT
- {
- return Matrix22 (x[0][0] / a, x[0][1] / a, x[1][0] / a, x[1][1] / a);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::transpose() IMATH_NOEXCEPT
- {
- Matrix22 tmp (x[0][0], x[1][0], x[0][1], x[1][1]);
- *this = tmp;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix22<T>
- Matrix22<T>::transposed() const IMATH_NOEXCEPT
- {
- return Matrix22 (x[0][0], x[1][0], x[0][1], x[1][1]);
- }
- template <class T>
- IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::invert (bool singExc)
- {
- *this = inverse (singExc);
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::invert() IMATH_NOEXCEPT
- {
- *this = inverse();
- return *this;
- }
- template <class T>
- IMATH_CONSTEXPR14 inline Matrix22<T>
- Matrix22<T>::inverse (bool singExc) const
- {
- Matrix22 s (x[1][1], -x[0][1], -x[1][0], x[0][0]);
- T r = x[0][0] * x[1][1] - x[1][0] * x[0][1];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- s[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s[i][j]))
- {
- s[i][j] /= r;
- }
- else
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert "
- "singular matrix.");
- return Matrix22();
- }
- }
- }
- }
- return s;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix22<T>
- Matrix22<T>::inverse() const IMATH_NOEXCEPT
- {
- Matrix22 s (x[1][1], -x[0][1], -x[1][0], x[0][0]);
- T r = x[0][0] * x[1][1] - x[1][0] * x[0][1];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- s[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s[i][j]))
- {
- s[i][j] /= r;
- }
- else
- {
- return Matrix22();
- }
- }
- }
- }
- return s;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline T
- Matrix22<T>::determinant() const IMATH_NOEXCEPT
- {
- return x[0][0] * x[1][1] - x[1][0] * x[0][1];
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline T
- Matrix22<T>::trace () const IMATH_NOEXCEPT
- {
- return x[0][0] + x[1][1];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline const Matrix22<T>&
- Matrix22<T>::setRotation (S r) IMATH_NOEXCEPT
- {
- S cos_r, sin_r;
- cos_r = cos ((T) r);
- sin_r = sin ((T) r);
- x[0][0] = cos_r;
- x[0][1] = sin_r;
- x[1][0] = -sin_r;
- x[1][1] = cos_r;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::rotate (S r) IMATH_NOEXCEPT
- {
- *this *= Matrix22<T>().setRotation (r);
- return *this;
- }
- template <class T>
- IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::setScale (T s) IMATH_NOEXCEPT
- {
- //
- // Set the matrix to:
- // | s 0 |
- // | 0 s |
- //
- x[0][0] = s;
- x[0][1] = static_cast<T> (0);
- x[1][0] = static_cast<T> (0);
- x[1][1] = s;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::setScale (const Vec2<S>& s) IMATH_NOEXCEPT
- {
- //
- // Set the matrix to:
- // | s.x 0 |
- // | 0 s.y |
- //
- x[0][0] = s.x;
- x[0][1] = static_cast<T> (0);
- x[1][0] = static_cast<T> (0);
- x[1][1] = s.y;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix22<T>&
- Matrix22<T>::scale (const Vec2<S>& s) IMATH_NOEXCEPT
- {
- x[0][0] *= s.x;
- x[0][1] *= s.x;
- x[1][0] *= s.y;
- x[1][1] *= s.y;
- return *this;
- }
- //---------------------------
- // Implementation of Matrix33
- //---------------------------
- template <class T>
- IMATH_HOSTDEVICE inline T*
- Matrix33<T>::operator[] (int i) IMATH_NOEXCEPT
- {
- return x[i];
- }
- template <class T>
- IMATH_HOSTDEVICE inline const T*
- Matrix33<T>::operator[] (int i) const IMATH_NOEXCEPT
- {
- return x[i];
- }
- template <class T>
- IMATH_HOSTDEVICE inline IMATH_CONSTEXPR14
- Matrix33<T>::Matrix33() IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- x[1][2] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>::Matrix33 (T a) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = a;
- x[0][2] = a;
- x[1][0] = a;
- x[1][1] = a;
- x[1][2] = a;
- x[2][0] = a;
- x[2][1] = a;
- x[2][2] = a;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>::Matrix33 (
- const T a[3][3]) IMATH_NOEXCEPT
- {
- // Function calls and aliasing issues can inhibit vectorization versus
- // straight assignment of data members, so instead of this:
- // memcpy (x, a, sizeof (x));
- // we do this:
- x[0][0] = a[0][0];
- x[0][1] = a[0][1];
- x[0][2] = a[0][2];
- x[1][0] = a[1][0];
- x[1][1] = a[1][1];
- x[1][2] = a[1][2];
- x[2][0] = a[2][0];
- x[2][1] = a[2][1];
- x[2][2] = a[2][2];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>::Matrix33 (T a, T b, T c, T d, T e, T f, T g, T h, T i) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = b;
- x[0][2] = c;
- x[1][0] = d;
- x[1][1] = e;
- x[1][2] = f;
- x[2][0] = g;
- x[2][1] = h;
- x[2][2] = i;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>::Matrix33 (const Matrix33& v) IMATH_NOEXCEPT
- {
- // Function calls and aliasing issues can inhibit vectorization versus
- // straight assignment of data members, so instead of this:
- // memcpy (x, v.x, sizeof (x));
- // we do this:
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[0][2] = v.x[0][2];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- x[1][2] = v.x[1][2];
- x[2][0] = v.x[2][0];
- x[2][1] = v.x[2][1];
- x[2][2] = v.x[2][2];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>::Matrix33 (const Matrix33<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = T (v.x[0][0]);
- x[0][1] = T (v.x[0][1]);
- x[0][2] = T (v.x[0][2]);
- x[1][0] = T (v.x[1][0]);
- x[1][1] = T (v.x[1][1]);
- x[1][2] = T (v.x[1][2]);
- x[2][0] = T (v.x[2][0]);
- x[2][1] = T (v.x[2][1]);
- x[2][2] = T (v.x[2][2]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator= (const Matrix33& v) IMATH_NOEXCEPT
- {
- // Function calls and aliasing issues can inhibit vectorization versus
- // straight assignment of data members, so instead of this:
- // memcpy (x, v.x, sizeof (x));
- // we do this:
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[0][2] = v.x[0][2];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- x[1][2] = v.x[1][2];
- x[2][0] = v.x[2][0];
- x[2][1] = v.x[2][1];
- x[2][2] = v.x[2][2];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator= (T a) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = a;
- x[0][2] = a;
- x[1][0] = a;
- x[1][1] = a;
- x[1][2] = a;
- x[2][0] = a;
- x[2][1] = a;
- x[2][2] = a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE inline T*
- Matrix33<T>::getValue () IMATH_NOEXCEPT
- {
- return (T*) &x[0][0];
- }
- template <class T>
- IMATH_HOSTDEVICE inline const T*
- Matrix33<T>::getValue() const IMATH_NOEXCEPT
- {
- return (const T*) &x[0][0];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix33<T>::getValue (Matrix33<S>& v) const IMATH_NOEXCEPT
- {
- v.x[0][0] = x[0][0];
- v.x[0][1] = x[0][1];
- v.x[0][2] = x[0][2];
- v.x[1][0] = x[1][0];
- v.x[1][1] = x[1][1];
- v.x[1][2] = x[1][2];
- v.x[2][0] = x[2][0];
- v.x[2][1] = x[2][1];
- v.x[2][2] = x[2][2];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>&
- Matrix33<T>::setValue (const Matrix33<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[0][2] = v.x[0][2];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- x[1][2] = v.x[1][2];
- x[2][0] = v.x[2][0];
- x[2][1] = v.x[2][1];
- x[2][2] = v.x[2][2];
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>&
- Matrix33<T>::setTheMatrix (const Matrix33<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[0][2] = v.x[0][2];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- x[1][2] = v.x[1][2];
- x[2][0] = v.x[2][0];
- x[2][1] = v.x[2][1];
- x[2][2] = v.x[2][2];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Matrix33<T>::makeIdentity() IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- x[1][2] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Matrix33<T>::operator== (const Matrix33& v) const IMATH_NOEXCEPT
- {
- return x[0][0] == v.x[0][0] && x[0][1] == v.x[0][1] && x[0][2] == v.x[0][2] &&
- x[1][0] == v.x[1][0] && x[1][1] == v.x[1][1] && x[1][2] == v.x[1][2] &&
- x[2][0] == v.x[2][0] && x[2][1] == v.x[2][1] && x[2][2] == v.x[2][2];
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Matrix33<T>::operator!= (const Matrix33& v) const IMATH_NOEXCEPT
- {
- return x[0][0] != v.x[0][0] || x[0][1] != v.x[0][1] || x[0][2] != v.x[0][2] ||
- x[1][0] != v.x[1][0] || x[1][1] != v.x[1][1] || x[1][2] != v.x[1][2] ||
- x[2][0] != v.x[2][0] || x[2][1] != v.x[2][1] || x[2][2] != v.x[2][2];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Matrix33<T>::equalWithAbsError (const Matrix33<T>& m, T e) const IMATH_NOEXCEPT
- {
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i][j], m[i][j], e))
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Matrix33<T>::equalWithRelError (const Matrix33<T>& m, T e) const IMATH_NOEXCEPT
- {
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i][j], m[i][j], e))
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator+= (const Matrix33<T>& v) IMATH_NOEXCEPT
- {
- x[0][0] += v.x[0][0];
- x[0][1] += v.x[0][1];
- x[0][2] += v.x[0][2];
- x[1][0] += v.x[1][0];
- x[1][1] += v.x[1][1];
- x[1][2] += v.x[1][2];
- x[2][0] += v.x[2][0];
- x[2][1] += v.x[2][1];
- x[2][2] += v.x[2][2];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator+= (T a) IMATH_NOEXCEPT
- {
- x[0][0] += a;
- x[0][1] += a;
- x[0][2] += a;
- x[1][0] += a;
- x[1][1] += a;
- x[1][2] += a;
- x[2][0] += a;
- x[2][1] += a;
- x[2][2] += a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix33<T>
- Matrix33<T>::operator+ (const Matrix33<T>& v) const IMATH_NOEXCEPT
- {
- return Matrix33 (x[0][0] + v.x[0][0],
- x[0][1] + v.x[0][1],
- x[0][2] + v.x[0][2],
- x[1][0] + v.x[1][0],
- x[1][1] + v.x[1][1],
- x[1][2] + v.x[1][2],
- x[2][0] + v.x[2][0],
- x[2][1] + v.x[2][1],
- x[2][2] + v.x[2][2]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator-= (const Matrix33<T>& v) IMATH_NOEXCEPT
- {
- x[0][0] -= v.x[0][0];
- x[0][1] -= v.x[0][1];
- x[0][2] -= v.x[0][2];
- x[1][0] -= v.x[1][0];
- x[1][1] -= v.x[1][1];
- x[1][2] -= v.x[1][2];
- x[2][0] -= v.x[2][0];
- x[2][1] -= v.x[2][1];
- x[2][2] -= v.x[2][2];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator-= (T a) IMATH_NOEXCEPT
- {
- x[0][0] -= a;
- x[0][1] -= a;
- x[0][2] -= a;
- x[1][0] -= a;
- x[1][1] -= a;
- x[1][2] -= a;
- x[2][0] -= a;
- x[2][1] -= a;
- x[2][2] -= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix33<T>
- Matrix33<T>::operator- (const Matrix33<T>& v) const IMATH_NOEXCEPT
- {
- return Matrix33 (x[0][0] - v.x[0][0],
- x[0][1] - v.x[0][1],
- x[0][2] - v.x[0][2],
- x[1][0] - v.x[1][0],
- x[1][1] - v.x[1][1],
- x[1][2] - v.x[1][2],
- x[2][0] - v.x[2][0],
- x[2][1] - v.x[2][1],
- x[2][2] - v.x[2][2]);
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix33<T>
- Matrix33<T>::operator-() const IMATH_NOEXCEPT
- {
- return Matrix33 (-x[0][0],
- -x[0][1],
- -x[0][2],
- -x[1][0],
- -x[1][1],
- -x[1][2],
- -x[2][0],
- -x[2][1],
- -x[2][2]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::negate() IMATH_NOEXCEPT
- {
- x[0][0] = -x[0][0];
- x[0][1] = -x[0][1];
- x[0][2] = -x[0][2];
- x[1][0] = -x[1][0];
- x[1][1] = -x[1][1];
- x[1][2] = -x[1][2];
- x[2][0] = -x[2][0];
- x[2][1] = -x[2][1];
- x[2][2] = -x[2][2];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator*= (T a) IMATH_NOEXCEPT
- {
- x[0][0] *= a;
- x[0][1] *= a;
- x[0][2] *= a;
- x[1][0] *= a;
- x[1][1] *= a;
- x[1][2] *= a;
- x[2][0] *= a;
- x[2][1] *= a;
- x[2][2] *= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix33<T>
- Matrix33<T>::operator* (T a) const IMATH_NOEXCEPT
- {
- return Matrix33 (x[0][0] * a,
- x[0][1] * a,
- x[0][2] * a,
- x[1][0] * a,
- x[1][1] * a,
- x[1][2] * a,
- x[2][0] * a,
- x[2][1] * a,
- x[2][2] * a);
- }
- /// Matrix-scalar multiplication
- template <class T>
- IMATH_HOSTDEVICE inline Matrix33<T> constexpr
- operator* (T a, const Matrix33<T>& v) IMATH_NOEXCEPT
- {
- return v * a;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator*= (const Matrix33<T>& v) IMATH_NOEXCEPT
- {
- // Avoid initializing with 0 values before immediately overwriting them,
- // and unroll all loops for the best autovectorization.
- Matrix33 tmp(IMATH_INTERNAL_NAMESPACE::UNINITIALIZED);
- tmp.x[0][0] = x[0][0] * v.x[0][0] + x[0][1] * v.x[1][0] + x[0][2] * v.x[2][0];
- tmp.x[0][1] = x[0][0] * v.x[0][1] + x[0][1] * v.x[1][1] + x[0][2] * v.x[2][1];
- tmp.x[0][2] = x[0][0] * v.x[0][2] + x[0][1] * v.x[1][2] + x[0][2] * v.x[2][2];
- tmp.x[1][0] = x[1][0] * v.x[0][0] + x[1][1] * v.x[1][0] + x[1][2] * v.x[2][0];
- tmp.x[1][1] = x[1][0] * v.x[0][1] + x[1][1] * v.x[1][1] + x[1][2] * v.x[2][1];
- tmp.x[1][2] = x[1][0] * v.x[0][2] + x[1][1] * v.x[1][2] + x[1][2] * v.x[2][2];
- tmp.x[2][0] = x[2][0] * v.x[0][0] + x[2][1] * v.x[1][0] + x[2][2] * v.x[2][0];
- tmp.x[2][1] = x[2][0] * v.x[0][1] + x[2][1] * v.x[1][1] + x[2][2] * v.x[2][1];
- tmp.x[2][2] = x[2][0] * v.x[0][2] + x[2][1] * v.x[1][2] + x[2][2] * v.x[2][2];
- *this = tmp;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>
- Matrix33<T>::operator* (const Matrix33<T>& v) const IMATH_NOEXCEPT
- {
- // Avoid initializing with 0 values before immediately overwriting them,
- // and unroll all loops for the best autovectorization.
- Matrix33 tmp(IMATH_INTERNAL_NAMESPACE::UNINITIALIZED);
- tmp.x[0][0] = x[0][0] * v.x[0][0] + x[0][1] * v.x[1][0] + x[0][2] * v.x[2][0];
- tmp.x[0][1] = x[0][0] * v.x[0][1] + x[0][1] * v.x[1][1] + x[0][2] * v.x[2][1];
- tmp.x[0][2] = x[0][0] * v.x[0][2] + x[0][1] * v.x[1][2] + x[0][2] * v.x[2][2];
- tmp.x[1][0] = x[1][0] * v.x[0][0] + x[1][1] * v.x[1][0] + x[1][2] * v.x[2][0];
- tmp.x[1][1] = x[1][0] * v.x[0][1] + x[1][1] * v.x[1][1] + x[1][2] * v.x[2][1];
- tmp.x[1][2] = x[1][0] * v.x[0][2] + x[1][1] * v.x[1][2] + x[1][2] * v.x[2][2];
- tmp.x[2][0] = x[2][0] * v.x[0][0] + x[2][1] * v.x[1][0] + x[2][2] * v.x[2][0];
- tmp.x[2][1] = x[2][0] * v.x[0][1] + x[2][1] * v.x[1][1] + x[2][2] * v.x[2][1];
- tmp.x[2][2] = x[2][0] * v.x[0][2] + x[2][1] * v.x[1][2] + x[2][2] * v.x[2][2];
- return tmp;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix33<T>::multVecMatrix (const Vec2<S>& src, Vec2<S>& dst) const IMATH_NOEXCEPT
- {
- S a, b, w;
- a = src.x * x[0][0] + src.y * x[1][0] + x[2][0];
- b = src.x * x[0][1] + src.y * x[1][1] + x[2][1];
- w = src.x * x[0][2] + src.y * x[1][2] + x[2][2];
- dst.x = a / w;
- dst.y = b / w;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix33<T>::multDirMatrix (const Vec2<S>& src, Vec2<S>& dst) const IMATH_NOEXCEPT
- {
- S a, b;
- a = src.x * x[0][0] + src.y * x[1][0];
- b = src.x * x[0][1] + src.y * x[1][1];
- dst.x = a;
- dst.y = b;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::operator/= (T a) IMATH_NOEXCEPT
- {
- x[0][0] /= a;
- x[0][1] /= a;
- x[0][2] /= a;
- x[1][0] /= a;
- x[1][1] /= a;
- x[1][2] /= a;
- x[2][0] /= a;
- x[2][1] /= a;
- x[2][2] /= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix33<T>
- Matrix33<T>::operator/ (T a) const IMATH_NOEXCEPT
- {
- return Matrix33 (x[0][0] / a,
- x[0][1] / a,
- x[0][2] / a,
- x[1][0] / a,
- x[1][1] / a,
- x[1][2] / a,
- x[2][0] / a,
- x[2][1] / a,
- x[2][2] / a);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::transpose() IMATH_NOEXCEPT
- {
- Matrix33 tmp (x[0][0], x[1][0], x[2][0], x[0][1], x[1][1], x[2][1], x[0][2], x[1][2], x[2][2]);
- *this = tmp;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix33<T>
- Matrix33<T>::transposed() const IMATH_NOEXCEPT
- {
- return Matrix33 (x[0][0],
- x[1][0],
- x[2][0],
- x[0][1],
- x[1][1],
- x[2][1],
- x[0][2],
- x[1][2],
- x[2][2]);
- }
- template <class T>
- const inline Matrix33<T>&
- Matrix33<T>::gjInvert (bool singExc)
- {
- *this = gjInverse (singExc);
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE const inline Matrix33<T>&
- Matrix33<T>::gjInvert() IMATH_NOEXCEPT
- {
- *this = gjInverse();
- return *this;
- }
- template <class T>
- inline Matrix33<T>
- Matrix33<T>::gjInverse (bool singExc) const
- {
- int i, j, k;
- Matrix33 s;
- Matrix33 t (*this);
- // Forward elimination
- for (i = 0; i < 2; i++)
- {
- int pivot = i;
- T pivotsize = t.x[i][i];
- if (pivotsize < 0)
- pivotsize = -pivotsize;
- for (j = i + 1; j < 3; j++)
- {
- T tmp = t.x[j][i];
- if (tmp < 0)
- tmp = -tmp;
- if (tmp > pivotsize)
- {
- pivot = j;
- pivotsize = tmp;
- }
- }
- if (pivotsize == 0)
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert singular matrix.");
- return Matrix33();
- }
- if (pivot != i)
- {
- for (j = 0; j < 3; j++)
- {
- T tmp;
- tmp = t.x[i][j];
- t.x[i][j] = t.x[pivot][j];
- t.x[pivot][j] = tmp;
- tmp = s.x[i][j];
- s.x[i][j] = s.x[pivot][j];
- s.x[pivot][j] = tmp;
- }
- }
- for (j = i + 1; j < 3; j++)
- {
- T f = t.x[j][i] / t.x[i][i];
- for (k = 0; k < 3; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- // Backward substitution
- for (i = 2; i >= 0; --i)
- {
- T f;
- if ((f = t[i][i]) == 0)
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert singular matrix.");
- return Matrix33();
- }
- for (j = 0; j < 3; j++)
- {
- t.x[i][j] /= f;
- s.x[i][j] /= f;
- }
- for (j = 0; j < i; j++)
- {
- f = t.x[j][i];
- for (k = 0; k < 3; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- return s;
- }
- template <class T>
- IMATH_HOSTDEVICE inline Matrix33<T>
- Matrix33<T>::gjInverse() const IMATH_NOEXCEPT
- {
- int i, j, k;
- Matrix33 s;
- Matrix33 t (*this);
- // Forward elimination
- for (i = 0; i < 2; i++)
- {
- int pivot = i;
- T pivotsize = t.x[i][i];
- if (pivotsize < 0)
- pivotsize = -pivotsize;
- for (j = i + 1; j < 3; j++)
- {
- T tmp = t.x[j][i];
- if (tmp < 0)
- tmp = -tmp;
- if (tmp > pivotsize)
- {
- pivot = j;
- pivotsize = tmp;
- }
- }
- if (pivotsize == 0)
- {
- return Matrix33();
- }
- if (pivot != i)
- {
- for (j = 0; j < 3; j++)
- {
- T tmp;
- tmp = t.x[i][j];
- t.x[i][j] = t.x[pivot][j];
- t.x[pivot][j] = tmp;
- tmp = s.x[i][j];
- s.x[i][j] = s.x[pivot][j];
- s.x[pivot][j] = tmp;
- }
- }
- for (j = i + 1; j < 3; j++)
- {
- T f = t.x[j][i] / t.x[i][i];
- for (k = 0; k < 3; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- // Backward substitution
- for (i = 2; i >= 0; --i)
- {
- T f;
- if ((f = t.x[i][i]) == 0)
- {
- return Matrix33();
- }
- for (j = 0; j < 3; j++)
- {
- t.x[i][j] /= f;
- s.x[i][j] /= f;
- }
- for (j = 0; j < i; j++)
- {
- f = t.x[j][i];
- for (k = 0; k < 3; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- return s;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::invert (bool singExc)
- {
- *this = inverse (singExc);
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::invert() IMATH_NOEXCEPT
- {
- *this = inverse();
- return *this;
- }
- template <class T>
- IMATH_CONSTEXPR14 inline Matrix33<T>
- Matrix33<T>::inverse (bool singExc) const
- {
- if (x[0][2] != 0 || x[1][2] != 0 || x[2][2] != 1)
- {
- Matrix33 s (x[1][1] * x[2][2] - x[2][1] * x[1][2],
- x[2][1] * x[0][2] - x[0][1] * x[2][2],
- x[0][1] * x[1][2] - x[1][1] * x[0][2],
- x[2][0] * x[1][2] - x[1][0] * x[2][2],
- x[0][0] * x[2][2] - x[2][0] * x[0][2],
- x[1][0] * x[0][2] - x[0][0] * x[1][2],
- x[1][0] * x[2][1] - x[2][0] * x[1][1],
- x[2][0] * x[0][1] - x[0][0] * x[2][1],
- x[0][0] * x[1][1] - x[1][0] * x[0][1]);
- T r = x[0][0] * s[0][0] + x[0][1] * s[1][0] + x[0][2] * s[2][0];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- s.x[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s.x[i][j]))
- {
- s.x[i][j] /= r;
- }
- else
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert "
- "singular matrix.");
- return Matrix33();
- }
- }
- }
- }
- return s;
- }
- else
- {
- Matrix33 s (x[1][1],
- -x[0][1],
- 0,
- -x[1][0],
- x[0][0],
- 0,
- 0,
- 0,
- 1);
- T r = x[0][0] * x[1][1] - x[1][0] * x[0][1];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- s.x[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s.x[i][j]))
- {
- s.x[i][j] /= r;
- }
- else
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert "
- "singular matrix.");
- return Matrix33();
- }
- }
- }
- }
- s.x[2][0] = -x[2][0] * s.x[0][0] - x[2][1] * s.x[1][0];
- s.x[2][1] = -x[2][0] * s.x[0][1] - x[2][1] * s.x[1][1];
- return s;
- }
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix33<T>
- Matrix33<T>::inverse () const IMATH_NOEXCEPT
- {
- if (x[0][2] != 0 || x[1][2] != 0 || x[2][2] != 1)
- {
- Matrix33 s (x[1][1] * x[2][2] - x[2][1] * x[1][2],
- x[2][1] * x[0][2] - x[0][1] * x[2][2],
- x[0][1] * x[1][2] - x[1][1] * x[0][2],
- x[2][0] * x[1][2] - x[1][0] * x[2][2],
- x[0][0] * x[2][2] - x[2][0] * x[0][2],
- x[1][0] * x[0][2] - x[0][0] * x[1][2],
- x[1][0] * x[2][1] - x[2][0] * x[1][1],
- x[2][0] * x[0][1] - x[0][0] * x[2][1],
- x[0][0] * x[1][1] - x[1][0] * x[0][1]);
- T r = x[0][0] * s.x[0][0] + x[0][1] * s.x[1][0] + x[0][2] * s.x[2][0];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- s.x[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s.x[i][j]))
- {
- s.x[i][j] /= r;
- }
- else
- {
- return Matrix33();
- }
- }
- }
- }
- return s;
- }
- else
- {
- Matrix33 s (x[1][1],
- -x[0][1],
- 0,
- -x[1][0],
- x[0][0],
- 0,
- 0,
- 0,
- 1);
- T r = x[0][0] * x[1][1] - x[1][0] * x[0][1];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- s.x[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 2; ++i)
- {
- for (int j = 0; j < 2; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s.x[i][j]))
- {
- s.x[i][j] /= r;
- }
- else
- {
- return Matrix33();
- }
- }
- }
- }
- s.x[2][0] = -x[2][0] * s.x[0][0] - x[2][1] * s.x[1][0];
- s.x[2][1] = -x[2][0] * s.x[0][1] - x[2][1] * s.x[1][1];
- return s;
- }
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline T
- Matrix33<T>::minorOf (const int r, const int c) const IMATH_NOEXCEPT
- {
- int r0 = 0 + (r < 1 ? 1 : 0);
- int r1 = 1 + (r < 2 ? 1 : 0);
- int c0 = 0 + (c < 1 ? 1 : 0);
- int c1 = 1 + (c < 2 ? 1 : 0);
- return x[r0][c0] * x[r1][c1] - x[r1][c0] * x[r0][c1];
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline T
- Matrix33<T>::fastMinor (const int r0, const int r1, const int c0, const int c1) const IMATH_NOEXCEPT
- {
- return x[r0][c0] * x[r1][c1] - x[r0][c1] * x[r1][c0];
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline T
- Matrix33<T>::determinant() const IMATH_NOEXCEPT
- {
- return x[0][0] * (x[1][1] * x[2][2] - x[1][2] * x[2][1]) +
- x[0][1] * (x[1][2] * x[2][0] - x[1][0] * x[2][2]) +
- x[0][2] * (x[1][0] * x[2][1] - x[1][1] * x[2][0]);
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline T
- Matrix33<T>::trace () const IMATH_NOEXCEPT
- {
- return x[0][0] + x[1][1] + x[2][2];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline const Matrix33<T>&
- Matrix33<T>::setRotation (S r) IMATH_NOEXCEPT
- {
- S cos_r, sin_r;
- cos_r = cos ((T) r);
- sin_r = sin ((T) r);
- x[0][0] = cos_r;
- x[0][1] = sin_r;
- x[0][2] = 0;
- x[1][0] = -sin_r;
- x[1][1] = cos_r;
- x[1][2] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::rotate (S r) IMATH_NOEXCEPT
- {
- *this *= Matrix33<T>().setRotation (r);
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::setScale (T s) IMATH_NOEXCEPT
- {
- //
- // Set the matrix to a 2D homogeneous transform scale:
- // | s 0 0 |
- // | 0 s 0 |
- // | 0 0 1 |
- //
- x[0][0] = s;
- x[0][1] = 0;
- x[0][2] = 0;
- x[1][0] = 0;
- x[1][1] = s;
- x[1][2] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::setScale (const Vec2<S>& s) IMATH_NOEXCEPT
- {
- //
- // Set the matrix to a 2D homogeneous transform scale:
- // | s.x 0 0 |
- // | 0 s.y 0 |
- // | 0 0 1 |
- //
- x[0][0] = s.x;
- x[0][1] = 0;
- x[0][2] = 0;
- x[1][0] = 0;
- x[1][1] = s.y;
- x[1][2] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::scale (const Vec2<S>& s) IMATH_NOEXCEPT
- {
- x[0][0] *= s.x;
- x[0][1] *= s.x;
- x[0][2] *= s.x;
- x[1][0] *= s.y;
- x[1][1] *= s.y;
- x[1][2] *= s.y;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::setTranslation (const Vec2<S>& t) IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- x[1][2] = 0;
- x[2][0] = t.x;
- x[2][1] = t.y;
- x[2][2] = 1;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Vec2<T>
- Matrix33<T>::translation() const IMATH_NOEXCEPT
- {
- return Vec2<T> (x[2][0], x[2][1]);
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::translate (const Vec2<S>& t) IMATH_NOEXCEPT
- {
- x[2][0] += t.x * x[0][0] + t.y * x[1][0];
- x[2][1] += t.x * x[0][1] + t.y * x[1][1];
- x[2][2] += t.x * x[0][2] + t.y * x[1][2];
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::setShear (const S& xy) IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[1][0] = xy;
- x[1][1] = 1;
- x[1][2] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::setShear (const Vec2<S>& h) IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = h.y;
- x[0][2] = 0;
- x[1][0] = h.x;
- x[1][1] = 1;
- x[1][2] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::shear (const S& xy) IMATH_NOEXCEPT
- {
- //
- // In this case, we don't need a temp. copy of the matrix
- // because we never use a value on the RHS after we've
- // changed it on the LHS.
- //
- x[1][0] += xy * x[0][0];
- x[1][1] += xy * x[0][1];
- x[1][2] += xy * x[0][2];
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix33<T>&
- Matrix33<T>::shear (const Vec2<S>& h) IMATH_NOEXCEPT
- {
- Matrix33<T> P (*this);
- x[0][0] = P.x[0][0] + h.y * P.x[1][0];
- x[0][1] = P.x[0][1] + h.y * P.x[1][1];
- x[0][2] = P.x[0][2] + h.y * P.x[1][2];
- x[1][0] = P.x[1][0] + h.x * P.x[0][0];
- x[1][1] = P.x[1][1] + h.x * P.x[0][1];
- x[1][2] = P.x[1][2] + h.x * P.x[0][2];
- return *this;
- }
- //---------------------------
- // Implementation of Matrix44
- //---------------------------
- template <class T>
- IMATH_HOSTDEVICE inline T*
- Matrix44<T>::operator[] (int i) IMATH_NOEXCEPT
- {
- return x[i];
- }
- template <class T>
- IMATH_HOSTDEVICE inline const T*
- Matrix44<T>::operator[] (int i) const IMATH_NOEXCEPT
- {
- return x[i];
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>::Matrix44() IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[0][3] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- x[1][2] = 0;
- x[1][3] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>::Matrix44 (T a) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = a;
- x[0][2] = a;
- x[0][3] = a;
- x[1][0] = a;
- x[1][1] = a;
- x[1][2] = a;
- x[1][3] = a;
- x[2][0] = a;
- x[2][1] = a;
- x[2][2] = a;
- x[2][3] = a;
- x[3][0] = a;
- x[3][1] = a;
- x[3][2] = a;
- x[3][3] = a;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>::Matrix44 (
- const T a[4][4]) IMATH_NOEXCEPT
- {
- x[0][0] = a[0][0];
- x[0][1] = a[0][1];
- x[0][2] = a[0][2];
- x[0][3] = a[0][3];
- x[1][0] = a[1][0];
- x[1][1] = a[1][1];
- x[1][2] = a[1][2];
- x[1][3] = a[1][3];
- x[2][0] = a[2][0];
- x[2][1] = a[2][1];
- x[2][2] = a[2][2];
- x[2][3] = a[2][3];
- x[3][0] = a[3][0];
- x[3][1] = a[3][1];
- x[3][2] = a[3][2];
- x[3][3] = a[3][3];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<
- T>::Matrix44 (T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = b;
- x[0][2] = c;
- x[0][3] = d;
- x[1][0] = e;
- x[1][1] = f;
- x[1][2] = g;
- x[1][3] = h;
- x[2][0] = i;
- x[2][1] = j;
- x[2][2] = k;
- x[2][3] = l;
- x[3][0] = m;
- x[3][1] = n;
- x[3][2] = o;
- x[3][3] = p;
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>::Matrix44 (Matrix33<T> r, Vec3<T> t) IMATH_NOEXCEPT
- {
- x[0][0] = r.x[0][0];
- x[0][1] = r.x[0][1];
- x[0][2] = r.x[0][2];
- x[0][3] = 0;
- x[1][0] = r.x[1][0];
- x[1][1] = r.x[1][1];
- x[1][2] = r.x[1][2];
- x[1][3] = 0;
- x[2][0] = r.x[2][0];
- x[2][1] = r.x[2][1];
- x[2][2] = r.x[2][2];
- x[2][3] = 0;
- x[3][0] = t.x;
- x[3][1] = t.y;
- x[3][2] = t.z;
- x[3][3] = 1;
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>::Matrix44 (const Matrix44& v) IMATH_NOEXCEPT
- {
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[0][2] = v.x[0][2];
- x[0][3] = v.x[0][3];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- x[1][2] = v.x[1][2];
- x[1][3] = v.x[1][3];
- x[2][0] = v.x[2][0];
- x[2][1] = v.x[2][1];
- x[2][2] = v.x[2][2];
- x[2][3] = v.x[2][3];
- x[3][0] = v.x[3][0];
- x[3][1] = v.x[3][1];
- x[3][2] = v.x[3][2];
- x[3][3] = v.x[3][3];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>::Matrix44 (const Matrix44<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = T (v.x[0][0]);
- x[0][1] = T (v.x[0][1]);
- x[0][2] = T (v.x[0][2]);
- x[0][3] = T (v.x[0][3]);
- x[1][0] = T (v.x[1][0]);
- x[1][1] = T (v.x[1][1]);
- x[1][2] = T (v.x[1][2]);
- x[1][3] = T (v.x[1][3]);
- x[2][0] = T (v.x[2][0]);
- x[2][1] = T (v.x[2][1]);
- x[2][2] = T (v.x[2][2]);
- x[2][3] = T (v.x[2][3]);
- x[3][0] = T (v.x[3][0]);
- x[3][1] = T (v.x[3][1]);
- x[3][2] = T (v.x[3][2]);
- x[3][3] = T (v.x[3][3]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator= (const Matrix44& v) IMATH_NOEXCEPT
- {
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[0][2] = v.x[0][2];
- x[0][3] = v.x[0][3];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- x[1][2] = v.x[1][2];
- x[1][3] = v.x[1][3];
- x[2][0] = v.x[2][0];
- x[2][1] = v.x[2][1];
- x[2][2] = v.x[2][2];
- x[2][3] = v.x[2][3];
- x[3][0] = v.x[3][0];
- x[3][1] = v.x[3][1];
- x[3][2] = v.x[3][2];
- x[3][3] = v.x[3][3];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator= (T a) IMATH_NOEXCEPT
- {
- x[0][0] = a;
- x[0][1] = a;
- x[0][2] = a;
- x[0][3] = a;
- x[1][0] = a;
- x[1][1] = a;
- x[1][2] = a;
- x[1][3] = a;
- x[2][0] = a;
- x[2][1] = a;
- x[2][2] = a;
- x[2][3] = a;
- x[3][0] = a;
- x[3][1] = a;
- x[3][2] = a;
- x[3][3] = a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE inline T*
- Matrix44<T>::getValue () IMATH_NOEXCEPT
- {
- return (T*) &x[0][0];
- }
- template <class T>
- IMATH_HOSTDEVICE inline const T*
- Matrix44<T>::getValue() const IMATH_NOEXCEPT
- {
- return (const T*) &x[0][0];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix44<T>::getValue (Matrix44<S>& v) const IMATH_NOEXCEPT
- {
- v.x[0][0] = x[0][0];
- v.x[0][1] = x[0][1];
- v.x[0][2] = x[0][2];
- v.x[0][3] = x[0][3];
- v.x[1][0] = x[1][0];
- v.x[1][1] = x[1][1];
- v.x[1][2] = x[1][2];
- v.x[1][3] = x[1][3];
- v.x[2][0] = x[2][0];
- v.x[2][1] = x[2][1];
- v.x[2][2] = x[2][2];
- v.x[2][3] = x[2][3];
- v.x[3][0] = x[3][0];
- v.x[3][1] = x[3][1];
- v.x[3][2] = x[3][2];
- v.x[3][3] = x[3][3];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>&
- Matrix44<T>::setValue (const Matrix44<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = T(v.x[0][0]);
- x[0][1] = T(v.x[0][1]);
- x[0][2] = T(v.x[0][2]);
- x[0][3] = T(v.x[0][3]);
- x[1][0] = T(v.x[1][0]);
- x[1][1] = T(v.x[1][1]);
- x[1][2] = T(v.x[1][2]);
- x[1][3] = T(v.x[1][3]);
- x[2][0] = T(v.x[2][0]);
- x[2][1] = T(v.x[2][1]);
- x[2][2] = T(v.x[2][2]);
- x[2][3] = T(v.x[2][3]);
- x[3][0] = T(v.x[3][0]);
- x[3][1] = T(v.x[3][1]);
- x[3][2] = T(v.x[3][2]);
- x[3][3] = T(v.x[3][3]);
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>&
- Matrix44<T>::setTheMatrix (const Matrix44<S>& v) IMATH_NOEXCEPT
- {
- x[0][0] = v.x[0][0];
- x[0][1] = v.x[0][1];
- x[0][2] = v.x[0][2];
- x[0][3] = v.x[0][3];
- x[1][0] = v.x[1][0];
- x[1][1] = v.x[1][1];
- x[1][2] = v.x[1][2];
- x[1][3] = v.x[1][3];
- x[2][0] = v.x[2][0];
- x[2][1] = v.x[2][1];
- x[2][2] = v.x[2][2];
- x[2][3] = v.x[2][3];
- x[3][0] = v.x[3][0];
- x[3][1] = v.x[3][1];
- x[3][2] = v.x[3][2];
- x[3][3] = v.x[3][3];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Matrix44<T>::makeIdentity() IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[0][3] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- x[1][2] = 0;
- x[1][3] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Matrix44<T>::operator== (const Matrix44& v) const IMATH_NOEXCEPT
- {
- return x[0][0] == v.x[0][0] && x[0][1] == v.x[0][1] && x[0][2] == v.x[0][2] &&
- x[0][3] == v.x[0][3] && x[1][0] == v.x[1][0] && x[1][1] == v.x[1][1] &&
- x[1][2] == v.x[1][2] && x[1][3] == v.x[1][3] && x[2][0] == v.x[2][0] &&
- x[2][1] == v.x[2][1] && x[2][2] == v.x[2][2] && x[2][3] == v.x[2][3] &&
- x[3][0] == v.x[3][0] && x[3][1] == v.x[3][1] && x[3][2] == v.x[3][2] &&
- x[3][3] == v.x[3][3];
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Matrix44<T>::operator!= (const Matrix44& v) const IMATH_NOEXCEPT
- {
- return x[0][0] != v.x[0][0] || x[0][1] != v.x[0][1] || x[0][2] != v.x[0][2] ||
- x[0][3] != v.x[0][3] || x[1][0] != v.x[1][0] || x[1][1] != v.x[1][1] ||
- x[1][2] != v.x[1][2] || x[1][3] != v.x[1][3] || x[2][0] != v.x[2][0] ||
- x[2][1] != v.x[2][1] || x[2][2] != v.x[2][2] || x[2][3] != v.x[2][3] ||
- x[3][0] != v.x[3][0] || x[3][1] != v.x[3][1] || x[3][2] != v.x[3][2] ||
- x[3][3] != v.x[3][3];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Matrix44<T>::equalWithAbsError (const Matrix44<T>& m, T e) const IMATH_NOEXCEPT
- {
- for (int i = 0; i < 4; i++)
- for (int j = 0; j < 4; j++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this).x[i][j], m.x[i][j], e))
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Matrix44<T>::equalWithRelError (const Matrix44<T>& m, T e) const IMATH_NOEXCEPT
- {
- for (int i = 0; i < 4; i++)
- for (int j = 0; j < 4; j++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this).x[i][j], m.x[i][j], e))
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator+= (const Matrix44<T>& v) IMATH_NOEXCEPT
- {
- x[0][0] += v.x[0][0];
- x[0][1] += v.x[0][1];
- x[0][2] += v.x[0][2];
- x[0][3] += v.x[0][3];
- x[1][0] += v.x[1][0];
- x[1][1] += v.x[1][1];
- x[1][2] += v.x[1][2];
- x[1][3] += v.x[1][3];
- x[2][0] += v.x[2][0];
- x[2][1] += v.x[2][1];
- x[2][2] += v.x[2][2];
- x[2][3] += v.x[2][3];
- x[3][0] += v.x[3][0];
- x[3][1] += v.x[3][1];
- x[3][2] += v.x[3][2];
- x[3][3] += v.x[3][3];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator+= (T a) IMATH_NOEXCEPT
- {
- x[0][0] += a;
- x[0][1] += a;
- x[0][2] += a;
- x[0][3] += a;
- x[1][0] += a;
- x[1][1] += a;
- x[1][2] += a;
- x[1][3] += a;
- x[2][0] += a;
- x[2][1] += a;
- x[2][2] += a;
- x[2][3] += a;
- x[3][0] += a;
- x[3][1] += a;
- x[3][2] += a;
- x[3][3] += a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix44<T>
- Matrix44<T>::operator+ (const Matrix44<T>& v) const IMATH_NOEXCEPT
- {
- return Matrix44 (x[0][0] + v.x[0][0],
- x[0][1] + v.x[0][1],
- x[0][2] + v.x[0][2],
- x[0][3] + v.x[0][3],
- x[1][0] + v.x[1][0],
- x[1][1] + v.x[1][1],
- x[1][2] + v.x[1][2],
- x[1][3] + v.x[1][3],
- x[2][0] + v.x[2][0],
- x[2][1] + v.x[2][1],
- x[2][2] + v.x[2][2],
- x[2][3] + v.x[2][3],
- x[3][0] + v.x[3][0],
- x[3][1] + v.x[3][1],
- x[3][2] + v.x[3][2],
- x[3][3] + v.x[3][3]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator-= (const Matrix44<T>& v) IMATH_NOEXCEPT
- {
- x[0][0] -= v.x[0][0];
- x[0][1] -= v.x[0][1];
- x[0][2] -= v.x[0][2];
- x[0][3] -= v.x[0][3];
- x[1][0] -= v.x[1][0];
- x[1][1] -= v.x[1][1];
- x[1][2] -= v.x[1][2];
- x[1][3] -= v.x[1][3];
- x[2][0] -= v.x[2][0];
- x[2][1] -= v.x[2][1];
- x[2][2] -= v.x[2][2];
- x[2][3] -= v.x[2][3];
- x[3][0] -= v.x[3][0];
- x[3][1] -= v.x[3][1];
- x[3][2] -= v.x[3][2];
- x[3][3] -= v.x[3][3];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator-= (T a) IMATH_NOEXCEPT
- {
- x[0][0] -= a;
- x[0][1] -= a;
- x[0][2] -= a;
- x[0][3] -= a;
- x[1][0] -= a;
- x[1][1] -= a;
- x[1][2] -= a;
- x[1][3] -= a;
- x[2][0] -= a;
- x[2][1] -= a;
- x[2][2] -= a;
- x[2][3] -= a;
- x[3][0] -= a;
- x[3][1] -= a;
- x[3][2] -= a;
- x[3][3] -= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix44<T>
- Matrix44<T>::operator- (const Matrix44<T>& v) const IMATH_NOEXCEPT
- {
- return Matrix44 (x[0][0] - v.x[0][0],
- x[0][1] - v.x[0][1],
- x[0][2] - v.x[0][2],
- x[0][3] - v.x[0][3],
- x[1][0] - v.x[1][0],
- x[1][1] - v.x[1][1],
- x[1][2] - v.x[1][2],
- x[1][3] - v.x[1][3],
- x[2][0] - v.x[2][0],
- x[2][1] - v.x[2][1],
- x[2][2] - v.x[2][2],
- x[2][3] - v.x[2][3],
- x[3][0] - v.x[3][0],
- x[3][1] - v.x[3][1],
- x[3][2] - v.x[3][2],
- x[3][3] - v.x[3][3]);
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix44<T>
- Matrix44<T>::operator-() const IMATH_NOEXCEPT
- {
- return Matrix44 (-x[0][0],
- -x[0][1],
- -x[0][2],
- -x[0][3],
- -x[1][0],
- -x[1][1],
- -x[1][2],
- -x[1][3],
- -x[2][0],
- -x[2][1],
- -x[2][2],
- -x[2][3],
- -x[3][0],
- -x[3][1],
- -x[3][2],
- -x[3][3]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::negate() IMATH_NOEXCEPT
- {
- x[0][0] = -x[0][0];
- x[0][1] = -x[0][1];
- x[0][2] = -x[0][2];
- x[0][3] = -x[0][3];
- x[1][0] = -x[1][0];
- x[1][1] = -x[1][1];
- x[1][2] = -x[1][2];
- x[1][3] = -x[1][3];
- x[2][0] = -x[2][0];
- x[2][1] = -x[2][1];
- x[2][2] = -x[2][2];
- x[2][3] = -x[2][3];
- x[3][0] = -x[3][0];
- x[3][1] = -x[3][1];
- x[3][2] = -x[3][2];
- x[3][3] = -x[3][3];
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator*= (T a) IMATH_NOEXCEPT
- {
- x[0][0] *= a;
- x[0][1] *= a;
- x[0][2] *= a;
- x[0][3] *= a;
- x[1][0] *= a;
- x[1][1] *= a;
- x[1][2] *= a;
- x[1][3] *= a;
- x[2][0] *= a;
- x[2][1] *= a;
- x[2][2] *= a;
- x[2][3] *= a;
- x[3][0] *= a;
- x[3][1] *= a;
- x[3][2] *= a;
- x[3][3] *= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix44<T>
- Matrix44<T>::operator* (T a) const IMATH_NOEXCEPT
- {
- return Matrix44 (x[0][0] * a,
- x[0][1] * a,
- x[0][2] * a,
- x[0][3] * a,
- x[1][0] * a,
- x[1][1] * a,
- x[1][2] * a,
- x[1][3] * a,
- x[2][0] * a,
- x[2][1] * a,
- x[2][2] * a,
- x[2][3] * a,
- x[3][0] * a,
- x[3][1] * a,
- x[3][2] * a,
- x[3][3] * a);
- }
- /// Matrix-scalar multiplication
- template <class T>
- IMATH_HOSTDEVICE inline Matrix44<T>
- operator* (T a, const Matrix44<T>& v) IMATH_NOEXCEPT
- {
- return v * a;
- }
- template <class T>
- IMATH_HOSTDEVICE inline IMATH_CONSTEXPR14 Matrix44<T>
- Matrix44<T>::multiply (const Matrix44 &a, const Matrix44 &b) IMATH_NOEXCEPT
- {
- const auto a00 = a.x[0][0];
- const auto a01 = a.x[0][1];
- const auto a02 = a.x[0][2];
- const auto a03 = a.x[0][3];
- const auto c00 = a00 * b.x[0][0] + a01 * b.x[1][0] + a02 * b.x[2][0] + a03 * b.x[3][0];
- const auto c01 = a00 * b.x[0][1] + a01 * b.x[1][1] + a02 * b.x[2][1] + a03 * b.x[3][1];
- const auto c02 = a00 * b.x[0][2] + a01 * b.x[1][2] + a02 * b.x[2][2] + a03 * b.x[3][2];
- const auto c03 = a00 * b.x[0][3] + a01 * b.x[1][3] + a02 * b.x[2][3] + a03 * b.x[3][3];
- const auto a10 = a.x[1][0];
- const auto a11 = a.x[1][1];
- const auto a12 = a.x[1][2];
- const auto a13 = a.x[1][3];
- const auto c10 = a10 * b.x[0][0] + a11 * b.x[1][0] + a12 * b.x[2][0] + a13 * b.x[3][0];
- const auto c11 = a10 * b.x[0][1] + a11 * b.x[1][1] + a12 * b.x[2][1] + a13 * b.x[3][1];
- const auto c12 = a10 * b.x[0][2] + a11 * b.x[1][2] + a12 * b.x[2][2] + a13 * b.x[3][2];
- const auto c13 = a10 * b.x[0][3] + a11 * b.x[1][3] + a12 * b.x[2][3] + a13 * b.x[3][3];
- const auto a20 = a.x[2][0];
- const auto a21 = a.x[2][1];
- const auto a22 = a.x[2][2];
- const auto a23 = a.x[2][3];
- const auto c20 = a20 * b.x[0][0] + a21 * b.x[1][0] + a22 * b.x[2][0] + a23 * b.x[3][0];
- const auto c21 = a20 * b.x[0][1] + a21 * b.x[1][1] + a22 * b.x[2][1] + a23 * b.x[3][1];
- const auto c22 = a20 * b.x[0][2] + a21 * b.x[1][2] + a22 * b.x[2][2] + a23 * b.x[3][2];
- const auto c23 = a20 * b.x[0][3] + a21 * b.x[1][3] + a22 * b.x[2][3] + a23 * b.x[3][3];
- const auto a30 = a.x[3][0];
- const auto a31 = a.x[3][1];
- const auto a32 = a.x[3][2];
- const auto a33 = a.x[3][3];
- const auto c30 = a30 * b.x[0][0] + a31 * b.x[1][0] + a32 * b.x[2][0] + a33 * b.x[3][0];
- const auto c31 = a30 * b.x[0][1] + a31 * b.x[1][1] + a32 * b.x[2][1] + a33 * b.x[3][1];
- const auto c32 = a30 * b.x[0][2] + a31 * b.x[1][2] + a32 * b.x[2][2] + a33 * b.x[3][2];
- const auto c33 = a30 * b.x[0][3] + a31 * b.x[1][3] + a32 * b.x[2][3] + a33 * b.x[3][3];
- return Matrix44(c00, c01, c02, c03,
- c10, c11, c12, c13,
- c20, c21, c22, c23,
- c30, c31, c32, c33);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator*= (const Matrix44<T>& v) IMATH_NOEXCEPT
- {
- *this = multiply(*this, v);
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>
- Matrix44<T>::operator* (const Matrix44<T>& v) const IMATH_NOEXCEPT
- {
- return multiply(*this, v);
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Matrix44<T>::multiply (const Matrix44<T>& a, const Matrix44<T>& b, Matrix44<T>& c) IMATH_NOEXCEPT
- {
- c = multiply(a, b);
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix44<T>::multVecMatrix (const Vec3<S>& src, Vec3<S>& dst) const IMATH_NOEXCEPT
- {
- S a, b, c, w;
- a = src.x * x[0][0] + src.y * x[1][0] + src.z * x[2][0] + x[3][0];
- b = src.x * x[0][1] + src.y * x[1][1] + src.z * x[2][1] + x[3][1];
- c = src.x * x[0][2] + src.y * x[1][2] + src.z * x[2][2] + x[3][2];
- w = src.x * x[0][3] + src.y * x[1][3] + src.z * x[2][3] + x[3][3];
- dst.x = a / w;
- dst.y = b / w;
- dst.z = c / w;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline void
- Matrix44<T>::multDirMatrix (const Vec3<S>& src, Vec3<S>& dst) const IMATH_NOEXCEPT
- {
- S a, b, c;
- a = src.x * x[0][0] + src.y * x[1][0] + src.z * x[2][0];
- b = src.x * x[0][1] + src.y * x[1][1] + src.z * x[2][1];
- c = src.x * x[0][2] + src.y * x[1][2] + src.z * x[2][2];
- dst.x = a;
- dst.y = b;
- dst.z = c;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::operator/= (T a) IMATH_NOEXCEPT
- {
- x[0][0] /= a;
- x[0][1] /= a;
- x[0][2] /= a;
- x[0][3] /= a;
- x[1][0] /= a;
- x[1][1] /= a;
- x[1][2] /= a;
- x[1][3] /= a;
- x[2][0] /= a;
- x[2][1] /= a;
- x[2][2] /= a;
- x[2][3] /= a;
- x[3][0] /= a;
- x[3][1] /= a;
- x[3][2] /= a;
- x[3][3] /= a;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix44<T>
- Matrix44<T>::operator/ (T a) const IMATH_NOEXCEPT
- {
- return Matrix44 (x[0][0] / a,
- x[0][1] / a,
- x[0][2] / a,
- x[0][3] / a,
- x[1][0] / a,
- x[1][1] / a,
- x[1][2] / a,
- x[1][3] / a,
- x[2][0] / a,
- x[2][1] / a,
- x[2][2] / a,
- x[2][3] / a,
- x[3][0] / a,
- x[3][1] / a,
- x[3][2] / a,
- x[3][3] / a);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::transpose() IMATH_NOEXCEPT
- {
- Matrix44 tmp (x[0][0],
- x[1][0],
- x[2][0],
- x[3][0],
- x[0][1],
- x[1][1],
- x[2][1],
- x[3][1],
- x[0][2],
- x[1][2],
- x[2][2],
- x[3][2],
- x[0][3],
- x[1][3],
- x[2][3],
- x[3][3]);
- *this = tmp;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Matrix44<T>
- Matrix44<T>::transposed() const IMATH_NOEXCEPT
- {
- return Matrix44 (x[0][0],
- x[1][0],
- x[2][0],
- x[3][0],
- x[0][1],
- x[1][1],
- x[2][1],
- x[3][1],
- x[0][2],
- x[1][2],
- x[2][2],
- x[3][2],
- x[0][3],
- x[1][3],
- x[2][3],
- x[3][3]);
- }
- template <class T>
- IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::gjInvert (bool singExc)
- {
- *this = gjInverse (singExc);
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::gjInvert() IMATH_NOEXCEPT
- {
- *this = gjInverse();
- return *this;
- }
- template <class T>
- inline Matrix44<T>
- Matrix44<T>::gjInverse (bool singExc) const
- {
- int i, j, k;
- Matrix44 s;
- Matrix44 t (*this);
- // Forward elimination
- for (i = 0; i < 3; i++)
- {
- int pivot = i;
- T pivotsize = t.x[i][i];
- if (pivotsize < 0)
- pivotsize = -pivotsize;
- for (j = i + 1; j < 4; j++)
- {
- T tmp = t.x[j][i];
- if (tmp < 0)
- tmp = -tmp;
- if (tmp > pivotsize)
- {
- pivot = j;
- pivotsize = tmp;
- }
- }
- if (pivotsize == 0)
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert singular matrix.");
- return Matrix44();
- }
- if (pivot != i)
- {
- for (j = 0; j < 4; j++)
- {
- T tmp;
- tmp = t.x[i][j];
- t.x[i][j] = t.x[pivot][j];
- t.x[pivot][j] = tmp;
- tmp = s.x[i][j];
- s.x[i][j] = s.x[pivot][j];
- s.x[pivot][j] = tmp;
- }
- }
- for (j = i + 1; j < 4; j++)
- {
- T f = t.x[j][i] / t.x[i][i];
- for (k = 0; k < 4; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- // Backward substitution
- for (i = 3; i >= 0; --i)
- {
- T f;
- if ((f = t.x[i][i]) == 0)
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert singular matrix.");
- return Matrix44();
- }
- for (j = 0; j < 4; j++)
- {
- t.x[i][j] /= f;
- s.x[i][j] /= f;
- }
- for (j = 0; j < i; j++)
- {
- f = t.x[j][i];
- for (k = 0; k < 4; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- return s;
- }
- template <class T>
- IMATH_HOSTDEVICE inline Matrix44<T>
- Matrix44<T>::gjInverse() const IMATH_NOEXCEPT
- {
- int i, j, k;
- Matrix44 s;
- Matrix44 t (*this);
- // Forward elimination
- for (i = 0; i < 3; i++)
- {
- int pivot = i;
- T pivotsize = t.x[i][i];
- if (pivotsize < 0)
- pivotsize = -pivotsize;
- for (j = i + 1; j < 4; j++)
- {
- T tmp = t.x[j][i];
- if (tmp < 0)
- tmp = -tmp;
- if (tmp > pivotsize)
- {
- pivot = j;
- pivotsize = tmp;
- }
- }
- if (pivotsize == 0)
- {
- return Matrix44();
- }
- if (pivot != i)
- {
- for (j = 0; j < 4; j++)
- {
- T tmp;
- tmp = t.x[i][j];
- t.x[i][j] = t.x[pivot][j];
- t.x[pivot][j] = tmp;
- tmp = s.x[i][j];
- s.x[i][j] = s.x[pivot][j];
- s.x[pivot][j] = tmp;
- }
- }
- for (j = i + 1; j < 4; j++)
- {
- T f = t.x[j][i] / t.x[i][i];
- for (k = 0; k < 4; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- // Backward substitution
- for (i = 3; i >= 0; --i)
- {
- T f;
- if ((f = t.x[i][i]) == 0)
- {
- return Matrix44();
- }
- for (j = 0; j < 4; j++)
- {
- t.x[i][j] /= f;
- s.x[i][j] /= f;
- }
- for (j = 0; j < i; j++)
- {
- f = t.x[j][i];
- for (k = 0; k < 4; k++)
- {
- t.x[j][k] -= f * t.x[i][k];
- s.x[j][k] -= f * s.x[i][k];
- }
- }
- }
- return s;
- }
- template <class T>
- IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::invert (bool singExc)
- {
- *this = inverse (singExc);
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::invert() IMATH_NOEXCEPT
- {
- *this = inverse();
- return *this;
- }
- template <class T>
- IMATH_CONSTEXPR14 inline Matrix44<T>
- Matrix44<T>::inverse (bool singExc) const
- {
- if (x[0][3] != 0 || x[1][3] != 0 || x[2][3] != 0 || x[3][3] != 1)
- return gjInverse (singExc);
- Matrix44 s (x[1][1] * x[2][2] - x[2][1] * x[1][2],
- x[2][1] * x[0][2] - x[0][1] * x[2][2],
- x[0][1] * x[1][2] - x[1][1] * x[0][2],
- 0,
- x[2][0] * x[1][2] - x[1][0] * x[2][2],
- x[0][0] * x[2][2] - x[2][0] * x[0][2],
- x[1][0] * x[0][2] - x[0][0] * x[1][2],
- 0,
- x[1][0] * x[2][1] - x[2][0] * x[1][1],
- x[2][0] * x[0][1] - x[0][0] * x[2][1],
- x[0][0] * x[1][1] - x[1][0] * x[0][1],
- 0,
- 0,
- 0,
- 0,
- 1);
- T r = x[0][0] * s.x[0][0] + x[0][1] * s.x[1][0] + x[0][2] * s.x[2][0];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- s.x[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s.x[i][j]))
- {
- s.x[i][j] /= r;
- }
- else
- {
- if (singExc)
- throw std::invalid_argument ("Cannot invert singular matrix.");
- return Matrix44();
- }
- }
- }
- }
- s.x[3][0] = -x[3][0] * s.x[0][0] - x[3][1] * s.x[1][0] - x[3][2] * s.x[2][0];
- s.x[3][1] = -x[3][0] * s.x[0][1] - x[3][1] * s.x[1][1] - x[3][2] * s.x[2][1];
- s.x[3][2] = -x[3][0] * s.x[0][2] - x[3][1] * s.x[1][2] - x[3][2] * s.x[2][2];
- return s;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Matrix44<T>
- Matrix44<T>::inverse() const IMATH_NOEXCEPT
- {
- if (x[0][3] != 0 || x[1][3] != 0 || x[2][3] != 0 || x[3][3] != 1)
- return gjInverse();
- Matrix44 s (x[1][1] * x[2][2] - x[2][1] * x[1][2],
- x[2][1] * x[0][2] - x[0][1] * x[2][2],
- x[0][1] * x[1][2] - x[1][1] * x[0][2],
- 0,
- x[2][0] * x[1][2] - x[1][0] * x[2][2],
- x[0][0] * x[2][2] - x[2][0] * x[0][2],
- x[1][0] * x[0][2] - x[0][0] * x[1][2],
- 0,
- x[1][0] * x[2][1] - x[2][0] * x[1][1],
- x[2][0] * x[0][1] - x[0][0] * x[2][1],
- x[0][0] * x[1][1] - x[1][0] * x[0][1],
- 0,
- 0,
- 0,
- 0,
- 1);
- T r = x[0][0] * s.x[0][0] + x[0][1] * s.x[1][0] + x[0][2] * s.x[2][0];
- if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1)
- {
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- s.x[i][j] /= r;
- }
- }
- }
- else
- {
- T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / std::numeric_limits<T>::min();
- for (int i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- if (mr > IMATH_INTERNAL_NAMESPACE::abs (s.x[i][j]))
- {
- s.x[i][j] /= r;
- }
- else
- {
- return Matrix44();
- }
- }
- }
- }
- s.x[3][0] = -x[3][0] * s.x[0][0] - x[3][1] * s.x[1][0] - x[3][2] * s.x[2][0];
- s.x[3][1] = -x[3][0] * s.x[0][1] - x[3][1] * s.x[1][1] - x[3][2] * s.x[2][1];
- s.x[3][2] = -x[3][0] * s.x[0][2] - x[3][1] * s.x[1][2] - x[3][2] * s.x[2][2];
- return s;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline T
- Matrix44<T>::fastMinor (const int r0,
- const int r1,
- const int r2,
- const int c0,
- const int c1,
- const int c2) const IMATH_NOEXCEPT
- {
- return x[r0][c0] * (x[r1][c1] * x[r2][c2] - x[r1][c2] * x[r2][c1]) +
- x[r0][c1] * (x[r1][c2] * x[r2][c0] - x[r1][c0] * x[r2][c2]) +
- x[r0][c2] * (x[r1][c0] * x[r2][c1] - x[r1][c1] * x[r2][c0]);
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline T
- Matrix44<T>::minorOf (const int r, const int c) const IMATH_NOEXCEPT
- {
- int r0 = 0 + (r < 1 ? 1 : 0);
- int r1 = 1 + (r < 2 ? 1 : 0);
- int r2 = 2 + (r < 3 ? 1 : 0);
- int c0 = 0 + (c < 1 ? 1 : 0);
- int c1 = 1 + (c < 2 ? 1 : 0);
- int c2 = 2 + (c < 3 ? 1 : 0);
- Matrix33<T> working (x[r0][c0],
- x[r1][c0],
- x[r2][c0],
- x[r0][c1],
- x[r1][c1],
- x[r2][c1],
- x[r0][c2],
- x[r1][c2],
- x[r2][c2]);
- return working.determinant();
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline T
- Matrix44<T>::determinant() const IMATH_NOEXCEPT
- {
- T sum = (T) 0;
- if (x[0][3] != 0.)
- sum -= x[0][3] * fastMinor (1, 2, 3, 0, 1, 2);
- if (x[1][3] != 0.)
- sum += x[1][3] * fastMinor (0, 2, 3, 0, 1, 2);
- if (x[2][3] != 0.)
- sum -= x[2][3] * fastMinor (0, 1, 3, 0, 1, 2);
- if (x[3][3] != 0.)
- sum += x[3][3] * fastMinor (0, 1, 2, 0, 1, 2);
- return sum;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline T
- Matrix44<T>::trace () const IMATH_NOEXCEPT
- {
- return x[0][0] + x[1][1] + x[2][2] + x[3][3];
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline const Matrix44<T>&
- Matrix44<T>::setEulerAngles (const Vec3<S>& r) IMATH_NOEXCEPT
- {
- S cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx;
- cos_rz = cos ((T) r.z);
- cos_ry = cos ((T) r.y);
- cos_rx = cos ((T) r.x);
- sin_rz = sin ((T) r.z);
- sin_ry = sin ((T) r.y);
- sin_rx = sin ((T) r.x);
- x[0][0] = cos_rz * cos_ry;
- x[0][1] = sin_rz * cos_ry;
- x[0][2] = -sin_ry;
- x[0][3] = 0;
- x[1][0] = -sin_rz * cos_rx + cos_rz * sin_ry * sin_rx;
- x[1][1] = cos_rz * cos_rx + sin_rz * sin_ry * sin_rx;
- x[1][2] = cos_ry * sin_rx;
- x[1][3] = 0;
- x[2][0] = sin_rz * sin_rx + cos_rz * sin_ry * cos_rx;
- x[2][1] = -cos_rz * sin_rx + sin_rz * sin_ry * cos_rx;
- x[2][2] = cos_ry * cos_rx;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::setAxisAngle (const Vec3<S>& axis, S angle) IMATH_NOEXCEPT
- {
- Vec3<S> unit (axis.normalized());
- S sine = std::sin (angle);
- S cosine = std::cos (angle);
- x[0][0] = unit.x * unit.x * (1 - cosine) + cosine;
- x[0][1] = unit.x * unit.y * (1 - cosine) + unit.z * sine;
- x[0][2] = unit.x * unit.z * (1 - cosine) - unit.y * sine;
- x[0][3] = 0;
- x[1][0] = unit.x * unit.y * (1 - cosine) - unit.z * sine;
- x[1][1] = unit.y * unit.y * (1 - cosine) + cosine;
- x[1][2] = unit.y * unit.z * (1 - cosine) + unit.x * sine;
- x[1][3] = 0;
- x[2][0] = unit.x * unit.z * (1 - cosine) + unit.y * sine;
- x[2][1] = unit.y * unit.z * (1 - cosine) - unit.x * sine;
- x[2][2] = unit.z * unit.z * (1 - cosine) + cosine;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE inline const Matrix44<T>&
- Matrix44<T>::rotate (const Vec3<S>& r) IMATH_NOEXCEPT
- {
- S cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx;
- S m00, m01, m02;
- S m10, m11, m12;
- S m20, m21, m22;
- cos_rz = cos ((S) r.z);
- cos_ry = cos ((S) r.y);
- cos_rx = cos ((S) r.x);
- sin_rz = sin ((S) r.z);
- sin_ry = sin ((S) r.y);
- sin_rx = sin ((S) r.x);
- m00 = cos_rz * cos_ry;
- m01 = sin_rz * cos_ry;
- m02 = -sin_ry;
- m10 = -sin_rz * cos_rx + cos_rz * sin_ry * sin_rx;
- m11 = cos_rz * cos_rx + sin_rz * sin_ry * sin_rx;
- m12 = cos_ry * sin_rx;
- m20 = -sin_rz * -sin_rx + cos_rz * sin_ry * cos_rx;
- m21 = cos_rz * -sin_rx + sin_rz * sin_ry * cos_rx;
- m22 = cos_ry * cos_rx;
- Matrix44<T> P (*this);
- x[0][0] = P.x[0][0] * m00 + P.x[1][0] * m01 + P.x[2][0] * m02;
- x[0][1] = P.x[0][1] * m00 + P.x[1][1] * m01 + P.x[2][1] * m02;
- x[0][2] = P.x[0][2] * m00 + P.x[1][2] * m01 + P.x[2][2] * m02;
- x[0][3] = P.x[0][3] * m00 + P.x[1][3] * m01 + P.x[2][3] * m02;
- x[1][0] = P.x[0][0] * m10 + P.x[1][0] * m11 + P.x[2][0] * m12;
- x[1][1] = P.x[0][1] * m10 + P.x[1][1] * m11 + P.x[2][1] * m12;
- x[1][2] = P.x[0][2] * m10 + P.x[1][2] * m11 + P.x[2][2] * m12;
- x[1][3] = P.x[0][3] * m10 + P.x[1][3] * m11 + P.x[2][3] * m12;
- x[2][0] = P.x[0][0] * m20 + P.x[1][0] * m21 + P.x[2][0] * m22;
- x[2][1] = P.x[0][1] * m20 + P.x[1][1] * m21 + P.x[2][1] * m22;
- x[2][2] = P.x[0][2] * m20 + P.x[1][2] * m21 + P.x[2][2] * m22;
- x[2][3] = P.x[0][3] * m20 + P.x[1][3] * m21 + P.x[2][3] * m22;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::setScale (T s) IMATH_NOEXCEPT
- {
- //
- // Set the matrix to a 3D homogeneous transform scale:
- // | s 0 0 0 |
- // | 0 s 0 0 |
- // | 0 0 s 0 |
- // | 0 0 0 1 |
- //
- x[0][0] = s;
- x[0][1] = 0;
- x[0][2] = 0;
- x[0][3] = 0;
- x[1][0] = 0;
- x[1][1] = s;
- x[1][2] = 0;
- x[1][3] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = s;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::setScale (const Vec3<S>& s) IMATH_NOEXCEPT
- {
- //
- // Set the matrix to a 3D homogeneous transform scale:
- // | s.x 0 0 0 |
- // | 0 s.y 0 0 |
- // | 0 0 s.z 0 |
- // | 0 0 0 1 |
- //
- x[0][0] = s.x;
- x[0][1] = 0;
- x[0][2] = 0;
- x[0][3] = 0;
- x[1][0] = 0;
- x[1][1] = s.y;
- x[1][2] = 0;
- x[1][3] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = s.z;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::scale (const Vec3<S>& s) IMATH_NOEXCEPT
- {
- x[0][0] *= s.x;
- x[0][1] *= s.x;
- x[0][2] *= s.x;
- x[0][3] *= s.x;
- x[1][0] *= s.y;
- x[1][1] *= s.y;
- x[1][2] *= s.y;
- x[1][3] *= s.y;
- x[2][0] *= s.z;
- x[2][1] *= s.z;
- x[2][2] *= s.z;
- x[2][3] *= s.z;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::setTranslation (const Vec3<S>& t) IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[0][3] = 0;
- x[1][0] = 0;
- x[1][1] = 1;
- x[1][2] = 0;
- x[1][3] = 0;
- x[2][0] = 0;
- x[2][1] = 0;
- x[2][2] = 1;
- x[2][3] = 0;
- x[3][0] = t.x;
- x[3][1] = t.y;
- x[3][2] = t.z;
- x[3][3] = 1;
- return *this;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline const Vec3<T>
- Matrix44<T>::translation() const IMATH_NOEXCEPT
- {
- return Vec3<T> (x[3][0], x[3][1], x[3][2]);
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::translate (const Vec3<S>& t) IMATH_NOEXCEPT
- {
- x[3][0] += t.x * x[0][0] + t.y * x[1][0] + t.z * x[2][0];
- x[3][1] += t.x * x[0][1] + t.y * x[1][1] + t.z * x[2][1];
- x[3][2] += t.x * x[0][2] + t.y * x[1][2] + t.z * x[2][2];
- x[3][3] += t.x * x[0][3] + t.y * x[1][3] + t.z * x[2][3];
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::setShear (const Vec3<S>& h) IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = 0;
- x[0][2] = 0;
- x[0][3] = 0;
- x[1][0] = h.x;
- x[1][1] = 1;
- x[1][2] = 0;
- x[1][3] = 0;
- x[2][0] = h.y;
- x[2][1] = h.z;
- x[2][2] = 1;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::setShear (const Shear6<S>& h) IMATH_NOEXCEPT
- {
- x[0][0] = 1;
- x[0][1] = h.yx;
- x[0][2] = h.zx;
- x[0][3] = 0;
- x[1][0] = h.xy;
- x[1][1] = 1;
- x[1][2] = h.zy;
- x[1][3] = 0;
- x[2][0] = h.xz;
- x[2][1] = h.yz;
- x[2][2] = 1;
- x[2][3] = 0;
- x[3][0] = 0;
- x[3][1] = 0;
- x[3][2] = 0;
- x[3][3] = 1;
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::shear (const Vec3<S>& h) IMATH_NOEXCEPT
- {
- //
- // In this case, we don't need a temp. copy of the matrix
- // because we never use a value on the RHS after we've
- // changed it on the LHS.
- //
- for (int i = 0; i < 4; i++)
- {
- x[2][i] += h.y * x[0][i] + h.z * x[1][i];
- x[1][i] += h.x * x[0][i];
- }
- return *this;
- }
- template <class T>
- template <class S>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline const Matrix44<T>&
- Matrix44<T>::shear (const Shear6<S>& h) IMATH_NOEXCEPT
- {
- Matrix44<T> P (*this);
- for (int i = 0; i < 4; i++)
- {
- x[0][i] = P.x[0][i] + h.yx * P.x[1][i] + h.zx * P.x[2][i];
- x[1][i] = h.xy * P.x[0][i] + P.x[1][i] + h.zy * P.x[2][i];
- x[2][i] = h.xz * P.x[0][i] + h.yz * P.x[1][i] + P.x[2][i];
- }
- return *this;
- }
- //--------------------------------
- // Implementation of stream output
- //--------------------------------
- template <class T>
- std::ostream&
- operator<< (std::ostream& s, const Matrix22<T>& m)
- {
- std::ios_base::fmtflags oldFlags = s.flags();
- int width;
- if (s.flags() & std::ios_base::fixed)
- {
- s.setf (std::ios_base::showpoint);
- width = static_cast<int> (s.precision()) + 5;
- }
- else
- {
- s.setf (std::ios_base::scientific);
- s.setf (std::ios_base::showpoint);
- width = static_cast<int> (s.precision()) + 8;
- }
- s << "(" << std::setw (width) << m[0][0] << " " << std::setw (width) << m[0][1] << "\n"
- <<
- " " << std::setw (width) << m[1][0] << " " << std::setw (width) << m[1][1] << ")\n";
- s.flags (oldFlags);
- return s;
- }
- template <class T>
- std::ostream&
- operator<< (std::ostream& s, const Matrix33<T>& m)
- {
- std::ios_base::fmtflags oldFlags = s.flags();
- int width;
- if (s.flags() & std::ios_base::fixed)
- {
- s.setf (std::ios_base::showpoint);
- width = static_cast<int> (s.precision()) + 5;
- }
- else
- {
- s.setf (std::ios_base::scientific);
- s.setf (std::ios_base::showpoint);
- width = static_cast<int> (s.precision()) + 8;
- }
- s << "(" << std::setw (width) << m[0][0] << " " << std::setw (width) << m[0][1] << " "
- << std::setw (width) << m[0][2] << "\n"
- <<
- " " << std::setw (width) << m[1][0] << " " << std::setw (width) << m[1][1] << " "
- << std::setw (width) << m[1][2] << "\n"
- <<
- " " << std::setw (width) << m[2][0] << " " << std::setw (width) << m[2][1] << " "
- << std::setw (width) << m[2][2] << ")\n";
- s.flags (oldFlags);
- return s;
- }
- template <class T>
- std::ostream&
- operator<< (std::ostream& s, const Matrix44<T>& m)
- {
- std::ios_base::fmtflags oldFlags = s.flags();
- int width;
- if (s.flags() & std::ios_base::fixed)
- {
- s.setf (std::ios_base::showpoint);
- width = static_cast<int> (s.precision()) + 5;
- }
- else
- {
- s.setf (std::ios_base::scientific);
- s.setf (std::ios_base::showpoint);
- width = static_cast<int> (s.precision()) + 8;
- }
- s << "(" << std::setw (width) << m[0][0] << " " << std::setw (width) << m[0][1] << " "
- << std::setw (width) << m[0][2] << " " << std::setw (width) << m[0][3] << "\n"
- <<
- " " << std::setw (width) << m[1][0] << " " << std::setw (width) << m[1][1] << " "
- << std::setw (width) << m[1][2] << " " << std::setw (width) << m[1][3] << "\n"
- <<
- " " << std::setw (width) << m[2][0] << " " << std::setw (width) << m[2][1] << " "
- << std::setw (width) << m[2][2] << " " << std::setw (width) << m[2][3] << "\n"
- <<
- " " << std::setw (width) << m[3][0] << " " << std::setw (width) << m[3][1] << " "
- << std::setw (width) << m[3][2] << " " << std::setw (width) << m[3][3] << ")\n";
- s.flags (oldFlags);
- return s;
- }
- //---------------------------------------------------------------
- // Implementation of vector-times-matrix multiplication operators
- //---------------------------------------------------------------
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec2<S>&
- operator*= (Vec2<S>& v, const Matrix22<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1]);
- v.x = x;
- v.y = y;
- return v;
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec2<S>
- operator* (const Vec2<S>& v, const Matrix22<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1]);
- return Vec2<S> (x, y);
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec2<S>&
- operator*= (Vec2<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + m.x[2][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + m.x[2][1]);
- S w = S (v.x * m.x[0][2] + v.y * m.x[1][2] + m.x[2][2]);
- v.x = x / w;
- v.y = y / w;
- return v;
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec2<S>
- operator* (const Vec2<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + m.x[2][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + m.x[2][1]);
- S w = S (v.x * m.x[0][2] + v.y * m.x[1][2] + m.x[2][2]);
- return Vec2<S> (x / w, y / w);
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec3<S>&
- operator*= (Vec3<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + v.z * m.x[2][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + v.z * m.x[2][1]);
- S z = S (v.x * m.x[0][2] + v.y * m.x[1][2] + v.z * m.x[2][2]);
- v.x = x;
- v.y = y;
- v.z = z;
- return v;
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec3<S>
- operator* (const Vec3<S>& v, const Matrix33<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + v.z * m.x[2][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + v.z * m.x[2][1]);
- S z = S (v.x * m.x[0][2] + v.y * m.x[1][2] + v.z * m.x[2][2]);
- return Vec3<S> (x, y, z);
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec3<S>&
- operator*= (Vec3<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + v.z * m.x[2][0] + m.x[3][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + v.z * m.x[2][1] + m.x[3][1]);
- S z = S (v.x * m.x[0][2] + v.y * m.x[1][2] + v.z * m.x[2][2] + m.x[3][2]);
- S w = S (v.x * m.x[0][3] + v.y * m.x[1][3] + v.z * m.x[2][3] + m.x[3][3]);
- v.x = x / w;
- v.y = y / w;
- v.z = z / w;
- return v;
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec3<S>
- IMATH_HOSTDEVICE operator* (const Vec3<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + v.z * m.x[2][0] + m.x[3][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + v.z * m.x[2][1] + m.x[3][1]);
- S z = S (v.x * m.x[0][2] + v.y * m.x[1][2] + v.z * m.x[2][2] + m.x[3][2]);
- S w = S (v.x * m.x[0][3] + v.y * m.x[1][3] + v.z * m.x[2][3] + m.x[3][3]);
- return Vec3<S> (x / w, y / w, z / w);
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline const Vec4<S>&
- IMATH_HOSTDEVICE operator*= (Vec4<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + v.z * m.x[2][0] + v.w * m.x[3][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + v.z * m.x[2][1] + v.w * m.x[3][1]);
- S z = S (v.x * m.x[0][2] + v.y * m.x[1][2] + v.z * m.x[2][2] + v.w * m.x[3][2]);
- S w = S (v.x * m.x[0][3] + v.y * m.x[1][3] + v.z * m.x[2][3] + v.w * m.x[3][3]);
- v.x = x;
- v.y = y;
- v.z = z;
- v.w = w;
- return v;
- }
- template <class S, class T>
- IMATH_HOSTDEVICE inline Vec4<S>
- IMATH_HOSTDEVICE operator* (const Vec4<S>& v, const Matrix44<T>& m) IMATH_NOEXCEPT
- {
- S x = S (v.x * m.x[0][0] + v.y * m.x[1][0] + v.z * m.x[2][0] + v.w * m.x[3][0]);
- S y = S (v.x * m.x[0][1] + v.y * m.x[1][1] + v.z * m.x[2][1] + v.w * m.x[3][1]);
- S z = S (v.x * m.x[0][2] + v.y * m.x[1][2] + v.z * m.x[2][2] + v.w * m.x[3][2]);
- S w = S (v.x * m.x[0][3] + v.y * m.x[1][3] + v.z * m.x[2][3] + v.w * m.x[3][3]);
- return Vec4<S> (x, y, z, w);
- }
- IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
- #endif // INCLUDED_IMATHMATRIX_H
|