| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <AzCore/Math/Spline.h>
- #include <AzCore/Math/Aabb.h>
- #include <AzCore/Math/Matrix3x3.h>
- #include <AzCore/Math/Vector3.h>
- #include <AzCore/UnitTest/TestTypes.h>
- #include <AZTestShared/Math/MathTestHelpers.h>
- using namespace AZ;
- namespace UnitTest
- {
- class MATH_SplineTest
- : public LeakDetectionFixture
- {
- public:
- void Linear_NearestAddressFromPosition()
- {
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- PositionSplineQueryResult posSplineQueryResult = linearSpline.GetNearestAddressPosition(Vector3(7.5f, 2.5f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = linearSpline.GetNearestAddressPosition(Vector3(-1.0f, -1.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = linearSpline.GetNearestAddressPosition(Vector3(-1.0f, 6.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = linearSpline.GetNearestAddressPosition(Vector3(2.5f, 6.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- PositionSplineQueryResult posSplineQueryResult = linearSpline.GetNearestAddressPosition(Vector3(-2.0f, 2.5f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = linearSpline.GetNearestAddressPosition(Vector3(-2.0f, 4.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.2f, AZ::Constants::Tolerance);
- }
- }
- }
- void Linear_NearestAddressFromDirection()
- {
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- RaySplineQueryResult raySplineQueryResult = linearSpline.GetNearestAddressRay(Vector3(2.5f, -2.5f, 1.0f), Vector3(0.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = linearSpline.GetNearestAddressRay(Vector3(2.5f, -10.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = linearSpline.GetNearestAddressRay(Vector3(7.5f, 2.5f, 0.0f), Vector3(-1.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = linearSpline.GetNearestAddressRay(Vector3(-2.5f, 2.5f, -1.0f), Vector3(1.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- RaySplineQueryResult raySplineQueryResult = linearSpline.GetNearestAddressRay(Vector3(-2.5f, 2.5f, 0.0f), Vector3(0.0f, 0.0f, -1.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = linearSpline.GetNearestAddressRay(Vector3(-2.5f, 2.5f, 0.0f), Vector3(1.0f, 0.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- }
- }
- void Linear_AddressByDistance()
- {
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(7.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(15.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(11.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.2f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(3.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.6f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(20.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(-5.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(17.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByDistance(20.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- }
- void Linear_AddressByFraction()
- {
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(0.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(1.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(0.6f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.8f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(0.2f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.6f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(1.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(-0.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(0.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(1.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = linearSpline.GetAddressByFraction(0.8f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.2f, AZ::Constants::Tolerance);
- }
- }
- }
- void Linear_GetPosition()
- {
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- Vector3 position = linearSpline.GetPosition(linearSpline.GetAddressByFraction(0.5f));
- EXPECT_THAT(position, IsClose(Vector3(5.0f, 2.5f, 0.0f)));
- }
- {
- Vector3 position = linearSpline.GetPosition(SplineAddress());
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = linearSpline.GetPosition(SplineAddress(linearSpline.GetSegmentCount() - 1, 1.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 5.0f, 0.0f)));
- }
- {
- Vector3 position = linearSpline.GetPosition(linearSpline.GetAddressByDistance(4.0f));
- EXPECT_THAT(position, IsClose(Vector3(4.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = linearSpline.GetPosition(SplineAddress(3, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 5.0f, 0.0f)));
- }
- {
- // out of bounds access (return position of last vertex - clamped)
- Vector3 position = linearSpline.GetPosition(SplineAddress(5, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 5.0f, 0.0f)));
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- Vector3 position = linearSpline.GetPosition(linearSpline.GetAddressByFraction(0.5f));
- EXPECT_THAT(position, IsClose(Vector3(5.0f, 5.0f, 0.0f)));
- }
- {
- Vector3 position = linearSpline.GetPosition(linearSpline.GetAddressByDistance(20.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = linearSpline.GetPosition(linearSpline.GetAddressByDistance(18.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 2.0f, 0.0f)));
- }
- {
- // out of bounds access (return position of last/first vertex - clamped)
- Vector3 position = linearSpline.GetPosition(SplineAddress(5, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- }
- }
- void Linear_GetNormal()
- {
- {
- LinearSpline linearSpline;
- // n shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- {
- Vector3 normal = linearSpline.GetNormal(linearSpline.GetAddressByFraction(0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, 1.0f, 0.0f)));
- }
- {
- Vector3 normal = linearSpline.GetNormal(SplineAddress());
- EXPECT_THAT(normal, IsClose(Vector3(-1.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 normal = linearSpline.GetNormal(SplineAddress(linearSpline.GetSegmentCount() - 1, 1.0f));
- EXPECT_THAT(normal, IsClose(Vector3(1.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 normal = linearSpline.GetNormal(linearSpline.GetAddressByDistance(4.0f));
- EXPECT_THAT(normal, IsClose(Vector3(-1.0f, 0.0f, 0.0f)));
- }
- {
- // out of bounds access (return normal of last vertex - clamped)
- Vector3 normal = linearSpline.GetNormal(SplineAddress(5, 0.0f));
- EXPECT_THAT(normal, IsClose(Vector3(1.0f, 0.0f, 0.0f)));
- }
- }
- {
- LinearSpline linearSpline;
- // n shape spline (yz plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 5.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 5.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- Vector3 normal = linearSpline.GetNormal(linearSpline.GetAddressByDistance(4.0f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // n shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- {
- Vector3 normal = linearSpline.GetNormal(linearSpline.GetAddressByDistance(20.0f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, -1.0f, 0.0f)));
- }
- {
- Vector3 normal = linearSpline.GetNormal(linearSpline.GetAddressByFraction(0.8f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, -1.0f, 0.0f)));
- }
- }
- }
- void Linear_GetTangent()
- {
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- Vector3 tangent = linearSpline.GetTangent(linearSpline.GetAddressByFraction(0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(0.0f, 1.0f, 0.0f)));
- }
- {
- Vector3 tangent = linearSpline.GetTangent(SplineAddress());
- EXPECT_THAT(tangent, IsClose(Vector3(1.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 tangent = linearSpline.GetTangent(SplineAddress(linearSpline.GetSegmentCount() - 1, 1.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(-1.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 tangent = linearSpline.GetTangent(linearSpline.GetAddressByDistance(4.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(1.0f, 0.0f, 0.0f)));
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- Vector3 tangent = linearSpline.GetTangent(SplineAddress(linearSpline.GetSegmentCount() - 1, 1.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(0.0f, -1.0f, 0.0f)));
- }
- {
- Vector3 tangent = linearSpline.GetTangent(linearSpline.GetAddressByDistance(16.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(0.0f, -1.0f, 0.0f)));
- }
- }
- }
- void Linear_Length()
- {
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- float splineLength = linearSpline.GetSplineLength();
- EXPECT_NEAR(splineLength, 15.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = linearSpline.GetSegmentLength(0);
- EXPECT_NEAR(segmentLength, 5.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = linearSpline.GetSegmentLength(2);
- EXPECT_NEAR(segmentLength, 5.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = linearSpline.GetSegmentLength(4);
- EXPECT_NEAR(segmentLength, 0.0f, AZ::Constants::Tolerance);
- }
- }
- {
- LinearSpline linearSpline;
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(2.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(2.0f, 3.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(4.0f, 3.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(4.0f, 10.0f, 0.0f));
- {
- float splineLength = linearSpline.GetSplineLength();
- EXPECT_NEAR(splineLength, 14.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = linearSpline.GetSegmentLength(0);
- EXPECT_NEAR(segmentLength, 2.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = linearSpline.GetSegmentLength(3);
- EXPECT_NEAR(segmentLength, 7.0f, AZ::Constants::Tolerance);
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // backward C shaped spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- float splineLength = linearSpline.GetSplineLength();
- EXPECT_NEAR(splineLength, 20.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = linearSpline.GetSegmentLength(3);
- EXPECT_NEAR(segmentLength, 5.0f, AZ::Constants::Tolerance);
- }
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // single line (y axis)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- {
- float splineLength = linearSpline.GetSplineLength();
- EXPECT_NEAR(splineLength, 20.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = linearSpline.GetSegmentLength(1);
- EXPECT_NEAR(segmentLength, 10.0f, AZ::Constants::Tolerance);
- }
- }
- }
- void Linear_Aabb()
- {
- {
- LinearSpline linearSpline;
- // slight n curve spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZ::Aabb aabb;
- linearSpline.GetAabb(aabb);
- EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(10.0f, 10.0f, 0.0f)));
- }
- {
- LinearSpline linearSpline;
- linearSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZ::Aabb aabb;
- linearSpline.GetAabb(aabb);
- EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(10.0f, 10.0f, 0.0f)));
- }
- {
- LinearSpline linearSpline;
- AZ::Transform translation = AZ::Transform::CreateFromMatrix3x3AndTranslation(Matrix3x3::CreateIdentity(), Vector3(25.0f, 25.0f, 0.0f));
- // slight n curve spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZ::Aabb aabb;
- linearSpline.GetAabb(aabb, translation);
- EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(25.0f, 25.0f, 0.0f)));
- EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(35.0f, 35.0f, 0.0f)));
- }
- }
- void Linear_GetLength()
- {
- {
- LinearSpline spline;
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 20.0f, 0.0f));
- auto distance = spline.GetLength(AZ::SplineAddress(1, 0.5f));
- EXPECT_NEAR(distance, 15.0f, 1e-4);
- distance = spline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(distance, 0.0f, 1e-4);
- distance = spline.GetLength(AZ::SplineAddress(1, 1.0f));
- EXPECT_NEAR(distance, 20.0f, 1e-4);
- distance = spline.GetLength(AZ::SplineAddress(5, 1.0f));
- EXPECT_NEAR(distance, spline.GetSplineLength(), 1e-4);
- }
- {
- LinearSpline spline;
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- spline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- spline.m_vertexContainer.AddVertex(Vector3(20.0f, 20.0f, 10.0f));
- spline.m_vertexContainer.AddVertex(Vector3(10.0f, 15.0f, -10.0f));
- float length = spline.GetSplineLength();
- for (float t = 0.0f; t <= length; t += 0.5f)
- {
- auto result = spline.GetLength(spline.GetAddressByDistance(t));
- EXPECT_NEAR(result, t, 1e-4);
- }
- }
- {
- LinearSpline spline;
- auto result = spline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(result, 0.0f, 1e-4);
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- result = spline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(result, 0.0f, 1e-4);
- }
- }
- void CatmullRom_NearestAddressFromPosition()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight backward C curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- PositionSplineQueryResult posSplineQueryResult = catmullRomSpline.GetNearestAddressPosition(Vector3(7.5f, 2.5f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = catmullRomSpline.GetNearestAddressPosition(Vector3(-1.0f, -1.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = catmullRomSpline.GetNearestAddressPosition(Vector3(-1.0f, 6.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = catmullRomSpline.GetNearestAddressPosition(Vector3(2.5f, 6.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- PositionSplineQueryResult posSplineQueryResult = catmullRomSpline.GetNearestAddressPosition(Vector3(5.0f, -2.5f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- }
- }
- void CatmullRom_NearestAddressFromDirection()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight backward C curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- RaySplineQueryResult raySplineQueryResult = catmullRomSpline.GetNearestAddressRay(Vector3(2.5f, -2.5f, 1.0f), Vector3(0.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = catmullRomSpline.GetNearestAddressRay(Vector3(2.5f, -10.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = catmullRomSpline.GetNearestAddressRay(Vector3(7.5f, 2.5f, 0.0f), Vector3(-1.0f, 0.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = catmullRomSpline.GetNearestAddressRay(Vector3(-2.5f, 7.5f, -1.0f), Vector3(1.0f, 0.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight backward C curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 5.0f, 0.0f));
- {
- RaySplineQueryResult raySplineQueryResult = catmullRomSpline.GetNearestAddressRay(Vector3(-2.5f, 2.5f, 0.0f), Vector3(0.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- }
- }
- /*
- Catmull-Rom Sample Points - (0.0f, 0.0f, 0.0f), (0.0f, 10.0f, 0.0f), (10.0f, 10.0f, 0.0f), (10.0f, 0.0f, 0.0f)
- (calculated using https://www.desmos.com/calculator/552cpvzfxw)
- t = 0 pos = (0.0f, 10.0f, 0.0f)
- t = 0.125 pos = (0.83984375.0f, 10.546875.0f, 0.0f)
- t = 0.25 pos = (2.03125.0f, 10.9375.0f, 0.0f)
- t = 0.375 pos = (3.45703125.0f, 11.171875.0f, 0.0f)
- t = 0.5 pos = (5.0.0f, 11.25.0f, 0.0f)
- t = 0.625 pos = (6.54296875.0f, 11.171875.0f, 0.0f)
- t = 0.75 pos = (7.96875.0f, 10.9375.0f, 0.0f)
- t = 0.875 pos = (9.16015625.0f, 10.546875.0f, 0.0f)
- t = 1 pos = (10.0f, 10.0f)
- delta = (0.83984375.0f, 0.546875.0f, 0.0f) length = 1.00220
- delta = (1.19140625.0f, 0.390625.0f, 0.0f) length = 1.25381
- delta = (1.42578125.0f, 0.234375.0f, 0.0f) length = 1.44492
- delta = (1.54296875.0f, 0.078125.0f, 0.0f) length = 1.54495
- delta = (1.54296875.0f, -0.078125.0f, 0.0f) length = 1.54495
- delta = (1.42578125.0f, -0.234375.0f, 0.0f) length = 1.44492
- delta = (1.19140625.0f, -0.390625.0f, 0.0f) length = 1.25381
- delta = (0.83984375.0f, -0.546875.0f, 0.0f) length = 1.00220
- total = 10.49176
- */
- void CatmullRom_AddressByDistance()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByDistance(20.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByDistance(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- // note: spline length is approx 10.49176
- SplineAddress splineAddress = catmullRomSpline.GetAddressByDistance(5.24588f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(0.5f, splineAddress.m_segmentFraction, 0.0001f);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByDistance(-10.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByDistance(50.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByDistance(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- }
- }
- void CatmullRom_AddressByFraction()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByFraction(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByFraction(1.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByFraction(0.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByFraction(0.75f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.75f, AZ::Constants::Tolerance);
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByFraction(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByFraction(1.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = catmullRomSpline.GetAddressByFraction(0.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- }
- }
- void CatmullRom_GetPosition()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(1, 0.125f));
- EXPECT_THAT(position, IsClose(Vector3(0.83984375f, 10.546875f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(1, 0.625f));
- EXPECT_THAT(position, IsClose(Vector3(6.54296875f, 11.171875f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(3, 0.5f));
- EXPECT_THAT(position, IsClose(Vector3(10.0f, 10.0f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(0, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 10.0f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(1, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 10.0f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(2, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(10.0f, 10.0f, 0.0f)));
- }
- {
- // out of bounds access (return position of last vertex that is not a control point - clamped)
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(5, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(10.0f, 10.0f, 0.0f)));
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(1, 0.125f));
- EXPECT_THAT(position, IsClose(Vector3(0.83984375f, 10.546875f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(1, 0.625f));
- EXPECT_THAT(position, IsClose(Vector3(6.54296875f, 11.171875f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(0, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(3, 1.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(0, 0.5f));
- EXPECT_THAT(position, IsClose(Vector3(-1.25f, 5.0f, 0.0f)));
- }
- {
- // out of bounds access (return position of first/last vertex - clamped)
- Vector3 position = catmullRomSpline.GetPosition(SplineAddress(5, 0.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- }
- }
- void CatmullRom_GetNormal()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress());
- EXPECT_THAT(normal, IsClose(Vector3(-5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(1, 0.0f));
- EXPECT_THAT(normal, IsClose(Vector3(-5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(1, 1.0f));
- EXPECT_THAT(normal, IsClose(Vector3(5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(1, 0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, 12.5f, 0.0f).GetNormalized()));
- }
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(2, 0.0f));
- EXPECT_THAT(normal, IsClose(Vector3(5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(3, 0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- {
- // out of bounds access (return normal of last vertex that is not a control point - clamped)
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(5, 0.0f));
- EXPECT_THAT(normal, IsClose(Vector3(5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress());
- EXPECT_THAT(normal, IsClose(Vector3(-5.0f, -5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(1, 0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, 1.0f, 0.0f)));
- }
- {
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(3, 0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, -1.0f, 0.0f)));
- }
- {
- // out of bounds access (return normal of last vertex that is not a control point - clamped)
- Vector3 normal = catmullRomSpline.GetNormal(SplineAddress(5, 0.0f));
- EXPECT_THAT(normal, IsClose(Vector3(-5.0f, -5.0f, 0.0f).GetNormalized()));
- }
- }
- }
- void CatmullRom_GetTangent()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(1, 0.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(1, 1.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(5.0f, -5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(1, 0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(12.5f, 0.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(2, 0.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(5.0f, -5.0f, 0.0f).GetNormalized()));
- }
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(3, 0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(5.0f, -5.0f, 0.0f).GetNormalized()));
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(3, 0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(-1.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(1, 0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(1.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 tangent = catmullRomSpline.GetTangent(SplineAddress(3, 1.0f));
- EXPECT_THAT(tangent, IsClose(Vector3(-5.0f, 5.0f, 0.0f).GetNormalized()));
- }
- }
- }
- void CatmullRom_Length()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- float length = catmullRomSpline.GetSplineLength();
- EXPECT_NEAR(10.49176f, length, 0.0001f);
- }
- {
- float length = catmullRomSpline.GetSegmentLength(0);
- EXPECT_NEAR(length, 0.0f, AZ::Constants::Tolerance);
- }
- {
- float length = catmullRomSpline.GetSegmentLength(1);
- EXPECT_NEAR(10.49176f, length, 0.0001f);
- }
- {
- float length = catmullRomSpline.GetSegmentLength((size_t)-1);
- EXPECT_NEAR(length, 0.0f, AZ::Constants::Tolerance);
- }
- {
- float length = catmullRomSpline.GetSegmentLength(10);
- EXPECT_NEAR(length, 0.0f, AZ::Constants::Tolerance);
- }
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- float length = catmullRomSpline.GetSplineLength();
- EXPECT_NEAR(41.96704, length, 0.0001f);
- }
- {
- float length = catmullRomSpline.GetSegmentLength(3);
- EXPECT_NEAR(10.49176f, length, 0.0001f);
- }
- }
- }
- void CatmullRom_Aabb()
- {
- {
- CatmullRomSpline catmullRomSpline;
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZ::Aabb aabb;
- catmullRomSpline.GetAabb(aabb);
- EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(0.0f, 10.0f, 0.0f)));
- EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(10.0f, 11.25f, 0.0f)));
- }
- {
- CatmullRomSpline catmullRomSpline;
- catmullRomSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- catmullRomSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZ::Aabb aabb;
- catmullRomSpline.GetAabb(aabb);
- EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(-1.25f, -1.25f, 0.0f)));
- EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(11.25f, 11.25f, 0.0f)));
- }
- }
- void CatmullRom_GetLength()
- {
- {
- CatmullRomSpline spline;
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- spline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- spline.m_vertexContainer.AddVertex(Vector3(20.0f, 20.0f, 10.0f));
- spline.m_vertexContainer.AddVertex(Vector3(10.0f, 15.0f, -10.0f));
- float length = spline.GetSplineLength();
- for (float t = 0.0f; t <= length; t += 0.5f)
- {
- auto result = spline.GetLength(spline.GetAddressByDistance(t));
- EXPECT_NEAR(result, t, 1e-4);
- }
- auto distance = spline.GetLength(AZ::SplineAddress(3, 0.5f));
- EXPECT_NEAR(distance, spline.GetSplineLength(), 1e-4);
- distance = spline.GetLength(AZ::SplineAddress(4, 1.0f));
- EXPECT_NEAR(distance, spline.GetSplineLength(), 1e-4);
- distance = spline.GetLength(AZ::SplineAddress(5, 1.0f));
- EXPECT_NEAR(distance, spline.GetSplineLength(), 1e-4);
- }
- {
- CatmullRomSpline spline;
- auto result = spline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(result, 0.0f, 1e-4);
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- result = spline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(result, 0.0f, 1e-4);
- }
- {
- CatmullRomSpline spline;
- spline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- spline.m_vertexContainer.AddVertex(Vector3(5.0f, 5.0f, 0.0f));
- auto result = spline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(result, 0.0f, 1e-4);
- }
- }
- void Bezier_NearestAddressFromPosition()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- PositionSplineQueryResult posSplineQueryResult = bezierSpline.GetNearestAddressPosition(Vector3(-1.0f, -1.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = bezierSpline.GetNearestAddressPosition(Vector3(5.0f, 12.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = bezierSpline.GetNearestAddressPosition(Vector3(12.0f, -1.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- PositionSplineQueryResult posSplineQueryResult = bezierSpline.GetNearestAddressPosition(Vector3(5.0f, -12.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- PositionSplineQueryResult posSplineQueryResult = bezierSpline.GetNearestAddressPosition(Vector3(12.0f, 12.0f, 0.0f));
- EXPECT_EQ(posSplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(posSplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- }
- void Bezier_NearestAddressFromDirection()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- RaySplineQueryResult raySplineQueryResult = bezierSpline.GetNearestAddressRay(Vector3(-1.0f, -1.0f, 0.0f), Vector3(-1.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = bezierSpline.GetNearestAddressRay(Vector3(5.0f, 12.0f, 0.0f), Vector3(0.0f, -1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- {
- RaySplineQueryResult raySplineQueryResult = bezierSpline.GetNearestAddressRay(Vector3(12.0f, -1.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- RaySplineQueryResult raySplineQueryResult = bezierSpline.GetNearestAddressRay(Vector3(-10.0f, -10.0f, 0.0f), Vector3(1.0f, 0.0f, 0.0f));
- EXPECT_EQ(raySplineQueryResult.m_splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(raySplineQueryResult.m_splineAddress.m_segmentFraction, 0.5f, AZ::Constants::Tolerance);
- }
- }
- }
- void Bezier_AddressByDistance()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByDistance(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByDistance(-5.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByDistance(100.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByDistance(100.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- }
- }
- void Bezier_AddressByFraction()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByFraction(0.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByFraction(-0.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 0);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByFraction(2.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByFraction(1.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, AZ::Constants::Tolerance);
- }
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByFraction(0.5f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 1);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.5f, Constants::Tolerance);
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- SplineAddress splineAddress = bezierSpline.GetAddressByFraction(1.0f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 3);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 1.0f, Constants::Tolerance);
- }
- {
- // testing a fraction far away from a boundary between segments as points right on
- // a boundary could fall into either segment depending on floating point differences
- SplineAddress splineAddress = bezierSpline.GetAddressByFraction(0.6f);
- EXPECT_EQ(splineAddress.m_segmentIndex, 2);
- EXPECT_NEAR(splineAddress.m_segmentFraction, 0.4f, Constants::Tolerance);
- }
- }
- }
- void Bezier_GetPosition()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 position = bezierSpline.GetPosition(bezierSpline.GetAddressByFraction(1.0f));
- EXPECT_THAT(position, IsClose(Vector3(10.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = bezierSpline.GetPosition(SplineAddress());
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = bezierSpline.GetPosition(SplineAddress(bezierSpline.GetSegmentCount() - 1, 1.0f));
- EXPECT_THAT(position, IsClose(Vector3(10.0f, 0.0f, 0.0f)));
- }
- {
- // out of bounds access (return position of last vertex - clamped)
- Vector3 position = bezierSpline.GetPosition(SplineAddress(5, 0.5f));
- EXPECT_THAT(position, IsClose(Vector3(10.0f, 0.0f, 0.0f)));
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 position = bezierSpline.GetPosition(SplineAddress());
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 position = bezierSpline.GetPosition(SplineAddress(bezierSpline.GetSegmentCount() - 1, 1.0f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- {
- // out of bounds access (return position of last/first vertex - clamped)
- Vector3 position = bezierSpline.GetPosition(SplineAddress(5, 0.5f));
- EXPECT_THAT(position, IsClose(Vector3(0.0f, 0.0f, 0.0f)));
- }
- }
- }
- void Bezier_GetNormal()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(1, 0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, 1.0f, 0.0f)));
- }
- {
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(0, 0.0f));
- EXPECT_THAT(normal, IsCloseTolerance(Vector3(-0.955f, -0.294f, 0.0f), 1e-3f));
- }
- {
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(3, 0.0f));
- EXPECT_THAT(normal, IsCloseTolerance(Vector3(0.955f, -0.294f, 0.0f), 1e-3f));
- }
- {
- // out of bounds access (return normal of last vertex - clamped)
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(5, 0.5f));
- EXPECT_THAT(normal, IsCloseTolerance(Vector3(0.955f, -0.294f, 0.0f), 1e-3f));
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(3, 0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(0.0f, -1.0f, 0.0f)));
- }
- {
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(0, 0.0f));
- EXPECT_THAT(normal, IsClose(Vector3(-0.7071f, -0.7071f, 0.0f)));
- }
- {
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(3, 0.0f));
- EXPECT_THAT(normal, IsClose(Vector3(0.7071f, -0.7071f, 0.0f)));
- }
- {
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(3, 1.0f));
- EXPECT_THAT(normal, IsClose(Vector3(-0.7071f, -0.7071f, 0.0f)));
- }
- {
- // out of bounds access (return normal of last vertex - clamped)
- Vector3 normal = bezierSpline.GetNormal(SplineAddress(5, 0.5f));
- EXPECT_THAT(normal, IsClose(Vector3(-0.7071f, -0.7071f, 0.0f)));
- }
- }
- }
- void Bezier_GetTangent()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 tangent = bezierSpline.GetTangent(SplineAddress(1, 0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(1.0f, 0.0f, 0.0f)));
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- Vector3 tangent = bezierSpline.GetTangent(SplineAddress(3, 0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(-1.0f, 0.0f, 0.0f)));
- }
- {
- Vector3 tangent = bezierSpline.GetTangent(SplineAddress(2, 0.5f));
- EXPECT_THAT(tangent, IsClose(Vector3(0.0f, -1.0f, 0.0f)));
- }
- }
- }
- void Bezier_Length()
- {
- {
- BezierSpline bezierSpline;
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- float splineLength = bezierSpline.GetSplineLength();
- EXPECT_NEAR(splineLength, 31.8014f, 0.0001f);
- }
- // lengths should be exact as shape is symmetrical
- {
- float segment0Length = bezierSpline.GetSegmentLength(0);
- float segment2Length = bezierSpline.GetSegmentLength(2);
- EXPECT_NEAR(segment0Length, segment2Length, Constants::Tolerance);
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // n shape (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- {
- float splineLength = bezierSpline.GetSplineLength();
- EXPECT_NEAR(splineLength, 43.40867f, Constants::Tolerance);
- }
- {
- float segment0Length = bezierSpline.GetSegmentLength(0);
- float segment2Length = bezierSpline.GetSegmentLength(3);
- EXPECT_NEAR(segment0Length, segment2Length, Constants::Tolerance);
- }
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // single line (y axis)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- {
- float splineLength = bezierSpline.GetSplineLength();
- EXPECT_NEAR(splineLength, 20.0f, AZ::Constants::Tolerance);
- }
- {
- float segmentLength = bezierSpline.GetSegmentLength(1);
- EXPECT_NEAR(segmentLength, 10.0f, AZ::Constants::Tolerance);
- }
- }
- }
- void Bezier_GetLength()
- {
- {
- BezierSpline bezierSpline;
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 20.0f, 0.0f));
- auto distance = bezierSpline.GetLength(AZ::SplineAddress(1, 0.5f));
- EXPECT_NEAR(distance, 15.0f, 1e-4);
- distance = bezierSpline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(distance, 0.0f, 1e-4);
- distance = bezierSpline.GetLength(AZ::SplineAddress(1, 1.0f));
- EXPECT_NEAR(distance, 20.0f, 1e-4);
- distance = bezierSpline.GetLength(AZ::SplineAddress(5, 1.0f));
- EXPECT_NEAR(distance, bezierSpline.GetSplineLength(), 1e-4);
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(20.0f, 20.0f, 10.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 15.0f, -10.0f));
- float length = bezierSpline.GetSplineLength();
- for (float t = 0.0f; t <= length; t += 0.5f)
- {
- auto result = bezierSpline.GetLength(bezierSpline.GetAddressByDistance(t));
- EXPECT_NEAR(result, t, 1e-4);
- }
- }
- {
- BezierSpline bezierSpline;
- auto result = bezierSpline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(result, 0.0f, 1e-4);
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- result = bezierSpline.GetLength(AZ::SplineAddress(0, 0.0f));
- EXPECT_NEAR(result, 0.0f, 1e-4);
- }
- }
- void Bezier_Aabb()
- {
- {
- BezierSpline bezierSpline;
- // slight n curve spline (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZ::Aabb aabb;
- bezierSpline.GetAabb(aabb);
- EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(-1.2948f, 0.0f, 0.0f)));
- EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(11.2948f, 11.7677f, 0.0f)));
- }
- {
- BezierSpline bezierSpline;
- bezierSpline.SetClosed(true);
- // slight n curve spline (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZ::Aabb aabb;
- bezierSpline.GetAabb(aabb);
- EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(-1.7677f, -1.7677f, 0.0f)));
- EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(11.7677f, 11.7677f, 0.0f)));
- }
- }
- void Spline_Invalid()
- {
- {
- LinearSpline linearSpline;
- PositionSplineQueryResult posSplineQuery = linearSpline.GetNearestAddressPosition(Vector3::CreateZero());
- EXPECT_EQ(posSplineQuery.m_splineAddress, SplineAddress());
- EXPECT_NEAR(posSplineQuery.m_distanceSq, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- RaySplineQueryResult raySplineQuery = linearSpline.GetNearestAddressRay(Vector3::CreateZero(), Vector3::CreateZero());
- EXPECT_EQ(raySplineQuery.m_splineAddress, SplineAddress());
- EXPECT_NEAR(raySplineQuery.m_distanceSq, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- EXPECT_NEAR(raySplineQuery.m_rayDistance, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- SplineAddress linearAddressDistance = linearSpline.GetAddressByDistance(2.0f);
- EXPECT_EQ(linearAddressDistance, SplineAddress());
- SplineAddress linearAddressFraction = linearSpline.GetAddressByFraction(0.0f);
- EXPECT_EQ(linearAddressFraction, SplineAddress());
- Vector3 linearPosition = linearSpline.GetPosition(SplineAddress(0, 0.5f));
- EXPECT_THAT(linearPosition, IsClose(Vector3::CreateZero()));
- Vector3 linearNormal = linearSpline.GetNormal(SplineAddress(1, 0.5f));
- EXPECT_THAT(linearNormal, IsClose(Vector3::CreateAxisX()));
- Vector3 linearTangent = linearSpline.GetTangent(SplineAddress(2, 0.5f));
- EXPECT_THAT(linearTangent, IsClose(Vector3::CreateAxisX()));
- float linearSegmentLength = linearSpline.GetSegmentLength(2);
- EXPECT_NEAR(linearSegmentLength, 0.0f, AZ::Constants::Tolerance);
- float linearSplineLength = linearSpline.GetSplineLength();
- EXPECT_NEAR(linearSplineLength, 0.0f, AZ::Constants::Tolerance);
- }
- {
- CatmullRomSpline catmullRomSpline;
- PositionSplineQueryResult posSplineQuery = catmullRomSpline.GetNearestAddressPosition(Vector3::CreateZero());
- EXPECT_EQ(posSplineQuery.m_splineAddress, SplineAddress());
- EXPECT_NEAR(posSplineQuery.m_distanceSq, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- RaySplineQueryResult raySplineQuery = catmullRomSpline.GetNearestAddressRay(Vector3::CreateZero(), Vector3::CreateZero());
- EXPECT_EQ(raySplineQuery.m_splineAddress, SplineAddress());
- EXPECT_NEAR(raySplineQuery.m_distanceSq, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- EXPECT_NEAR(raySplineQuery.m_rayDistance, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- SplineAddress catmullRomAddressDistance = catmullRomSpline.GetAddressByDistance(2.0f);
- EXPECT_EQ(catmullRomAddressDistance, SplineAddress());
- SplineAddress catmullRomAddressFraction = catmullRomSpline.GetAddressByFraction(0.0f);
- EXPECT_EQ(catmullRomAddressFraction, SplineAddress());
- Vector3 catmullRomPosition = catmullRomSpline.GetPosition(SplineAddress(0, 0.5f));
- EXPECT_THAT(catmullRomPosition, IsClose(Vector3::CreateZero()));
- Vector3 catmullRomNormal = catmullRomSpline.GetNormal(SplineAddress(1, 0.5f));
- EXPECT_THAT(catmullRomNormal, IsClose(Vector3::CreateAxisX()));
- Vector3 catmullRomTangent = catmullRomSpline.GetTangent(SplineAddress(2, 0.5f));
- EXPECT_THAT(catmullRomTangent, IsClose(Vector3::CreateAxisX()));
- float catmullRomSegmentLength = catmullRomSpline.GetSegmentLength(2);
- EXPECT_NEAR(catmullRomSegmentLength, 0.0f, AZ::Constants::Tolerance);
- float catmullRomSplineLength = catmullRomSpline.GetSplineLength();
- EXPECT_NEAR(catmullRomSplineLength, 0.0f, AZ::Constants::Tolerance);
- }
- {
- BezierSpline bezierSpline;
- PositionSplineQueryResult posSplineQuery = bezierSpline.GetNearestAddressPosition(Vector3::CreateZero());
- EXPECT_EQ(posSplineQuery.m_splineAddress, SplineAddress());
- EXPECT_NEAR(posSplineQuery.m_distanceSq, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- RaySplineQueryResult raySplineQuery = bezierSpline.GetNearestAddressRay(Vector3::CreateZero(), Vector3::CreateZero());
- EXPECT_EQ(raySplineQuery.m_splineAddress, SplineAddress());
- EXPECT_NEAR(raySplineQuery.m_distanceSq, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- EXPECT_NEAR(raySplineQuery.m_rayDistance, std::numeric_limits<float>::max(), AZ::Constants::Tolerance);
- SplineAddress bezierAddressDistance = bezierSpline.GetAddressByDistance(2.0f);
- EXPECT_EQ(bezierAddressDistance, SplineAddress());
- SplineAddress bezierAddressFraction = bezierSpline.GetAddressByFraction(0.0f);
- EXPECT_EQ(bezierAddressFraction, SplineAddress());
- Vector3 bezierPosition = bezierSpline.GetPosition(SplineAddress(0, 0.5f));
- EXPECT_THAT(bezierPosition, IsClose(Vector3::CreateZero()));
- Vector3 bezierNormal = bezierSpline.GetNormal(SplineAddress(1, 0.5f));
- EXPECT_THAT(bezierNormal, IsClose(Vector3::CreateAxisX()));
- Vector3 bezierTangent = bezierSpline.GetTangent(SplineAddress(2, 0.5f));
- EXPECT_THAT(bezierTangent, IsClose(Vector3::CreateAxisX()));
- float bezierSegmentLength = bezierSpline.GetSegmentLength(2);
- EXPECT_NEAR(bezierSegmentLength, 0.0f, AZ::Constants::Tolerance);
- float bezierSplineLength = bezierSpline.GetSplineLength();
- EXPECT_NEAR(bezierSplineLength, 0.0f, AZ::Constants::Tolerance);
- }
- }
- void Spline_Set()
- {
- LinearSpline linearSpline;
- // slight n curve spline (xy plane)
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- linearSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- AZStd::vector<Vector3> vertices{
- Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, 10.0f, 0.0f), Vector3(10.0f, 10.0f, 0.0f), Vector3(10.0f, 0.0f, 0.0f)
- };
- LinearSpline linearSplineSetLValue;
- linearSplineSetLValue.m_vertexContainer.SetVertices(vertices);
- LinearSpline linearSplineSetRValue;
- linearSplineSetRValue.m_vertexContainer.SetVertices(AZStd::vector<Vector3>{ Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, 10.0f, 0.0f), Vector3(10.0f, 10.0f, 0.0f), Vector3(10.0f, 0.0f, 0.0f) });
- LinearSpline linearSplineSetLValueCopy;
- linearSplineSetLValueCopy.m_vertexContainer.SetVertices(linearSplineSetLValue.GetVertices());
- EXPECT_EQ(linearSpline.GetVertexCount(), linearSplineSetLValue.GetVertexCount());
- EXPECT_EQ(linearSpline.GetVertexCount(), linearSplineSetRValue.GetVertexCount());
- EXPECT_EQ(linearSplineSetLValue.GetVertexCount(), linearSplineSetRValue.GetVertexCount());
- EXPECT_EQ(linearSplineSetLValueCopy.GetVertexCount(), vertices.size());
- BezierSpline bezierSpline;
- // slight n curve spline (xy plane)
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 0.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(0.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 10.0f, 0.0f));
- bezierSpline.m_vertexContainer.AddVertex(Vector3(10.0f, 0.0f, 0.0f));
- BezierSpline bezierSplineSetLValue;
- bezierSplineSetLValue.m_vertexContainer.SetVertices(vertices);
- BezierSpline bezierSplineSetRValue;
- bezierSplineSetRValue.m_vertexContainer.SetVertices(AZStd::vector<Vector3>{ Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, 10.0f, 0.0f), Vector3(10.0f, 10.0f, 0.0f), Vector3(10.0f, 0.0f, 0.0f) });
- BezierSpline bezierSplineSetLValueCopy;
- bezierSplineSetLValueCopy.m_vertexContainer.SetVertices(bezierSplineSetLValue.GetVertices());
- EXPECT_EQ(bezierSpline.GetBezierData().size(), bezierSplineSetLValue.GetBezierData().size());
- EXPECT_EQ(bezierSplineSetLValue.GetBezierData().size(), 4);
- EXPECT_EQ(bezierSplineSetLValue.GetBezierData().size(), bezierSplineSetRValue.GetBezierData().size());
- EXPECT_EQ(bezierSplineSetLValueCopy.GetBezierData().size(), 4);
- EXPECT_EQ(bezierSplineSetLValueCopy.GetVertexCount(), vertices.size());
- }
- };
- TEST_F(MATH_SplineTest, Linear_NearestAddressFromPosition)
- {
- Linear_NearestAddressFromPosition();
- }
- TEST_F(MATH_SplineTest, Linear_NearestAddressFromDirection)
- {
- Linear_NearestAddressFromDirection();
- }
- TEST_F(MATH_SplineTest, Linear_AddressByDistance)
- {
- Linear_AddressByDistance();
- }
- TEST_F(MATH_SplineTest, Linear_AddressByFraction)
- {
- Linear_AddressByFraction();
- }
- TEST_F(MATH_SplineTest, Linear_GetPosition)
- {
- Linear_GetPosition();
- }
- TEST_F(MATH_SplineTest, Linear_GetNormal)
- {
- Linear_GetNormal();
- }
- TEST_F(MATH_SplineTest, Linear_GetTangent)
- {
- Linear_GetTangent();
- }
- TEST_F(MATH_SplineTest, Linear_Length)
- {
- Linear_Length();
- }
- TEST_F(MATH_SplineTest, Linear_Aabb)
- {
- Linear_Aabb();
- }
- TEST_F(MATH_SplineTest, Linear_GetLength)
- {
- Linear_GetLength();
- }
- TEST_F(MATH_SplineTest, CatmullRom_Length)
- {
- CatmullRom_Length();
- }
- TEST_F(MATH_SplineTest, CatmullRom_NearestAddressFromPosition)
- {
- CatmullRom_NearestAddressFromPosition();
- }
- TEST_F(MATH_SplineTest, CatmullRom_NearestAddressFromDirection)
- {
- CatmullRom_NearestAddressFromDirection();
- }
- TEST_F(MATH_SplineTest, CatmullRom_AddressByDistance)
- {
- CatmullRom_AddressByDistance();
- }
- TEST_F(MATH_SplineTest, CatmullRom_AddressByFraction)
- {
- CatmullRom_AddressByFraction();
- }
- TEST_F(MATH_SplineTest, CatmullRom_GetPosition)
- {
- CatmullRom_GetPosition();
- }
- TEST_F(MATH_SplineTest, CatmullRom_GetNormal)
- {
- CatmullRom_GetNormal();
- }
- TEST_F(MATH_SplineTest, CatmullRom_GetTangent)
- {
- CatmullRom_GetTangent();
- }
- TEST_F(MATH_SplineTest, CatmullRom_Aabb)
- {
- CatmullRom_Aabb();
- }
- TEST_F(MATH_SplineTest, CatmullRom_GetLength)
- {
- CatmullRom_GetLength();
- }
- TEST_F(MATH_SplineTest, Bezier_NearestAddressFromPosition)
- {
- Bezier_NearestAddressFromPosition();
- }
- TEST_F(MATH_SplineTest, Bezier_NearestAddressFromDirection)
- {
- Bezier_NearestAddressFromDirection();
- }
- TEST_F(MATH_SplineTest, Bezier_AddressByDistance)
- {
- Bezier_AddressByDistance();
- }
- TEST_F(MATH_SplineTest, Bezier_AddressByFraction)
- {
- Bezier_AddressByFraction();
- }
- TEST_F(MATH_SplineTest, Bezier_GetPosition)
- {
- Bezier_GetPosition();
- }
- TEST_F(MATH_SplineTest, Bezier_GetNormal)
- {
- Bezier_GetNormal();
- }
- TEST_F(MATH_SplineTest, Bezier_GetTangent)
- {
- Bezier_GetTangent();
- }
- TEST_F(MATH_SplineTest, Bezier_Length)
- {
- Bezier_Length();
- }
- TEST_F(MATH_SplineTest, Bezier_Aabb)
- {
- Bezier_Aabb();
- }
- TEST_F(MATH_SplineTest, Bezier_GetLength)
- {
- Bezier_GetLength();
- }
- TEST_F(MATH_SplineTest, Spline_Invalid)
- {
- Spline_Invalid();
- }
- TEST_F(MATH_SplineTest, Spline_Set)
- {
- Spline_Set();
- }
- }
|