fast-morton
Version:
Fast morton encoding and decoding for 2D and 3D coordinates
3 lines (2 loc) • 14.8 kB
JavaScript
var r=new Error("All input coords must be in Uint10 range (0 - 1023)"),n=new Error("All input coords must be in Uint15 range (0 - 32,767)"),o=new Error("Morton code must be in Uint32 range (0 - 65,535)");function t(){return[].slice.call(arguments).every(function(r){return r>=0&&r<=1023})}function e(){return[].slice.call(arguments).every(function(r){return r>=0&&r<=32767})}var u=[4294967295,65535,16711935,252645135,858993459,1431655765];function i(r){var n=r&u[0];return((n=((n=((n=((n=(n|n<<16)&u[1])|n<<8)&u[2])|n<<4)&u[3])|n<<2)&u[4])|n<<1)&u[5]}var c=[4294967295,65535,16711935,252645135,858993459,1431655765];function a(r){var n=r&c[5];return((n=((n=((n=(n^n>>1)&c[4])^n>>2)&c[3])^n>>4)&c[2])^n>>8)&c[1]}var f=[0,1,4,5,16,17,20,21,64,65,68,69,80,81,84,85,256,257,260,261,272,273,276,277,320,321,324,325,336,337,340,341,1024,1025,1028,1029,1040,1041,1044,1045,1088,1089,1092,1093,1104,1105,1108,1109,1280,1281,1284,1285,1296,1297,1300,1301,1344,1345,1348,1349,1360,1361,1364,1365,4096,4097,4100,4101,4112,4113,4116,4117,4160,4161,4164,4165,4176,4177,4180,4181,4352,4353,4356,4357,4368,4369,4372,4373,4416,4417,4420,4421,4432,4433,4436,4437,5120,5121,5124,5125,5136,5137,5140,5141,5184,5185,5188,5189,5200,5201,5204,5205,5376,5377,5380,5381,5392,5393,5396,5397,5440,5441,5444,5445,5456,5457,5460,5461,16384,16385,16388,16389,16400,16401,16404,16405,16448,16449,16452,16453,16464,16465,16468,16469,16640,16641,16644,16645,16656,16657,16660,16661,16704,16705,16708,16709,16720,16721,16724,16725,17408,17409,17412,17413,17424,17425,17428,17429,17472,17473,17476,17477,17488,17489,17492,17493,17664,17665,17668,17669,17680,17681,17684,17685,17728,17729,17732,17733,17744,17745,17748,17749,20480,20481,20484,20485,20496,20497,20500,20501,20544,20545,20548,20549,20560,20561,20564,20565,20736,20737,20740,20741,20752,20753,20756,20757,20800,20801,20804,20805,20816,20817,20820,20821,21504,21505,21508,21509,21520,21521,21524,21525,21568,21569,21572,21573,21584,21585,21588,21589,21760,21761,21764,21765,21776,21777,21780,21781,21824,21825,21828,21829,21840,21841,21844,21845],v=[0,2,8,10,32,34,40,42,128,130,136,138,160,162,168,170,512,514,520,522,544,546,552,554,640,642,648,650,672,674,680,682,2048,2050,2056,2058,2080,2082,2088,2090,2176,2178,2184,2186,2208,2210,2216,2218,2560,2562,2568,2570,2592,2594,2600,2602,2688,2690,2696,2698,2720,2722,2728,2730,8192,8194,8200,8202,8224,8226,8232,8234,8320,8322,8328,8330,8352,8354,8360,8362,8704,8706,8712,8714,8736,8738,8744,8746,8832,8834,8840,8842,8864,8866,8872,8874,10240,10242,10248,10250,10272,10274,10280,10282,10368,10370,10376,10378,10400,10402,10408,10410,10752,10754,10760,10762,10784,10786,10792,10794,10880,10882,10888,10890,10912,10914,10920,10922,32768,32770,32776,32778,32800,32802,32808,32810,32896,32898,32904,32906,32928,32930,32936,32938,33280,33282,33288,33290,33312,33314,33320,33322,33408,33410,33416,33418,33440,33442,33448,33450,34816,34818,34824,34826,34848,34850,34856,34858,34944,34946,34952,34954,34976,34978,34984,34986,35328,35330,35336,35338,35360,35362,35368,35370,35456,35458,35464,35466,35488,35490,35496,35498,40960,40962,40968,40970,40992,40994,41e3,41002,41088,41090,41096,41098,41120,41122,41128,41130,41472,41474,41480,41482,41504,41506,41512,41514,41600,41602,41608,41610,41632,41634,41640,41642,43008,43010,43016,43018,43040,43042,43048,43050,43136,43138,43144,43146,43168,43170,43176,43178,43520,43522,43528,43530,43552,43554,43560,43562,43648,43650,43656,43658,43680,43682,43688,43690],l=[0,1,0,1,2,3,2,3,0,1,0,1,2,3,2,3,4,5,4,5,6,7,6,7,4,5,4,5,6,7,6,7,0,1,0,1,2,3,2,3,0,1,0,1,2,3,2,3,4,5,4,5,6,7,6,7,4,5,4,5,6,7,6,7,8,9,8,9,10,11,10,11,8,9,8,9,10,11,10,11,12,13,12,13,14,15,14,15,12,13,12,13,14,15,14,15,8,9,8,9,10,11,10,11,8,9,8,9,10,11,10,11,12,13,12,13,14,15,14,15,12,13,12,13,14,15,14,15,0,1,0,1,2,3,2,3,0,1,0,1,2,3,2,3,4,5,4,5,6,7,6,7,4,5,4,5,6,7,6,7,0,1,0,1,2,3,2,3,0,1,0,1,2,3,2,3,4,5,4,5,6,7,6,7,4,5,4,5,6,7,6,7,8,9,8,9,10,11,10,11,8,9,8,9,10,11,10,11,12,13,12,13,14,15,14,15,12,13,12,13,14,15,14,15,8,9,8,9,10,11,10,11,8,9,8,9,10,11,10,11,12,13,12,13,14,15,14,15,12,13,12,13,14,15,14,15],s=[0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,8,8,9,9,8,8,9,9,10,10,11,11,10,10,11,11,8,8,9,9,8,8,9,9,10,10,11,11,10,10,11,11,12,12,13,13,12,12,13,13,14,14,15,15,14,14,15,15,12,12,13,13,12,12,13,13,14,14,15,15,14,14,15,15,8,8,9,9,8,8,9,9,10,10,11,11,10,10,11,11,8,8,9,9,8,8,9,9,10,10,11,11,10,10,11,11,12,12,13,13,12,12,13,13,14,14,15,15,14,14,15,15,12,12,13,13,12,12,13,13,14,14,15,15,14,14,15,15];function w(r,n){for(var o=0,t=0;t<4;++t)o|=n[r>>8*t&255]<<4*t;return o}var D=[1023,0,50331903,50393103,51130563,153391689];function d(r){var n=r&D[0];return((n=((n=((n=(n|n<<16)&D[2])|n<<8)&D[3])|n<<4)&D[4])|n<<2)&D[5]}var m=[0,1023,50331903,50393103,51130563,153391689];function p(r){var n=r&m[5];return((n=((n=((n=(n^n>>2)&m[4])^n>>4)&m[3])^n>>8)&m[2])^n>>16)&m[1]}var x=[0,1,8,9,64,65,72,73,512,513,520,521,576,577,584,585,4096,4097,4104,4105,4160,4161,4168,4169,4608,4609,4616,4617,4672,4673,4680,4681,32768,32769,32776,32777,32832,32833,32840,32841,33280,33281,33288,33289,33344,33345,33352,33353,36864,36865,36872,36873,36928,36929,36936,36937,37376,37377,37384,37385,37440,37441,37448,37449,262144,262145,262152,262153,262208,262209,262216,262217,262656,262657,262664,262665,262720,262721,262728,262729,266240,266241,266248,266249,266304,266305,266312,266313,266752,266753,266760,266761,266816,266817,266824,266825,294912,294913,294920,294921,294976,294977,294984,294985,295424,295425,295432,295433,295488,295489,295496,295497,299008,299009,299016,299017,299072,299073,299080,299081,299520,299521,299528,299529,299584,299585,299592,299593,2097152,2097153,2097160,2097161,2097216,2097217,2097224,2097225,2097664,2097665,2097672,2097673,2097728,2097729,2097736,2097737,2101248,2101249,2101256,2101257,2101312,2101313,2101320,2101321,2101760,2101761,2101768,2101769,2101824,2101825,2101832,2101833,2129920,2129921,2129928,2129929,2129984,2129985,2129992,2129993,2130432,2130433,2130440,2130441,2130496,2130497,2130504,2130505,2134016,2134017,2134024,2134025,2134080,2134081,2134088,2134089,2134528,2134529,2134536,2134537,2134592,2134593,2134600,2134601,2359296,2359297,2359304,2359305,2359360,2359361,2359368,2359369,2359808,2359809,2359816,2359817,2359872,2359873,2359880,2359881,2363392,2363393,2363400,2363401,2363456,2363457,2363464,2363465,2363904,2363905,2363912,2363913,2363968,2363969,2363976,2363977,2392064,2392065,2392072,2392073,2392128,2392129,2392136,2392137,2392576,2392577,2392584,2392585,2392640,2392641,2392648,2392649,2396160,2396161,2396168,2396169,2396224,2396225,2396232,2396233,2396672,2396673,2396680,2396681,2396736,2396737,2396744,2396745],h=[0,2,16,18,128,130,144,146,1024,1026,1040,1042,1152,1154,1168,1170,8192,8194,8208,8210,8320,8322,8336,8338,9216,9218,9232,9234,9344,9346,9360,9362,65536,65538,65552,65554,65664,65666,65680,65682,66560,66562,66576,66578,66688,66690,66704,66706,73728,73730,73744,73746,73856,73858,73872,73874,74752,74754,74768,74770,74880,74882,74896,74898,524288,524290,524304,524306,524416,524418,524432,524434,525312,525314,525328,525330,525440,525442,525456,525458,532480,532482,532496,532498,532608,532610,532624,532626,533504,533506,533520,533522,533632,533634,533648,533650,589824,589826,589840,589842,589952,589954,589968,589970,590848,590850,590864,590866,590976,590978,590992,590994,598016,598018,598032,598034,598144,598146,598160,598162,599040,599042,599056,599058,599168,599170,599184,599186,4194304,4194306,4194320,4194322,4194432,4194434,4194448,4194450,4195328,4195330,4195344,4195346,4195456,4195458,4195472,4195474,4202496,4202498,4202512,4202514,4202624,4202626,4202640,4202642,4203520,4203522,4203536,4203538,4203648,4203650,4203664,4203666,4259840,4259842,4259856,4259858,4259968,4259970,4259984,4259986,4260864,4260866,4260880,4260882,4260992,4260994,4261008,4261010,4268032,4268034,4268048,4268050,4268160,4268162,4268176,4268178,4269056,4269058,4269072,4269074,4269184,4269186,4269200,4269202,4718592,4718594,4718608,4718610,4718720,4718722,4718736,4718738,4719616,4719618,4719632,4719634,4719744,4719746,4719760,4719762,4726784,4726786,4726800,4726802,4726912,4726914,4726928,4726930,4727808,4727810,4727824,4727826,4727936,4727938,4727952,4727954,4784128,4784130,4784144,4784146,4784256,4784258,4784272,4784274,4785152,4785154,4785168,4785170,4785280,4785282,4785296,4785298,4792320,4792322,4792336,4792338,4792448,4792450,4792464,4792466,4793344,4793346,4793360,4793362,4793472,4793474,4793488,4793490],E=[0,4,32,36,256,260,288,292,2048,2052,2080,2084,2304,2308,2336,2340,16384,16388,16416,16420,16640,16644,16672,16676,18432,18436,18464,18468,18688,18692,18720,18724,131072,131076,131104,131108,131328,131332,131360,131364,133120,133124,133152,133156,133376,133380,133408,133412,147456,147460,147488,147492,147712,147716,147744,147748,149504,149508,149536,149540,149760,149764,149792,149796,1048576,1048580,1048608,1048612,1048832,1048836,1048864,1048868,1050624,1050628,1050656,1050660,1050880,1050884,1050912,1050916,1064960,1064964,1064992,1064996,1065216,1065220,1065248,1065252,1067008,1067012,1067040,1067044,1067264,1067268,1067296,1067300,1179648,1179652,1179680,1179684,1179904,1179908,1179936,1179940,1181696,1181700,1181728,1181732,1181952,1181956,1181984,1181988,1196032,1196036,1196064,1196068,1196288,1196292,1196320,1196324,1198080,1198084,1198112,1198116,1198336,1198340,1198368,1198372,8388608,8388612,8388640,8388644,8388864,8388868,8388896,8388900,8390656,8390660,8390688,8390692,8390912,8390916,8390944,8390948,8404992,8404996,8405024,8405028,8405248,8405252,8405280,8405284,8407040,8407044,8407072,8407076,8407296,8407300,8407328,8407332,8519680,8519684,8519712,8519716,8519936,8519940,8519968,8519972,8521728,8521732,8521760,8521764,8521984,8521988,8522016,8522020,8536064,8536068,8536096,8536100,8536320,8536324,8536352,8536356,8538112,8538116,8538144,8538148,8538368,8538372,8538400,8538404,9437184,9437188,9437216,9437220,9437440,9437444,9437472,9437476,9439232,9439236,9439264,9439268,9439488,9439492,9439520,9439524,9453568,9453572,9453600,9453604,9453824,9453828,9453856,9453860,9455616,9455620,9455648,9455652,9455872,9455876,9455904,9455908,9568256,9568260,9568288,9568292,9568512,9568516,9568544,9568548,9570304,9570308,9570336,9570340,9570560,9570564,9570592,9570596,9584640,9584644,9584672,9584676,9584896,9584900,9584928,9584932,9586688,9586692,9586720,9586724,9586944,9586948,9586976,9586980],U=[0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7,4,5,4,5,4,5,4,5,6,7,6,7,6,7,6,7],y=[0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7,4,4,5,5,4,4,5,5,4,4,5,5,4,4,5,5,6,6,7,7,6,6,7,7,6,6,7,7,6,6,7,7],A=[0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7,6,6,6,6,7,7,7,7];function M(r,n){for(var o=0,t=0;t<4;++t)o|=n[r>>9*t&511]<<3*t;return o}exports.morton2DDecodeLUT=function(r,n){if(r<0||r>4294967295)throw o;var t=null!=n?n:new Array(2);return t[0]=w(r,l),t[1]=w(r,s),t},exports.morton2DDecodeMB=function(r,n){if(r<0||r>4294967295)throw o;var t=null!=n?n:new Array(2);return t[0]=a(r),t[1]=a(r>>1),t},exports.morton2DEncodeLUT=function(r,o){if(!e(r,o))throw n;for(var t=0,u=16;u>0;--u){var i=8*(u-1);t=t<<16|v[o>>i&255]|f[r>>i&255]}return t},exports.morton2DEncodeMB=function(r,o){if(!e(r,o))throw n;return i(r)|i(o)<<1},exports.morton3DDecodeLUT=function(r,n){if(r<0||r>4294967295)throw o;var t=null!=n?n:new Array(3);return t[0]=M(r,U),t[1]=M(r,y),t[2]=M(r,A),t},exports.morton3DDecodeMB=function(r,n){if(r<0||r>4294967295)throw o;var t=null!=n?n:new Array(3);return t[0]=p(r),t[1]=p(r>>1),t[2]=p(r>>2),t},exports.morton3DEncodeLUT=function(n,o,e){if(!t(n,o,e))throw r;for(var u=0,i=10;i>0;--i){var c=8*(i-1);u=u<<24|E[e>>c&255]|h[o>>c&255]|x[n>>c&255]}return u},exports.morton3DEncodeMB=function(n,o,e){if(!t(n,o,e))throw r;return d(n)|d(o)<<1|d(e)<<2},exports.version="1.0.1";
//# sourceMappingURL=index.js.map