diff --git a/Material.meta b/Material.meta new file mode 100644 index 0000000..a96bd51 --- /dev/null +++ b/Material.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2b82684f307a024d9f7f212473cf36d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Material/QuadMaterial.mat b/Material/QuadMaterial.mat new file mode 100644 index 0000000..3f8a43f --- /dev/null +++ b/Material/QuadMaterial.mat @@ -0,0 +1,79 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: QuadMaterial + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Material/QuadMaterial.mat.meta b/Material/QuadMaterial.mat.meta new file mode 100644 index 0000000..7c2c7f6 --- /dev/null +++ b/Material/QuadMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e4c24c9ee883e1b49a29ee7205d855b9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/PhospheneConfigurations/cfg3.json b/PhospheneConfigurations/cfg3.json index ba79d61..67fbc00 100644 --- a/PhospheneConfigurations/cfg3.json +++ b/PhospheneConfigurations/cfg3.json @@ -1 +1,6 @@ -{"description": "PHOSPHENE SPECIFICATIONS FILE. 'nPhosphenes': the number of phosphenes. 'eccentricities': the radius (in degrees of visual angle) from the foveal center for each phosphene. 'azimuth_angles': the polar angle (in radians) for each phosphene. 'size': each phosphene's default size (in dva). ", "nPhosphenes": 1000, "eccentricities": [21.413866833564345, 29.19684366623315, 20.99444874098965, 12.38444515717461, 16.968641522117935, 10.009168780080044, 28.18298771337443, 0.8000043085413211, 3.683475249502892, 15.62025115785308, 28.713417829520267, 23.19179495264062, 0.9498388356772466, 13.440896256112039, 7.4745385996022, 13.496414790483973, 15.785440811392014, 28.782774373351526, 24.107467608511193, 15.497943715528605, 29.035425569248467, 3.5589317893581756, 12.102145337775225, 21.74067911850779, 15.739580603734268, 21.615842404125164, 2.2645693568755267, 14.346340262399423, 28.068427533660966, 3.2466323888080204, 11.2533061587932, 28.76003423385222, 16.679166547393244, 10.954997869699454, 24.169095644633348, 10.490270808674909, 0.15849957754660302, 9.423167148095116, 14.156271157186447, 27.580815666788496, 28.418735236290875, 12.578295233702557, 24.50762723243799, 23.938676583309505, 6.600763205153188, 3.937287695200546, 28.263977498517516, 5.761991131358906, 6.047330556826855, 24.2831103959194, 9.793892236837014, 4.6484736104555076, 23.317292630485543, 16.857657405613676, 25.78755328422788, 2.504803988230463, 28.035628337893954, 25.574484710848033, 6.804290385323109, 26.694559122744856, 8.688790754796285, 7.929434984351563, 3.5895500170589703, 21.012891467493343, 2.0753377129342483, 14.015298266540483, 23.34420546762085, 4.635294384860764, 27.907373095790735, 17.72398776060048, 3.0553623199734643, 3.4658111118173482, 23.169704040658548, 12.603754339435412, 22.596486753917446, 1.7132846055422608, 12.088918304685139, 17.424204626118417, 26.5327574201959, 13.370405552246073, 12.577467651140669, 6.629218878882401, 2.3255811604897514, 29.735308279380117, 10.88555210193047, 27.06245429426848, 24.75852515654385, 16.1524178147508, 6.801308324824437, 12.75965301897861, 0.17814371362682316, 1.4753307245383946, 2.749315379917328, 18.650660603502907, 18.19232569861102, 12.855150139193348, 11.839695428245227, 29.270158830838604, 14.079566657815782, 0.5165171764989838, 8.246072252779593, 4.973452136861994, 14.706866498028365, 27.756461359076688, 28.777530896528, 24.936523848659167, 8.002910773013273, 26.044134295653976, 20.38652025874614, 7.984698852789446, 6.642505101589249, 4.424558703022465, 20.487995812577054, 4.549992902610191, 13.252995185784306, 10.327632688013118, 3.162143425417717, 15.887431885286937, 20.333075985948767, 5.739603321596374, 24.344565330906704, 2.9045430407126016, 12.123188759715362, 4.516342324481966, 3.3232589942709585, 18.086756654434986, 4.551033764774657, 3.9155173414130107, 18.50021571785587, 26.127149523145917, 6.24984339696604, 8.684999880934946, 14.183531234945782, 2.0032070692933175, 20.3561754413401, 2.338084493165057, 21.156574408456763, 14.026433645902493, 0.06903954027207557, 9.566895866607357, 8.745402989184873, 3.1015364019854963, 9.001901510442499, 4.956645436951511, 8.855393642856042, 14.011728596684689, 20.138085729831577, 2.2331392064559004, 19.766935891292096, 27.602973158765483, 11.607078457939018, 16.169646162312134, 27.48007033706135, 26.469980012569344, 0.27978173180757643, 13.477551307672433, 11.103693631196082, 18.224201213079873, 23.068938840500575, 27.684093003047956, 20.25950400219285, 3.0375635731067643, 10.694657707390226, 5.129868023095549, 13.666601401157127, 1.7436171703632775, 27.174869369083503, 20.77170822262428, 11.178954399923619, 8.996046497120206, 3.3729946929414387, 5.8406814369458075, 28.47010178479454, 8.894234072625894, 15.365052624547978, 21.135482871826778, 10.078899931926877, 14.477773432337615, 10.50916698706976, 11.097960816533918, 2.2758673858931813, 6.539849721404876, 20.613506435804215, 16.86162236189803, 26.27141503248802, 5.3946019598259864, 17.91380068816176, 28.819685854420737, 29.506611320132148, 22.202116391338507, 22.943118145354948, 2.508143827563503, 0.9467998674320548, 4.794819946241005, 25.436849381490237, 18.298308247265684, 2.4643108652811634, 12.14483707166449, 2.1662451691500353, 11.217209935520293, 9.601815071478786, 29.347080785107426, 13.526203928578225, 28.96338697852153, 5.872890791276272, 20.70801610306158, 20.576804291051612, 6.9315311022131, 11.142240393179199, 9.76180553792323, 7.5274005557517745, 22.882828742489043, 24.617242093531615, 24.353594621145337, 15.69818652296033, 4.930633609753838, 0.5712202155334114, 5.708478222878835, 10.138810540994003, 17.138653605161295, 25.777950865244648, 26.78630690246218, 8.579032379371792, 25.57974152435865, 26.49496229881251, 27.1980901805782, 5.946501536263987, 21.761212951769348, 12.301523109133061, 10.658380932781267, 12.755288423891352, 6.461939539541136, 15.145117398718611, 22.976824554411603, 1.8204965095310992, 24.271594115818477, 21.241589545946255, 24.27811097538001, 28.790928481842048, 25.359585364808925, 17.076136006506523, 10.870677687320846, 28.53080607670347, 9.234609313536835, 17.688405046634188, 9.568851698916747, 10.748763379098737, 18.892074611842197, 8.900608629500958, 20.411763902390376, 12.636075355909698, 25.0962074345695, 7.932729244386841, 21.877543807693616, 27.522905627867083, 11.902080231766048, 0.43867036565309375, 8.456557070837265, 26.28546487870801, 4.2852146347807665, 10.121349698612185, 20.93879924935977, 20.651931134369526, 28.038428220868617, 8.452000017686695, 12.378087779005837, 2.9169369876875293, 2.762386726510782, 16.95665107526878, 25.171127913335702, 11.07900630907738, 29.94732942096802, 28.802374587961516, 26.48159839167303, 24.926924593650153, 2.3328537333770956, 28.313121827503814, 15.35891959805832, 9.950017523825682, 13.161264238194574, 16.088991797615922, 11.901609929723165, 16.02147699596836, 2.3580178444698365, 20.13064847208553, 26.10772000062371, 14.295062899990334, 1.9934304680225041, 25.41131939813409, 16.978046995526096, 28.22690622584245, 17.818267110776738, 13.84745885448756, 3.933870806206353, 18.494798619185573, 13.557135225988583, 7.62820136012594, 24.72264646361272, 4.403769438488991, 4.705169713461725, 20.128120175670052, 25.98132529477517, 13.757296573264101, 4.166170823929837, 23.721358162338685, 2.588082047574491, 22.094146838966385, 14.37722750487686, 22.340280930591362, 8.3315544777199, 14.529904902264374, 29.1962264552921, 23.494184391067854, 14.46774570765773, 14.129293610735548, 17.64788648817623, 21.199705114445475, 9.394328380054343, 0.7362473922250994, 5.158151612727143, 4.847624312365371, 11.708927801758136, 29.793156882690084, 15.411982475738396, 1.3470753580403805, 24.753624436583564, 22.8339091132834, 18.947927801389422, 8.107108271985883, 20.55868394011457, 23.903092215616812, 27.736593046414594, 22.310299374559897, 12.214666067774806, 3.2856807318200167, 21.951933049808897, 1.4795977230031916, 18.449025029270075, 18.352007750812803, 25.667980302962466, 0.4600766558390037, 29.132187180718034, 4.694617573059167, 17.041972397793934, 17.405115982902938, 19.930673137766153, 23.677139810450335, 15.425167416893109, 11.800861330716003, 11.168983465023569, 9.624543488214602, 8.518867771899941, 17.868143508305494, 2.928950952760005, 11.843351376447032, 20.63217247474922, 14.16231987194146, 11.67990310348882, 14.706301772823029, 26.45373107523304, 20.042504290251493, 19.01047367756786, 6.423224039698986, 17.998997947649297, 1.0580188701769497, 23.163538512494775, 12.741279590431624, 24.94654147548616, 22.261921387378905, 16.445929706752928, 12.906388250937018, 4.770821931829292, 0.6099179920326289, 17.54630445793964, 3.105007575765415, 6.8116646635069085, 3.0543612747350277, 15.632841663578162, 5.619772425273503, 9.254873796551848, 20.687095581583417, 11.387622427219295, 18.216329330222216, 25.98036071167315, 23.548556218599813, 26.029252461928685, 24.696314106523275, 13.930001575885585, 13.09401693915551, 13.746073511599928, 5.322223537926424, 4.568387972019215, 24.78192230062111, 15.310126719442895, 29.871930004120568, 29.30751914535799, 17.20240419935972, 17.49698697953148, 11.0957518369587, 2.240465031748421, 8.518818614254432, 5.569832136076088, 25.72755902970208, 7.4587408832063025, 4.356337021699877, 16.146184384968493, 14.332678893209067, 11.785170801974157, 29.890872075832227, 29.007264580975367, 13.063353650947846, 20.6853612011264, 1.9133670296965986, 12.727513048670437, 11.4248017761056, 18.444941597708844, 14.149295662233923, 2.5365128354716715, 10.60858002794561, 12.612559177463911, 5.647713500179277, 17.553062448909365, 19.833451025529637, 8.098548470879711, 5.585733570031923, 16.23099653467571, 18.06589255420711, 10.483249485373658, 4.246595647074949, 29.51529406185157, 6.328152703963322, 21.843792374039108, 18.145381305789133, 14.454988509338683, 16.767433814791175, 13.649188804446888, 3.1817333191640174, 19.70510555297283, 10.312967951230501, 24.855259995571565, 15.133881716195281, 4.418102634371893, 2.25723187231203, 7.253559622092396, 21.94120021440953, 11.098726381122955, 19.598190305613866, 26.461110825901446, 22.92667591796142, 9.844675589131135, 2.063218310659635, 4.534190545286838, 23.162429894416917, 18.045500289841712, 18.83960214205596, 12.820097516117528, 20.11108043549615, 5.133462381684163, 28.2657528378206, 11.613785278043919, 26.25197350700392, 21.66496460544917, 16.780166691284002, 10.375981293659363, 10.064220541224563, 16.13435855050937, 25.980649435782556, 23.34083856481846, 12.487290137477574, 21.13901201718658, 9.974837062825634, 13.207683665350116, 18.812370858692933, 14.421759828693643, 25.27656705456661, 14.953048263164717, 29.957370735776085, 8.636986486284787, 18.625568943379253, 24.799792622323835, 6.494610130543384, 13.25733582739539, 23.27247207481958, 12.853731884106837, 7.994197261805211, 11.994888981780587, 20.32107328101524, 10.473832104716493, 26.89808156556743, 1.3825483484864012, 24.287710918313675, 1.3842564139165288, 16.97870631231339, 21.461916493323315, 27.12934838799083, 12.74310685043351, 17.660974358775725, 2.8532808721878977, 16.745564061815326, 2.1199917831436705, 22.333093197005606, 17.50966796910692, 11.486066985015324, 8.012821263984145, 28.2263545096385, 15.182823601530428, 26.74154439099173, 9.51970221824749, 28.07172017107921, 3.2446283327160272, 2.477312389380853, 5.257671435430934, 12.412366917676941, 11.673079990893033, 14.500231398851568, 12.095341847217242, 12.656336131593402, 9.034411713453057, 28.17245677697298, 18.84081479427925, 9.445352733301345, 9.211368958717085, 2.098879594817368, 8.857674873807923, 4.816598814984332, 16.054106297280942, 13.578612048009651, 22.954917295795358, 25.602275073313745, 21.230902791609875, 4.585711718732185, 22.734478702173558, 2.8224929500760383, 13.777893004186485, 26.134936986078724, 8.20868467886475, 29.523808317611948, 18.349906578440226, 19.89439064060241, 0.9228911526543506, 7.091690448663269, 1.823545453865488, 7.580463299095089, 9.556197551721493, 24.73091408106713, 26.185582104492642, 7.029113596576066, 27.012969759206758, 24.988361027681538, 10.137258274493417, 11.893498963724198, 24.149646577636904, 3.950982065461714, 13.063428138802863, 25.45682248551244, 27.498074741343697, 20.441226515061587, 17.265170028955758, 1.2094130768435032, 11.182597785587687, 19.76548974453395, 6.060198543244388, 3.7599499937304137, 21.792768463389233, 27.99737252627287, 11.718228742292471, 26.967260450770503, 29.142521234083002, 2.7603472608982913, 1.4118616717621166, 12.418986890458902, 21.207732923846415, 2.0522334725233184, 0.15798285698729758, 19.392545419975313, 24.670181197820806, 14.872651490465083, 15.059343431992428, 11.09482818464452, 25.488214994296094, 22.99697768453516, 16.069597678335228, 0.6272880183500449, 7.131100930232424, 26.353157226027363, 3.2541274491689234, 9.852481978462935, 22.463909756759342, 16.366025341211767, 10.688081442057303, 13.738122239375127, 23.003446972245047, 2.584951220465727, 6.534030929559439, 1.4511892233478711, 24.026935615815145, 8.304452061022063, 13.86425156459694, 18.16425494069459, 7.610527305481324, 1.6238548799091983, 19.604176500999024, 19.071977038775227, 21.22124144372253, 3.323525734792149, 11.245661513544862, 2.705549182441392, 17.356935543718087, 21.667777178720918, 16.819722865379138, 27.99756786662364, 0.23683690343888225, 3.8260345124953616, 15.532842321950994, 12.915540300320465, 10.901176650118995, 25.431939570760367, 24.6055706099185, 28.312328323521207, 24.76680563877386, 0.4437300605005453, 2.4493573428747615, 20.214586755212995, 3.4662360162077603, 3.5156845206337852, 16.716775600630548, 1.0856549403365237, 8.783555399174029, 17.645656699653472, 11.217274103684643, 21.99527073267946, 18.628567596746457, 25.772824417025646, 12.08641097355, 9.65985760304604, 0.4635646201517939, 23.65372783683382, 22.494552679872257, 9.536399524114424, 10.309434986059898, 28.02464858060979, 1.4836940672233387, 0.4990047366821547, 5.232872291461418, 0.538837274853462, 9.459566917110825, 4.969449822492664, 28.081310956628922, 23.69687050504203, 21.214974621623, 8.91488601958641, 23.15009128848807, 17.76859117862846, 6.014276845508286, 2.100366784415651, 0.46609389323695133, 7.402665054192373, 26.43043256706984, 20.16510441607503, 6.6148454050935275, 4.1726133124812375, 21.93942331630464, 1.4741481193078776, 17.763497438748292, 1.7744557177373166, 15.701014559010208, 0.324225382396677, 3.558976432857336, 12.311798726599536, 15.103561547087928, 2.997127181694934, 26.041659632874254, 2.463728239152897, 2.5074195738764455, 3.2856632904288468, 19.62746534426039, 22.396208971778435, 0.1226136283433421, 12.132226946325662, 5.295881673575512, 15.257156131819215, 20.74802020533552, 7.867815314110365, 25.23857857551939, 25.57216326016974, 11.36924805746018, 6.647619780416628, 13.936417471882358, 22.817893480157178, 16.971544606156055, 20.923374191718334, 17.367315783063432, 15.924534979180686, 7.332710281744983, 5.106830175114937, 13.933280326111422, 25.978754771992534, 7.303548730232297, 29.83812432038187, 23.28005970307088, 26.021813687402307, 14.615590349257788, 20.806575880346465, 4.169537051461351, 8.736598932235053, 21.271742450328787, 3.999250975612116, 3.610610267504, 11.909795230858162, 27.198563270612187, 5.20701191407022, 5.618444546003766, 27.93631431674596, 8.283193506960856, 12.393965645039572, 29.98782909573119, 11.194146454249596, 21.31570058339568, 21.22026074462934, 4.47711672724765, 7.577699284620548, 19.929742200096243, 2.699247169820373, 11.474198270805246, 7.951189253425764, 17.103422855839806, 22.174571381261057, 4.554428202775802, 20.94201524969625, 9.874580292622303, 7.074804434038489, 23.319989380975315, 4.334359017137791, 29.218561687290986, 0.683270491292661, 26.123104955819738, 1.726006301544278, 22.197260949724214, 4.727567345274232, 11.364756269595123, 29.36492040442793, 8.886016565825127, 24.488350309641724, 1.6006613280035724, 1.6648057562673286, 26.642358961268528, 3.6309867234521285, 19.839474758901183, 17.501461968988618, 2.3684217383477377, 28.048091910657377, 3.9251357369381874, 3.1960658117232144, 2.1560808000545113, 13.61025328778337, 2.142836509452708, 11.939784596079813, 4.663114688820355, 12.973098755298274, 15.144170320182472, 13.694328944491728, 2.3943380453813665, 13.725761958133377, 1.6271088785166936, 11.557619847642444, 28.240497671085286, 20.154154603745788, 15.68477474988662, 11.320856052522982, 13.286524663871704, 22.17532907651897, 5.167437937991808, 3.097895418657629, 28.208097973271233, 17.264215156251936, 16.040140670335543, 12.242327994260332, 17.947354658006656, 12.038999182204421, 0.8941161323977886, 6.114372347749513, 3.9033603617925445, 14.85899510074843, 12.606081617273116, 29.08912930898398, 0.8456339291504853, 11.907454027038845, 1.87897963181256, 29.205543106994188, 22.308807313899994, 22.055364915094188, 6.567113763161824, 23.880930904597143, 6.991690840679592, 16.946978586040384, 4.442132661959327, 12.393717855357945, 2.563083097964627, 13.932463002254709, 20.33194605675822, 15.501369658379705, 24.894016402809616, 10.959243349915429, 16.535535242610855, 19.84970517252931, 10.261424308171398, 22.146594695472483, 1.3024107125985869, 3.8879160221723814, 8.417262312009473, 9.408142622520112, 1.3398183966957034, 8.162173258728853, 17.062693318231183, 11.857856100393883, 4.902634483909115, 12.333650404228473, 2.748950666367977, 3.533377918195278, 6.309787453759322, 9.824917620567316, 14.260100078857848, 5.021026173026716, 10.298438177280582, 13.999836226847824, 10.73346713737924, 6.92153100703403, 12.451356555121343, 22.64043332677594, 14.792352050973822, 1.790567141899859, 1.9016890608486818, 27.333324985444705, 11.766003621898088, 23.574438975322277, 4.895055127038902, 27.019503143802176, 7.632953046963598, 2.5618455080405256, 5.557408989868168, 12.821538630616045, 28.46143603867666, 0.06196644830377215, 0.18298752594417675, 25.11168371432757, 25.14210347081221, 1.8247931052208035, 22.931098109414744, 28.38955885218929, 5.300449512352497, 16.34981102158856, 13.911625994511509, 0.5813588217751477, 0.18375516773477307, 21.78267384462119, 29.524909278927623, 15.497060851541741, 24.838742791887633, 6.9272440898175445, 14.256042929286737, 21.82939623496256, 14.01740517255782, 28.73488136258418, 25.069446559477235, 25.029857676330707, 0.2712013914915091, 4.645246504283225, 14.384319167268002, 23.56583566475998, 14.940560661241836, 2.5860101481849584, 17.368817329515114, 5.033489825786934, 11.663142745374529, 5.008145173374616, 13.653787984560228, 16.679018151068366, 9.455254131206988, 0.9943778307032212, 22.139127421979648, 24.926528182224192, 6.123375178664462, 9.404305429014661, 23.973019506932705, 5.612855317509753, 26.933365788942375, 10.626080211952049, 11.554113575958509, 21.154654770318945, 17.07804612590141, 2.9864530229476296, 27.256785341627147, 26.47503683207916, 6.310262965619683, 29.55110675359471, 12.909393920093652, 1.6653708169962913, 7.169660986834838, 21.556707073516726, 19.64252061262753, 14.874805118526444, 2.9774791501957982, 21.641829742005267, 3.8896851320412202, 27.36793559415992, 25.768644640456877, 11.654066368355183, 11.792172925288842, 14.764156908952415, 7.188854568055426, 3.1943848331078137, 5.746390614547496, 11.086860997656855, 22.772178932621916, 10.455852348028731, 29.56125517569777, 11.85861202093288, 9.509237021198983, 7.961866302476537, 2.383945569346825, 9.228374947363276, 4.58286552692352, 13.859599662953649, 24.43487034128914, 6.055177587481857, 11.082547371439912, 24.73500884463703, 26.707853445557806, 9.142802493191203, 7.09024470835669, 11.645065804796406, 12.32933061435027, 23.961500065140648, 5.7487126569579825, 7.38577682505148, 14.186114151547399, 27.370718204827938, 28.422167263128976, 14.326684533163695, 13.467576716208727, 25.35911152120338, 11.037922067599649, 1.2148560205688268, 8.849871396120392, 21.660812787007846, 17.666507982257755, 15.339758998717938, 18.88621845530353, 28.955697503479016, 23.006664406280436, 4.674252201911279, 19.976843397411162, 12.055958483864496, 26.39006842688685, 25.156525393659376, 9.793973604283973, 13.11183264890833, 2.437047323350583, 17.92358316860512, 12.325230039949616, 3.2266023420533183, 29.85288092925587, 11.73341378044651, 0.20827726430148907, 5.404247774708986, 9.786768678839849, 25.186893144741134, 24.293183620675396, 15.255377672012925, 23.26018700700648, 0.34156719823981924, 19.52287980402817, 22.002796452888834, 24.70695625874976, 4.88782649776408, 4.2354553774949935, 7.627905910388887, 5.077626307331418, 22.304429408098976, 16.881796625991882, 8.816777832360088, 22.874316309489387, 11.159434966751759, 0.1097908672859086, 19.89118511874551, 27.632270798831513, 29.569534430544408, 21.552879842168554, 5.1034421405789105, 11.066380841377622, 5.0146000819707535, 6.400824203591798, 9.181760698535076, 12.826171016667471, 20.065691113106045, 5.1772344411976245, 15.793996379745929, 8.749050834165434, 2.2868421402796093, 21.86564693329881], "azimuth_angles": [4.859882829594482, 3.1580895138590495, 1.4044753601525262, 5.008803833706702, 3.4769745038292243, 0.6791529025159111, 6.265725911582326, 5.031143090839389, 2.523458078713225, 3.4571172215650243, 3.3792975864148342, 1.6946071291210683, 1.8017200634459551, 0.7886975317856294, 1.5667945784750077, 2.6624224889615395, 4.03226997870497, 4.312247164960384, 5.658456440336376, 1.5854179063954792, 1.7942712332290733, 3.5478366885898627, 0.06073234274867444, 0.8274279974488429, 4.728972652016946, 4.269347804366569, 2.403756905402542, 3.949247673011707, 3.489616080342574, 4.256231530601479, 1.252451796534356, 4.088850475733263, 3.590399325585582, 5.52331230946381, 5.770535668036253, 5.073338097672129, 3.7328393518707492, 2.8659220880690333, 5.073665363066673, 4.701433925967848, 4.876885535073427, 2.7507912168593154, 3.3694911974317323, 4.532707778690352, 3.3202318876560892, 0.2698920683740133, 4.057544210918872, 1.4881496314969858, 2.277803190773961, 3.000272938674095, 0.04332847058640298, 2.1917156198320544, 2.068698982504426, 0.8008643772082961, 1.7985594613947913, 5.6075730844093075, 0.4189826204669631, 4.146279041194001, 4.154977412326777, 3.1396640925920045, 3.617917795335923, 3.1177374502225454, 1.2453802893910353, 5.122851047532403, 0.8304211982524936, 5.426203899794403, 2.652113976727718, 4.563072282479524, 4.983424584820807, 4.592422918630915, 5.132390990249527, 0.18497110300391342, 3.80566724962096, 5.417508612691812, 0.8438914726596176, 3.936553226588656, 1.9322990253386698, 0.7662155953280425, 5.866817458516487, 4.217243629576935, 2.143212715193736, 3.68702813650289, 6.130194176012326, 1.821525864065965, 4.48166782511645, 3.616778752213433, 6.2681659627067825, 0.21812532017093084, 4.925013089688573, 1.7771614912824374, 4.84123110380467, 2.133221346542606, 0.3488910085190796, 1.7879317070082437, 0.1079201520778481, 0.23539971110365795, 3.7894710041892257, 3.0091886755344692, 0.5111211529350379, 0.35243222835782606, 0.42185297531860705, 4.658989798220262, 5.674395637910227, 1.9290686817410367, 3.0955099789060543, 4.015824549315975, 4.9927930690564555, 2.7971624192440525, 1.6854333346035295, 1.5031052621492966, 6.217705634852806, 4.068859099453741, 2.176020791406129, 6.1673766465942785, 5.3752269233878645, 3.3604011000395175, 4.033926175108115, 2.649755958528121, 4.1092932319062365, 2.3656946320615377, 4.80716900617249, 0.9079547849137234, 0.8056163581872795, 0.19855691383189808, 2.6555762697887806, 1.2569849318041995, 0.6224281578297772, 4.231635666044433, 4.2713987233850474, 5.466794768084683, 1.8218382948216767, 2.1006345600066805, 0.85844126764419, 4.8780236238943795, 4.833566768741664, 1.636174309661769, 3.118510939908449, 3.7698006382427907, 2.97119197215243, 3.998868199783991, 4.21174014512757, 1.3613083946537876, 3.0992599168014126, 5.801361664327407, 1.3635291628137418, 4.029598839459785, 1.0777122529641805, 4.155845660200829, 2.9776767651184994, 4.651377468744158, 1.9822815442616042, 3.441713976277056, 3.2941360578936996, 3.030201422807685, 5.538792256698668, 2.170998383569185, 3.5106240260937476, 3.7837424015407413, 3.840378937651843, 0.5623590130168538, 0.46634455929888446, 5.863165625658525, 0.673053762079538, 5.642333502560593, 0.49585436664945903, 1.1617045810276982, 3.900829098472287, 1.2892055725833014, 5.347479891712668, 2.1546162943705047, 1.7406503326190241, 1.7747283920261405, 2.58502437909766, 1.2413606394123191, 1.7190955251076085, 1.815628970240758, 4.7335476917709425, 3.681550886590169, 0.815278971851724, 3.660006772899565, 1.4235283771579148, 0.039737277685803124, 3.1251120971734356, 4.951359541390147, 5.215411298282589, 4.7751400527371075, 3.6259268529991644, 5.148858621573975, 3.830276002340225, 5.79483976611738, 0.7852568833192407, 0.10590121357836507, 2.7056246407872306, 0.2473972447953334, 6.219474662980338, 5.648738817432396, 3.603887804345311, 4.700927409599659, 3.826579103980484, 5.08267485424171, 4.2249992220790995, 0.04894764178103042, 4.133479228955319, 0.8029243895661471, 1.6452921812881451, 5.304161362629032, 2.2499086647996425, 3.248443521985818, 2.362323286704407, 3.993931102767197, 5.812667301751952, 5.185085280629832, 3.874443152903798, 4.541500423099835, 0.7757991582668632, 0.785702419365159, 4.468517405157386, 4.385136786824667, 5.462172236392177, 5.152068908026154, 4.479031894453127, 0.5295500300387863, 1.5296903016916374, 5.34074189248092, 4.713975064224336, 0.14492587384369265, 4.6106010999885525, 4.321028652343963, 0.39618402950478404, 5.61306620619172, 0.3895452130095014, 6.200000198502267, 3.7423092652667704, 4.745835680379385, 2.4012113363507606, 3.695938723052792, 2.521290989185053, 0.7679156941734784, 0.7393530168754255, 0.07657174294063566, 1.5767453923056367, 2.5157518640280574, 3.4705184294957836, 4.5666467196534635, 3.3189762102195592, 2.391068942881622, 3.244515382983233, 0.3159046476074528, 4.964934804553405, 4.492852050889943, 1.5115252977435516, 2.702024229052965, 0.2901587341035038, 5.912396871605963, 4.399949727117193, 6.088128814991011, 3.699836701008021, 3.9423787690445717, 0.13639061804914085, 4.197723212225727, 4.145979702093493, 2.063960025636775, 4.858086669601173, 3.6236564617871916, 5.075151050939156, 3.189376001022722, 1.9904485677920842, 0.05538684521688738, 2.30351859342387, 2.1639442224168333, 0.3986997436260282, 1.7179967392828277, 5.147202990455325, 2.4034082313837, 1.3592980306261708, 2.889848304009496, 0.3183060829743303, 1.7420118064670524, 5.00642491649865, 2.451079710890725, 4.1151598007985575, 5.972116381631783, 4.378031068796548, 0.6749813466470561, 1.7962978895069865, 5.7479655892777854, 0.9447395926073241, 1.6953639137965069, 3.2495037441085937, 3.9799069649930927, 0.4219472955531035, 6.079777100603833, 0.7434268473923759, 6.0634316327813655, 0.25585883954247396, 1.4190739654374904, 0.6811687537237526, 2.335575362351258, 4.546647381911737, 3.7192713391623644, 4.0705664385743665, 5.121075846091169, 2.4301683387559683, 3.0346506026497027, 5.198109771242185, 3.6488134291566485, 3.454647286769834, 2.5601868750173242, 4.355629215751514, 2.081454122800097, 4.373517264949288, 5.051422677516273, 2.720694002508473, 1.7450571742154453, 0.6330074029676945, 5.465918706855622, 2.978629387796238, 2.590386863253518, 0.1777738424160802, 5.163950801149249, 0.48722362295431465, 3.6791424066386855, 2.7850849539752174, 3.4432620229482196, 1.136368097425293, 2.373995327188849, 5.085316485348548, 5.012699621603489, 0.6915417041890036, 5.907785288840092, 2.2729408719449973, 2.0622976125531034, 3.560815981428262, 2.6951890798310663, 2.076019893260916, 3.4164349773372535, 5.75975787257914, 2.055551737404653, 0.6893224437879496, 3.276187657751226, 6.114363158631364, 1.4007417243439646, 3.6289666951939505, 5.318354536134493, 5.18898078827536, 4.438138702954155, 3.4082950105753755, 5.249461185100266, 2.556442838650678, 2.282245172186374, 3.109737763187296, 5.13270960398358, 1.6923711490699442, 1.9268910926455924, 3.326805886618897, 0.6365785165838814, 1.6088151551680339, 5.5094427849510295, 1.5131007138476509, 5.386469910219349, 1.6207807659800708, 3.434672463221763, 2.9903736832112715, 1.8040286513574626, 1.5223037107070725, 3.018597032066272, 3.3418450487001037, 2.623192865346557, 3.6930236921951423, 4.308489778921331, 2.2996328632740886, 4.932585904210228, 0.6818431864463936, 0.4355506450724012, 4.342595821654176, 1.8518032921563887, 1.8954172181443358, 4.757899661582952, 5.063395537608032, 4.0611423933879625, 6.0979106839404755, 1.5233469727413305, 0.916741548155379, 3.688011802804246, 2.770706228654754, 0.3297399720175852, 5.134675403211523, 2.0006227197286686, 1.8111691226295794, 0.1998748103882227, 5.351124806891173, 3.884686366450602, 1.3458203791772236, 4.029587781986691, 4.375222996343757, 5.793620685352992, 4.090456200735684, 0.4154940270520547, 4.928907905891028, 2.41566602026365, 4.739209068321927, 0.3394338377757699, 0.7430031344641442, 0.7125515932617317, 4.934445148459197, 5.655105801771292, 2.368110076973357, 0.7899106360221684, 1.316272149782213, 3.533400661969407, 1.689162622017864, 4.040343233321296, 1.6873623729697844, 5.596079364054307, 1.4573009753088244, 5.1972100310611715, 1.3313026745990295, 6.161369238230105, 2.2220825331516316, 1.6670480100736487, 0.830306570760897, 5.331363806364601, 3.822186683899631, 5.4810651991303665, 3.5386438004251755, 1.364736944094578, 5.5735765683981935, 2.5486439791621534, 2.7690868557781325, 4.3792798933801365, 4.330343871232624, 2.345683995433601, 4.346804366710401, 2.950371796770931, 0.6809772401100245, 0.5377104783131198, 1.6555848046980568, 1.7581692682979497, 5.844323635077647, 4.480739088733546, 0.7856410218973594, 1.8494517697089934, 5.486012026479419, 5.809025546177084, 1.9574680680573633, 4.416793353050936, 0.9000781192008113, 5.161710618279483, 2.548663182148483, 3.7435074490526645, 0.9087795536921273, 1.627308265836547, 5.066300945887924, 1.7993345352995365, 1.272727699346943, 5.106509082168216, 1.1641439262946853, 0.5329697826925847, 3.468550915876708, 1.3258330794033641, 3.5909258783045535, 1.3502081299835667, 0.1164657312149525, 1.711462804929827, 0.5302866279663709, 0.9693396141399151, 3.128230282111506, 2.6599055350569354, 1.745021266608895, 1.2526298982879385, 5.42006584320883, 4.3463431270813695, 5.472629358431246, 2.6986367356173506, 2.1309586981499336, 0.22605043713801218, 0.556887789184952, 4.809459824863922, 1.6384581029830796, 0.9567357080795322, 2.5811706528591594, 5.920760701092774, 5.432160945059371, 1.2532059095311605, 3.248017972921955, 4.542697598343031, 4.747077358498984, 5.5594532698386505, 3.245918436984415, 1.7698071135403068, 0.725447039911629, 4.106012069394583, 1.4102637828000384, 3.348878388811049, 6.075958966722322, 2.6498235927839136, 5.525026449344806, 4.307795472515346, 0.5504685790426416, 4.257011140551699, 6.059013020310914, 0.05791755668813062, 1.3863271611923778, 0.19599618825766935, 2.4959132481856345, 1.1119261229776891, 5.782453166824724, 3.1569722791868964, 3.829358247672067, 6.084624418306174, 0.09709615835951566, 0.47761233539407644, 2.510948162829699, 3.0763115349175263, 2.563245368033095, 0.34291893009858965, 3.4797713061031788, 2.3133193398164815, 5.251487743205399, 4.933109082871783, 0.2671321727994984, 5.0149354245677955, 5.35591317680223, 2.3685319529057813, 5.843964549139272, 5.598633696221211, 2.5889970959749475, 3.6558179688473795, 6.078525070146823, 2.284534891993604, 4.082050834649991, 6.109239015348956, 1.1762992011262499, 1.0800430372518248, 3.1922532605954936, 2.8672526717147684, 1.8882696730679651, 2.2920283788294293, 4.588617539755446, 1.3984254445578517, 3.983163721299558, 3.6944005496878565, 4.009582388042449, 4.253393523283488, 4.930784307257478, 5.039330712270759, 5.848627495703203, 1.3091565175882618, 1.246211210176224, 0.7167099278885979, 3.8023503054340826, 0.3430883379208218, 0.8206687060996677, 2.522544741583742, 3.754671593769693, 0.897129235670099, 2.633413243958111, 3.485659640780242, 0.19646605533585357, 2.2895734004108785, 4.664531124761797, 4.2598781186170935, 6.19568932247573, 0.5838747932355054, 3.568387578146279, 0.3601513133915662, 3.499521751607868, 0.7580656224709854, 2.742137166348759, 4.632472473910646, 2.2326053175155187, 2.761826450515205, 3.836993813484013, 3.83494588840224, 0.3930774326866181, 1.1862974922590783, 2.7304845833937743, 5.390455971512836, 4.756461049111292, 0.8428867509723842, 0.6002556677179839, 1.291815488256258, 0.2711764712041093, 5.9164108155840385, 4.60572415198976, 2.88003269923339, 1.905902139960931, 3.852152273059066, 5.410529425339475, 6.182774393628925, 1.6795159175011285, 4.406795123927092, 1.3148675225338513, 6.089539711667241, 5.647625896613768, 2.3941635734299456, 1.6847580354674825, 1.9264269803863474, 0.9206998886871759, 5.34900935560933, 5.220517921309459, 5.153835570546411, 2.1442000416014664, 6.218879753491104, 0.12309725785146536, 5.749951362333958, 0.756650435536063, 4.72233546440589, 2.4973594354461772, 2.1383422408499593, 3.6865673460895527, 5.657698753576957, 1.3333862038084454, 0.8341346959251639, 3.759507032416754, 3.828033956654728, 5.808360627023631, 1.5344789485851444, 5.131291899986059, 2.0293087579785576, 2.574491600465223, 1.7443599386003705, 1.9470808273252624, 1.6475399917395674, 6.187256509327439, 4.535554708420481, 0.47981610475583125, 5.243115971380526, 5.673257948031315, 3.0307321579605815, 4.258640272219976, 3.4541912984491345, 1.1737700498332693, 2.1246607210576407, 5.962289596382675, 5.23158174890708, 2.398245241314854, 6.27001868803372, 5.803132282360458, 4.223336418129503, 5.950401301677067, 0.42980740474296664, 1.5776779993892613, 2.7510775644724914, 0.023714120790868803, 4.119914794872155, 0.23757282811227087, 2.2337939501468846, 6.006831817609987, 4.789073466985567, 2.6570871656091435, 0.3604920223309688, 5.1583793946548315, 5.852590412954339, 5.321882360555033, 6.136299940960195, 0.09154961231101526, 5.689964881389718, 5.9306432327085, 1.9898139837293578, 6.013103050541767, 3.2491334333358433, 0.977186688746726, 0.7520603196669237, 3.2114209673536083, 4.439892856097744, 4.934237066425503, 0.5128796540820278, 0.8471403344733226, 0.26611391554858976, 0.6410202231470683, 3.9117293274572087, 1.7643258929491916, 2.4728809803642435, 2.7980030528982516, 5.879096747926947, 4.900651069146252, 4.1688029606309955, 0.9472510317362587, 4.313569321900124, 6.138347605981752, 2.5765040253623077, 1.5661521300618466, 5.252184662204696, 3.460461702006133, 3.452719277834649, 1.9592670145245465, 3.2726573165591755, 5.173929990317845, 4.327221321343856, 1.6244618313008952, 2.2003388196988376, 0.627605312154719, 1.5812738549578125, 5.6454762258848525, 4.986251876279439, 2.120584881083149, 1.7148160234444045, 1.8517390371974005, 2.570137412955028, 0.2876578740575303, 4.33606680003796, 6.022191153053323, 2.9413263345836516, 0.3135079678087858, 2.8210523076103597, 2.3144212823834427, 6.0754022021574485, 4.757171430116167, 1.2842365244125906, 5.343823624759226, 5.241633300175101, 3.34964426575148, 1.4038898570625529, 6.063071348063357, 1.9163529481484303, 1.8854024811222618, 3.705324735589635, 0.02264652891898048, 2.9398685713094865, 5.458661843405438, 3.181812410949361, 1.5809043356984338, 3.7493907479597604, 3.3227869119848017, 2.149495903873837, 3.718490730461311, 5.32464006248824, 2.1773160820500954, 4.1532991196331475, 2.3696441219640154, 1.9689080338975011, 0.5777506686510037, 6.055187461576077, 3.0076803573726596, 1.9371517749453229, 3.4680800657896826, 0.02119717923212975, 4.0826027138171375, 3.4097053339665804, 4.206755351145071, 1.110004113868182, 4.943704680908838, 5.752691248223845, 0.006863279115916702, 2.139473236348028, 0.3394906144917232, 5.012028050986301, 1.430451385592603, 1.416157429655464, 0.002427065079623252, 2.4316907913180983, 5.480017267642809, 5.9163601478563725, 2.313649781478618, 2.1920432600336093, 1.3072128221753876, 4.277839383212066, 2.8273807776439517, 3.6703469438476093, 5.56513324683219, 4.506838055126787, 3.3584139240600144, 4.483154138700696, 1.2671428725101628, 1.2229891558855424, 4.063581901116903, 0.8370321716871786, 1.3523548934241727, 5.800149544790287, 2.3634930018278126, 1.4656302881200292, 2.042246129894828, 0.294830143264437, 2.7000868466817325, 3.4172551001241644, 0.8401188294011045, 5.900804088429491, 1.3381836260676319, 1.3236247642231374, 2.0263160411890726, 5.445018795895197, 1.1811907886092807, 1.6467510649055166, 3.796839774776699, 3.9972007926640676, 1.6415669754035174, 0.26766071520187934, 0.1588177036727488, 1.7382973471587124, 1.4915013960893813, 2.7358654737797083, 1.9024832867902597, 2.7016380851386765, 6.052874807675858, 1.0621837484745507, 5.485805471688112, 3.7041482823869325, 2.581983853185555, 4.069431314456028, 2.331426383264414, 4.59009682463298, 1.89005751245014, 6.22893687331343, 1.9463853312915669, 2.7000032374235055, 3.54291719522386, 3.496874893230419, 5.705628125918518, 0.6199312536787626, 0.9551620579439647, 1.0805008315287188, 2.8329762894861292, 5.938906891952003, 4.746194161159279, 3.366533969526519, 2.1469597485496426, 0.2311472340669799, 4.209303124336771, 0.42282701623856017, 0.690871624472085, 2.691667412289564, 3.821255143580893, 3.634868011295497, 1.8795577187473202, 0.639604128111298, 2.0492526643118865, 0.1653458611787464, 3.722985647043856, 3.74415826193459, 5.212136053903072, 3.044604196384839, 1.654285052051495, 3.3727969180186466, 0.07421388779517095, 2.4215568395011466, 4.5396218623784526, 5.32355416885004, 2.6144319161651164, 4.79554396733532, 3.701165354379603, 0.3949578152006619, 5.3220999203081405, 1.0267569084199228, 3.7713638922762565, 0.26954858678040555, 1.772808318423323, 3.098881484971462, 5.592159757841543, 1.3608366933842766, 5.98556183851014, 4.483129877050244, 5.837372995826528, 3.1402233099673103, 1.4844185659522242, 4.527388086962962, 0.15700413904698496, 4.932182964710092, 2.951225161486603, 4.466846701186752, 3.7626003776226575, 1.9824062409730407, 0.50054989279708, 6.127146988986243, 0.36651333325319735, 2.501811068495707, 2.466151797787246, 5.576642587706359, 3.077274049837853, 4.609687328192588, 1.7676773289145489, 5.8386131805460515, 1.205965510322167, 2.1355718153562973, 5.962001048890576, 5.069096515022538, 5.667810317053513, 3.3166444300401476, 5.320032769942325, 1.000035703925588, 4.977633388546737, 0.15988215787889054, 3.0641209557239115, 6.272862910479465, 3.393626684650123, 1.3194686253582342, 4.4382827328385615, 2.224404912567688, 0.7042960071852348, 0.45014927256276155, 0.9411829768270586, 4.985580672644867, 1.3047076302103333, 3.7017854372238284, 2.238344260223597, 5.469819432864844, 1.5262050978544455, 1.26318343866402, 3.2657037702896083, 5.026964072248926, 4.713645562743595, 0.6778846786464079, 1.310133982639452, 3.6835949461600657, 3.0318208437455034, 4.209041414206848, 1.357672233926796, 3.170451392924767, 1.3220931457563352, 1.8983691699053495, 4.107286164708252, 4.644709355862788, 1.2491756969465229, 5.237596986561315, 5.962570789144616, 1.2983592496883636, 2.0309242439314117, 4.189710371799017, 4.410020315481048, 2.613625312402386, 5.928341041342568, 4.104259252437342, 0.19016784642952278, 5.629519653320755, 5.771427998275156, 5.375287606873518, 1.5101795260073052, 3.4111204103245845, 4.437660825604935, 2.8501207017824246, 5.292753264654788, 2.355805954189234, 0.843495336644898, 5.883118618811768, 2.9436729020159915, 3.691492509688613, 6.26801472756807, 3.4224244108121935, 4.0463061576137305, 3.690669444160079, 4.2654107162306065, 5.767254523164227, 3.463620258433992, 2.467555942846039, 4.550800333868309, 1.7361306419684903, 1.0457684312679631, 4.385534548646664, 3.558442519307602, 2.9570230014125825, 0.41028372692206455, 4.789630527694952, 1.5961423528655427, 4.504269987692567, 1.6325675370890365, 2.8939286272816886, 5.038443299051928, 2.201932277463606, 5.096097305438736, 1.2111661082376513, 3.0230998929351043, 1.3391741147943357, 3.9422744409121493, 0.9218506754445844, 2.557460725855917, 0.15810985909676012, 3.7931542819071447, 3.1294372769273546, 4.036923522812236, 3.695607906092962, 2.353525555538718, 3.2290631836868267, 0.7442825992160133, 6.03092325605242, 4.799765787458211, 6.140055219213622, 0.059229757429028536, 2.5418281441688175, 4.655051671582077, 1.3993936278743542, 5.461512496543318, 5.34645655660665, 5.007572382274898, 4.63759024823851, 4.091729934875328, 4.18683088808027, 4.84267636526862, 3.398358145611024, 1.6653982238043932, 1.2776626678547585, 2.310291262138224, 3.658335981881485, 5.763505499313008, 0.3691893378417332, 5.007618256351419, 5.202689919592113, 1.6813635939133333, 5.156422819659089, 1.146129196474305, 1.3522772728434675], "sizes": [6.689031155617159, 8.76449164432884, 6.577186330930573, 4.281185375246563, 5.50363773923145, 3.647778341354678, 8.494130056899849, 1.1920011489443523, 1.9609267332007714, 5.144066975427488, 8.635578087872071, 7.1631453207041655, 1.2319570228472656, 4.562905668296543, 2.9718769598939203, 4.577710610795727, 5.188117549704538, 8.654073166227073, 7.407324695602985, 5.111451657474294, 8.721446818466259, 1.9277151438288467, 4.205905423406727, 6.776181098268743, 5.175888160995806, 6.74289130776671, 1.5825518285001403, 4.804357403306513, 8.463580675642925, 1.844435303682139, 3.97954830901152, 8.648009129027258, 5.426444412638199, 3.8999994319198543, 7.423758838568892, 3.776072215646643, 1.0209332206790942, 3.4915112394920307, 4.753672308583053, 8.333550844476934, 8.5569960630109, 4.332878728987348, 7.5140339286501305, 7.362313755549201, 2.73887018804085, 2.028610052053479, 8.515727332938004, 2.5151976350290415, 2.5912881484871613, 7.454162772245174, 3.5903712631565368, 2.2182596294548023, 7.196611368129478, 5.474041974830313, 7.855347542460767, 1.646614396861457, 8.454834223438388, 7.798529256226142, 2.7931441027528288, 8.097215766065295, 3.295677534612343, 3.0931826624937497, 1.9358800045490587, 6.582104391331558, 1.5320900567824662, 4.716079537744129, 7.203788124698892, 2.214745169296204, 8.420632825544196, 5.705063402826795, 1.7934299519929238, 1.902882963151293, 7.157254410842279, 4.339667823849443, 7.00439646771132, 1.4355425614779362, 4.202378214582704, 5.625121233631578, 8.054068645385573, 4.544108147265619, 4.332658040304178, 2.746458367701974, 1.5988216427972668, 8.908082207834697, 3.8814805605147917, 8.19532114513826, 7.580940041745026, 5.285978083933546, 2.79234888661985, 4.381240805060963, 1.0261716569671528, 1.3720881932102387, 1.7118174346446209, 5.952176160934108, 5.829953519629604, 4.406706703784893, 4.135918780865394, 8.784042354890294, 4.733217775417542, 1.116404580399729, 3.1776192674078914, 2.304920569829865, 4.900497732807564, 8.380389695753784, 8.652674905740799, 7.628406359642444, 3.112776206136873, 7.923769145507727, 6.41507206899897, 3.107919694077186, 2.7500013604237994, 2.158548987472657, 6.442132216687215, 2.1919981073627177, 4.512798716209148, 3.7327020501368318, 1.8219049134447245, 5.21531516940985, 6.400820262919672, 2.5092275524257, 7.470550754908456, 1.7532114775233603, 4.211517002590763, 2.1830246198618575, 1.8648690651389221, 5.801801774515996, 2.192275670606575, 2.022804624376803, 5.912057524761565, 7.945906539505578, 2.6452915725242776, 3.2946666349159854, 4.7609416626522085, 1.512855218478218, 6.4069801176906935, 1.6021558648440155, 6.620419842255137, 4.719048972240666, 0.9970772107392201, 3.529838897761962, 3.3107741304492997, 1.8057430405294657, 3.3791737361179996, 2.3004387831870696, 3.340104971428278, 4.715127625782584, 6.34882286128842, 1.5741704550549067, 6.249849571011226, 8.339459509004127, 4.073887588783738, 5.290572309949903, 8.306685423216361, 8.037328003351826, 1.0532751284820203, 4.572680348712649, 3.939651634985622, 5.8384536568213, 7.130383690800153, 8.361091467479456, 6.3812010672514266, 1.788683619495137, 3.830575388637394, 2.3466314728254796, 4.623093706975234, 1.4436312454302074, 8.225298498422267, 6.517788859366474, 3.9597211733129645, 3.377612399232055, 1.878131918117717, 2.536181716518882, 8.570693809278543, 3.350462419366905, 5.076014033212794, 6.61479543248714, 3.6663733151805005, 4.839406248623364, 3.781111196551936, 3.938122884409045, 1.5855646362381817, 2.722626592374634, 6.475601716214457, 5.475099296506142, 7.984377341996805, 2.4172271892869297, 5.755680183509802, 8.66391622784553, 8.847096352035239, 6.899231037690268, 7.096831505427986, 1.6475050206836006, 1.2311466313152144, 2.257285318997601, 7.761826501730729, 5.858215532604182, 1.6358162307416435, 4.217289885777197, 1.556332045106676, 3.9699226494720783, 3.5391506857276767, 8.804554876028647, 4.585654380954193, 8.702236527605741, 2.544770877673672, 6.500804294149756, 6.465814477613763, 2.82707496059016, 3.949930771514453, 3.5818148101128613, 2.985973481533806, 7.080754331330411, 7.543264558275099, 7.472958565638756, 5.164849739456088, 2.293502295934357, 1.1309920574755765, 2.5009275261010226, 3.6823494775984007, 5.548974294709679, 7.852786897398574, 8.121681840656581, 3.2664086344991445, 7.7999310731623055, 8.043989946350003, 8.231490714820854, 2.5644004096703963, 6.781656787138492, 4.259072829102149, 3.8209015820750043, 4.380076913037694, 2.7018505438776366, 5.017364639658297, 7.105819881176428, 1.4641324025416265, 7.451091764218259, 6.643090545585668, 7.452829593434669, 8.656247595157879, 7.741222763949047, 5.532302935068407, 3.877514049952225, 8.586881620454259, 3.441229150276489, 5.69557467910245, 3.5303604530444654, 3.845003567759663, 6.016553229824586, 3.3521623012002553, 6.4218037073041, 4.3482867615759195, 7.670988649218534, 3.0940611318364906, 6.812678348718297, 8.318108167431221, 4.152554728470946, 1.095645430840825, 3.2337485522232705, 7.9881239676554685, 2.121390569274871, 3.677693252963249, 6.562346466495938, 6.485848302498542, 8.4555808588983, 3.232533338049785, 4.279490074401556, 1.756516530050008, 1.7153031270695418, 5.500440286738342, 7.690967443556189, 3.9330683490873017, 8.964621178924805, 8.659299890123071, 8.040426237779476, 7.625846558306708, 1.6007609955672255, 8.52883248733435, 5.074378559482218, 3.632004673020182, 4.4883371301852195, 5.269064479364245, 4.152429314592844, 5.251060532258229, 1.6074714251919564, 6.346839592556141, 7.940725333499656, 4.790683439997423, 1.5102481248060011, 7.755018506169091, 5.506145865473625, 8.505841660224654, 5.730204562873798, 4.671322361196681, 2.0276988816550277, 5.910612965116153, 4.593902726930289, 3.012853696033584, 7.571372390296726, 2.1530051835970645, 2.2333785902564602, 6.346165380178681, 7.907020078606712, 4.647279086203761, 2.0896455530479567, 7.304362176623648, 1.6688218793531975, 6.870439157057701, 4.8125940013004955, 6.9360749148243634, 3.200414527391973, 4.853307973937166, 8.76432705474456, 7.243782504284761, 4.836732188708728, 4.746478296196146, 5.684769730180328, 6.6319213638521255, 3.4838209013478254, 1.1749993045933598, 2.354173763393905, 2.2713664832974323, 4.10104741380217, 8.92350850205069, 5.088528660196905, 1.3378867621441015, 7.5796331830889505, 7.067709096875573, 6.031447413703845, 3.140562205862902, 6.460982384030552, 7.352824590831149, 8.375091479043892, 6.928079833215973, 4.235910951406615, 1.8548481951520046, 6.8325154799490395, 1.3732260594675179, 5.898406674472021, 5.872535400216748, 7.823461414123323, 1.101353774890401, 8.747249914858143, 2.230564686149111, 5.523192639411716, 5.620030928774117, 6.293512836737641, 7.292570616120089, 5.0920446445048295, 4.125563021524267, 3.957062257339618, 3.5452115968572273, 3.250364739173318, 5.743504935548132, 1.7597202540693344, 4.136893700385875, 6.480579326599791, 4.755285299184389, 4.093307494263685, 4.900347139419473, 8.032994953395477, 6.323334477400398, 6.048126314018097, 2.691526410586396, 5.778399452706478, 1.2608050320471866, 7.155610269998607, 4.3763412241151, 7.631077726796309, 6.915179036634375, 5.364247921800781, 4.420370200249871, 2.250885848487811, 1.1413114645420344, 5.657681188783904, 1.8066686868707773, 2.795110576935176, 1.7931630065960074, 5.147424443620843, 2.4772726467396007, 3.446633012413826, 6.495225488422244, 4.015365980591812, 5.836354488059258, 7.906762856446175, 7.258281658293283, 7.919800656514316, 7.564350428406207, 4.6933337535694895, 4.470404517108136, 4.644286269759981, 2.39792627678038, 2.196903459205124, 7.587179280165629, 5.061367125184772, 8.944514667765484, 8.794005105428797, 5.5659744531625925, 5.644529861208395, 3.9375338231889865, 1.5761240084662456, 3.2503516304678484, 2.463955236286957, 7.83934907458722, 2.9676642355216805, 2.140356539119967, 5.284315835991598, 4.800714371522417, 4.121378880526442, 8.949565886888594, 8.713937221593431, 4.46222764025276, 6.49476298696704, 1.4888978745857595, 4.3726701463121165, 4.02528047362816, 5.897317759389025, 4.751812176595713, 1.6550700894591124, 3.807621340785496, 4.342015780657042, 2.4847236000478072, 5.659483319709164, 6.267586940141236, 3.1382795922345896, 2.4681956186751797, 5.3069324092468575, 5.79623801445523, 3.7741998627663094, 2.11109217255332, 8.849411749827086, 2.666174054390219, 6.8036779664104285, 5.817435014877101, 4.833330269156982, 5.449982350610981, 4.618450347852503, 1.8271288851104048, 6.233361480792755, 3.728791453661467, 7.606735998819084, 5.0143684576520755, 2.156827369165838, 1.5805951659498745, 2.9129492325579722, 6.829653390509208, 3.9383270349661212, 6.204850748163697, 8.034962886907053, 7.092446911456379, 3.60391349043497, 1.5288582161759026, 2.187784145409824, 7.155314638511179, 5.790800077291124, 6.002560571214923, 4.397359337631341, 6.34162144946564, 2.34758996844911, 8.516200756752161, 4.075676074145044, 7.979192935201046, 6.755990561453113, 5.453377784342401, 3.745595011642497, 3.6624588109932166, 5.281162280135832, 7.906839849542014, 7.2028902839515885, 4.308610703327353, 6.615736537916422, 3.638623216753502, 4.500715644093364, 5.995298895651448, 4.824469287651638, 7.719084547884428, 4.966146203510592, 8.967298862873623, 3.2818630630092764, 5.9454850515678, 7.591944699286357, 2.7105627014782354, 4.513956220638771, 7.184659219951888, 4.40632850242849, 3.110452603148056, 4.177303728474823, 6.3976195416040635, 3.7716885612577316, 8.151488417484648, 1.3473462262630405, 7.4553895782169795, 1.3478017103777409, 5.50632168328357, 6.701844398219551, 8.21315957013089, 4.376828493448936, 5.688259829006861, 1.7395415659167726, 5.444150416484086, 1.543997808838312, 6.934158185868162, 5.647911458428513, 4.041617862670753, 3.1154190037291056, 8.5056945359036, 5.027419627074781, 8.109745170931127, 3.5172539248659977, 8.464458712287788, 1.843900888724274, 1.639283303834894, 2.3807123827815824, 4.288631178047185, 4.091487997571475, 4.845395039693752, 4.204091159257931, 4.353689635091573, 3.3878431235874817, 8.491321807192795, 6.002883945141132, 3.4974273955470254, 3.435031722324556, 1.5383678919512982, 3.340713299682113, 2.2630930173291555, 5.259761679274917, 4.599629879469241, 7.099977945545428, 7.805940019550332, 6.6402407444293, 2.201523124995249, 7.041194320579614, 1.73133145335361, 4.6527714677830625, 7.947983196287659, 3.167649247697266, 8.851682218029852, 5.87197508758406, 6.283837504160644, 1.22477097404116, 2.8697841196435383, 1.4649454543641303, 3.000123546425357, 3.5269860137923983, 7.573577088284567, 7.961488561198037, 2.8530969590869506, 8.182125269121801, 7.642229607381743, 3.6819355398649116, 4.150266390326453, 7.418572420703174, 2.0322618841231237, 4.462247503680763, 7.767152662803317, 8.311486597691651, 6.429660404016424, 5.582712007721536, 1.3011768204916008, 3.9606927428233836, 6.249463931875721, 2.5947196115318367, 1.9813199983281105, 6.790071590237128, 8.444632673672766, 4.103527664611326, 8.169936120205469, 8.750005662422135, 1.7147592695728775, 1.3551631124698977, 4.2903965041223735, 6.634062113025711, 1.525928926006218, 1.020795428529946, 6.1500121119934175, 7.557381652752215, 4.944707064124022, 4.994491581864647, 3.9372875159052056, 7.77552399847896, 7.111194049209376, 5.263892714222727, 1.145943471560012, 2.880293581395313, 8.006175260273963, 1.846433986445046, 3.6059951942567823, 6.969042601802491, 5.342940090989805, 3.8288217178819477, 4.642165930500033, 7.112919192598678, 1.6679869921241937, 2.7210749145491837, 1.3656504595594323, 7.385849497550704, 3.1931872162725505, 4.675800417225851, 5.822467984185225, 3.00814061479502, 1.4116946346424528, 6.206447066933073, 6.06452721034006, 6.637664384992674, 1.864940195944573, 3.9775097369452967, 1.700146448651038, 5.6071828116581575, 6.756740580992246, 5.463926097434436, 8.444684764432973, 1.0418231742503685, 1.9989425366654299, 5.1207579525202656, 4.422810746752125, 3.8856471066983986, 7.760517218869431, 7.540152162644935, 8.528620886272323, 7.583148170339697, 1.0969946828001453, 1.6318286247666032, 6.369223134723465, 1.9029962709887362, 1.916182538835676, 5.43647349350148, 1.2681746507564062, 3.3209481064464077, 5.684175119907593, 3.9699397609825717, 6.84407219538119, 5.946284692465722, 7.851419844540172, 4.201709592946666, 3.5546286941456104, 1.102283898707145, 7.286327423155685, 6.977214047965936, 3.5217065397638465, 3.7278493296159727, 8.45190628816261, 1.3743184179262236, 1.1117345964485745, 2.3740992777230447, 1.1223566066275898, 3.5012178445628863, 2.303853285998044, 8.467016255101045, 7.297832134677875, 6.635993232432801, 3.3559696052230428, 7.15202434359682, 5.716957647634255, 2.582473825468876, 1.5387644758441734, 1.1029583715298534, 2.9527106811179666, 8.02678201788529, 6.356027844286675, 2.7426254413582742, 2.091363549994997, 6.829179551014572, 1.371772831815434, 5.715599316999544, 1.4518548580632844, 5.1656038824027215, 1.065126768639114, 1.9277270487619562, 4.261812993759876, 5.006283079223447, 1.7779005817853155, 7.923109235433134, 1.635660863774106, 1.647311886367052, 1.8548435441143591, 6.212657425136103, 6.950989059140917, 1.0113636342248913, 4.213927185686844, 2.390901779620137, 5.047241635151791, 6.5114720547561395, 3.0767507504294307, 7.708954286805171, 7.797910202711931, 4.0104661486560484, 2.7513652747777675, 4.695044659168629, 7.063438261375246, 5.504411894974948, 6.558233117791556, 5.609950875483583, 5.225209327781516, 2.9340560751319957, 2.340488046697317, 4.694208086963046, 7.906334605864676, 2.926279661395279, 8.935499818768498, 7.186682587485567, 7.917816983307283, 4.876157426468744, 6.527086901425725, 2.0905432137230266, 3.3084263819293476, 6.651131320087678, 2.045133593496564, 1.9414960713344, 4.154612061562176, 8.231616872163249, 2.367203177085392, 2.4769185456010043, 8.42835048446559, 3.187518268522895, 4.283724172010553, 8.975421092194983, 3.963772387799892, 6.662853488905516, 6.637402865234489, 2.1725644605993732, 2.999386475898813, 6.293264586692333, 1.6984659119520995, 4.038452872214732, 3.0989838009135378, 5.539579428223948, 6.891885701669615, 2.193180854073547, 6.563204066585666, 3.6118880780326137, 2.8652811824102637, 7.1973305015934175, 2.1344957379034106, 8.77028311661093, 1.1608721310113763, 7.944827988218597, 1.4389350137451407, 6.89793625325979, 2.239351292073129, 4.009268338558699, 8.809312107847449, 3.348271084220034, 7.508893415904461, 1.4055096874676192, 1.4226148683379545, 8.083295723004941, 1.9469297929205673, 6.269193269040316, 5.645723191730298, 1.6102457968927302, 8.458157842841967, 2.0253695298501833, 1.8309508831261903, 1.5536215466812027, 4.6080675434088985, 1.5500897358540555, 4.162609225621283, 2.2221639170187615, 4.43815966807954, 5.017112085381992, 4.6304877185311275, 1.6171568121016977, 4.638869855502234, 1.4125623676044516, 4.060698626037985, 8.509466045622743, 6.35310789433221, 5.161273266636432, 3.9975616140061287, 4.521739910365788, 6.892087753738393, 2.3566501167978156, 1.8047721116420343, 8.500826126205661, 5.582457375000517, 5.256037512089478, 4.243287465136088, 5.764627908801775, 4.1890664485878455, 1.217097635306077, 2.60916595939987, 2.0195627631446786, 4.941065360199582, 4.340288431272831, 8.73576781572906, 1.2041690477734628, 4.153987740543692, 1.4797279018166825, 8.76681149519845, 6.927681950373332, 6.860097310691785, 2.72989700350982, 7.346914907892572, 2.8431175575145575, 5.497860956277435, 2.163235376522487, 4.283658094762118, 1.6621554927905673, 4.693990133934589, 6.400518948468859, 5.1123652422345875, 7.617071040749231, 3.9011315599774483, 5.388142731362896, 6.271921379341149, 3.715046482179039, 6.884425252125996, 1.3259761900262899, 2.015444272579302, 3.223269949869193, 3.4875046993386962, 1.3359515724521875, 3.155246202327694, 5.5287182181949825, 4.1407616267717025, 2.2860358623757646, 4.267640107794259, 1.7117201776981272, 1.9209007781854073, 2.661276654335819, 3.598644698817951, 4.7813600210287595, 2.317606979473791, 3.724916847274822, 4.71195632715942, 3.8409245699677976, 2.8244082685424083, 4.299028414699025, 7.016115553806919, 4.923293880259686, 1.4561512378399626, 1.4857837495596484, 8.267553329451921, 4.1162676325061565, 7.265183726752607, 2.2840147005437075, 8.183867505013914, 3.0141208125236263, 1.6618254688108067, 2.4606423972981775, 4.397743634830945, 8.568382943647109, 0.995191052881006, 1.0274633402517805, 7.675115657154019, 7.68322759221659, 1.4652781613922141, 7.093626162510598, 8.549215693917144, 2.392119869960666, 5.338616272423615, 4.6884335985364025, 1.133695685806706, 1.0276680447292728, 6.787379691898984, 8.851975807714034, 5.111216227077798, 7.602331411170036, 2.8259317572846783, 4.780278114476463, 6.799838995990016, 4.716641379348752, 8.641301696689114, 7.663852415860596, 7.653295380354855, 1.050987037731069, 2.21739906780886, 4.814485111271467, 7.262889510602661, 4.962816176331156, 1.668269372849322, 5.610351287870697, 2.3209306202098494, 4.088838065433208, 2.314172046233231, 4.619676795882727, 5.4264048402848974, 3.5000677683218635, 1.2438340881875256, 6.882433979194572, 7.625740848593117, 2.611566714310523, 3.486481447737243, 7.371471868515388, 2.4754280846692676, 8.160897543717967, 3.8122880565205466, 4.059763620255603, 6.619907938751719, 5.532812300240376, 1.7750541394527013, 8.24714275776724, 8.038676488554442, 2.661403457498582, 8.858961800958589, 4.421171712024973, 1.422765551199011, 2.890576263155957, 6.727121886271127, 6.216672163367341, 4.945281364940385, 1.7726611067188793, 6.749821264534737, 2.015916035210992, 8.276782825109311, 7.850305237455167, 4.086417698228049, 4.1232461134103575, 4.915775175720644, 2.895694551481447, 1.8305026221620837, 2.5110374972126657, 3.9351629327084945, 7.051247715365844, 3.7668939594743285, 8.861668046852738, 4.140963205582101, 3.5144632056530622, 3.101831013993743, 1.614385485159153, 3.439566652630207, 2.2007641405129386, 4.674559910120974, 7.4946320910104385, 2.593380689995162, 3.9340126323839764, 7.574669025236542, 8.100760918815414, 3.416747331517654, 2.869398588895118, 4.084017547945709, 4.266488163826739, 7.368400017370839, 2.5116567085221284, 2.9482071533470613, 4.76163044041264, 8.277524854620784, 8.557911270167727, 4.799115875510318, 4.5700204576556605, 7.741096405654235, 3.9221125513599064, 1.302628272151687, 3.338632372298771, 6.754883409868759, 5.689735461935402, 5.069269066324784, 6.014991588080941, 8.700186000927738, 7.113777175008117, 2.2251339205096743, 6.305824905976309, 4.193588929030533, 8.016018247169827, 7.687073438309166, 3.590392961142393, 4.47515537304222, 1.628545952893489, 5.758288844961366, 4.265394677319898, 1.8390939578808851, 8.939434914468233, 4.107577008119069, 1.034207270480397, 2.419799406589063, 3.5884716476906267, 7.6951715052643035, 7.456848965513438, 5.046767379203446, 7.181383201868395, 1.069751252863952, 6.184767947740846, 6.846079054103689, 7.567188335666602, 2.2820870660704213, 2.1081214339986647, 3.0127749094370366, 2.3327003486217115, 6.9265145088263935, 5.480479100264502, 3.3298074219626903, 7.07848434919717, 3.9545159911338024, 1.0079442312762423, 6.282982698332137, 8.347272213021737, 8.863875848145176, 6.726101291244947, 2.339584570821043, 3.9297015577006995, 2.315893355192201, 2.6855531209578127, 3.4271361862760203, 4.398978937777993, 6.329517630161612, 2.3592625176526996, 5.190399034598914, 3.3117468891107826, 1.5884912374078959, 6.809505848879682]} \ No newline at end of file +{ + "description": "PHOSPHENE SPECIFICATIONS FILE. 'nPhosphenes': the number of phosphenes. 'eccentricities': the radius (in degrees of visual angle) from the foveal center for each phosphene. 'azimuth_angles': the polar angle (in radians) for each phosphene. 'size': each phosphene's default size (in dva). ", + "nPhosphenes": 1000, + "eccentricities": [21.413866833564345, 29.19684366623315, 20.99444874098965, 12.38444515717461, 16.968641522117935, 10.009168780080044, 28.18298771337443, 0.8000043085413211, 3.683475249502892, 15.62025115785308, 28.713417829520267, 23.19179495264062, 0.9498388356772466, 13.440896256112039, 7.4745385996022, 13.496414790483973, 15.785440811392014, 28.782774373351526, 24.107467608511193, 15.497943715528605, 29.035425569248467, 3.5589317893581756, 12.102145337775225, 21.74067911850779, 15.739580603734268, 21.615842404125164, 2.2645693568755267, 14.346340262399423, 28.068427533660966, 3.2466323888080204, 11.2533061587932, 28.76003423385222, 16.679166547393244, 10.954997869699454, 24.169095644633348, 10.490270808674909, 0.15849957754660302, 9.423167148095116, 14.156271157186447, 27.580815666788496, 28.418735236290875, 12.578295233702557, 24.50762723243799, 23.938676583309505, 6.600763205153188, 3.937287695200546, 28.263977498517516, 5.761991131358906, 6.047330556826855, 24.2831103959194, 9.793892236837014, 4.6484736104555076, 23.317292630485543, 16.857657405613676, 25.78755328422788, 2.504803988230463, 28.035628337893954, 25.574484710848033, 6.804290385323109, 26.694559122744856, 8.688790754796285, 7.929434984351563, 3.5895500170589703, 21.012891467493343, 2.0753377129342483, 14.015298266540483, 23.34420546762085, 4.635294384860764, 27.907373095790735, 17.72398776060048, 3.0553623199734643, 3.4658111118173482, 23.169704040658548, 12.603754339435412, 22.596486753917446, 1.7132846055422608, 12.088918304685139, 17.424204626118417, 26.5327574201959, 13.370405552246073, 12.577467651140669, 6.629218878882401, 2.3255811604897514, 29.735308279380117, 10.88555210193047, 27.06245429426848, 24.75852515654385, 16.1524178147508, 6.801308324824437, 12.75965301897861, 0.17814371362682316, 1.4753307245383946, 2.749315379917328, 18.650660603502907, 18.19232569861102, 12.855150139193348, 11.839695428245227, 29.270158830838604, 14.079566657815782, 0.5165171764989838, 8.246072252779593, 4.973452136861994, 14.706866498028365, 27.756461359076688, 28.777530896528, 24.936523848659167, 8.002910773013273, 26.044134295653976, 20.38652025874614, 7.984698852789446, 6.642505101589249, 4.424558703022465, 20.487995812577054, 4.549992902610191, 13.252995185784306, 10.327632688013118, 3.162143425417717, 15.887431885286937, 20.333075985948767, 5.739603321596374, 24.344565330906704, 2.9045430407126016, 12.123188759715362, 4.516342324481966, 3.3232589942709585, 18.086756654434986, 4.551033764774657, 3.9155173414130107, 18.50021571785587, 26.127149523145917, 6.24984339696604, 8.684999880934946, 14.183531234945782, 2.0032070692933175, 20.3561754413401, 2.338084493165057, 21.156574408456763, 14.026433645902493, 0.06903954027207557, 9.566895866607357, 8.745402989184873, 3.1015364019854963, 9.001901510442499, 4.956645436951511, 8.855393642856042, 14.011728596684689, 20.138085729831577, 2.2331392064559004, 19.766935891292096, 27.602973158765483, 11.607078457939018, 16.169646162312134, 27.48007033706135, 26.469980012569344, 0.27978173180757643, 13.477551307672433, 11.103693631196082, 18.224201213079873, 23.068938840500575, 27.684093003047956, 20.25950400219285, 3.0375635731067643, 10.694657707390226, 5.129868023095549, 13.666601401157127, 1.7436171703632775, 27.174869369083503, 20.77170822262428, 11.178954399923619, 8.996046497120206, 3.3729946929414387, 5.8406814369458075, 28.47010178479454, 8.894234072625894, 15.365052624547978, 21.135482871826778, 10.078899931926877, 14.477773432337615, 10.50916698706976, 11.097960816533918, 2.2758673858931813, 6.539849721404876, 20.613506435804215, 16.86162236189803, 26.27141503248802, 5.3946019598259864, 17.91380068816176, 28.819685854420737, 29.506611320132148, 22.202116391338507, 22.943118145354948, 2.508143827563503, 0.9467998674320548, 4.794819946241005, 25.436849381490237, 18.298308247265684, 2.4643108652811634, 12.14483707166449, 2.1662451691500353, 11.217209935520293, 9.601815071478786, 29.347080785107426, 13.526203928578225, 28.96338697852153, 5.872890791276272, 20.70801610306158, 20.576804291051612, 6.9315311022131, 11.142240393179199, 9.76180553792323, 7.5274005557517745, 22.882828742489043, 24.617242093531615, 24.353594621145337, 15.69818652296033, 4.930633609753838, 0.5712202155334114, 5.708478222878835, 10.138810540994003, 17.138653605161295, 25.777950865244648, 26.78630690246218, 8.579032379371792, 25.57974152435865, 26.49496229881251, 27.1980901805782, 5.946501536263987, 21.761212951769348, 12.301523109133061, 10.658380932781267, 12.755288423891352, 6.461939539541136, 15.145117398718611, 22.976824554411603, 1.8204965095310992, 24.271594115818477, 21.241589545946255, 24.27811097538001, 28.790928481842048, 25.359585364808925, 17.076136006506523, 10.870677687320846, 28.53080607670347, 9.234609313536835, 17.688405046634188, 9.568851698916747, 10.748763379098737, 18.892074611842197, 8.900608629500958, 20.411763902390376, 12.636075355909698, 25.0962074345695, 7.932729244386841, 21.877543807693616, 27.522905627867083, 11.902080231766048, 0.43867036565309375, 8.456557070837265, 26.28546487870801, 4.2852146347807665, 10.121349698612185, 20.93879924935977, 20.651931134369526, 28.038428220868617, 8.452000017686695, 12.378087779005837, 2.9169369876875293, 2.762386726510782, 16.95665107526878, 25.171127913335702, 11.07900630907738, 29.94732942096802, 28.802374587961516, 26.48159839167303, 24.926924593650153, 2.3328537333770956, 28.313121827503814, 15.35891959805832, 9.950017523825682, 13.161264238194574, 16.088991797615922, 11.901609929723165, 16.02147699596836, 2.3580178444698365, 20.13064847208553, 26.10772000062371, 14.295062899990334, 1.9934304680225041, 25.41131939813409, 16.978046995526096, 28.22690622584245, 17.818267110776738, 13.84745885448756, 3.933870806206353, 18.494798619185573, 13.557135225988583, 7.62820136012594, 24.72264646361272, 4.403769438488991, 4.705169713461725, 20.128120175670052, 25.98132529477517, 13.757296573264101, 4.166170823929837, 23.721358162338685, 2.588082047574491, 22.094146838966385, 14.37722750487686, 22.340280930591362, 8.3315544777199, 14.529904902264374, 29.1962264552921, 23.494184391067854, 14.46774570765773, 14.129293610735548, 17.64788648817623, 21.199705114445475, 9.394328380054343, 0.7362473922250994, 5.158151612727143, 4.847624312365371, 11.708927801758136, 29.793156882690084, 15.411982475738396, 1.3470753580403805, 24.753624436583564, 22.8339091132834, 18.947927801389422, 8.107108271985883, 20.55868394011457, 23.903092215616812, 27.736593046414594, 22.310299374559897, 12.214666067774806, 3.2856807318200167, 21.951933049808897, 1.4795977230031916, 18.449025029270075, 18.352007750812803, 25.667980302962466, 0.4600766558390037, 29.132187180718034, 4.694617573059167, 17.041972397793934, 17.405115982902938, 19.930673137766153, 23.677139810450335, 15.425167416893109, 11.800861330716003, 11.168983465023569, 9.624543488214602, 8.518867771899941, 17.868143508305494, 2.928950952760005, 11.843351376447032, 20.63217247474922, 14.16231987194146, 11.67990310348882, 14.706301772823029, 26.45373107523304, 20.042504290251493, 19.01047367756786, 6.423224039698986, 17.998997947649297, 1.0580188701769497, 23.163538512494775, 12.741279590431624, 24.94654147548616, 22.261921387378905, 16.445929706752928, 12.906388250937018, 4.770821931829292, 0.6099179920326289, 17.54630445793964, 3.105007575765415, 6.8116646635069085, 3.0543612747350277, 15.632841663578162, 5.619772425273503, 9.254873796551848, 20.687095581583417, 11.387622427219295, 18.216329330222216, 25.98036071167315, 23.548556218599813, 26.029252461928685, 24.696314106523275, 13.930001575885585, 13.09401693915551, 13.746073511599928, 5.322223537926424, 4.568387972019215, 24.78192230062111, 15.310126719442895, 29.871930004120568, 29.30751914535799, 17.20240419935972, 17.49698697953148, 11.0957518369587, 2.240465031748421, 8.518818614254432, 5.569832136076088, 25.72755902970208, 7.4587408832063025, 4.356337021699877, 16.146184384968493, 14.332678893209067, 11.785170801974157, 29.890872075832227, 29.007264580975367, 13.063353650947846, 20.6853612011264, 1.9133670296965986, 12.727513048670437, 11.4248017761056, 18.444941597708844, 14.149295662233923, 2.5365128354716715, 10.60858002794561, 12.612559177463911, 5.647713500179277, 17.553062448909365, 19.833451025529637, 8.098548470879711, 5.585733570031923, 16.23099653467571, 18.06589255420711, 10.483249485373658, 4.246595647074949, 29.51529406185157, 6.328152703963322, 21.843792374039108, 18.145381305789133, 14.454988509338683, 16.767433814791175, 13.649188804446888, 3.1817333191640174, 19.70510555297283, 10.312967951230501, 24.855259995571565, 15.133881716195281, 4.418102634371893, 2.25723187231203, 7.253559622092396, 21.94120021440953, 11.098726381122955, 19.598190305613866, 26.461110825901446, 22.92667591796142, 9.844675589131135, 2.063218310659635, 4.534190545286838, 23.162429894416917, 18.045500289841712, 18.83960214205596, 12.820097516117528, 20.11108043549615, 5.133462381684163, 28.2657528378206, 11.613785278043919, 26.25197350700392, 21.66496460544917, 16.780166691284002, 10.375981293659363, 10.064220541224563, 16.13435855050937, 25.980649435782556, 23.34083856481846, 12.487290137477574, 21.13901201718658, 9.974837062825634, 13.207683665350116, 18.812370858692933, 14.421759828693643, 25.27656705456661, 14.953048263164717, 29.957370735776085, 8.636986486284787, 18.625568943379253, 24.799792622323835, 6.494610130543384, 13.25733582739539, 23.27247207481958, 12.853731884106837, 7.994197261805211, 11.994888981780587, 20.32107328101524, 10.473832104716493, 26.89808156556743, 1.3825483484864012, 24.287710918313675, 1.3842564139165288, 16.97870631231339, 21.461916493323315, 27.12934838799083, 12.74310685043351, 17.660974358775725, 2.8532808721878977, 16.745564061815326, 2.1199917831436705, 22.333093197005606, 17.50966796910692, 11.486066985015324, 8.012821263984145, 28.2263545096385, 15.182823601530428, 26.74154439099173, 9.51970221824749, 28.07172017107921, 3.2446283327160272, 2.477312389380853, 5.257671435430934, 12.412366917676941, 11.673079990893033, 14.500231398851568, 12.095341847217242, 12.656336131593402, 9.034411713453057, 28.17245677697298, 18.84081479427925, 9.445352733301345, 9.211368958717085, 2.098879594817368, 8.857674873807923, 4.816598814984332, 16.054106297280942, 13.578612048009651, 22.954917295795358, 25.602275073313745, 21.230902791609875, 4.585711718732185, 22.734478702173558, 2.8224929500760383, 13.777893004186485, 26.134936986078724, 8.20868467886475, 29.523808317611948, 18.349906578440226, 19.89439064060241, 0.9228911526543506, 7.091690448663269, 1.823545453865488, 7.580463299095089, 9.556197551721493, 24.73091408106713, 26.185582104492642, 7.029113596576066, 27.012969759206758, 24.988361027681538, 10.137258274493417, 11.893498963724198, 24.149646577636904, 3.950982065461714, 13.063428138802863, 25.45682248551244, 27.498074741343697, 20.441226515061587, 17.265170028955758, 1.2094130768435032, 11.182597785587687, 19.76548974453395, 6.060198543244388, 3.7599499937304137, 21.792768463389233, 27.99737252627287, 11.718228742292471, 26.967260450770503, 29.142521234083002, 2.7603472608982913, 1.4118616717621166, 12.418986890458902, 21.207732923846415, 2.0522334725233184, 0.15798285698729758, 19.392545419975313, 24.670181197820806, 14.872651490465083, 15.059343431992428, 11.09482818464452, 25.488214994296094, 22.99697768453516, 16.069597678335228, 0.6272880183500449, 7.131100930232424, 26.353157226027363, 3.2541274491689234, 9.852481978462935, 22.463909756759342, 16.366025341211767, 10.688081442057303, 13.738122239375127, 23.003446972245047, 2.584951220465727, 6.534030929559439, 1.4511892233478711, 24.026935615815145, 8.304452061022063, 13.86425156459694, 18.16425494069459, 7.610527305481324, 1.6238548799091983, 19.604176500999024, 19.071977038775227, 21.22124144372253, 3.323525734792149, 11.245661513544862, 2.705549182441392, 17.356935543718087, 21.667777178720918, 16.819722865379138, 27.99756786662364, 0.23683690343888225, 3.8260345124953616, 15.532842321950994, 12.915540300320465, 10.901176650118995, 25.431939570760367, 24.6055706099185, 28.312328323521207, 24.76680563877386, 0.4437300605005453, 2.4493573428747615, 20.214586755212995, 3.4662360162077603, 3.5156845206337852, 16.716775600630548, 1.0856549403365237, 8.783555399174029, 17.645656699653472, 11.217274103684643, 21.99527073267946, 18.628567596746457, 25.772824417025646, 12.08641097355, 9.65985760304604, 0.4635646201517939, 23.65372783683382, 22.494552679872257, 9.536399524114424, 10.309434986059898, 28.02464858060979, 1.4836940672233387, 0.4990047366821547, 5.232872291461418, 0.538837274853462, 9.459566917110825, 4.969449822492664, 28.081310956628922, 23.69687050504203, 21.214974621623, 8.91488601958641, 23.15009128848807, 17.76859117862846, 6.014276845508286, 2.100366784415651, 0.46609389323695133, 7.402665054192373, 26.43043256706984, 20.16510441607503, 6.6148454050935275, 4.1726133124812375, 21.93942331630464, 1.4741481193078776, 17.763497438748292, 1.7744557177373166, 15.701014559010208, 0.324225382396677, 3.558976432857336, 12.311798726599536, 15.103561547087928, 2.997127181694934, 26.041659632874254, 2.463728239152897, 2.5074195738764455, 3.2856632904288468, 19.62746534426039, 22.396208971778435, 0.1226136283433421, 12.132226946325662, 5.295881673575512, 15.257156131819215, 20.74802020533552, 7.867815314110365, 25.23857857551939, 25.57216326016974, 11.36924805746018, 6.647619780416628, 13.936417471882358, 22.817893480157178, 16.971544606156055, 20.923374191718334, 17.367315783063432, 15.924534979180686, 7.332710281744983, 5.106830175114937, 13.933280326111422, 25.978754771992534, 7.303548730232297, 29.83812432038187, 23.28005970307088, 26.021813687402307, 14.615590349257788, 20.806575880346465, 4.169537051461351, 8.736598932235053, 21.271742450328787, 3.999250975612116, 3.610610267504, 11.909795230858162, 27.198563270612187, 5.20701191407022, 5.618444546003766, 27.93631431674596, 8.283193506960856, 12.393965645039572, 29.98782909573119, 11.194146454249596, 21.31570058339568, 21.22026074462934, 4.47711672724765, 7.577699284620548, 19.929742200096243, 2.699247169820373, 11.474198270805246, 7.951189253425764, 17.103422855839806, 22.174571381261057, 4.554428202775802, 20.94201524969625, 9.874580292622303, 7.074804434038489, 23.319989380975315, 4.334359017137791, 29.218561687290986, 0.683270491292661, 26.123104955819738, 1.726006301544278, 22.197260949724214, 4.727567345274232, 11.364756269595123, 29.36492040442793, 8.886016565825127, 24.488350309641724, 1.6006613280035724, 1.6648057562673286, 26.642358961268528, 3.6309867234521285, 19.839474758901183, 17.501461968988618, 2.3684217383477377, 28.048091910657377, 3.9251357369381874, 3.1960658117232144, 2.1560808000545113, 13.61025328778337, 2.142836509452708, 11.939784596079813, 4.663114688820355, 12.973098755298274, 15.144170320182472, 13.694328944491728, 2.3943380453813665, 13.725761958133377, 1.6271088785166936, 11.557619847642444, 28.240497671085286, 20.154154603745788, 15.68477474988662, 11.320856052522982, 13.286524663871704, 22.17532907651897, 5.167437937991808, 3.097895418657629, 28.208097973271233, 17.264215156251936, 16.040140670335543, 12.242327994260332, 17.947354658006656, 12.038999182204421, 0.8941161323977886, 6.114372347749513, 3.9033603617925445, 14.85899510074843, 12.606081617273116, 29.08912930898398, 0.8456339291504853, 11.907454027038845, 1.87897963181256, 29.205543106994188, 22.308807313899994, 22.055364915094188, 6.567113763161824, 23.880930904597143, 6.991690840679592, 16.946978586040384, 4.442132661959327, 12.393717855357945, 2.563083097964627, 13.932463002254709, 20.33194605675822, 15.501369658379705, 24.894016402809616, 10.959243349915429, 16.535535242610855, 19.84970517252931, 10.261424308171398, 22.146594695472483, 1.3024107125985869, 3.8879160221723814, 8.417262312009473, 9.408142622520112, 1.3398183966957034, 8.162173258728853, 17.062693318231183, 11.857856100393883, 4.902634483909115, 12.333650404228473, 2.748950666367977, 3.533377918195278, 6.309787453759322, 9.824917620567316, 14.260100078857848, 5.021026173026716, 10.298438177280582, 13.999836226847824, 10.73346713737924, 6.92153100703403, 12.451356555121343, 22.64043332677594, 14.792352050973822, 1.790567141899859, 1.9016890608486818, 27.333324985444705, 11.766003621898088, 23.574438975322277, 4.895055127038902, 27.019503143802176, 7.632953046963598, 2.5618455080405256, 5.557408989868168, 12.821538630616045, 28.46143603867666, 0.06196644830377215, 0.18298752594417675, 25.11168371432757, 25.14210347081221, 1.8247931052208035, 22.931098109414744, 28.38955885218929, 5.300449512352497, 16.34981102158856, 13.911625994511509, 0.5813588217751477, 0.18375516773477307, 21.78267384462119, 29.524909278927623, 15.497060851541741, 24.838742791887633, 6.9272440898175445, 14.256042929286737, 21.82939623496256, 14.01740517255782, 28.73488136258418, 25.069446559477235, 25.029857676330707, 0.2712013914915091, 4.645246504283225, 14.384319167268002, 23.56583566475998, 14.940560661241836, 2.5860101481849584, 17.368817329515114, 5.033489825786934, 11.663142745374529, 5.008145173374616, 13.653787984560228, 16.679018151068366, 9.455254131206988, 0.9943778307032212, 22.139127421979648, 24.926528182224192, 6.123375178664462, 9.404305429014661, 23.973019506932705, 5.612855317509753, 26.933365788942375, 10.626080211952049, 11.554113575958509, 21.154654770318945, 17.07804612590141, 2.9864530229476296, 27.256785341627147, 26.47503683207916, 6.310262965619683, 29.55110675359471, 12.909393920093652, 1.6653708169962913, 7.169660986834838, 21.556707073516726, 19.64252061262753, 14.874805118526444, 2.9774791501957982, 21.641829742005267, 3.8896851320412202, 27.36793559415992, 25.768644640456877, 11.654066368355183, 11.792172925288842, 14.764156908952415, 7.188854568055426, 3.1943848331078137, 5.746390614547496, 11.086860997656855, 22.772178932621916, 10.455852348028731, 29.56125517569777, 11.85861202093288, 9.509237021198983, 7.961866302476537, 2.383945569346825, 9.228374947363276, 4.58286552692352, 13.859599662953649, 24.43487034128914, 6.055177587481857, 11.082547371439912, 24.73500884463703, 26.707853445557806, 9.142802493191203, 7.09024470835669, 11.645065804796406, 12.32933061435027, 23.961500065140648, 5.7487126569579825, 7.38577682505148, 14.186114151547399, 27.370718204827938, 28.422167263128976, 14.326684533163695, 13.467576716208727, 25.35911152120338, 11.037922067599649, 1.2148560205688268, 8.849871396120392, 21.660812787007846, 17.666507982257755, 15.339758998717938, 18.88621845530353, 28.955697503479016, 23.006664406280436, 4.674252201911279, 19.976843397411162, 12.055958483864496, 26.39006842688685, 25.156525393659376, 9.793973604283973, 13.11183264890833, 2.437047323350583, 17.92358316860512, 12.325230039949616, 3.2266023420533183, 29.85288092925587, 11.73341378044651, 0.20827726430148907, 5.404247774708986, 9.786768678839849, 25.186893144741134, 24.293183620675396, 15.255377672012925, 23.26018700700648, 0.34156719823981924, 19.52287980402817, 22.002796452888834, 24.70695625874976, 4.88782649776408, 4.2354553774949935, 7.627905910388887, 5.077626307331418, 22.304429408098976, 16.881796625991882, 8.816777832360088, 22.874316309489387, 11.159434966751759, 0.1097908672859086, 19.89118511874551, 27.632270798831513, 29.569534430544408, 21.552879842168554, 5.1034421405789105, 11.066380841377622, 5.0146000819707535, 6.400824203591798, 9.181760698535076, 12.826171016667471, 20.065691113106045, 5.1772344411976245, 15.793996379745929, 8.749050834165434, 2.2868421402796093, 21.86564693329881], + "azimuth_angles": [4.859882829594482, 3.1580895138590495, 1.4044753601525262, 5.008803833706702, 3.4769745038292243, 0.6791529025159111, 6.265725911582326, 5.031143090839389, 2.523458078713225, 3.4571172215650243, 3.3792975864148342, 1.6946071291210683, 1.8017200634459551, 0.7886975317856294, 1.5667945784750077, 2.6624224889615395, 4.03226997870497, 4.312247164960384, 5.658456440336376, 1.5854179063954792, 1.7942712332290733, 3.5478366885898627, 0.06073234274867444, 0.8274279974488429, 4.728972652016946, 4.269347804366569, 2.403756905402542, 3.949247673011707, 3.489616080342574, 4.256231530601479, 1.252451796534356, 4.088850475733263, 3.590399325585582, 5.52331230946381, 5.770535668036253, 5.073338097672129, 3.7328393518707492, 2.8659220880690333, 5.073665363066673, 4.701433925967848, 4.876885535073427, 2.7507912168593154, 3.3694911974317323, 4.532707778690352, 3.3202318876560892, 0.2698920683740133, 4.057544210918872, 1.4881496314969858, 2.277803190773961, 3.000272938674095, 0.04332847058640298, 2.1917156198320544, 2.068698982504426, 0.8008643772082961, 1.7985594613947913, 5.6075730844093075, 0.4189826204669631, 4.146279041194001, 4.154977412326777, 3.1396640925920045, 3.617917795335923, 3.1177374502225454, 1.2453802893910353, 5.122851047532403, 0.8304211982524936, 5.426203899794403, 2.652113976727718, 4.563072282479524, 4.983424584820807, 4.592422918630915, 5.132390990249527, 0.18497110300391342, 3.80566724962096, 5.417508612691812, 0.8438914726596176, 3.936553226588656, 1.9322990253386698, 0.7662155953280425, 5.866817458516487, 4.217243629576935, 2.143212715193736, 3.68702813650289, 6.130194176012326, 1.821525864065965, 4.48166782511645, 3.616778752213433, 6.2681659627067825, 0.21812532017093084, 4.925013089688573, 1.7771614912824374, 4.84123110380467, 2.133221346542606, 0.3488910085190796, 1.7879317070082437, 0.1079201520778481, 0.23539971110365795, 3.7894710041892257, 3.0091886755344692, 0.5111211529350379, 0.35243222835782606, 0.42185297531860705, 4.658989798220262, 5.674395637910227, 1.9290686817410367, 3.0955099789060543, 4.015824549315975, 4.9927930690564555, 2.7971624192440525, 1.6854333346035295, 1.5031052621492966, 6.217705634852806, 4.068859099453741, 2.176020791406129, 6.1673766465942785, 5.3752269233878645, 3.3604011000395175, 4.033926175108115, 2.649755958528121, 4.1092932319062365, 2.3656946320615377, 4.80716900617249, 0.9079547849137234, 0.8056163581872795, 0.19855691383189808, 2.6555762697887806, 1.2569849318041995, 0.6224281578297772, 4.231635666044433, 4.2713987233850474, 5.466794768084683, 1.8218382948216767, 2.1006345600066805, 0.85844126764419, 4.8780236238943795, 4.833566768741664, 1.636174309661769, 3.118510939908449, 3.7698006382427907, 2.97119197215243, 3.998868199783991, 4.21174014512757, 1.3613083946537876, 3.0992599168014126, 5.801361664327407, 1.3635291628137418, 4.029598839459785, 1.0777122529641805, 4.155845660200829, 2.9776767651184994, 4.651377468744158, 1.9822815442616042, 3.441713976277056, 3.2941360578936996, 3.030201422807685, 5.538792256698668, 2.170998383569185, 3.5106240260937476, 3.7837424015407413, 3.840378937651843, 0.5623590130168538, 0.46634455929888446, 5.863165625658525, 0.673053762079538, 5.642333502560593, 0.49585436664945903, 1.1617045810276982, 3.900829098472287, 1.2892055725833014, 5.347479891712668, 2.1546162943705047, 1.7406503326190241, 1.7747283920261405, 2.58502437909766, 1.2413606394123191, 1.7190955251076085, 1.815628970240758, 4.7335476917709425, 3.681550886590169, 0.815278971851724, 3.660006772899565, 1.4235283771579148, 0.039737277685803124, 3.1251120971734356, 4.951359541390147, 5.215411298282589, 4.7751400527371075, 3.6259268529991644, 5.148858621573975, 3.830276002340225, 5.79483976611738, 0.7852568833192407, 0.10590121357836507, 2.7056246407872306, 0.2473972447953334, 6.219474662980338, 5.648738817432396, 3.603887804345311, 4.700927409599659, 3.826579103980484, 5.08267485424171, 4.2249992220790995, 0.04894764178103042, 4.133479228955319, 0.8029243895661471, 1.6452921812881451, 5.304161362629032, 2.2499086647996425, 3.248443521985818, 2.362323286704407, 3.993931102767197, 5.812667301751952, 5.185085280629832, 3.874443152903798, 4.541500423099835, 0.7757991582668632, 0.785702419365159, 4.468517405157386, 4.385136786824667, 5.462172236392177, 5.152068908026154, 4.479031894453127, 0.5295500300387863, 1.5296903016916374, 5.34074189248092, 4.713975064224336, 0.14492587384369265, 4.6106010999885525, 4.321028652343963, 0.39618402950478404, 5.61306620619172, 0.3895452130095014, 6.200000198502267, 3.7423092652667704, 4.745835680379385, 2.4012113363507606, 3.695938723052792, 2.521290989185053, 0.7679156941734784, 0.7393530168754255, 0.07657174294063566, 1.5767453923056367, 2.5157518640280574, 3.4705184294957836, 4.5666467196534635, 3.3189762102195592, 2.391068942881622, 3.244515382983233, 0.3159046476074528, 4.964934804553405, 4.492852050889943, 1.5115252977435516, 2.702024229052965, 0.2901587341035038, 5.912396871605963, 4.399949727117193, 6.088128814991011, 3.699836701008021, 3.9423787690445717, 0.13639061804914085, 4.197723212225727, 4.145979702093493, 2.063960025636775, 4.858086669601173, 3.6236564617871916, 5.075151050939156, 3.189376001022722, 1.9904485677920842, 0.05538684521688738, 2.30351859342387, 2.1639442224168333, 0.3986997436260282, 1.7179967392828277, 5.147202990455325, 2.4034082313837, 1.3592980306261708, 2.889848304009496, 0.3183060829743303, 1.7420118064670524, 5.00642491649865, 2.451079710890725, 4.1151598007985575, 5.972116381631783, 4.378031068796548, 0.6749813466470561, 1.7962978895069865, 5.7479655892777854, 0.9447395926073241, 1.6953639137965069, 3.2495037441085937, 3.9799069649930927, 0.4219472955531035, 6.079777100603833, 0.7434268473923759, 6.0634316327813655, 0.25585883954247396, 1.4190739654374904, 0.6811687537237526, 2.335575362351258, 4.546647381911737, 3.7192713391623644, 4.0705664385743665, 5.121075846091169, 2.4301683387559683, 3.0346506026497027, 5.198109771242185, 3.6488134291566485, 3.454647286769834, 2.5601868750173242, 4.355629215751514, 2.081454122800097, 4.373517264949288, 5.051422677516273, 2.720694002508473, 1.7450571742154453, 0.6330074029676945, 5.465918706855622, 2.978629387796238, 2.590386863253518, 0.1777738424160802, 5.163950801149249, 0.48722362295431465, 3.6791424066386855, 2.7850849539752174, 3.4432620229482196, 1.136368097425293, 2.373995327188849, 5.085316485348548, 5.012699621603489, 0.6915417041890036, 5.907785288840092, 2.2729408719449973, 2.0622976125531034, 3.560815981428262, 2.6951890798310663, 2.076019893260916, 3.4164349773372535, 5.75975787257914, 2.055551737404653, 0.6893224437879496, 3.276187657751226, 6.114363158631364, 1.4007417243439646, 3.6289666951939505, 5.318354536134493, 5.18898078827536, 4.438138702954155, 3.4082950105753755, 5.249461185100266, 2.556442838650678, 2.282245172186374, 3.109737763187296, 5.13270960398358, 1.6923711490699442, 1.9268910926455924, 3.326805886618897, 0.6365785165838814, 1.6088151551680339, 5.5094427849510295, 1.5131007138476509, 5.386469910219349, 1.6207807659800708, 3.434672463221763, 2.9903736832112715, 1.8040286513574626, 1.5223037107070725, 3.018597032066272, 3.3418450487001037, 2.623192865346557, 3.6930236921951423, 4.308489778921331, 2.2996328632740886, 4.932585904210228, 0.6818431864463936, 0.4355506450724012, 4.342595821654176, 1.8518032921563887, 1.8954172181443358, 4.757899661582952, 5.063395537608032, 4.0611423933879625, 6.0979106839404755, 1.5233469727413305, 0.916741548155379, 3.688011802804246, 2.770706228654754, 0.3297399720175852, 5.134675403211523, 2.0006227197286686, 1.8111691226295794, 0.1998748103882227, 5.351124806891173, 3.884686366450602, 1.3458203791772236, 4.029587781986691, 4.375222996343757, 5.793620685352992, 4.090456200735684, 0.4154940270520547, 4.928907905891028, 2.41566602026365, 4.739209068321927, 0.3394338377757699, 0.7430031344641442, 0.7125515932617317, 4.934445148459197, 5.655105801771292, 2.368110076973357, 0.7899106360221684, 1.316272149782213, 3.533400661969407, 1.689162622017864, 4.040343233321296, 1.6873623729697844, 5.596079364054307, 1.4573009753088244, 5.1972100310611715, 1.3313026745990295, 6.161369238230105, 2.2220825331516316, 1.6670480100736487, 0.830306570760897, 5.331363806364601, 3.822186683899631, 5.4810651991303665, 3.5386438004251755, 1.364736944094578, 5.5735765683981935, 2.5486439791621534, 2.7690868557781325, 4.3792798933801365, 4.330343871232624, 2.345683995433601, 4.346804366710401, 2.950371796770931, 0.6809772401100245, 0.5377104783131198, 1.6555848046980568, 1.7581692682979497, 5.844323635077647, 4.480739088733546, 0.7856410218973594, 1.8494517697089934, 5.486012026479419, 5.809025546177084, 1.9574680680573633, 4.416793353050936, 0.9000781192008113, 5.161710618279483, 2.548663182148483, 3.7435074490526645, 0.9087795536921273, 1.627308265836547, 5.066300945887924, 1.7993345352995365, 1.272727699346943, 5.106509082168216, 1.1641439262946853, 0.5329697826925847, 3.468550915876708, 1.3258330794033641, 3.5909258783045535, 1.3502081299835667, 0.1164657312149525, 1.711462804929827, 0.5302866279663709, 0.9693396141399151, 3.128230282111506, 2.6599055350569354, 1.745021266608895, 1.2526298982879385, 5.42006584320883, 4.3463431270813695, 5.472629358431246, 2.6986367356173506, 2.1309586981499336, 0.22605043713801218, 0.556887789184952, 4.809459824863922, 1.6384581029830796, 0.9567357080795322, 2.5811706528591594, 5.920760701092774, 5.432160945059371, 1.2532059095311605, 3.248017972921955, 4.542697598343031, 4.747077358498984, 5.5594532698386505, 3.245918436984415, 1.7698071135403068, 0.725447039911629, 4.106012069394583, 1.4102637828000384, 3.348878388811049, 6.075958966722322, 2.6498235927839136, 5.525026449344806, 4.307795472515346, 0.5504685790426416, 4.257011140551699, 6.059013020310914, 0.05791755668813062, 1.3863271611923778, 0.19599618825766935, 2.4959132481856345, 1.1119261229776891, 5.782453166824724, 3.1569722791868964, 3.829358247672067, 6.084624418306174, 0.09709615835951566, 0.47761233539407644, 2.510948162829699, 3.0763115349175263, 2.563245368033095, 0.34291893009858965, 3.4797713061031788, 2.3133193398164815, 5.251487743205399, 4.933109082871783, 0.2671321727994984, 5.0149354245677955, 5.35591317680223, 2.3685319529057813, 5.843964549139272, 5.598633696221211, 2.5889970959749475, 3.6558179688473795, 6.078525070146823, 2.284534891993604, 4.082050834649991, 6.109239015348956, 1.1762992011262499, 1.0800430372518248, 3.1922532605954936, 2.8672526717147684, 1.8882696730679651, 2.2920283788294293, 4.588617539755446, 1.3984254445578517, 3.983163721299558, 3.6944005496878565, 4.009582388042449, 4.253393523283488, 4.930784307257478, 5.039330712270759, 5.848627495703203, 1.3091565175882618, 1.246211210176224, 0.7167099278885979, 3.8023503054340826, 0.3430883379208218, 0.8206687060996677, 2.522544741583742, 3.754671593769693, 0.897129235670099, 2.633413243958111, 3.485659640780242, 0.19646605533585357, 2.2895734004108785, 4.664531124761797, 4.2598781186170935, 6.19568932247573, 0.5838747932355054, 3.568387578146279, 0.3601513133915662, 3.499521751607868, 0.7580656224709854, 2.742137166348759, 4.632472473910646, 2.2326053175155187, 2.761826450515205, 3.836993813484013, 3.83494588840224, 0.3930774326866181, 1.1862974922590783, 2.7304845833937743, 5.390455971512836, 4.756461049111292, 0.8428867509723842, 0.6002556677179839, 1.291815488256258, 0.2711764712041093, 5.9164108155840385, 4.60572415198976, 2.88003269923339, 1.905902139960931, 3.852152273059066, 5.410529425339475, 6.182774393628925, 1.6795159175011285, 4.406795123927092, 1.3148675225338513, 6.089539711667241, 5.647625896613768, 2.3941635734299456, 1.6847580354674825, 1.9264269803863474, 0.9206998886871759, 5.34900935560933, 5.220517921309459, 5.153835570546411, 2.1442000416014664, 6.218879753491104, 0.12309725785146536, 5.749951362333958, 0.756650435536063, 4.72233546440589, 2.4973594354461772, 2.1383422408499593, 3.6865673460895527, 5.657698753576957, 1.3333862038084454, 0.8341346959251639, 3.759507032416754, 3.828033956654728, 5.808360627023631, 1.5344789485851444, 5.131291899986059, 2.0293087579785576, 2.574491600465223, 1.7443599386003705, 1.9470808273252624, 1.6475399917395674, 6.187256509327439, 4.535554708420481, 0.47981610475583125, 5.243115971380526, 5.673257948031315, 3.0307321579605815, 4.258640272219976, 3.4541912984491345, 1.1737700498332693, 2.1246607210576407, 5.962289596382675, 5.23158174890708, 2.398245241314854, 6.27001868803372, 5.803132282360458, 4.223336418129503, 5.950401301677067, 0.42980740474296664, 1.5776779993892613, 2.7510775644724914, 0.023714120790868803, 4.119914794872155, 0.23757282811227087, 2.2337939501468846, 6.006831817609987, 4.789073466985567, 2.6570871656091435, 0.3604920223309688, 5.1583793946548315, 5.852590412954339, 5.321882360555033, 6.136299940960195, 0.09154961231101526, 5.689964881389718, 5.9306432327085, 1.9898139837293578, 6.013103050541767, 3.2491334333358433, 0.977186688746726, 0.7520603196669237, 3.2114209673536083, 4.439892856097744, 4.934237066425503, 0.5128796540820278, 0.8471403344733226, 0.26611391554858976, 0.6410202231470683, 3.9117293274572087, 1.7643258929491916, 2.4728809803642435, 2.7980030528982516, 5.879096747926947, 4.900651069146252, 4.1688029606309955, 0.9472510317362587, 4.313569321900124, 6.138347605981752, 2.5765040253623077, 1.5661521300618466, 5.252184662204696, 3.460461702006133, 3.452719277834649, 1.9592670145245465, 3.2726573165591755, 5.173929990317845, 4.327221321343856, 1.6244618313008952, 2.2003388196988376, 0.627605312154719, 1.5812738549578125, 5.6454762258848525, 4.986251876279439, 2.120584881083149, 1.7148160234444045, 1.8517390371974005, 2.570137412955028, 0.2876578740575303, 4.33606680003796, 6.022191153053323, 2.9413263345836516, 0.3135079678087858, 2.8210523076103597, 2.3144212823834427, 6.0754022021574485, 4.757171430116167, 1.2842365244125906, 5.343823624759226, 5.241633300175101, 3.34964426575148, 1.4038898570625529, 6.063071348063357, 1.9163529481484303, 1.8854024811222618, 3.705324735589635, 0.02264652891898048, 2.9398685713094865, 5.458661843405438, 3.181812410949361, 1.5809043356984338, 3.7493907479597604, 3.3227869119848017, 2.149495903873837, 3.718490730461311, 5.32464006248824, 2.1773160820500954, 4.1532991196331475, 2.3696441219640154, 1.9689080338975011, 0.5777506686510037, 6.055187461576077, 3.0076803573726596, 1.9371517749453229, 3.4680800657896826, 0.02119717923212975, 4.0826027138171375, 3.4097053339665804, 4.206755351145071, 1.110004113868182, 4.943704680908838, 5.752691248223845, 0.006863279115916702, 2.139473236348028, 0.3394906144917232, 5.012028050986301, 1.430451385592603, 1.416157429655464, 0.002427065079623252, 2.4316907913180983, 5.480017267642809, 5.9163601478563725, 2.313649781478618, 2.1920432600336093, 1.3072128221753876, 4.277839383212066, 2.8273807776439517, 3.6703469438476093, 5.56513324683219, 4.506838055126787, 3.3584139240600144, 4.483154138700696, 1.2671428725101628, 1.2229891558855424, 4.063581901116903, 0.8370321716871786, 1.3523548934241727, 5.800149544790287, 2.3634930018278126, 1.4656302881200292, 2.042246129894828, 0.294830143264437, 2.7000868466817325, 3.4172551001241644, 0.8401188294011045, 5.900804088429491, 1.3381836260676319, 1.3236247642231374, 2.0263160411890726, 5.445018795895197, 1.1811907886092807, 1.6467510649055166, 3.796839774776699, 3.9972007926640676, 1.6415669754035174, 0.26766071520187934, 0.1588177036727488, 1.7382973471587124, 1.4915013960893813, 2.7358654737797083, 1.9024832867902597, 2.7016380851386765, 6.052874807675858, 1.0621837484745507, 5.485805471688112, 3.7041482823869325, 2.581983853185555, 4.069431314456028, 2.331426383264414, 4.59009682463298, 1.89005751245014, 6.22893687331343, 1.9463853312915669, 2.7000032374235055, 3.54291719522386, 3.496874893230419, 5.705628125918518, 0.6199312536787626, 0.9551620579439647, 1.0805008315287188, 2.8329762894861292, 5.938906891952003, 4.746194161159279, 3.366533969526519, 2.1469597485496426, 0.2311472340669799, 4.209303124336771, 0.42282701623856017, 0.690871624472085, 2.691667412289564, 3.821255143580893, 3.634868011295497, 1.8795577187473202, 0.639604128111298, 2.0492526643118865, 0.1653458611787464, 3.722985647043856, 3.74415826193459, 5.212136053903072, 3.044604196384839, 1.654285052051495, 3.3727969180186466, 0.07421388779517095, 2.4215568395011466, 4.5396218623784526, 5.32355416885004, 2.6144319161651164, 4.79554396733532, 3.701165354379603, 0.3949578152006619, 5.3220999203081405, 1.0267569084199228, 3.7713638922762565, 0.26954858678040555, 1.772808318423323, 3.098881484971462, 5.592159757841543, 1.3608366933842766, 5.98556183851014, 4.483129877050244, 5.837372995826528, 3.1402233099673103, 1.4844185659522242, 4.527388086962962, 0.15700413904698496, 4.932182964710092, 2.951225161486603, 4.466846701186752, 3.7626003776226575, 1.9824062409730407, 0.50054989279708, 6.127146988986243, 0.36651333325319735, 2.501811068495707, 2.466151797787246, 5.576642587706359, 3.077274049837853, 4.609687328192588, 1.7676773289145489, 5.8386131805460515, 1.205965510322167, 2.1355718153562973, 5.962001048890576, 5.069096515022538, 5.667810317053513, 3.3166444300401476, 5.320032769942325, 1.000035703925588, 4.977633388546737, 0.15988215787889054, 3.0641209557239115, 6.272862910479465, 3.393626684650123, 1.3194686253582342, 4.4382827328385615, 2.224404912567688, 0.7042960071852348, 0.45014927256276155, 0.9411829768270586, 4.985580672644867, 1.3047076302103333, 3.7017854372238284, 2.238344260223597, 5.469819432864844, 1.5262050978544455, 1.26318343866402, 3.2657037702896083, 5.026964072248926, 4.713645562743595, 0.6778846786464079, 1.310133982639452, 3.6835949461600657, 3.0318208437455034, 4.209041414206848, 1.357672233926796, 3.170451392924767, 1.3220931457563352, 1.8983691699053495, 4.107286164708252, 4.644709355862788, 1.2491756969465229, 5.237596986561315, 5.962570789144616, 1.2983592496883636, 2.0309242439314117, 4.189710371799017, 4.410020315481048, 2.613625312402386, 5.928341041342568, 4.104259252437342, 0.19016784642952278, 5.629519653320755, 5.771427998275156, 5.375287606873518, 1.5101795260073052, 3.4111204103245845, 4.437660825604935, 2.8501207017824246, 5.292753264654788, 2.355805954189234, 0.843495336644898, 5.883118618811768, 2.9436729020159915, 3.691492509688613, 6.26801472756807, 3.4224244108121935, 4.0463061576137305, 3.690669444160079, 4.2654107162306065, 5.767254523164227, 3.463620258433992, 2.467555942846039, 4.550800333868309, 1.7361306419684903, 1.0457684312679631, 4.385534548646664, 3.558442519307602, 2.9570230014125825, 0.41028372692206455, 4.789630527694952, 1.5961423528655427, 4.504269987692567, 1.6325675370890365, 2.8939286272816886, 5.038443299051928, 2.201932277463606, 5.096097305438736, 1.2111661082376513, 3.0230998929351043, 1.3391741147943357, 3.9422744409121493, 0.9218506754445844, 2.557460725855917, 0.15810985909676012, 3.7931542819071447, 3.1294372769273546, 4.036923522812236, 3.695607906092962, 2.353525555538718, 3.2290631836868267, 0.7442825992160133, 6.03092325605242, 4.799765787458211, 6.140055219213622, 0.059229757429028536, 2.5418281441688175, 4.655051671582077, 1.3993936278743542, 5.461512496543318, 5.34645655660665, 5.007572382274898, 4.63759024823851, 4.091729934875328, 4.18683088808027, 4.84267636526862, 3.398358145611024, 1.6653982238043932, 1.2776626678547585, 2.310291262138224, 3.658335981881485, 5.763505499313008, 0.3691893378417332, 5.007618256351419, 5.202689919592113, 1.6813635939133333, 5.156422819659089, 1.146129196474305, 1.3522772728434675], + "sizes": [6.689031155617159, 8.76449164432884, 6.577186330930573, 4.281185375246563, 5.50363773923145, 3.647778341354678, 8.494130056899849, 1.1920011489443523, 1.9609267332007714, 5.144066975427488, 8.635578087872071, 7.1631453207041655, 1.2319570228472656, 4.562905668296543, 2.9718769598939203, 4.577710610795727, 5.188117549704538, 8.654073166227073, 7.407324695602985, 5.111451657474294, 8.721446818466259, 1.9277151438288467, 4.205905423406727, 6.776181098268743, 5.175888160995806, 6.74289130776671, 1.5825518285001403, 4.804357403306513, 8.463580675642925, 1.844435303682139, 3.97954830901152, 8.648009129027258, 5.426444412638199, 3.8999994319198543, 7.423758838568892, 3.776072215646643, 1.0209332206790942, 3.4915112394920307, 4.753672308583053, 8.333550844476934, 8.5569960630109, 4.332878728987348, 7.5140339286501305, 7.362313755549201, 2.73887018804085, 2.028610052053479, 8.515727332938004, 2.5151976350290415, 2.5912881484871613, 7.454162772245174, 3.5903712631565368, 2.2182596294548023, 7.196611368129478, 5.474041974830313, 7.855347542460767, 1.646614396861457, 8.454834223438388, 7.798529256226142, 2.7931441027528288, 8.097215766065295, 3.295677534612343, 3.0931826624937497, 1.9358800045490587, 6.582104391331558, 1.5320900567824662, 4.716079537744129, 7.203788124698892, 2.214745169296204, 8.420632825544196, 5.705063402826795, 1.7934299519929238, 1.902882963151293, 7.157254410842279, 4.339667823849443, 7.00439646771132, 1.4355425614779362, 4.202378214582704, 5.625121233631578, 8.054068645385573, 4.544108147265619, 4.332658040304178, 2.746458367701974, 1.5988216427972668, 8.908082207834697, 3.8814805605147917, 8.19532114513826, 7.580940041745026, 5.285978083933546, 2.79234888661985, 4.381240805060963, 1.0261716569671528, 1.3720881932102387, 1.7118174346446209, 5.952176160934108, 5.829953519629604, 4.406706703784893, 4.135918780865394, 8.784042354890294, 4.733217775417542, 1.116404580399729, 3.1776192674078914, 2.304920569829865, 4.900497732807564, 8.380389695753784, 8.652674905740799, 7.628406359642444, 3.112776206136873, 7.923769145507727, 6.41507206899897, 3.107919694077186, 2.7500013604237994, 2.158548987472657, 6.442132216687215, 2.1919981073627177, 4.512798716209148, 3.7327020501368318, 1.8219049134447245, 5.21531516940985, 6.400820262919672, 2.5092275524257, 7.470550754908456, 1.7532114775233603, 4.211517002590763, 2.1830246198618575, 1.8648690651389221, 5.801801774515996, 2.192275670606575, 2.022804624376803, 5.912057524761565, 7.945906539505578, 2.6452915725242776, 3.2946666349159854, 4.7609416626522085, 1.512855218478218, 6.4069801176906935, 1.6021558648440155, 6.620419842255137, 4.719048972240666, 0.9970772107392201, 3.529838897761962, 3.3107741304492997, 1.8057430405294657, 3.3791737361179996, 2.3004387831870696, 3.340104971428278, 4.715127625782584, 6.34882286128842, 1.5741704550549067, 6.249849571011226, 8.339459509004127, 4.073887588783738, 5.290572309949903, 8.306685423216361, 8.037328003351826, 1.0532751284820203, 4.572680348712649, 3.939651634985622, 5.8384536568213, 7.130383690800153, 8.361091467479456, 6.3812010672514266, 1.788683619495137, 3.830575388637394, 2.3466314728254796, 4.623093706975234, 1.4436312454302074, 8.225298498422267, 6.517788859366474, 3.9597211733129645, 3.377612399232055, 1.878131918117717, 2.536181716518882, 8.570693809278543, 3.350462419366905, 5.076014033212794, 6.61479543248714, 3.6663733151805005, 4.839406248623364, 3.781111196551936, 3.938122884409045, 1.5855646362381817, 2.722626592374634, 6.475601716214457, 5.475099296506142, 7.984377341996805, 2.4172271892869297, 5.755680183509802, 8.66391622784553, 8.847096352035239, 6.899231037690268, 7.096831505427986, 1.6475050206836006, 1.2311466313152144, 2.257285318997601, 7.761826501730729, 5.858215532604182, 1.6358162307416435, 4.217289885777197, 1.556332045106676, 3.9699226494720783, 3.5391506857276767, 8.804554876028647, 4.585654380954193, 8.702236527605741, 2.544770877673672, 6.500804294149756, 6.465814477613763, 2.82707496059016, 3.949930771514453, 3.5818148101128613, 2.985973481533806, 7.080754331330411, 7.543264558275099, 7.472958565638756, 5.164849739456088, 2.293502295934357, 1.1309920574755765, 2.5009275261010226, 3.6823494775984007, 5.548974294709679, 7.852786897398574, 8.121681840656581, 3.2664086344991445, 7.7999310731623055, 8.043989946350003, 8.231490714820854, 2.5644004096703963, 6.781656787138492, 4.259072829102149, 3.8209015820750043, 4.380076913037694, 2.7018505438776366, 5.017364639658297, 7.105819881176428, 1.4641324025416265, 7.451091764218259, 6.643090545585668, 7.452829593434669, 8.656247595157879, 7.741222763949047, 5.532302935068407, 3.877514049952225, 8.586881620454259, 3.441229150276489, 5.69557467910245, 3.5303604530444654, 3.845003567759663, 6.016553229824586, 3.3521623012002553, 6.4218037073041, 4.3482867615759195, 7.670988649218534, 3.0940611318364906, 6.812678348718297, 8.318108167431221, 4.152554728470946, 1.095645430840825, 3.2337485522232705, 7.9881239676554685, 2.121390569274871, 3.677693252963249, 6.562346466495938, 6.485848302498542, 8.4555808588983, 3.232533338049785, 4.279490074401556, 1.756516530050008, 1.7153031270695418, 5.500440286738342, 7.690967443556189, 3.9330683490873017, 8.964621178924805, 8.659299890123071, 8.040426237779476, 7.625846558306708, 1.6007609955672255, 8.52883248733435, 5.074378559482218, 3.632004673020182, 4.4883371301852195, 5.269064479364245, 4.152429314592844, 5.251060532258229, 1.6074714251919564, 6.346839592556141, 7.940725333499656, 4.790683439997423, 1.5102481248060011, 7.755018506169091, 5.506145865473625, 8.505841660224654, 5.730204562873798, 4.671322361196681, 2.0276988816550277, 5.910612965116153, 4.593902726930289, 3.012853696033584, 7.571372390296726, 2.1530051835970645, 2.2333785902564602, 6.346165380178681, 7.907020078606712, 4.647279086203761, 2.0896455530479567, 7.304362176623648, 1.6688218793531975, 6.870439157057701, 4.8125940013004955, 6.9360749148243634, 3.200414527391973, 4.853307973937166, 8.76432705474456, 7.243782504284761, 4.836732188708728, 4.746478296196146, 5.684769730180328, 6.6319213638521255, 3.4838209013478254, 1.1749993045933598, 2.354173763393905, 2.2713664832974323, 4.10104741380217, 8.92350850205069, 5.088528660196905, 1.3378867621441015, 7.5796331830889505, 7.067709096875573, 6.031447413703845, 3.140562205862902, 6.460982384030552, 7.352824590831149, 8.375091479043892, 6.928079833215973, 4.235910951406615, 1.8548481951520046, 6.8325154799490395, 1.3732260594675179, 5.898406674472021, 5.872535400216748, 7.823461414123323, 1.101353774890401, 8.747249914858143, 2.230564686149111, 5.523192639411716, 5.620030928774117, 6.293512836737641, 7.292570616120089, 5.0920446445048295, 4.125563021524267, 3.957062257339618, 3.5452115968572273, 3.250364739173318, 5.743504935548132, 1.7597202540693344, 4.136893700385875, 6.480579326599791, 4.755285299184389, 4.093307494263685, 4.900347139419473, 8.032994953395477, 6.323334477400398, 6.048126314018097, 2.691526410586396, 5.778399452706478, 1.2608050320471866, 7.155610269998607, 4.3763412241151, 7.631077726796309, 6.915179036634375, 5.364247921800781, 4.420370200249871, 2.250885848487811, 1.1413114645420344, 5.657681188783904, 1.8066686868707773, 2.795110576935176, 1.7931630065960074, 5.147424443620843, 2.4772726467396007, 3.446633012413826, 6.495225488422244, 4.015365980591812, 5.836354488059258, 7.906762856446175, 7.258281658293283, 7.919800656514316, 7.564350428406207, 4.6933337535694895, 4.470404517108136, 4.644286269759981, 2.39792627678038, 2.196903459205124, 7.587179280165629, 5.061367125184772, 8.944514667765484, 8.794005105428797, 5.5659744531625925, 5.644529861208395, 3.9375338231889865, 1.5761240084662456, 3.2503516304678484, 2.463955236286957, 7.83934907458722, 2.9676642355216805, 2.140356539119967, 5.284315835991598, 4.800714371522417, 4.121378880526442, 8.949565886888594, 8.713937221593431, 4.46222764025276, 6.49476298696704, 1.4888978745857595, 4.3726701463121165, 4.02528047362816, 5.897317759389025, 4.751812176595713, 1.6550700894591124, 3.807621340785496, 4.342015780657042, 2.4847236000478072, 5.659483319709164, 6.267586940141236, 3.1382795922345896, 2.4681956186751797, 5.3069324092468575, 5.79623801445523, 3.7741998627663094, 2.11109217255332, 8.849411749827086, 2.666174054390219, 6.8036779664104285, 5.817435014877101, 4.833330269156982, 5.449982350610981, 4.618450347852503, 1.8271288851104048, 6.233361480792755, 3.728791453661467, 7.606735998819084, 5.0143684576520755, 2.156827369165838, 1.5805951659498745, 2.9129492325579722, 6.829653390509208, 3.9383270349661212, 6.204850748163697, 8.034962886907053, 7.092446911456379, 3.60391349043497, 1.5288582161759026, 2.187784145409824, 7.155314638511179, 5.790800077291124, 6.002560571214923, 4.397359337631341, 6.34162144946564, 2.34758996844911, 8.516200756752161, 4.075676074145044, 7.979192935201046, 6.755990561453113, 5.453377784342401, 3.745595011642497, 3.6624588109932166, 5.281162280135832, 7.906839849542014, 7.2028902839515885, 4.308610703327353, 6.615736537916422, 3.638623216753502, 4.500715644093364, 5.995298895651448, 4.824469287651638, 7.719084547884428, 4.966146203510592, 8.967298862873623, 3.2818630630092764, 5.9454850515678, 7.591944699286357, 2.7105627014782354, 4.513956220638771, 7.184659219951888, 4.40632850242849, 3.110452603148056, 4.177303728474823, 6.3976195416040635, 3.7716885612577316, 8.151488417484648, 1.3473462262630405, 7.4553895782169795, 1.3478017103777409, 5.50632168328357, 6.701844398219551, 8.21315957013089, 4.376828493448936, 5.688259829006861, 1.7395415659167726, 5.444150416484086, 1.543997808838312, 6.934158185868162, 5.647911458428513, 4.041617862670753, 3.1154190037291056, 8.5056945359036, 5.027419627074781, 8.109745170931127, 3.5172539248659977, 8.464458712287788, 1.843900888724274, 1.639283303834894, 2.3807123827815824, 4.288631178047185, 4.091487997571475, 4.845395039693752, 4.204091159257931, 4.353689635091573, 3.3878431235874817, 8.491321807192795, 6.002883945141132, 3.4974273955470254, 3.435031722324556, 1.5383678919512982, 3.340713299682113, 2.2630930173291555, 5.259761679274917, 4.599629879469241, 7.099977945545428, 7.805940019550332, 6.6402407444293, 2.201523124995249, 7.041194320579614, 1.73133145335361, 4.6527714677830625, 7.947983196287659, 3.167649247697266, 8.851682218029852, 5.87197508758406, 6.283837504160644, 1.22477097404116, 2.8697841196435383, 1.4649454543641303, 3.000123546425357, 3.5269860137923983, 7.573577088284567, 7.961488561198037, 2.8530969590869506, 8.182125269121801, 7.642229607381743, 3.6819355398649116, 4.150266390326453, 7.418572420703174, 2.0322618841231237, 4.462247503680763, 7.767152662803317, 8.311486597691651, 6.429660404016424, 5.582712007721536, 1.3011768204916008, 3.9606927428233836, 6.249463931875721, 2.5947196115318367, 1.9813199983281105, 6.790071590237128, 8.444632673672766, 4.103527664611326, 8.169936120205469, 8.750005662422135, 1.7147592695728775, 1.3551631124698977, 4.2903965041223735, 6.634062113025711, 1.525928926006218, 1.020795428529946, 6.1500121119934175, 7.557381652752215, 4.944707064124022, 4.994491581864647, 3.9372875159052056, 7.77552399847896, 7.111194049209376, 5.263892714222727, 1.145943471560012, 2.880293581395313, 8.006175260273963, 1.846433986445046, 3.6059951942567823, 6.969042601802491, 5.342940090989805, 3.8288217178819477, 4.642165930500033, 7.112919192598678, 1.6679869921241937, 2.7210749145491837, 1.3656504595594323, 7.385849497550704, 3.1931872162725505, 4.675800417225851, 5.822467984185225, 3.00814061479502, 1.4116946346424528, 6.206447066933073, 6.06452721034006, 6.637664384992674, 1.864940195944573, 3.9775097369452967, 1.700146448651038, 5.6071828116581575, 6.756740580992246, 5.463926097434436, 8.444684764432973, 1.0418231742503685, 1.9989425366654299, 5.1207579525202656, 4.422810746752125, 3.8856471066983986, 7.760517218869431, 7.540152162644935, 8.528620886272323, 7.583148170339697, 1.0969946828001453, 1.6318286247666032, 6.369223134723465, 1.9029962709887362, 1.916182538835676, 5.43647349350148, 1.2681746507564062, 3.3209481064464077, 5.684175119907593, 3.9699397609825717, 6.84407219538119, 5.946284692465722, 7.851419844540172, 4.201709592946666, 3.5546286941456104, 1.102283898707145, 7.286327423155685, 6.977214047965936, 3.5217065397638465, 3.7278493296159727, 8.45190628816261, 1.3743184179262236, 1.1117345964485745, 2.3740992777230447, 1.1223566066275898, 3.5012178445628863, 2.303853285998044, 8.467016255101045, 7.297832134677875, 6.635993232432801, 3.3559696052230428, 7.15202434359682, 5.716957647634255, 2.582473825468876, 1.5387644758441734, 1.1029583715298534, 2.9527106811179666, 8.02678201788529, 6.356027844286675, 2.7426254413582742, 2.091363549994997, 6.829179551014572, 1.371772831815434, 5.715599316999544, 1.4518548580632844, 5.1656038824027215, 1.065126768639114, 1.9277270487619562, 4.261812993759876, 5.006283079223447, 1.7779005817853155, 7.923109235433134, 1.635660863774106, 1.647311886367052, 1.8548435441143591, 6.212657425136103, 6.950989059140917, 1.0113636342248913, 4.213927185686844, 2.390901779620137, 5.047241635151791, 6.5114720547561395, 3.0767507504294307, 7.708954286805171, 7.797910202711931, 4.0104661486560484, 2.7513652747777675, 4.695044659168629, 7.063438261375246, 5.504411894974948, 6.558233117791556, 5.609950875483583, 5.225209327781516, 2.9340560751319957, 2.340488046697317, 4.694208086963046, 7.906334605864676, 2.926279661395279, 8.935499818768498, 7.186682587485567, 7.917816983307283, 4.876157426468744, 6.527086901425725, 2.0905432137230266, 3.3084263819293476, 6.651131320087678, 2.045133593496564, 1.9414960713344, 4.154612061562176, 8.231616872163249, 2.367203177085392, 2.4769185456010043, 8.42835048446559, 3.187518268522895, 4.283724172010553, 8.975421092194983, 3.963772387799892, 6.662853488905516, 6.637402865234489, 2.1725644605993732, 2.999386475898813, 6.293264586692333, 1.6984659119520995, 4.038452872214732, 3.0989838009135378, 5.539579428223948, 6.891885701669615, 2.193180854073547, 6.563204066585666, 3.6118880780326137, 2.8652811824102637, 7.1973305015934175, 2.1344957379034106, 8.77028311661093, 1.1608721310113763, 7.944827988218597, 1.4389350137451407, 6.89793625325979, 2.239351292073129, 4.009268338558699, 8.809312107847449, 3.348271084220034, 7.508893415904461, 1.4055096874676192, 1.4226148683379545, 8.083295723004941, 1.9469297929205673, 6.269193269040316, 5.645723191730298, 1.6102457968927302, 8.458157842841967, 2.0253695298501833, 1.8309508831261903, 1.5536215466812027, 4.6080675434088985, 1.5500897358540555, 4.162609225621283, 2.2221639170187615, 4.43815966807954, 5.017112085381992, 4.6304877185311275, 1.6171568121016977, 4.638869855502234, 1.4125623676044516, 4.060698626037985, 8.509466045622743, 6.35310789433221, 5.161273266636432, 3.9975616140061287, 4.521739910365788, 6.892087753738393, 2.3566501167978156, 1.8047721116420343, 8.500826126205661, 5.582457375000517, 5.256037512089478, 4.243287465136088, 5.764627908801775, 4.1890664485878455, 1.217097635306077, 2.60916595939987, 2.0195627631446786, 4.941065360199582, 4.340288431272831, 8.73576781572906, 1.2041690477734628, 4.153987740543692, 1.4797279018166825, 8.76681149519845, 6.927681950373332, 6.860097310691785, 2.72989700350982, 7.346914907892572, 2.8431175575145575, 5.497860956277435, 2.163235376522487, 4.283658094762118, 1.6621554927905673, 4.693990133934589, 6.400518948468859, 5.1123652422345875, 7.617071040749231, 3.9011315599774483, 5.388142731362896, 6.271921379341149, 3.715046482179039, 6.884425252125996, 1.3259761900262899, 2.015444272579302, 3.223269949869193, 3.4875046993386962, 1.3359515724521875, 3.155246202327694, 5.5287182181949825, 4.1407616267717025, 2.2860358623757646, 4.267640107794259, 1.7117201776981272, 1.9209007781854073, 2.661276654335819, 3.598644698817951, 4.7813600210287595, 2.317606979473791, 3.724916847274822, 4.71195632715942, 3.8409245699677976, 2.8244082685424083, 4.299028414699025, 7.016115553806919, 4.923293880259686, 1.4561512378399626, 1.4857837495596484, 8.267553329451921, 4.1162676325061565, 7.265183726752607, 2.2840147005437075, 8.183867505013914, 3.0141208125236263, 1.6618254688108067, 2.4606423972981775, 4.397743634830945, 8.568382943647109, 0.995191052881006, 1.0274633402517805, 7.675115657154019, 7.68322759221659, 1.4652781613922141, 7.093626162510598, 8.549215693917144, 2.392119869960666, 5.338616272423615, 4.6884335985364025, 1.133695685806706, 1.0276680447292728, 6.787379691898984, 8.851975807714034, 5.111216227077798, 7.602331411170036, 2.8259317572846783, 4.780278114476463, 6.799838995990016, 4.716641379348752, 8.641301696689114, 7.663852415860596, 7.653295380354855, 1.050987037731069, 2.21739906780886, 4.814485111271467, 7.262889510602661, 4.962816176331156, 1.668269372849322, 5.610351287870697, 2.3209306202098494, 4.088838065433208, 2.314172046233231, 4.619676795882727, 5.4264048402848974, 3.5000677683218635, 1.2438340881875256, 6.882433979194572, 7.625740848593117, 2.611566714310523, 3.486481447737243, 7.371471868515388, 2.4754280846692676, 8.160897543717967, 3.8122880565205466, 4.059763620255603, 6.619907938751719, 5.532812300240376, 1.7750541394527013, 8.24714275776724, 8.038676488554442, 2.661403457498582, 8.858961800958589, 4.421171712024973, 1.422765551199011, 2.890576263155957, 6.727121886271127, 6.216672163367341, 4.945281364940385, 1.7726611067188793, 6.749821264534737, 2.015916035210992, 8.276782825109311, 7.850305237455167, 4.086417698228049, 4.1232461134103575, 4.915775175720644, 2.895694551481447, 1.8305026221620837, 2.5110374972126657, 3.9351629327084945, 7.051247715365844, 3.7668939594743285, 8.861668046852738, 4.140963205582101, 3.5144632056530622, 3.101831013993743, 1.614385485159153, 3.439566652630207, 2.2007641405129386, 4.674559910120974, 7.4946320910104385, 2.593380689995162, 3.9340126323839764, 7.574669025236542, 8.100760918815414, 3.416747331517654, 2.869398588895118, 4.084017547945709, 4.266488163826739, 7.368400017370839, 2.5116567085221284, 2.9482071533470613, 4.76163044041264, 8.277524854620784, 8.557911270167727, 4.799115875510318, 4.5700204576556605, 7.741096405654235, 3.9221125513599064, 1.302628272151687, 3.338632372298771, 6.754883409868759, 5.689735461935402, 5.069269066324784, 6.014991588080941, 8.700186000927738, 7.113777175008117, 2.2251339205096743, 6.305824905976309, 4.193588929030533, 8.016018247169827, 7.687073438309166, 3.590392961142393, 4.47515537304222, 1.628545952893489, 5.758288844961366, 4.265394677319898, 1.8390939578808851, 8.939434914468233, 4.107577008119069, 1.034207270480397, 2.419799406589063, 3.5884716476906267, 7.6951715052643035, 7.456848965513438, 5.046767379203446, 7.181383201868395, 1.069751252863952, 6.184767947740846, 6.846079054103689, 7.567188335666602, 2.2820870660704213, 2.1081214339986647, 3.0127749094370366, 2.3327003486217115, 6.9265145088263935, 5.480479100264502, 3.3298074219626903, 7.07848434919717, 3.9545159911338024, 1.0079442312762423, 6.282982698332137, 8.347272213021737, 8.863875848145176, 6.726101291244947, 2.339584570821043, 3.9297015577006995, 2.315893355192201, 2.6855531209578127, 3.4271361862760203, 4.398978937777993, 6.329517630161612, 2.3592625176526996, 5.190399034598914, 3.3117468891107826, 1.5884912374078959, 6.809505848879682]} \ No newline at end of file diff --git a/Scripts/DSPVEyeTracking.cs b/Scripts/DSPVEyeTracking.cs deleted file mode 100644 index 0890419..0000000 --- a/Scripts/DSPVEyeTracking.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using UnityEngine; -using ViveSR.anipal.Eye; -using EyeFramework = ViveSR.anipal.Eye.SRanipal_Eye_Framework; - - -namespace Xarphos.Scripts -{ - // [RequireComponent(typeof(DSPV_SimulationController))] - public class DSPVEyeTracking : MonoBehaviour - { - - public enum EyeTrackingConditions - { - GazeIgnored = 0, - SimulationFixedToGaze = 1, - GazeAssistedSampling = 2, - } - - // Added for Eye Tracking Implementation - [SerializeField] private Camera simCam; - internal bool EyeTrackingAvailable { get; private set; } - - private void Start() - { - EyeTrackingAvailable = SRanipal_Eye_Framework.Instance.EnableEye; - } - - private void FixedUpdate() - { - EyeTrackingAvailable = CheckFrameworkStatusErrors(); - } - - internal bool EyeTrackingStep(out Vector2 eyePosition) - { - eyePosition = Vector2.zero; - if (!EyeTrackingAvailable) - { - return false; - } - VerboseData vData; - SRanipal_Eye_v2.GetVerboseData(out vData); - var gazeDir = vData.combined.eye_data.gaze_direction_normalized; - gazeDir.x *= -1; // ToDo: This should not be necessary? Why is ray mirrored? - - RaycastHit hit; - if (Physics.Raycast(simCam.transform.position, gazeDir, out hit)) - { - eyePosition = hit.textureCoord; - return true; - } - - return false; - } - - private bool CheckFrameworkStatusErrors() - { - return EyeFramework.Status == EyeFramework.FrameworkStatus.WORKING && - EyeFramework.Status != EyeFramework.FrameworkStatus.NOT_SUPPORT; - } - - private int Gcf(int a, int b) - { - while (b != 0) - { - int temp = b; - b = a % b; - a = temp; - } - return a; - } - } -} diff --git a/Scripts/EyeTracking.cs b/Scripts/EyeTracking.cs new file mode 100644 index 0000000..602d988 --- /dev/null +++ b/Scripts/EyeTracking.cs @@ -0,0 +1,309 @@ +using System; +using System.Runtime.InteropServices; +using TMPro; +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.InputSystem; +using ViveSR.anipal; +using ViveSR.anipal.Eye; +using EyeFramework = ViveSR.anipal.Eye.SRanipal_Eye_Framework; + + +namespace Xarphos.Scripts +{ + public class EyeTracking : MonoBehaviour + { + [SerializeField] private LayerMask HallwayLayerMask; + + [Header("Eye Tracking Parameter")] + [SerializeAs("Sphere Cast Radius")]public float spCastR = 0.01f; + [SerializeAs("Sphere Cast Max Distance")]public float spCastDist = 20f; + + private static EyeData_v2 _eyeData; + private EyeParameter eyeParameter; + private bool eyeCallbackRegistered; + #region all eye data attributes + public GazeRayParameter gaze; + private static UInt64 eye_valid_L, eye_valid_R; // The bits explaining the validity of eye data. + private static float openness_L, openness_R; // The level of eye openness. + private static float pupil_diameter_L, pupil_diameter_R; // Diameter of pupil dilation. + private static Vector2 pos_sensor_L, pos_sensor_R; // Positions of pupils. + private static Vector3 gaze_origin_L, gaze_origin_R; // Position of gaze origin. + private static Vector3 gaze_direct_L, gaze_direct_R; // Direction of gaze ray. + private static float frown_L, frown_R; // The level of user's frown. + private static float squeeze_L, squeeze_R; // The level to show how the eye is closed tightly. + private static float wide_L, wide_R; // The level to show how the eye is open widely. + private static double gaze_sensitive; // The sensitive factor of gaze ray. + private static float distance_C; // Distance from the central point of right and left eyes. + private static bool distance_valid_C; // Validity of combined data of right and left eyes. + + private static int track_imp_cnt = 0; + private static TrackingImprovement[] track_imp_item; + + private static long MeasureTime, CurrentTime, MeasureEndTime; + private static float time_stamp; + private static int frame; + #endregion + + private PhospheneSimulator sim; + internal bool eyeTrackingAvailable { get; private set; } + + public enum EyeTrackingConditions { GazeIgnored = 0, SimulationFixedToGaze = 1, GazeAssistedSampling = 2 } + +#region Unity Event Functions + private void Start() + { + // Headset needs a few frames to register and initialise + // start register and check functions with a delay + // ToDo: Is there a "VR-Ready" Event to subscribe to? + Invoke(nameof(SystemCheck), .5f); + Invoke(nameof(RegisterCallback), .5f); + + // find reference to simulator + sim = GetComponent(); + } + + private void FixedUpdate() + { + if (!CheckFrameworkStatusErrors()) + { + eyeTrackingAvailable = false; + Debug.LogWarning("Framework Responded failure to work."); + } + } + + private void Update() + { + if (!eyeTrackingAvailable) + { + SetEyePositionToCenter(); + return; + } + + FocusInfo focusInfo; + // try to get focus point from combined gaze origin + if (GetFocusPoint(GazeIndex.COMBINE, out focusInfo)) {} + // if that fails, try to get focus point using left eye + else if (GetFocusPoint(GazeIndex.LEFT, out focusInfo)) {} + // if left also fails try right eye + else if (GetFocusPoint(GazeIndex.RIGHT, out focusInfo)) {} + // if all 3 have failed, don't update eye position + else return; + + // use focus point to update eye position on screen + CalculateScreenEyePosition(focusInfo.point); + } + + private void SetEyePositionToCenter() + { + // calculate a point in the world backwards from a point centred in the screen + var P = sim.targetCamera.ViewportToWorldPoint( + new Vector3(.5f, .5f, 10f), Camera.MonoOrStereoscopicEye.Mono); + CalculateScreenEyePosition(P); + } + + private void CalculateScreenEyePosition(Vector3 P) + { + // projection from local space to clip space + var lMat = sim.targetCamera.GetStereoNonJitteredProjectionMatrix(Camera.StereoscopicEye.Left); + var rMat = sim.targetCamera.GetStereoNonJitteredProjectionMatrix(Camera.StereoscopicEye.Right); + var cMat = sim.targetCamera.nonJitteredProjectionMatrix; + // projection from world space into local space + var world2cam = sim.targetCamera.worldToCameraMatrix; + // 4th dimension necessary in graphics to get scale + var P4d = new Vector4(P.x, P.y, P.z, 1f); + // point in world space * world2cam -> local space point + // local space point * projection matrix = clip space point + var lProjection = lMat * world2cam * P4d; + var rProjection = rMat * world2cam * P4d; + var cProjection = cMat * world2cam * P4d; + // scale and shift from clip space [-1,1] into view space [0,1] + var lViewSpace = (new Vector2(lProjection.x, lProjection.y) / lProjection.w) * .5f + .5f * Vector2.one; + var rViewSpace = (new Vector2(rProjection.x, rProjection.y) / rProjection.w) * .5f + .5f * Vector2.one; + var cViewSpace = (new Vector2(cProjection.x, cProjection.y) / cProjection.w) * .5f + .5f * Vector2.one; + + // ToDo: Update only when valid; Consider gaze smoothing; Play with SrAnipal GazeParameter + sim.SetEyePosition(lViewSpace, rViewSpace, cViewSpace); + } + + /// + /// Adapted from SRanipal implementation. Rewritten to be more specific and thus more efficient. + /// Casts a ray against all colliders when enable eye callback function. + /// + /// A source of eye gaze data. + /// Information about where the ray focused on. + /// Indicates whether the ray hits a collider. + private bool GetFocusPoint(GazeIndex index, out FocusInfo focusInfo) + { + SingleEyeData eye_data = index switch + { + GazeIndex.LEFT => _eyeData.verbose_data.left, + GazeIndex.RIGHT => _eyeData.verbose_data.right, + GazeIndex.COMBINE => _eyeData.verbose_data.combined.eye_data, + _ => throw new ArgumentOutOfRangeException(nameof(index), index, null) + }; + bool valid = eye_data.GetValidity(SingleEyeDataValidity.SINGLE_EYE_DATA_GAZE_DIRECTION_VALIDITY); + + if (!valid) + { + focusInfo = new FocusInfo(); + } + else + { + Vector3 direction = eye_data.gaze_direction_normalized; + direction.x *= -1; + + Ray rayGlobal = new Ray(sim.targetCamera.transform.position, + sim.targetCamera.transform.TransformDirection(direction)); + RaycastHit hit; + if (spCastR == 0) valid = Physics.Raycast(rayGlobal, out hit, spCastDist, HallwayLayerMask); + else valid = Physics.SphereCast(rayGlobal, spCastR, out hit, spCastDist, HallwayLayerMask); + focusInfo = new FocusInfo + { + point = hit.point, + normal = hit.normal, + distance = hit.distance, + collider = hit.collider, + rigidbody = hit.rigidbody, + transform = hit.transform + }; + } + + return valid; + } + + private bool CheckFrameworkStatusErrors() + { + return EyeFramework.Status == EyeFramework.FrameworkStatus.WORKING; + } + #endregion + +#region EyeData Setup + private void SystemCheck() + { + if (EyeFramework.Status == EyeFramework.FrameworkStatus.NOT_SUPPORT) + { + eyeTrackingAvailable = false; + Debug.LogWarning("Eye Tracking Not Supported"); + return; + } + + + var eyeDataResult = SRanipal_Eye_API.GetEyeData_v2(ref _eyeData); + var eyeParamResult = SRanipal_Eye_API.GetEyeParameter(ref eyeParameter); + var resultEyeInit = SRanipal_API.Initial(SRanipal_Eye_v2.ANIPAL_TYPE_EYE_V2, IntPtr.Zero); + + if ( + eyeDataResult != ViveSR.Error.WORK || + eyeParamResult != ViveSR.Error.WORK || + resultEyeInit != ViveSR.Error.WORK + ) + { + Debug.LogError("Inital Check failed.\n" + + $"[SRanipal] Eye Data Call v2 : {eyeDataResult}" + + $"[SRanipal] Eye Param Call v2: {eyeParamResult}" + + $"[SRanipal] Initial Eye v2 : {resultEyeInit}" + ); + eyeTrackingAvailable = false; + return; + } + + eyeTrackingAvailable = true; + } + + private void RegisterCallback() + { + var eyeParameter = new EyeParameter(); + SRanipal_Eye_API.GetEyeParameter(ref eyeParameter); + + if (SRanipal_Eye_Framework.Instance.EnableEyeDataCallback && !eyeCallbackRegistered) + { + SRanipal_Eye_v2.WrapperRegisterEyeDataCallback( + Marshal.GetFunctionPointerForDelegate((SRanipal_Eye_v2.CallbackBasic)EyeCallback) + ); + eyeCallbackRegistered = true; + } + + else if (!SRanipal_Eye_Framework.Instance.EnableEyeDataCallback && eyeCallbackRegistered) + { + SRanipal_Eye_v2.WrapperUnRegisterEyeDataCallback( + Marshal.GetFunctionPointerForDelegate((SRanipal_Eye_v2.CallbackBasic)EyeCallback) + ); + eyeCallbackRegistered = false; + } + } +#endregion + +#region EyeTracking Data Collection + [MonoPInvokeCallback] + private static void EyeCallback(ref EyeData_v2 eyeDataRef) + { + var eyeParameter = new EyeParameter(); + SRanipal_Eye_API.GetEyeParameter(ref eyeParameter); + _eyeData = eyeDataRef; + + var fetchResult = SRanipal_Eye_API.GetEyeData_v2(ref _eyeData); + if (fetchResult != ViveSR.Error.WORK) return; + + MeasureTime = DateTime.Now.Ticks; + time_stamp = _eyeData.timestamp; + frame = _eyeData.frame_sequence; + eye_valid_L = _eyeData.verbose_data.left.eye_data_validata_bit_mask; + eye_valid_R = _eyeData.verbose_data.right.eye_data_validata_bit_mask; + openness_L = _eyeData.verbose_data.left.eye_openness; + openness_R = _eyeData.verbose_data.right.eye_openness; + pupil_diameter_L = _eyeData.verbose_data.left.pupil_diameter_mm; + pupil_diameter_R = _eyeData.verbose_data.right.pupil_diameter_mm; + pos_sensor_L = _eyeData.verbose_data.left.pupil_position_in_sensor_area; + pos_sensor_R = _eyeData.verbose_data.right.pupil_position_in_sensor_area; + gaze_origin_L = _eyeData.verbose_data.left.gaze_origin_mm; + gaze_origin_R = _eyeData.verbose_data.right.gaze_origin_mm; + gaze_direct_L = _eyeData.verbose_data.left.gaze_direction_normalized; + gaze_direct_R = _eyeData.verbose_data.right.gaze_direction_normalized; + gaze_sensitive = eyeParameter.gaze_ray_parameter.sensitive_factor; + frown_L = _eyeData.expression_data.left.eye_frown; + frown_R = _eyeData.expression_data.right.eye_frown; + squeeze_L = _eyeData.expression_data.left.eye_squeeze; + squeeze_R = _eyeData.expression_data.right.eye_squeeze; + wide_L = _eyeData.expression_data.left.eye_wide; + wide_R = _eyeData.expression_data.right.eye_wide; + distance_valid_C = _eyeData.verbose_data.combined.convergence_distance_validity; + distance_C = _eyeData.verbose_data.combined.convergence_distance_mm; + track_imp_cnt = _eyeData.verbose_data.tracking_improvements.count; + } +#endregion + +#region EyeData Clean Up & Necessities + void OnApplicationQuit() + { + Release(); + } + + private void OnDisable() + { + Release(); + } + + /// + /// Release callback thread when disabled or quit + /// + private void Release() + { + Debug.Log("Releasing..."); + if (eyeCallbackRegistered) + { + SRanipal_Eye_v2.WrapperUnRegisterEyeDataCallback( + Marshal.GetFunctionPointerForDelegate((SRanipal_Eye_v2.CallbackBasic)EyeCallback) + ); + eyeCallbackRegistered = false; + } + } + + /// + /// Required class for IL2CPP scripting backend support + /// + internal class MonoPInvokeCallbackAttribute : Attribute { } +#endregion + + } +} diff --git a/Scripts/DSPVEyeTracking.cs.meta b/Scripts/EyeTracking.cs.meta similarity index 100% rename from Scripts/DSPVEyeTracking.cs.meta rename to Scripts/EyeTracking.cs.meta diff --git a/Scripts/PhospheneConfig.cs b/Scripts/PhospheneConfig.cs index 930c9cb..126bcd0 100644 --- a/Scripts/PhospheneConfig.cs +++ b/Scripts/PhospheneConfig.cs @@ -1,6 +1,10 @@ +using System; using UnityEngine; using System.IO; -using System.Collections.Generic; +using System.Linq; +using System.Text; +using MathNet.Numerics; +using MathNet.Numerics.Random; namespace Xarphos.Scripts @@ -10,20 +14,39 @@ public struct Phosphene { public Vector2 position; public float size; - public float activation; - public float trace; + public Vector2 activation; // activation pro phosphene is eye dependent as stimulation is different (texture offset) + public Vector2 trace; // same reason as activation + } + + public struct CortexModelParameters + { + public bool dipoleModel; + public float a; + public float b; + public float k; } public class PhospheneConfig { // Data class containing the phosphene configuration (count, locations, sizes) // instances can be directly deseriallized from a JSON file using the 'load' method - public string description = "PHOSPHENE SPECIFICATIONS FILE. 'nPhosphenes': the number of phosphenes. 'eccentricities': the radius (in degrees of visual angle) from the foveal center for each phosphene. 'azimuth_angles': the polar angle (in radians) for each phosphene. 'size': each phosphene's default size (in dva). "; + public Phosphene[] phosphenes; + public string description = "PHOSPHENE SPECIFICATIONS. 'nPhosphenes': the number of phosphenes. 'eccentricities': the radius (in degrees of visual angle) from the foveal center for each phosphene. 'azimuth_angles': the polar angle (in radians) for each phosphene. 'size': each phosphene's default size (in dva). "; public int nPhosphenes; public float[] eccentricities; public float[] azimuth_angles; public float[] sizes; + // approximation of human field of vision + public const int TotalFOV = 120; + // generally values are found to be: k = 15~17, a ~ .7, b = 120~180 + // according to Horten&Hoyt (ToDo: Double check if ref is correc) + public static CortexModelParameters Monopole = new() { dipoleModel = false, a = .75f, k = 17.3f }; + // following Wu et al. + public static CortexModelParameters Dipole = new() { dipoleModel = true, k = 20.13f, a = 1.717f, b = 7.5e5f }; + // maureen's unknown paper ref + public static CortexModelParameters Dipole2 = new() { dipoleModel = true, k = 15, a = .7f, b = 120 }; + public static PhospheneConfig load(string filename) { string json = System.IO.File.ReadAllText(filename); @@ -37,23 +60,171 @@ public void save(string filename) Debug.Log("Saved phosphene configuration to " + filename); } - public static Phosphene[] InitPhosphenesFromJSON(string filename, Vector2 FieldOfView) + public static PhospheneConfig InitPhosphenesFromJSON(string filename) { // Initializes a struct-array with all phosphenes. Note that this struct // array (Phosphene) contains more properties than only position and size - PhospheneConfig config = PhospheneConfig.load(filename); + PhospheneConfig config = load(filename); Debug.Log(config.nPhosphenes); Debug.Log(config.description); - Phosphene[] phosphenes = new Phosphene[config.nPhosphenes]; + config.phosphenes = new Phosphene[config.nPhosphenes]; for (int i=0; i + /// Initialises a phosphene configuration probabilistically with approximations from the literature + /// + /// The number of phosphenes to generate across the entire FOV + /// Max radius of phosphenes in fraction of total fov [0,1) + /// Which cortex model to use for magnification factor along with the parameters + /// If true, creates a png picture of phosphenes at maxixum stimulation + /// The config object holding the initialised phosphenes and underlying data + public static PhospheneConfig InitPhosphenesProbabilistically(int nPhosphenes, float maxEccentricity, CortexModelParameters parameters, bool createPictureOfLayout=false) + { + var config = new PhospheneConfig + { + nPhosphenes = nPhosphenes, + eccentricities = new float[nPhosphenes], + azimuth_angles = new float[nPhosphenes], + sizes = new float[nPhosphenes], + phosphenes = new Phosphene[nPhosphenes] + }; + + // cortical magnification function depends on cortex model + Func eccentricityScaling = parameters.dipoleModel + ? radii => radii.Select(r => parameters.k * (1 / (r + parameters.a) - 1 / (r + parameters.b))).ToArray() + : radii => radii.Select(r => parameters.k / (r + parameters.a)).ToArray(); + + // create a probability distribution according to cortical magnification and literature approximations + // custom probability distribution that goes from near-0 to max radius and is higher close to the fovea + // since continuous distributions are a pain, we approximate with a binned discrete variant. + var validEcc = Generate.LinearSpaced(10000, 1e-5, maxEccentricity * TotalFOV); + + // Thank you, EvK: https://stackoverflow.com/questions/43303538/python-numpy-random-choice-in-c-sharp-with-non-uniform-probability-distribution + // apply cortical magnification weights (closer to fovea have higher weights, peripheral is less) + var weights = eccentricityScaling(validEcc); + var sum = weights.Sum(); + var cumSum = 0.0; + // we use cumulative probabilities, because those allow us to transform a uniform variable to our custom distribution + var cumProbs = weights.Select(w => + { + var scaled = w / sum; + var cp = cumSum + scaled; + cumSum += scaled; + return cp; + }).ToArray(); + + // generate a uniform variable in [0,1) for each phosphene to determine eccentricity & angle from + var randomVals = SystemRandomSource.Doubles(nPhosphenes * 2, BitConverter.ToInt32(Encoding.UTF8.GetBytes("penis"), 0)); + + for (int i =0; i cumProbs.Length - 1) + idx = cumProbs.Length - 1; + + var ecc = validEcc[idx]; + config.eccentricities[i] = (float)ecc; + var theta = Math.PI * 2 * randomVals[i + nPhosphenes]; + config.azimuth_angles[i] = (float)theta; + + // calculate cartesian coordinates of phosphene in [0,1] ; eccentricities have fovea at 0,0 + // so move coordinates by 60 to and scale by 120 to get relative position + // use randomly generated polar coordinates to get x-y coordinates and scale to fraction of fov + // also cast down to float for unity compatibility + var x = (float)((ecc * Math.Cos(theta) + 60.0) / TotalFOV); + var y = (float)((ecc * Math.Sin(theta) + 60.0) / TotalFOV); + + p.position = new Vector2(x, y); + + // eccentricity scaling function is in activated cortex area per degrees of visual angle ([mm^2]/[degrees]) + // taking the inverse to get visual angle per cortex area activation + var magnification = 1.0 / eccentricityScaling(new[] { ecc })[0]; + // approximating cortex activation with an average stimulation strength to calculate size + double avgStim = 30; // micro ampere, stimulation can range from 20-60 μA + // according to Tehovnik, 2007, Depth-dependent detection of microampere currents delivered to monkey V1 + double apprxSpreadRadius = Math.Sqrt(avgStim / 675f); // K is current distance constant in μA/mm2 + // multiply apprx area with magnification factor of eccentricity to get diameter of phosphene in dVA + // divide by 2 and 120 to get radius as fraction of total fov + p.size = (float)(magnification * apprxSpreadRadius) / (2 * TotalFOV); + config.sizes[i] = p.size; + + config.phosphenes[i] = p; } - return phosphenes; + if (createPictureOfLayout) + config.PhosphenesToPicture(); + + Debug.Log($"Size Info: Avg:{config.sizes.Average():E}; Min:{config.sizes.Min():E}; Max:{config.sizes.Max():E}"); + return config; } + + private void PhosphenesToPicture() + { + var xpos = phosphenes.Select(p => p.position.x).ToArray(); + var ypos = phosphenes.Select(p => p.position.y).ToArray(); + Debug.Log($"PosInfo: x-Range: {xpos.Min():F} - {xpos.Max():F}; y-Range: {ypos.Min():F} - {ypos.Max():F}"); + Debug.Log($"Avg Phosphene Size: {phosphenes.Select(p => p.size).Average():E}; Min: {phosphenes.Select(p => p.size).Min():E}; Max: {phosphenes.Select(p => p.size).Max():E}"); + var tex = new Texture2D(1440, 1600, TextureFormat.RGBA32, false); + tex.SetPixels(0,0,tex.width,tex.height,Enumerable.Repeat(Color.black, tex.width*tex.height).ToArray()); + foreach (var p in phosphenes) + { + var x = Mathf.RoundToInt(p.position.x * tex.width); + var y = Mathf.RoundToInt(p.position.y * tex.height); + var size = Mathf.RoundToInt(p.size * tex.width); + + var sigma = size * 2; + Func Gaussian = d => 1.0f / (sigma * 2.50662f) * Mathf.Exp(-(d * d) / (2 * sigma * sigma)); + var scale = Gaussian(0f); + + for (int rx = 0; rx < sigma*3; rx += 1) + { + for (int ry = 0; ry < sigma*3; ry += 1) + { + if (rx * rx + ry * ry > sigma*3 * sigma*3) break; + + var d = Mathf.Sqrt(rx * rx + ry * ry); + var spread = Gaussian(d) / scale; + var col = new Color(spread, spread, spread, 1); + + tex.SetPixel(x+rx, y+ry, tex.GetPixel(x+rx, y+ry)+col); + tex.SetPixel(x+rx, y-ry, tex.GetPixel(x+rx, y-ry)+col); + tex.SetPixel(x-rx, y+ry, tex.GetPixel(x-rx, y+ry)+col); + tex.SetPixel(x-rx, y-ry, tex.GetPixel(x-rx, y-ry)+col); + } + } + } + tex.Apply(); + var dirPath = Path.Join(Directory.GetParent(Application.dataPath)!.FullName,"SaveImages"); + if(!Directory.Exists(dirPath)) { + Directory.CreateDirectory(dirPath); + } + Debug.Log($"Saving image in: {dirPath}" ); + File.WriteAllBytes(Path.Join(dirPath, DateTime.Now.Ticks.ToString())+".png", tex.EncodeToPNG()); + } } } diff --git a/Scripts/PhospheneSimulator.cs b/Scripts/PhospheneSimulator.cs index c886495..2adb639 100644 --- a/Scripts/PhospheneSimulator.cs +++ b/Scripts/PhospheneSimulator.cs @@ -1,236 +1,404 @@ -using UnityEngine; -using Rect = UnityEngine.Rect; -using OpenCVForUnity; using System; -using System.IO; using System.Collections.Generic; -using OpenCVForUnity.CoreModule; -using OpenCVForUnity.ImgprocModule; -using OpenCVForUnity.UnityUtils; -using static ImageSynthesis; +using System.IO; +using System.Linq; +using UnityEngine; +using UnityEngine.Experimental.Rendering; using UnityEngine.InputSystem; -using System.Collections; +using UnityEngine.Rendering; +using UnityEngine.XR; namespace Xarphos.Scripts { - // [RequireComponent(typeof(Renderer))] - public class PhospheneSimulator : MonoBehaviour { + public Camera targetCamera; + public bool setManualEyePos; + public Vector2 ManualEyePos = new (.5f, .5f); + + // stimulation parameters + [SerializeField] + private float inputEffect = 0.7f;// The factor by which stimulation accumulates to phosphene activation + [SerializeField] + private float intensityDecay = 0.8f; // The factor by which previous activation still influences current activation + [SerializeField] + private float traceIncrease = 0.1f; // The habituation strength: the factor by which stimulation leads to buildup of memory trace + [SerializeField] + private float traceDecay = 0.9f; // The factor by which the stimulation memory trace decreases // Image processing settings - float phospheneFiltering = 0.0f; - float edgeDetection = 0.0f; - - // EyeTracking - protected Vector2 eyePosition; + private float _phospheneFiltering; + private bool _edgeDetection; - // Image processing settings - [SerializeField] protected DSPVEyeTracking.EyeTrackingConditions eyeTrackingCondition; + private Vector2Int viveResolution, maskResolution; + // protected RenderTextureDescriptor ActvTexDesc; + protected RenderTexture ActvTex, SimRenderTex; [SerializeField] protected SurfaceReplacement.ReplacementModes surfaceReplacementMode; - [SerializeField] protected Vector2Int resolution; - [SerializeField] protected Vector2 FOV; - - // Render textures - protected RenderTexture inputRT; - protected RenderTexture activationMask; - protected RenderTexture phospheneRT; + private readonly int _nSurfaceModes = Enum.GetValues(typeof(SurfaceReplacement.ReplacementModes)).Length; // For reading phosphene configuration from JSON - [SerializeField] string phospheneConfigFile; - private Phosphene[] phosphenes; - int nPhosphenes; - ComputeBuffer phospheneBuffer; + public bool initialiseFromFile; + [SerializeField] private string phospheneConfigFile; + private PhospheneConfig _phosphenes; + private int _nPhosphenes; + private ComputeBuffer _phospheneBuffer; // Shaders and materials - protected Material imageProcessingMaterial; - protected Material phospheneMaterial; - [SerializeField] protected Shader phospheneShader; + protected Material ImageProcessingMaterial; + protected Material FocusDotMaterial; [SerializeField] protected Shader imageProcessingShader; - [SerializeField] protected ComputeShader temporalDynamicsCS; - - - // stimulation parameters - [SerializeField] float input_effect = 0.7f;// The factor by which stimulation accumulates to phosphene activation - [SerializeField] float intensity_decay = 0.8f; // The factor by which previous activation still influences current activation - [SerializeField] float trace_increase = 0.1f; // The habituation strength: the factor by which stimulation leads to buildup of memory trace - [SerializeField] float trace_decay = 0.9f; // The factor by which the stimulation memory trace decreases + [SerializeField] protected ComputeShader temporalDynamicsCs; + + // Eye tracking + [SerializeField] protected EyeTracking.EyeTrackingConditions eyeTrackingCondition; + private readonly int _nEyeTrackingModes = Enum.GetValues(typeof(EyeTracking.EyeTrackingConditions)).Length; + private Vector2 eyePosLeft, eyePosRight, eyePosCentre; + + // simulation auxillaries + private int kernelActivations, kernelSpread, kernelClean; + private int threadX, threadY; + private bool headsetInitialised = false; + + private ComputeBuffer debugBuffer; + + // ToDo: Clean Up and unify + #region Shader Properties Name-To-Int + private static readonly int PhosMatMask = Shader.PropertyToID("_ActivationMask"); + private static readonly int PhosMatPhosphenes = Shader.PropertyToID("phosphenes"); + private static readonly int PhosMatPhospheneTexture = Shader.PropertyToID("PhospheneTexture"); + private static readonly int PhosMatNPhosphenes = Shader.PropertyToID("_nPhosphenes"); + private static readonly int PhosMatFilter = Shader.PropertyToID("_PhospheneFilter"); + private static readonly int PhosMatGazeLocked = Shader.PropertyToID("_GazeLocked"); + private static readonly int PhosMatGazeAssisted = Shader.PropertyToID("_GazeAssisted"); + private static readonly int PhosMatScreenResolutionX = Shader.PropertyToID("_ScreenResolutionX"); + + private static readonly int TempDynResolution = Shader.PropertyToID("resolution"); + private static readonly int TempDynScreenResolution = Shader.PropertyToID("screenResolution"); + private static readonly int TempDynMask = Shader.PropertyToID("ActivationMask"); + private static readonly int TempDynInputEffect = Shader.PropertyToID("input_effect"); + private static readonly int TempDynIntensityDecay = Shader.PropertyToID("intensity_decay"); + private static readonly int TempDynTraceIncrease = Shader.PropertyToID("trace_increase"); + private static readonly int TempDynTraceDecay = Shader.PropertyToID("trace_decay"); + private static readonly int TempDynPhosphenes = Shader.PropertyToID("phosphenes"); + private static readonly int TempDynPhospheneTexture = Shader.PropertyToID("PhospheneTexture"); + private static readonly int TempDynPhospheneRenderTexture = Shader.PropertyToID("PhospheneRender"); + private static readonly int TempDynGazeAssisted = Shader.PropertyToID("gazeAssisted"); + private static readonly int TempDynGazeLocked = Shader.PropertyToID("gazeLocked"); + private static readonly int TempDynEyePos = Shader.PropertyToID("eyePos"); + + private static readonly int ImgProcMode = Shader.PropertyToID("_Mode"); + private static readonly int ImgProcResX = Shader.PropertyToID("Resolution_x"); + private static readonly int ImgProcResY = Shader.PropertyToID("Resolution_y"); + private static readonly int ImgMatMainTex = Shader.PropertyToID("_MainTex"); + + private static readonly int ShPropEyePosLeft = Shader.PropertyToID("_EyePositionLeft"); + private static readonly int ShPropEyePosRight = Shader.PropertyToID("_EyePositionRight"); + private static readonly int ShPropEyePosCentre = Shader.PropertyToID("_EyePositionCentre"); + private static readonly int ShPropEyeToRender = Shader.PropertyToID("_EyeToRender"); + + #endregion protected void Awake() { - // Initialize the array of phosphenes - phosphenes = PhospheneConfig.InitPhosphenesFromJSON(phospheneConfigFile, FOV); - nPhosphenes = phosphenes.Length; - - print(phosphenes[0]); - phospheneBuffer = new ComputeBuffer(nPhosphenes, sizeof(float)*5); - phospheneBuffer.SetData(phosphenes); - - - // Initialize materials with shaders - phospheneMaterial = new Material(phospheneShader); - imageProcessingMaterial = new Material(imageProcessingShader);// TODO - - // Initialize the render textures - inputRT = new RenderTexture(resolution.x, resolution.y, 24); - activationMask = new RenderTexture(resolution.x, resolution.y, 24); - activationMask.enableRandomWrite = true; - activationMask.Create(); - phospheneRT = new RenderTexture(resolution.x, resolution.y, 24); - - // Set the shaders with the shared render textures - imageProcessingMaterial.SetTexture("_MainTex", inputRT); - temporalDynamicsCS.SetInts("resolution", new int[]{resolution.x, resolution.y}); - temporalDynamicsCS.SetTexture(0,"ActivationMask", activationMask); - phospheneMaterial.SetTexture("_ActivationMask", activationMask); - - // Set the compute shader with the temporal dynamics variables - temporalDynamicsCS.SetFloat("input_effect", input_effect); - temporalDynamicsCS.SetFloat("intensity_decay", intensity_decay); - temporalDynamicsCS.SetFloat("trace_increase", trace_increase); - temporalDynamicsCS.SetFloat("trace_decay", trace_decay); - - // Set the shader properties with the shared phosphene buffer - phospheneMaterial.SetBuffer("phosphenes", phospheneBuffer); - phospheneMaterial.SetInt("_nPhosphenes", nPhosphenes); - phospheneMaterial.SetFloat("_PhospheneFilter", phospheneFiltering); - temporalDynamicsCS.SetBuffer(0,"phosphenes", phospheneBuffer); - - // Set the default EyeTrackingCondition (Ignore Gaze) - phospheneMaterial.SetInt("_GazeLocked", 0); - temporalDynamicsCS.SetInt("gazeAssistedSampling", 0); + targetCamera ??= GetComponent(); + // Initialize the array of phosphenes + if (initialiseFromFile && phospheneConfigFile != null) + { + try + { + _phosphenes = PhospheneConfig.InitPhosphenesFromJSON(phospheneConfigFile); + } catch (FileNotFoundException){ } + } + // if boolean is false, the file path is not given or the initialising from file failed, initialise probabilistic + _phosphenes ??= PhospheneConfig.InitPhosphenesProbabilistically(1000, .15f, PhospheneConfig.Monopole, true); + + _nPhosphenes = _phosphenes.phosphenes.Length; + _phospheneBuffer = new ComputeBuffer(_nPhosphenes, sizeof(float)*7); + _phospheneBuffer.SetData(_phosphenes.phosphenes); + + // Initialize materials with shaders + ImageProcessingMaterial = new Material(imageProcessingShader); + + // Set the compute shader with the temporal dynamics variables + temporalDynamicsCs.SetFloat(TempDynInputEffect, inputEffect); + temporalDynamicsCs.SetFloat(TempDynIntensityDecay, intensityDecay); + temporalDynamicsCs.SetFloat(TempDynTraceIncrease, traceIncrease); + temporalDynamicsCs.SetFloat(TempDynTraceDecay, traceDecay); + + temporalDynamicsCs.SetBuffer(0, TempDynPhosphenes, _phospheneBuffer); + // Set the default EyeTrackingCondition (Ignore Gaze) + temporalDynamicsCs.SetInt(TempDynGazeLocked, 0); + temporalDynamicsCs.SetInt(TempDynGazeAssisted, 0); + + // get kernel references + kernelActivations = temporalDynamicsCs.FindKernel("CalculateActivations"); + kernelSpread = temporalDynamicsCs.FindKernel("SpreadActivations"); + kernelClean = temporalDynamicsCs.FindKernel("ClearActivations"); + + // set up shader for focusdot + FocusDotMaterial = new Material(Shader.Find("Custom/FocusDot")); + FocusDotMaterial.SetInt("_RenderPoint", 1); } - void computePhospheneActivity(){ - // Perform image processing and compute the phosphene activity - Graphics.Blit(inputRT, activationMask, imageProcessingMaterial); // using imageProcessingshader - temporalDynamicsCS.Dispatch(0,phosphenes.Length/10,1,1); + private void Start() + { + // replace surfaces with in editor selected variant + SurfaceReplacement.ActivateReplacementShader(targetCamera, surfaceReplacementMode); } - void OnPreRender() { - // Render to the input render texture - Camera.main.targetTexture = inputRT; - } + private void OnRenderImage(RenderTexture src, RenderTexture target) + { + InitialiseTextures(src); // set up textures, resolutions and parameters + // if headset is not yet available: skip + if (target == null || !headsetInitialised) return; + + // in between texture to put processed image on before blitting from this to target + var preTargetPing = RenderTexture.GetTemporary(target.descriptor); + + // if phosphene simulator is off, only need to run image through image processing for edge detection + if (_edgeDetection) + Graphics.Blit(src, preTargetPing, ImageProcessingMaterial); + // if edge detection is off, just blit without any processing + else + Graphics.Blit(src, preTargetPing); + + // if phosphene simulation is turned on + if ((int)_phospheneFiltering != 0) + { + temporalDynamicsCs.SetTexture(kernelActivations, TempDynMask, preTargetPing); + // calculate activations + temporalDynamicsCs.Dispatch(kernelActivations, Mathf.CeilToInt(_nPhosphenes / 32), 1, 1); + // render phosphene simulation + temporalDynamicsCs.Dispatch(kernelSpread, threadX, threadY, 1); - IEnumerator blitToScreen() - { - // Wait until all reder textures are rendered - yield return new WaitForEndOfFrame(); + if (Time.frameCount % 30 == -9) + { + var arr = new Phosphene[_nPhosphenes]; + _phospheneBuffer.GetData(arr); + var actarrL = arr.Select(p => p.activation[0]).ToArray(); + var actarrR = arr.Select(p => p.activation[1]).ToArray(); + Debug.Log($"Left Activation: Avg: {actarrL.Average():E}; Min: {actarrL.Min():E}; Max: {actarrL.Max():E}; Above .5: {actarrL.Count(a => a>.5f)}"); + Debug.Log($"Rght Activation: Avg: {actarrR.Average():E}; Min: {actarrR.Min():E}; Max: {actarrR.Max():E}; Above .5: {actarrR.Count(a => a>.5f)}"); + var sz = arr.Select(p => p.size).ToArray(); + Debug.Log($"Sizes: Avg: {sz.Average():E}; Min: {sz.Min():E}; Max: {sz.Max():E}"); + + var debug = new Vector4[viveResolution.x * viveResolution.y]; + temporalDynamicsCs.Dispatch(temporalDynamicsCs.FindKernel("DebugBuffer"), viveResolution.x / 32, viveResolution.y / 32, 1); + debugBuffer.GetData(debug); + + // if read from render tex + var a = debug.Select(v => v.x).ToArray(); + + // if read from activation tex + // var xPos = debug.Select(v => v.x).ToArray(); + // var yPos = debug.Select(v => v.y).ToArray(); + // var a = debug.Select(v => v.z).ToArray(); + // var s = debug.Select(v => v.w).Where(f => f > 0f).ToArray(); + + Debug.Log($"LActvTex::Activation: Avg: {a.Average():E}; Min: {a.Min():E}; Max: {a.Max():E}; Above .5: {a.Count(f => f>.5f)}"); + // Debug.Log($"LActvTex::Sizes : Avg: {s.Average():E}; Min: {s.Min():E}; Max: {s.Max():E}; Above 1e-5: {s.Count(f => f>1e-5f)}"); + } - // Target tex has to be (temporarilty) set to null - Camera.main.targetTexture = null; + // reinit & copy simulation to pre-out + RenderTexture.ReleaseTemporary(preTargetPing); + preTargetPing = RenderTexture.GetTemporary(target.descriptor); + Graphics.Blit(SimRenderTex, preTargetPing);//, new Vector2(1, -1), Vector2.zero); + temporalDynamicsCs.Dispatch(kernelClean, threadX, threadY, 1); + } - // Simulate the phosphenes (based on the shared phosphene buffer) - Graphics.Blit(null as RenderTexture, phospheneRT, phospheneMaterial); + // lastly render the focus dot on top + Graphics.Blit(preTargetPing, target, FocusDotMaterial); + RenderTexture.ReleaseTemporary(preTargetPing); + } - // Blit to the screen - Graphics.Blit(phospheneRT, null as RenderTexture); - yield return null; + /// + /// Sets up the parameters relating to image processing and simulation, like resolution + /// + /// a render texture that is VR ready to get parameters from + private void InitialiseTextures(RenderTexture src) + { + if (headsetInitialised || XRSettings.eyeTextureWidth == 0) return; + + headsetInitialised = true; + + // set up resolution + var w = XRSettings.eyeTextureWidth; + var h = XRSettings.eyeTextureHeight; + viveResolution = new Vector2Int(w, h); + ImageProcessingMaterial.SetInt(ImgProcResX, w); + ImageProcessingMaterial.SetInt(ImgProcResY, h); + Debug.Log($"Set Res to: {w}, {h}"); + + // set up input texture for simulation + var compressionFactor = 1; + maskResolution = viveResolution / compressionFactor; + ActvTex = new RenderTexture(src.descriptor) + { + width = maskResolution.x, + height = maskResolution.y, + graphicsFormat = GraphicsFormat.R32G32_SFloat, + depth = 0, + enableRandomWrite = true + }; + // pass texture references to compute shader + temporalDynamicsCs.SetTexture(kernelActivations, TempDynPhospheneTexture, ActvTex); + temporalDynamicsCs.SetTexture(kernelSpread, TempDynPhospheneTexture, ActvTex); + temporalDynamicsCs.SetTexture(kernelClean, TempDynPhospheneTexture, ActvTex); + + + SimRenderTex = new RenderTexture(src.descriptor) + { + enableRandomWrite = true + }; + // Initialize the render textures & Set the shaders with the shared render textures + temporalDynamicsCs.SetInts(TempDynScreenResolution, viveResolution.x, viveResolution.y); + temporalDynamicsCs.SetInts(TempDynResolution, maskResolution.x, maskResolution.y); + temporalDynamicsCs.SetTexture(kernelSpread, TempDynPhospheneRenderTexture, SimRenderTex); + temporalDynamicsCs.SetTexture(kernelClean, TempDynPhospheneRenderTexture, SimRenderTex); + + // calculate the thread count necessary to cover the entire texture + temporalDynamicsCs.GetKernelThreadGroupSizes(kernelSpread, out var xGroup, out var yGroup, out _); + threadX = Mathf.CeilToInt(viveResolution.x / xGroup); + threadY = Mathf.CeilToInt(viveResolution.y / yGroup); + + // calculate the center position for each eye corrected for visual transform + var (lViewSpace, rViewSpace, cViewSpace) = EyePosFromScreenPoint(0.5f, 0.5f); + SetEyePosition(lViewSpace, rViewSpace, cViewSpace); + temporalDynamicsCs.SetVector("_LeftEyeCenter", lViewSpace); + temporalDynamicsCs.SetVector("_RightEyeCenter", rViewSpace); + + debugBuffer = new ComputeBuffer(w * h, sizeof(float) * 4); + temporalDynamicsCs.SetBuffer(temporalDynamicsCs.FindKernel("DebugBuffer"), "debugBuffer", debugBuffer); + temporalDynamicsCs.SetTexture(temporalDynamicsCs.FindKernel("DebugBuffer"), TempDynPhospheneTexture, ActvTex); + temporalDynamicsCs.SetTexture(temporalDynamicsCs.FindKernel("DebugBuffer"), TempDynPhospheneRenderTexture, SimRenderTex); } - void OnDisable(){ - phospheneBuffer.Release(); + /// + /// calculate the screen position for each eye from a 2d point on the "center" view + /// + /// x position on screen in 0..1, left is 0 + /// y position on screen in 0..1, bottom is 0 + /// tuple of left, right and center screen position according to input. center should be roughly equal to input + private (Vector2, Vector2, Vector2) EyePosFromScreenPoint(float x, float y) + { + // set eye position to centre of screen and calculate correct offsets + var P = targetCamera.ViewportToWorldPoint( + new Vector3(x, y, 10f)); + // projection from local space to clip space + var lMat = targetCamera.GetStereoNonJitteredProjectionMatrix(Camera.StereoscopicEye.Left); + var rMat = targetCamera.GetStereoNonJitteredProjectionMatrix(Camera.StereoscopicEye.Right); + var cMat = targetCamera.nonJitteredProjectionMatrix; + // projection from world space into local space + var world2cam = targetCamera.worldToCameraMatrix; + // 4th dimension necessary in graphics to get scale + var P4d = new Vector4(P.x, P.y, P.z, 1f); + // point in world space * world2cam -> local space point + // local space point * projection matrix = clip space point + var lProjection = lMat * world2cam * P4d; + var rProjection = rMat * world2cam * P4d; + var cProjection = cMat * world2cam * P4d; + // scale and shift from clip space [-1,1] into view space [0,1] + var lViewSpace = (new Vector2(lProjection.x, lProjection.y) / lProjection.w) * .5f + .5f * Vector2.one; + var rViewSpace = (new Vector2(rProjection.x, rProjection.y) / rProjection.w) * .5f + .5f * Vector2.one; + var cViewSpace = (new Vector2(cProjection.x, cProjection.y) / cProjection.w) * .5f + .5f * Vector2.one; + + return (lViewSpace, rViewSpace, cViewSpace); } - void nextSurfaceReplacementMode(){ - var nModes = System.Enum.GetValues(typeof(SurfaceReplacement.ReplacementModes)).Length; - surfaceReplacementMode += 1; + private void OnDestroy(){ + _phospheneBuffer.Release(); + debugBuffer.Release(); + } - if((int)surfaceReplacementMode < nModes){ - // Replace surfaces with the surface replacement shader - SurfaceReplacement.ActivateReplacementShader(surfaceReplacementMode); - } - else{ - // If cycled through all modes -> set back to first element - surfaceReplacementMode = 0; - SurfaceReplacement.DeactivateReplacementShader(); // (first mode is no surface replacement) - } + #region Input Handling + // cycle surface replacement + public void NextSurfaceReplacementMode(InputAction.CallbackContext ctx) => NextSurfaceReplacementMode(); + private void NextSurfaceReplacementMode(){ + surfaceReplacementMode = (SurfaceReplacement.ReplacementModes)((int)(surfaceReplacementMode + 1) % _nSurfaceModes); + // Replace surfaces with the surface replacement shader + SurfaceReplacement.ActivateReplacementShader(targetCamera, surfaceReplacementMode); } - void nextEyeTrackingCondition(){ - var nModes = System.Enum.GetValues(typeof(DSPVEyeTracking.EyeTrackingConditions)).Length; - eyeTrackingCondition += 1; - if ((int)eyeTrackingCondition >= nModes) - { - //cycled through all modes -> set back to first element - // GazeIgnored - eyeTrackingCondition = 0; - phospheneMaterial.SetInt("_GazeLocked", 0); - temporalDynamicsCS.SetInt("gazeAssistedSampling", 0); - } - else if ((int)eyeTrackingCondition == 1) - { - // SimulationFixedToGaze - phospheneMaterial.SetInt("_GazeLocked", 1); - temporalDynamicsCS.SetInt("gazeAssistedSampling", 0); - } - else if ((int)eyeTrackingCondition == 2) + // cycle eye tracking conditions + public void NextEyeTrackingCondition(InputAction.CallbackContext ctx) => NextEyeTrackingCondition(); + private void NextEyeTrackingCondition() + { + eyeTrackingCondition = (EyeTracking.EyeTrackingConditions)((int)(eyeTrackingCondition + 1) % _nEyeTrackingModes); + + switch (eyeTrackingCondition) { - // GazeAssistedSampling - phospheneMaterial.SetInt("_GazeLocked", 1); - temporalDynamicsCS.SetInt("gazeAssistedSampling", 1); + // reset and don't use gaze info + case EyeTracking.EyeTrackingConditions.GazeIgnored: + temporalDynamicsCs.SetInt(TempDynGazeAssisted, 0); + temporalDynamicsCs.SetInt(TempDynGazeLocked, 0); + break; + // add lock to gaze + case EyeTracking.EyeTrackingConditions.SimulationFixedToGaze: + temporalDynamicsCs.SetInt(TempDynGazeAssisted, 0); + temporalDynamicsCs.SetInt(TempDynGazeLocked, 1); + break; + // add gaze assisted sampling on top + case EyeTracking.EyeTrackingConditions.GazeAssistedSampling: + temporalDynamicsCs.SetInt(TempDynGazeAssisted, 1); + temporalDynamicsCs.SetInt(TempDynGazeLocked, 1); + break; } } - - + + public void ToggleEdgeDetection(InputAction.CallbackContext ctx) => ToggleEdgeDetection(); + private void ToggleEdgeDetection() + { + _edgeDetection = !_edgeDetection; + } + + public void TogglePhospheneSim(InputAction.CallbackContext ctx) => TogglePhospheneSim(); + public void TogglePhospheneSim() + { + _phospheneFiltering = 1-_phospheneFiltering; + } + #endregion + + /// + /// Update class variables and pass new positions to shaders + /// + /// left eye screen position in 0..1 + /// right eye screen position in 0..1 + /// centre screen position in 0..1 + public void SetEyePosition(Vector2 leftViewport, Vector2 rightViewport, Vector2 centreViewport) + { + eyePosLeft = leftViewport; + eyePosRight = rightViewport; + eyePosCentre = centreViewport; + + FocusDotMaterial.SetVector(ShPropEyePosLeft, eyePosLeft); + FocusDotMaterial.SetVector(ShPropEyePosRight, eyePosRight); + + temporalDynamicsCs.SetVector(ShPropEyePosLeft, eyePosLeft); + temporalDynamicsCs.SetVector(ShPropEyePosRight, eyePosRight); + } + protected void Update() { - computePhospheneActivity(); - StartCoroutine(blitToScreen()); - - - if (Keyboard.current[Key.U].isPressed || Keyboard.current[Key.J].isPressed) - { - if (Keyboard.current[Key.U].isPressed) {eyePosition.y = 0.8f;} - if (Keyboard.current[Key.J].isPressed) {eyePosition.y = 0.2f;} - } - else - { - eyePosition.y = 0.5f; - } - - if (Keyboard.current[Key.H].isPressed || Keyboard.current[Key.K].isPressed) - { - if (Keyboard.current[Key.H].isPressed) {eyePosition.x = 0.2f;} - if (Keyboard.current[Key.K].isPressed) {eyePosition.x = 0.8f;} - } - else - { - eyePosition.x = 0.5f; - } - - - if (Keyboard.current[Key.C].isPressed) - { - nextEyeTrackingCondition(); - print("Condition: " + eyeTrackingCondition); - } - - if (Keyboard.current[Key.T].isPressed) - { - nextSurfaceReplacementMode(); - print("Surface replacement mode: " + surfaceReplacementMode); - } - - if (Keyboard.current[Key.E].isPressed) - { - edgeDetection = 1-edgeDetection; - imageProcessingMaterial.SetFloat("_Mode", edgeDetection); - print("Post processing: " + ((edgeDetection==1)? "Sobel edge-detection": "None")); - } - - if (Keyboard.current[Key.P].isPressed) - { - phospheneFiltering = 1-phospheneFiltering; - phospheneMaterial.SetFloat("_PhospheneFilter", phospheneFiltering); - print("Phosphene filter: " + ((phospheneFiltering==1)? "Yes" : "No") ); - } + if (setManualEyePos) + { + if (Keyboard.current[Key.J].isPressed) ManualEyePos.y -= .05f * Time.deltaTime; + else if (Keyboard.current[Key.U].isPressed) ManualEyePos.y += .05f * Time.deltaTime; + + if (Keyboard.current[Key.K].isPressed) ManualEyePos.x += .05f * Time.deltaTime; + else if (Keyboard.current[Key.H].isPressed) ManualEyePos.x -= .05f * Time.deltaTime; + + var (lViewSpace, rViewSpace, cViewSpace) = EyePosFromScreenPoint(ManualEyePos.x, ManualEyePos.y); + + SetEyePosition(lViewSpace, rViewSpace, cViewSpace); + } - phospheneMaterial.SetVector("_EyePosition", eyePosition); - temporalDynamicsCS.SetVector("_EyePosition", eyePosition); + if (Keyboard.current[Key.C].isPressed) + { + NextEyeTrackingCondition(); + print("Condition: " + eyeTrackingCondition); + } } - } } diff --git a/Scripts/SurfaceReplacement.cs b/Scripts/SurfaceReplacement.cs index e23facd..20b5cb1 100644 --- a/Scripts/SurfaceReplacement.cs +++ b/Scripts/SurfaceReplacement.cs @@ -18,9 +18,15 @@ public enum ReplacementModes { Normals = 5 } - public static void ActivateReplacementShader(ReplacementModes replacementMode){ + public static void ActivateReplacementShader(Camera target, ReplacementModes replacementMode){ + if (replacementMode == ReplacementModes.None) + { + DeactivateReplacementShader(target); + return; + } + // For rendering the object ID labels (instance segmentation) - var renderers = UnityEngine.Object.FindObjectsOfType(); + var renderers = FindObjectsOfType(); var mpb = new MaterialPropertyBlock(); foreach (var r in renderers) { @@ -30,11 +36,11 @@ public static void ActivateReplacementShader(ReplacementModes replacementMode){ mpb.SetInt("_OutputMode",(int)replacementMode); } - Camera.main.SetReplacementShader(replacementShader, ""); + target.SetReplacementShader(replacementShader, ""); } - public static void DeactivateReplacementShader(){ - Camera.main.ResetReplacementShader(); + public static void DeactivateReplacementShader(Camera target){ + target.ResetReplacementShader(); } public static byte ReverseBits(byte value) diff --git a/Shader/DSPV_PhospheneShader.shader b/Shader/DSPV_PhospheneShader.shader index 461f5f8..f0f9389 100644 --- a/Shader/DSPV_PhospheneShader.shader +++ b/Shader/DSPV_PhospheneShader.shader @@ -3,17 +3,22 @@ Properties { // _PhosheneMapping("PhospheneMapping", 2D) = "black" { } - _ActivationMask ("ActivationMask", 2D) = "black" { } - _SizeCoefficient ("SizeCoefficient", Range(0.001, 2)) = 0.03 - _Brightness ("Brightness", Range(0, 2)) = 0.005 - _Dropout("Dropout", Range(0.0,0.5)) = 0 - _PhospheneFilter("PhospheneFilter", Float) = 0 - _EyePosition("EyePosition", Vector) = (0., 0., 0., 0.) - _GazeLocked("GazeLocked", Int) = 0 + _MainTex ("_MainTex", 2D) = "black" { } + _SizeCoefficient ("SizeCoefficient", Range(0.001, 2)) = 0.03 + _Brightness ("Brightness", Range(0, 2)) = 0.005 + _Dropout("Dropout", Range(0.0,0.5)) = 0 + _PhospheneFilter("PhospheneFilter", Float) = 0 + _EyePositionLeft("_EyePositionLeft", Vector) = (0.5, 0.5, 0., 0.) + _EyePositionRight("_EyePositionRight", Vector) = (0.5, 0.5, 0., 0.) + _GazeLocked("_GazeLocked", Int) = 0 + _GazeAssisted("_GazeAssisted", Int) = 0 + _ScreenResolutionX("_ScreenResolution", Int) = 0 } SubShader { + Tags { "Queue" = "Transparent" } + Lighting Off Blend One Zero @@ -27,26 +32,31 @@ #pragma vertex vertex_program #pragma fragment frag #pragma target 3.0 + #pragma multi_compile_instancing struct AppData { float2 uv: TEXCOORD0; float4 vertex: POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID }; struct VertexData { float2 uv: TEXCOORD0; float4 vertex: SV_POSITION; + float4 screenPos: TEXCOORD1; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; // Toggle phosphene filtering float _PhospheneFilter; - // Texture that determines where phosphenes should be activated - sampler2D _ActivationMask; - float4 _ActivationMask_ST; - float4 _ActivationMask_TexelSize; + UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); + float4 _MainTex_ST; // Float array instead: float activation[1000]; @@ -57,33 +67,51 @@ float _Dropout; // EyePosition - float4 _EyePosition; + float4 _EyePositionLeft; + float4 _EyePositionRight; int _GazeLocked; + int _GazeAssisted; int _nPhosphenes; float4 _pSpecs[1000]; StructuredBuffer phosphenes; + StructuredBuffer pixelLuminance; + int _ScreenResolutionX; VertexData vertex_program(AppData inputs) { VertexData outputs; - outputs.uv = TRANSFORM_TEX(inputs.uv, _ActivationMask); + + UNITY_SETUP_INSTANCE_ID(inputs); + UNITY_INITIALIZE_OUTPUT(VertexData, outputs); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(outputs); + + outputs.uv = TRANSFORM_TEX(inputs.uv, _MainTex); outputs.vertex = UnityObjectToClipPos(inputs.vertex); + outputs.screenPos = ComputeScreenPos(outputs.vertex); + return outputs; } float4 frag(VertexData inputs) : SV_Target { - - if (_PhospheneFilter==1){ - // Simulate phosphenes - return DSPV_phospheneSimulation(phosphenes, _GazeLocked, _EyePosition.rg, _nPhosphenes, _SizeCoefficient, _Brightness, _Dropout, inputs.uv); - } - else { - // Return the pixels in main texture - return tex2D(_ActivationMask, inputs.uv); - } + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(inputs); + fixed4 eyepos = lerp(_EyePositionLeft, _EyePositionRight, unity_StereoEyeIndex); + + // int idx = inputs.screenPos.x + inputs.screenPos.y * _ScreenResolutionX; + // return fixed4(1,1,1,1) * pixelLuminance[idx] * _Brightness; + + // Simulate phosphenes + return DSPV_phospheneSimulation( + phosphenes, + _GazeLocked, + eyepos.rg, + _nPhosphenes, + _SizeCoefficient, + _Brightness, + inputs.uv + ); } ENDCG } diff --git a/Shader/DSPV_PhospheneShader_orig.shader b/Shader/DSPV_PhospheneShader_orig.shader deleted file mode 100644 index c5b1656..0000000 --- a/Shader/DSPV_PhospheneShader_orig.shader +++ /dev/null @@ -1,94 +0,0 @@ -Shader "Custom/DSPV_PhosShader" -{ - Properties - { - // _PhosheneMapping("PhospheneMapping", 2D) = "black" { } - _ActivationMask ("ActivationMask", 2D) = "black" { } - _SizeCoefficient ("SizeCoefficient", Range(0.001, 2)) = 0.03 - _Brightness ("Brightness", Range(0, 2)) = 0.005 - _Dropout("Dropout", Range(0.0,0.5)) = 0 - _PhospheneFilter("PhospheneFilter", Float) = 1 - _EyePosition("EyePosition", Vector) = (0., 0., 0., 0.) - _GazeLocked("GazeLocked", Int) = 0 - } - - SubShader - { - Lighting Off - Blend One Zero - - Pass - { - CGPROGRAM - #include "UnityCustomRenderTexture.cginc" - #include "DSPV_phosphene_vision.cginc" - - - #pragma vertex vertex_program - #pragma fragment frag - #pragma target 3.0 - - struct AppData - { - float2 uv: TEXCOORD0; - float4 vertex: POSITION; - }; - - struct VertexData - { - float2 uv: TEXCOORD0; - float4 vertex: SV_POSITION; - }; - - // Toggle phosphene filtering - float _PhospheneFilter; - - // // Mapping and initial size of phosphenes - // sampler2D _PhospheneMapping; - // float4 _PhospheneMapping_ST; - // float4 _PhospheneMapping_TexelSize; - - // Texture that determines where phosphenes should be activated - sampler2D _ActivationMask; - float4 _ActivationMask_ST; - float4 _ActivationMask_TexelSize; - - // Float array instead: - float activation[1000]; - - // Other parameters - float _SizeCoefficient; - float _Brightness; - float _Dropout; - - // EyePosition - float4 _EyePosition; - int _GazeLocked; - - int _nPhosphenes; - float4 _pSpecs[1000]; - - - VertexData vertex_program(AppData inputs) - { - VertexData outputs; - outputs.uv = TRANSFORM_TEX(inputs.uv, _ActivationMask); - outputs.vertex = UnityObjectToClipPos(inputs.vertex); - return outputs; - } - - float4 frag(VertexData inputs) : SV_Target - { - - if (_PhospheneFilter==1){ - // return DSPV_phospheneSimulation(_GazeLocked, _EyePosition.rg, _pSpecs, activation, _PhospheneMapping_TexelSize.z, _PhospheneMapping, _SizeCoefficient, _Brightness, _Dropout, inputs.uv); - return DSPV_phospheneSimulation(_GazeLocked, _EyePosition.rg, _pSpecs, activation, _nPhosphenes, _SizeCoefficient, _Brightness, _Dropout, inputs.uv); - } - else { - return tex2D(_ActivationMask, inputs.uv); - } - } - ENDCG - } - } -} diff --git a/Shader/DSPV_phosphene_vision.cginc b/Shader/DSPV_phosphene_vision.cginc index 041691d..fb93134 100644 --- a/Shader/DSPV_phosphene_vision.cginc +++ b/Shader/DSPV_phosphene_vision.cginc @@ -7,10 +7,10 @@ struct Phosphene { - float2 position; - float size; - float activation; - float trace; + float2 position; + float size; + float2 activation; + float2 trace; }; @@ -28,13 +28,20 @@ } fixed4 DSPV_gaussian(float r, float sigma) { - float c = 1 / (sigma * 3.5449077); + float c = 1 / (sigma * 3.4954077); return c * exp(-(r * r) / (2 * sigma * sigma)); } - float4 DSPV_phospheneSimulation(StructuredBuffer phospheneBuffer, int gazeLocked, float2 eyePosition, float nPhosphenes, float sizeCoefficient, float brightness, float dropout, float2 pixelPosition) { - + float4 DSPV_phospheneSimulation( + StructuredBuffer phospheneBuffer, + int gazeLocked, + float2 eyePosition, + float nPhosphenes, + float sizeCoefficient, + float brightness, + float2 pixelPosition + ) { // Output luminance for current pixel fixed4 pixelLuminance = fixed4(0,0,0,0); @@ -46,22 +53,24 @@ float phospheneSize; float phospheneActivation; + float sqrtN = sqrt(nPhosphenes); + // Loop over all phosphenes for (int i = 0; i 3 sigmas, the tail of the gaussian is unobservable @@ -72,11 +81,6 @@ } - // Fixation dot is colored red - if (distance(pixelPosition, eyePosition)<0.01) { - pixelLuminance.r = 1/brightness; - } - return brightness * pixelLuminance; // tex2D(phospheneMapping,xgrid +(0.5/36)); // } diff --git a/Shader/DebugStereoEyeIndexColor.shader b/Shader/DebugStereoEyeIndexColor.shader new file mode 100644 index 0000000..9dac978 --- /dev/null +++ b/Shader/DebugStereoEyeIndexColor.shader @@ -0,0 +1,63 @@ +Shader "XR/StereoEyeIndexColor" +{ + Properties + { + _LeftEyeColor("Left Eye Color", COLOR) = (0,1,0,1) + _RightEyeColor("Right Eye Color", COLOR) = (1,0,0,1) + } + + SubShader + { + Tags { "RenderType" = "Opaque" } + + Pass + { + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_instancing + + float4 _LeftEyeColor; + float4 _RightEyeColor; + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + v2f vert (appdata v) + { + v2f o; + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_OUTPUT(v2f, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.vertex = UnityObjectToClipPos(v.vertex); + + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + return lerp(_LeftEyeColor, _RightEyeColor, unity_StereoEyeIndex); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Shader/DebugStereoEyeIndexColor.shader.meta b/Shader/DebugStereoEyeIndexColor.shader.meta new file mode 100644 index 0000000..8bb89e3 --- /dev/null +++ b/Shader/DebugStereoEyeIndexColor.shader.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3d3517368b10448eacfd79777d2571ca +timeCreated: 1653073016 \ No newline at end of file diff --git a/Shader/EyePositionCorrection.shader b/Shader/EyePositionCorrection.shader new file mode 100644 index 0000000..550edaf --- /dev/null +++ b/Shader/EyePositionCorrection.shader @@ -0,0 +1,82 @@ +Shader "Custom/EyePositionCorrection" { + Properties { + _MainTex ("Albedo (RGB)", 2D) = "white" {} + _EyePositionLeft("_EyePositionLeft", Vector) = (0.5, 0.5, 0., 0.) + _EyePositionRight("_EyePositionRight", Vector) = (0.5, 0.5, 0., 0.) + _EyePositionCentre("_EyePositionCentre", Vector) = (0.5, 0.5, 0., 0.) + } + SubShader + { + Lighting Off + Blend One Zero + + Pass + { + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_instancing + + float4 _EyePositionLeft; + float4 _EyePositionRight; + float4 _EyePositionCentre; + + UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); + float4 _MainTex_ST; + float4 _MainTex_TexelSize; + + #include "UnityCG.cginc" + + + struct appdata + { + float4 vertex: POSITION; + float2 uv: TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex: SV_POSITION; + float2 uv: TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + v2f vert(appdata v) + { + v2f o; + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_OUTPUT(v2f, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + fixed4 eyepos = lerp(_EyePositionLeft, _EyePositionRight, unity_StereoEyeIndex); + fixed4 offset = eyepos - _EyePositionCentre; + + fixed2 shiftedCoords = i.uv + offset.xy; + int2 meep = shiftedCoords > 1.0h; + int2 moop = shiftedCoords < 0.0h; + int valid = clamp(meep.x + meep.y + moop.x + moop.y, 0, 1); + + fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, shiftedCoords); + + return lerp(col, fixed4(0,0,0,0), valid); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Shader/EyePositionCorrection.shader.meta b/Shader/EyePositionCorrection.shader.meta new file mode 100644 index 0000000..25a98cb --- /dev/null +++ b/Shader/EyePositionCorrection.shader.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 67b2fafa31174f5dabcc03e9444b10ff +timeCreated: 1654196627 \ No newline at end of file diff --git a/Shader/FocusDot.shader b/Shader/FocusDot.shader new file mode 100644 index 0000000..9623122 --- /dev/null +++ b/Shader/FocusDot.shader @@ -0,0 +1,84 @@ +Shader "Custom/FocusDot" +{ + Properties + { + _EyePositionLeft("_EyePositionLeft", Vector) = (0.5, 0.5, 0., 0.) + _EyePositionRight("_EyePositionRight", Vector) = (0.5, 0.5, 0., 0.) + _MainTex ("_MainTex", 2D) = "black" {} + _RenderPoint ("_RenderPoint", int) = 1 + } + + SubShader + { + Lighting Off + Blend One Zero + + Pass + { + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_instancing + + float4 _EyePositionLeft; + float4 _EyePositionRight; + + int _RenderPoint; + + UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); + float4 _MainTex_ST; + float4 _MainTex_TexelSize; + + #include "UnityCG.cginc" + + + struct appdata + { + float4 vertex: POSITION; + float2 uv: TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex: SV_POSITION; + float2 uv: TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + v2f vert(appdata v) + { + v2f o; + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_OUTPUT(v2f, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); + fixed4 fixedCol = fixed4(1,0,0,0); + + fixed4 eyepos = lerp(_EyePositionLeft, _EyePositionRight, unity_StereoEyeIndex); + + int lookingAtPixel = _RenderPoint * (distance(i.uv, eyepos.rg) < 0.002); + + return lerp(col, fixedCol, lookingAtPixel); + } + ENDCG + } + } +} diff --git a/Shader/DSPV_PhospheneShader_orig.shader.meta b/Shader/FocusDot.shader.meta similarity index 71% rename from Shader/DSPV_PhospheneShader_orig.shader.meta rename to Shader/FocusDot.shader.meta index 43bcdf9..7297135 100644 --- a/Shader/DSPV_PhospheneShader_orig.shader.meta +++ b/Shader/FocusDot.shader.meta @@ -1,10 +1,9 @@ fileFormatVersion: 2 -guid: 35dd9856dc62cbc45b4513733b0153d8 +guid: d4bfcd8fc3d8e804b8e97fc8447d19f5 ShaderImporter: externalObjects: {} defaultTextures: [] nonModifiableTextures: [] - preprocessorOverride: 0 userData: assetBundleName: assetBundleVariant: diff --git a/Shader/FocusDot.shadergraph b/Shader/FocusDot.shadergraph new file mode 100644 index 0000000..4274593 --- /dev/null +++ b/Shader/FocusDot.shadergraph @@ -0,0 +1,1648 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "80ad84f50af14b6db35bde19ac7f8b12", + "m_Properties": [ + { + "m_Id": "80b234bb4e5749499abcb70a01cdbf96" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "9a0985fa3d124f7689bd097dbb1a6b55" + } + ], + "m_Nodes": [ + { + "m_Id": "cfaac70212ae46b2a9cb36e5513a052a" + }, + { + "m_Id": "af896bf7647e45d293cbf8042563817f" + }, + { + "m_Id": "3258e6dbb01b4fa5ad8fcab74ff33867" + }, + { + "m_Id": "5b080eee0a0c41f9b30c65b451df32ee" + }, + { + "m_Id": "f5a872544d864ca0ac6fb9cf6050a57f" + }, + { + "m_Id": "c07b72cde8694dd69ce8b0e062f084af" + }, + { + "m_Id": "8334913b201d473b8fa56874d47ec0bc" + }, + { + "m_Id": "42dd321b32714c2798d6cbc75e4a13c2" + }, + { + "m_Id": "76c0816a206f4c4c872fa7ae7b2858b0" + }, + { + "m_Id": "a269a157619a4fcfbada47b31498167c" + }, + { + "m_Id": "a888e2101f3b4ce0911be88dee20d2d2" + }, + { + "m_Id": "967e5ada20294dd0a1cb8e48a71cb9e7" + }, + { + "m_Id": "2e52d2ba5858470ca6c0d1f3ac1c37ca" + }, + { + "m_Id": "4f118c4c211046db83f302cffd8d9162" + }, + { + "m_Id": "9264dd31f0ff49a7a09a139bdc99e531" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2e52d2ba5858470ca6c0d1f3ac1c37ca" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c07b72cde8694dd69ce8b0e062f084af" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "42dd321b32714c2798d6cbc75e4a13c2" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a269a157619a4fcfbada47b31498167c" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4f118c4c211046db83f302cffd8d9162" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a888e2101f3b4ce0911be88dee20d2d2" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "76c0816a206f4c4c872fa7ae7b2858b0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f5a872544d864ca0ac6fb9cf6050a57f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8334913b201d473b8fa56874d47ec0bc" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c07b72cde8694dd69ce8b0e062f084af" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9264dd31f0ff49a7a09a139bdc99e531" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c07b72cde8694dd69ce8b0e062f084af" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "967e5ada20294dd0a1cb8e48a71cb9e7" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f5a872544d864ca0ac6fb9cf6050a57f" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a269a157619a4fcfbada47b31498167c" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "76c0816a206f4c4c872fa7ae7b2858b0" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a269a157619a4fcfbada47b31498167c" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "76c0816a206f4c4c872fa7ae7b2858b0" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a888e2101f3b4ce0911be88dee20d2d2" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "967e5ada20294dd0a1cb8e48a71cb9e7" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a888e2101f3b4ce0911be88dee20d2d2" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "967e5ada20294dd0a1cb8e48a71cb9e7" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c07b72cde8694dd69ce8b0e062f084af" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "5b080eee0a0c41f9b30c65b451df32ee" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f5a872544d864ca0ac6fb9cf6050a57f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "8334913b201d473b8fa56874d47ec0bc" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 604.0, + "y": -338.0 + }, + "m_Blocks": [ + { + "m_Id": "cfaac70212ae46b2a9cb36e5513a052a" + }, + { + "m_Id": "af896bf7647e45d293cbf8042563817f" + }, + { + "m_Id": "3258e6dbb01b4fa5ad8fcab74ff33867" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 604.0, + "y": -115.0 + }, + "m_Blocks": [ + { + "m_Id": "5b080eee0a0c41f9b30c65b451df32ee" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "2ac273017c3b47e183a94a587ac5e46e" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "03c542f5c6ba469799c8e8b5c34d03dc", + "m_Id": 0, + "m_DisplayName": "Predicate", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Predicate", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", + "m_ObjectId": "0575ad5a80bf436ea68af4edc4d92af3", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_ScreenSpaceType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "153c4e991c6f44b58ebc4f29fb4ab00d", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "176215eb43544cd9a442b8a3dc09ed61", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "18f4c32d17fc4e68865a0297d95c0219", + "m_Id": 2, + "m_DisplayName": "Y", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Y", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "1e1e1cf1cb9f434aa34d24e098b72b2b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "24e1b95643bb4da782f6e6758da42728", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "27d0b3e526c14374a7445b2432f23301", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "2ac273017c3b47e183a94a587ac5e46e", + "m_ActiveSubTarget": { + "m_Id": "67137ab8d42a48c0a29889f900121b68" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "2d7c67238c054c48b31182e5d79986d1", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ColorNode", + "m_ObjectId": "2e52d2ba5858470ca6c0d1f3ac1c37ca", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 284.9999694824219, + "y": 107.0, + "width": 208.00003051757813, + "height": 127.00004577636719 + } + }, + "m_Slots": [ + { + "m_Id": "b35f960e80e54571bfd19a6fa09d563f" + } + ], + "synonyms": [ + "rgba" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Color": { + "color": { + "r": 1.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "mode": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "2e62aa2c7fc04c6ba7757bc61b08f776", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3110c837fde84f428df273c3bd302a4d", + "m_Id": 1, + "m_DisplayName": "True", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "True", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3168ca784e444deaa4be7ee606ae92e8", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.009999999776482582, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3258e6dbb01b4fa5ad8fcab74ff33867", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "4140bca6ccbd4fd8b0d81d19359c8be3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "4140bca6ccbd4fd8b0d81d19359c8be3", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4172a746e1834a6ca78bc85dfb5b2fa6", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "42dd321b32714c2798d6cbc75e4a13c2", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -413.0, + "y": -44.0, + "width": 138.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "bf7a438ff5504de6b1121ef4a148e45f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "80b234bb4e5749499abcb70a01cdbf96" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "44ce59ddb3f143f09da92f009c05e6f0", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "4f118c4c211046db83f302cffd8d9162", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -459.0, + "y": 70.00000762939453, + "width": 208.0, + "height": 313.0 + } + }, + "m_Slots": [ + { + "m_Id": "176215eb43544cd9a442b8a3dc09ed61" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4f3ee17ae210410ea7c3fc118de42cf9", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "51426557869a4744a4ad0bf86f5a9015", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5b080eee0a0c41f9b30c65b451df32ee", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 488.0000305175781, + "y": 190.0, + "width": 199.99996948242188, + "height": 41.0 + } + }, + "m_Slots": [ + { + "m_Id": "bf25704355c44a338cf0d42d57f76247" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "65875fba2f5f4344bee2bc6f1a9357c1", + "m_Id": 2, + "m_DisplayName": "False", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "False", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInUnlitSubTarget", + "m_ObjectId": "67137ab8d42a48c0a29889f900121b68" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2Node", + "m_ObjectId": "76c0816a206f4c4c872fa7ae7b2858b0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Vector 2", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -83.0, + "y": -79.0, + "width": 128.0, + "height": 101.0 + } + }, + "m_Slots": [ + { + "m_Id": "c6c1fc91ec064236b35aa462bea5e349" + }, + { + "m_Id": "fc6b40339d2743e3a20eddfaeeb8def7" + }, + { + "m_Id": "2e62aa2c7fc04c6ba7757bc61b08f776" + } + ], + "synonyms": [ + "2", + "v2", + "vec2", + "float2" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Value": { + "x": 0.0, + "y": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "80b234bb4e5749499abcb70a01cdbf96", + "m_Guid": { + "m_GuidSerialized": "2f8321d2-2a17-479e-842d-0a59776e7e2d" + }, + "m_Name": "EyePosition", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "EyePosition", + "m_DefaultReferenceName": "_EyePosition", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ComparisonNode", + "m_ObjectId": "8334913b201d473b8fa56874d47ec0bc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Comparison", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 348.0, + "y": -79.0, + "width": 145.0, + "height": 136.0 + } + }, + "m_Slots": [ + { + "m_Id": "153c4e991c6f44b58ebc4f29fb4ab00d" + }, + { + "m_Id": "3168ca784e444deaa4be7ee606ae92e8" + }, + { + "m_Id": "cac81dcacd2e4b96ade6e14e5e3b2fa3" + } + ], + "synonyms": [ + "equal", + "greater than", + "less than" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_ComparisonType": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SceneColorNode", + "m_ObjectId": "9264dd31f0ff49a7a09a139bdc99e531", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Scene Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 355.0000305175781, + "y": 240.00001525878907, + "width": 137.99996948242188, + "height": 76.99998474121094 + } + }, + "m_Slots": [ + { + "m_Id": "0575ad5a80bf436ea68af4edc4d92af3" + }, + { + "m_Id": "51426557869a4744a4ad0bf86f5a9015" + } + ], + "synonyms": [ + "screen buffer" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "94f26a681551411f8660b8d2745075d3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2Node", + "m_ObjectId": "967e5ada20294dd0a1cb8e48a71cb9e7", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Vector 2", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -83.0, + "y": 69.0, + "width": 128.0, + "height": 101.0 + } + }, + "m_Slots": [ + { + "m_Id": "aaae7f20355941e49e03f4dd5c955e71" + }, + { + "m_Id": "18f4c32d17fc4e68865a0297d95c0219" + }, + { + "m_Id": "fa71c094bc8a44ebbe94222c2879b53a" + } + ], + "synonyms": [ + "2", + "v2", + "vec2", + "float2" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Value": { + "x": 0.0, + "y": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "9a0985fa3d124f7689bd097dbb1a6b55", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "80b234bb4e5749499abcb70a01cdbf96" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "a269a157619a4fcfbada47b31498167c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -228.0, + "y": -79.0, + "width": 120.0, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "44ce59ddb3f143f09da92f009c05e6f0" + }, + { + "m_Id": "e6db1d1d155145dfbcd85b2166f37dff" + }, + { + "m_Id": "27d0b3e526c14374a7445b2432f23301" + }, + { + "m_Id": "4f3ee17ae210410ea7c3fc118de42cf9" + }, + { + "m_Id": "4172a746e1834a6ca78bc85dfb5b2fa6" + } + ], + "synonyms": [ + "separate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "a888e2101f3b4ce0911be88dee20d2d2", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -228.0, + "y": 70.0, + "width": 120.0, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "f16cd3b11932447ba8a9baf5c1f2c3ef" + }, + { + "m_Id": "cf1ce3bcf81d4a7a89dd77284abf5562" + }, + { + "m_Id": "b0df472da6cf411e85a94712d567de14" + }, + { + "m_Id": "ddb14f79e8854b02936752e8f2fbca3e" + }, + { + "m_Id": "24e1b95643bb4da782f6e6758da42728" + } + ], + "synonyms": [ + "separate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a97ce923a76d4642b6eb4517dca5ff78", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "aaae7f20355941e49e03f4dd5c955e71", + "m_Id": 1, + "m_DisplayName": "X", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "X", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "af896bf7647e45d293cbf8042563817f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d0aba24e8f644fe5a44d575abf538f93" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b0df472da6cf411e85a94712d567de14", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b35f960e80e54571bfd19a6fa09d563f", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "bf25704355c44a338cf0d42d57f76247", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "bf7a438ff5504de6b1121ef4a148e45f", + "m_Id": 0, + "m_DisplayName": "EyePosition", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BranchNode", + "m_ObjectId": "c07b72cde8694dd69ce8b0e062f084af", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Branch", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 562.0, + "y": 163.00001525878907, + "width": 172.0, + "height": 141.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "03c542f5c6ba469799c8e8b5c34d03dc" + }, + { + "m_Id": "3110c837fde84f428df273c3bd302a4d" + }, + { + "m_Id": "65875fba2f5f4344bee2bc6f1a9357c1" + }, + { + "m_Id": "f6e4ac328dbb40a3ba943b0847bec038" + } + ], + "synonyms": [ + "switch", + "if", + "else" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c6c1fc91ec064236b35aa462bea5e349", + "m_Id": 1, + "m_DisplayName": "X", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "X", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "cac81dcacd2e4b96ade6e14e5e3b2fa3", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "cf1ce3bcf81d4a7a89dd77284abf5562", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "cfaac70212ae46b2a9cb36e5513a052a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "2d7c67238c054c48b31182e5d79986d1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "d0aba24e8f644fe5a44d575abf538f93", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ddb14f79e8854b02936752e8f2fbca3e", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e6db1d1d155145dfbcd85b2166f37dff", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f16cd3b11932447ba8a9baf5c1f2c3ef", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DistanceNode", + "m_ObjectId": "f5a872544d864ca0ac6fb9cf6050a57f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Distance", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 64.0, + "y": -79.0, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "94f26a681551411f8660b8d2745075d3" + }, + { + "m_Id": "1e1e1cf1cb9f434aa34d24e098b72b2b" + }, + { + "m_Id": "a97ce923a76d4642b6eb4517dca5ff78" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f6e4ac328dbb40a3ba943b0847bec038", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "fa71c094bc8a44ebbe94222c2879b53a", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "fc6b40339d2743e3a20eddfaeeb8def7", + "m_Id": 2, + "m_DisplayName": "Y", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Y", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "Y" + ] +} + diff --git a/Shader/FocusDot.shadergraph.meta b/Shader/FocusDot.shadergraph.meta new file mode 100644 index 0000000..fe962fe --- /dev/null +++ b/Shader/FocusDot.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: fb310d5633753604f90e41ac112ff2cf +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Shader/ImageProcessing.shader b/Shader/ImageProcessing.shader index 174095b..c94f660 100644 --- a/Shader/ImageProcessing.shader +++ b/Shader/ImageProcessing.shader @@ -3,13 +3,9 @@ Properties { // _PhosheneMapping("PhospheneMapping", 2D) = "black" { } - _EyePosition("EyePosition", Vector) = (0., 0., 0., 0.) _MainTex ("_MainTex", 2D) = "black" {} - _Mode("Mode", Float) = 0.0 - _GazeLocked("GazeLocked", Int) = 0 _ResX("Resolution_x", Int) = 512 _ResY("Resolution_y", Int) = 512 - } SubShader @@ -27,29 +23,28 @@ #pragma vertex vertex_program #pragma fragment frag #pragma target 3.0 + #pragma multi_compile_instancing struct AppData { float2 uv: TEXCOORD0; float4 vertex: POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID }; struct VertexData { float2 uv: TEXCOORD0; float4 vertex: SV_POSITION; + + UNITY_VERTEX_OUTPUT_STEREO }; // Texture that determines where phosphenes should be activated - sampler2D _MainTex; + UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); float4 _MainTex_ST; - float4 _MainTex_TexelSize; - - // EyePosition - float4 _EyePosition; - int _GazeLocked; - float _Mode; int _ResX; int _ResY; @@ -58,52 +53,32 @@ VertexData vertex_program(AppData inputs) { VertexData outputs; - outputs.uv = TRANSFORM_TEX(inputs.uv, _MainTex); + + UNITY_SETUP_INSTANCE_ID(inputs); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(outputs); + + outputs.uv = TRANSFORM_TEX(inputs.uv.xy, _MainTex); outputs.vertex = UnityObjectToClipPos(inputs.vertex); return outputs; } fixed4 frag(VertexData inputs) : SV_Target { - if (_Mode==1){ // Sobel Edge detection - // sample the texture - float2 offsets[9]; - GetOffsets3x3(_ResX, _ResY, offsets); + float2 offsets[9]; + GetOffsets3x3(_ResX, _ResY, offsets); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(inputs); - fixed3 textures[9]; - for (int j = 0; j < 9; j++) - { - textures[j] = tex2D(_MainTex, inputs.uv + offsets[j]).rgb; - } + fixed3 textures[9]; + for (int j = 0; j < 9; j++) + { + textures[j] = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, inputs.uv + offsets[j]).rgb; + } - fixed4 FragColor = ApplySobel(textures); + fixed4 FragColor = ApplySobel(textures); float bright = 10 * Luminance(FragColor); return bright; - } - - if (_Mode==2){ - // Edge detection - - // sample the texture - float2 offsets[9]; - GetOffsets3x3(_ResX, _ResY, offsets); - - fixed3 textures[9]; - for (int j = 0; j < 9; j++) - { - textures[j] = tex2D(_MainTex, inputs.uv + offsets[j]).rgb; - } - - float threshold = 0.1; - fixed4 FragColor = ApplyRobert(textures); - float bright = 10 * Luminance(FragColor); - return bright; - } - - - return tex2D(_MainTex, inputs.uv); } ENDCG } diff --git a/Shader/SurfaceReplacement.shader b/Shader/SurfaceReplacement.shader index 8b4188b..b1b76a2 100644 --- a/Shader/SurfaceReplacement.shader +++ b/Shader/SurfaceReplacement.shader @@ -14,6 +14,7 @@ Properties { SubShader { CGINCLUDE +#include fixed4 _ObjectColor; fixed4 _CategoryColor; int _OutputMode; diff --git a/Shader/TemporalDynamics.compute b/Shader/TemporalDynamics.compute index cf020ab..3feb61e 100644 --- a/Shader/TemporalDynamics.compute +++ b/Shader/TemporalDynamics.compute @@ -1,20 +1,27 @@ // Each #kernel tells which function to compile; you can have many kernels -#pragma kernel CSMain +#pragma kernel CalculateActivations +#pragma kernel SpreadActivations +#pragma kernel ClearActivations +#pragma kernel DebugBuffer + struct Phosphene { float2 position; float size; - float activation; - float trace; + float2 activation; // activation pro phosphene is eye dependent as stimulation is different (texture offset) + float2 trace; // same reason as activation }; -uint2 resolution; -int gazeAssistedSampling; -float2 _EyePosition; -float stim; +uint2 resolution; // resolution of input / stimulation texture +uint2 screenResolution; // resolution of output texture -float2 samplePosition; +int gazeAssisted; +int gazeLocked; +float2 _EyePositionLeft; +float2 _EyePositionRight; +float2 _LeftEyeCenter; +float2 _RightEyeCenter; float input_effect; // The factor by which stimulation accumulates to phosphene activation float intensity_decay; // The factor by which previous activation still influences current activation @@ -23,31 +30,142 @@ float trace_decay; // The factor by which the stimulation memory trace decr RWStructuredBuffer phosphenes; -RWTexture2D ActivationMask; +Texture2DArray ActivationMask; // ToDo: Should probably be renamed to InputTex or StimulationTex +RWTexture2DArray PhospheneTexture; // ToDo: Rename to ActivationTex +RWTexture2DArray PhospheneRender; // ToDo: SimulationTex? RenderTex? + +RWStructuredBuffer debugBuffer; -[numthreads(10,1,1)] -void CSMain (uint3 id : SV_DispatchThreadID) +[numthreads(32,1,2)] +void CalculateActivations (uint3 id : SV_DispatchThreadID) { - Phosphene phosphene = phosphenes[id.x]; + uint phosIdx = id.x; + uint eyeIdx = id.z; - // Read stimulation value from activation mask - if (gazeAssistedSampling == 1) - { - samplePosition = phosphene.position + _EyePosition - 0.5; - } - else - { - samplePosition = phosphene.position; - } + //*************************************************************************** + // Get Position and Stimulation + //*************************************************************************** + // get correct eye position (0 is left, 1 is right) + float2 eyePos = lerp(_EyePositionLeft, _EyePositionRight, eyeIdx); + float2 eyeCenter = lerp(_LeftEyeCenter, _RightEyeCenter, eyeIdx); + // if gaze assist is set to 1 (on), adjust sample position to eye position + // calculate corrected phosphene position + float2 samplePosition = phosphenes[phosIdx].position - 0.5 + + (gazeAssisted * eyePos) // With gaze assisted sampling, center around current eye position + + ((1 - gazeAssisted) * eyeCenter); // Without center around eye center calculated at the start of the programme + + // Read stimulation value from input texture uint2 index = uint2((uint)(samplePosition.x * resolution.x), (uint)(samplePosition.y * resolution.y)); - stim = ActivationMask[index.xy]; + float stim = ActivationMask[uint3(index, eyeIdx)].x; + //*************************************************************************** + // Update activation and trace + //*************************************************************************** + // Compute phosphene activation as function of previous activation and stimulation + float actv = phosphenes[phosIdx].activation[eyeIdx]; + phosphenes[phosIdx].activation[eyeIdx] = max(0, intensity_decay*actv + input_effect * (stim - phosphenes[phosIdx].trace[eyeIdx])); + phosphenes[phosIdx].trace[eyeIdx] = trace_decay*phosphenes[phosIdx].trace[eyeIdx] + trace_increase * stim; + //*************************************************************************** + // Write to activation texture + //*************************************************************************** + // calculate output position, either around center (in gaze ignored) or around foveal position + float2 outputPosition = phosphenes[phosIdx].position - 0.5 + + (gazeLocked * eyePos) // With gaze locked, center around current eye position + + ((1 - gazeLocked) * eyeCenter); // Without, center around eye center calculated at the start of the programme + + // calculate position on activation texture (can be different if input texture is a different size) + uint2 idx = uint2((uint)(outputPosition.x * screenResolution.x), (uint)(outputPosition.y * screenResolution.y)); + PhospheneTexture[uint3(idx, eyeIdx)] = float2(actv, phosphenes[phosIdx].size); +} - // Compute phosphene activation as function of previous activation and stimulation - phosphene.activation = max(0,intensity_decay*phosphene.activation+input_effect*(stim-phosphene.trace)); //max(0,intensity_decay*phosphene.activation + input_effect*(stim-phosphene.trace)); // - phosphene.trace = trace_decay*phosphene.trace + trace_increase*stim; +/** + * \brief samples from a normal distribution given the distance |mean - pos| and deviation (phosphene size) + * \param d distance from center + * \param sigma standard deviation + * \return sample from normal distribution + */ +float Gaussian(float d, float sigma) +{ + float c = 1.0 / (sigma * 2.50662); // 2.50662 is approximation of sqrt(2*pi) + return c * exp( -(d * d) / (2 * sigma * sigma) ); +} + +// macros for shared values +#define xThreads 16 +#define yThreads 32 + +[numthreads(xThreads,yThreads,2)] +void SpreadActivations(uint3 id : SV_DispatchThreadID) +{ + // get activation data from texture + float2 pixel = PhospheneTexture[id]; + const float actv = pixel.x; + const float size = pixel.y; + // if it's a pixel without activation or radius, we are done + if (size < 1e-5 || actv < 0.001) { return; } - phosphenes[id.x] = phosphene; + // y-indexing seems to be flipped? if this is not done, image is wrong way round + float y_corr = screenResolution.y - 1 - id.y; + + // write activation into output pixel + PhospheneRender[uint3(id.x, y_corr, id.z)] = float4(actv, actv, actv, 1); + // sigma is diameter, size is radius + const float sigma = size * 2.0; + // scale to normalise distribution on so that 0 distance has maximum activation (1 * actv) + const float scale = Gaussian(0, sigma); + + // after 3 deviations, tail is near unobservable, so spread up to 3 deviations + const uint max_r = size * 4.0 * screenResolution.x; // 2 deviations for performance + // to save sqrt for radius comparison save r^2 + const uint maxr2 = max_r * max_r; + + // iterate the entire area covered by the radius + for (uint xOff=0; xOff < max_r; xOff++) + { + for (uint yOff=0; yOff < max_r; yOff++) + { + // don't overwrite centre + if (xOff + yOff == 0) + continue; + // if we are past radius, move to next x-location, as we won't be inside the circle again if we increase the radius + if ((yOff*yOff + xOff*xOff) >= maxr2) + break; + + // calculate spread according to gaussian and scale + float dist = sqrt( (xOff*xOff) / (screenResolution.x * screenResolution.x) + + (yOff*yOff) / (screenResolution.y * screenResolution.y) ); + float spread = actv * Gaussian(dist, sigma) / scale; + + // spread the activation to pixels (since we only iterate one radius, we are writing to all 4 quadrants) + PhospheneRender[uint3(id.x + xOff, y_corr + yOff, id.z)] += float4(spread, spread, spread, 0); + PhospheneRender[uint3(id.x - xOff, y_corr + yOff, id.z)] += float4(spread, spread, spread, 0); + PhospheneRender[uint3(id.x + xOff, y_corr - yOff, id.z)] += float4(spread, spread, spread, 0); + PhospheneRender[uint3(id.x - xOff, y_corr - yOff, id.z)] += float4(spread, spread, spread, 0); + } + } } + + +[numthreads(xThreads,yThreads,2)] +void ClearActivations(uint3 id : SV_DispatchThreadID) +{ + // reset the activation texture + PhospheneTexture[uint3(id.xy, id.z)] = float2(0,0); + // reset render texture + PhospheneRender[uint3(id.xy, id.z)] = float4(0,0,0,1); +} + +[numthreads(32,32,1)] +void DebugBuffer(uint3 id : SV_DispatchThreadID) +{ + // float2 pixel = PhospheneTexture[float3(id.xy, 0)]; + // const float actv = pixel.x; + // const float size = pixel.y; + // // if it's a pixel without activation or radius, we are done + // debugBuffer[id.x + id.y * screenResolution.x] = float4(id.x, id.y, actv, size); + + float4 pixel = PhospheneRender[id]; + debugBuffer[id.x + id.y * screenResolution.x] = pixel; +} \ No newline at end of file diff --git a/Xarphos-Basement.cs b/Xarphos-Basement.cs new file mode 100644 index 0000000..bf89207 --- /dev/null +++ b/Xarphos-Basement.cs @@ -0,0 +1,666 @@ +//------------------------------------------------------------------------------ +// +// This code was auto-generated by com.unity.inputsystem:InputActionCodeGenerator +// version 1.3.0 +// from Assets/Xarphos/SharedWork/Xarphos-Basement.inputactions +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.Utilities; + +public partial class @XarphosBasement : IInputActionCollection2, IDisposable +{ + public InputActionAsset asset { get; } + public @XarphosBasement() + { + asset = InputActionAsset.FromJson(@"{ + ""name"": ""Xarphos-Basement"", + ""maps"": [ + { + ""name"": ""Experiment"", + ""id"": ""0c1a547e-22aa-4aae-8248-84c703b22548"", + ""actions"": [ + { + ""name"": ""Move"", + ""type"": ""Value"", + ""id"": ""34bd96bc-3257-4350-9dbd-20a6578f8d03"", + ""expectedControlType"": ""Vector2"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": true + }, + { + ""name"": ""Look"", + ""type"": ""Value"", + ""id"": ""f6b2fbf2-2525-497f-8b48-480edbaae60a"", + ""expectedControlType"": ""Vector2"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": true + }, + { + ""name"": ""TogglePhospheneSim"", + ""type"": ""Button"", + ""id"": ""3fe95d10-e39d-4cc8-87f5-5a1b2a7a1609"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""ToggleEdgeDetection"", + ""type"": ""Button"", + ""id"": ""3e196229-2795-46f2-bae8-3f888893222d"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""IterateSurfaceReplacement"", + ""type"": ""Button"", + ""id"": ""e0959e22-032b-4278-9985-09bbe7bf988b"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""ToggleEyeTrackingMode"", + ""type"": ""Button"", + ""id"": ""37a70d47-4e8b-4905-a375-e611ffd188ef"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""ToggleGazeLocking"", + ""type"": ""Button"", + ""id"": ""35675ead-d89e-41d8-905e-a26a620f4a17"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""ToggleCamLocking"", + ""type"": ""Button"", + ""id"": ""effd86eb-132c-4dc0-8579-f9f87766e61c"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + } + ], + ""bindings"": [ + { + ""name"": """", + ""id"": ""978bfe49-cc26-4a3d-ab7b-7d7a29327403"", + ""path"": ""/leftStick"", + ""interactions"": """", + ""processors"": """", + ""groups"": "";Gamepad"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8"", + ""path"": ""/joystick"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""XR"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": ""WASD"", + ""id"": ""00ca640b-d935-4593-8157-c05846ea39b3"", + ""path"": ""Dpad"", + ""interactions"": """", + ""processors"": ""ScaleVector2(x=0,y=0)"", + ""groups"": """", + ""action"": ""Move"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""up"", + ""id"": ""8180e8bd-4097-4f4e-ab88-4523101a6ce9"", + ""path"": ""/d"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""down"", + ""id"": ""1c5327b5-f71c-4f60-99c7-4e737386f1d1"", + ""path"": ""/s"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""left"", + ""id"": ""2e46982e-44cc-431b-9f0b-c11910bf467a"", + ""path"": ""/a"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""right"", + ""id"": ""77bff152-3580-4b21-b6de-dcd0c7e41164"", + ""path"": ""/h"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": """", + ""id"": ""3ea4d645-4504-4529-b061-ab81934c3752"", + ""path"": ""/stick"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Joystick"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""8ca86599-2946-4e18-9fa8-7bd3eebc7691"", + ""path"": ""/trackpad"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""e891f054-6cdc-4392-88ec-222828cb5834"", + ""path"": ""/touchpad"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""d556355b-2f1d-4663-80a3-eaff580a98ee"", + ""path"": ""/thumbstick"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""c1f7a91b-d0fd-4a62-997e-7fb9b69bf235"", + ""path"": ""/rightStick"", + ""interactions"": """", + ""processors"": ""ScaleVector2(x=15,y=15)"", + ""groups"": "";Gamepad"", + ""action"": ""Look"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""8c8e490b-c610-4785-884f-f04217b23ca4"", + ""path"": ""/delta"", + ""interactions"": """", + ""processors"": """", + ""groups"": "";Keyboard&Mouse;Touch"", + ""action"": ""Look"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""3e5f5442-8668-4b27-a940-df99bad7e831"", + ""path"": ""/{Hatswitch}"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Joystick"", + ""action"": ""Look"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""34a92533-1493-489f-97e9-401f2c472119"", + ""path"": ""/p"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""TogglePhospheneSim"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""32b6aaa4-3eee-42d2-9d12-f0792fc402ca"", + ""path"": ""/3"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""TogglePhospheneSim"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""24a67646-4120-4be0-889b-b8fd6b463fe5"", + ""path"": ""/e"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleEdgeDetection"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""0d48eca3-feac-46bd-a760-06ecc1e0d7c0"", + ""path"": ""/2"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleEdgeDetection"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""3015442e-b235-486c-a9a6-bbf917e480c6"", + ""path"": ""/t"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""IterateSurfaceReplacement"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""ab8dff0c-f727-49c3-a20c-017d3030bfa4"", + ""path"": ""/1"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""IterateSurfaceReplacement"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""eec3cc20-0a98-451b-954a-9cfb0fd747ef"", + ""path"": ""/g"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleGazeLocking"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""b685618a-b179-4684-8af0-3a47dc8fd4b4"", + ""path"": ""/5"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleGazeLocking"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""d50be507-897d-416c-96ce-65ea22dd8b9b"", + ""path"": ""/c"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleCamLocking"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""1c6fc37a-ea91-4895-9a57-e60854d729ac"", + ""path"": ""/6"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleCamLocking"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""89c72108-0434-4308-b703-f72af2a98878"", + ""path"": ""/c"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleEyeTrackingMode"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""32e146f2-3d6a-4d6f-9e5b-4356f0dbd45e"", + ""path"": ""/4"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""ToggleEyeTrackingMode"", + ""isComposite"": false, + ""isPartOfComposite"": false + } + ] + } + ], + ""controlSchemes"": [ + { + ""name"": ""Keyboard&Mouse"", + ""bindingGroup"": ""Keyboard&Mouse"", + ""devices"": [ + { + ""devicePath"": """", + ""isOptional"": false, + ""isOR"": false + }, + { + ""devicePath"": """", + ""isOptional"": false, + ""isOR"": false + } + ] + }, + { + ""name"": ""Gamepad"", + ""bindingGroup"": ""Gamepad"", + ""devices"": [ + { + ""devicePath"": """", + ""isOptional"": false, + ""isOR"": false + } + ] + }, + { + ""name"": ""Touch"", + ""bindingGroup"": ""Touch"", + ""devices"": [ + { + ""devicePath"": """", + ""isOptional"": false, + ""isOR"": false + } + ] + }, + { + ""name"": ""Joystick"", + ""bindingGroup"": ""Joystick"", + ""devices"": [ + { + ""devicePath"": """", + ""isOptional"": false, + ""isOR"": false + } + ] + }, + { + ""name"": ""XR"", + ""bindingGroup"": ""XR"", + ""devices"": [ + { + ""devicePath"": """", + ""isOptional"": false, + ""isOR"": false + } + ] + } + ] +}"); + // Experiment + m_Experiment = asset.FindActionMap("Experiment", throwIfNotFound: true); + m_Experiment_Move = m_Experiment.FindAction("Move", throwIfNotFound: true); + m_Experiment_Look = m_Experiment.FindAction("Look", throwIfNotFound: true); + m_Experiment_TogglePhospheneSim = m_Experiment.FindAction("TogglePhospheneSim", throwIfNotFound: true); + m_Experiment_ToggleEdgeDetection = m_Experiment.FindAction("ToggleEdgeDetection", throwIfNotFound: true); + m_Experiment_IterateSurfaceReplacement = m_Experiment.FindAction("IterateSurfaceReplacement", throwIfNotFound: true); + m_Experiment_ToggleEyeTrackingMode = m_Experiment.FindAction("ToggleEyeTrackingMode", throwIfNotFound: true); + m_Experiment_ToggleGazeLocking = m_Experiment.FindAction("ToggleGazeLocking", throwIfNotFound: true); + m_Experiment_ToggleCamLocking = m_Experiment.FindAction("ToggleCamLocking", throwIfNotFound: true); + } + + public void Dispose() + { + UnityEngine.Object.Destroy(asset); + } + + public InputBinding? bindingMask + { + get => asset.bindingMask; + set => asset.bindingMask = value; + } + + public ReadOnlyArray? devices + { + get => asset.devices; + set => asset.devices = value; + } + + public ReadOnlyArray controlSchemes => asset.controlSchemes; + + public bool Contains(InputAction action) + { + return asset.Contains(action); + } + + public IEnumerator GetEnumerator() + { + return asset.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Enable() + { + asset.Enable(); + } + + public void Disable() + { + asset.Disable(); + } + public IEnumerable bindings => asset.bindings; + + public InputAction FindAction(string actionNameOrId, bool throwIfNotFound = false) + { + return asset.FindAction(actionNameOrId, throwIfNotFound); + } + public int FindBinding(InputBinding bindingMask, out InputAction action) + { + return asset.FindBinding(bindingMask, out action); + } + + // Experiment + private readonly InputActionMap m_Experiment; + private IExperimentActions m_ExperimentActionsCallbackInterface; + private readonly InputAction m_Experiment_Move; + private readonly InputAction m_Experiment_Look; + private readonly InputAction m_Experiment_TogglePhospheneSim; + private readonly InputAction m_Experiment_ToggleEdgeDetection; + private readonly InputAction m_Experiment_IterateSurfaceReplacement; + private readonly InputAction m_Experiment_ToggleEyeTrackingMode; + private readonly InputAction m_Experiment_ToggleGazeLocking; + private readonly InputAction m_Experiment_ToggleCamLocking; + public struct ExperimentActions + { + private @XarphosBasement m_Wrapper; + public ExperimentActions(@XarphosBasement wrapper) { m_Wrapper = wrapper; } + public InputAction @Move => m_Wrapper.m_Experiment_Move; + public InputAction @Look => m_Wrapper.m_Experiment_Look; + public InputAction @TogglePhospheneSim => m_Wrapper.m_Experiment_TogglePhospheneSim; + public InputAction @ToggleEdgeDetection => m_Wrapper.m_Experiment_ToggleEdgeDetection; + public InputAction @IterateSurfaceReplacement => m_Wrapper.m_Experiment_IterateSurfaceReplacement; + public InputAction @ToggleEyeTrackingMode => m_Wrapper.m_Experiment_ToggleEyeTrackingMode; + public InputAction @ToggleGazeLocking => m_Wrapper.m_Experiment_ToggleGazeLocking; + public InputAction @ToggleCamLocking => m_Wrapper.m_Experiment_ToggleCamLocking; + public InputActionMap Get() { return m_Wrapper.m_Experiment; } + public void Enable() { Get().Enable(); } + public void Disable() { Get().Disable(); } + public bool enabled => Get().enabled; + public static implicit operator InputActionMap(ExperimentActions set) { return set.Get(); } + public void SetCallbacks(IExperimentActions instance) + { + if (m_Wrapper.m_ExperimentActionsCallbackInterface != null) + { + @Move.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnMove; + @Move.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnMove; + @Move.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnMove; + @Look.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnLook; + @Look.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnLook; + @Look.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnLook; + @TogglePhospheneSim.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnTogglePhospheneSim; + @TogglePhospheneSim.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnTogglePhospheneSim; + @TogglePhospheneSim.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnTogglePhospheneSim; + @ToggleEdgeDetection.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleEdgeDetection; + @ToggleEdgeDetection.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleEdgeDetection; + @ToggleEdgeDetection.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleEdgeDetection; + @IterateSurfaceReplacement.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnIterateSurfaceReplacement; + @IterateSurfaceReplacement.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnIterateSurfaceReplacement; + @IterateSurfaceReplacement.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnIterateSurfaceReplacement; + @ToggleEyeTrackingMode.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleEyeTrackingMode; + @ToggleEyeTrackingMode.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleEyeTrackingMode; + @ToggleEyeTrackingMode.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleEyeTrackingMode; + @ToggleGazeLocking.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleGazeLocking; + @ToggleGazeLocking.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleGazeLocking; + @ToggleGazeLocking.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleGazeLocking; + @ToggleCamLocking.started -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleCamLocking; + @ToggleCamLocking.performed -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleCamLocking; + @ToggleCamLocking.canceled -= m_Wrapper.m_ExperimentActionsCallbackInterface.OnToggleCamLocking; + } + m_Wrapper.m_ExperimentActionsCallbackInterface = instance; + if (instance != null) + { + @Move.started += instance.OnMove; + @Move.performed += instance.OnMove; + @Move.canceled += instance.OnMove; + @Look.started += instance.OnLook; + @Look.performed += instance.OnLook; + @Look.canceled += instance.OnLook; + @TogglePhospheneSim.started += instance.OnTogglePhospheneSim; + @TogglePhospheneSim.performed += instance.OnTogglePhospheneSim; + @TogglePhospheneSim.canceled += instance.OnTogglePhospheneSim; + @ToggleEdgeDetection.started += instance.OnToggleEdgeDetection; + @ToggleEdgeDetection.performed += instance.OnToggleEdgeDetection; + @ToggleEdgeDetection.canceled += instance.OnToggleEdgeDetection; + @IterateSurfaceReplacement.started += instance.OnIterateSurfaceReplacement; + @IterateSurfaceReplacement.performed += instance.OnIterateSurfaceReplacement; + @IterateSurfaceReplacement.canceled += instance.OnIterateSurfaceReplacement; + @ToggleEyeTrackingMode.started += instance.OnToggleEyeTrackingMode; + @ToggleEyeTrackingMode.performed += instance.OnToggleEyeTrackingMode; + @ToggleEyeTrackingMode.canceled += instance.OnToggleEyeTrackingMode; + @ToggleGazeLocking.started += instance.OnToggleGazeLocking; + @ToggleGazeLocking.performed += instance.OnToggleGazeLocking; + @ToggleGazeLocking.canceled += instance.OnToggleGazeLocking; + @ToggleCamLocking.started += instance.OnToggleCamLocking; + @ToggleCamLocking.performed += instance.OnToggleCamLocking; + @ToggleCamLocking.canceled += instance.OnToggleCamLocking; + } + } + } + public ExperimentActions @Experiment => new ExperimentActions(this); + private int m_KeyboardMouseSchemeIndex = -1; + public InputControlScheme KeyboardMouseScheme + { + get + { + if (m_KeyboardMouseSchemeIndex == -1) m_KeyboardMouseSchemeIndex = asset.FindControlSchemeIndex("Keyboard&Mouse"); + return asset.controlSchemes[m_KeyboardMouseSchemeIndex]; + } + } + private int m_GamepadSchemeIndex = -1; + public InputControlScheme GamepadScheme + { + get + { + if (m_GamepadSchemeIndex == -1) m_GamepadSchemeIndex = asset.FindControlSchemeIndex("Gamepad"); + return asset.controlSchemes[m_GamepadSchemeIndex]; + } + } + private int m_TouchSchemeIndex = -1; + public InputControlScheme TouchScheme + { + get + { + if (m_TouchSchemeIndex == -1) m_TouchSchemeIndex = asset.FindControlSchemeIndex("Touch"); + return asset.controlSchemes[m_TouchSchemeIndex]; + } + } + private int m_JoystickSchemeIndex = -1; + public InputControlScheme JoystickScheme + { + get + { + if (m_JoystickSchemeIndex == -1) m_JoystickSchemeIndex = asset.FindControlSchemeIndex("Joystick"); + return asset.controlSchemes[m_JoystickSchemeIndex]; + } + } + private int m_XRSchemeIndex = -1; + public InputControlScheme XRScheme + { + get + { + if (m_XRSchemeIndex == -1) m_XRSchemeIndex = asset.FindControlSchemeIndex("XR"); + return asset.controlSchemes[m_XRSchemeIndex]; + } + } + public interface IExperimentActions + { + void OnMove(InputAction.CallbackContext context); + void OnLook(InputAction.CallbackContext context); + void OnTogglePhospheneSim(InputAction.CallbackContext context); + void OnToggleEdgeDetection(InputAction.CallbackContext context); + void OnIterateSurfaceReplacement(InputAction.CallbackContext context); + void OnToggleEyeTrackingMode(InputAction.CallbackContext context); + void OnToggleGazeLocking(InputAction.CallbackContext context); + void OnToggleCamLocking(InputAction.CallbackContext context); + } +} diff --git a/Xarphos-Basement.cs.meta b/Xarphos-Basement.cs.meta new file mode 100644 index 0000000..8b7e517 --- /dev/null +++ b/Xarphos-Basement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c06baad5f62772c419d0e01dd9ef3c8c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Xarphos-Basement.inputactions b/Xarphos-Basement.inputactions new file mode 100644 index 0000000..a0f8c88 --- /dev/null +++ b/Xarphos-Basement.inputactions @@ -0,0 +1,433 @@ +{ + "name": "Xarphos-Basement", + "maps": [ + { + "name": "Experiment", + "id": "0c1a547e-22aa-4aae-8248-84c703b22548", + "actions": [ + { + "name": "Move", + "type": "Value", + "id": "34bd96bc-3257-4350-9dbd-20a6578f8d03", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Look", + "type": "Value", + "id": "f6b2fbf2-2525-497f-8b48-480edbaae60a", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "TogglePhospheneSim", + "type": "Button", + "id": "3fe95d10-e39d-4cc8-87f5-5a1b2a7a1609", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ToggleEdgeDetection", + "type": "Button", + "id": "3e196229-2795-46f2-bae8-3f888893222d", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "IterateSurfaceReplacement", + "type": "Button", + "id": "e0959e22-032b-4278-9985-09bbe7bf988b", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ToggleEyeTrackingMode", + "type": "Button", + "id": "37a70d47-4e8b-4905-a375-e611ffd188ef", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ToggleGazeLocking", + "type": "Button", + "id": "35675ead-d89e-41d8-905e-a26a620f4a17", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ToggleCamLocking", + "type": "Button", + "id": "effd86eb-132c-4dc0-8579-f9f87766e61c", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", + "path": "/leftStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", + "path": "/joystick", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "WASD", + "id": "00ca640b-d935-4593-8157-c05846ea39b3", + "path": "Dpad", + "interactions": "", + "processors": "ScaleVector2(x=0,y=0)", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "2e46982e-44cc-431b-9f0b-c11910bf467a", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "77bff152-3580-4b21-b6de-dcd0c7e41164", + "path": "/h", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "3ea4d645-4504-4529-b061-ab81934c3752", + "path": "/stick", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8ca86599-2946-4e18-9fa8-7bd3eebc7691", + "path": "/trackpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e891f054-6cdc-4392-88ec-222828cb5834", + "path": "/touchpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d556355b-2f1d-4663-80a3-eaff580a98ee", + "path": "/thumbstick", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", + "path": "/rightStick", + "interactions": "", + "processors": "ScaleVector2(x=15,y=15)", + "groups": ";Gamepad", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8c8e490b-c610-4785-884f-f04217b23ca4", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse;Touch", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3e5f5442-8668-4b27-a940-df99bad7e831", + "path": "/{Hatswitch}", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "34a92533-1493-489f-97e9-401f2c472119", + "path": "/p", + "interactions": "", + "processors": "", + "groups": "", + "action": "TogglePhospheneSim", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "32b6aaa4-3eee-42d2-9d12-f0792fc402ca", + "path": "/3", + "interactions": "", + "processors": "", + "groups": "", + "action": "TogglePhospheneSim", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "24a67646-4120-4be0-889b-b8fd6b463fe5", + "path": "/e", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleEdgeDetection", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "0d48eca3-feac-46bd-a760-06ecc1e0d7c0", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleEdgeDetection", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3015442e-b235-486c-a9a6-bbf917e480c6", + "path": "/t", + "interactions": "", + "processors": "", + "groups": "", + "action": "IterateSurfaceReplacement", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ab8dff0c-f727-49c3-a20c-017d3030bfa4", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "", + "action": "IterateSurfaceReplacement", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "eec3cc20-0a98-451b-954a-9cfb0fd747ef", + "path": "/g", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleGazeLocking", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b685618a-b179-4684-8af0-3a47dc8fd4b4", + "path": "/5", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleGazeLocking", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d50be507-897d-416c-96ce-65ea22dd8b9b", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleCamLocking", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1c6fc37a-ea91-4895-9a57-e60854d729ac", + "path": "/6", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleCamLocking", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "89c72108-0434-4308-b703-f72af2a98878", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleEyeTrackingMode", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "32e146f2-3d6a-4d6f-9e5b-4356f0dbd45e", + "path": "/4", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleEyeTrackingMode", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [ + { + "name": "Keyboard&Mouse", + "bindingGroup": "Keyboard&Mouse", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Gamepad", + "bindingGroup": "Gamepad", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Touch", + "bindingGroup": "Touch", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Joystick", + "bindingGroup": "Joystick", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "XR", + "bindingGroup": "XR", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + } + ] +} \ No newline at end of file diff --git a/Xarphos-Basement.inputactions.meta b/Xarphos-Basement.inputactions.meta new file mode 100644 index 0000000..09c3857 --- /dev/null +++ b/Xarphos-Basement.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: ba47e8253eefe60409f20f9227ccc725 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 1 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: