diff --git a/lib/FastNoise.cpp b/lib/FastNoise.cpp index b88a687..f1ede18 100644 --- a/lib/FastNoise.cpp +++ b/lib/FastNoise.cpp @@ -2,7 +2,7 @@ // // MIT License // -// Copyright(c) 2016 Jordan Peck +// Copyright(c) 2017 Jordan Peck // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files(the "Software"), to deal @@ -27,223 +27,310 @@ // #include "FastNoise.h" + #include +#include -FASTNOISE_NAMESPACE_BEGIN +#include +#include -const int LUT_MASK = 127; +namespace fastnoise { -static const float VAL_LUT[] = +const FN_DECIMAL GRAD_X[] = { - -0.92125984251968f, 0.826771653543307f, -0.1496062992126f, -0.38582677165354f, 0.039370078740159f, -0.74803149606299f, 0.937007874015748f, 0.858267716535433f, 0.448818897637796f, 0.118110236220474f, -0.73228346456693f, -0.16535433070866f, -0.60629921259842f, 0.637795275590552f, -0.0393700787401601f, 0.354330708661418f, 0.291338582677167f, 0.181102362204726f, -0.7007874015748f, -0.10236220472441f, -0.84251968503937f, - -0.0551181102362199f, -0.48031496062992f, 0.259842519685041f, 0.165354330708663f, 0.84251968503937f, 0.779527559055119f, -0.81102362204724f, -0.19685039370079f, 0.196850393700789f, 0.669291338582678f, 0.070866141732285f, 0.921259842519685f, -0.18110236220472f, 0.228346456692915f, 0.00787401574803304f, 0.700787401574804f, -0.85826771653543f, 0.023622047244096f, 0.133858267716537f, 0.322834645669293f, -0.93700787401574f, - -0.29133858267716f, 0.370078740157481f, -0.66929133858267f, -0.96850393700787f, 0.401574803149607f, -0.33858267716535f, -0.4015748031496f, 0.73228346456693f, -0.55905511811023f, -0.43307086614173f, 0.763779527559056f, -0.46456692913386f, 0.543307086614174f, -0.76377952755905f, 0.685039370078741f, 0.748031496062993f, 1.0f, 0.795275590551181f, -0.5748031496063f, -0.54330708661417f, 0.653543307086615f, 0.952755905511811f, - 0.338582677165356f, -0.21259842519685f, 0.433070866141733f, 0.511811023622048f, 0.622047244094489f, -0.90551181102362f, -0.79527559055118f, 0.590551181102363f, -0.11811023622047f, 0.212598425196852f, -0.41732283464567f, -0.95275590551181f, -0.63779527559055f, 0.244094488188978f, 0.30708661417323f, 0.968503937007874f, 0.606299212598426f, -0.77952755905511f, -0.88976377952756f, -0.24409448818897f, -0.32283464566929f, - -0.71653543307086f, 0.716535433070867f, 0.5748031496063f, 0.086614173228348f, -0.98425196850393f, -0.13385826771653f, -0.51181102362204f, -0.8267716535433f, 0.874015748031496f, -0.35433070866141f, 0.905511811023622f, 0.811023622047244f, -0.68503937007874f, 0.480314960629922f, -0.37007874015748f, -0.2755905511811f, 0.102362204724411f, 0.527559055118111f, -0.44881889763779f, 0.889763779527559f, 0.41732283464567f, - 0.984251968503937f, 0.385826771653544f, -0.87401574803149f, -0.30708661417323f, -0.62204724409449f, -0.52755905511811f, 0.1496062992126f, -0.0866141732283401f, 0.496062992125985f, -0.25984251968504f, -1.0f, -0.59055118110236f, 0.464566929133859f, -0.00787401574802993f, -0.22834645669291f, -0.65354330708661f, -0.49606299212598f, 0.055118110236222f, 0.559055118110237f, -0.07086614173228f, -0.02362204724409f, 0.275590551181104f + 1, -1, 1, -1, + 1, -1, 1, -1, + 0, 0, 0, 0 +}; +const FN_DECIMAL GRAD_Y[] = +{ + 1, 1, -1, -1, + 0, 0, 0, 0, + 1, -1, 1, -1 +}; +const FN_DECIMAL GRAD_Z[] = +{ + 0, 0, 0, 0, + 1, 1, -1, -1, + 1, 1, -1, -1 }; -static const float GRAD4D_LUT[][4] = +const FN_DECIMAL GRAD_4D[] = { - { 0.0179285344989033f, 0.0677944464204167f, 0.900387877028038f, 0.429399757319696f }, { 0.151459767976519f, 0.41940331430838f, 0.025942750707592f, -0.894699822464143f }, { 0.979529859361997f, 0.130367466451577f, -0.00937681736873056f, -0.153093610595927f }, { 0.0188035720634411f, 0.957989228554963f, -0.269676405489343f, 0.0958003130092474f }, { -0.0012369876892f, -7.87528807201163E-05f, 0.000149907955282427f, -0.999999220593219f }, { -0.0515998001407824f, -0.944373511413844f, 0.324801510463498f, 0.000332213707707317f }, { 0.0625583127110917f, 0.368853467530968f, 0.927379950072298f, 7.21458539681357E-05f }, { -0.0332301888025581f, 0.00487951365898265f, -0.999435388671684f, 0.000921286751161818f }, - { 0.254162385940239f, -0.00247502010266267f, 0.000438725101563024f, 0.967158292819196f }, { -0.759302539566954f, -0.650633735433763f, -0.0116359665914368f, 2.04111122123566E-06f }, { -4.48759951174869E-08f, 0.358287711147997f, -0.933611212169481f, 0.000143358851029576f }, { -0.834876133401752f, -0.194359576306317f, -0.0344898444893627f, -0.513825503066234f }, { 0.992418907081551f, 4.57210674843702E-06f, -1.83490711870738E-06f, 0.122901232063752f }, { -0.42938540950326f, 0.513195588850885f, -0.743126271370401f, -0.00466931352956133f }, { 0.570845731350832f, 1.65553932296542E-05f, 0.0011349034293071f, 0.821056552692115f }, { 2.31617888342864E-05f, 0.994847097173254f, -0.0961577881592109f, -0.0321392670390731f }, - { 0.0285107567449309f, -0.0502599346018885f, -0.998329141978559f, 2.92045363529652E-10f }, { 0.693061667730217f, 0.081528197183571f, -0.606560258101509f, 0.380924311483053f }, { -0.471772182045896f, -0.105811692623359f, 0.875348441445287f, 3.33769803143138E-06f }, { 0.362766768879719f, 0.923039277394957f, -0.128057658031582f, -1.49328116922925E-06f }, { 0.062046368142898f, -0.815075843570167f, 0.576022235980786f, -3.29295020122024E-05f }, { -0.921787687217261f, 0.28869133264405f, 0.0732935586853114f, -0.248179024911652f }, { -5.47319853185622E-06f, 0.973767617716296f, 0.225257152279963f, -0.0321844994352065f }, { 0.232218374389583f, -0.08472237319722f, -0.137241903519584f, 0.95919831421558f }, - { -0.0167570140621457f, 0.358790865544362f, 0.933267510677344f, 0.000266074731502954f }, { 0.0107254303176227f, -0.737658920753904f, 1.52650004111161E-06f, -0.675088351087735f }, { -3.71325911057143E-06f, -0.448149367809768f, 0.893952928186452f, 0.00321034340618395f }, { -0.0163066755437812f, -0.0444639669567192f, -0.998877894427004f, -5.06860474025719E-07f }, { 0.085934337625112f, -8.88863502634554E-05f, 0.996300798791311f, 6.62916977146475E-06f }, { 0.018848679157187f, -0.168704308520019f, 0.583111361978302f, 0.794458761115151f }, { -0.14092365680382f, -0.0262056616259223f, 0.00425806403039333f, -0.989664415416913f }, { 0.000019585584043321f, 0.0708482693257697f, 0.094787939700978f, 0.992973196434421f }, - { -3.61195284939247E-07f, 0.573786610288797f, -0.00565371182001549f, -0.818985324285984f }, { 0.555482972457819f, -0.831524637330389f, 0.00233255322693632f, 6.33832316941843E-05f }, { 0.800371000342067f, 0.168341324992158f, 8.13736079413595E-08f, -0.575384619286367f }, { -0.151943784159287f, -3.17003100215728E-06f, -0.973809705113584f, 0.169138241305451f }, { -3.28617107642979E-10f, -2.51664008452886E-05f, -0.999999889743206f, 0.000468913880721174f }, { 0.144708070244843f, -0.392246876333683f, -0.14750809340107f, 0.896350001279446f }, { -0.499891693213082f, 0.000469340668710032f, -0.0432191264563471f, 0.865008775611117f }, { -0.74530243187983f, -0.0130445109718722f, 0.0435702095816092f, 0.665173483088833f }, - { -0.796157099668477f, 0.000124118278989671f, -0.00217167212139707f, -0.605086060889134f }, { 0.947484791701284f, 0.0724121319093247f, 3.87510235633725E-05f, -0.311494865359736f }, { 0.999997268027888f, -0.00183696890994059f, 0.00144542293102575f, 0.000015314536027456f }, { 0.246103794412299f, 0.967730041656212f, 0.05414322404818f, -1.18997457774053E-05f }, { 4.28260722805506E-05f, -0.999999938144512f, -0.00024875421527231f, -0.000244945380014729f }, { 0.345932094721763f, -0.00182445228148537f, -2.01050360940934E-07f, 0.938257777593794f }, { 0.232629530802398f, -0.0123421039259699f, -0.000333195046776704f, -0.972487050222468f }, { -0.0413343034477463f, -0.845558019383741f, -0.532041468453896f, 0.0159683142427982f }, - { 4.876953380543E-11f, -0.509395810571092f, -0.760866765012863f, -0.401992131852703f }, { 0.01457871782159f, 0.00352273519283274f, 2.46006626805202E-08f, 0.999887519335769f }, { -0.2197566484112f, -0.269663250455668f, 0.936190779005179f, -0.0503544649304871f }, { -0.0865455281910523f, 0.0990053597028644f, -2.66646365439371E-05f, 0.991316200608683f }, { -0.989058271919771f, -0.130356511156493f, -0.0535910970499983f, -0.0435764737348075f }, { 0.900013078389142f, -0.00043287841542218f, -2.83509325586139E-08f, -0.435862674869937f }, { -0.771015568252326f, -4.76900694356318E-05f, -0.0219363831312084f, 0.636438360199416f }, { -0.078643371273305f, 0.996901923608738f, -6.16073674743889E-06f, 0.00133222446022512f }, - { 5.20470758906282E-05f, 0.997256243992129f, 0.0740268623204818f, 6.90275154123082E-05f }, { -0.115896931950432f, -0.300911764975683f, 0.431409257232567f, -0.842559234497932f }, { -1.05936323695781E-10f, -0.0143409648185513f, -0.999897162703251f, 2.73141203266667E-05f }, { 7.36602805763734E-06f, 0.0490840386576873f, -0.187410880606716f, 0.981054493351418f }, { -0.149217229776082f, 0.096219097342591f, 0.984104045608208f, -0.00391549001869267f }, { 0.0301779956805262f, -2.03984355987402E-05f, -0.999544181133284f, -0.00084742150235282f }, { 0.101389753295397f, 0.00105726742868962f, 0.994846219323528f, 3.15683454673068E-06f }, { -0.0132313717977117f, 0.159525525289995f, 0.593084588401323f, -0.789067302948319f }, - { -0.999950751279126f, -2.28154321862005E-06f, -3.35621991002035E-07f, 0.00992446527495385f }, { -0.446140024906362f, -0.89496104730281f, -0.000949959838625011f, -0.00170281047488805f }, { -0.25830870420065f, -5.99271603499866E-11f, -0.962897969373127f, -0.0781288289384209f }, { -0.0141578535996954f, -0.590108238154547f, 0.772903767582682f, -0.232790868592566f }, { -0.0408946388040428f, -0.487869969082088f, -2.38283754617856E-06f, -0.871957866974805f }, { 0.993390567418713f, 0.114783068234581f, 0.000166763855068009f, -7.22479963187292E-13f }, { -0.150270957910884f, 0.98861713652712f, 0.00724343322227505f, 0.00152618760893165f }, { -0.0292187624948691f, 0.984282454781429f, -2.54315254401317E-06f, -0.174167485832589f }, - { 0.605498435491149f, 0.0295366828327539f, -0.261172160527168f, 0.75119127494306f }, { -0.00453574210785455f, 0.0164722766698647f, -0.00759597400463439f, -0.99982518088102f }, { -0.161906996023123f, -0.968938255461586f, 0.00479280806368259f, 0.186873782892868f }, { 0.0718297493332595f, -0.15117444225596f, -0.95710224645937f, 0.236520749495151f }, { 1.55364291766971E-08f, 0.751515349174519f, -0.513260578427611f, -0.414473471512055f }, { -0.0832231266679871f, -0.016036973751982f, -0.150197717417989f, 0.985016432524305f }, { -0.0499060179903397f, 0.113056945464528f, 0.760889993198006f, 0.637003873380466f }, { -0.912217939109183f, -0.000236556733323175f, 0.409698193304452f, -0.00240125204303045f }, - { -0.0201341577237124f, 0.822200561754789f, -0.0353638581788924f, -0.567741357906546f }, { 0.981833737365851f, -0.189743278357464f, 1.93574210616191E-05f, 1.06610391592544E-05f }, { -3.1713467661518E-06f, -0.999998467923194f, -3.10580174237511E-07f, -0.00175046882587876f }, { 0.999785072721677f, 0.00661572799000603f, -0.000560396757787285f, -0.0196399201003463f }, { 0.947369318875243f, 0.10413625625988f, 0.014573335884325f, 0.302381599419074f }, { 0.000539050555161111f, 0.363169172188698f, -0.0860769990608411f, 0.927738439447755f }, { 0.0218600193860152f, 0.0136508664574171f, -0.957380820600311f, 0.287676481040908f }, { 0.0452753695684423f, -3.62412965753121E-05f, 0.412640274130687f, -0.909768181331025f }, - { -6.91937018588465E-08f, 0.000924049891480408f, -0.998173949198153f, 0.0603979575313267f }, { 0.0524759516860929f, 0.0348710315338021f, -0.997989141515491f, -0.00692524884613554f }, { -0.000620065691267785f, -0.297909553995998f, -0.954593871695887f, -0.000230818326052339f }, { -6.96674135940915E-05f, -0.867754661790055f, 0.496992798829057f, 3.74443548432658E-07f }, { -0.0482481401493802f, 0.00489619615662811f, -0.995799001490995f, 0.0776691242699415f }, { -0.151673443794422f, -0.974774864011805f, -0.000484445743305936f, -0.163734224432859f }, { -0.049803009786826f, 0.0811460037036778f, -0.0626532599996605f, -0.993483545566061f }, { -0.0609700565049769f, 0.169557563496092f, 0.340322391745786f, 0.922883283274476f }, - { -0.907810279284789f, -9.09566645872125E-05f, -6.82944907490262E-07f, -0.419381077960479f }, { -0.0974613227620325f, 0.995239313157134f, 5.15261588579082E-11f, -1.05825987794001E-05f }, { -0.0186861500087666f, 0.00438118107716855f, 0.992023504204221f, -0.124583306091132f }, { -0.930838673636572f, -0.0110467691436416f, -0.00188202425659556f, 0.365258525620815f }, { -0.0567494686643164f, -2.42763994429726E-09f, 0.975143948519116f, -0.214181645975711f }, { 0.0304023604642125f, -0.632969000014441f, 0.773579295645911f, 0.00100739609776072f }, { 0.000108520483850958f, 0.0583209179359306f, -0.00851497409325953f, -0.998261565908758f }, { -0.02385578591046f, -0.129946314819517f, 0.0562422070557562f, -0.989637141021354f }, - { -0.00504915323521923f, -0.0089236566539032f, -0.000176312774898594f, 0.999947420276354f }, { 9.54792136888334E-10f, 0.95741607332861f, -0.000200174641238177f, 0.288711659726688f }, { 0.994168345296552f, 0.107836831627415f, 0.000720385221359334f, 1.00702166459814E-07f }, { -0.442903722280488f, 0.0490533033131452f, -0.286717020869704f, 0.848070407553381f }, { -0.579123085419419f, 0.000412386634095739f, 0.000548850089152674f, -0.81523983013291f }, { -0.99748331906203f, -0.00315622682426633f, -0.0314712268933373f, -0.0634557192304806f }, { -0.999910167988914f, 0.00277348539595252f, -0.0131131747511067f, -9.15373542722021E-05f }, { 0.989849756616008f, -0.102100397263962f, -0.0925741321036343f, -0.0346842654676267f }, - { -0.0502665295186573f, -0.0019502335925594f, 0.995313667448867f, -0.0825843568030342f }, { -0.775008311628356f, 0.00458914577239442f, 0.631802950284916f, 0.012887538916389f }, { -0.917122758231958f, 3.16141922995542E-09f, 0.00144102092010558f, -0.398602270178826f }, { 0.298077607094876f, 0.0476089996782551f, 0.875582290533107f, 0.377145563149066f }, { 0.263407146338272f, -0.473950966620194f, 0.840230003541957f, -0.000835251815231092f }, { -0.55558964464076f, 0.00104388539977359f, -0.000884120434714965f, -0.831455516189702f }, { 0.857295578944858f, -0.0176694994052872f, -0.51054240707814f, -0.0638633673339165f }, { 0.0864515147611175f, -0.35114135064002f, 0.922138824225689f, 0.137425893927874f }, - { 0.968780126999011f, 0.203315714499582f, -0.141786558529076f, -0.00493534089860906f }, { -0.0103473943005527f, -0.0446849068409796f, -0.625161129502578f, -0.779146810742919f }, { -0.810284066914716f, -0.582923322911606f, -0.0599165375134594f, 0.00708089275712812f }, { -0.914614581816782f, 0.366353079295109f, 0.00173954895166334f, -0.171063035131932f }, { -0.0017333110902601f, 0.0325427046350465f, -0.999147497892685f, 0.0253425622715693f }, { 0.000847670819166468f, 0.0188099412466175f, 0.999636928304481f, 0.019273793982079f }, { 0.100715508011326f, 0.994914522159042f, -0.000565737742910064f, 0.00107702547448881f }, { -0.414687299306508f, -0.734201866849646f, -0.536852323837964f, -0.0277784970462061f }, + 0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1, + 0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1, + 1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1, + -1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1, + 1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1, + -1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1, + 1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0, + -1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0 }; -static const float GRAD3D_LUT[][3] = +const FN_DECIMAL VAL_LUT[] = { - { 0.969192790963703f, -0.204588387787502f, -0.137145636191962f }, { 0.0105050866706296f, 0.869235070511719f, -0.494287401565657f }, { -0.00713466534361336f, -0.0561560433951495f, -0.998396512083569f }, { -0.99998707996014f, 0.00085789886042815f, 0.00501038145637507f }, { -0.729044421579981f, -0.0724223391156089f, 0.680624151907743f }, { -0.769477416524206f, 0.638612501748049f, 0.00886442724220208f }, { -0.148489274637499f, -0.733777362959066f, 0.662964340614538f }, { 0.00192647521945516f, -0.688227670545063f, 0.725492220626345f }, - { 0.307853961011481f, -0.888296843306306f, 0.340814695782903f }, { -0.136873983993337f, 0.99058218544213f, 0.0035279442294635f }, { 0.981422965662359f, 0.0873011939299262f, -0.170843390299155f }, { 0.977985182924792f, 0.0274298762917452f, 0.206863684261352f }, { -4.10904184278805E-08f, -0.984715746607902f, -0.174169165992265f }, { -0.00576047279073815f, -0.00207046110763061f, 0.999981264896512f }, { 0.385796494451913f, -0.382885124111844f, 0.839380751865608f }, { 0.196898025871543f, -0.533803208609833f, 0.822365674068256f }, - { -0.953574229510659f, -0.197141111727736f, -0.227665480211439f }, { 0.958192898763756f, -0.00565943080050262f, 0.286067019423289f }, { -0.000021414243574488f, 0.308183457620683f, 0.951326944846192f }, { -0.00156590253858546f, -0.936777289401244f, -0.349922645753741f }, { 0.010162930999189f, 0.907036729301754f, 0.420928837846829f }, { -0.0468274165634939f, 0.74026530347444f, -0.670682095727837f }, { -0.958782958606567f, 0.0676203469753538f, -0.275975953591197f }, { 0.000771226398681087f, -0.963152702156633f, 0.268954043543163f }, - { -0.939601847652347f, 0.341933173840782f, -0.0151681414637957f }, { 0.0836248033533964f, 0.431468628956066f, 0.898243683245743f }, { -0.97637082132863f, 0.118948680332271f, 0.180419596234078f }, { 0.103518422502263f, 0.000465187240855595f, -0.994627427634827f }, { -0.141353740004181f, 0.0778654829014707f, -0.98689213532146f }, { 0.0700630230682292f, 0.912644877864809f, -0.402703985212052f }, { 0.991874945122624f, -0.0502217417385342f, 0.116884001876814f }, { -0.707119760481927f, 0.700142261026601f, -0.0989063125414175f }, - { 0.0976913606831578f, 0.99518571412564f, -0.00786081726752686f }, { 0.865756754070504f, 0.268594575188625f, 0.422282129577546f }, { 0.0124864728918991f, -0.922679395826772f, -0.385365826859963f }, { -0.0174011080646746f, -0.984212730893662f, 0.176132057800279f }, { 0.983085383617433f, 0.183144250425653f, 0.00114544916535278f }, { 0.84177325324929f, -0.000849099388075524f, 0.539830593005191f }, { -0.773202768542597f, 0.634158480426922f, -0.000707404184135718f }, { -0.399463762408861f, 0.520122522942901f, -0.754918050949683f }, - { -0.0543404007696243f, 0.853240000077495f, -0.51867969221086f }, { 0.0787561128671418f, -0.0445112338899157f, -0.995899706167069f }, { -0.149110911377271f, -0.855893524471146f, -0.495189065788614f }, { 0.128579845943545f, 0.95447163354276f, 0.26916746456314f }, { -6.48712081276198E-06f, -0.417292224145094f, 0.908772358528778f }, { -0.18395289837094f, 0.967255425062472f, 0.174866445804071f }, { -0.0956465003848313f, -0.995413983868259f, -0.00165761384418054f }, { -0.493402767926647f, 0.252656257103973f, 0.83229713705415f }, - { 0.941743815026262f, -0.00313821941824732f, 0.336316426061328f }, { -0.406002839825049f, -0.660621950516609f, -0.631458892208849f }, { -0.0151930656231186f, 0.000118750826499392f, 0.999884571665756f }, { 0.681786958463344f, -0.719431781259153f, 0.132606392695014f }, { 0.973323591185432f, -0.228922756390528f, 0.0153479134887209f }, { -0.810634856852843f, -0.585551171144037f, 0.000977152504195713f }, { -0.181398855060402f, -0.831693356111209f, 0.524767202465292f }, { -0.733900500867695f, 0.679256981569713f, 8.84021970721802E-05f }, - { 0.271727663466327f, -0.889119678670303f, -0.368280156821335f }, { 0.298233653375395f, -0.0312311598898426f, -0.953981814630813f }, { -0.752318728102205f, -0.00392703305301813f, 0.658787605953604f }, { 0.00665991896444102f, -0.893539727653096f, 0.448934739784101f }, { -0.17274029679022f, 0.981849574845414f, 0.0783083791219516f }, { 0.740984319707759f, -1.24163939998686E-09f, 0.671522328703395f }, { -0.91345982474963f, 0.00101800775270491f, 0.40692764986984f }, { 0.166118424599226f, -0.966950978532905f, -0.193417874362556f }, - { -0.371630916510155f, 0.92837704130171f, -0.00255559732836468f }, { 0.114876798169617f, 0.991537470331245f, 0.0604712011738797f }, { 0.42509283827761f, -0.861877415693766f, -0.276520160498508f }, { 0.0914177278602429f, 0.937282941514681f, 0.336368081985282f }, { -0.138897098096673f, 0.574329772420649f, -0.806754552916541f }, { 4.20730659972853E-05f, -0.973522779481066f, 0.228590017413966f }, { -0.19883302527571f, -0.769560727972852f, -0.606829229702725f }, { 0.0747279815185906f, 0.375429090417211f, 0.92383371168553f }, - { 0.0360592551928224f, 0.999349653582228f, 1.40580077597545E-07f }, { -0.630789398266975f, 0.775912761477526f, 0.00800759703705387f }, { 0.999468273136104f, 0.0122075383077114f, -0.0302348640281232f }, { 0.0234858830298487f, 0.722121551769761f, -0.691367397096465f }, { 0.044647769484317f, -0.998966611124733f, -0.00850214902496602f }, { -0.155624581702642f, 0.0567240593672596f, -0.98618627584183f }, { -0.564856042306962f, 0.825189463979779f, 2.46592673497201E-06f }, { -0.00280893077197093f, -0.849678682544325f, 0.527293320968186f }, - { 0.85760478967376f, 0.0912484314080345f, -0.506149926893406f }, { -0.983676972673489f, -0.138789081908023f, -0.11453036355067f }, { -0.995791780173427f, 0.0916344946719056f, 0.00136011957614869f }, { 0.0705163298667096f, 0.9883873876068f, -0.134602448870495f }, { 0.151288867759186f, -0.946777269461834f, -0.28412053871999f }, { -0.479182164834798f, 2.28582795501955E-06f, 0.877715473772117f }, { -0.920617168247744f, -0.0874211800038508f, -0.380554288918466f }, { 0.647008224881357f, -0.0116892424293656f, -0.76239341454875f }, - { 0.00348600295131339f, 0.00264876419739902f, 0.999990415869897f }, { 0.293662611616922f, 0.774229458412962f, -0.560652313170918f }, { -0.0230822002633608f, -0.133701316157593f, -0.99075282996756f }, { 0.0891587773276397f, -0.70303221860981f, -0.705546888606285f }, { -0.716380181025389f, -0.675240051032385f, 0.175642562369752f }, { -0.110229513550145f, -0.0380431704478986f, 0.993177814655951f }, { 0.901899360101853f, -0.423583957873496f, -0.0845823556073773f }, { -0.188144760211676f, 0.981876973408649f, 0.0227850454193412f }, - { -0.992971049488398f, -0.00105311622549315f, -0.118352802350111f }, { 0.974825103742426f, -0.22297088847484f, 2.51166485428216E-06f }, { 0.917736330268161f, 0.253456586759036f, -0.305810050087285f }, { 0.754361752313554f, 0.655909079393725f, -0.0268631013715986f }, { -0.00493426945610691f, 0.999852337890823f, -0.0164607229243032f }, { 0.172163344055272f, 0.977404359568319f, -0.122639719750783f }, { 0.20654798485596f, 0.00802290795582379f, 0.978403578744413f }, { -0.0189935909416278f, -0.956252765802595f, -0.291924461801387f }, - { -0.298030174309119f, -0.101625749247146f, -0.949131298762838f }, { -0.525057139557522f, -0.851050276233871f, 0.00533174661105069f }, { 0.00362214069523366f, 0.401488407244411f, -0.915856942401558f }, { 0.7517944143271f, 0.19472711592481f, 0.629989292694866f }, { 0.501284099317453f, -0.0225214021165674f, 0.864989617404853f }, { -0.985033512468648f, 0.1680612553394f, -0.0382673982316817f }, { 0.00137633273570574f, -0.0442369494900767f, -0.999020118920542f }, { -0.724166817672979f, -0.688818418185576f, 0.033340770082758f }, - { -0.0128146550963728f, -0.0397993929245446f, 0.99912551410601f }, { 0.802033957950016f, 0.595775400910827f, -0.0423462154693413f }, { -0.902335114745471f, -0.411652900762455f, -0.127801525777801f }, { 7.40750655087705E-05f, -0.890177016591854f, 0.455614830360591f }, { -0.0563694832642116f, 0.998393830705426f, -0.00567804243293261f }, { 0.804825783463094f, 0.0873894235068948f, -0.587042202002675f }, { 0.902405167679558f, 0.0887442050097385f, -0.421650778989461f }, { 0.0138828478418606f, -0.26021714739708f, 0.965450310858268f }, - { -0.0235002961872274f, -0.1428517727679f, -0.989465061079056f }, { 0.543378228613975f, 0.00830368325812741f, 0.839446930730399f }, { -0.956960500295924f, 0.0113747804839107f, 0.289995198653906f }, { -0.00858337504492301f, -0.949962410388146f, -0.312246288244364f }, { -0.731827611403257f, 0.00140870300297461f, -0.681488343806152f }, { 0.844453636307317f, 0.498643416559842f, -0.195583228444764f }, { -0.997648624781726f, 0.000128342870118087f, -0.0685361583343983f }, { 0.00700544496566235f, -0.020878882722484f, 0.999757468587804f }, + FN_DECIMAL(0.3490196078), FN_DECIMAL(0.4352941176), FN_DECIMAL(-0.4509803922), FN_DECIMAL(0.6392156863), FN_DECIMAL(0.5843137255), FN_DECIMAL(-0.1215686275), FN_DECIMAL(0.7176470588), FN_DECIMAL(-0.1058823529), FN_DECIMAL(0.3960784314), FN_DECIMAL(0.0431372549), FN_DECIMAL(-0.03529411765), FN_DECIMAL(0.3176470588), FN_DECIMAL(0.7254901961), FN_DECIMAL(0.137254902), FN_DECIMAL(0.8588235294), FN_DECIMAL(-0.8196078431), + FN_DECIMAL(-0.7960784314), FN_DECIMAL(-0.3333333333), FN_DECIMAL(-0.6705882353), FN_DECIMAL(-0.3882352941), FN_DECIMAL(0.262745098), FN_DECIMAL(0.3254901961), FN_DECIMAL(-0.6470588235), FN_DECIMAL(-0.9215686275), FN_DECIMAL(-0.5294117647), FN_DECIMAL(0.5294117647), FN_DECIMAL(-0.4666666667), FN_DECIMAL(0.8117647059), FN_DECIMAL(0.3803921569), FN_DECIMAL(0.662745098), FN_DECIMAL(0.03529411765), FN_DECIMAL(-0.6156862745), + FN_DECIMAL(-0.01960784314), FN_DECIMAL(-0.3568627451), FN_DECIMAL(-0.09019607843), FN_DECIMAL(0.7490196078), FN_DECIMAL(0.8352941176), FN_DECIMAL(-0.4039215686), FN_DECIMAL(-0.7490196078), FN_DECIMAL(0.9529411765), FN_DECIMAL(-0.0431372549), FN_DECIMAL(-0.9294117647), FN_DECIMAL(-0.6549019608), FN_DECIMAL(0.9215686275), FN_DECIMAL(-0.06666666667), FN_DECIMAL(-0.4431372549), FN_DECIMAL(0.4117647059), FN_DECIMAL(-0.4196078431), + FN_DECIMAL(-0.7176470588), FN_DECIMAL(-0.8117647059), FN_DECIMAL(-0.2549019608), FN_DECIMAL(0.4901960784), FN_DECIMAL(0.9137254902), FN_DECIMAL(0.7882352941), FN_DECIMAL(-1.0), FN_DECIMAL(-0.4745098039), FN_DECIMAL(0.7960784314), FN_DECIMAL(0.8509803922), FN_DECIMAL(-0.6784313725), FN_DECIMAL(0.4588235294), FN_DECIMAL(1.0), FN_DECIMAL(-0.1843137255), FN_DECIMAL(0.4509803922), FN_DECIMAL(0.1450980392), + FN_DECIMAL(-0.231372549), FN_DECIMAL(-0.968627451), FN_DECIMAL(-0.8588235294), FN_DECIMAL(0.4274509804), FN_DECIMAL(0.003921568627), FN_DECIMAL(-0.003921568627), FN_DECIMAL(0.2156862745), FN_DECIMAL(0.5058823529), FN_DECIMAL(0.7647058824), FN_DECIMAL(0.2078431373), FN_DECIMAL(-0.5921568627), FN_DECIMAL(0.5764705882), FN_DECIMAL(-0.1921568627), FN_DECIMAL(-0.937254902), FN_DECIMAL(0.08235294118), FN_DECIMAL(-0.08235294118), + FN_DECIMAL(0.9058823529), FN_DECIMAL(0.8274509804), FN_DECIMAL(0.02745098039), FN_DECIMAL(-0.168627451), FN_DECIMAL(-0.7803921569), FN_DECIMAL(0.1137254902), FN_DECIMAL(-0.9450980392), FN_DECIMAL(0.2), FN_DECIMAL(0.01960784314), FN_DECIMAL(0.5607843137), FN_DECIMAL(0.2705882353), FN_DECIMAL(0.4431372549), FN_DECIMAL(-0.9607843137), FN_DECIMAL(0.6156862745), FN_DECIMAL(0.9294117647), FN_DECIMAL(-0.07450980392), + FN_DECIMAL(0.3098039216), FN_DECIMAL(0.9921568627), FN_DECIMAL(-0.9137254902), FN_DECIMAL(-0.2941176471), FN_DECIMAL(-0.3411764706), FN_DECIMAL(-0.6235294118), FN_DECIMAL(-0.7647058824), FN_DECIMAL(-0.8901960784), FN_DECIMAL(0.05882352941), FN_DECIMAL(0.2392156863), FN_DECIMAL(0.7333333333), FN_DECIMAL(0.6549019608), FN_DECIMAL(0.2470588235), FN_DECIMAL(0.231372549), FN_DECIMAL(-0.3960784314), FN_DECIMAL(-0.05098039216), + FN_DECIMAL(-0.2235294118), FN_DECIMAL(-0.3725490196), FN_DECIMAL(0.6235294118), FN_DECIMAL(0.7019607843), FN_DECIMAL(-0.8274509804), FN_DECIMAL(0.4196078431), FN_DECIMAL(0.07450980392), FN_DECIMAL(0.8666666667), FN_DECIMAL(-0.537254902), FN_DECIMAL(-0.5058823529), FN_DECIMAL(-0.8039215686), FN_DECIMAL(0.09019607843), FN_DECIMAL(-0.4823529412), FN_DECIMAL(0.6705882353), FN_DECIMAL(-0.7882352941), FN_DECIMAL(0.09803921569), + FN_DECIMAL(-0.6078431373), FN_DECIMAL(0.8039215686), FN_DECIMAL(-0.6), FN_DECIMAL(-0.3254901961), FN_DECIMAL(-0.4117647059), FN_DECIMAL(-0.01176470588), FN_DECIMAL(0.4823529412), FN_DECIMAL(0.168627451), FN_DECIMAL(0.8745098039), FN_DECIMAL(-0.3647058824), FN_DECIMAL(-0.1607843137), FN_DECIMAL(0.568627451), FN_DECIMAL(-0.9921568627), FN_DECIMAL(0.9450980392), FN_DECIMAL(0.5137254902), FN_DECIMAL(0.01176470588), + FN_DECIMAL(-0.1450980392), FN_DECIMAL(-0.5529411765), FN_DECIMAL(-0.5764705882), FN_DECIMAL(-0.1137254902), FN_DECIMAL(0.5215686275), FN_DECIMAL(0.1607843137), FN_DECIMAL(0.3725490196), FN_DECIMAL(-0.2), FN_DECIMAL(-0.7254901961), FN_DECIMAL(0.631372549), FN_DECIMAL(0.7098039216), FN_DECIMAL(-0.568627451), FN_DECIMAL(0.1294117647), FN_DECIMAL(-0.3098039216), FN_DECIMAL(0.7411764706), FN_DECIMAL(-0.8509803922), + FN_DECIMAL(0.2549019608), FN_DECIMAL(-0.6392156863), FN_DECIMAL(-0.5607843137), FN_DECIMAL(-0.3176470588), FN_DECIMAL(0.937254902), FN_DECIMAL(0.9843137255), FN_DECIMAL(0.5921568627), FN_DECIMAL(0.6941176471), FN_DECIMAL(0.2862745098), FN_DECIMAL(-0.5215686275), FN_DECIMAL(0.1764705882), FN_DECIMAL(0.537254902), FN_DECIMAL(-0.4901960784), FN_DECIMAL(-0.4588235294), FN_DECIMAL(-0.2078431373), FN_DECIMAL(-0.2156862745), + FN_DECIMAL(0.7725490196), FN_DECIMAL(0.3647058824), FN_DECIMAL(-0.2392156863), FN_DECIMAL(0.2784313725), FN_DECIMAL(-0.8823529412), FN_DECIMAL(0.8980392157), FN_DECIMAL(0.1215686275), FN_DECIMAL(0.1058823529), FN_DECIMAL(-0.8745098039), FN_DECIMAL(-0.9843137255), FN_DECIMAL(-0.7019607843), FN_DECIMAL(0.9607843137), FN_DECIMAL(0.2941176471), FN_DECIMAL(0.3411764706), FN_DECIMAL(0.1529411765), FN_DECIMAL(0.06666666667), + FN_DECIMAL(-0.9764705882), FN_DECIMAL(0.3019607843), FN_DECIMAL(0.6470588235), FN_DECIMAL(-0.5843137255), FN_DECIMAL(0.05098039216), FN_DECIMAL(-0.5137254902), FN_DECIMAL(-0.137254902), FN_DECIMAL(0.3882352941), FN_DECIMAL(-0.262745098), FN_DECIMAL(-0.3019607843), FN_DECIMAL(-0.1764705882), FN_DECIMAL(-0.7568627451), FN_DECIMAL(0.1843137255), FN_DECIMAL(-0.5450980392), FN_DECIMAL(-0.4980392157), FN_DECIMAL(-0.2784313725), + FN_DECIMAL(-0.9529411765), FN_DECIMAL(-0.09803921569), FN_DECIMAL(0.8901960784), FN_DECIMAL(-0.2862745098), FN_DECIMAL(-0.3803921569), FN_DECIMAL(0.5529411765), FN_DECIMAL(0.7803921569), FN_DECIMAL(-0.8352941176), FN_DECIMAL(0.6862745098), FN_DECIMAL(0.7568627451), FN_DECIMAL(0.4980392157), FN_DECIMAL(-0.6862745098), FN_DECIMAL(-0.8980392157), FN_DECIMAL(-0.7725490196), FN_DECIMAL(-0.7098039216), FN_DECIMAL(-0.2470588235), + FN_DECIMAL(-0.9058823529), FN_DECIMAL(0.9764705882), FN_DECIMAL(0.1921568627), FN_DECIMAL(0.8431372549), FN_DECIMAL(-0.05882352941), FN_DECIMAL(0.3568627451), FN_DECIMAL(0.6078431373), FN_DECIMAL(0.5450980392), FN_DECIMAL(0.4039215686), FN_DECIMAL(-0.7333333333), FN_DECIMAL(-0.4274509804), FN_DECIMAL(0.6), FN_DECIMAL(0.6784313725), FN_DECIMAL(-0.631372549), FN_DECIMAL(-0.02745098039), FN_DECIMAL(-0.1294117647), + FN_DECIMAL(0.3333333333), FN_DECIMAL(-0.8431372549), FN_DECIMAL(0.2235294118), FN_DECIMAL(-0.3490196078), FN_DECIMAL(-0.6941176471), FN_DECIMAL(0.8823529412), FN_DECIMAL(0.4745098039), FN_DECIMAL(0.4666666667), FN_DECIMAL(-0.7411764706), FN_DECIMAL(-0.2705882353), FN_DECIMAL(0.968627451), FN_DECIMAL(0.8196078431), FN_DECIMAL(-0.662745098), FN_DECIMAL(-0.4352941176), FN_DECIMAL(-0.8666666667), FN_DECIMAL(-0.1529411765), }; -static const float GRAD2D_LUT[][2] = +const FN_DECIMAL CELL_2D_X[] = { - { 0.465254262011416f, -0.885177084927198f }, { 0.999814701091156f, -0.0192500255065206f }, { 0.562013227349949f, 0.827128244157878f }, { 0.540531763173497f, -0.841323607775599f }, { -0.97869393624958f, 0.20532457024989f }, { -0.022259068317433f, 0.999752236245381f }, { -0.763453105361241f, -0.645863264100288f }, { -0.877652307360767f, 0.479297848299283f }, - { -0.429945697678765f, 0.902854748587789f }, { -0.880336026899474f, 0.474350587374832f }, { -0.999734062007074f, 0.0230609033395389f }, { 0.961877124516138f, -0.273481987217745f }, { 0.485111864938318f, 0.874452101887844f }, { -0.307899752943979f, 0.951418804805243f }, { -0.991765219175154f, 0.128069317303008f }, { 0.937814305853532f, -0.347137332674633f }, - { -0.398552509901734f, -0.917145515635893f }, { 0.701222178891205f, -0.712942813857514f }, { 0.873193936119955f, 0.487372906431349f }, { -0.514304676201594f, -0.857607544298191f }, { 0.0428414754286589f, 0.999081882521696f }, { -0.88038067821201f, 0.474267710719338f }, { 0.14177264550869f, 0.989899245875795f }, { -0.887664663265946f, -0.46049044027966f }, - { 0.999983713358517f, -0.00570727760945115f }, { -0.623600504016441f, -0.781743187620104f }, { 0.888019464508127f, -0.459805861918592f }, { 0.600087177175954f, -0.79993460969569f }, { -0.560441030370991f, 0.828194331951567f }, { 0.958552181052623f, -0.284917033887514f }, { 0.6683586377581f, 0.743839183785136f }, { 0.709718808827001f, 0.704485068966819f }, - { 0.695776987881928f, 0.718257880662615f }, { 0.154316110318401f, -0.988021527142096f }, { -0.725364342269412f, -0.688365143629501f }, { -0.999918869545931f, 0.0127379090116007f }, { 0.805508244111792f, 0.592584566680519f }, { -0.996506623245929f, 0.0835137702836865f }, { -0.73969279786535f, -0.67294469667732f }, { 0.695504007775371f, -0.718522216196824f }, - { -0.999983227160896f, 0.00579183881678425f }, { -0.714924640549655f, 0.699201514825981f }, { -0.835103934916504f, -0.550092190352645f }, { 0.84959050330652f, 0.527442865807639f }, { -0.171610706906682f, 0.985164841676249f }, { 0.3561994988697f, 0.934409929851441f }, { -0.409182557485348f, -0.912452538299801f }, { 0.463529807851185f, 0.886081326534672f }, - { -0.962925769084928f, -0.269766497608949f }, { 0.744285209959416f, 0.66786190656128f }, { -0.691027420259623f, 0.722828544296177f }, { 0.981612661017864f, 0.190883691627725f }, { 0.928340009081787f, 0.371732198683444f }, { -0.120562843572988f, 0.992705696946278f }, { 0.789437446513116f, -0.61383101749818f }, { 0.999774655712189f, -0.0212282310985648f }, - { -0.902267580211854f, 0.431176545858708f }, { -0.912180652347305f, -0.4097883081339f }, { -0.770294485489921f, -0.637688329533965f }, { 0.20063205075057f, 0.979666667908846f }, { -0.982785937329741f, -0.184747940142514f }, { 0.857295252061123f, -0.514825068147866f }, { -0.6880675701609f, -0.725646621223357f }, { 0.703885918434739f, -0.710313039320893f }, - { 0.80736694412922f, -0.590049673779628f }, { 0.501306939228223f, -0.865269526033149f }, { 0.994382489412099f, -0.105846420584718f }, { 0.496494368044017f, -0.868039942917705f }, { 0.077642279257408f, -0.996981281906393f }, { 0.951970808735996f, -0.30618879684687f }, { -0.761381916275718f, -0.648303615267041f }, { 0.925704511866975f, 0.378247480770363f }, - { 0.307462004306155f, 0.951560358520699f }, { -0.722833511616144f, -0.6910222243059f }, { 0.365487416741135f, -0.930816280585966f }, { -0.452581511359919f, 0.891723037481466f }, { -0.696052038963733f, -0.717991336336609f }, { -0.731589205376628f, -0.681745725748533f }, { -0.584030912612065f, 0.811731416857521f }, { -0.622817071437575f, -0.782367493909303f }, - { -0.250124556053565f, -0.968213667771224f }, { -0.972374793807189f, -0.233425063710878f }, { -0.970811073944879f, 0.239845489234194f }, { 0.972096169972212f, -0.234582685476477f }, { -0.56398693111627f, -0.825783713529185f }, { -0.697050386134155f, 0.717022146931478f }, { -0.0346220968223854f, -0.999400475490992f }, { -0.218763172462792f, -0.975777984161364f }, - { -0.526228595935678f, 0.850343145335791f }, { 0.878475471267297f, 0.477787448957902f }, { -0.543258510315468f, 0.839565477476188f }, { -0.424638392098636f, 0.905363040970795f }, { -0.511241626148254f, -0.859437024855975f }, { 0.310536598007565f, -0.950561424263518f }, { 0.647207900842245f, 0.762313539881967f }, { -0.998374197564832f, 0.0569996634795082f }, - { -0.384499699032222f, 0.923125116895933f }, { 0.793017652527103f, -0.609198656252953f }, { -0.108016962369769f, 0.994149051118799f }, { -0.931126682943364f, 0.364695901143526f }, { -0.801286360381044f, -0.598281011454734f }, { 0.875902620980454f, -0.482487925817394f }, { -0.731473336626206f, 0.681870044660216f }, { -0.315759562725525f, -0.948839237461956f }, - { -0.0770741115938651f, -0.997025366438596f }, { -0.822418334736048f, 0.568883188967635f }, { -0.998852401248829f, -0.0478944727442276f }, { 0.996841343178929f, -0.0794187416749304f }, { -0.632437179039341f, 0.774611654036241f }, { 0.719989390873874f, 0.693985069745068f }, { 0.99256596306396f, -0.121707883750037f }, { 0.851153933233715f, -0.524916166583558f }, - { 0.952866133004913f, 0.303391055524489f }, { 0.983070281370671f, 0.183228878416556f }, { 0.751614346163695f, 0.659602815822462f }, { 0.549915829679874f, 0.83522007894177f }, { 0.529779603383605f, 0.8481353499523f }, { -0.738299650910558f, -0.67447285005799f }, { -0.888225309084572f, -0.459408097775406f }, { 0.69138401830353f, 0.722487466489534f }, - { 0.895582660271765f, -0.4448951546382f }, { -0.823764839572624f, -0.566931644101728f }, { 0.481527438369519f, 0.876431016165727f }, { -0.393245292146023f, 0.9194335974963f }, { 0.511430719572624f, 0.859324513252955f }, { 0.709782009015835f, 0.704421393540433f }, { -0.123429256704187f, -0.992353373848979f }, { -0.796333188996483f, -0.60485820826264f }, + FN_DECIMAL(-0.6440658039), FN_DECIMAL(-0.08028078721), FN_DECIMAL(0.9983546168), FN_DECIMAL(0.9869492062), FN_DECIMAL(0.9284746418), FN_DECIMAL(0.6051097552), FN_DECIMAL(-0.794167404), FN_DECIMAL(-0.3488667991), FN_DECIMAL(-0.943136526), FN_DECIMAL(-0.9968171318), FN_DECIMAL(0.8740961579), FN_DECIMAL(0.1421139764), FN_DECIMAL(0.4282553608), FN_DECIMAL(-0.9986665833), FN_DECIMAL(0.9996760121), FN_DECIMAL(-0.06248383632), + FN_DECIMAL(0.7120139305), FN_DECIMAL(0.8917660409), FN_DECIMAL(0.1094842955), FN_DECIMAL(-0.8730880804), FN_DECIMAL(0.2594811489), FN_DECIMAL(-0.6690063346), FN_DECIMAL(-0.9996834972), FN_DECIMAL(-0.8803608671), FN_DECIMAL(-0.8166554937), FN_DECIMAL(0.8955599676), FN_DECIMAL(-0.9398321388), FN_DECIMAL(0.07615451399), FN_DECIMAL(-0.7147270565), FN_DECIMAL(0.8707354457), FN_DECIMAL(-0.9580008579), FN_DECIMAL(0.4905965632), + FN_DECIMAL(0.786775944), FN_DECIMAL(0.1079711577), FN_DECIMAL(0.2686638979), FN_DECIMAL(0.6113487322), FN_DECIMAL(-0.530770584), FN_DECIMAL(-0.7837268286), FN_DECIMAL(-0.8558691039), FN_DECIMAL(-0.5726093896), FN_DECIMAL(-0.9830740914), FN_DECIMAL(0.7087766359), FN_DECIMAL(0.6807027153), FN_DECIMAL(-0.08864708788), FN_DECIMAL(0.6704485923), FN_DECIMAL(-0.1350735482), FN_DECIMAL(-0.9381333003), FN_DECIMAL(0.9756655376), + FN_DECIMAL(0.4231433671), FN_DECIMAL(-0.4959787385), FN_DECIMAL(0.1005554325), FN_DECIMAL(-0.7645857281), FN_DECIMAL(-0.5859053796), FN_DECIMAL(-0.9751154306), FN_DECIMAL(-0.6972258572), FN_DECIMAL(0.7907012002), FN_DECIMAL(-0.9109899213), FN_DECIMAL(-0.9584307894), FN_DECIMAL(-0.8269529333), FN_DECIMAL(0.2608264719), FN_DECIMAL(-0.7773760119), FN_DECIMAL(0.7606456974), FN_DECIMAL(-0.8961083758), FN_DECIMAL(-0.9838134719), + FN_DECIMAL(0.7338893576), FN_DECIMAL(0.2161226729), FN_DECIMAL(0.673509891), FN_DECIMAL(-0.5512056873), FN_DECIMAL(0.6899744332), FN_DECIMAL(0.868004831), FN_DECIMAL(0.5897430311), FN_DECIMAL(-0.8950444221), FN_DECIMAL(-0.3595752773), FN_DECIMAL(0.8209486981), FN_DECIMAL(-0.2912360132), FN_DECIMAL(-0.9965011374), FN_DECIMAL(0.9766994634), FN_DECIMAL(0.738790822), FN_DECIMAL(-0.4730947722), FN_DECIMAL(0.8946479441), + FN_DECIMAL(-0.6943628971), FN_DECIMAL(-0.6620468182), FN_DECIMAL(-0.0887255502), FN_DECIMAL(-0.7512250855), FN_DECIMAL(-0.5322986898), FN_DECIMAL(0.5226295385), FN_DECIMAL(0.2296318375), FN_DECIMAL(0.7915307344), FN_DECIMAL(-0.2756485999), FN_DECIMAL(-0.6900234522), FN_DECIMAL(0.07090588086), FN_DECIMAL(0.5981278485), FN_DECIMAL(0.3033429312), FN_DECIMAL(-0.7253142797), FN_DECIMAL(-0.9855874307), FN_DECIMAL(-0.1761843396), + FN_DECIMAL(-0.6438468325), FN_DECIMAL(-0.9956136595), FN_DECIMAL(0.8541580762), FN_DECIMAL(-0.9999807666), FN_DECIMAL(-0.02152416253), FN_DECIMAL(-0.8705983095), FN_DECIMAL(-0.1197138014), FN_DECIMAL(-0.992107781), FN_DECIMAL(-0.9091181546), FN_DECIMAL(0.788610536), FN_DECIMAL(-0.994636402), FN_DECIMAL(0.4211256853), FN_DECIMAL(0.3110430857), FN_DECIMAL(-0.4031127839), FN_DECIMAL(0.7610684239), FN_DECIMAL(0.7685674467), + FN_DECIMAL(0.152271555), FN_DECIMAL(-0.9364648723), FN_DECIMAL(0.1681333739), FN_DECIMAL(-0.3567427907), FN_DECIMAL(-0.418445483), FN_DECIMAL(-0.98774778), FN_DECIMAL(0.8705250765), FN_DECIMAL(-0.8911701067), FN_DECIMAL(-0.7315350966), FN_DECIMAL(0.6030885658), FN_DECIMAL(-0.4149130821), FN_DECIMAL(0.7585339481), FN_DECIMAL(0.6963196535), FN_DECIMAL(0.8332685012), FN_DECIMAL(-0.8086815232), FN_DECIMAL(0.7518116724), + FN_DECIMAL(-0.3490535894), FN_DECIMAL(0.6972110903), FN_DECIMAL(-0.8795676928), FN_DECIMAL(-0.6442331882), FN_DECIMAL(0.6610236811), FN_DECIMAL(-0.9853565782), FN_DECIMAL(-0.590338458), FN_DECIMAL(0.09843602117), FN_DECIMAL(0.5646534882), FN_DECIMAL(-0.6023259233), FN_DECIMAL(-0.3539248861), FN_DECIMAL(0.5132728656), FN_DECIMAL(0.9380385118), FN_DECIMAL(-0.7599270056), FN_DECIMAL(-0.7425936564), FN_DECIMAL(-0.6679610562), + FN_DECIMAL(-0.3018497816), FN_DECIMAL(0.814478266), FN_DECIMAL(0.03777430269), FN_DECIMAL(-0.7514235086), FN_DECIMAL(0.9662556939), FN_DECIMAL(-0.4720194901), FN_DECIMAL(-0.435054126), FN_DECIMAL(0.7091901235), FN_DECIMAL(0.929379209), FN_DECIMAL(0.9997434357), FN_DECIMAL(0.8306320299), FN_DECIMAL(-0.9434019629), FN_DECIMAL(-0.133133759), FN_DECIMAL(0.5048413216), FN_DECIMAL(0.3711995273), FN_DECIMAL(0.98552091), + FN_DECIMAL(0.7401857005), FN_DECIMAL(-0.9999981398), FN_DECIMAL(-0.2144033253), FN_DECIMAL(0.4808624681), FN_DECIMAL(-0.413835885), FN_DECIMAL(0.644229305), FN_DECIMAL(0.9626648696), FN_DECIMAL(0.1833665934), FN_DECIMAL(0.5794129), FN_DECIMAL(0.01404446873), FN_DECIMAL(0.4388494993), FN_DECIMAL(0.5213612322), FN_DECIMAL(-0.5281609948), FN_DECIMAL(-0.9745306846), FN_DECIMAL(-0.9904373013), FN_DECIMAL(0.9100232252), + FN_DECIMAL(-0.9914057719), FN_DECIMAL(0.7892627765), FN_DECIMAL(0.3364421659), FN_DECIMAL(-0.9416099764), FN_DECIMAL(0.7802732656), FN_DECIMAL(0.886302871), FN_DECIMAL(0.6524471291), FN_DECIMAL(0.5762186726), FN_DECIMAL(-0.08987644664), FN_DECIMAL(-0.2177026782), FN_DECIMAL(-0.9720345052), FN_DECIMAL(-0.05722538858), FN_DECIMAL(0.8105983127), FN_DECIMAL(0.3410261032), FN_DECIMAL(0.6452309645), FN_DECIMAL(-0.7810612152), + FN_DECIMAL(0.9989395718), FN_DECIMAL(-0.808247815), FN_DECIMAL(0.6370177929), FN_DECIMAL(0.5844658772), FN_DECIMAL(0.2054070861), FN_DECIMAL(0.055960522), FN_DECIMAL(-0.995827561), FN_DECIMAL(0.893409165), FN_DECIMAL(-0.931516824), FN_DECIMAL(0.328969469), FN_DECIMAL(-0.3193837488), FN_DECIMAL(0.7314755657), FN_DECIMAL(-0.7913517714), FN_DECIMAL(-0.2204109786), FN_DECIMAL(0.9955900414), FN_DECIMAL(-0.7112353139), + FN_DECIMAL(-0.7935008741), FN_DECIMAL(-0.9961918204), FN_DECIMAL(-0.9714163995), FN_DECIMAL(-0.9566188669), FN_DECIMAL(0.2748495632), FN_DECIMAL(-0.4681743221), FN_DECIMAL(-0.9614449642), FN_DECIMAL(0.585194072), FN_DECIMAL(0.4532946061), FN_DECIMAL(-0.9916113176), FN_DECIMAL(0.942479587), FN_DECIMAL(-0.9813704753), FN_DECIMAL(-0.6538429571), FN_DECIMAL(0.2923335053), FN_DECIMAL(-0.2246660704), FN_DECIMAL(-0.1800781949), + FN_DECIMAL(-0.9581216256), FN_DECIMAL(0.552215082), FN_DECIMAL(-0.9296791922), FN_DECIMAL(0.643183699), FN_DECIMAL(0.9997325981), FN_DECIMAL(-0.4606920354), FN_DECIMAL(-0.2148721265), FN_DECIMAL(0.3482070809), FN_DECIMAL(0.3075517813), FN_DECIMAL(0.6274756393), FN_DECIMAL(0.8910881765), FN_DECIMAL(-0.6397771309), FN_DECIMAL(-0.4479080125), FN_DECIMAL(-0.5247665011), FN_DECIMAL(-0.8386507094), FN_DECIMAL(0.3901291416), + FN_DECIMAL(0.1458336921), FN_DECIMAL(0.01624613149), FN_DECIMAL(-0.8273199879), FN_DECIMAL(0.5611100679), FN_DECIMAL(-0.8380219841), FN_DECIMAL(-0.9856122234), FN_DECIMAL(-0.861398618), FN_DECIMAL(0.6398413916), FN_DECIMAL(0.2694510795), FN_DECIMAL(0.4327334514), FN_DECIMAL(-0.9960265354), FN_DECIMAL(-0.939570655), FN_DECIMAL(-0.8846996446), FN_DECIMAL(0.7642113189), FN_DECIMAL(-0.7002080528), FN_DECIMAL(0.664508256), +}; +const FN_DECIMAL CELL_2D_Y[] = +{ + FN_DECIMAL(0.7649700911), FN_DECIMAL(0.9967722885), FN_DECIMAL(0.05734160033), FN_DECIMAL(-0.1610318741), FN_DECIMAL(0.371395799), FN_DECIMAL(-0.7961420628), FN_DECIMAL(0.6076990492), FN_DECIMAL(-0.9371723195), FN_DECIMAL(0.3324056156), FN_DECIMAL(0.07972205329), FN_DECIMAL(-0.4857529277), FN_DECIMAL(-0.9898503007), FN_DECIMAL(0.9036577593), FN_DECIMAL(0.05162417479), FN_DECIMAL(-0.02545330525), FN_DECIMAL(-0.998045976), + FN_DECIMAL(-0.7021653386), FN_DECIMAL(-0.4524967717), FN_DECIMAL(-0.9939885256), FN_DECIMAL(-0.4875625128), FN_DECIMAL(-0.9657481729), FN_DECIMAL(-0.7432567015), FN_DECIMAL(0.02515761212), FN_DECIMAL(0.4743044842), FN_DECIMAL(0.5771254669), FN_DECIMAL(0.4449408324), FN_DECIMAL(0.3416365773), FN_DECIMAL(0.9970960285), FN_DECIMAL(0.6994034849), FN_DECIMAL(0.4917517499), FN_DECIMAL(0.286765333), FN_DECIMAL(0.8713868327), + FN_DECIMAL(0.6172387009), FN_DECIMAL(0.9941540269), FN_DECIMAL(0.9632339851), FN_DECIMAL(-0.7913613129), FN_DECIMAL(0.847515538), FN_DECIMAL(0.6211056739), FN_DECIMAL(0.5171924952), FN_DECIMAL(-0.8198283277), FN_DECIMAL(-0.1832084353), FN_DECIMAL(0.7054329737), FN_DECIMAL(0.7325597678), FN_DECIMAL(0.9960630973), FN_DECIMAL(0.7419559859), FN_DECIMAL(0.9908355749), FN_DECIMAL(-0.346274329), FN_DECIMAL(0.2192641299), + FN_DECIMAL(-0.9060627411), FN_DECIMAL(-0.8683346653), FN_DECIMAL(0.9949314574), FN_DECIMAL(-0.6445220433), FN_DECIMAL(-0.8103794704), FN_DECIMAL(-0.2216977607), FN_DECIMAL(0.7168515217), FN_DECIMAL(0.612202264), FN_DECIMAL(-0.412428616), FN_DECIMAL(0.285325116), FN_DECIMAL(0.56227115), FN_DECIMAL(-0.9653857009), FN_DECIMAL(-0.6290361962), FN_DECIMAL(0.6491672535), FN_DECIMAL(0.443835306), FN_DECIMAL(-0.1791955706), + FN_DECIMAL(-0.6792690269), FN_DECIMAL(-0.9763662173), FN_DECIMAL(0.7391782104), FN_DECIMAL(0.8343693968), FN_DECIMAL(0.7238337389), FN_DECIMAL(0.4965557504), FN_DECIMAL(0.8075909592), FN_DECIMAL(-0.4459769977), FN_DECIMAL(-0.9331160806), FN_DECIMAL(-0.5710019572), FN_DECIMAL(0.9566512346), FN_DECIMAL(-0.08357920318), FN_DECIMAL(0.2146116448), FN_DECIMAL(-0.6739348049), FN_DECIMAL(0.8810115417), FN_DECIMAL(0.4467718167), + FN_DECIMAL(-0.7196250184), FN_DECIMAL(-0.749462481), FN_DECIMAL(0.9960561112), FN_DECIMAL(0.6600461127), FN_DECIMAL(-0.8465566164), FN_DECIMAL(-0.8525598897), FN_DECIMAL(-0.9732775654), FN_DECIMAL(0.6111293616), FN_DECIMAL(-0.9612584717), FN_DECIMAL(-0.7237870097), FN_DECIMAL(-0.9974830104), FN_DECIMAL(-0.8014006968), FN_DECIMAL(0.9528814544), FN_DECIMAL(-0.6884178931), FN_DECIMAL(-0.1691668301), FN_DECIMAL(0.9843571905), + FN_DECIMAL(0.7651544003), FN_DECIMAL(-0.09355982605), FN_DECIMAL(-0.5200134429), FN_DECIMAL(-0.006202125807), FN_DECIMAL(-0.9997683284), FN_DECIMAL(0.4919944954), FN_DECIMAL(-0.9928084436), FN_DECIMAL(-0.1253880012), FN_DECIMAL(-0.4165383308), FN_DECIMAL(-0.6148930171), FN_DECIMAL(-0.1034332049), FN_DECIMAL(-0.9070022917), FN_DECIMAL(-0.9503958117), FN_DECIMAL(0.9151503065), FN_DECIMAL(-0.6486716073), FN_DECIMAL(0.6397687707), + FN_DECIMAL(-0.9883386937), FN_DECIMAL(0.3507613761), FN_DECIMAL(0.9857642561), FN_DECIMAL(-0.9342026446), FN_DECIMAL(-0.9082419159), FN_DECIMAL(0.1560587169), FN_DECIMAL(0.4921240607), FN_DECIMAL(-0.453669308), FN_DECIMAL(0.6818037859), FN_DECIMAL(0.7976742329), FN_DECIMAL(0.9098610522), FN_DECIMAL(0.651633524), FN_DECIMAL(0.7177318024), FN_DECIMAL(-0.5528685241), FN_DECIMAL(0.5882467118), FN_DECIMAL(0.6593778956), + FN_DECIMAL(0.9371027648), FN_DECIMAL(-0.7168658839), FN_DECIMAL(-0.4757737632), FN_DECIMAL(0.7648291307), FN_DECIMAL(0.7503650398), FN_DECIMAL(0.1705063456), FN_DECIMAL(-0.8071558121), FN_DECIMAL(-0.9951433815), FN_DECIMAL(-0.8253280792), FN_DECIMAL(-0.7982502628), FN_DECIMAL(0.9352738503), FN_DECIMAL(0.8582254747), FN_DECIMAL(-0.3465310238), FN_DECIMAL(0.65000842), FN_DECIMAL(-0.6697422351), FN_DECIMAL(0.7441962291), + FN_DECIMAL(-0.9533555), FN_DECIMAL(0.5801940659), FN_DECIMAL(-0.9992862963), FN_DECIMAL(-0.659820211), FN_DECIMAL(0.2575848092), FN_DECIMAL(0.881588113), FN_DECIMAL(-0.9004043022), FN_DECIMAL(-0.7050172826), FN_DECIMAL(0.369126382), FN_DECIMAL(-0.02265088836), FN_DECIMAL(0.5568217228), FN_DECIMAL(-0.3316515286), FN_DECIMAL(0.991098079), FN_DECIMAL(-0.863212164), FN_DECIMAL(-0.9285531277), FN_DECIMAL(0.1695539323), + FN_DECIMAL(-0.672402505), FN_DECIMAL(-0.001928841934), FN_DECIMAL(0.9767452145), FN_DECIMAL(-0.8767960349), FN_DECIMAL(0.9103515037), FN_DECIMAL(-0.7648324016), FN_DECIMAL(0.2706960452), FN_DECIMAL(-0.9830446035), FN_DECIMAL(0.8150341657), FN_DECIMAL(-0.9999013716), FN_DECIMAL(-0.8985605806), FN_DECIMAL(0.8533360801), FN_DECIMAL(0.8491442537), FN_DECIMAL(-0.2242541966), FN_DECIMAL(-0.1379635899), FN_DECIMAL(-0.4145572694), + FN_DECIMAL(0.1308227633), FN_DECIMAL(0.6140555916), FN_DECIMAL(0.9417041303), FN_DECIMAL(-0.336705587), FN_DECIMAL(-0.6254387508), FN_DECIMAL(0.4631060578), FN_DECIMAL(-0.7578342456), FN_DECIMAL(-0.8172955655), FN_DECIMAL(-0.9959529228), FN_DECIMAL(-0.9760151351), FN_DECIMAL(0.2348380732), FN_DECIMAL(-0.9983612848), FN_DECIMAL(0.5856025746), FN_DECIMAL(-0.9400538266), FN_DECIMAL(-0.7639875669), FN_DECIMAL(0.6244544645), + FN_DECIMAL(0.04604054566), FN_DECIMAL(0.5888424828), FN_DECIMAL(0.7708490978), FN_DECIMAL(-0.8114182882), FN_DECIMAL(0.9786766212), FN_DECIMAL(-0.9984329822), FN_DECIMAL(0.09125496582), FN_DECIMAL(-0.4492438803), FN_DECIMAL(-0.3636982357), FN_DECIMAL(0.9443405575), FN_DECIMAL(-0.9476254645), FN_DECIMAL(-0.6818676535), FN_DECIMAL(-0.6113610831), FN_DECIMAL(0.9754070948), FN_DECIMAL(-0.0938108173), FN_DECIMAL(-0.7029540015), + FN_DECIMAL(-0.6085691109), FN_DECIMAL(-0.08718862881), FN_DECIMAL(-0.237381926), FN_DECIMAL(0.2913423132), FN_DECIMAL(0.9614872426), FN_DECIMAL(0.8836361266), FN_DECIMAL(-0.2749974196), FN_DECIMAL(-0.8108932717), FN_DECIMAL(-0.8913607575), FN_DECIMAL(0.129255541), FN_DECIMAL(-0.3342637104), FN_DECIMAL(-0.1921249337), FN_DECIMAL(-0.7566302845), FN_DECIMAL(-0.9563164339), FN_DECIMAL(-0.9744358146), FN_DECIMAL(0.9836522982), + FN_DECIMAL(-0.2863615732), FN_DECIMAL(0.8337016872), FN_DECIMAL(0.3683701937), FN_DECIMAL(0.7657119102), FN_DECIMAL(-0.02312427772), FN_DECIMAL(0.8875600535), FN_DECIMAL(0.976642191), FN_DECIMAL(0.9374176384), FN_DECIMAL(0.9515313457), FN_DECIMAL(-0.7786361937), FN_DECIMAL(-0.4538302125), FN_DECIMAL(-0.7685604874), FN_DECIMAL(-0.8940796454), FN_DECIMAL(-0.8512462154), FN_DECIMAL(0.5446696133), FN_DECIMAL(0.9207601495), + FN_DECIMAL(-0.9893091197), FN_DECIMAL(-0.9998680229), FN_DECIMAL(0.5617309299), FN_DECIMAL(-0.8277411985), FN_DECIMAL(0.545636467), FN_DECIMAL(0.1690223212), FN_DECIMAL(-0.5079295433), FN_DECIMAL(0.7685069899), FN_DECIMAL(-0.9630140787), FN_DECIMAL(0.9015219132), FN_DECIMAL(0.08905695279), FN_DECIMAL(-0.3423550559), FN_DECIMAL(-0.4661614943), FN_DECIMAL(-0.6449659371), FN_DECIMAL(0.7139388509), FN_DECIMAL(0.7472809229), +}; +const FN_DECIMAL CELL_3D_X[] = +{ + FN_DECIMAL(0.3752498686), FN_DECIMAL(0.687188096), FN_DECIMAL(0.2248135212), FN_DECIMAL(0.6692006647), FN_DECIMAL(-0.4376476931), FN_DECIMAL(0.6139972552), FN_DECIMAL(0.9494563929), FN_DECIMAL(0.8065108882), FN_DECIMAL(-0.2218812853), FN_DECIMAL(0.8484661167), FN_DECIMAL(0.5551817596), FN_DECIMAL(0.2133903499), FN_DECIMAL(0.5195126593), FN_DECIMAL(-0.6440141975), FN_DECIMAL(-0.5192897331), FN_DECIMAL(-0.3697654077), + FN_DECIMAL(-0.07927779647), FN_DECIMAL(0.4187757321), FN_DECIMAL(-0.750078731), FN_DECIMAL(0.6579554632), FN_DECIMAL(-0.6859803838), FN_DECIMAL(-0.6878407087), FN_DECIMAL(0.9490848347), FN_DECIMAL(0.5795829433), FN_DECIMAL(-0.5325976529), FN_DECIMAL(-0.1363699466), FN_DECIMAL(0.417665879), FN_DECIMAL(-0.9108236468), FN_DECIMAL(0.4438605427), FN_DECIMAL(0.819294887), FN_DECIMAL(-0.4033873915), FN_DECIMAL(-0.2817317705), + FN_DECIMAL(0.3969665622), FN_DECIMAL(0.5323450134), FN_DECIMAL(-0.6833017297), FN_DECIMAL(0.3881436661), FN_DECIMAL(-0.7119144767), FN_DECIMAL(-0.2306979838), FN_DECIMAL(-0.9398873022), FN_DECIMAL(0.1701906676), FN_DECIMAL(-0.4261839496), FN_DECIMAL(-0.003712295499), FN_DECIMAL(-0.734675004), FN_DECIMAL(-0.3195046015), FN_DECIMAL(0.7345307424), FN_DECIMAL(0.9766246496), FN_DECIMAL(-0.02003735175), FN_DECIMAL(-0.4824156342), + FN_DECIMAL(0.4245892007), FN_DECIMAL(0.9072427669), FN_DECIMAL(0.593346808), FN_DECIMAL(-0.8911762541), FN_DECIMAL(-0.7657571834), FN_DECIMAL(-0.5268198896), FN_DECIMAL(-0.8801903279), FN_DECIMAL(-0.6296409617), FN_DECIMAL(-0.09492481344), FN_DECIMAL(-0.4920470525), FN_DECIMAL(0.7307666154), FN_DECIMAL(-0.2514540636), FN_DECIMAL(-0.3356210347), FN_DECIMAL(-0.3522787894), FN_DECIMAL(0.87847885), FN_DECIMAL(-0.7424096346), + FN_DECIMAL(0.5757585274), FN_DECIMAL(0.4519299338), FN_DECIMAL(0.6420368628), FN_DECIMAL(-0.1128478447), FN_DECIMAL(0.499874883), FN_DECIMAL(0.5291681739), FN_DECIMAL(-0.5098837195), FN_DECIMAL(0.5639583502), FN_DECIMAL(-0.8456386526), FN_DECIMAL(-0.9657134875), FN_DECIMAL(-0.576437342), FN_DECIMAL(-0.5666013014), FN_DECIMAL(0.5667702405), FN_DECIMAL(-0.481316582), FN_DECIMAL(0.7313389916), FN_DECIMAL(-0.3805628566), + FN_DECIMAL(-0.6512675909), FN_DECIMAL(-0.2787156951), FN_DECIMAL(0.8648059114), FN_DECIMAL(-0.9730216276), FN_DECIMAL(-0.8335820906), FN_DECIMAL(0.2673159641), FN_DECIMAL(0.231150148), FN_DECIMAL(0.01286214638), FN_DECIMAL(0.6774953261), FN_DECIMAL(0.6542885718), FN_DECIMAL(-0.02545450161), FN_DECIMAL(0.2101238586), FN_DECIMAL(-0.5572105885), FN_DECIMAL(0.813705672), FN_DECIMAL(-0.7546026951), FN_DECIMAL(-0.2502500006), + FN_DECIMAL(-0.9979289381), FN_DECIMAL(0.7024037039), FN_DECIMAL(0.08990874624), FN_DECIMAL(0.8170812432), FN_DECIMAL(0.4226980265), FN_DECIMAL(-0.2442153475), FN_DECIMAL(-0.9183326731), FN_DECIMAL(0.6068222411), FN_DECIMAL(0.818676691), FN_DECIMAL(-0.7236735282), FN_DECIMAL(-0.5383903295), FN_DECIMAL(-0.6269337242), FN_DECIMAL(-0.0939331121), FN_DECIMAL(0.9203878539), FN_DECIMAL(-0.7256396824), FN_DECIMAL(0.6292431149), + FN_DECIMAL(0.4234156978), FN_DECIMAL(0.006685688024), FN_DECIMAL(-0.2598694113), FN_DECIMAL(0.6408036421), FN_DECIMAL(0.05899871622), FN_DECIMAL(0.7090281418), FN_DECIMAL(-0.5905222072), FN_DECIMAL(0.3128214264), FN_DECIMAL(-0.691925826), FN_DECIMAL(0.3634019349), FN_DECIMAL(-0.6772511147), FN_DECIMAL(-0.3204583896), FN_DECIMAL(-0.3906740409), FN_DECIMAL(-0.3342190395), FN_DECIMAL(-0.517779592), FN_DECIMAL(-0.6817711267), + FN_DECIMAL(0.6422383105), FN_DECIMAL(0.4388482478), FN_DECIMAL(0.2968562611), FN_DECIMAL(-0.2019778353), FN_DECIMAL(0.6014865048), FN_DECIMAL(0.9519280722), FN_DECIMAL(0.3398889569), FN_DECIMAL(0.8179709354), FN_DECIMAL(0.2365522154), FN_DECIMAL(0.3262175096), FN_DECIMAL(-0.8060715954), FN_DECIMAL(-0.2068642503), FN_DECIMAL(0.6208057279), FN_DECIMAL(-0.5274282502), FN_DECIMAL(-0.3722334928), FN_DECIMAL(-0.8923412971), + FN_DECIMAL(0.5341834201), FN_DECIMAL(-0.3663701513), FN_DECIMAL(-0.6114600319), FN_DECIMAL(0.5026307556), FN_DECIMAL(0.8396151729), FN_DECIMAL(0.9245042467), FN_DECIMAL(-0.7994843957), FN_DECIMAL(-0.5357200589), FN_DECIMAL(-0.6283359739), FN_DECIMAL(-0.61351886), FN_DECIMAL(-0.875632008), FN_DECIMAL(-0.5278879423), FN_DECIMAL(0.9087491985), FN_DECIMAL(-0.03500215466), FN_DECIMAL(-0.261365798), FN_DECIMAL(-0.579523541), + FN_DECIMAL(-0.3765052689), FN_DECIMAL(-0.74398252), FN_DECIMAL(0.4257318052), FN_DECIMAL(-0.1214508921), FN_DECIMAL(0.8561809753), FN_DECIMAL(0.6802835104), FN_DECIMAL(-0.5452131039), FN_DECIMAL(-0.1997156478), FN_DECIMAL(0.4562348357), FN_DECIMAL(-0.811704301), FN_DECIMAL(0.67793962), FN_DECIMAL(-0.9237819106), FN_DECIMAL(0.6973511259), FN_DECIMAL(-0.5189506), FN_DECIMAL(0.5517320032), FN_DECIMAL(-0.396710831), + FN_DECIMAL(0.5493762815), FN_DECIMAL(-0.2507853002), FN_DECIMAL(0.4788634005), FN_DECIMAL(0.387333516), FN_DECIMAL(-0.2176515694), FN_DECIMAL(0.6749832419), FN_DECIMAL(0.2148283022), FN_DECIMAL(-0.7521815872), FN_DECIMAL(0.4697000159), FN_DECIMAL(0.7890593699), FN_DECIMAL(-0.7606162952), FN_DECIMAL(0.01083397843), FN_DECIMAL(0.5254091908), FN_DECIMAL(-0.6748025877), FN_DECIMAL(0.751091524), FN_DECIMAL(0.05259056135), + FN_DECIMAL(0.01889481232), FN_DECIMAL(-0.6037423727), FN_DECIMAL(-0.6542965129), FN_DECIMAL(0.08873301081), FN_DECIMAL(-0.6191345671), FN_DECIMAL(0.4331858488), FN_DECIMAL(-0.3858351946), FN_DECIMAL(-0.1429059747), FN_DECIMAL(0.4118221036), FN_DECIMAL(-0.6247153214), FN_DECIMAL(-0.611423014), FN_DECIMAL(0.5542939606), FN_DECIMAL(-0.9432768808), FN_DECIMAL(-0.4567870451), FN_DECIMAL(-0.7349133547), FN_DECIMAL(0.399304489), + FN_DECIMAL(-0.7474927672), FN_DECIMAL(0.02589419753), FN_DECIMAL(0.783915821), FN_DECIMAL(0.6138668752), FN_DECIMAL(0.4276376047), FN_DECIMAL(-0.4347886353), FN_DECIMAL(0.02947841302), FN_DECIMAL(-0.833742746), FN_DECIMAL(0.3817221742), FN_DECIMAL(-0.8743368359), FN_DECIMAL(-0.3823443796), FN_DECIMAL(-0.6829243811), FN_DECIMAL(-0.3681903049), FN_DECIMAL(-0.367626833), FN_DECIMAL(-0.434583373), FN_DECIMAL(0.235891995), + FN_DECIMAL(-0.6874880269), FN_DECIMAL(-0.5115661773), FN_DECIMAL(-0.5534962601), FN_DECIMAL(0.5632777056), FN_DECIMAL(0.686191532), FN_DECIMAL(-0.05095871588), FN_DECIMAL(-0.06865785057), FN_DECIMAL(-0.5975288531), FN_DECIMAL(-0.6429790056), FN_DECIMAL(-0.3729361548), FN_DECIMAL(0.2237917666), FN_DECIMAL(0.6046773225), FN_DECIMAL(-0.5041542295), FN_DECIMAL(-0.03972191174), FN_DECIMAL(0.7028828406), FN_DECIMAL(-0.5560856498), + FN_DECIMAL(0.5898328456), FN_DECIMAL(-0.9308076766), FN_DECIMAL(0.4617069864), FN_DECIMAL(0.3190983137), FN_DECIMAL(0.9116567753), FN_DECIMAL(-0.45029554), FN_DECIMAL(0.3346334459), FN_DECIMAL(0.8525005645), FN_DECIMAL(0.2528483381), FN_DECIMAL(-0.8306630147), FN_DECIMAL(-0.6880390622), FN_DECIMAL(0.7448684026), FN_DECIMAL(-0.1963355843), FN_DECIMAL(-0.5900257974), FN_DECIMAL(0.9097057294), FN_DECIMAL(-0.2509196808), +}; +const FN_DECIMAL CELL_3D_Y[] = +{ + FN_DECIMAL(-0.6760585049), FN_DECIMAL(-0.09136176499), FN_DECIMAL(0.1681325679), FN_DECIMAL(-0.6688468686), FN_DECIMAL(-0.4822753902), FN_DECIMAL(-0.7891068824), FN_DECIMAL(-0.1877509944), FN_DECIMAL(0.548470914), FN_DECIMAL(-0.463339443), FN_DECIMAL(-0.4050542082), FN_DECIMAL(0.3218158513), FN_DECIMAL(0.2546493823), FN_DECIMAL(-0.3753271935), FN_DECIMAL(0.4745384887), FN_DECIMAL(0.481254652), FN_DECIMAL(-0.8934416489), + FN_DECIMAL(-0.6737085076), FN_DECIMAL(0.7469917228), FN_DECIMAL(0.3826230411), FN_DECIMAL(0.6751013678), FN_DECIMAL(-0.7248119515), FN_DECIMAL(-0.3224276742), FN_DECIMAL(-0.02076190936), FN_DECIMAL(-0.6404268166), FN_DECIMAL(-0.5292028444), FN_DECIMAL(0.7151414636), FN_DECIMAL(-0.6144655059), FN_DECIMAL(-0.369912124), FN_DECIMAL(0.6942067212), FN_DECIMAL(-0.4481558248), FN_DECIMAL(-0.6366894559), FN_DECIMAL(0.5956568471), + FN_DECIMAL(0.564274539), FN_DECIMAL(0.7145584688), FN_DECIMAL(0.6871918316), FN_DECIMAL(0.5657918509), FN_DECIMAL(-0.6275978114), FN_DECIMAL(0.4146983062), FN_DECIMAL(0.2638993789), FN_DECIMAL(-0.792633138), FN_DECIMAL(0.5706133514), FN_DECIMAL(0.8606546462), FN_DECIMAL(0.6490900316), FN_DECIMAL(-0.8242699196), FN_DECIMAL(0.6765819124), FN_DECIMAL(0.1959534069), FN_DECIMAL(-0.8426769757), FN_DECIMAL(-0.5917672797), + FN_DECIMAL(0.7517364266), FN_DECIMAL(0.03252559226), FN_DECIMAL(0.0883617105), FN_DECIMAL(0.4475064813), FN_DECIMAL(-0.1418643552), FN_DECIMAL(0.7343428473), FN_DECIMAL(0.3870192548), FN_DECIMAL(-0.7716703522), FN_DECIMAL(0.4839898327), FN_DECIMAL(0.7437439055), FN_DECIMAL(-0.5989573348), FN_DECIMAL(-0.8357068955), FN_DECIMAL(0.6086049038), FN_DECIMAL(0.9194627258), FN_DECIMAL(0.4718297238), FN_DECIMAL(-0.2650335884), + FN_DECIMAL(-0.6470352599), FN_DECIMAL(-0.5555181303), FN_DECIMAL(0.1222351235), FN_DECIMAL(0.7802044684), FN_DECIMAL(-0.8636947022), FN_DECIMAL(-0.2341352163), FN_DECIMAL(0.683030874), FN_DECIMAL(-0.5005858287), FN_DECIMAL(0.2334616211), FN_DECIMAL(0.2576877608), FN_DECIMAL(0.6666816727), FN_DECIMAL(-0.7663996863), FN_DECIMAL(0.794201982), FN_DECIMAL(0.6189308788), FN_DECIMAL(0.6071033261), FN_DECIMAL(-0.4206058253), + FN_DECIMAL(-0.3957336915), FN_DECIMAL(-0.8170257484), FN_DECIMAL(-0.1043240417), FN_DECIMAL(0.0002167596213), FN_DECIMAL(0.1816339018), FN_DECIMAL(-0.6838094939), FN_DECIMAL(-0.2495341969), FN_DECIMAL(-0.7116756954), FN_DECIMAL(-0.03361673621), FN_DECIMAL(-0.3350836431), FN_DECIMAL(0.2137186039), FN_DECIMAL(0.2557996786), FN_DECIMAL(0.7490117093), FN_DECIMAL(0.4942936549), FN_DECIMAL(-0.352686853), FN_DECIMAL(-0.3952445435), + FN_DECIMAL(-0.0459964767), FN_DECIMAL(-0.7115787471), FN_DECIMAL(0.08022899756), FN_DECIMAL(0.5362268157), FN_DECIMAL(-0.8258613686), FN_DECIMAL(0.1114171723), FN_DECIMAL(0.3882823051), FN_DECIMAL(-0.7915404457), FN_DECIMAL(0.3250957662), FN_DECIMAL(0.6401346464), FN_DECIMAL(-0.2662724517), FN_DECIMAL(-0.6727907114), FN_DECIMAL(-0.994730818), FN_DECIMAL(-0.3596358977), FN_DECIMAL(0.2344610069), FN_DECIMAL(-0.6645215546), + FN_DECIMAL(-0.7107590611), FN_DECIMAL(-0.4646617327), FN_DECIMAL(0.6717191355), FN_DECIMAL(0.5101893498), FN_DECIMAL(0.1185768238), FN_DECIMAL(0.236005093), FN_DECIMAL(-0.7811024061), FN_DECIMAL(0.5089325193), FN_DECIMAL(0.6073187658), FN_DECIMAL(-0.7930732557), FN_DECIMAL(-0.6822767155), FN_DECIMAL(0.3201532885), FN_DECIMAL(0.7545302807), FN_DECIMAL(0.1072664448), FN_DECIMAL(0.6784033173), FN_DECIMAL(-0.6595924967), + FN_DECIMAL(0.7276509498), FN_DECIMAL(0.5586689436), FN_DECIMAL(-0.6498636788), FN_DECIMAL(0.6789333174), FN_DECIMAL(0.7105966551), FN_DECIMAL(-0.2872214155), FN_DECIMAL(0.496746217), FN_DECIMAL(-0.3880337977), FN_DECIMAL(0.7324070604), FN_DECIMAL(-0.9326634749), FN_DECIMAL(-0.5867839255), FN_DECIMAL(0.8003043651), FN_DECIMAL(-0.1631882481), FN_DECIMAL(-0.6796374681), FN_DECIMAL(-0.8066678503), FN_DECIMAL(0.4238177418), + FN_DECIMAL(0.7715863549), FN_DECIMAL(0.5455367347), FN_DECIMAL(-0.03205115397), FN_DECIMAL(-0.6005545066), FN_DECIMAL(-0.5423640002), FN_DECIMAL(0.3569205906), FN_DECIMAL(-0.582071752), FN_DECIMAL(0.6407354361), FN_DECIMAL(0.7777142984), FN_DECIMAL(-0.09956428618), FN_DECIMAL(0.1100002681), FN_DECIMAL(0.8136349123), FN_DECIMAL(0.2923431904), FN_DECIMAL(0.9735794425), FN_DECIMAL(0.8324974864), FN_DECIMAL(-0.6179617717), + FN_DECIMAL(-0.9248386523), FN_DECIMAL(-0.6448780771), FN_DECIMAL(-0.5274402761), FN_DECIMAL(-0.7862170565), FN_DECIMAL(0.2682099744), FN_DECIMAL(-0.5848777694), FN_DECIMAL(-0.6364561467), FN_DECIMAL(-0.7167402514), FN_DECIMAL(-0.8677012494), FN_DECIMAL(0.4205286707), FN_DECIMAL(-0.7007832749), FN_DECIMAL(0.243272451), FN_DECIMAL(-0.1899846085), FN_DECIMAL(-0.6146124977), FN_DECIMAL(-0.8093357692), FN_DECIMAL(-0.03545096987), + FN_DECIMAL(-0.7191590868), FN_DECIMAL(0.7478645848), FN_DECIMAL(0.3623517328), FN_DECIMAL(0.8436992512), FN_DECIMAL(-0.2445711729), FN_DECIMAL(0.6897356637), FN_DECIMAL(-0.1708070787), FN_DECIMAL(0.4639272368), FN_DECIMAL(-0.7917186656), FN_DECIMAL(0.02980025428), FN_DECIMAL(0.6334156172), FN_DECIMAL(-0.9815544807), FN_DECIMAL(-0.2307217304), FN_DECIMAL(0.1080823318), FN_DECIMAL(0.5167601798), FN_DECIMAL(-0.845120016), + FN_DECIMAL(0.441572562), FN_DECIMAL(0.5876789172), FN_DECIMAL(-0.6365908737), FN_DECIMAL(0.68350166), FN_DECIMAL(0.5849723959), FN_DECIMAL(0.1164114357), FN_DECIMAL(-0.7379813884), FN_DECIMAL(-0.9613237178), FN_DECIMAL(-0.9071943084), FN_DECIMAL(-0.7682111105), FN_DECIMAL(0.639074459), FN_DECIMAL(-0.619358298), FN_DECIMAL(0.2807257131), FN_DECIMAL(-0.01800868791), FN_DECIMAL(0.3776607289), FN_DECIMAL(0.7207567823), + FN_DECIMAL(0.5536661486), FN_DECIMAL(-0.9974053117), FN_DECIMAL(-0.02047200006), FN_DECIMAL(-0.6739453804), FN_DECIMAL(-0.5607471297), FN_DECIMAL(0.8815553192), FN_DECIMAL(0.8275977415), FN_DECIMAL(0.3928902456), FN_DECIMAL(0.550991396), FN_DECIMAL(0.4247623676), FN_DECIMAL(-0.3436948871), FN_DECIMAL(-0.3653537677), FN_DECIMAL(0.3181702902), FN_DECIMAL(-0.6067173171), FN_DECIMAL(-0.8984128477), FN_DECIMAL(0.4220839766), + FN_DECIMAL(0.7238407199), FN_DECIMAL(-0.7766913695), FN_DECIMAL(0.6460037842), FN_DECIMAL(0.2544775664), FN_DECIMAL(0.6488840578), FN_DECIMAL(0.805016833), FN_DECIMAL(-0.9183807036), FN_DECIMAL(0.4144046357), FN_DECIMAL(0.270587208), FN_DECIMAL(-0.8813684494), FN_DECIMAL(0.6985971877), FN_DECIMAL(-0.7795603017), FN_DECIMAL(-0.8624480731), FN_DECIMAL(0.5532697017), FN_DECIMAL(0.711179521), FN_DECIMAL(-0.7798160574), + FN_DECIMAL(0.5225859041), FN_DECIMAL(0.1261859368), FN_DECIMAL(0.3398033582), FN_DECIMAL(-0.7472173667), FN_DECIMAL(-0.4032647119), FN_DECIMAL(-0.4246578154), FN_DECIMAL(0.8481212377), FN_DECIMAL(-0.2144838537), FN_DECIMAL(0.3431714491), FN_DECIMAL(0.5310188231), FN_DECIMAL(0.6682978632), FN_DECIMAL(0.3110433206), FN_DECIMAL(0.9263293599), FN_DECIMAL(-0.6155600569), FN_DECIMAL(0.07169784399), FN_DECIMAL(0.8985888773), +}; +const FN_DECIMAL CELL_3D_Z[] = +{ + FN_DECIMAL(-0.6341391283), FN_DECIMAL(-0.7207118346), FN_DECIMAL(0.9597866014), FN_DECIMAL(0.3237504235), FN_DECIMAL(-0.7588642466), FN_DECIMAL(-0.01782410481), FN_DECIMAL(0.2515593809), FN_DECIMAL(0.2207257205), FN_DECIMAL(-0.8579541106), FN_DECIMAL(0.3406410681), FN_DECIMAL(0.7669470462), FN_DECIMAL(-0.9431957648), FN_DECIMAL(0.7676171537), FN_DECIMAL(-0.6000491115), FN_DECIMAL(-0.7062096948), FN_DECIMAL(0.2550207115), + FN_DECIMAL(0.7347325213), FN_DECIMAL(0.5163625202), FN_DECIMAL(-0.5394270162), FN_DECIMAL(0.3336656285), FN_DECIMAL(-0.0638635111), FN_DECIMAL(-0.6503195787), FN_DECIMAL(0.3143356798), FN_DECIMAL(-0.5039217245), FN_DECIMAL(0.6605180464), FN_DECIMAL(-0.6855479011), FN_DECIMAL(-0.6693185756), FN_DECIMAL(0.1832083647), FN_DECIMAL(-0.5666258437), FN_DECIMAL(0.3576482138), FN_DECIMAL(-0.6571949095), FN_DECIMAL(-0.7522101635), + FN_DECIMAL(-0.7238865886), FN_DECIMAL(0.4538887323), FN_DECIMAL(0.2467106257), FN_DECIMAL(0.7274778869), FN_DECIMAL(0.3151170655), FN_DECIMAL(-0.8802293764), FN_DECIMAL(-0.2167232729), FN_DECIMAL(0.5854637865), FN_DECIMAL(0.7019741052), FN_DECIMAL(0.5091756071), FN_DECIMAL(0.1973189533), FN_DECIMAL(0.46743546), FN_DECIMAL(0.05197599597), FN_DECIMAL(0.088354718), FN_DECIMAL(0.5380464843), FN_DECIMAL(-0.6458224544), + FN_DECIMAL(-0.5045952393), FN_DECIMAL(0.419347884), FN_DECIMAL(0.8000823542), FN_DECIMAL(-0.07445020656), FN_DECIMAL(-0.6272881641), FN_DECIMAL(-0.428020311), FN_DECIMAL(-0.2747382083), FN_DECIMAL(-0.08987283726), FN_DECIMAL(0.8699098354), FN_DECIMAL(0.4524761885), FN_DECIMAL(-0.3274603257), FN_DECIMAL(0.4882262167), FN_DECIMAL(-0.7189983256), FN_DECIMAL(0.1746079907), FN_DECIMAL(0.0751772698), FN_DECIMAL(-0.6152927202), + FN_DECIMAL(0.4998474673), FN_DECIMAL(-0.6979677227), FN_DECIMAL(0.7568667263), FN_DECIMAL(-0.6152612058), FN_DECIMAL(0.06447140991), FN_DECIMAL(-0.8155744872), FN_DECIMAL(-0.5229602449), FN_DECIMAL(0.6567836838), FN_DECIMAL(-0.4799905631), FN_DECIMAL(0.03153534591), FN_DECIMAL(0.4724992466), FN_DECIMAL(-0.3026458097), FN_DECIMAL(-0.2191225827), FN_DECIMAL(-0.620692287), FN_DECIMAL(0.3107552588), FN_DECIMAL(0.8235670294), + FN_DECIMAL(0.6474915988), FN_DECIMAL(-0.5047637941), FN_DECIMAL(0.4911488878), FN_DECIMAL(-0.2307138167), FN_DECIMAL(-0.5216800015), FN_DECIMAL(0.6789305939), FN_DECIMAL(0.9403734863), FN_DECIMAL(0.702390397), FN_DECIMAL(0.7347584625), FN_DECIMAL(0.6779567958), FN_DECIMAL(0.9765635805), FN_DECIMAL(-0.9436177661), FN_DECIMAL(-0.358465925), FN_DECIMAL(-0.3058706624), FN_DECIMAL(0.5533414464), FN_DECIMAL(-0.8838306897), + FN_DECIMAL(0.04496841812), FN_DECIMAL(0.01687374963), FN_DECIMAL(-0.9927133148), FN_DECIMAL(-0.211752318), FN_DECIMAL(0.3732015249), FN_DECIMAL(0.9632990593), FN_DECIMAL(-0.07682417004), FN_DECIMAL(-0.07232213047), FN_DECIMAL(0.4733721775), FN_DECIMAL(0.2579229713), FN_DECIMAL(0.7995216286), FN_DECIMAL(0.3928189967), FN_DECIMAL(0.04107517667), FN_DECIMAL(0.1534542912), FN_DECIMAL(0.6468965045), FN_DECIMAL(0.4030684878), + FN_DECIMAL(-0.5617300988), FN_DECIMAL(-0.885463029), FN_DECIMAL(0.693729985), FN_DECIMAL(-0.5736527866), FN_DECIMAL(-0.9911905409), FN_DECIMAL(-0.66451538), FN_DECIMAL(0.2028855685), FN_DECIMAL(0.8019541421), FN_DECIMAL(-0.3903877149), FN_DECIMAL(-0.4888495114), FN_DECIMAL(-0.2753714057), FN_DECIMAL(-0.8915202143), FN_DECIMAL(0.5273119089), FN_DECIMAL(0.9363714773), FN_DECIMAL(-0.5212228249), FN_DECIMAL(-0.31642672), + FN_DECIMAL(0.2409440761), FN_DECIMAL(-0.703776404), FN_DECIMAL(-0.6996810411), FN_DECIMAL(-0.7058714505), FN_DECIMAL(-0.3650566783), FN_DECIMAL(0.1064744278), FN_DECIMAL(0.7985729102), FN_DECIMAL(0.424680257), FN_DECIMAL(-0.6384535592), FN_DECIMAL(0.1540161646), FN_DECIMAL(-0.07702731943), FN_DECIMAL(-0.5627789132), FN_DECIMAL(-0.7667919169), FN_DECIMAL(-0.509815999), FN_DECIMAL(0.4590525092), FN_DECIMAL(0.1552595611), + FN_DECIMAL(0.345402042), FN_DECIMAL(0.7537656024), FN_DECIMAL(0.7906259247), FN_DECIMAL(-0.6218493452), FN_DECIMAL(0.02979350071), FN_DECIMAL(-0.1337893489), FN_DECIMAL(-0.1483818606), FN_DECIMAL(0.549965562), FN_DECIMAL(0.01882482408), FN_DECIMAL(-0.7833783002), FN_DECIMAL(0.4702855809), FN_DECIMAL(0.2435827372), FN_DECIMAL(0.2978428332), FN_DECIMAL(0.2256499906), FN_DECIMAL(0.4885036897), FN_DECIMAL(0.5312962584), + FN_DECIMAL(0.05401156992), FN_DECIMAL(0.1749922158), FN_DECIMAL(-0.7352273018), FN_DECIMAL(0.6058980284), FN_DECIMAL(0.4416079111), FN_DECIMAL(0.4417378638), FN_DECIMAL(0.5455879807), FN_DECIMAL(-0.6681295324), FN_DECIMAL(0.1973431441), FN_DECIMAL(0.4053292055), FN_DECIMAL(0.2220375492), FN_DECIMAL(0.2957118467), FN_DECIMAL(0.6910913512), FN_DECIMAL(0.5940890106), FN_DECIMAL(-0.2014135283), FN_DECIMAL(-0.9172588213), + FN_DECIMAL(-0.4254361401), FN_DECIMAL(-0.6146586825), FN_DECIMAL(-0.7996193253), FN_DECIMAL(-0.3716777111), FN_DECIMAL(-0.9448876842), FN_DECIMAL(-0.2620349924), FN_DECIMAL(0.9615995749), FN_DECIMAL(-0.4679683524), FN_DECIMAL(0.3905937144), FN_DECIMAL(0.613593722), FN_DECIMAL(0.1422937358), FN_DECIMAL(0.1908754211), FN_DECIMAL(0.8189704912), FN_DECIMAL(-0.7300408736), FN_DECIMAL(-0.4108776451), FN_DECIMAL(-0.5319834504), + FN_DECIMAL(-0.8970265651), FN_DECIMAL(-0.5386359045), FN_DECIMAL(0.4082255906), FN_DECIMAL(0.7245356676), FN_DECIMAL(0.5239080873), FN_DECIMAL(-0.8937552226), FN_DECIMAL(-0.553637673), FN_DECIMAL(0.2354455182), FN_DECIMAL(-0.0860293075), FN_DECIMAL(-0.1399373318), FN_DECIMAL(-0.4666323327), FN_DECIMAL(0.5560157407), FN_DECIMAL(0.1772619533), FN_DECIMAL(-0.8893937725), FN_DECIMAL(-0.5632714576), FN_DECIMAL(-0.5666264959), + FN_DECIMAL(-0.3670263736), FN_DECIMAL(-0.06717242579), FN_DECIMAL(0.6205295181), FN_DECIMAL(-0.4110536264), FN_DECIMAL(0.7090054553), FN_DECIMAL(0.183899597), FN_DECIMAL(-0.5605470555), FN_DECIMAL(0.3879565548), FN_DECIMAL(0.7420893903), FN_DECIMAL(-0.2347595118), FN_DECIMAL(-0.8577217497), FN_DECIMAL(0.6325590203), FN_DECIMAL(-0.8736152276), FN_DECIMAL(0.7048011129), FN_DECIMAL(-0.06317948268), FN_DECIMAL(0.8753285574), + FN_DECIMAL(-0.05843650473), FN_DECIMAL(-0.3674922622), FN_DECIMAL(-0.5256624401), FN_DECIMAL(0.7861039337), FN_DECIMAL(0.3287714416), FN_DECIMAL(0.5910593099), FN_DECIMAL(-0.3896960134), FN_DECIMAL(0.6864605361), FN_DECIMAL(0.7164918431), FN_DECIMAL(-0.290014277), FN_DECIMAL(-0.6796169617), FN_DECIMAL(0.1632515592), FN_DECIMAL(0.04485347486), FN_DECIMAL(0.8320545697), FN_DECIMAL(0.01339408056), FN_DECIMAL(-0.2874989857), + FN_DECIMAL(0.615630723), FN_DECIMAL(0.3430367014), FN_DECIMAL(0.8193658136), FN_DECIMAL(-0.5829600957), FN_DECIMAL(0.07911697781), FN_DECIMAL(0.7854296063), FN_DECIMAL(-0.4107442306), FN_DECIMAL(0.4766964066), FN_DECIMAL(-0.9045999527), FN_DECIMAL(-0.1673856787), FN_DECIMAL(0.2828077348), FN_DECIMAL(-0.5902737632), FN_DECIMAL(-0.321506229), FN_DECIMAL(-0.5224513133), FN_DECIMAL(-0.4090169985), FN_DECIMAL(-0.3599685311), }; -static const float CELLULAR3D_LUT[][3] = +static int FastFloor(FN_DECIMAL f) { return (f >= 0 ? (int)f : (int)f - 1); } +static int FastRound(FN_DECIMAL f) { return (f >= 0) ? (int)(f + FN_DECIMAL(0.5)) : (int)(f - FN_DECIMAL(0.5)); } +static int FastAbs(int i) { return abs(i); } +static FN_DECIMAL FastAbs(FN_DECIMAL f) { return fabs(f); } +static FN_DECIMAL Lerp(FN_DECIMAL a, FN_DECIMAL b, FN_DECIMAL t) { return a + t * (b - a); } +static FN_DECIMAL InterpHermiteFunc(FN_DECIMAL t) { return t*t*(3 - 2 * t); } +static FN_DECIMAL InterpQuinticFunc(FN_DECIMAL t) { return t*t*t*(t*(t * 6 - 15) + 10); } +static FN_DECIMAL CubicLerp(FN_DECIMAL a, FN_DECIMAL b, FN_DECIMAL c, FN_DECIMAL d, FN_DECIMAL t) { - { -0.0754560603505074f, -0.352466298044147f, 0.235267278808342f }, { 0.375595337603153f, 0.231008132619556f, 0.0676738115920836f }, { -0.117712754267955f, 0.118823977675711f, 0.383220995235334f }, { -0.315022593984555f, -0.356826861858672f, 0.14429057112708f }, { 0.278226241297412f, -0.0824907503739393f, 0.0319716918006141f }, { 0.0721684409910568f, -0.0568065516303533f, -0.270396222381411f }, { -0.188642405575107f, 0.426286802128244f, -0.0997959961417977f }, { -0.21241450198315f, -0.156988971972095f, -0.371816039814609f }, - { 0.0863582411916157f, 0.247123671654167f, -0.178732678014738f }, { -0.316057297392795f, -0.166683643723161f, -0.0611778223515034f }, { 0.328289724658807f, -0.247873201332817f, 0.0327134144703831f }, { 0.298161327325315f, 0.157043311120146f, -0.194787277619172f }, { 0.235578213651412f, -0.435245262589905f, -0.0422642484955862f }, { 0.327685758031643f, 0.241172355667957f, -0.207969548732154f }, { 0.00871052597199329f, 0.443412172727963f, -0.223881734853918f }, { -0.327815963122739f, -0.0632251381117975f, 0.0638698032894591f }, - { 0.171293757904134f, -0.268967805310664f, 0.247330179961144f }, { -0.0949972350817184f, 0.063004943044643f, 0.294697968547845f }, { -0.0300170884515747f, -0.246318276945069f, -0.352747202100628f }, { -0.311656463135497f, 0.251926029121401f, -0.0149343564869993f }, { 0.0967990124710062f, -0.0232670198658895f, 0.411444409421758f }, { 0.171471713858107f, 0.34757034412655f, 0.308498108582644f }, { -0.226321846928427f, 0.0150474907816183f, -0.28139906987385f }, { 0.31642670441849f, -0.213204067384848f, -0.134793324142343f }, - { -0.153080406416659f, -0.0708935401097545f, -0.374335538114601f }, { -0.141898142497496f, 0.396109169772019f, 0.217791125319443f }, { 0.0705297169419404f, -0.129260274971251f, 0.406859211329066f }, { 0.251810227220121f, 0.124949974348436f, -0.393553355584399f }, { -0.0368495944166345f, 0.241600973547733f, 0.148996628567347f }, { 0.386176272686462f, 0.0704541941317958f, 0.282892824561693f }, { -0.448707875225182f, -0.211852236277489f, -0.0593266252597142f }, { 0.26362413360482f, 0.121776945503026f, 0.400589609531262f }, - { 0.0356172105184771f, -0.0694961844311607f, 0.207096739368625f }, { 0.0220676410856254f, -0.243509045746833f, -0.346155427302331f }, { -0.332850454243997f, -0.273747394478838f, -0.22048981878446f }, { -0.0192534015774575f, 0.274761909811407f, 0.0538736339590546f }, { 0.165317580671615f, -0.17816927829344f, 0.111506805650966f }, { 0.160011063093249f, -0.189988000083815f, -0.123927439752988f }, { -0.0556742716525043f, -0.145924001539992f, 0.255437545994726f }, { -0.0756379835094876f, 0.117828081134182f, -0.0120650913993298f }, - { -0.197210049133133f, 0.366845948861914f, -0.069149027078396f }, { -0.327754728775996f, -0.150084029241845f, 0.145075072942995f }, { 0.161237889571005f, -0.243941829192892f, -0.175439034288131f }, { -0.309384192990048f, 0.073277812505501f, 0.11883287100647f }, { 0.0232216051376899f, -0.108987914593452f, 0.0761115614757536f }, { -0.347002244980896f, -0.0790758856307948f, -0.292676467340568f }, { 0.103534060321088f, -0.203205137065946f, 0.118248046232412f }, { -0.179220531222376f, -0.344376091077383f, 0.264564404302929f }, - { -0.105623452834155f, 0.172260765651461f, 0.286525292886974f }, { 0.274615478686034f, 0.39708151176951f, 0.108857497420682f }, { 0.0272308304879481f, -0.29857786875525f, 0.218901052935987f }, { 0.181150683549163f, -0.0390599930595309f, 0.0949206494787788f }, { -0.00544027941931291f, 0.258695402688113f, 0.159206235697394f }, { 0.14666780165587f, -0.295910619616463f, -0.141165960124873f }, { -0.426587975388305f, 0.0760382887605349f, 0.0472664490532966f }, { -0.0152659279961116f, 0.180812473889749f, 0.259829082596259f }, - { 0.352340969489831f, 0.0949483549802f, -0.177789296750313f }, { -0.0905631767650262f, 0.263643399485011f, -0.177426671881535f }, { -0.0970863948176078f, -0.33023504648773f, -0.285310888372764f }, { 0.0979689417894761f, 0.1887091910561f, 0.433033843855928f }, { -0.326971547677627f, -0.249788070497878f, -0.234005939695248f }, { -0.325347232785791f, -0.316738721236934f, -0.20152323790929f }, { 0.218137901142078f, 0.339775203104837f, 0.136861866669955f }, { 0.00486092295852336f, 0.152424623596169f, -0.207909928163038f }, - { -0.0224237596869308f, -0.111900496204799f, -0.418651994989208f }, { -0.320527275160396f, 0.0837356323613371f, -0.0780152086437003f }, { 0.0280545571637402f, 0.407068362508662f, -0.232043213598857f }, { 0.173273195782102f, 0.032319521677456f, 0.251161338290762f }, { -0.127089097779856f, -0.130136356191262f, 0.298162430252907f }, { 0.428700245699538f, 0.0346044966001166f, -0.0204478035247239f }, { 0.123276076546935f, -0.176201654967961f, 0.140866137138884f }, { -0.167754642481773f, -0.16902730786879f, 0.199609554336224f }, - { 0.223309910629808f, -0.0669686697938046f, -0.130671553077962f }, { -0.287382586145988f, -0.29283231663167f, 0.113706916565294f }, { 0.261284336575583f, -0.0802855040763278f, 0.324631782222548f }, { 0.129138154866895f, -0.180303542151919f, -0.0542081960881317f }, { -0.00322524201704166f, -0.243319454466774f, -0.362203650983436f }, { -0.268885359697498f, -0.313746527308031f, -0.0862470339408644f }, { 0.268103596101711f, -0.0377728764616946f, 0.00828001824924351f }, { 0.201924589190448f, 0.252778778826486f, 0.169097036415934f }, - { 0.0546812195057308f, 0.0800291713727608f, 0.0127197209798533f }, { -0.329478417276474f, -0.252260304381621f, 0.0811441199641992f }, { 0.0091774761997484f, -0.28113417626388f, 0.237416782049565f }, { 0.0116337713075201f, -0.0188369389512223f, 0.480322379472401f }, { -0.305467029064262f, 0.341714339313991f, 0.173830325450309f }, { 0.000413372001765056f, 0.11516372089457f, -0.0474483021807772f }, { 0.00146930779539023f, 0.174098694109033f, 0.187423873199821f }, { -0.101880886099702f, -0.158549810567217f, -0.455340710792498f }, - { -0.0195640688989295f, 0.0308029895294849f, -0.00872802775024206f }, { -0.063948607587152f, -0.171039592434666f, -0.0894551497004384f }, { -0.0545760624153979f, 0.464803465232108f, 0.124693473073799f }, { 0.3502937004872f, -0.199728724661434f, -0.141569473253716f }, { 0.0480124973209703f, 0.0425320941310352f, 0.0576268391267263f }, { 0.0700554646300197f, -0.120177701533213f, 0.362939649754906f }, { -0.0888968497938477f, -0.0442641180954902f, 0.166977335738641f }, { 0.0697174979695231f, 0.0644477521727814f, -0.172231794817971f }, - { 0.222483000892674f, 0.194106396048384f, 0.316456746402756f }, { -0.170135444019886f, -0.00324314723026486f, -0.165167042724334f }, { 0.188254592483392f, -0.127943637635902f, 0.289532792150166f }, { 0.0321017602916118f, 0.348205815674701f, -0.0423729539991641f }, { 0.0507248787487231f, -0.253204804600527f, -0.0490837360518831f }, { 0.111313377002407f, 0.349362368224835f, 0.334910365753693f }, { 0.257937106004627f, 0.105411965585877f, -0.361711729374542f }, { 0.0512900731488198f, -0.229549656856243f, 0.257417925577553f }, - { -0.0381335012121889f, -0.330155168592936f, -0.333446175022896f }, { 0.110047540932941f, 0.43508905862244f, 0.0277996810151547f }, { 0.363155663971144f, 0.0668365347413614f, -0.229422247703535f }, { 0.30237496486279f, 0.181161839632804f, -0.221745064022372f }, { -0.175531221684405f, 0.118314189158817f, -0.0946833041061461f }, { -0.0470680223650999f, 0.0792855222829776f, 0.300601076715962f }, { 0.467711149632443f, -0.0521985142563184f, -0.00732893624357533f }, { -0.486423326745718f, 0.110947174674555f, 0.0263696605073731f }, - { 0.0673719962838721f, -0.0778641524623683f, -0.467765990824302f }, { -0.165167932030356f, 0.0892720815465723f, -0.453272099337044f }, { 0.333578699113336f, -0.0297017005530308f, -0.0593905771419292f }, { 0.293288259258728f, 0.329403857510877f, -0.0759052841271396f }, { -0.204973281426423f, -0.309881996850931f, -0.150366438202898f }, { -0.206856274245894f, -0.179009067617496f, 0.221566961074757f }, { 0.255178679781575f, 0.153287028194758f, 0.00198543730535206f }, { -0.0636156864091478f, -0.0803024091741419f, 0.0530485248550313f }, - { 0.0751579446945424f, 0.182907776192345f, 0.18834028318176f }, { -0.468324198184296f, -0.115280697354904f, 0.0483896328016261f }, { 0.0345510640405808f, 0.386355307366794f, 0.151812147023893f }, { 0.365574769745067f, -0.00837337833290497f, -0.18850992962134f }, { -0.0806692553709122f, 0.0415279784091643f, 0.17127732820122f }, { -0.118467082405899f, -0.0597561635624523f, 0.317959096715079f }, { -0.076768269845923f, -0.0144695926151897f, -0.15893078666523f }, { -0.248815876390639f, -0.387878624851675f, -0.0522421374813546f }, -}; - -static const float CELLULAR2D_LUT[][2] = -{ - { 0.250708038153379f, 0.249427694225972f }, { 0.0869437515459609f, 0.184749552136559f }, { -0.0413046810386655f, 0.403981043609444f }, { -0.0293907403944378f, 0.49913076795134f }, { -0.315196544673176f, 0.112131089257973f }, { 0.284986509052738f, -0.239847923263601f }, { -0.0546095496331694f, -0.387046123842226f }, { -0.455916077222658f, -0.0285751529349881f }, - { -0.159697602772812f, -0.069715028041617f }, { -0.13499310031726f, -0.24544360590384f }, { 0.0712784658236382f, -0.210509752150429f }, { -0.183139799640577f, 0.0989616462898892f }, { -0.120954871197088f, -0.404416525393099f }, { 0.0397020774694894f, -0.332051780499794f }, { 0.156583517215517f, -0.355997670354414f }, { -0.118253736644093f, -0.273834274561332f }, - { 0.407280633332697f, 0.0695704319921797f }, { -0.181395165743625f, -0.0360988318776937f }, { 0.149517494831831f, 0.275252778735439f }, { -0.239680212428189f, -0.296006529252734f }, { 0.0648980428870777f, -0.165592673711567f }, { -0.164235060392619f, -0.044152747040758f }, { -0.0880929686013205f, 0.319070946524584f }, { -0.359118900783392f, -0.145231031891457f }, - { 0.13904415334069f, 0.115456824951353f }, { 0.0842991474059002f, 0.0604465759876108f }, { -0.353890154574729f, 0.0563377224444608f }, { -0.191548757651777f, 0.458666569079093f }, { -0.0305852649733824f, -0.103294981589093f }, { -0.244249558051389f, -0.184215340423203f }, { -0.335508375435451f, 0.366044689290556f }, { -0.0842977163909816f, -0.181691541539155f }, - { -0.194574831896163f, -0.0360977050226033f }, { -0.0136275832633322f, 0.348855027149362f }, { 0.112779750419581f, 0.250740618802603f }, { 0.446016898314568f, 0.19375271707891f }, { 0.370298098312872f, -0.308060032847868f }, { -0.174031950246891f, 0.068370776312583f }, { -0.0320673407373619f, -0.490638717459424f }, { 0.277163688315855f, 0.12127656301314f }, - { 0.0568558134728565f, 0.350239706769654f }, { 0.205869692362488f, -0.400914200219679f }, { -0.391075780729104f, 0.239049951016082f }, { 0.0898368903641186f, 0.396970664249824f }, { -0.12708545544806f, 0.205550073947438f }, { 0.329713608183662f, -0.00124387983313534f }, { 0.215101309878185f, 0.31230482220907f }, { -0.299990667492553f, 0.0362774842315264f }, - { -0.162024884165002f, 0.390269354299181f }, { 0.247175458660869f, -0.164649461140494f }, { -0.00702116345848802f, 0.177588576697459f }, { -0.0535304504389743f, -0.40845998572649f }, { 0.0145856109573733f, 0.382905331923157f }, { 0.216280639152196f, -0.209660172189405f }, { 0.402533050670213f, 0.162391078948541f }, { -0.365399410561553f, -0.110910594428755f }, - { 0.174770668216721f, -0.397793366833591f }, { 0.32230859429012f, -0.137029006198646f }, { 0.171029762566206f, -0.381445776782064f }, { -0.229611775033244f, 0.0104655318145362f }, { -0.293902727481095f, -0.373532221230389f }, { 0.285221677418125f, -0.296232913639187f }, { -0.28269015083746f, 0.403270257987613f }, { -0.43086572953841f, -0.179317972362171f }, - { -0.310057947802406f, -0.0787640260872092f }, { 0.0533765298216697f, 0.440202724974886f }, { -0.354033675325863f, 0.0698196861581185f }, { 0.311115679250857f, -0.129663260096312f }, { 0.229255390402563f, -0.328758027086313f }, { -0.33536302092319f, -0.290805878133609f }, { -0.384663256926429f, 0.238445759121866f }, { 0.281520545158111f, 0.264852699142123f }, - { -0.218357566260313f, 0.0793706065412086f }, { 0.164980332762834f, 0.182041388247544f }, { 0.307207781894971f, -0.22816860870366f }, { -0.454503892591875f, 0.0592878003115745f }, { -0.0894050246174167f, -0.418329169674f }, { -0.276089185505125f, 0.0439845273659423f }, { -0.151684626764266f, -0.0037583472744015f }, { 0.133104875185567f, 0.185590164995452f }, - { -0.102966431104062f, -0.433484981926515f }, { 0.131172549940418f, 0.278916720062804f }, { 0.0938441203621891f, 0.378164201175125f }, { 0.390368899361443f, 0.0258977574673016f }, { -0.304185462809122f, -0.220404718569479f }, { 0.041114945526263f, 0.0231437900813286f }, { -0.0553679533766611f, 0.109770312957138f }, { -0.153408636511854f, -0.259551360860073f }, - { 0.18314747642386f, 0.346041366704221f }, { -0.202409229916045f, 0.0830509156789105f }, { 0.00263870789986387f, -0.14989084637648f }, { -0.0174869839365028f, -0.0973506129991467f }, { -0.335359236494802f, -0.0804404327143762f }, { -0.241126779112638f, -0.0757387480664328f }, { 0.261018611568062f, -0.0492869133053188f }, { -0.0959999647631716f, 0.222694380942215f }, - { 0.299431284684768f, 0.106521457979214f }, { 0.227637867405222f, -0.174455746888093f }, { 0.0922702482664376f, 0.26819649456602f }, { -0.151399312307839f, -0.125974097818691f }, { 0.108938078293079f, -0.304856700693976f }, { -0.438854244630266f, -0.132330505223942f }, { 0.0717952564882181f, 0.275888210440627f }, { -0.215751231440234f, 0.0355311465640098f }, - { 0.422176755226945f, -0.0189335471371869f }, { -0.408859832848213f, 0.000537910856484469f }, { -0.0362598525704807f, 0.357413669332284f }, { -0.28032466328989f, 0.347911002432735f }, { 0.198710871738271f, 0.0601322001820659f }, { 0.285019264549449f, -0.298882702144618f }, { -0.0780288055851716f, 0.441572196343895f }, { 0.15900180964612f, 0.449105031972222f }, - { 0.203387295255816f, 0.0755020611275794f }, { 0.466447410709773f, 0.0154577407226987f }, { 0.09642323208626f, 0.448221598304089f }, { -0.147868203532494f, -0.0586292019305197f }, { 0.32832047650105f, -0.0852312055816367f }, { -0.229855755874368f, -0.229760903875133f }, { 0.133073203870081f, 0.474537707771751f }, { 0.158309714495696f, 0.366021857483007f }, - { 0.132325770252795f, 0.239780173970358f }, { 0.0390928599864625f, -0.244597408317102f }, { 0.0343482304430441f, 0.232382438149273f }, { 0.15455940326916f, -0.237057253070687f }, { -0.176575322299199f, 0.422823548490547f }, { 0.209170093404748f, -0.385858241380788f }, { 0.020364957428845f, 0.386396490846172f }, { 0.0812228894854148f, 0.189603055294904f }, -}; - -static const float CELLULAR3D_HQ_LUT[][3] = -{ - { 0.262932373665163f, 0.153551471449999f, -0.291969634275151f }, { -0.708609143985588f, -0.514998048421491f, 0.468159964816915f }, { 0.0551260170047587f, -0.103445903417864f, 0.376255883682633f }, { 0.653683775467831f, -0.209613833397724f, 0.474524557390902f }, { -0.767495075439816f, -0.277635268454571f, -0.499126852976707f }, { 0.0517033820553658f, -0.450874096824908f, 0.259859999016614f }, { -0.328914949209403f, 0.315228929382438f, -0.149017858088919f }, { 0.0702011812650336f, -0.193692109698035f, -0.304651622963667f }, - { 0.115919086058792f, -0.751681327447624f, -0.0578792834991346f }, { 0.105405347691047f, 0.596411986507577f, -0.33931739668656f }, { -0.106893530709245f, 0.280618421509181f, -0.832043100155617f }, { -0.0654181807636467f, -0.817494727882153f, 0.527423134166989f }, { -0.66607712436171f, 0.387833863130976f, -0.311127054266423f }, { 0.222366128263935f, 0.434069356849451f, 0.00109203594106155f }, { -0.582103888739791f, -0.403986953332572f, -0.165705027911859f }, { 0.147627538078114f, 0.288260167875865f, -0.883529956736502f }, - { -0.402250371905059f, 0.832656383831385f, 0.186741768838311f }, { 0.473464736343465f, -0.679703118275789f, -0.40077691322837f }, { -0.035237830398541f, -0.419372284464907f, -0.477838593663681f }, { -0.430487584231229f, -0.290911667411263f, 0.505812452597545f }, { 0.530931074100062f, -0.650579753053343f, 0.515492249408879f }, { 0.220881415711242f, -0.469097215411346f, 0.157019606755508f }, { 0.27675389355964f, 0.901383931545492f, 0.231732886094137f }, { -0.014879042790529f, 0.811750856488725f, -0.434024472541077f }, - { 0.538380603929312f, -0.21066468611799f, -0.724148505984583f }, { -0.121759133523113f, -0.793801224166494f, -0.132237392467051f }, { 0.117840222824295f, -0.355374228588378f, 0.124682929359946f }, { 0.688176141934959f, 0.521187417030148f, 0.345118407050836f }, { 0.407086542191789f, 0.732926996979246f, -0.209010702506625f }, { 0.32581242531042f, 0.558528412538481f, 0.71158552609818f }, { -0.555004950694707f, 0.516168523403744f, -0.240804448574935f }, { -0.904859502439036f, 0.0743969389263999f, 0.104715802991092f }, - { 0.073325689986677f, -0.782036330994516f, -0.443786517587736f }, { -0.459555572527443f, 0.441887114861482f, -0.698441137965975f }, { -0.289668589713193f, 0.136769868484689f, -0.151654754992696f }, { 0.0237640444705514f, -0.269938670705644f, 0.607147708571096f }, { 0.67380601738027f, -0.309629481481464f, -0.460400343102835f }, { -0.397564983510291f, -0.673833834620159f, -0.0268946039774807f }, { 0.0462694151743761f, -0.45226005741164f, 0.49630646089289f }, { 0.866762371975284f, -0.295718510182752f, 0.0149819193522451f }, - { 0.2029001303841f, -0.860056357816732f, -0.393452982216838f }, { -0.0998122338298171f, 0.294931944597187f, 0.178736158605963f }, { 0.875395522526907f, -0.0825672831515398f, -0.460278189186178f }, { 0.383915619327118f, 0.518552179491168f, 0.671760904200527f }, { -0.61311255399366f, 0.322849149919877f, 0.17618402803691f }, { -0.234437862015477f, -0.627320988866885f, -0.265500329226805f }, { 0.416683509524642f, -0.140340238885287f, -0.68350172163144f }, { -0.489865936729821f, 0.304547764633088f, -0.577657734402201f }, - { 0.015759591666709f, -0.594032257039018f, 0.463159994056296f }, { 0.439192390921798f, -0.336126120843506f, -0.422737546477267f }, { 0.71744341454758f, -0.00698408270005091f, 0.499074258720097f }, { 0.252743757804593f, 0.0784696789857056f, -0.926006060991399f }, { 0.0956254270548202f, 0.884658796043882f, -0.0114316642871644f }, { -0.216903755102342f, -0.43309359670365f, 0.793361004002833f }, { 0.52089409573502f, -0.19360022054141f, 0.38119863467235f }, { 0.570874593801336f, -0.741499682901108f, 0.195220233022693f }, - { 0.230116054141979f, -0.811711249775019f, -0.159575177040295f }, { -0.52123457383871f, 0.608624936295915f, 0.0449283489961014f }, { 0.127265509406933f, 0.112318538538559f, 0.922257260069714f }, { 0.0435935031911137f, 0.115754498653675f, 0.391429386205104f }, { 0.0102467351406248f, 0.431649787010987f, -0.398787878721233f }, { -0.458384483848666f, -0.427369330684921f, -0.587018487633901f }, { -0.483950934055113f, 0.417657401116388f, -0.491178601954959f }, { 0.236858447246911f, -0.458162993791689f, -0.263844368869653f }, - { -0.340861098779621f, -0.295116464376117f, -0.000253402065530928f }, { -0.17073745544894f, -0.450108815269867f, -0.680400290523957f }, { 0.669276083671338f, 0.111032563569802f, -0.514052787961861f }, { 0.450325970818041f, -0.723645973102069f, -0.509385455376786f }, { 0.40546085170602f, 0.298810476349315f, 0.304299653922338f }, { -0.35105196810049f, 0.00378437413660104f, -0.164198941209194f }, { 0.15837401340184f, -0.58760716162567f, -0.213442574113378f }, { 0.504589866318021f, 0.770581155351702f, 0.371072038157382f }, - { -0.569917417360092f, 0.559090216133928f, 0.160062597545231f }, { 0.160070848322477f, -0.0395876689862924f, -0.532067587816388f }, { -0.0162490333694416f, -0.166606441887101f, 0.59031696309757f }, { 0.207454135965524f, -0.0260188121959155f, -0.0599975464877465f }, { 0.383393993979441f, 0.663436168489971f, -0.157384854720779f }, { 0.350733297272835f, 0.316730570942483f, 0.577922336088516f }, { -0.570698620220757f, -0.175181454934868f, -0.480423100007302f }, { 0.245776347749264f, 0.427276333132852f, -0.688657145411795f }, - { 0.00224144344693711f, 0.00486875393689057f, 0.188630013244312f }, { -0.22320226271512f, 0.923078828186733f, 0.296394027890566f }, { -0.449367472675937f, 0.269408537364126f, -0.390764128147193f }, { -0.394689368226122f, 0.142154313149621f, 0.800140356276413f }, { -0.230385706804416f, 0.485731274665201f, -0.492797919049728f }, { -0.380864075462633f, 0.467568868467785f, -0.603299465591556f }, { 0.548776278357963f, -0.537839005994549f, 0.397971844121229f }, { -0.275174053701755f, -0.391807088222938f, 0.480636386049214f }, - { 0.284656397891213f, 0.0581184553813519f, -0.841053249656449f }, { -0.386828737091746f, -0.235379652741697f, 0.263850790355352f }, { 0.143987287842321f, 0.755274882908506f, 0.422080517050494f }, { 0.000470724533063294f, -0.0473107320549859f, 0.0724971409709871f }, { 0.103391561905551f, -0.917431070027245f, 0.119939586652184f }, { -0.0457566323054017f, 0.0442951353165546f, -0.535182076224448f }, { -0.641716861271846f, -0.3611219930046f, -0.459985999588059f }, { -0.317723907645648f, 0.473887486072258f, -0.0815424940022806f }, - { -0.150956959580923f, -0.898069335729604f, -0.0749817012181173f }, { -0.0694370536183593f, -0.809740700114329f, -0.524988425169715f }, { 0.0183640251609041f, 0.00284625229352731f, 0.0961110706401243f }, { -0.620624836946168f, -0.562868042878287f, -0.205118401290757f }, { 0.408689589075526f, -0.501262203450612f, 0.277695531087804f }, { 0.186931149366143f, -0.663548375891839f, 0.355733357372202f }, { -0.141842957269254f, 0.120921681621546f, -0.671084668688337f }, { -0.264873428039199f, 0.283796022182013f, 0.264201694496239f }, - { 0.845910171349198f, 0.115571332098421f, -0.0593372087567183f }, { 0.506886450146619f, 0.58255219714823f, 0.509438518167282f }, { 0.511438935024482f, 0.313488364222524f, -0.134014278985907f }, { 0.335472286345643f, 0.0563688323103442f, 0.371470647626975f }, { 0.762365131690096f, 0.504192783610985f, -0.235338237516637f }, { 0.620629080010914f, 0.164210058630659f, -0.506830471222315f }, { 0.915246129596587f, -0.399684515794182f, 0.0460348647894813f }, { -0.443640166123101f, -0.411333818521207f, -0.228855711069713f }, - { -0.0891555675181099f, 0.424254955210822f, 0.705840028112787f }, { 0.374854327358691f, -0.901486549279051f, -0.177736019017455f }, { 0.907817968660537f, -0.0159931756505556f, -0.148322983300674f }, { 0.414043522473934f, 0.0396720299759967f, -0.154121976568144f }, { -0.215641489200622f, -0.863190025563005f, 0.282817477121766f }, { -0.493384676399966f, -0.486965227586759f, -0.277041556868121f }, { -0.145413267930942f, 0.367234756450644f, 0.255892208595349f }, { 0.208240177121022f, 0.0679624055226822f, -0.11065853298164f }, - { -0.783340968157716f, 0.494544372295232f, 0.0986476741588405f }, { -0.465821052204292f, -0.254657063635933f, -0.203297244054974f }, { 0.182339141215468f, -0.599744300940732f, 0.149427656165992f }, { 0.255210939940937f, -0.637324227353845f, 0.356059851123357f }, { 0.069708224081209f, 0.153461716043562f, 0.890917610812324f }, { -0.672197456743714f, 0.0338542979125953f, 0.516046304990767f }, { 0.0796552321449462f, 0.423954290457488f, -0.273956291079693f }, { 0.237432509436643f, -0.790497730916185f, -0.124872981867872f }, -}; - -static const float CELLULAR2D_HQ_LUT[][2] = -{ - { 0.501416076306759f, 0.498855388451945f }, { 0.173887503091922f, 0.369499104273119f }, { -0.0826093620773309f, 0.807962087218888f }, { -0.0587814807888756f, 0.998261535902679f }, { -0.630393089346351f, 0.224262178515945f }, { 0.569973018105476f, -0.479695846527202f }, { -0.109219099266339f, -0.774092247684452f }, { -0.911832154445317f, -0.0571503058699763f }, - { -0.319395205545624f, -0.139430056083234f }, { -0.26998620063452f, -0.490887211807679f }, { 0.142556931647276f, -0.421019504300857f }, { -0.366279599281153f, 0.197923292579778f }, { -0.241909742394175f, -0.808833050786198f }, { 0.0794041549389788f, -0.664103560999588f }, { 0.313167034431034f, -0.711995340708829f }, { -0.236507473288186f, -0.547668549122665f }, - { 0.814561266665395f, 0.139140863984359f }, { -0.362790331487249f, -0.0721976637553874f }, { 0.299034989663662f, 0.550505557470879f }, { -0.479360424856379f, -0.592013058505467f }, { 0.129796085774155f, -0.331185347423135f }, { -0.328470120785237f, -0.088305494081516f }, { -0.176185937202641f, 0.638141893049167f }, { -0.718237801566785f, -0.290462063782915f }, - { 0.278088306681379f, 0.230913649902705f }, { 0.1685982948118f, 0.120893151975222f }, { -0.707780309149458f, 0.112675444888922f }, { -0.383097515303555f, 0.917333138158185f }, { -0.0611705299467649f, -0.206589963178185f }, { -0.488499116102778f, -0.368430680846406f }, { -0.671016750870902f, 0.732089378581113f }, { -0.168595432781963f, -0.36338308307831f }, - { -0.389149663792326f, -0.0721954100452067f }, { -0.0272551665266645f, 0.697710054298724f }, { 0.225559500839161f, 0.501481237605205f }, { 0.892033796629135f, 0.38750543415782f }, { 0.740596196625744f, -0.616120065695737f }, { -0.348063900493782f, 0.136741552625166f }, { -0.0641346814747239f, -0.981277434918847f }, { 0.55432737663171f, 0.242553126026281f }, - { 0.113711626945713f, 0.700479413539308f }, { 0.411739384724977f, -0.801828400439358f }, { -0.782151561458208f, 0.478099902032164f }, { 0.179673780728237f, 0.793941328499648f }, { -0.25417091089612f, 0.411100147894876f }, { 0.659427216367324f, -0.00248775966627068f }, { 0.43020261975637f, 0.624609644418139f }, { -0.599981334985107f, 0.0725549684630529f }, - { -0.324049768330005f, 0.780538708598361f }, { 0.494350917321738f, -0.329298922280988f }, { -0.014042326916976f, 0.355177153394918f }, { -0.107060900877949f, -0.81691997145298f }, { 0.0291712219147466f, 0.765810663846315f }, { 0.432561278304393f, -0.41932034437881f }, { 0.805066101340427f, 0.324782157897081f }, { -0.730798821123107f, -0.22182118885751f }, - { 0.349541336433442f, -0.795586733667181f }, { 0.64461718858024f, -0.274058012397292f }, { 0.342059525132412f, -0.762891553564127f }, { -0.459223550066487f, 0.0209310636290725f }, { -0.58780545496219f, -0.747064442460778f }, { 0.570443354836249f, -0.592465827278374f }, { -0.56538030167492f, 0.806540515975226f }, { -0.861731459076821f, -0.358635944724342f }, - { -0.620115895604812f, -0.157528052174418f }, { 0.106753059643339f, 0.880405449949772f }, { -0.708067350651726f, 0.139639372316237f }, { 0.622231358501715f, -0.259326520192625f }, { 0.458510780805126f, -0.657516054172625f }, { -0.67072604184638f, -0.581611756267217f }, { -0.769326513852858f, 0.476891518243733f }, { 0.563041090316222f, 0.529705398284246f }, - { -0.436715132520625f, 0.158741213082417f }, { 0.329960665525668f, 0.364082776495089f }, { 0.614415563789942f, -0.45633721740732f }, { -0.909007785183749f, 0.118575600623149f }, { -0.178810049234833f, -0.836658339348f }, { -0.55217837101025f, 0.0879690547318845f }, { -0.303369253528533f, -0.00751669454880299f }, { 0.266209750371134f, 0.371180329990904f }, - { -0.205932862208124f, -0.866969963853029f }, { 0.262345099880836f, 0.557833440125609f }, { 0.187688240724378f, 0.75632840235025f }, { 0.780737798722887f, 0.0517955149346032f }, { -0.608370925618243f, -0.440809437138958f }, { 0.0822298910525261f, 0.0462875801626572f }, { -0.110735906753322f, 0.219540625914276f }, { -0.306817273023707f, -0.519102721720146f }, - { 0.366294952847719f, 0.692082733408441f }, { -0.40481845983209f, 0.166101831357821f }, { 0.00527741579972774f, -0.299781692752959f }, { -0.0349739678730057f, -0.194701225998293f }, { -0.670718472989604f, -0.160880865428752f }, { -0.482253558225276f, -0.151477496132866f }, { 0.522037223136125f, -0.0985738266106375f }, { -0.191999929526343f, 0.445388761884429f }, - { 0.598862569369537f, 0.213042915958428f }, { 0.455275734810445f, -0.348911493776186f }, { 0.184540496532875f, 0.536392989132039f }, { -0.302798624615678f, -0.251948195637381f }, { 0.217876156586158f, -0.609713401387953f }, { -0.877708489260532f, -0.264661010447884f }, { 0.143590512976436f, 0.551776420881253f }, { -0.431502462880468f, 0.0710622931280196f }, - { 0.84435351045389f, -0.0378670942743737f }, { -0.817719665696427f, 0.00107582171296894f }, { -0.0725197051409614f, 0.714827338664568f }, { -0.56064932657978f, 0.695822004865471f }, { 0.397421743476542f, 0.120264400364132f }, { 0.570038529098898f, -0.597765404289235f }, { -0.156057611170343f, 0.88314439268779f }, { 0.31800361929224f, 0.898210063944443f }, - { 0.406774590511633f, 0.151004122255159f }, { 0.932894821419546f, 0.0309154814453974f }, { 0.19284646417252f, 0.896443196608179f }, { -0.295736407064989f, -0.117258403861039f }, { 0.6566409530021f, -0.170462411163273f }, { -0.459711511748736f, -0.459521807750266f }, { 0.266146407740162f, 0.949075415543502f }, { 0.316619428991393f, 0.732043714966014f }, - { 0.26465154050559f, 0.479560347940717f }, { 0.078185719972925f, -0.489194816634204f }, { 0.0686964608860883f, 0.464764876298545f }, { 0.309118806538319f, -0.474114506141374f }, { -0.353150644598397f, 0.845647096981094f }, { 0.418340186809496f, -0.771716482761576f }, { 0.0407299148576901f, 0.772792981692343f }, { 0.16244577897083f, 0.379206110589807f }, - -}; - -static int FastFloor(float f) { return (f >= 0.0f ? (int)f : (int)f - 1); } -static int FastRound(float f) { return (f >= 0.0f) ? (int)(f + 0.5f) : (int)(f - 0.5f); } -static float FastAbs(float f) { return (f >= 0.0f) ? f : -f; } -static int FastAbs(int i) { return (i > 0) ? i : -i; } -static float Lerp(float a, float b, float t) { return a + t * (b - a); } -static void LerpVector3(float* out, float* a, float* b, float t) -{ - out[0] = Lerp(a[0], b[0], t); - out[1] = Lerp(a[1], b[1], t); - out[2] = Lerp(a[2], b[2], t); + FN_DECIMAL p = (d - c) - (a - b); + return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; } -static float InterpHermiteFunc(float t) { return (t*t*(3 - 2 * t)); } -static float InterpQuinticFunc(float t) { return t*t*t*(t*(t * 6 - 15) + 10); } +void FastNoise::SetSeed(int seed) +{ + m_seed = seed; + + std::mt19937_64 gen(seed); + + for (int i = 0; i < 256; i++) + m_perm[i] = i; + + for (int j = 0; j < 256; j++) + { + int rng = (int)(gen() % (256 - j)); + int k = rng + j; + int l = m_perm[j]; + m_perm[j] = m_perm[j + 256] = m_perm[k]; + m_perm[k] = l; + m_perm12[j] = m_perm12[j + 256] = m_perm[j] % 12; + } +} + +void FastNoise::CalculateFractalBounding() +{ + FN_DECIMAL amp = m_gain; + FN_DECIMAL ampFractal = 1.0f; + for (int i = 1; i < m_octaves; i++) + { + ampFractal += amp; + amp *= m_gain; + } + m_fractalBounding = 1.0f / ampFractal; +} + +void FastNoise::SetCellularDistance2Indices(int cellularDistanceIndex0, int cellularDistanceIndex1) +{ + m_cellularDistanceIndex0 = std::min(cellularDistanceIndex0, cellularDistanceIndex1); + m_cellularDistanceIndex1 = std::max(cellularDistanceIndex0, cellularDistanceIndex1); + + m_cellularDistanceIndex0 = std::min(std::max(m_cellularDistanceIndex0, 0), FN_CELLULAR_INDEX_MAX); + m_cellularDistanceIndex1 = std::min(std::max(m_cellularDistanceIndex1, 0), FN_CELLULAR_INDEX_MAX); +} + +void FastNoise::GetCellularDistance2Indices(int& cellularDistanceIndex0, int& cellularDistanceIndex1) const +{ + cellularDistanceIndex0 = m_cellularDistanceIndex0; + cellularDistanceIndex1 = m_cellularDistanceIndex1; +} + +unsigned char FastNoise::Index2D_12(unsigned char offset, int x, int y) const +{ + return m_perm12[(x & 0xff) + m_perm[(y & 0xff) + offset]]; +} +unsigned char FastNoise::Index3D_12(unsigned char offset, int x, int y, int z) const +{ + return m_perm12[(x & 0xff) + m_perm[(y & 0xff) + m_perm[(z & 0xff) + offset]]]; +} +unsigned char FastNoise::Index4D_32(unsigned char offset, int x, int y, int z, int w) const +{ + return m_perm[(x & 0xff) + m_perm[(y & 0xff) + m_perm[(z & 0xff) + m_perm[(w & 0xff) + offset]]]] & 31; +} +unsigned char FastNoise::Index2D_256(unsigned char offset, int x, int y) const +{ + return m_perm[(x & 0xff) + m_perm[(y & 0xff) + offset]]; +} +unsigned char FastNoise::Index3D_256(unsigned char offset, int x, int y, int z) const +{ + return m_perm[(x & 0xff) + m_perm[(y & 0xff) + m_perm[(z & 0xff) + offset]]]; +} +unsigned char FastNoise::Index4D_256(unsigned char offset, int x, int y, int z, int w) const +{ + return m_perm[(x & 0xff) + m_perm[(y & 0xff) + m_perm[(z & 0xff) + m_perm[(w & 0xff) + offset]]]]; +} // Hashing +#define X_PRIME 1619 +#define Y_PRIME 31337 +#define Z_PRIME 6971 +#define W_PRIME 1013 -inline int FastNoise::CoordLUTIndex(int seed, int x, int y, int z, int w) +static FN_DECIMAL ValCoord2D(int seed, int x, int y) { - int hash = seed; - hash ^= x; - hash *= 15485863; - hash ^= y; - hash *= 10057189; - hash ^= z; - hash *= 987391; - hash ^= w; - hash *= 418493; - hash ^= hash >> 16; + int n = seed; + n ^= X_PRIME * x; + n ^= Y_PRIME * y; - return hash & LUT_MASK; + return (n * n * n * 60493) / FN_DECIMAL(2147483648); +} +static FN_DECIMAL ValCoord3D(int seed, int x, int y, int z) +{ + int n = seed; + n ^= X_PRIME * x; + n ^= Y_PRIME * y; + n ^= Z_PRIME * z; + + return (n * n * n * 60493) / FN_DECIMAL(2147483648); +} +static FN_DECIMAL ValCoord4D(int seed, int x, int y, int z, int w) +{ + int n = seed; + n ^= X_PRIME * x; + n ^= Y_PRIME * y; + n ^= Z_PRIME * z; + n ^= W_PRIME * w; + + return (n * n * n * 60493) / FN_DECIMAL(2147483648); } -inline int FastNoise::CoordLUTIndex(int seed, int x, int y, int z) +FN_DECIMAL FastNoise::ValCoord2DFast(unsigned char offset, int x, int y) const { - int hash = seed; - hash ^= x; - hash *= 15485863; - hash ^= y; - hash *= 10057189; - hash ^= z; - hash *= 987391; - hash ^= hash >> 16; - - return hash & LUT_MASK; + return VAL_LUT[Index2D_256(offset, x, y)]; +} +FN_DECIMAL FastNoise::ValCoord3DFast(unsigned char offset, int x, int y, int z) const +{ + return VAL_LUT[Index3D_256(offset, x, y, z)]; } -inline int FastNoise::CoordLUTIndex(int seed, int x, int y) +FN_DECIMAL FastNoise::GradCoord2D(unsigned char offset, int x, int y, FN_DECIMAL xd, FN_DECIMAL yd) const { - int hash = seed; - hash ^= x; - hash *= 15485863; - hash ^= y; - hash *= 10057189; - hash ^= hash >> 16; + unsigned char lutPos = Index2D_12(offset, x, y); - return hash & LUT_MASK; + return xd*GRAD_X[lutPos] + yd*GRAD_Y[lutPos]; +} +FN_DECIMAL FastNoise::GradCoord3D(unsigned char offset, int x, int y, int z, FN_DECIMAL xd, FN_DECIMAL yd, FN_DECIMAL zd) const +{ + unsigned char lutPos = Index3D_12(offset, x, y, z); + + return xd*GRAD_X[lutPos] + yd*GRAD_Y[lutPos] + zd*GRAD_Z[lutPos]; +} +FN_DECIMAL FastNoise::GradCoord4D(unsigned char offset, int x, int y, int z, int w, FN_DECIMAL xd, FN_DECIMAL yd, FN_DECIMAL zd, FN_DECIMAL wd) const +{ + unsigned char lutPos = Index4D_32(offset, x, y, z, w) << 2; + + return xd*GRAD_4D[lutPos] + yd*GRAD_4D[lutPos + 1] + zd*GRAD_4D[lutPos + 2] + wd*GRAD_4D[lutPos + 3]; } -float FastNoise::GetNoise(float x, float y, float z) +FN_DECIMAL FastNoise::GetNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { x *= m_frequency; y *= m_frequency; @@ -251,197 +338,190 @@ float FastNoise::GetNoise(float x, float y, float z) switch (m_noiseType) { - case FastNoise::NoiseType::Value: - return _Value(m_seed, x, y, z); - case FastNoise::NoiseType::ValueFractal: + case Value: + return SingleValue(0, x, y, z); + case ValueFractal: switch (m_fractalType) { - case FastNoise::FBM: - return _ValueFractalFBM(x, y, z); - case FastNoise::Billow: - return _ValueFractalBillow(x, y, z); - case FastNoise::RigidMulti: - return _ValueFractalRigidMulti(x, y, z); + case FBM: + return SingleValueFractalFBM(x, y, z); + case Billow: + return SingleValueFractalBillow(x, y, z); + case RigidMulti: + return SingleValueFractalRigidMulti(x, y, z); default: - return 0.0f; + return 0; } - case FastNoise::NoiseType::Gradient: - return _Gradient(m_seed, x, y, z); - case FastNoise::NoiseType::GradientFractal: + case Perlin: + return SinglePerlin(0, x, y, z); + case PerlinFractal: switch (m_fractalType) { - case FastNoise::FBM: - return _GradientFractalFBM(x, y, z); - case FastNoise::Billow: - return _GradientFractalBillow(x, y, z); - case FastNoise::RigidMulti: - return _GradientFractalRigidMulti(x, y, z); + case FBM: + return SinglePerlinFractalFBM(x, y, z); + case Billow: + return SinglePerlinFractalBillow(x, y, z); + case RigidMulti: + return SinglePerlinFractalRigidMulti(x, y, z); default: - return 0.0f; + return 0; } - case FastNoise::NoiseType::Simplex: - return _Simplex(m_seed, x, y, z); - case FastNoise::NoiseType::SimplexFractal: + case Simplex: + return SingleSimplex(0, x, y, z); + case SimplexFractal: switch (m_fractalType) { - case FastNoise::FBM: - return _SimplexFractalFBM(x, y, z); - case FastNoise::Billow: - return _SimplexFractalBillow(x, y, z); - case FastNoise::RigidMulti: - return _SimplexFractalRigidMulti(x, y, z); + case FBM: + return SingleSimplexFractalFBM(x, y, z); + case Billow: + return SingleSimplexFractalBillow(x, y, z); + case RigidMulti: + return SingleSimplexFractalRigidMulti(x, y, z); default: - return 0.0f; + return 0; } - case FastNoise::NoiseType::Cellular: + case Cellular: switch (m_cellularReturnType) { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2Edge(x, y, z); + case CellValue: + case NoiseLookup: + case Distance: + return SingleCellular(x, y, z); default: - return _Cellular(x, y, z); + return SingleCellular2Edge(x, y, z); } - case FastNoise::NoiseType::CellularHQ: - switch (m_cellularReturnType) - { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2EdgeHQ(x, y, z); - default: - return _CellularHQ(x, y, z); - } - case FastNoise::NoiseType::WhiteNoise: + case WhiteNoise: return GetWhiteNoise(x, y, z); + case Cubic: + return SingleCubic(0, x, y, z); + case CubicFractal: + switch (m_fractalType) + { + case FBM: + return SingleCubicFractalFBM(x, y, z); + case Billow: + return SingleCubicFractalBillow(x, y, z); + case RigidMulti: + return SingleCubicFractalRigidMulti(x, y, z); + } default: - return 0.0f; + return 0; } } -float FastNoise::GetNoise(float x, float y) +FN_DECIMAL FastNoise::GetNoise(FN_DECIMAL x, FN_DECIMAL y) const { x *= m_frequency; y *= m_frequency; switch (m_noiseType) { - case FastNoise::NoiseType::Value: - return _Value(m_seed, x, y); - case FastNoise::NoiseType::ValueFractal: + case Value: + return SingleValue(0, x, y); + case ValueFractal: switch (m_fractalType) { - case FastNoise::FBM: - return _ValueFractalFBM(x, y); - case FastNoise::Billow: - return _ValueFractalBillow(x, y); - case FastNoise::RigidMulti: - return _ValueFractalRigidMulti(x, y); - default: - return 0.0f; + case FBM: + return SingleValueFractalFBM(x, y); + case Billow: + return SingleValueFractalBillow(x, y); + case RigidMulti: + return SingleValueFractalRigidMulti(x, y); } - case FastNoise::NoiseType::Gradient: - return _Gradient(m_seed, x, y); - case FastNoise::NoiseType::GradientFractal: + case Perlin: + return SinglePerlin(0, x, y); + case PerlinFractal: switch (m_fractalType) { - case FastNoise::FBM: - return _GradientFractalFBM(x, y); - case FastNoise::Billow: - return _GradientFractalBillow(x, y); - case FastNoise::RigidMulti: - return _GradientFractalRigidMulti(x, y); - default: - return 0.0f; + case FBM: + return SinglePerlinFractalFBM(x, y); + case Billow: + return SinglePerlinFractalBillow(x, y); + case RigidMulti: + return SinglePerlinFractalRigidMulti(x, y); } - case FastNoise::NoiseType::Simplex: - return _Simplex(m_seed, x, y); - case FastNoise::NoiseType::SimplexFractal: + case Simplex: + return SingleSimplex(0, x, y); + case SimplexFractal: switch (m_fractalType) { - case FastNoise::FBM: - return _SimplexFractalFBM(x, y); - case FastNoise::Billow: - return _SimplexFractalBillow(x, y); - case FastNoise::RigidMulti: - return _SimplexFractalRigidMulti(x, y); - default: - return 0.0f; + case FBM: + return SingleSimplexFractalFBM(x, y); + case Billow: + return SingleSimplexFractalBillow(x, y); + case RigidMulti: + return SingleSimplexFractalRigidMulti(x, y); } - case FastNoise::NoiseType::Cellular: + case Cellular: switch (m_cellularReturnType) { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2Edge(x, y); + case CellValue: + case NoiseLookup: + case Distance: + return SingleCellular(x, y); default: - return _Cellular(x, y); + return SingleCellular2Edge(x, y); } - case FastNoise::NoiseType::CellularHQ: - switch (m_cellularReturnType) - { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2EdgeHQ(x, y); - default: - return _CellularHQ(x, y); - } - case FastNoise::NoiseType::WhiteNoise: + case WhiteNoise: return GetWhiteNoise(x, y); - default: - return 0.0f; + case Cubic: + return SingleCubic(0, x, y); + case CubicFractal: + switch (m_fractalType) + { + case FBM: + return SingleCubicFractalFBM(x, y); + case Billow: + return SingleCubicFractalBillow(x, y); + case RigidMulti: + return SingleCubicFractalRigidMulti(x, y); + } } + return 0; } // White Noise -float FastNoise::GetWhiteNoise(float x, float y, float z, float w) +FN_DECIMAL FastNoise::GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w) const { - return VAL_LUT[CoordLUTIndex(m_seed, + return ValCoord4D(m_seed, *reinterpret_cast(&x) ^ (*reinterpret_cast(&x) >> 16), *reinterpret_cast(&y) ^ (*reinterpret_cast(&y) >> 16), *reinterpret_cast(&z) ^ (*reinterpret_cast(&z) >> 16), - *reinterpret_cast(&w) ^ (*reinterpret_cast(&w) >> 16))]; + *reinterpret_cast(&w) ^ (*reinterpret_cast(&w) >> 16)); } -float FastNoise::GetWhiteNoise(float x, float y, float z) +FN_DECIMAL FastNoise::GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - return VAL_LUT[CoordLUTIndex(m_seed, + return ValCoord3D(m_seed, *reinterpret_cast(&x) ^ (*reinterpret_cast(&x) >> 16), *reinterpret_cast(&y) ^ (*reinterpret_cast(&y) >> 16), - *reinterpret_cast(&z) ^ (*reinterpret_cast(&z) >> 16))]; + *reinterpret_cast(&z) ^ (*reinterpret_cast(&z) >> 16)); } -float FastNoise::GetWhiteNoise(float x, float y) +FN_DECIMAL FastNoise::GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y) const { - return VAL_LUT[CoordLUTIndex(m_seed, + return ValCoord2D(m_seed, *reinterpret_cast(&x) ^ (*reinterpret_cast(&x) >> 16), - *reinterpret_cast(&y) ^ (*reinterpret_cast(&y) >> 16))]; + *reinterpret_cast(&y) ^ (*reinterpret_cast(&y) >> 16)); } -float FastNoise::GetWhiteNoiseInt(int x, int y, int z, int w) +FN_DECIMAL FastNoise::GetWhiteNoiseInt(int x, int y, int z, int w) const { - return VAL_LUT[CoordLUTIndex(m_seed, x, y, z, w)]; + return ValCoord4D(m_seed, x, y, z, w); } -float FastNoise::GetWhiteNoiseInt(int x, int y, int z) +FN_DECIMAL FastNoise::GetWhiteNoiseInt(int x, int y, int z) const { - return VAL_LUT[CoordLUTIndex(m_seed, x, y, z)]; + return ValCoord3D(m_seed, x, y, z); } -float FastNoise::GetWhiteNoiseInt(int x, int y) +FN_DECIMAL FastNoise::GetWhiteNoiseInt(int x, int y) const { - return VAL_LUT[CoordLUTIndex(m_seed, x, y)]; + return ValCoord2D(m_seed, x, y); } // Value Noise -float FastNoise::GetValueFractal(float x, float y, float z) +FN_DECIMAL FastNoise::GetValueFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { x *= m_frequency; y *= m_frequency; @@ -449,24 +529,22 @@ float FastNoise::GetValueFractal(float x, float y, float z) switch (m_fractalType) { - case FastNoise::FBM: - return _ValueFractalFBM(x, y, z); - case FastNoise::Billow: - return _ValueFractalBillow(x, y, z); - case FastNoise::RigidMulti: - return _ValueFractalRigidMulti(x, y, z); + case FBM: + return SingleValueFractalFBM(x, y, z); + case Billow: + return SingleValueFractalBillow(x, y, z); + case RigidMulti: + return SingleValueFractalRigidMulti(x, y, z); default: - return 0.0f; + return 0; } } -float FastNoise::_ValueFractalFBM(float x, float y, float z) +FN_DECIMAL FastNoise::SingleValueFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = _Value(seed, x, y, z); - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = SingleValue(m_perm[0], x, y, z); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -475,20 +553,17 @@ float FastNoise::_ValueFractalFBM(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - max += amp; - sum += _Value(++seed, x, y, z) * amp; + sum += SingleValue(m_perm[i], x, y, z) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_ValueFractalBillow(float x, float y, float z) +FN_DECIMAL FastNoise::SingleValueFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = FastAbs(_Value(seed, x, y, z)) * 2.0f - 1.0f; - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = FastAbs(SingleValue(m_perm[0], x, y, z)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -497,19 +572,17 @@ float FastNoise::_ValueFractalBillow(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - max += amp; - sum += (FastAbs(_Value(++seed, x, y, z)) * 2.0f - 1.0f) * amp; + sum += (FastAbs(SingleValue(m_perm[i], x, y, z)) * 2 - 1) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_ValueFractalRigidMulti(float x, float y, float z) +FN_DECIMAL FastNoise::SingleValueFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = 1.0f - FastAbs(_Value(seed, x, y, z)); - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = 1 - FastAbs(SingleValue(m_perm[0], x, y, z)); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -518,18 +591,18 @@ float FastNoise::_ValueFractalRigidMulti(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - sum -= (1.0f - FastAbs(_Value(++seed, x, y, z))) * amp; + sum -= (1 - FastAbs(SingleValue(m_perm[i], x, y, z))) * amp; } return sum; } -float FastNoise::GetValue(float x, float y, float z) +FN_DECIMAL FastNoise::GetValue(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - return _Value(m_seed, x * m_frequency, y * m_frequency, z * m_frequency); + return SingleValue(0, x * m_frequency, y * m_frequency, z * m_frequency); } -float FastNoise::_Value(int seed, float x, float y, float z) +FN_DECIMAL FastNoise::SingleValue(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { int x0 = FastFloor(x); int y0 = FastFloor(y); @@ -538,67 +611,60 @@ float FastNoise::_Value(int seed, float x, float y, float z) int y1 = y0 + 1; int z1 = z0 + 1; - float xs, ys, zs; + FN_DECIMAL xs, ys, zs; switch (m_interp) { - case FastNoise::InterpLinear: - xs = x - (float)x0; - ys = y - (float)y0; - zs = z - (float)z0; + case Linear: + xs = x - (FN_DECIMAL)x0; + ys = y - (FN_DECIMAL)y0; + zs = z - (FN_DECIMAL)z0; break; - case FastNoise::InterpHermite: - xs = InterpHermiteFunc(x - (float)x0); - ys = InterpHermiteFunc(y - (float)y0); - zs = InterpHermiteFunc(z - (float)z0); + case Hermite: + xs = InterpHermiteFunc(x - (FN_DECIMAL)x0); + ys = InterpHermiteFunc(y - (FN_DECIMAL)y0); + zs = InterpHermiteFunc(z - (FN_DECIMAL)z0); break; - case FastNoise::InterpQuintic: - xs = InterpQuinticFunc(x - (float)x0); - ys = InterpQuinticFunc(y - (float)y0); - zs = InterpQuinticFunc(z - (float)z0); + case Quintic: + xs = InterpQuinticFunc(x - (FN_DECIMAL)x0); + ys = InterpQuinticFunc(y - (FN_DECIMAL)y0); + zs = InterpQuinticFunc(z - (FN_DECIMAL)z0); break; } - float xf00 = Lerp(GetValCoord(seed, x0, y0, z0), GetValCoord(seed, x1, y0, z0), xs); - float xf10 = Lerp(GetValCoord(seed, x0, y1, z0), GetValCoord(seed, x1, y1, z0), xs); - float xf01 = Lerp(GetValCoord(seed, x0, y0, z1), GetValCoord(seed, x1, y0, z1), xs); - float xf11 = Lerp(GetValCoord(seed, x0, y1, z1), GetValCoord(seed, x1, y1, z1), xs); + FN_DECIMAL xf00 = Lerp(ValCoord3DFast(offset, x0, y0, z0), ValCoord3DFast(offset, x1, y0, z0), xs); + FN_DECIMAL xf10 = Lerp(ValCoord3DFast(offset, x0, y1, z0), ValCoord3DFast(offset, x1, y1, z0), xs); + FN_DECIMAL xf01 = Lerp(ValCoord3DFast(offset, x0, y0, z1), ValCoord3DFast(offset, x1, y0, z1), xs); + FN_DECIMAL xf11 = Lerp(ValCoord3DFast(offset, x0, y1, z1), ValCoord3DFast(offset, x1, y1, z1), xs); - float yf0 = Lerp(xf00, xf10, ys); - float yf1 = Lerp(xf01, xf11, ys); + FN_DECIMAL yf0 = Lerp(xf00, xf10, ys); + FN_DECIMAL yf1 = Lerp(xf01, xf11, ys); return Lerp(yf0, yf1, zs); } -float FastNoise::GetValCoord(int seed, int x, int y, int z) -{ - return VAL_LUT[CoordLUTIndex(seed, x, y, z)]; -} - -float FastNoise::GetValueFractal(float x, float y) +FN_DECIMAL FastNoise::GetValueFractal(FN_DECIMAL x, FN_DECIMAL y) const { x *= m_frequency; y *= m_frequency; switch (m_fractalType) { - case FastNoise::FBM: - return _ValueFractalFBM(x, y); - case FastNoise::Billow: - return _ValueFractalBillow(x, y); - case FastNoise::RigidMulti: - return _ValueFractalRigidMulti(x, y); + case FBM: + return SingleValueFractalFBM(x, y); + case Billow: + return SingleValueFractalBillow(x, y); + case RigidMulti: + return SingleValueFractalRigidMulti(x, y); default: - return 0.0f; + return 0; } } -float FastNoise::_ValueFractalFBM(float x, float y) +FN_DECIMAL FastNoise::SingleValueFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = _Value(seed, x, y); - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = SingleValue(m_perm[0], x, y); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -606,40 +672,34 @@ float FastNoise::_ValueFractalFBM(float x, float y) y *= m_lacunarity; amp *= m_gain; - max += amp; - sum += _Value(++seed, x, y) * amp; + sum += SingleValue(m_perm[i], x, y) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_ValueFractalBillow(float x, float y) +FN_DECIMAL FastNoise::SingleValueFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = FastAbs(_Value(seed, x, y)) * 2.0f - 1.0f; - float max = 1.0f; - float amp = 1.0f; - - unsigned int i = 0; + FN_DECIMAL sum = FastAbs(SingleValue(m_perm[0], x, y)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { x *= m_lacunarity; y *= m_lacunarity; amp *= m_gain; - max += amp; - sum += (FastAbs(_Value(++seed, x, y)) * 2.0f - 1.0f) * amp; + sum += (FastAbs(SingleValue(m_perm[i], x, y)) * 2 - 1) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_ValueFractalRigidMulti(float x, float y) +FN_DECIMAL FastNoise::SingleValueFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = 1.0f - FastAbs(_Value(seed, x, y)); - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = 1 - FastAbs(SingleValue(m_perm[0], x, y)); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -647,54 +707,49 @@ float FastNoise::_ValueFractalRigidMulti(float x, float y) y *= m_lacunarity; amp *= m_gain; - sum -= (1.0f - FastAbs(_Value(++seed, x, y))) * amp; + sum -= (1 - FastAbs(SingleValue(m_perm[i], x, y))) * amp; } return sum; } -float FastNoise::GetValue(float x, float y) +FN_DECIMAL FastNoise::GetValue(FN_DECIMAL x, FN_DECIMAL y) const { - return _Value(m_seed, x * m_frequency, y * m_frequency); + return SingleValue(0, x * m_frequency, y * m_frequency); } -float FastNoise::_Value(int seed, float x, float y) +FN_DECIMAL FastNoise::SingleValue(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const { int x0 = FastFloor(x); int y0 = FastFloor(y); int x1 = x0 + 1; int y1 = y0 + 1; - float xs, ys; + FN_DECIMAL xs, ys; switch (m_interp) { - case FastNoise::InterpLinear: - xs = x - (float)x0; - ys = y - (float)y0; + case Linear: + xs = x - (FN_DECIMAL)x0; + ys = y - (FN_DECIMAL)y0; break; - case FastNoise::InterpHermite: - xs = InterpHermiteFunc(x - (float)x0); - ys = InterpHermiteFunc(y - (float)y0); + case Hermite: + xs = InterpHermiteFunc(x - (FN_DECIMAL)x0); + ys = InterpHermiteFunc(y - (FN_DECIMAL)y0); break; - case FastNoise::InterpQuintic: - xs = InterpQuinticFunc(x - (float)x0); - ys = InterpQuinticFunc(y - (float)y0); + case Quintic: + xs = InterpQuinticFunc(x - (FN_DECIMAL)x0); + ys = InterpQuinticFunc(y - (FN_DECIMAL)y0); break; } - float xf0 = Lerp(GetValCoord(seed, x0, y0), GetValCoord(seed, x1, y0), xs); - float xf1 = Lerp(GetValCoord(seed, x0, y1), GetValCoord(seed, x1, y1), xs); + FN_DECIMAL xf0 = Lerp(ValCoord2DFast(offset, x0, y0), ValCoord2DFast(offset, x1, y0), xs); + FN_DECIMAL xf1 = Lerp(ValCoord2DFast(offset, x0, y1), ValCoord2DFast(offset, x1, y1), xs); return Lerp(xf0, xf1, ys); } -float FastNoise::GetValCoord(int seed, int x, int y) -{ - return VAL_LUT[CoordLUTIndex(seed, x, y)]; -} - -// Gradient Noise -float FastNoise::GetGradientFractal(float x, float y, float z) +// Perlin Noise +FN_DECIMAL FastNoise::GetPerlinFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { x *= m_frequency; y *= m_frequency; @@ -702,24 +757,22 @@ float FastNoise::GetGradientFractal(float x, float y, float z) switch (m_fractalType) { - case FastNoise::FBM: - return _GradientFractalFBM(x, y, z); - case FastNoise::Billow: - return _GradientFractalBillow(x, y, z); - case FastNoise::RigidMulti: - return _GradientFractalRigidMulti(x, y, z); + case FBM: + return SinglePerlinFractalFBM(x, y, z); + case Billow: + return SinglePerlinFractalBillow(x, y, z); + case RigidMulti: + return SinglePerlinFractalRigidMulti(x, y, z); default: - return 0.0f; + return 0; } } -float FastNoise::_GradientFractalFBM(float x, float y, float z) +FN_DECIMAL FastNoise::SinglePerlinFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = _Gradient(seed, x, y, z); - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = SinglePerlin(m_perm[0], x, y, z); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -728,20 +781,17 @@ float FastNoise::_GradientFractalFBM(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - max += amp; - sum += _Gradient(++seed, x, y, z) * amp; + sum += SinglePerlin(m_perm[i], x, y, z) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_GradientFractalBillow(float x, float y, float z) +FN_DECIMAL FastNoise::SinglePerlinFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = FastAbs(_Gradient(seed, x, y, z)) * 2.0f - 1.0f; - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = FastAbs(SinglePerlin(m_perm[0], x, y, z)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -750,19 +800,17 @@ float FastNoise::_GradientFractalBillow(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - max += amp; - sum += (FastAbs(_Gradient(++seed, x, y, z)) * 2.0f - 1.0f) * amp; + sum += (FastAbs(SinglePerlin(m_perm[i], x, y, z)) * 2 - 1) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_GradientFractalRigidMulti(float x, float y, float z) +FN_DECIMAL FastNoise::SinglePerlinFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = 1.0f - FastAbs(_Gradient(seed, x, y, z)); - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = 1 - FastAbs(SinglePerlin(m_perm[0], x, y, z)); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -771,18 +819,18 @@ float FastNoise::_GradientFractalRigidMulti(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - sum -= (1.0f - FastAbs(_Gradient(++seed, x, y, z))) * amp; + sum -= (1 - FastAbs(SinglePerlin(m_perm[i], x, y, z))) * amp; } return sum; } -float FastNoise::GetGradient(float x, float y, float z) +FN_DECIMAL FastNoise::GetPerlin(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - return _Gradient(m_seed, x * m_frequency, y * m_frequency, z * m_frequency); + return SinglePerlin(0, x * m_frequency, y * m_frequency, z * m_frequency); } -float FastNoise::_Gradient(int seed, float x, float y, float z) +FN_DECIMAL FastNoise::SinglePerlin(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { int x0 = FastFloor(x); int y0 = FastFloor(y); @@ -791,73 +839,67 @@ float FastNoise::_Gradient(int seed, float x, float y, float z) int y1 = y0 + 1; int z1 = z0 + 1; - float xs, ys, zs; + FN_DECIMAL xs, ys, zs; switch (m_interp) { - case FastNoise::InterpLinear: - xs = x - (float)x0; - ys = y - (float)y0; - zs = z - (float)z0; + case Linear: + xs = x - (FN_DECIMAL)x0; + ys = y - (FN_DECIMAL)y0; + zs = z - (FN_DECIMAL)z0; break; - case FastNoise::InterpHermite: - xs = InterpHermiteFunc(x - (float)x0); - ys = InterpHermiteFunc(y - (float)y0); - zs = InterpHermiteFunc(z - (float)z0); + case Hermite: + xs = InterpHermiteFunc(x - (FN_DECIMAL)x0); + ys = InterpHermiteFunc(y - (FN_DECIMAL)y0); + zs = InterpHermiteFunc(z - (FN_DECIMAL)z0); break; - case FastNoise::InterpQuintic: - xs = InterpQuinticFunc(x - (float)x0); - ys = InterpQuinticFunc(y - (float)y0); - zs = InterpQuinticFunc(z - (float)z0); + case Quintic: + xs = InterpQuinticFunc(x - (FN_DECIMAL)x0); + ys = InterpQuinticFunc(y - (FN_DECIMAL)y0); + zs = InterpQuinticFunc(z - (FN_DECIMAL)z0); break; } - float xf00 = Lerp(GetGradCoord(seed, x0, y0, z0, x, y, z), GetGradCoord(seed, x1, y0, z0, x, y, z), xs); - float xf10 = Lerp(GetGradCoord(seed, x0, y1, z0, x, y, z), GetGradCoord(seed, x1, y1, z0, x, y, z), xs); - float xf01 = Lerp(GetGradCoord(seed, x0, y0, z1, x, y, z), GetGradCoord(seed, x1, y0, z1, x, y, z), xs); - float xf11 = Lerp(GetGradCoord(seed, x0, y1, z1, x, y, z), GetGradCoord(seed, x1, y1, z1, x, y, z), xs); + FN_DECIMAL xd0 = x - (FN_DECIMAL)x0; + FN_DECIMAL yd0 = y - (FN_DECIMAL)y0; + FN_DECIMAL zd0 = z - (FN_DECIMAL)z0; + FN_DECIMAL xd1 = xd0 - 1; + FN_DECIMAL yd1 = yd0 - 1; + FN_DECIMAL zd1 = zd0 - 1; - float yf0 = Lerp(xf00, xf10, ys); - float yf1 = Lerp(xf01, xf11, ys); + FN_DECIMAL xf00 = Lerp(GradCoord3D(offset, x0, y0, z0, xd0, yd0, zd0), GradCoord3D(offset, x1, y0, z0, xd1, yd0, zd0), xs); + FN_DECIMAL xf10 = Lerp(GradCoord3D(offset, x0, y1, z0, xd0, yd1, zd0), GradCoord3D(offset, x1, y1, z0, xd1, yd1, zd0), xs); + FN_DECIMAL xf01 = Lerp(GradCoord3D(offset, x0, y0, z1, xd0, yd0, zd1), GradCoord3D(offset, x1, y0, z1, xd1, yd0, zd1), xs); + FN_DECIMAL xf11 = Lerp(GradCoord3D(offset, x0, y1, z1, xd0, yd1, zd1), GradCoord3D(offset, x1, y1, z1, xd1, yd1, zd1), xs); - return Lerp(yf0, yf1, zs) * 1.4f; + FN_DECIMAL yf0 = Lerp(xf00, xf10, ys); + FN_DECIMAL yf1 = Lerp(xf01, xf11, ys); + + return Lerp(yf0, yf1, zs); } -float FastNoise::GetGradCoord(int seed, int xi, int yi, int zi, float x, float y, float z) -{ - float xs = x - (float)xi; - float ys = y - (float)yi; - float zs = z - (float)zi; - - int lutPos = CoordLUTIndex(seed, xi, yi, zi); - - return xs*GRAD3D_LUT[lutPos][0] + ys*GRAD3D_LUT[lutPos][1] + zs*GRAD3D_LUT[lutPos][2]; -} - -float FastNoise::GetGradientFractal(float x, float y) +FN_DECIMAL FastNoise::GetPerlinFractal(FN_DECIMAL x, FN_DECIMAL y) const { x *= m_frequency; y *= m_frequency; switch (m_fractalType) { - case FastNoise::FBM: - return _GradientFractalFBM(x, y); - case FastNoise::Billow: - return _GradientFractalBillow(x, y); - case FastNoise::RigidMulti: - return _GradientFractalRigidMulti(x, y); + case FBM: + return SinglePerlinFractalFBM(x, y); + case Billow: + return SinglePerlinFractalBillow(x, y); + case RigidMulti: + return SinglePerlinFractalRigidMulti(x, y); default: - return 0.0f; + return 0; } } -float FastNoise::_GradientFractalFBM(float x, float y) +FN_DECIMAL FastNoise::SinglePerlinFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = _Gradient(seed, x, y); - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = SinglePerlin(m_perm[0], x, y); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -865,20 +907,17 @@ float FastNoise::_GradientFractalFBM(float x, float y) y *= m_lacunarity; amp *= m_gain; - max += amp; - sum += _Gradient(++seed, x, y) * amp; + sum += SinglePerlin(m_perm[i], x, y) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_GradientFractalBillow(float x, float y) +FN_DECIMAL FastNoise::SinglePerlinFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = FastAbs(_Gradient(seed, x, y)) * 2.0f - 1.0f; - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = FastAbs(SinglePerlin(m_perm[0], x, y)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -886,19 +925,17 @@ float FastNoise::_GradientFractalBillow(float x, float y) y *= m_lacunarity; amp *= m_gain; - max += amp; - sum += (FastAbs(_Gradient(++seed, x, y)) * 2.0f - 1.0f) * amp; + sum += (FastAbs(SinglePerlin(m_perm[i], x, y)) * 2 - 1) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_GradientFractalRigidMulti(float x, float y) +FN_DECIMAL FastNoise::SinglePerlinFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = 1.0f - FastAbs(_Gradient(seed, x, y)); - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = 1 - FastAbs(SinglePerlin(m_perm[0], x, y)); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -906,60 +943,55 @@ float FastNoise::_GradientFractalRigidMulti(float x, float y) y *= m_lacunarity; amp *= m_gain; - sum -= (1.0f - FastAbs(_Gradient(++seed, x, y))) * amp; + sum -= (1 - FastAbs(SinglePerlin(m_perm[i], x, y))) * amp; } return sum; } -float FastNoise::GetGradient(float x, float y) +FN_DECIMAL FastNoise::GetPerlin(FN_DECIMAL x, FN_DECIMAL y) const { - return _Gradient(m_seed, x * m_frequency, y * m_frequency); + return SinglePerlin(0, x * m_frequency, y * m_frequency); } -float FastNoise::_Gradient(int seed, float x, float y) +FN_DECIMAL FastNoise::SinglePerlin(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const { int x0 = FastFloor(x); int y0 = FastFloor(y); int x1 = x0 + 1; int y1 = y0 + 1; - float xs, ys; + FN_DECIMAL xs, ys; switch (m_interp) { - case FastNoise::InterpLinear: - xs = x - (float)x0; - ys = y - (float)y0; + case Linear: + xs = x - (FN_DECIMAL)x0; + ys = y - (FN_DECIMAL)y0; break; - case FastNoise::InterpHermite: - xs = InterpHermiteFunc(x - (float)x0); - ys = InterpHermiteFunc(y - (float)y0); + case Hermite: + xs = InterpHermiteFunc(x - (FN_DECIMAL)x0); + ys = InterpHermiteFunc(y - (FN_DECIMAL)y0); break; - case FastNoise::InterpQuintic: - xs = InterpQuinticFunc(x - (float)x0); - ys = InterpQuinticFunc(y - (float)y0); + case Quintic: + xs = InterpQuinticFunc(x - (FN_DECIMAL)x0); + ys = InterpQuinticFunc(y - (FN_DECIMAL)y0); break; } - float xf0 = Lerp(GetGradCoord(seed, x0, y0, x, y), GetGradCoord(seed, x1, y0, x, y), xs); - float xf1 = Lerp(GetGradCoord(seed, x0, y1, x, y), GetGradCoord(seed, x1, y1, x, y), xs); + FN_DECIMAL xd0 = x - (FN_DECIMAL)x0; + FN_DECIMAL yd0 = y - (FN_DECIMAL)y0; + FN_DECIMAL xd1 = xd0 - 1; + FN_DECIMAL yd1 = yd0 - 1; - return Lerp(xf0, xf1, ys) * 1.4f; -} + FN_DECIMAL xf0 = Lerp(GradCoord2D(offset, x0, y0, xd0, yd0), GradCoord2D(offset, x1, y0, xd1, yd0), xs); + FN_DECIMAL xf1 = Lerp(GradCoord2D(offset, x0, y1, xd0, yd1), GradCoord2D(offset, x1, y1, xd1, yd1), xs); -float FastNoise::GetGradCoord(int seed, int xi, int yi, float x, float y) -{ - float xs = x - (float)xi; - float ys = y - (float)yi; - - int lutPos = CoordLUTIndex(seed, xi, yi); - - return xs*GRAD2D_LUT[lutPos][0] + ys*GRAD2D_LUT[lutPos][1]; + return Lerp(xf0, xf1, ys); } // Simplex Noise -float FastNoise::GetSimplexFractal(float x, float y, float z) +FN_DECIMAL FastNoise::GetSimplexFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { x *= m_frequency; y *= m_frequency; @@ -967,24 +999,22 @@ float FastNoise::GetSimplexFractal(float x, float y, float z) switch (m_fractalType) { - case FastNoise::FBM: - return _SimplexFractalFBM(x, y, z); - case FastNoise::Billow: - return _SimplexFractalBillow(x, y, z); - case FastNoise::RigidMulti: - return _SimplexFractalRigidMulti(x, y, z); + case FBM: + return SingleSimplexFractalFBM(x, y, z); + case Billow: + return SingleSimplexFractalBillow(x, y, z); + case RigidMulti: + return SingleSimplexFractalRigidMulti(x, y, z); default: - return 0.0f; + return 0; } } -float FastNoise::_SimplexFractalFBM(float x, float y, float z) +FN_DECIMAL FastNoise::SingleSimplexFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = _Simplex(seed, x, y, z); - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = SingleSimplex(m_perm[0], x, y, z); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -993,20 +1023,17 @@ float FastNoise::_SimplexFractalFBM(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - max += amp; - sum += _Simplex(++seed, x, y, z) * amp; + sum += SingleSimplex(m_perm[i], x, y, z) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_SimplexFractalBillow(float x, float y, float z) +FN_DECIMAL FastNoise::SingleSimplexFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = FastAbs(_Simplex(seed, x, y, z)) * 2.0f - 1.0f; - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = FastAbs(SingleSimplex(m_perm[0], x, y, z)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -1015,19 +1042,17 @@ float FastNoise::_SimplexFractalBillow(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - max += amp; - sum += (FastAbs(_Simplex(++seed, x, y, z)) * 2.0f - 1.0f) * amp; + sum += (FastAbs(SingleSimplex(m_perm[i], x, y, z)) * 2 - 1) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_SimplexFractalRigidMulti(float x, float y, float z) +FN_DECIMAL FastNoise::SingleSimplexFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - int seed = m_seed; - float sum = 1.0f - FastAbs(_Simplex(seed, x, y, z)); - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = 1 - FastAbs(SingleSimplex(m_perm[0], x, y, z)); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -1036,40 +1061,35 @@ float FastNoise::_SimplexFractalRigidMulti(float x, float y, float z) z *= m_lacunarity; amp *= m_gain; - sum -= (1.0f - FastAbs(_Simplex(++seed, x, y, z))) * amp; + sum -= (1 - FastAbs(SingleSimplex(m_perm[i], x, y, z))) * amp; } return sum; } -float FastNoise::GetSimplex(float x, float y, float z) +FN_DECIMAL FastNoise::GetSimplex(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - return _Simplex(m_seed, x * m_frequency, y * m_frequency, z * m_frequency); + return SingleSimplex(0, x * m_frequency, y * m_frequency, z * m_frequency); } -static inline float Dot(const float *g, float x, float y, float z) -{ - return g[0] * x + g[1] * y + g[2] * z; -} +static const FN_DECIMAL F3 = 1 / FN_DECIMAL(3); +static const FN_DECIMAL G3 = 1 / FN_DECIMAL(6); -static const float F3 = 1.0f / 3.0f; -static const float G3 = 1.0f / 6.0f; - -float FastNoise::_Simplex(int seed, float x, float y, float z) +FN_DECIMAL FastNoise::SingleSimplex(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { - float t = (x + y + z) * F3; + FN_DECIMAL t = (x + y + z) * F3; int i = FastFloor(x + t); int j = FastFloor(y + t); int k = FastFloor(z + t); t = (i + j + k) * G3; - float X0 = i - t; - float Y0 = j - t; - float Z0 = k - t; + FN_DECIMAL X0 = i - t; + FN_DECIMAL Y0 = j - t; + FN_DECIMAL Z0 = k - t; - float x0 = x - X0; - float y0 = y - Y0; - float z0 = z - Z0; + FN_DECIMAL x0 = x - X0; + FN_DECIMAL y0 = y - Y0; + FN_DECIMAL z0 = z - Z0; int i1, j1, k1; int i2, j2, k2; @@ -1084,12 +1104,12 @@ float FastNoise::_Simplex(int seed, float x, float y, float z) { i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1; } - else + else // x0 < z0 { i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1; } } - else + else // x0 < y0 { if (y0 < z0) { @@ -1099,84 +1119,82 @@ float FastNoise::_Simplex(int seed, float x, float y, float z) { i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1; } - else + else // x0 >= z0 { i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0; } } - float x1 = x0 - i1 + G3; - float y1 = y0 - j1 + G3; - float z1 = z0 - k1 + G3; - float x2 = x0 - i2 + 2.0f*G3; - float y2 = y0 - j2 + 2.0f*G3; - float z2 = z0 - k2 + 2.0f*G3; - float x3 = x0 - 1.0f + 3.0f*G3; - float y3 = y0 - 1.0f + 3.0f*G3; - float z3 = z0 - 1.0f + 3.0f*G3; + FN_DECIMAL x1 = x0 - i1 + G3; + FN_DECIMAL y1 = y0 - j1 + G3; + FN_DECIMAL z1 = z0 - k1 + G3; + FN_DECIMAL x2 = x0 - i2 + 2*G3; + FN_DECIMAL y2 = y0 - j2 + 2*G3; + FN_DECIMAL z2 = z0 - k2 + 2*G3; + FN_DECIMAL x3 = x0 - 1 + 3*G3; + FN_DECIMAL y3 = y0 - 1 + 3*G3; + FN_DECIMAL z3 = z0 - 1 + 3*G3; - float n0, n1, n2, n3; + FN_DECIMAL n0, n1, n2, n3; - t = 0.6f - x0*x0 - y0*y0 - z0*z0; - if (t < 0.0f) n0 = 0.0f; + t = FN_DECIMAL(0.6) - x0*x0 - y0*y0 - z0*z0; + if (t < 0) n0 = 0; else { t *= t; - n0 = t*t*Dot(&GRAD3D_LUT[CoordLUTIndex(seed, i, j, k)][0], x0, y0, z0); + n0 = t*t*GradCoord3D(offset, i, j, k, x0, y0, z0); } - t = 0.6f - x1*x1 - y1*y1 - z1*z1; - if (t < 0.0f) n1 = 0.0f; + t = FN_DECIMAL(0.6) - x1*x1 - y1*y1 - z1*z1; + if (t < 0) n1 = 0; else { t *= t; - n1 = t*t*Dot(&GRAD3D_LUT[CoordLUTIndex(seed, i + i1, j + j1, k + k1)][0], x1, y1, z1); + n1 = t*t*GradCoord3D(offset, i + i1, j + j1, k + k1, x1, y1, z1); } - t = 0.6f - x2*x2 - y2*y2 - z2*z2; - if (t < 0.0f) n2 = 0.0f; + t = FN_DECIMAL(0.6) - x2*x2 - y2*y2 - z2*z2; + if (t < 0) n2 = 0; else { t *= t; - n2 = t*t*Dot(&GRAD3D_LUT[CoordLUTIndex(seed, i + i2, j + j2, k + k2)][0], x2, y2, z2); + n2 = t*t*GradCoord3D(offset, i + i2, j + j2, k + k2, x2, y2, z2); } - t = 0.6f - x3*x3 - y3*y3 - z3*z3; - if (t < 0.0f) n3 = 0.0f; + t = FN_DECIMAL(0.6) - x3*x3 - y3*y3 - z3*z3; + if (t < 0) n3 = 0; else { t *= t; - n3 = t*t*Dot(&GRAD3D_LUT[CoordLUTIndex(seed, i + 1, j + 1, k + 1)][0], x3, y3, z3); + n3 = t*t*GradCoord3D(offset, i + 1, j + 1, k + 1, x3, y3, z3); } - return 40.0f * (n0 + n1 + n2 + n3); + return 32 * (n0 + n1 + n2 + n3); } -float FastNoise::GetSimplexFractal(float x, float y) +FN_DECIMAL FastNoise::GetSimplexFractal(FN_DECIMAL x, FN_DECIMAL y) const { x *= m_frequency; y *= m_frequency; switch (m_fractalType) { - case FastNoise::FBM: - return _SimplexFractalFBM(x, y); - case FastNoise::Billow: - return _SimplexFractalBillow(x, y); - case FastNoise::RigidMulti: - return _SimplexFractalRigidMulti(x, y); + case FBM: + return SingleSimplexFractalFBM(x, y); + case Billow: + return SingleSimplexFractalBillow(x, y); + case RigidMulti: + return SingleSimplexFractalRigidMulti(x, y); default: - return 0.0f; + return 0; } } -float FastNoise::_SimplexFractalFBM(float x, float y) +FN_DECIMAL FastNoise::SingleSimplexFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = _Simplex(seed, x, y); - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = SingleSimplex(m_perm[0], x, y); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -1184,20 +1202,17 @@ float FastNoise::_SimplexFractalFBM(float x, float y) y *= m_lacunarity; amp *= m_gain; - max += amp; - sum += _Simplex(++seed, x, y) * amp; + sum += SingleSimplex(m_perm[i], x, y) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_SimplexFractalBillow(float x, float y) +FN_DECIMAL FastNoise::SingleSimplexFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = FastAbs(_Simplex(seed, x, y)) * 2.0f - 1.0f; - float max = 1.0f; - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = FastAbs(SingleSimplex(m_perm[0], x, y)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -1205,19 +1220,17 @@ float FastNoise::_SimplexFractalBillow(float x, float y) y *= m_lacunarity; amp *= m_gain; - max += amp; - sum += (FastAbs(_Simplex(++seed, x, y)) * 2.0f - 1.0f) * amp; + sum += (FastAbs(SingleSimplex(m_perm[i], x, y)) * 2 - 1) * amp; } - return sum / max; + return sum * m_fractalBounding; } -float FastNoise::_SimplexFractalRigidMulti(float x, float y) +FN_DECIMAL FastNoise::SingleSimplexFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const { - int seed = m_seed; - float sum = 1.0f - FastAbs(_Simplex(seed, x, y)); - float amp = 1.0f; - unsigned int i = 0; + FN_DECIMAL sum = 1 - FastAbs(SingleSimplex(m_perm[0], x, y)); + FN_DECIMAL amp = 1; + int i = 0; while (++i < m_octaves) { @@ -1225,37 +1238,54 @@ float FastNoise::_SimplexFractalRigidMulti(float x, float y) y *= m_lacunarity; amp *= m_gain; - sum -= (1.0f - FastAbs(_Simplex(++seed, x, y))) * amp; + sum -= (1 - FastAbs(SingleSimplex(m_perm[i], x, y))) * amp; } return sum; } -float FastNoise::GetSimplex(float x, float y) +FN_DECIMAL FastNoise::SingleSimplexFractalBlend(FN_DECIMAL x, FN_DECIMAL y) const { - return _Simplex(m_seed, x * m_frequency, y * m_frequency); + FN_DECIMAL sum = SingleSimplex(m_perm[0], x, y); + FN_DECIMAL amp = 1; + int i = 0; + + while (++i < m_octaves) + { + x *= m_lacunarity; + y *= m_lacunarity; + + amp *= m_gain; + sum *= SingleSimplex(m_perm[i], x, y) * amp + 1; + } + + return sum * m_fractalBounding; } -static inline float Dot(const float *g, float x, float y) +FN_DECIMAL FastNoise::GetSimplex(FN_DECIMAL x, FN_DECIMAL y) const { - return g[0] * x + g[1] * y; + return SingleSimplex(0, x * m_frequency, y * m_frequency); } -static const float F2 = 1.f / 2.f; -static const float G2 = 1.f / 4.f; +//static const FN_DECIMAL F2 = 1 / FN_DECIMAL(2); +//static const FN_DECIMAL G2 = 1 / FN_DECIMAL(4); -float FastNoise::_Simplex(int seed, float x, float y) +static const FN_DECIMAL SQRT3 = FN_DECIMAL(1.7320508075688772935274463415059); +static const FN_DECIMAL F2 = FN_DECIMAL(0.5) * (SQRT3 - FN_DECIMAL(1.0)); +static const FN_DECIMAL G2 = (FN_DECIMAL(3.0) - SQRT3) / FN_DECIMAL(6.0); + +FN_DECIMAL FastNoise::SingleSimplex(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const { - float t = (x + y) * F2; + FN_DECIMAL t = (x + y) * F2; int i = FastFloor(x + t); int j = FastFloor(y + t); t = (i + j) * G2; - float X0 = i - t; - float Y0 = j - t; + FN_DECIMAL X0 = i - t; + FN_DECIMAL Y0 = j - t; - float x0 = x - X0; - float y0 = y - Y0; + FN_DECIMAL x0 = x - X0; + FN_DECIMAL y0 = y - Y0; int i1, j1; if (x0 > y0) @@ -1267,82 +1297,77 @@ float FastNoise::_Simplex(int seed, float x, float y) i1 = 0; j1 = 1; } - float x1 = x0 - (float)i1 + G2; - float y1 = y0 - (float)j1 + G2; - float x2 = x0 - 1.0f + 2.0f*G2; - float y2 = y0 - 1.0f + 2.0f*G2; + FN_DECIMAL x1 = x0 - (FN_DECIMAL)i1 + G2; + FN_DECIMAL y1 = y0 - (FN_DECIMAL)j1 + G2; + FN_DECIMAL x2 = x0 - 1 + 2*G2; + FN_DECIMAL y2 = y0 - 1 + 2*G2; - float n0, n1, n2; + FN_DECIMAL n0, n1, n2; - t = 0.6f - x0*x0 - y0*y0; + t = FN_DECIMAL(0.5) - x0*x0 - y0*y0; if (t < 0) n0 = 0; else { t *= t; - n0 = t * t * Dot(&GRAD2D_LUT[CoordLUTIndex(seed, i, j)][0], x0, y0); + n0 = t * t * GradCoord2D(offset, i, j, x0, y0); } - t = 0.6f - x1*x1 - y1*y1; + t = FN_DECIMAL(0.5) - x1*x1 - y1*y1; if (t < 0) n1 = 0; else { t *= t; - n1 = t*t*Dot(&GRAD2D_LUT[CoordLUTIndex(seed, i + i1, j + j1)][0], x1, y1); + n1 = t*t*GradCoord2D(offset, i + i1, j + j1, x1, y1); } - t = 0.6f - x2*x2 - y2*y2; + t = FN_DECIMAL(0.5) - x2*x2 - y2*y2; if (t < 0) n2 = 0; else { t *= t; - n2 = t*t*Dot(&GRAD2D_LUT[CoordLUTIndex(seed, i + 1, j + 1)][0], x2, y2); + n2 = t*t*GradCoord2D(offset, i + 1, j + 1, x2, y2); } - return 27.7f * (n0 + n1 + n2);// +0.001054489f; + return 70 * (n0 + n1 + n2); } -float FastNoise::GetSimplex(float x, float y, float z, float w) +FN_DECIMAL FastNoise::GetSimplex(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w) const { - return _Simplex(x * m_frequency, y * m_frequency, z * m_frequency, w * m_frequency); + return SingleSimplex(0, x * m_frequency, y * m_frequency, z * m_frequency, w * m_frequency); } -static inline float Dot(const float *g, float x, float y, float z, float w) +static const unsigned char SIMPLEX_4D[] = { - return g[0] * x + g[1] * y + g[2] * z + g[3] * w; -} - -static const int SIMPLEX4D[64][4] = -{ - { 0, 1, 2, 3 }, { 0, 1, 3, 2 }, { 0, 0, 0, 0 }, { 0, 2, 3, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 2, 3, 0 }, - { 0, 2, 1, 3 }, { 0, 0, 0, 0 }, { 0, 3, 1, 2 }, { 0, 3, 2, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 3, 2, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 1, 2, 0, 3 }, { 0, 0, 0, 0 }, { 1, 3, 0, 2 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 2, 3, 0, 1 }, { 2, 3, 1, 0 }, - { 1, 0, 2, 3 }, { 1, 0, 3, 2 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 2, 0, 3, 1 }, { 0, 0, 0, 0 }, { 2, 1, 3, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 2, 0, 1, 3 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 3, 0, 1, 2 }, { 3, 0, 2, 1 }, { 0, 0, 0, 0 }, { 3, 1, 2, 0 }, - { 2, 1, 0, 3 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 3, 1, 0, 2 }, { 0, 0, 0, 0 }, { 3, 2, 0, 1 }, { 3, 2, 1, 0 } + 0,1,2,3,0,1,3,2,0,0,0,0,0,2,3,1,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,0, + 0,2,1,3,0,0,0,0,0,3,1,2,0,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,3,2,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,2,0,3,0,0,0,0,1,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,3,0,1,2,3,1,0, + 1,0,2,3,1,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,3,1,0,0,0,0,2,1,3,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,2,3,0,2,1,0,0,0,0,3,1,2,0, + 2,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,3,1,0,2,0,0,0,0,3,2,0,1,3,2,1,0 }; -static const float F4 = (sqrtf(5.0f) - 1.0f) / 4.0f; -static const float G4 = (5.0f - sqrtf(5.0f)) / 20.0f; +static const FN_DECIMAL F4 = (sqrt(FN_DECIMAL(5)) - 1) / 4; +static const FN_DECIMAL G4 = (5 - sqrt(FN_DECIMAL(5))) / 20; -float FastNoise::_Simplex(float x, float y, float z, float w) +FN_DECIMAL FastNoise::SingleSimplex(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w) const { - float n0, n1, n2, n3, n4; - float t = (x + y + z + w) * F4; + FN_DECIMAL n0, n1, n2, n3, n4; + FN_DECIMAL t = (x + y + z + w) * F4; int i = FastFloor(x + t); int j = FastFloor(y + t); int k = FastFloor(z + t); int l = FastFloor(w + t); - t = (i + j + k + l) * G4; - float X0 = i - t; - float Y0 = j - t; - float Z0 = k - t; - float W0 = l - t; - float x0 = x - X0; - float y0 = y - Y0; - float z0 = z - Z0; - float w0 = w - W0; + t = (i + j + k + l) * G4; + FN_DECIMAL X0 = i - t; + FN_DECIMAL Y0 = j - t; + FN_DECIMAL Z0 = k - t; + FN_DECIMAL W0 = l - t; + FN_DECIMAL x0 = x - X0; + FN_DECIMAL y0 = y - Y0; + FN_DECIMAL z0 = z - Z0; + FN_DECIMAL w0 = w - W0; int c = (x0 > y0) ? 32 : 0; c += (x0 > z0) ? 16 : 0; @@ -1350,76 +1375,312 @@ float FastNoise::_Simplex(float x, float y, float z, float w) c += (x0 > w0) ? 4 : 0; c += (y0 > w0) ? 2 : 0; c += (z0 > w0) ? 1 : 0; - int i1, j1, k1, l1; - int i2, j2, k2, l2; - int i3, j3, k3, l3; - - i1 = SIMPLEX4D[c][0] >= 3 ? 1 : 0; - j1 = SIMPLEX4D[c][1] >= 3 ? 1 : 0; - k1 = SIMPLEX4D[c][2] >= 3 ? 1 : 0; - l1 = SIMPLEX4D[c][3] >= 3 ? 1 : 0; - i2 = SIMPLEX4D[c][0] >= 2 ? 1 : 0; - j2 = SIMPLEX4D[c][1] >= 2 ? 1 : 0; - k2 = SIMPLEX4D[c][2] >= 2 ? 1 : 0; - l2 = SIMPLEX4D[c][3] >= 2 ? 1 : 0; - i3 = SIMPLEX4D[c][0] >= 1 ? 1 : 0; - j3 = SIMPLEX4D[c][1] >= 1 ? 1 : 0; - k3 = SIMPLEX4D[c][2] >= 1 ? 1 : 0; - l3 = SIMPLEX4D[c][3] >= 1 ? 1 : 0; - - float x1 = x0 - i1 + G4; - float y1 = y0 - j1 + G4; - float z1 = z0 - k1 + G4; - float w1 = w0 - l1 + G4; - float x2 = x0 - i2 + 2.0f*G4; - float y2 = y0 - j2 + 2.0f*G4; - float z2 = z0 - k2 + 2.0f*G4; - float w2 = w0 - l2 + 2.0f*G4; - float x3 = x0 - i3 + 3.0f*G4; - float y3 = y0 - j3 + 3.0f*G4; - float z3 = z0 - k3 + 3.0f*G4; - float w3 = w0 - l3 + 3.0f*G4; - float x4 = x0 - 1.0f + 4.0f*G4; - float y4 = y0 - 1.0f + 4.0f*G4; - float z4 = z0 - 1.0f + 4.0f*G4; - float w4 = w0 - 1.0f + 4.0f*G4; + c <<= 2; - t = 0.6f - x0*x0 - y0*y0 - z0*z0 - w0*w0; - if (t<0.f) n0 = 0.0f; + int i1 = SIMPLEX_4D[c] >= 3 ? 1 : 0; + int i2 = SIMPLEX_4D[c] >= 2 ? 1 : 0; + int i3 = SIMPLEX_4D[c++] >= 1 ? 1 : 0; + int j1 = SIMPLEX_4D[c] >= 3 ? 1 : 0; + int j2 = SIMPLEX_4D[c] >= 2 ? 1 : 0; + int j3 = SIMPLEX_4D[c++] >= 1 ? 1 : 0; + int k1 = SIMPLEX_4D[c] >= 3 ? 1 : 0; + int k2 = SIMPLEX_4D[c] >= 2 ? 1 : 0; + int k3 = SIMPLEX_4D[c++] >= 1 ? 1 : 0; + int l1 = SIMPLEX_4D[c] >= 3 ? 1 : 0; + int l2 = SIMPLEX_4D[c] >= 2 ? 1 : 0; + int l3 = SIMPLEX_4D[c] >= 1 ? 1 : 0; + + FN_DECIMAL x1 = x0 - i1 + G4; + FN_DECIMAL y1 = y0 - j1 + G4; + FN_DECIMAL z1 = z0 - k1 + G4; + FN_DECIMAL w1 = w0 - l1 + G4; + FN_DECIMAL x2 = x0 - i2 + 2*G4; + FN_DECIMAL y2 = y0 - j2 + 2*G4; + FN_DECIMAL z2 = z0 - k2 + 2*G4; + FN_DECIMAL w2 = w0 - l2 + 2*G4; + FN_DECIMAL x3 = x0 - i3 + 3*G4; + FN_DECIMAL y3 = y0 - j3 + 3*G4; + FN_DECIMAL z3 = z0 - k3 + 3*G4; + FN_DECIMAL w3 = w0 - l3 + 3*G4; + FN_DECIMAL x4 = x0 - 1 + 4*G4; + FN_DECIMAL y4 = y0 - 1 + 4*G4; + FN_DECIMAL z4 = z0 - 1 + 4*G4; + FN_DECIMAL w4 = w0 - 1 + 4*G4; + + t = FN_DECIMAL(0.6) - x0*x0 - y0*y0 - z0*z0 - w0*w0; + if (t < 0) n0 = 0; else { t *= t; - n0 = t * t * Dot(&GRAD4D_LUT[CoordLUTIndex(i,j,k,l)][0], x0, y0, z0, w0); + n0 = t * t * GradCoord4D(offset, i, j, k, l, x0, y0, z0, w0); } - t = 0.6f - x1*x1 - y1*y1 - z1*z1 - w1*w1; - if (t<0.f) n1 = 0.0f; + t = FN_DECIMAL(0.6) - x1*x1 - y1*y1 - z1*z1 - w1*w1; + if (t < 0) n1 = 0; else { t *= t; - n1 = t * t * Dot(&GRAD4D_LUT[CoordLUTIndex(i + i1, j+j1, k+k1, l+l1)][0], x1, y1, z1, w1); + n1 = t * t * GradCoord4D(offset, i + i1, j + j1, k + k1, l + l1, x1, y1, z1, w1); } - t = 0.6f - x2*x2 - y2*y2 - z2*z2 - w2*w2; - if (t<0.f) n2 = 0.0f; + t = FN_DECIMAL(0.6) - x2*x2 - y2*y2 - z2*z2 - w2*w2; + if (t < 0) n2 = 0; else { t *= t; - n2 = t * t * Dot(&GRAD4D_LUT[CoordLUTIndex(i + i2, j + j2, k + k2, l + l2)][0], x2, y2, z2, w2); + n2 = t * t * GradCoord4D(offset, i + i2, j + j2, k + k2, l + l2, x2, y2, z2, w2); } - t = 0.6f - x3*x3 - y3*y3 - z3*z3 - w3*w3; - if (t<0.f) n3 = 0.0f; + t = FN_DECIMAL(0.6) - x3*x3 - y3*y3 - z3*z3 - w3*w3; + if (t < 0) n3 = 0; else { t *= t; - n3 = t * t * Dot(&GRAD4D_LUT[CoordLUTIndex(i + i3, j + j3, k + k3, l + l3)][0], x3, y3, z3, w3); + n3 = t * t * GradCoord4D(offset, i + i3, j + j3, k + k3, l + l3, x3, y3, z3, w3); } - t = 0.6f - x4*x4 - y4*y4 - z4*z4 - w4*w4; - if (t<0.f) n4 = 0.0f; + t = FN_DECIMAL(0.6) - x4*x4 - y4*y4 - z4*z4 - w4*w4; + if (t < 0) n4 = 0; else { t *= t; - n4 = t * t * Dot(&GRAD4D_LUT[CoordLUTIndex(i + 1, j + 1, k + 1, l + 1)][0], x4, y4, z4, w4); + n4 = t * t * GradCoord4D(offset, i + 1, j + 1, k + 1, l + 1, x4, y4, z4, w4); } - return 44.5f * (n0 + n1 + n2 + n3 + n4); + return 27 * (n0 + n1 + n2 + n3 + n4); +} + +// Cubic Noise +FN_DECIMAL FastNoise::GetCubicFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const +{ + x *= m_frequency; + y *= m_frequency; + z *= m_frequency; + + switch (m_fractalType) + { + case FBM: + return SingleCubicFractalFBM(x, y, z); + case Billow: + return SingleCubicFractalBillow(x, y, z); + case RigidMulti: + return SingleCubicFractalRigidMulti(x, y, z); + default: + return 0; + } +} + +FN_DECIMAL FastNoise::SingleCubicFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const +{ + FN_DECIMAL sum = SingleCubic(m_perm[0], x, y, z); + FN_DECIMAL amp = 1; + int i = 0; + + while (++i < m_octaves) + { + x *= m_lacunarity; + y *= m_lacunarity; + z *= m_lacunarity; + + amp *= m_gain; + sum += SingleCubic(m_perm[i], x, y, z) * amp; + } + + return sum * m_fractalBounding; +} + +FN_DECIMAL FastNoise::SingleCubicFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const +{ + FN_DECIMAL sum = FastAbs(SingleCubic(m_perm[0], x, y, z)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; + + while (++i < m_octaves) + { + x *= m_lacunarity; + y *= m_lacunarity; + z *= m_lacunarity; + + amp *= m_gain; + sum += (FastAbs(SingleCubic(m_perm[i], x, y, z)) * 2 - 1) * amp; + } + + return sum * m_fractalBounding; +} + +FN_DECIMAL FastNoise::SingleCubicFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const +{ + FN_DECIMAL sum = 1 - FastAbs(SingleCubic(m_perm[0], x, y, z)); + FN_DECIMAL amp = 1; + int i = 0; + + while (++i < m_octaves) + { + x *= m_lacunarity; + y *= m_lacunarity; + z *= m_lacunarity; + + amp *= m_gain; + sum -= (1 - FastAbs(SingleCubic(m_perm[i], x, y, z))) * amp; + } + + return sum; +} + +FN_DECIMAL FastNoise::GetCubic(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const +{ + return SingleCubic(0, x * m_frequency, y * m_frequency, z * m_frequency); +} + +const FN_DECIMAL CUBIC_3D_BOUNDING = 1 / (FN_DECIMAL(1.5) * FN_DECIMAL(1.5) * FN_DECIMAL(1.5)); + +FN_DECIMAL FastNoise::SingleCubic(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const +{ + int x1 = FastFloor(x); + int y1 = FastFloor(y); + int z1 = FastFloor(z); + + int x0 = x1 - 1; + int y0 = y1 - 1; + int z0 = z1 - 1; + int x2 = x1 + 1; + int y2 = y1 + 1; + int z2 = z1 + 1; + int x3 = x1 + 2; + int y3 = y1 + 2; + int z3 = z1 + 2; + + FN_DECIMAL xs = x - (FN_DECIMAL)x1; + FN_DECIMAL ys = y - (FN_DECIMAL)y1; + FN_DECIMAL zs = z - (FN_DECIMAL)z1; + + return CubicLerp( + CubicLerp( + CubicLerp(ValCoord3DFast(offset, x0, y0, z0), ValCoord3DFast(offset, x1, y0, z0), ValCoord3DFast(offset, x2, y0, z0), ValCoord3DFast(offset, x3, y0, z0), xs), + CubicLerp(ValCoord3DFast(offset, x0, y1, z0), ValCoord3DFast(offset, x1, y1, z0), ValCoord3DFast(offset, x2, y1, z0), ValCoord3DFast(offset, x3, y1, z0), xs), + CubicLerp(ValCoord3DFast(offset, x0, y2, z0), ValCoord3DFast(offset, x1, y2, z0), ValCoord3DFast(offset, x2, y2, z0), ValCoord3DFast(offset, x3, y2, z0), xs), + CubicLerp(ValCoord3DFast(offset, x0, y3, z0), ValCoord3DFast(offset, x1, y3, z0), ValCoord3DFast(offset, x2, y3, z0), ValCoord3DFast(offset, x3, y3, z0), xs), + ys), + CubicLerp( + CubicLerp(ValCoord3DFast(offset, x0, y0, z1), ValCoord3DFast(offset, x1, y0, z1), ValCoord3DFast(offset, x2, y0, z1), ValCoord3DFast(offset, x3, y0, z1), xs), + CubicLerp(ValCoord3DFast(offset, x0, y1, z1), ValCoord3DFast(offset, x1, y1, z1), ValCoord3DFast(offset, x2, y1, z1), ValCoord3DFast(offset, x3, y1, z1), xs), + CubicLerp(ValCoord3DFast(offset, x0, y2, z1), ValCoord3DFast(offset, x1, y2, z1), ValCoord3DFast(offset, x2, y2, z1), ValCoord3DFast(offset, x3, y2, z1), xs), + CubicLerp(ValCoord3DFast(offset, x0, y3, z1), ValCoord3DFast(offset, x1, y3, z1), ValCoord3DFast(offset, x2, y3, z1), ValCoord3DFast(offset, x3, y3, z1), xs), + ys), + CubicLerp( + CubicLerp(ValCoord3DFast(offset, x0, y0, z2), ValCoord3DFast(offset, x1, y0, z2), ValCoord3DFast(offset, x2, y0, z2), ValCoord3DFast(offset, x3, y0, z2), xs), + CubicLerp(ValCoord3DFast(offset, x0, y1, z2), ValCoord3DFast(offset, x1, y1, z2), ValCoord3DFast(offset, x2, y1, z2), ValCoord3DFast(offset, x3, y1, z2), xs), + CubicLerp(ValCoord3DFast(offset, x0, y2, z2), ValCoord3DFast(offset, x1, y2, z2), ValCoord3DFast(offset, x2, y2, z2), ValCoord3DFast(offset, x3, y2, z2), xs), + CubicLerp(ValCoord3DFast(offset, x0, y3, z2), ValCoord3DFast(offset, x1, y3, z2), ValCoord3DFast(offset, x2, y3, z2), ValCoord3DFast(offset, x3, y3, z2), xs), + ys), + CubicLerp( + CubicLerp(ValCoord3DFast(offset, x0, y0, z3), ValCoord3DFast(offset, x1, y0, z3), ValCoord3DFast(offset, x2, y0, z3), ValCoord3DFast(offset, x3, y0, z3), xs), + CubicLerp(ValCoord3DFast(offset, x0, y1, z3), ValCoord3DFast(offset, x1, y1, z3), ValCoord3DFast(offset, x2, y1, z3), ValCoord3DFast(offset, x3, y1, z3), xs), + CubicLerp(ValCoord3DFast(offset, x0, y2, z3), ValCoord3DFast(offset, x1, y2, z3), ValCoord3DFast(offset, x2, y2, z3), ValCoord3DFast(offset, x3, y2, z3), xs), + CubicLerp(ValCoord3DFast(offset, x0, y3, z3), ValCoord3DFast(offset, x1, y3, z3), ValCoord3DFast(offset, x2, y3, z3), ValCoord3DFast(offset, x3, y3, z3), xs), + ys), + zs) * CUBIC_3D_BOUNDING; +} + + +FN_DECIMAL FastNoise::GetCubicFractal(FN_DECIMAL x, FN_DECIMAL y) const +{ + x *= m_frequency; + y *= m_frequency; + + switch (m_fractalType) + { + case FBM: + return SingleCubicFractalFBM(x, y); + case Billow: + return SingleCubicFractalBillow(x, y); + case RigidMulti: + return SingleCubicFractalRigidMulti(x, y); + default: + return 0; + } +} + +FN_DECIMAL FastNoise::SingleCubicFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const +{ + FN_DECIMAL sum = SingleCubic(m_perm[0], x, y); + FN_DECIMAL amp = 1; + int i = 0; + + while (++i < m_octaves) + { + x *= m_lacunarity; + y *= m_lacunarity; + + amp *= m_gain; + sum += SingleCubic(m_perm[i], x, y) * amp; + } + + return sum * m_fractalBounding; +} + +FN_DECIMAL FastNoise::SingleCubicFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const +{ + FN_DECIMAL sum = FastAbs(SingleCubic(m_perm[0], x, y)) * 2 - 1; + FN_DECIMAL amp = 1; + int i = 0; + + while (++i < m_octaves) + { + x *= m_lacunarity; + y *= m_lacunarity; + + amp *= m_gain; + sum += (FastAbs(SingleCubic(m_perm[i], x, y)) * 2 - 1) * amp; + } + + return sum * m_fractalBounding; +} + +FN_DECIMAL FastNoise::SingleCubicFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const +{ + FN_DECIMAL sum = 1 - FastAbs(SingleCubic(m_perm[0], x, y)); + FN_DECIMAL amp = 1; + int i = 0; + + while (++i < m_octaves) + { + x *= m_lacunarity; + y *= m_lacunarity; + + amp *= m_gain; + sum -= (1 - FastAbs(SingleCubic(m_perm[i], x, y))) * amp; + } + + return sum; +} + +FN_DECIMAL FastNoise::GetCubic(FN_DECIMAL x, FN_DECIMAL y) const +{ + x *= m_frequency; + y *= m_frequency; + + return SingleCubic(0, x, y); +} + +const FN_DECIMAL CUBIC_2D_BOUNDING = 1 / (FN_DECIMAL(1.5) * FN_DECIMAL(1.5)); + +FN_DECIMAL FastNoise::SingleCubic(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const +{ + int x1 = FastFloor(x); + int y1 = FastFloor(y); + + int x0 = x1 - 1; + int y0 = y1 - 1; + int x2 = x1 + 1; + int y2 = y1 + 1; + int x3 = x1 + 2; + int y3 = y1 + 2; + + FN_DECIMAL xs = x - (FN_DECIMAL)x1; + FN_DECIMAL ys = y - (FN_DECIMAL)y1; + + return CubicLerp( + CubicLerp(ValCoord2DFast(offset, x0, y0), ValCoord2DFast(offset, x1, y0), ValCoord2DFast(offset, x2, y0), ValCoord2DFast(offset, x3, y0), xs), + CubicLerp(ValCoord2DFast(offset, x0, y1), ValCoord2DFast(offset, x1, y1), ValCoord2DFast(offset, x2, y1), ValCoord2DFast(offset, x3, y1), xs), + CubicLerp(ValCoord2DFast(offset, x0, y2), ValCoord2DFast(offset, x1, y2), ValCoord2DFast(offset, x2, y2), ValCoord2DFast(offset, x3, y2), xs), + CubicLerp(ValCoord2DFast(offset, x0, y3), ValCoord2DFast(offset, x1, y3), ValCoord2DFast(offset, x2, y3), ValCoord2DFast(offset, x3, y3), xs), + ys) * CUBIC_2D_BOUNDING; } // Cellular Noise -float FastNoise::GetCellular(float x, float y, float z) +FN_DECIMAL FastNoise::GetCellular(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { x *= m_frequency; y *= m_frequency; @@ -1427,70 +1688,40 @@ float FastNoise::GetCellular(float x, float y, float z) switch (m_cellularReturnType) { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2Edge(x, y, z); + case CellValue: + case NoiseLookup: + case Distance: + return SingleCellular(x, y, z); default: - return _Cellular(x, y, z); + return SingleCellular2Edge(x, y, z); } } -float FastNoise::_Cellular(float x, float y, float z) +FN_DECIMAL FastNoise::SingleCellular(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { int xr = FastRound(x); int yr = FastRound(y); int zr = FastRound(z); - float distance = 999999.f; - float newDistance; - float vec[3]; - int lutPos; + FN_DECIMAL distance = 999999; int xc, yc, zc; switch (m_cellularDistanceFunction) { - case FastNoise::Euclidean: - for (int xi = xr - 1; xi <= xr + 1; xi++) - { - for (int yi = yr - 1; yi <= yr + 1; yi++) - { - for (int zi = zr - 1; zi <= zr + 1; zi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); - - vec[0] = xi - x + CELLULAR3D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_LUT[lutPos][2]; - - newDistance = vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]; - - if (newDistance < distance) - { - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - } - } - } - break; - case FastNoise::Manhattan: + case Euclidean: for (int xi = xr - 1; xi <= xr + 1; xi++) { for (int yi = yr - 1; yi <= yr + 1; yi++) { for (int zi = zr - 1; zi <= zr + 1; zi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); + unsigned char lutPos = Index3D_256(0, xi, yi, zi); - vec[0] = xi - x + CELLULAR3D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_LUT[lutPos][2]; + FN_DECIMAL vecX = xi - x + CELL_3D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_3D_Y[lutPos] * m_cellularJitter; + FN_DECIMAL vecZ = zi - z + CELL_3D_Z[lutPos] * m_cellularJitter; - newDistance = FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2]); + FN_DECIMAL newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; if (newDistance < distance) { @@ -1503,20 +1734,46 @@ float FastNoise::_Cellular(float x, float y, float z) } } break; - case FastNoise::Natural: + case Manhattan: for (int xi = xr - 1; xi <= xr + 1; xi++) { for (int yi = yr - 1; yi <= yr + 1; yi++) { for (int zi = zr - 1; zi <= zr + 1; zi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); + unsigned char lutPos = Index3D_256(0, xi, yi, zi); - vec[0] = xi - x + CELLULAR3D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_LUT[lutPos][2]; + FN_DECIMAL vecX = xi - x + CELL_3D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_3D_Y[lutPos] * m_cellularJitter; + FN_DECIMAL vecZ = zi - z + CELL_3D_Z[lutPos] * m_cellularJitter; - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2])) * (vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); + FN_DECIMAL newDistance = FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ); + + if (newDistance < distance) + { + distance = newDistance; + xc = xi; + yc = yi; + zc = zi; + } + } + } + } + break; + case Natural: + for (int xi = xr - 1; xi <= xr + 1; xi++) + { + for (int yi = yr - 1; yi <= yr + 1; yi++) + { + for (int zi = zr - 1; zi <= zr + 1; zi++) + { + unsigned char lutPos = Index3D_256(0, xi, yi, zi); + + FN_DECIMAL vecX = xi - x + CELL_3D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_3D_Y[lutPos] * m_cellularJitter; + FN_DECIMAL vecZ = zi - z + CELL_3D_Z[lutPos] * m_cellularJitter; + + FN_DECIMAL newDistance = (FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); if (newDistance < distance) { @@ -1533,139 +1790,97 @@ float FastNoise::_Cellular(float x, float y, float z) break; } + unsigned char lutPos; switch (m_cellularReturnType) { - case FastNoise::CellValue: - return VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; + case CellValue: + return ValCoord3D(m_seed, xc, yc, zc); - case FastNoise::NoiseLookup: - if (!m_cellularNoiseLookup) - return 0; + case NoiseLookup: + assert(m_cellularNoiseLookup); - lutPos = CoordLUTIndex(m_seed, xc, yc, zc); - return m_cellularNoiseLookup->GetNoise(xc + CELLULAR3D_LUT[lutPos][0], yc + CELLULAR3D_LUT[lutPos][1], zc + CELLULAR3D_LUT[lutPos][2]); - - case FastNoise::Distance2Center: - return sqrtf(distance); - case FastNoise::Distance2CenterXValue: - return (1.0f - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; + lutPos = Index3D_256(0, xc, yc, zc); + return m_cellularNoiseLookup->GetNoise(xc + CELL_3D_X[lutPos] * m_cellularJitter, yc + CELL_3D_Y[lutPos] * m_cellularJitter, zc + CELL_3D_Z[lutPos] * m_cellularJitter); - case FastNoise::Distance2CenterSq: + case Distance: return distance; - case FastNoise::Distance2CenterSqXValue: - return (1.0f - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; default: - return 0.0f; + return 0; } } -float FastNoise::_Cellular2Edge(float x, float y, float z) +FN_DECIMAL FastNoise::SingleCellular2Edge(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const { int xr = FastRound(x); int yr = FastRound(y); int zr = FastRound(z); - float distance = 999999.f; - float distance2 = 999999.f; - float newDistance; - float vec[3]; - int lutPos; - int xc = 0, yc = 0, zc = 0; + FN_DECIMAL distance[FN_CELLULAR_INDEX_MAX+1] = { 999999,999999,999999,999999 }; switch (m_cellularDistanceFunction) { - case FastNoise::Euclidean: + case Euclidean: for (int xi = xr - 1; xi <= xr + 1; xi++) { for (int yi = yr - 1; yi <= yr + 1; yi++) { for (int zi = zr - 1; zi <= zr + 1; zi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); + unsigned char lutPos = Index3D_256(0, xi, yi, zi); - vec[0] = xi - x + CELLULAR3D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_LUT[lutPos][2]; + FN_DECIMAL vecX = xi - x + CELL_3D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_3D_Y[lutPos] * m_cellularJitter; + FN_DECIMAL vecZ = zi - z + CELL_3D_Z[lutPos] * m_cellularJitter; - newDistance = vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]; + FN_DECIMAL newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } + for (int i = m_cellularDistanceIndex1; i > 0; i--) + distance[i] = fmax(fmin(distance[i], newDistance), distance[i - 1]); + distance[0] = fmin(distance[0], newDistance); } } } break; - case FastNoise::Manhattan: + case Manhattan: for (int xi = xr - 1; xi <= xr + 1; xi++) { for (int yi = yr - 1; yi <= yr + 1; yi++) { for (int zi = zr - 1; zi <= zr + 1; zi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); + unsigned char lutPos = Index3D_256(0, xi, yi, zi); - vec[0] = xi - x + CELLULAR3D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_LUT[lutPos][2]; + FN_DECIMAL vecX = xi - x + CELL_3D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_3D_Y[lutPos] * m_cellularJitter; + FN_DECIMAL vecZ = zi - z + CELL_3D_Z[lutPos] * m_cellularJitter; - newDistance = FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2]); + FN_DECIMAL newDistance = FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ); - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } + for (int i = m_cellularDistanceIndex1; i > 0; i--) + distance[i] = fmax(fmin(distance[i], newDistance), distance[i - 1]); + distance[0] = fmin(distance[0], newDistance); } } } break; - case FastNoise::Natural: + case Natural: for (int xi = xr - 1; xi <= xr + 1; xi++) { for (int yi = yr - 1; yi <= yr + 1; yi++) { for (int zi = zr - 1; zi <= zr + 1; zi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); + unsigned char lutPos = Index3D_256(0, xi, yi, zi); - vec[0] = xi - x + CELLULAR3D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_LUT[lutPos][2]; + FN_DECIMAL vecX = xi - x + CELL_3D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_3D_Y[lutPos] * m_cellularJitter; + FN_DECIMAL vecZ = zi - z + CELL_3D_Z[lutPos] * m_cellularJitter; - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2])) * (vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); + FN_DECIMAL newDistance = (FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } + for (int i = m_cellularDistanceIndex1; i > 0; i--) + distance[i] = fmax(fmin(distance[i], newDistance), distance[i - 1]); + distance[0] = fmin(distance[0], newDistance); } } } @@ -1676,569 +1891,59 @@ float FastNoise::_Cellular2Edge(float x, float y, float z) switch (m_cellularReturnType) { - case FastNoise::Distance2Edge: - return sqrtf(distance2) - sqrtf(distance); - case FastNoise::Distance2EdgeXValue: - return (sqrtf(distance2) - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; - - case FastNoise::Distance2EdgeSq: - return distance2 - distance; - case FastNoise::Distance2EdgeSqXValue: - return (distance2 - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; + case Distance2: + return distance[m_cellularDistanceIndex1]; + case Distance2Add: + return distance[m_cellularDistanceIndex1] + distance[m_cellularDistanceIndex0]; + case Distance2Sub: + return distance[m_cellularDistanceIndex1] - distance[m_cellularDistanceIndex0]; + case Distance2Mul: + return distance[m_cellularDistanceIndex1] * distance[m_cellularDistanceIndex0]; + case Distance2Div: + return distance[m_cellularDistanceIndex0] / distance[m_cellularDistanceIndex1]; default: - return 0.0f; + return 0; } } -float FastNoise::GetCellularHQ(float x, float y, float z) -{ - x *= m_frequency; - y *= m_frequency; - z *= m_frequency; - - switch (m_cellularReturnType) - { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2EdgeHQ(x, y, z); - default: - return _CellularHQ(x, y, z); - } -} - -float FastNoise::_CellularHQ(float x, float y, float z) -{ - int xr = FastRound(x); - int yr = FastRound(y); - int zr = FastRound(z); - - float distance = 999999.f; - float newDistance; - float vec[3]; - int lutPos; - int xc, yc, zc; - - switch (m_cellularDistanceFunction) - { - case FastNoise::Euclidean: - for (int xi = xr - 2; xi <= xr + 2; xi++) - { - for (int yi = yr - 2; yi <= yr + 2; yi++) - { - for (int zi = zr - 2; zi <= zr + 2; zi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); - - vec[0] = xi - x + CELLULAR3D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_HQ_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_HQ_LUT[lutPos][2]; - - newDistance = vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]; - - if (newDistance < distance) - { - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - } - } - } - break; - case FastNoise::Manhattan: - for (int xi = xr - 2; xi <= xr + 2; xi++) - { - for (int yi = yr - 2; yi <= yr + 2; yi++) - { - for (int zi = zr - 2; zi <= zr + 2; zi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); - - vec[0] = xi - x + CELLULAR3D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_HQ_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_HQ_LUT[lutPos][2]; - - newDistance = FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2]); - - if (newDistance < distance) - { - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - } - } - } - break; - case FastNoise::Natural: - for (int xi = xr - 2; xi <= xr + 2; xi++) - { - for (int yi = yr - 2; yi <= yr + 2; yi++) - { - for (int zi = zr - 2; zi <= zr + 2; zi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); - - vec[0] = xi - x + CELLULAR3D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_HQ_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_HQ_LUT[lutPos][2]; - - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2])) * (vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); - - if (newDistance < distance) - { - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - } - } - } - break; - default: - break; - } - - switch (m_cellularReturnType) - { - case FastNoise::CellValue: - return VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; - - case FastNoise::NoiseLookup: - if (!m_cellularNoiseLookup) - return 0; - - lutPos = CoordLUTIndex(m_seed, xc, yc, zc); - return m_cellularNoiseLookup->GetNoise(xc + CELLULAR3D_HQ_LUT[lutPos][0], yc + CELLULAR3D_HQ_LUT[lutPos][1], zc + CELLULAR3D_HQ_LUT[lutPos][2]); - - case FastNoise::Distance2Center: - return sqrtf(distance); - case FastNoise::Distance2CenterXValue: - return (1.0f - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; - - case FastNoise::Distance2CenterSq: - return distance; - case FastNoise::Distance2CenterSqXValue: - return (1.0f - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; - default: - return 0.0f; - } -} - -float FastNoise::_Cellular2EdgeHQ(float x, float y, float z) -{ - int xr = FastRound(x); - int yr = FastRound(y); - int zr = FastRound(z); - - float distance = 999999.f; - float distance2 = 999999.f; - float newDistance; - float vec[3]; - int lutPos; - int xc = 0, yc = 0, zc = 0; - - switch (m_cellularDistanceFunction) - { - case FastNoise::Euclidean: - for (int xi = xr - 2; xi <= xr + 2; xi++) - { - for (int yi = yr - 2; yi <= yr + 2; yi++) - { - for (int zi = zr - 2; zi <= zr + 2; zi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); - - vec[0] = xi - x + CELLULAR3D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_HQ_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_HQ_LUT[lutPos][2]; - - newDistance = vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]; - - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } - } - } - } - break; - case FastNoise::Manhattan: - for (int xi = xr - 2; xi <= xr + 2; xi++) - { - for (int yi = yr - 2; yi <= yr + 2; yi++) - { - for (int zi = zr - 2; zi <= zr + 2; zi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); - - vec[0] = xi - x + CELLULAR3D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_HQ_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_HQ_LUT[lutPos][2]; - - newDistance = FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2]); - - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } - } - } - } - break; - case FastNoise::Natural: - for (int xi = xr - 2; xi <= xr + 2; xi++) - { - for (int yi = yr - 2; yi <= yr + 2; yi++) - { - for (int zi = zr - 2; zi <= zr + 2; zi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi, zi); - - vec[0] = xi - x + CELLULAR3D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR3D_HQ_LUT[lutPos][1]; - vec[2] = zi - z + CELLULAR3D_HQ_LUT[lutPos][2]; - - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1]) + FastAbs(vec[2])) * (vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); - - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - zc = zi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } - } - } - } - break; - default: - break; - } - - switch (m_cellularReturnType) - { - case FastNoise::Distance2Edge: - return sqrtf(distance2) - sqrtf(distance); - case FastNoise::Distance2EdgeXValue: - return (sqrtf(distance2) - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; - - case FastNoise::Distance2EdgeSq: - return distance2 - distance; - case FastNoise::Distance2EdgeSqXValue: - return (distance2 - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc, zc)]; - default: - return 0.0f; - } -} - -float FastNoise::GetCellular(float x, float y) +FN_DECIMAL FastNoise::GetCellular(FN_DECIMAL x, FN_DECIMAL y) const { x *= m_frequency; y *= m_frequency; switch (m_cellularReturnType) { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2Edge(x, y); + case CellValue: + case NoiseLookup: + case Distance: + return SingleCellular(x, y); default: - return _Cellular(x, y); + return SingleCellular2Edge(x, y); } } -float FastNoise::_Cellular(float x, float y) +FN_DECIMAL FastNoise::SingleCellular(FN_DECIMAL x, FN_DECIMAL y) const { int xr = FastRound(x); int yr = FastRound(y); - float distance = 999999.f; - float newDistance; - float vec[2]; - int lutPos; - int xc, yc; - - switch (m_cellularDistanceFunction) - { - default: - case FastNoise::Euclidean: - for (int xi = xr - 1; xi <= xr + 1; xi++) - { - for (int yi = yr - 1; yi <= yr + 1; yi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi); - - vec[0] = xi - x + CELLULAR2D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_LUT[lutPos][1]; - - newDistance = vec[0] * vec[0] + vec[1] * vec[1]; - - if (newDistance < distance) - { - distance = newDistance; - xc = xi; - yc = yi; - } - } - } - break; - case FastNoise::Manhattan: - for (int xi = xr - 1; xi <= xr + 1; xi++) - { - for (int yi = yr - 1; yi <= yr + 1; yi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi); - - vec[0] = xi - x + CELLULAR2D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_LUT[lutPos][1]; - - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1])); - - if (newDistance < distance) - { - distance = newDistance; - xc = xi; - yc = yi; - } - } - } - break; - case FastNoise::Natural: - for (int xi = xr - 1; xi <= xr + 1; xi++) - { - for (int yi = yr - 1; yi <= yr + 1; yi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi); - - vec[0] = xi - x + CELLULAR2D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_LUT[lutPos][1]; - - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1])) * (vec[0] * vec[0] + vec[1] * vec[1]); - - if (newDistance < distance) - { - distance = newDistance; - xc = xi; - yc = yi; - } - } - } - break; - } - - switch (m_cellularReturnType) - { - case FastNoise::CellValue: - return VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; - - case FastNoise::NoiseLookup: - if (!m_cellularNoiseLookup) - return 0; - - lutPos = CoordLUTIndex(m_seed, xc, yc); - return m_cellularNoiseLookup->GetNoise(xc + CELLULAR2D_LUT[lutPos][0], yc + CELLULAR2D_LUT[lutPos][1]); - - case FastNoise::Distance2Center: - return sqrtf(distance); - case FastNoise::Distance2CenterXValue: - return (1.0f - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; - - case FastNoise::Distance2CenterSq: - return distance; - case FastNoise::Distance2CenterSqXValue: - return (1.0f - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; - default: - return 0.0f; - } -} - -float FastNoise::_Cellular2Edge(float x, float y) -{ - int xr = FastRound(x); - int yr = FastRound(y); - - float distance = 999999.f; - float distance2 = 999999.f; - float newDistance; - float vec[2]; - int lutPos; - int xc = 0, yc = 0; - - switch (m_cellularDistanceFunction) - { - default: - case FastNoise::Euclidean: - for (int xi = xr - 1; xi <= xr + 1; xi++) - { - for (int yi = yr - 1; yi <= yr + 1; yi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi); - - vec[0] = xi - x + CELLULAR2D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_LUT[lutPos][1]; - - newDistance = vec[0] * vec[0] + vec[1] * vec[1]; - - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } - } - } - break; - case FastNoise::Manhattan: - for (int xi = xr - 1; xi <= xr + 1; xi++) - { - for (int yi = yr - 1; yi <= yr + 1; yi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi); - - vec[0] = xi - x + CELLULAR2D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_LUT[lutPos][1]; - - newDistance = FastAbs(vec[0]) + FastAbs(vec[1]); - - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } - } - } - break; - case FastNoise::Natural: - for (int xi = xr - 1; xi <= xr + 1; xi++) - { - for (int yi = yr - 1; yi <= yr + 1; yi++) - { - lutPos = CoordLUTIndex(m_seed, xi, yi); - - vec[0] = xi - x + CELLULAR2D_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_LUT[lutPos][1]; - - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1])) * (vec[0] * vec[0] + vec[1] * vec[1]); - - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } - } - } - break; - } - - switch (m_cellularReturnType) - { - case FastNoise::Distance2Edge: - return sqrtf(distance2) - sqrtf(distance); - case FastNoise::Distance2EdgeXValue: - return (sqrtf(distance2) - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; - - case FastNoise::Distance2EdgeSq: - return distance2 - distance; - case FastNoise::Distance2EdgeSqXValue: - return (distance2 - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; - default: - return 0.0f; - } -} - -float FastNoise::GetCellularHQ(float x, float y) -{ - x *= m_frequency; - y *= m_frequency; - - switch (m_cellularReturnType) - { - case Distance2Edge: - case Distance2EdgeXValue: - case Distance2EdgeSq: - case Distance2EdgeSqXValue: - return _Cellular2EdgeHQ(x, y); - default: - return _CellularHQ(x, y); - } -} - -float FastNoise::_CellularHQ(float x, float y) -{ - int xr = FastRound(x); - int yr = FastRound(y); - - float distance = 999999.f; - float newDistance; - float vec[2]; - int lutPos; + FN_DECIMAL distance = 999999; int xc, yc; switch (m_cellularDistanceFunction) { default: case Euclidean: - for (int xi = xr - 2; xi <= xr + 2; xi++) + for (int xi = xr - 1; xi <= xr + 1; xi++) { - for (int yi = yr - 2; yi <= yr + 2; yi++) + for (int yi = yr - 1; yi <= yr + 1; yi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi); + unsigned char lutPos = Index2D_256(0, xi, yi); - vec[0] = xi - x + CELLULAR2D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_HQ_LUT[lutPos][1]; - - newDistance = vec[0] * vec[0] + vec[1] * vec[1]; + FN_DECIMAL vecX = xi - x + CELL_2D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_2D_Y[lutPos] * m_cellularJitter; + + FN_DECIMAL newDistance = vecX * vecX + vecY * vecY; if (newDistance < distance) { @@ -2250,16 +1955,16 @@ float FastNoise::_CellularHQ(float x, float y) } break; case Manhattan: - for (int xi = xr - 2; xi <= xr + 2; xi++) + for (int xi = xr - 1; xi <= xr + 1; xi++) { - for (int yi = yr - 2; yi <= yr + 2; yi++) + for (int yi = yr - 1; yi <= yr + 1; yi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi); + unsigned char lutPos = Index2D_256(0, xi, yi); - vec[0] = xi - x + CELLULAR2D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_HQ_LUT[lutPos][1]; + FN_DECIMAL vecX = xi - x + CELL_2D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_2D_Y[lutPos] * m_cellularJitter; - newDistance = FastAbs(vec[0]) + FastAbs(vec[1]); + FN_DECIMAL newDistance = (FastAbs(vecX) + FastAbs(vecY)); if (newDistance < distance) { @@ -2271,16 +1976,16 @@ float FastNoise::_CellularHQ(float x, float y) } break; case Natural: - for (int xi = xr - 2; xi <= xr + 2; xi++) + for (int xi = xr - 1; xi <= xr + 1; xi++) { - for (int yi = yr - 2; yi <= yr + 2; yi++) + for (int yi = yr - 1; yi <= yr + 1; yi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi); + unsigned char lutPos = Index2D_256(0, xi, yi); - vec[0] = xi - x + CELLULAR2D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_HQ_LUT[lutPos][1]; + FN_DECIMAL vecX = xi - x + CELL_2D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_2D_Y[lutPos] * m_cellularJitter; - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1])) * (vec[0] * vec[0] + vec[1] * vec[1]); + FN_DECIMAL newDistance = (FastAbs(vecX) + FastAbs(vecY)) + (vecX * vecX + vecY * vecY); if (newDistance < distance) { @@ -2293,125 +1998,86 @@ float FastNoise::_CellularHQ(float x, float y) break; } + unsigned char lutPos; switch (m_cellularReturnType) { - case FastNoise::CellValue: - return VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; + case CellValue: + return ValCoord2D(m_seed, xc, yc); - case FastNoise::NoiseLookup: - if (!m_cellularNoiseLookup) - return 0; + case NoiseLookup: + assert(m_cellularNoiseLookup); - lutPos = CoordLUTIndex(m_seed, xc, yc); - return m_cellularNoiseLookup->GetNoise(xc + CELLULAR2D_HQ_LUT[lutPos][0], yc + CELLULAR2D_HQ_LUT[lutPos][1]); + lutPos = Index2D_256(0, xc, yc); + return m_cellularNoiseLookup->GetNoise(xc + CELL_2D_X[lutPos] * m_cellularJitter, yc + CELL_2D_Y[lutPos] * m_cellularJitter); - case FastNoise::Distance2Center: - return sqrtf(distance); - case FastNoise::Distance2CenterXValue: - return (1.0f - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; - - case FastNoise::Distance2CenterSq: + case Distance: return distance; - case FastNoise::Distance2CenterSqXValue: - return (1.0f - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; default: - return 0.0f; + return 0; } } -float FastNoise::_Cellular2EdgeHQ(float x, float y) +FN_DECIMAL FastNoise::SingleCellular2Edge(FN_DECIMAL x, FN_DECIMAL y) const { int xr = FastRound(x); int yr = FastRound(y); - float distance = 999999.f; - float distance2 = 999999.f; - float newDistance; - float vec[2]; - int lutPos; - int xc = 0, yc = 0; + FN_DECIMAL distance[FN_CELLULAR_INDEX_MAX + 1] = { 999999,999999,999999,999999 }; switch (m_cellularDistanceFunction) { default: case Euclidean: - for (int xi = xr - 2; xi <= xr + 2; xi++) + for (int xi = xr - 1; xi <= xr + 1; xi++) { - for (int yi = yr - 2; yi <= yr + 2; yi++) + for (int yi = yr - 1; yi <= yr + 1; yi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi); + unsigned char lutPos = Index2D_256(0, xi, yi); - vec[0] = xi - x + CELLULAR2D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_HQ_LUT[lutPos][1]; + FN_DECIMAL vecX = xi - x + CELL_2D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_2D_Y[lutPos] * m_cellularJitter; - newDistance = vec[0] * vec[0] + vec[1] * vec[1]; + FN_DECIMAL newDistance = vecX * vecX + vecY * vecY; - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } + for (int i = m_cellularDistanceIndex1; i > 0; i--) + distance[i] = fmax(fmin(distance[i], newDistance), distance[i - 1]); + distance[0] = fmin(distance[0], newDistance); } } break; case Manhattan: - for (int xi = xr - 2; xi <= xr + 2; xi++) + for (int xi = xr - 1; xi <= xr + 1; xi++) { - for (int yi = yr - 2; yi <= yr + 2; yi++) + for (int yi = yr - 1; yi <= yr + 1; yi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi); + unsigned char lutPos = Index2D_256(0, xi, yi); - vec[0] = xi - x + CELLULAR2D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_HQ_LUT[lutPos][1]; + FN_DECIMAL vecX = xi - x + CELL_2D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_2D_Y[lutPos] * m_cellularJitter; - newDistance = FastAbs(vec[0]) + FastAbs(vec[1]); + FN_DECIMAL newDistance = FastAbs(vecX) + FastAbs(vecY); - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } + for (int i = m_cellularDistanceIndex1; i > 0; i--) + distance[i] = fmax(fmin(distance[i], newDistance), distance[i - 1]); + distance[0] = fmin(distance[0], newDistance); } } break; case Natural: - for (int xi = xr - 2; xi <= xr + 2; xi++) + for (int xi = xr - 1; xi <= xr + 1; xi++) { - for (int yi = yr - 2; yi <= yr + 2; yi++) + for (int yi = yr - 1; yi <= yr + 1; yi++) { - lutPos = CoordLUTIndex(m_seed, xi, yi); + unsigned char lutPos = Index2D_256(0, xi, yi); - vec[0] = xi - x + CELLULAR2D_HQ_LUT[lutPos][0]; - vec[1] = yi - y + CELLULAR2D_HQ_LUT[lutPos][1]; + FN_DECIMAL vecX = xi - x + CELL_2D_X[lutPos] * m_cellularJitter; + FN_DECIMAL vecY = yi - y + CELL_2D_Y[lutPos] * m_cellularJitter; - newDistance = (FastAbs(vec[0]) + FastAbs(vec[1])) * (vec[0] * vec[0] + vec[1] * vec[1]); + FN_DECIMAL newDistance = (FastAbs(vecX) + FastAbs(vecY)) + (vecX * vecX + vecY * vecY); - if (newDistance < distance) - { - distance2 = distance; - - distance = newDistance; - xc = xi; - yc = yi; - } - else if (newDistance < distance2) - { - distance2 = newDistance; - } + for (int i = m_cellularDistanceIndex1; i > 0; i--) + distance[i] = fmax(fmin(distance[i], newDistance), distance[i - 1]); + distance[0] = fmin(distance[0], newDistance); } } break; @@ -2419,18 +2085,176 @@ float FastNoise::_Cellular2EdgeHQ(float x, float y) switch (m_cellularReturnType) { - case FastNoise::Distance2Edge: - return sqrtf(distance2) - sqrtf(distance); - case FastNoise::Distance2EdgeXValue: - return (sqrtf(distance2) - sqrtf(distance)) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; - - case FastNoise::Distance2EdgeSq: - return distance2 - distance; - case FastNoise::Distance2EdgeSqXValue: - return (distance2 - distance) * VAL_LUT[CoordLUTIndex(m_seed, xc, yc)]; + case Distance2: + return distance[m_cellularDistanceIndex1]; + case Distance2Add: + return distance[m_cellularDistanceIndex1] + distance[m_cellularDistanceIndex0]; + case Distance2Sub: + return distance[m_cellularDistanceIndex1] - distance[m_cellularDistanceIndex0]; + case Distance2Mul: + return distance[m_cellularDistanceIndex1] * distance[m_cellularDistanceIndex0]; + case Distance2Div: + return distance[m_cellularDistanceIndex0] / distance[m_cellularDistanceIndex1]; default: - return 0.0f; + return 0; } } -FASTNOISE_NAMESPACE_END +void FastNoise::GradientPerturb(FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z) const +{ + SingleGradientPerturb(0, m_gradientPerturbAmp, m_frequency, x, y, z); +} + +void FastNoise::GradientPerturbFractal(FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z) const +{ + FN_DECIMAL amp = m_gradientPerturbAmp * m_fractalBounding; + FN_DECIMAL freq = m_frequency; + int i = 0; + + SingleGradientPerturb(m_perm[0], amp, m_frequency, x, y, z); + + while (++i < m_octaves) + { + freq *= m_lacunarity; + amp *= m_gain; + SingleGradientPerturb(m_perm[i], amp, freq, x, y, z); + } +} + +void FastNoise::SingleGradientPerturb(unsigned char offset, FN_DECIMAL warpAmp, FN_DECIMAL frequency, FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z) const +{ + FN_DECIMAL xf = x * frequency; + FN_DECIMAL yf = y * frequency; + FN_DECIMAL zf = z * frequency; + + int x0 = FastFloor(xf); + int y0 = FastFloor(yf); + int z0 = FastFloor(zf); + int x1 = x0 + 1; + int y1 = y0 + 1; + int z1 = z0 + 1; + + FN_DECIMAL xs, ys, zs; + switch (m_interp) + { + default: + case Linear: + xs = xf - (FN_DECIMAL)x0; + ys = yf - (FN_DECIMAL)y0; + zs = zf - (FN_DECIMAL)z0; + break; + case Hermite: + xs = InterpHermiteFunc(xf - (FN_DECIMAL)x0); + ys = InterpHermiteFunc(yf - (FN_DECIMAL)y0); + zs = InterpHermiteFunc(zf - (FN_DECIMAL)z0); + break; + case Quintic: + xs = InterpQuinticFunc(xf - (FN_DECIMAL)x0); + ys = InterpQuinticFunc(yf - (FN_DECIMAL)y0); + zs = InterpQuinticFunc(zf - (FN_DECIMAL)z0); + break; + } + + int lutPos0 = Index3D_256(offset, x0, y0, z0); + int lutPos1 = Index3D_256(offset, x1, y0, z0); + + FN_DECIMAL lx0x = Lerp(CELL_3D_X[lutPos0], CELL_3D_X[lutPos1], xs); + FN_DECIMAL ly0x = Lerp(CELL_3D_Y[lutPos0], CELL_3D_Y[lutPos1], xs); + FN_DECIMAL lz0x = Lerp(CELL_3D_Z[lutPos0], CELL_3D_Z[lutPos1], xs); + + lutPos0 = Index3D_256(offset, x0, y1, z0); + lutPos1 = Index3D_256(offset, x1, y1, z0); + + FN_DECIMAL lx1x = Lerp(CELL_3D_X[lutPos0], CELL_3D_X[lutPos1], xs); + FN_DECIMAL ly1x = Lerp(CELL_3D_Y[lutPos0], CELL_3D_Y[lutPos1], xs); + FN_DECIMAL lz1x = Lerp(CELL_3D_Z[lutPos0], CELL_3D_Z[lutPos1], xs); + + FN_DECIMAL lx0y = Lerp(lx0x, lx1x, ys); + FN_DECIMAL ly0y = Lerp(ly0x, ly1x, ys); + FN_DECIMAL lz0y = Lerp(lz0x, lz1x, ys); + + lutPos0 = Index3D_256(offset, x0, y0, z1); + lutPos1 = Index3D_256(offset, x1, y0, z1); + + lx0x = Lerp(CELL_3D_X[lutPos0], CELL_3D_X[lutPos1], xs); + ly0x = Lerp(CELL_3D_Y[lutPos0], CELL_3D_Y[lutPos1], xs); + lz0x = Lerp(CELL_3D_Z[lutPos0], CELL_3D_Z[lutPos1], xs); + + lutPos0 = Index3D_256(offset, x0, y1, z1); + lutPos1 = Index3D_256(offset, x1, y1, z1); + + lx1x = Lerp(CELL_3D_X[lutPos0], CELL_3D_X[lutPos1], xs); + ly1x = Lerp(CELL_3D_Y[lutPos0], CELL_3D_Y[lutPos1], xs); + lz1x = Lerp(CELL_3D_Z[lutPos0], CELL_3D_Z[lutPos1], xs); + + x += Lerp(lx0y, Lerp(lx0x, lx1x, ys), zs) * warpAmp; + y += Lerp(ly0y, Lerp(ly0x, ly1x, ys), zs) * warpAmp; + z += Lerp(lz0y, Lerp(lz0x, lz1x, ys), zs) * warpAmp; +} + +void FastNoise::GradientPerturb(FN_DECIMAL& x, FN_DECIMAL& y) const +{ + SingleGradientPerturb(0, m_gradientPerturbAmp, m_frequency, x, y); +} + +void FastNoise::GradientPerturbFractal(FN_DECIMAL& x, FN_DECIMAL& y) const +{ + FN_DECIMAL amp = m_gradientPerturbAmp * m_fractalBounding; + FN_DECIMAL freq = m_frequency; + int i = 0; + + SingleGradientPerturb(m_perm[0], amp, m_frequency, x, y); + + while (++i < m_octaves) + { + freq *= m_lacunarity; + amp *= m_gain; + SingleGradientPerturb(m_perm[i], amp, freq, x, y); + } +} + +void FastNoise::SingleGradientPerturb(unsigned char offset, FN_DECIMAL warpAmp, FN_DECIMAL frequency, FN_DECIMAL& x, FN_DECIMAL& y) const +{ + FN_DECIMAL xf = x * frequency; + FN_DECIMAL yf = y * frequency; + + int x0 = FastFloor(xf); + int y0 = FastFloor(yf); + int x1 = x0 + 1; + int y1 = y0 + 1; + + FN_DECIMAL xs, ys; + switch (m_interp) + { + default: + case Linear: + xs = xf - (FN_DECIMAL)x0; + ys = yf - (FN_DECIMAL)y0; + break; + case Hermite: + xs = InterpHermiteFunc(xf - (FN_DECIMAL)x0); + ys = InterpHermiteFunc(yf - (FN_DECIMAL)y0); + break; + case Quintic: + xs = InterpQuinticFunc(xf - (FN_DECIMAL)x0); + ys = InterpQuinticFunc(yf - (FN_DECIMAL)y0); + break; + } + + int lutPos0 = Index2D_256(offset, x0, y0); + int lutPos1 = Index2D_256(offset, x1, y0); + + FN_DECIMAL lx0x = Lerp(CELL_2D_X[lutPos0], CELL_2D_X[lutPos1], xs); + FN_DECIMAL ly0x = Lerp(CELL_2D_Y[lutPos0], CELL_2D_Y[lutPos1], xs); + + lutPos0 = Index2D_256(offset, x0, y1); + lutPos1 = Index2D_256(offset, x1, y1); + + FN_DECIMAL lx1x = Lerp(CELL_2D_X[lutPos0], CELL_2D_X[lutPos1], xs); + FN_DECIMAL ly1x = Lerp(CELL_2D_Y[lutPos0], CELL_2D_Y[lutPos1], xs); + + x += Lerp(lx0x, lx1x, ys) * warpAmp; + y += Lerp(ly0x, ly1x, ys) * warpAmp; +} + +} // namespace fastnoise diff --git a/lib/FastNoise.h b/lib/FastNoise.h index 576a572..451e97c 100644 --- a/lib/FastNoise.h +++ b/lib/FastNoise.h @@ -2,7 +2,7 @@ // // MIT License // -// Copyright(c) 2016 Jordan Peck +// Copyright(c) 2017 Jordan Peck // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files(the "Software"), to deal @@ -26,167 +26,291 @@ // off every 'zix'.) // -#ifndef __FASTNOISE_H__ -#define __FASTNOISE_H__ +// VERSION: 0.4.1 -// Added by Marc Gilleron for Godot integration (ability to put a namespace and free FastNoise name) -#define FASTNOISE_NAMESPACE fastnoise -#ifdef FASTNOISE_NAMESPACE - #define FASTNOISE_NAMESPACE_BEGIN namespace FASTNOISE_NAMESPACE { - #define FASTNOISE_NAMESPACE_END } +#ifndef FASTNOISE_H +#define FASTNOISE_H + +// Uncomment the line below to use doubles throughout FastNoise instead of floats +//#define FN_USE_DOUBLES + +#define FN_CELLULAR_INDEX_MAX 3 + +namespace fastnoise { + +#ifdef FN_USE_DOUBLES +typedef double FN_DECIMAL; #else - #define FASTNOISE_NAMESPACE_BEGIN - #define FASTNOISE_NAMESPACE_END +typedef float FN_DECIMAL; #endif -FASTNOISE_NAMESPACE_BEGIN - class FastNoise { public: - FastNoise(int seed = 0) { m_seed = seed; } - ~FastNoise() { delete m_cellularNoiseLookup; } + explicit FastNoise(int seed = 1337) { SetSeed(seed); CalculateFractalBounding(); } - enum NoiseType { Value, ValueFractal, Gradient, GradientFractal, Simplex, SimplexFractal, Cellular, CellularHQ, WhiteNoise }; - enum Interp { InterpLinear = 0, InterpHermite = 1, InterpQuintic = 2 }; + enum NoiseType { Value, ValueFractal, Perlin, PerlinFractal, Simplex, SimplexFractal, Cellular, WhiteNoise, Cubic, CubicFractal }; + enum Interp { Linear, Hermite, Quintic }; enum FractalType { FBM, Billow, RigidMulti }; enum CellularDistanceFunction { Euclidean, Manhattan, Natural }; - enum CellularReturnType { CellValue, NoiseLookup, Distance2Center, Distance2CenterXValue, Distance2CenterSq, Distance2CenterSqXValue, Distance2Edge, Distance2EdgeXValue, Distance2EdgeSq, Distance2EdgeSqXValue }; + enum CellularReturnType { CellValue, NoiseLookup, Distance, Distance2, Distance2Add, Distance2Sub, Distance2Mul, Distance2Div }; - void SetSeed(int seed) { m_seed = seed; } - int GetSeed(void) { return m_seed; } - void SetFrequency(float frequency) { m_frequency = frequency; } + // Sets seed used for all noise types + // Default: 1337 + void SetSeed(int seed); + + // Returns seed used for all noise types + int GetSeed() const { return m_seed; } + + // Sets frequency for all noise types + // Default: 0.01 + void SetFrequency(FN_DECIMAL frequency) { m_frequency = frequency; } + + // Returns frequency used for all noise types + FN_DECIMAL GetFrequency() const { return m_frequency; } + + // Changes the interpolation method used to smooth between noise values + // Possible interpolation methods (lowest to highest quality) : + // - Linear + // - Hermite + // - Quintic + // Used in Value, Perlin Noise and Position Warping + // Default: Quintic void SetInterp(Interp interp) { m_interp = interp; } + + // Returns interpolation method used for supported noise types + Interp GetInterp() const { return m_interp; } + + // Sets noise return type of GetNoise(...) + // Default: Simplex void SetNoiseType(NoiseType noiseType) { m_noiseType = noiseType; } - void SetFractalOctaves(unsigned int octaves) { m_octaves = octaves; } - void SetFractalLacunarity(float lacunarity) { m_lacunarity = lacunarity; } - void SetFractalGain(float gain) { m_gain = gain; } + // Returns the noise type used by GetNoise + NoiseType GetNoiseType() const { return m_noiseType; } + + // Sets octave count for all fractal noise types + // Default: 3 + void SetFractalOctaves(int octaves) { m_octaves = octaves; CalculateFractalBounding(); } + + // Returns octave count for all fractal noise types + int GetFractalOctaves() const { return m_octaves; } + + // Sets octave lacunarity for all fractal noise types + // Default: 2.0 + void SetFractalLacunarity(FN_DECIMAL lacunarity) { m_lacunarity = lacunarity; } + + // Returns octave lacunarity for all fractal noise types + FN_DECIMAL GetFractalLacunarity() const { return m_lacunarity; } + + // Sets octave gain for all fractal noise types + // Default: 0.5 + void SetFractalGain(FN_DECIMAL gain) { m_gain = gain; CalculateFractalBounding(); } + + // Returns octave gain for all fractal noise types + FN_DECIMAL GetFractalGain() const { return m_gain; } + + // Sets method for combining octaves in all fractal noise types + // Default: FBM void SetFractalType(FractalType fractalType) { m_fractalType = fractalType; } + // Returns method for combining octaves in all fractal noise types + FractalType GetFractalType() const { return m_fractalType; } + + + // Sets distance function used in cellular noise calculations + // Default: Euclidean void SetCellularDistanceFunction(CellularDistanceFunction cellularDistanceFunction) { m_cellularDistanceFunction = cellularDistanceFunction; } + + // Returns the distance function used in cellular noise calculations + CellularDistanceFunction GetCellularDistanceFunction() const { return m_cellularDistanceFunction; } + + // Sets return type from cellular noise calculations + // Note: NoiseLookup requires another FastNoise object be set with SetCellularNoiseLookup() to function + // Default: CellValue void SetCellularReturnType(CellularReturnType cellularReturnType) { m_cellularReturnType = cellularReturnType; } + + // Returns the return type from cellular noise calculations + CellularReturnType GetCellularReturnType() const { return m_cellularReturnType; } + + // Noise used to calculate a cell value if cellular return type is NoiseLookup + // The lookup value is acquired through GetNoise() so ensure you SetNoiseType() on the noise lookup, value, Perlin or simplex is recommended void SetCellularNoiseLookup(FastNoise* noise) { m_cellularNoiseLookup = noise; } - /* - Timing below are averages of time taken for 1 million iterations on a single thread - Default noise settings - CPU: i7 4790k @ 4.0Ghz - VS 2013 - C++ Console Application - */ + // Returns the noise used to calculate a cell value if the cellular return type is NoiseLookup + FastNoise* GetCellularNoiseLookup() const { return m_cellularNoiseLookup; } - //3D // Win32 x64 - float GetValue(float x, float y, float z); // 14 ms 14 ms - float GetValueFractal(float x, float y, float z); // 48 ms 49 ms + // Sets the 2 distance indices used for distance2 return types + // Default: 0, 1 + // Note: index0 should be lower than index1 + // Both indices must be >= 0, index1 must be < 4 + void SetCellularDistance2Indices(int cellularDistanceIndex0, int cellularDistanceIndex1); - float GetGradient(float x, float y, float z); // 23 ms 22 ms - float GetGradientFractal(float x, float y, float z);// 80 ms 73 ms + // Returns the 2 distance indices used for distance2 return types + void GetCellularDistance2Indices(int& cellularDistanceIndex0, int& cellularDistanceIndex1) const; - float GetSimplex(float x, float y, float z); // 30 ms 30 ms - float GetSimplexFractal(float x, float y, float z); // 98 ms 101 ms + // Sets the maximum distance a cellular point can move from its grid position + // Setting this high will make artifacts more common + // Default: 0.45 + void SetCellularJitter(FN_DECIMAL cellularJitter) { m_cellularJitter = cellularJitter; } - float GetCellular(float x, float y, float z); // 123 ms 113 ms - float GetCellularHQ(float x, float y, float z); // 433 ms 449 ms + // Returns the maximum distance a cellular point can move from its grid position + FN_DECIMAL GetCellularJitter() const { return m_cellularJitter; } - float GetWhiteNoise(float x, float y, float z); // 1.5 ms 1.5 ms - float GetWhiteNoiseInt(int x, int y, int z); + // Sets the maximum warp distance from original location when using GradientPerturb{Fractal}(...) + // Default: 1.0 + void SetGradientPerturbAmp(FN_DECIMAL gradientPerturbAmp) { m_gradientPerturbAmp = gradientPerturbAmp; } - float GetNoise(float x, float y, float z); + // Returns the maximum warp distance from original location when using GradientPerturb{Fractal}(...) + FN_DECIMAL GetGradientPerturbAmp() const { return m_gradientPerturbAmp; } - //2D // Win32 x64 - float GetValue(float x, float y); // 8 ms 8 ms - float GetValueFractal(float x, float y); // 29 ms 29 ms + //2D + FN_DECIMAL GetValue(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL GetValueFractal(FN_DECIMAL x, FN_DECIMAL y) const; - float GetGradient(float x, float y); // 12 ms 11 ms - float GetGradientFractal(float x, float y); // 43 ms 40 ms + FN_DECIMAL GetPerlin(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL GetPerlinFractal(FN_DECIMAL x, FN_DECIMAL y) const; - float GetSimplex(float x, float y); // 17 ms 17 ms - float GetSimplexFractal(float x, float y); // 55 ms 52 ms + FN_DECIMAL GetSimplex(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL GetSimplexFractal(FN_DECIMAL x, FN_DECIMAL y) const; - float GetCellular(float x, float y); // 35 ms 33 ms - float GetCellularHQ(float x, float y); // 96 ms 90 ms + FN_DECIMAL GetCellular(FN_DECIMAL x, FN_DECIMAL y) const; - float GetWhiteNoise(float x, float y); // 1 ms 1 ms - float GetWhiteNoiseInt(int x, int y); // 1 ms 1 ms + FN_DECIMAL GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL GetWhiteNoiseInt(int x, int y) const; - float GetNoise(float x, float y); + FN_DECIMAL GetCubic(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL GetCubicFractal(FN_DECIMAL x, FN_DECIMAL y) const; + + FN_DECIMAL GetNoise(FN_DECIMAL x, FN_DECIMAL y) const; + + void GradientPerturb(FN_DECIMAL& x, FN_DECIMAL& y) const; + void GradientPerturbFractal(FN_DECIMAL& x, FN_DECIMAL& y) const; + + //3D + FN_DECIMAL GetValue(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL GetValueFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL GetPerlin(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL GetPerlinFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL GetSimplex(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL GetSimplexFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL GetCellular(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL GetWhiteNoiseInt(int x, int y, int z) const; + + FN_DECIMAL GetCubic(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL GetCubicFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL GetNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + void GradientPerturb(FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z) const; + void GradientPerturbFractal(FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z) const; //4D - float GetSimplex(float x, float y, float z, float w); + FN_DECIMAL GetSimplex(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w) const; - float GetWhiteNoise(float x, float y, float z, float w); - float GetWhiteNoiseInt(int x, int y, int z, int w); + FN_DECIMAL GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w) const; + FN_DECIMAL GetWhiteNoiseInt(int x, int y, int z, int w) const; -protected: - int m_seed = 0; - float m_frequency = 0.01f; - Interp m_interp = InterpQuintic; - NoiseType m_noiseType = Value; +private: + unsigned char m_perm[512]; + unsigned char m_perm12[512]; - unsigned int m_octaves = 3; - float m_lacunarity = 2.0f; - float m_gain = 0.5f; + int m_seed = 1337; + FN_DECIMAL m_frequency = FN_DECIMAL(0.01); + Interp m_interp = Quintic; + NoiseType m_noiseType = Simplex; + + int m_octaves = 3; + FN_DECIMAL m_lacunarity = FN_DECIMAL(2); + FN_DECIMAL m_gain = FN_DECIMAL(0.5); FractalType m_fractalType = FBM; + FN_DECIMAL m_fractalBounding; CellularDistanceFunction m_cellularDistanceFunction = Euclidean; CellularReturnType m_cellularReturnType = CellValue; FastNoise* m_cellularNoiseLookup = nullptr; + int m_cellularDistanceIndex0 = 0; + int m_cellularDistanceIndex1 = 1; + FN_DECIMAL m_cellularJitter = FN_DECIMAL(0.45); - //3D - float _ValueFractalFBM(float x, float y, float z); - float _ValueFractalBillow(float x, float y, float z); - float _ValueFractalRigidMulti(float x, float y, float z); - float _Value(int seed, float x, float y, float z); + FN_DECIMAL m_gradientPerturbAmp = FN_DECIMAL(1); - float _GradientFractalFBM(float x, float y, float z); - float _GradientFractalBillow(float x, float y, float z); - float _GradientFractalRigidMulti(float x, float y, float z); - float _Gradient(int seed, float x, float y, float z); - - float _SimplexFractalFBM(float x, float y, float z); - float _SimplexFractalBillow(float x, float y, float z); - float _SimplexFractalRigidMulti(float x, float y, float z); - float _Simplex(int seed, float x, float y, float z); - - float _Cellular(float x, float y, float z); - float _CellularHQ(float x, float y, float z); - float _Cellular2Edge(float x, float y, float z); - float _Cellular2EdgeHQ(float x, float y, float z); - - inline static int CoordLUTIndex(int seed, int x, int y, int z); - inline float GetValCoord(int seed, int x, int y, int z); - inline float GetGradCoord(int seed, int xi, int yi, int zi, float x, float y, float z); + void CalculateFractalBounding(); //2D - float _ValueFractalFBM(float x, float y); - float _ValueFractalBillow(float x, float y); - float _ValueFractalRigidMulti(float x, float y); - float _Value(int seed, float x, float y); + FN_DECIMAL SingleValueFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleValueFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleValueFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleValue(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const; - float _GradientFractalFBM(float x, float y); - float _GradientFractalBillow(float x, float y); - float _GradientFractalRigidMulti(float x, float y); - float _Gradient(int seed, float x, float y); + FN_DECIMAL SinglePerlinFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SinglePerlinFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SinglePerlinFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SinglePerlin(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const; - float _SimplexFractalFBM(float x, float y); - float _SimplexFractalBillow(float x, float y); - float _SimplexFractalRigidMulti(float x, float y); - float _Simplex(int seed, float x, float y); + FN_DECIMAL SingleSimplexFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleSimplexFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleSimplexFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleSimplexFractalBlend(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleSimplex(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const; - float _Cellular(float x, float y); - float _CellularHQ(float x, float y); - float _Cellular2Edge(float x, float y); - float _Cellular2EdgeHQ(float x, float y); - - inline int CoordLUTIndex(int seed, int x, int y); - inline float GetValCoord(int seed, int x, int y); - inline float GetGradCoord(int seed, int xi, int yi, float x, float y); + FN_DECIMAL SingleCubicFractalFBM(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleCubicFractalBillow(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleCubicFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleCubic(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y) const; + + FN_DECIMAL SingleCellular(FN_DECIMAL x, FN_DECIMAL y) const; + FN_DECIMAL SingleCellular2Edge(FN_DECIMAL x, FN_DECIMAL y) const; + + void SingleGradientPerturb(unsigned char offset, FN_DECIMAL warpAmp, FN_DECIMAL frequency, FN_DECIMAL& x, FN_DECIMAL& y) const; + + //3D + FN_DECIMAL SingleValueFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleValueFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleValueFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleValue(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL SinglePerlinFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SinglePerlinFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SinglePerlinFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SinglePerlin(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL SingleSimplexFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleSimplexFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleSimplexFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleSimplex(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL SingleCubicFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleCubicFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleCubicFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleCubic(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + FN_DECIMAL SingleCellular(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + FN_DECIMAL SingleCellular2Edge(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z) const; + + void SingleGradientPerturb(unsigned char offset, FN_DECIMAL warpAmp, FN_DECIMAL frequency, FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z) const; //4D - float _Simplex(float x, float y, float z, float w); - inline static int CoordLUTIndex(int seed, int x, int y, int z, int w); + FN_DECIMAL SingleSimplex(unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w) const; + + inline unsigned char Index2D_12(unsigned char offset, int x, int y) const; + inline unsigned char Index3D_12(unsigned char offset, int x, int y, int z) const; + inline unsigned char Index4D_32(unsigned char offset, int x, int y, int z, int w) const; + inline unsigned char Index2D_256(unsigned char offset, int x, int y) const; + inline unsigned char Index3D_256(unsigned char offset, int x, int y, int z) const; + inline unsigned char Index4D_256(unsigned char offset, int x, int y, int z, int w) const; + + inline FN_DECIMAL ValCoord2DFast(unsigned char offset, int x, int y) const; + inline FN_DECIMAL ValCoord3DFast(unsigned char offset, int x, int y, int z) const; + inline FN_DECIMAL GradCoord2D(unsigned char offset, int x, int y, FN_DECIMAL xd, FN_DECIMAL yd) const; + inline FN_DECIMAL GradCoord3D(unsigned char offset, int x, int y, int z, FN_DECIMAL xd, FN_DECIMAL yd, FN_DECIMAL zd) const; + inline FN_DECIMAL GradCoord4D(unsigned char offset, int x, int y, int z, int w, FN_DECIMAL xd, FN_DECIMAL yd, FN_DECIMAL zd, FN_DECIMAL wd) const; }; -FASTNOISE_NAMESPACE_END +} // namespace fastnoise -#endif \ No newline at end of file +#endif diff --git a/lib/LICENSE b/lib/LICENSE index 8786a12..5ee8678 100644 --- a/lib/LICENSE +++ b/lib/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016 Jordan Peck +Copyright (c) 2017 Jordan Peck Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/noise.cpp b/noise.cpp index 4ca7ec2..10f366e 100644 --- a/noise.cpp +++ b/noise.cpp @@ -45,21 +45,62 @@ void FastNoise::set_cellular_noise_lookup(Ref other_noise) { _noise.SetCellularNoiseLookup(&_cellular_lookup_ref->_noise); } +void FastNoise::set_cellular_distance_2_indices(int index0, int index1) { + _noise.SetCellularDistance2Indices(index0, index1); +} + +PoolIntArray FastNoise::get_cellular_distance_2_indices() const { + int i0, i1; + _noise.GetCellularDistance2Indices(i0, i1); + PoolIntArray a; + a.append(i0); + a.append(i1); + return a; +} + void FastNoise::_bind_methods() { ClassDB::bind_method(D_METHOD("set_seed", "seed"), &FastNoise::set_seed); ClassDB::bind_method(D_METHOD("get_seed"), &FastNoise::get_seed); ClassDB::bind_method(D_METHOD("set_noise_type", "type"), &FastNoise::set_noise_type); + ClassDB::bind_method(D_METHOD("get_noise_type"), &FastNoise::get_noise_type); + ClassDB::bind_method(D_METHOD("set_interpolation", "interp"), &FastNoise::set_interpolation); + ClassDB::bind_method(D_METHOD("get_interpolation"), &FastNoise::get_interpolation); + ClassDB::bind_method(D_METHOD("set_frequency", "freq"), &FastNoise::set_frequency); + ClassDB::bind_method(D_METHOD("get_frequency"), &FastNoise::get_frequency); + ClassDB::bind_method(D_METHOD("set_fractal_gain", "gain"), &FastNoise::set_fractal_gain); + ClassDB::bind_method(D_METHOD("get_fractal_gain"), &FastNoise::get_fractal_gain); + ClassDB::bind_method(D_METHOD("set_fractal_type", "type"), &FastNoise::set_fractal_type); + ClassDB::bind_method(D_METHOD("get_fractal_type", "type"), &FastNoise::get_fractal_type); + ClassDB::bind_method(D_METHOD("set_fractal_octaves", "octave_count"), &FastNoise::set_fractal_octaves); + ClassDB::bind_method(D_METHOD("get_fractal_octaves"), &FastNoise::get_fractal_octaves); + ClassDB::bind_method(D_METHOD("set_fractal_lacunarity", "lacunarity"), &FastNoise::set_fractal_lacunarity); + ClassDB::bind_method(D_METHOD("get_fractal_lacunarity"), &FastNoise::get_fractal_lacunarity); + ClassDB::bind_method(D_METHOD("set_cellular_distance_function", "func"), &FastNoise::set_cellular_distance_function); + ClassDB::bind_method(D_METHOD("get_cellular_distance_function"), &FastNoise::get_cellular_distance_function); + ClassDB::bind_method(D_METHOD("set_cellular_return_type", "ret"), &FastNoise::set_cellular_return_type); + ClassDB::bind_method(D_METHOD("get_cellular_return_type"), &FastNoise::get_cellular_return_type); + ClassDB::bind_method(D_METHOD("set_cellular_noise_lookup", "other_noise"), &FastNoise::set_cellular_noise_lookup); + ClassDB::bind_method(D_METHOD("get_cellular_noise_lookup"), &FastNoise::get_cellular_noise_lookup); + + ClassDB::bind_method(D_METHOD("set_cellular_distance_2_indices", "i0", "i1"), &FastNoise::set_cellular_distance_2_indices); + ClassDB::bind_method(D_METHOD("get_cellular_distance_2_indices"), &FastNoise::get_cellular_distance_2_indices); + + ClassDB::bind_method(D_METHOD("set_cellular_jitter", "jitter"), &FastNoise::set_cellular_jitter); + ClassDB::bind_method(D_METHOD("get_cellular_jitter"), &FastNoise::get_cellular_jitter); + + ClassDB::bind_method(D_METHOD("set_gradient_perturbation_amplitude", "amp"), &FastNoise::get_gradient_perturbation_amplitude); + ClassDB::bind_method(D_METHOD("get_gradient_perturbation_amplitude"), &FastNoise::get_gradient_perturbation_amplitude); ClassDB::bind_method(D_METHOD("get_noise_2d", "x", "y"), &FastNoise::get_noise_2d); ClassDB::bind_method(D_METHOD("get_noise_2dv", "pos"), &FastNoise::get_noise_2dv); @@ -69,38 +110,37 @@ void FastNoise::_bind_methods() { ClassDB::bind_method(D_METHOD("get_white_noise_4d", "x", "y", "z", "w"), &FastNoise::get_white_noise_4d); // TODO Bind intermediary functions? - BIND_CONSTANT( TYPE_VALUE ); - BIND_CONSTANT( TYPE_VALUE_FRACTAL ); - BIND_CONSTANT( TYPE_GRADIENT ); - BIND_CONSTANT( TYPE_GRADIENT_FRACTAL ); - BIND_CONSTANT( TYPE_SIMPLEX ); - BIND_CONSTANT( TYPE_SIMPLEX_FRACTAL ); - BIND_CONSTANT( TYPE_CELLULAR ); - BIND_CONSTANT( TYPE_CELLULAR_HQ ); - BIND_CONSTANT( TYPE_WHITE_NOISE ); + BIND_ENUM_CONSTANT( TYPE_VALUE ); + BIND_ENUM_CONSTANT( TYPE_VALUE_FRACTAL ); + BIND_ENUM_CONSTANT( TYPE_PERLIN ); + BIND_ENUM_CONSTANT( TYPE_PERLIN_FRACTAL ); + BIND_ENUM_CONSTANT( TYPE_SIMPLEX ); + BIND_ENUM_CONSTANT( TYPE_SIMPLEX_FRACTAL ); + BIND_ENUM_CONSTANT( TYPE_CELLULAR ); + BIND_ENUM_CONSTANT( TYPE_WHITE_NOISE ); + BIND_ENUM_CONSTANT( TYPE_CUBIC ); + BIND_ENUM_CONSTANT( TYPE_CUBIC_FRACTAL ); - BIND_CONSTANT( INTERP_LINEAR ); - BIND_CONSTANT( INTERP_QUINTIC ); - BIND_CONSTANT( INTERP_HERMITE ); + BIND_ENUM_CONSTANT( INTERP_LINEAR ); + BIND_ENUM_CONSTANT( INTERP_QUINTIC ); + BIND_ENUM_CONSTANT( INTERP_HERMITE ); - BIND_CONSTANT( FRACTAL_FBM ); - BIND_CONSTANT( FRACTAL_BILLOW ); - BIND_CONSTANT( FRACTAL_RIGID_MULTI ); + BIND_ENUM_CONSTANT( FRACTAL_FBM ); + BIND_ENUM_CONSTANT( FRACTAL_BILLOW ); + BIND_ENUM_CONSTANT( FRACTAL_RIGID_MULTI ); - BIND_CONSTANT( DISTANCE_EUCLIDEAN ); - BIND_CONSTANT( DISTANCE_MANHATTAN ); - BIND_CONSTANT( DISTANCE_NATURAL ); + BIND_ENUM_CONSTANT( DISTANCE_EUCLIDEAN ); + BIND_ENUM_CONSTANT( DISTANCE_MANHATTAN ); + BIND_ENUM_CONSTANT( DISTANCE_NATURAL ); - BIND_CONSTANT( RETURN_CELL_VALUE ); - BIND_CONSTANT( RETURN_NOISE_LOOKUP ); - BIND_CONSTANT( RETURN_DISTANCE_2_CENTER ); - BIND_CONSTANT( RETURN_DISTANCE_2_CENTER_X_VALUE ); - BIND_CONSTANT( RETURN_DISTANCE_2_CENTER_SQ ); - BIND_CONSTANT( RETURN_DISTANCE_2_CENTER_SQ_X_VALUE ); - BIND_CONSTANT( RETURN_DISTANCE_2_EDGE ); - BIND_CONSTANT( RETURN_DISTANCE_2_EDGE_X_VALUE ); - BIND_CONSTANT( RETURN_DISTANCE_2_EDGE_SQ ); - BIND_CONSTANT( RETURN_DISTANCE_2_EDGE_SQ_X_VALUE ); + BIND_ENUM_CONSTANT( RETURN_CELL_VALUE ); + BIND_ENUM_CONSTANT( RETURN_NOISE_LOOKUP ); + BIND_ENUM_CONSTANT( RETURN_DISTANCE ); + BIND_ENUM_CONSTANT( RETURN_DISTANCE_2 ); + BIND_ENUM_CONSTANT( RETURN_DISTANCE_2_ADD ); + BIND_ENUM_CONSTANT( RETURN_DISTANCE_2_SUB ); + BIND_ENUM_CONSTANT( RETURN_DISTANCE_2_MUL ); + BIND_ENUM_CONSTANT( RETURN_DISTANCE_2_DIV ); } diff --git a/noise.h b/noise.h index cade4e4..bda5368 100644 --- a/noise.h +++ b/noise.h @@ -7,28 +7,29 @@ typedef fastnoise::FastNoise _FastNoise; class FastNoise : public Reference { - GDCLASS(FastNoise, Reference); + GDCLASS(FastNoise, Reference) public: // Enums Godot-style (same values) enum Type { - TYPE_VALUE = _FastNoise::Value, - TYPE_VALUE_FRACTAL = _FastNoise::ValueFractal, - TYPE_GRADIENT = _FastNoise::Gradient, - TYPE_GRADIENT_FRACTAL = _FastNoise::GradientFractal, - TYPE_SIMPLEX = _FastNoise::Simplex, - TYPE_SIMPLEX_FRACTAL = _FastNoise::SimplexFractal, - TYPE_CELLULAR = _FastNoise::Cellular, - TYPE_CELLULAR_HQ = _FastNoise::CellularHQ, - TYPE_WHITE_NOISE = _FastNoise::WhiteNoise + TYPE_VALUE = _FastNoise::Value, + TYPE_VALUE_FRACTAL = _FastNoise::ValueFractal, + TYPE_PERLIN = _FastNoise::Perlin, + TYPE_PERLIN_FRACTAL = _FastNoise::PerlinFractal, + TYPE_SIMPLEX = _FastNoise::Simplex, + TYPE_SIMPLEX_FRACTAL = _FastNoise::SimplexFractal, + TYPE_CELLULAR = _FastNoise::Cellular, + TYPE_WHITE_NOISE = _FastNoise::WhiteNoise, + TYPE_CUBIC = _FastNoise::Cubic, + TYPE_CUBIC_FRACTAL = _FastNoise::CubicFractal }; enum Interpolation { - INTERP_LINEAR = _FastNoise::InterpLinear, - INTERP_QUINTIC = _FastNoise::InterpQuintic, - INTERP_HERMITE = _FastNoise::InterpHermite + INTERP_LINEAR = _FastNoise::Linear, + INTERP_QUINTIC = _FastNoise::Quintic, + INTERP_HERMITE = _FastNoise::Hermite }; enum FractalType { @@ -46,35 +47,59 @@ public: enum CellularReturnType { RETURN_CELL_VALUE = _FastNoise::CellValue, RETURN_NOISE_LOOKUP = _FastNoise::NoiseLookup, - RETURN_DISTANCE_2_CENTER = _FastNoise::Distance2Center, - RETURN_DISTANCE_2_CENTER_X_VALUE = _FastNoise::Distance2CenterXValue, - RETURN_DISTANCE_2_CENTER_SQ = _FastNoise::Distance2CenterSq, - RETURN_DISTANCE_2_CENTER_SQ_X_VALUE = _FastNoise::Distance2CenterSqXValue, - RETURN_DISTANCE_2_EDGE = _FastNoise::Distance2Edge, - RETURN_DISTANCE_2_EDGE_X_VALUE = _FastNoise::Distance2EdgeXValue, - RETURN_DISTANCE_2_EDGE_SQ = _FastNoise::Distance2EdgeSq, - RETURN_DISTANCE_2_EDGE_SQ_X_VALUE = _FastNoise::Distance2EdgeSqXValue + RETURN_DISTANCE = _FastNoise::Distance, + RETURN_DISTANCE_2 = _FastNoise::Distance2, + RETURN_DISTANCE_2_ADD = _FastNoise::Distance2Add, + RETURN_DISTANCE_2_SUB = _FastNoise::Distance2Sub, + RETURN_DISTANCE_2_MUL = _FastNoise::Distance2Mul, + RETURN_DISTANCE_2_DIV = _FastNoise::Distance2Div }; FastNoise(); // Methods (Godot-style mappings to FastNoise) - int get_seed() { return _noise.GetSeed(); } // TODO should be const + int get_seed() const { return _noise.GetSeed(); } void set_seed(int seed) { _noise.SetSeed(seed); } void set_noise_type(Type noise_type) { _noise.SetNoiseType((_FastNoise::NoiseType)noise_type); } - void set_interpolation(Interpolation interp) { _noise.SetInterp((_FastNoise::Interp)interp); } - void set_frequency(float freq) { _noise.SetFrequency(freq); } - void set_fractal_gain(float gain) { _noise.SetFractalGain(gain); } - void set_fractal_type(FractalType type) { _noise.SetFractalType((_FastNoise::FractalType)type); } - void set_fractal_octaves(unsigned int octave_count) { _noise.SetFractalOctaves(octave_count); } - void set_fractal_lacunarity(float lacunarity) { _noise.SetFractalLacunarity(lacunarity); } - void set_cellular_distance_function(CellularDistanceFunction func) { _noise.SetCellularDistanceFunction((_FastNoise::CellularDistanceFunction)func); } - void set_cellular_return_type(CellularReturnType ret) { _noise.SetCellularReturnType((_FastNoise::CellularReturnType)ret); } + Type get_noise_type() const { return (Type)_noise.GetNoiseType(); } + + void set_interpolation(Interpolation interp) { _noise.SetInterp((_FastNoise::Interp)interp); } + Interpolation get_interpolation() const { return (Interpolation)_noise.GetInterp(); } + + void set_frequency(real_t freq) { _noise.SetFrequency(freq); } + real_t get_frequency() const { return _noise.GetFrequency(); } + + void set_fractal_octaves(unsigned int octave_count) { _noise.SetFractalOctaves(octave_count); } + int get_fractal_octaves() const { return _noise.GetFractalOctaves(); } + + void set_fractal_lacunarity(real_t lacunarity) { _noise.SetFractalLacunarity(lacunarity); } + real_t get_fractal_lacunarity() const { return _noise.GetFractalLacunarity(); } + + void set_fractal_gain(real_t gain) { _noise.SetFractalGain(gain); } + real_t get_fractal_gain() const { return _noise.GetFractalGain(); } + + void set_fractal_type(FractalType type) { _noise.SetFractalType((_FastNoise::FractalType)type); } + FractalType get_fractal_type() const { return (FractalType)_noise.GetFractalType(); } + + void set_cellular_distance_function(CellularDistanceFunction func) { _noise.SetCellularDistanceFunction((_FastNoise::CellularDistanceFunction)func); } + CellularDistanceFunction get_cellular_distance_function() const { return (CellularDistanceFunction)_noise.GetCellularDistanceFunction(); } + + void set_cellular_return_type(CellularReturnType ret) { _noise.SetCellularReturnType((_FastNoise::CellularReturnType)ret); } + CellularReturnType get_cellular_return_type() const { return (CellularReturnType)_noise.GetCellularReturnType(); } - // TODO Q: how can I do that properly? void set_cellular_noise_lookup(Ref other_noise); + Ref get_cellular_noise_lookup() const { return _cellular_lookup_ref; } + + void set_cellular_distance_2_indices(int index0, int index1); + PoolIntArray get_cellular_distance_2_indices() const; + + void set_cellular_jitter(real_t jitter) { _noise.SetCellularJitter(jitter); } + real_t get_cellular_jitter() const { return _noise.GetCellularJitter(); } + + void set_gradient_perturbation_amplitude(real_t amp) { _noise.SetGradientPerturbAmp(amp); } + real_t get_gradient_perturbation_amplitude() const { return _noise.GetGradientPerturbAmp(); } // 2D @@ -119,11 +144,11 @@ private: }; // Make Variant happy with custom enums -VARIANT_ENUM_CAST(FastNoise::Type); -VARIANT_ENUM_CAST(FastNoise::FractalType); -VARIANT_ENUM_CAST(FastNoise::Interpolation); -VARIANT_ENUM_CAST(FastNoise::CellularDistanceFunction); -VARIANT_ENUM_CAST(FastNoise::CellularReturnType); +VARIANT_ENUM_CAST(FastNoise::Type) +VARIANT_ENUM_CAST(FastNoise::FractalType) +VARIANT_ENUM_CAST(FastNoise::Interpolation) +VARIANT_ENUM_CAST(FastNoise::CellularDistanceFunction) +VARIANT_ENUM_CAST(FastNoise::CellularReturnType) #endif // FASTNOISE_NOISE_H