diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..f019fd0 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/.gitkeep b/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Assets/SerializedUdonPrograms.meta b/Assets/SerializedUdonPrograms.meta new file mode 100644 index 0000000..0a92ec7 --- /dev/null +++ b/Assets/SerializedUdonPrograms.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 41eac1f5f460ebe42bfcbecac0fbdb5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset new file mode 100644 index 0000000..6c99b96 --- /dev/null +++ b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 18a8a73823b22934e929c67357a4e2d7 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5aeb72d346143e722cdf736b1b0cbd52681b53124b493afddb42a021338530499c3f0c134cec80191b32b661c22bf48dfa1e7d9ccea4e71cadc87ab52bd98e65e3147b2c59bbdab3e7fbce6557c74e38802f6b050f07b00b9b50860ad4e00dbcc66f9b786ee1dbbbf2db1f431bcf2ff058c5be15b81e31925ecbd6553c6ee35507ba38f22d1ce1b9c1fd7b50c7efdb38b68e57d47a8c9f3ade6525715005eec10e3c82a2b51421e2800775449b45b8ac0c1eefc27becadb3523489c35d453cec614f87fb5aa8b47fdf1378cab05ad8778463dad04499cf5962e61f1acb98f89417e799f36648e1a720aeb3e29c54be5be243f7ce4a632de99317fd73e23a27ceb624cb3fa795efb26e29f19997c6cbed0bd4767676f6af6d31e30f90832a9c8093a01b6f0de01afec868a720d1a98400bdccd37691fe1314a0b14c85edde850d58d75ae69a5590f4dee46315ef68b0509a4c99e2efc014a45c13df75c9ad3ad8bec55e498ed5c09e32fc89671af50cd6d0519e28520e70da26ba661df6f178c2f29ea1dac13ba320910baa637651a617212d6cf1093dc1eb266bb8c7c777ac699db5dfc6b62ec7eb6b8cd8bb783ee5d982d8dbf85d37e7bea04cafa33e504ced5e38fa66ba8768487b8763e79345266111a23eb528c230e97066fa2b60894f1c7a49c6e605c893b1e6a5eb9eb6757038b7ee06181c1c6310a1debfa3f87e1ac20c99bbc808ce2d4c2fbb17d60638b44c585f47c00a2395e495ac2b0109e1eadb76d2252555ea2d0df5ae2d96332da2ac8288ae0cc21326e1e911089f3109cf68845b030a4fea3c927703af62f5c80ab6794bed7dee6d707e2ec34344d215999a30f91b2bd3fdbe5f3ee48dda5bd624dc8369cbb3aab016f05e3725364f25ab0c10abb62687b5759621935bcd09598646bec4b9682dadb144fa8cd63af9bead5360ebb8a1d6198dc6260ba57416e21df5cb8f2276466b99d9be2d33c7965919206e466591b42e55a6c5734c4079354de6cc693263cac10b2348f05993d68b17d43aa7134c503eeb4770c12c386fa2e3f311d051d0851543d98b35ac7a257bf735f8bec1b7495f003d3f2a4bf36f8afae71b99321ce2fb0d2a7e0877d0cb6b1c09def30bf5e84799db4d3dfa785de2780d3e424751608ac2599d779001afe8585937e609354bdcc16f54417a2ff87a0154c239c4a7b93a8fea62ae0fc1aebae092d905e74c088a3a04bff765d75deeab32366f2d1aa9650740376f4277d5846e38fb6c09fb84a1e94ff220e8164ce8aee9d06d85a0d3ef1e3c6c1d81ada568da3f26959703f49306cea3c79ac6b76551debdcffcb571e4631e41571d703825bbd07fe18de66e611453c5641f357ace2933ba0cf72598cb70c7811c326c45260a85e74534fe98cb76fe53be0e5d342673f5292d10f9b290695e9f2e1bd2afc8aa7e4539e1700abf3da437456b416581d48cde87065f873c018ff8b7051440c9fb0803b7ca0382811739df0eca7c25eca89b6f9505f8a58b1154a2c9c9bc65bfcde6ed302f14f28af03f46e675c36d7682f131cf19e914d5a356925753e38517d38f4df36f647f2f45facc79fad5a74d97babefd9f67469732e3774442c14f242e2592eb71463b4d454b6903bc5ff9c88204fa10a34d99eb22c5c86c4fcce7fa01324cdca739ee3ddabe8f9bb6966187131b6d85b868cb49b4dd988cb7ad4d216db644dbcdc9d0e64e61902625da7e8893b62c0769ef4ad49942c2b212613fc64d18f999fc8cf94b7c84d97111969108fb69dc84c598c96223cc92085b1e376131e6b0d8080389b0d2b809db9842c26624c26e8d9bb018b7b2b111969008fb791c84bdfb50d58b3524e7e2222c2511763b4ec26802755bb12d9e004ea7d0d3f270698a252e7917fd72faa18e5032ec024ba18f705ebd625130409b6d2a67d3c6bbc692aa52edc2e1df037e85c18a7de132a30b0bab20156014cb05ffe030c962890ee9450a278510ab38fcebc565c64f7fa74909b3b39b16b9ac5641cbd78493efe0cd9e2bd3cbfe0f57be09a7702e0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset.meta b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset.meta new file mode 100644 index 0000000..f5f5b3f --- /dev/null +++ b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 192f906ac0d620d40854ac2176be9380 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset new file mode 100644 index 0000000..d37f7ca --- /dev/null +++ b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 1acedb947e4c9dc4d8f749557d611c1e + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09edd3f6cef44c4dd5d7d5d5617a86a284d2ff6287f5d780ea51edaa56f5ab617553ddd0bfda753aa53fce96bbffb29ad1e998fe1ed47987d5ae1c67c2bfaad826fddda5b766d59c3e735e0de97402f37bd588fedda5cf1dd15bb07754ff1fd147c596eb93fa5587baa42eaacad8861c2206f0a459b32f0676c556eaef36f5acce1d41a5e02209ccaad45fbd3a6716f3a6b4d2ee718fa9c7d1ac299d37a4cf9951935ae67594b87297d62986363957d0ff57e8ff1de6f732931699fd67c971ee7e733ae69f23db2079dc6c2f37f99d641bd2b8499b4cfe79a203a4c5266d36fbbaccf64a939698b4c5e43f64b64b4d5a66d2559ef35799f48cd97fc16cb799ed87cd76bbd9ee36db0f98b4dca415265d6dd235265d6bd25673fe45c756e4117ffdf5d7ff67f24f9b741db1653b6102e96623e392d9de499840bac593bf9b308174ab27ff8c49f7916bee25fb20dde6396733b9962bd33d0ed20de6f8cb667b3fe109e9468fbc2ac217d24a4f7eab49ebccfe2b641bd27a93264d7e0fd986f488d9dfeb9177ccecef23db901e37e9518fbca326ad65e49d34fbfbc936a4a74cdae891d768d28447de61a2b77b3df738480f9ae307cc760dd94ff5d9648e7b84948bcbdfe5ec1e07e97a4fb9adf3ecbfaa8cbfc66318bdceeb7832a8a655022b7e8dca3fccba67e60eb0186be00bfe55e165e774289bd6022c51ae1f63e89c6ad03e618b729b636544ef76fc1ed4474ca050b898e712af645c02949bd49f1112a267f5fe4e8cf010a427744ead0e1a1378d613da4d1fd39f742903fab2933acc8f68e79bd79702794f68b5338fcc65128473ef393d5aa6d3da4ce93d2ed069bd3d891af6e2f72dd47404b5efd2fbe6b0edbba15bbf369ddec6ab65da3ea37fdbaed96790d975b4373adc7ea769738ba9435b03da27b0fd592a91c5281140bfe251530d9727b0c57e29a32496183a41063a325d46461d228ba5edab5709ecebf46510f46f63a68576ff86bc9b2865501f9bcd1e3b1d28f2436845aa94553cddae0695c0bedab61c7665a30af2aab147ed57ff787c7912b4f4f28f59f827e3a64dcb34a9c463126c31928b38c9c5854a5e66f319ecff8e89fa4cbfdee73486673177022368adee128fe87dee2003e87347bafed28dc7cea30ed93d0b62fd760fac19136a321c2c098556823e724829217d394f5a6e2b151c7df48658937b51f73194e3bf1ec36067a7d73559d2a5483ab3a3954b078e60dc56638060995dad968c4a53ca579a15b6e2c1414d4f88c593ab61cb563830a2acccbb70cab1703666d8965d03ae688a6d4503f42a2c4a811765144d395f342bb9725fcdb9a38f722fe184afb10a7fc19753ade2b0ace5caca0796524ef8ba00849771c2d75b845754f913fe00c77c4300055ace09df1840815670c22b03d07c35277c53009aafe1846fb608ffcfbf1ff6257c2d277c4b009aafb3084f60cdbaa616a33b03c30fe8dc8fe863e7b2760fe0c8ec311b66bf8e78f8d8e335748bab6330bb168c5e5c245f6fa38da126dc6eca1c0ebde138ff2de1f6bca9ee505c1725fbf5397a1b6c1501e8edb4a9e4ad043bf84ab09113bcab40c1959ce0dd050adec409de53a0e0cd9ce0bd050adec209de57a0e0ad9ce0fd050adec6093e50a0e0ed9c60986eaff2088e3da837af9b21f629ed91cfa9a4baa353f98f1f9b76d8225b59d891ed9226f5a472a61bfd47b6eabc235b0d13d9725d9f8b6c3b398f3868f308b87b378104c3f58720fc6497cd52f09343f954aa1a5ef06e0ee1611b42b86937aa376eea5d6163f4836b0f87eb4881b8f672b86a6db8e0fedb2c69b56581f901b48f03942810d07e0e50d206088ebe652a3e54f7868210f901708003505720802a0e40bd0d00c4cea7f5cf413c7606fbc610afc3c250cd61682810430d87e1a80d0384b7260cf993e807a7750dde6b00ec51cd24c70153a7f737695f4ded6ff665f641ceec63059a7d88137cbc40c187399e276c3c61ec0bf44ea9abfab83b482cf5bbfeee6f3fcc8e70a63516685a2d27f8648182139ce053050a4eda04c3d402743a0b9d71a9e384370520bc9e137eda2afcf9763fc21b2cc21338af06b2c29f1469bf1b1d82bdbf034b9396795825708a0f7c26786d203a7abfe2f61e36ac8aaa165283eb851fe57cea4c000e7b8c13de1a80f0e39cf0b6006ac3099b70a80ded16f749966716b12967ef255bf84b3672f6740400eb2427fc6c00c24f71c2cf0550120f7225d12956124db64bc2262c012de846fa699be455b89947a3b68d17dc6c130c775760d569a1b76e5ab8f2bd6029dfca97ffdbe8a77ccfd884c3f1b0ce35a36f041292e6e3a7ffd3ca795137eb45afbdfa6a33f9c29b0c7ebca8cd72c904deee599c4513b0663b35540bb651bd68a198c0bb4fd9964514a611d4eb96d417d3a6c2aaddec8b330ad3826b57db6da58fb7cc9e5c94d2bf6219a706eb03976d3e80f7f16ab3d00f422f8f276473872be80ed20a714ed1c1c5ba1e5bacab57ee12e65e7de6055dd0831a3b54367804e319bcee536672aa565dd39f31ccb9a6a5cf6a7d064d21cd601e2db4f4d56b7ee2e859ce825e9b056758ceb028645a1f346734ef44cd9d75521d5ab767743eecb79f9dbe9e2a38ebce71d6f5d9acebf654e4f4eb3a76ddd4565e434d6f685d2794bb221884b4e2beecda67cf0bcaee4eceee7e9bdd7c30edc12b0f63f84af7c85b774ff76a4dd76ef9d1f93ca7f3804de74e4f59d1abd292eac4baecd6ff3e356e254dcfce961354f97471b63e62b3b5c547f9387bc62cdaa6966df1fbb91c3fb63dc4d976d5665b5b20b62dacfc16eaa917380b1fb559b8cfe3a929aa8e557dda42ba982053cb549e1f2d1fe6b47c934dcba605c400c88747062166bbe7f6ea5a378e756d244bbc4fefa2f9b1aa9bb3ea319b552716601574c3e6306238919db7c2d6b3f063cb45ce9637db6cb9e3c396d4b4d2795d22030bae2f61e570845376f8e17a89e3fab88d6b73464b92aa6f0ecd73a8c1149675b6da999e436fa30755a72f7396bdc566d9d59c9639fd98219f96159e130c8d2b1c8d6b361a07d8fa93f2326f2408aac5e8e1347dc2a669579e7d9b6e1c9d409c9ac6a519439ea8b5782d642f67efa0cdde46b664bad1a271357ab707701387d6c3d86a3a2d69764b83e8d1f471d65c0fc6cf6c356261dcfb394d8782d1f47a609a0e709a0e2f2c920511a31792134c247b84a33162a3716191690463f355cee6519bcdc7595f85a5ca7dca59d2ec583f6bbc75ceeccd4e203d6f4093831eaddd9262fd89c540c9b3184966f49997f10cd89a55095c899e54f93faa0ed79ec2a59193da8a41fdcb7de629bb049872e61e5c1f55de09c9853ec39ccb0a279ec2f9a36a903c176bb32eb74dfcf3dac5c6225796268dabd0ef354bc769a9162570adf8a1057a536e2d26e06acbec3ee47fc1bb23e0a28237db68014e3f6cd20c90fab5d461f33be795722d403d8202dca77c03786b03b857abd66f1887adb3fa331d53aa385e9484127852125331629a8f181ef807b1d023fc5c60d57161cf7a64068e0a0cd5b7b57ab017e40d7b03093e37f146d3fc291a08aa2d5e529da582a55a297beb9284566af23e6f4092d0804c01840e37de626dbf2159db5761995df38c518e7baf53c80b0e4ad26a7f693e462c24029c54a900795312d94a836c501f30a692b2b86aa4701d24b8a6257195195ccedcec1cce0c0ea197d5cb616b91c2d640b03d2d896db5c13685a77421341879c0f4f62dc49794c3572e856f05c13713465c1b4d1b7736c821db21856c2f41362b1dd79c61636a941b3d0f6b26b8e624715528fba31921c0bb2205af9dc09b0fa37a8e23289854bd2d1bd1c4ba1de504d9ad3090a5f7d404239a18b27a82ec19e98896de53ab8b604f6d17c1753b3c5c75b215520cd72182eb59495c7cc7f668043bb60f126c6f95c4b6c6609bc596735ecd907b84dd28269a0d410501f85c180d417ad756700c2ad6b5ad21c8de1646649bc5d3ea653d4c0c5725c175273c5c0db2eda618ae6d04d7dbc3a890e93d33c146402c861d23c89e0fc3c3523d33415c625d8d0304d70b92b8e277437e34dbc62401f56258a004639618a8a304d43bc20225380f2b06aa91807aa72428b7979f7abc20cab3156b09b6778511e09d2e4432a23dae0d04d7bbc3c35517d11ed71682eb3d92b8ec43a02822db4990bd571259ea7e12442f5881702fdc4f2a26f8de27ed71a9379b8530c72fd604b41064ef0fa392ba73fcd19dda7980207b298c6620352c3a11c161d11182eb0392b8f81958c1a6609b14b67504db0725b1951a6cde677d05ab665c0a9a22d03eb418d0043d4d0c5a8c40fbf06240131c718a412b22d03e22092df7ca9f28ce6cac24f83e1a0e3ee8e886bc704a0c5f09c1f731e92a3b4b4e09a1ab2b36b83a43a07d5c129afd0e4014ab699c20fb4418c8d287f0827701c4bc6c3f41f6494964b6a9c8e80eaad6106c9f0abf724671d2bb8e20fbb424b2cc71a8202eb171e81e82eb33e1c732c1a1bb582c3b4c907d360c0f4badc888e2eced5682eb7392b8b22f9a8aeefda8d504e0e7c3f3b78688de8fda44707d4112170c37dcbf8e13c208406cd0de44807d318c2620bd9321d8048855c95304d997c2a892a94ec6b1087632aa09ae2f4be2e227bb059f01105b6e7c8260fb8a34b6f43f2113423cbb2485ad8d60fbaa243678506f5e67f429e78d25d1bb9d729aa0fa5a18712cb5d4258a5dd9cd04d7d7c3c325fc948918ae8d04d7372471d9c79682c3713164bb09b26f4a22cbbdd445b0828a2d752923f8be25dd62da3b1a515c21b48a60fb76385ec7ddb613acb462f84a09beef48c7b921e5bee42f843e9a58d7b69520fbae24b262e3714f297857bd68f52c9182b58cc0fa5e18ed68fa003d8a7366cb09b2ef4b22cb1ca047f179e01d04d70fc2c325bc865b0c572dc1f5c3f070093f9329862b4170fd288cf8953e0e109c31131b075411643f0e3fe40b22130bf9c709b29f841bf2052717c52ae53e82eba792b84a94774546346733d613603f0b3f8a4511d97675cfbc70340993593f87628f9962afce98ff75dee0b9c6580763db6e35829303ce3b3e0755ea6d9e09208cefc7f6f396e0ec32c1b6ecd27e410df094ca6460a512c4eb436d96e6b68f2fe1b22ca592805bc6f7b4fdbf84722f36e55e948079ec585d00be975ba35f29fe85b5e1dc817fe395eb65057fad681a8f04350bf16b682cd2e54de075135bde983e1d9cedbfa6b1ac28b175a13eed5fa397257dda91368ef83db23bf3b0ce5e0e5e9b53474da33fd08552237879f89b8eb9496c8f41b3c84b6bd55b6368eb044a9d522eb662fcab0c45490845bf91e499c71b3befe55ac2478824448857d22a51122ad16f97bc3b50effe9d24cf3c1fb9be8f3dfcf7991efe87250f0fd4c3ff28c933ef67adee631fff53a68fff79c9c703f5f1bf4847f13ceeebdec71efed74c0fffdb928707eae17f97e4e96385e97dece5ffc8f4f27f2e7979a05efe2f499ebeffdcc17decebaf66fafa6b4bbe1e90afc3a712bbcef42f8c5dd2c70fa33cf817ff3f8fae33c60ab70000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset.meta b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset.meta new file mode 100644 index 0000000..36235bb --- /dev/null +++ b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62a9c3c4ee891e149b01b1c9fa6555c1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset new file mode 100644 index 0000000..0ce9056 --- /dev/null +++ b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 1f7e9fb643472ef4d83f2ad49fe34b18 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15080921409ce28aed248e21c1b002e2dc892d202624c4a6b8feb82810687148094324e122af9037ca1be471f2333f52e574f7cea2d1eeccae56d2088b582a7677ae9eeeaf8fe9d9111193c1c77808973db6c556d83cdb657976ce5ec1d30adccfe06b979cfa4d5684fb4bb8e6a0ed21bb1730123fd3c6185cd7a15462651879c98ee17e4aeddbcc82e775186b41096b4fe0cf825e46270cda65abec397bc6d2c64800893d1a54e27506ca65c4e1bacc7e87568b98c2494c6a4ac3651b5a4ad476064c3bfd5eb07d12eb0cda8e614c911580e611518cff03578364a2db00bfa7e0af0bfe868432defb78fd302ff7b2ebe1ac5b7876fa1afc0fc78c086540c2f8db453b29d070ea127ceca88b768fd03721d4e1bd838f49f372b432e7f5980ea10eef113e664c28238f7ff9f028e3c5a1db25a91be4f5e375d28cfbd09cb0e5bce6d7a1d32f94b1df24c76315ef6fdebcf9376a9055fe0076926317cc44c18d8f59edeee38c0c761cc238c29999a669cb60a217404062bdbbe41b65b6c416a5d63b6e2405be57e89a831ea7441427734df1a7670a64ae005f4b70bd12d4af91e7a2f39d42cb3cdb803b8e3a640be04c2f5c54f660da02b8afc576e07a41f40e816d6fcf2091d04ddd63b680a61d45cea0c601f402ca05e2709baeaf89538bb85f87ba32c5b45710d596e17e45b379652fc2b36cce1d0e999c47793051d5db21cb51d32a4883dc9b64bfef3472131aa1f038c5ddb0d3a408f8874713ef30b4830c06cb754e63c10eab55758bcca4f565cb83607819bd12caed3b08ef7d1f6450dd6992a0a261fc44abc55a62262e17c65480587ea022bd1963d443c19ffd68b433834cbaa13764d0c7b072a785d063db3951c941dff0f023a8b36ef83dd867b05b8ce01bf30817cc820ac28804c24c8c67165eaeba5d5c614f05e50e997290aab1dd42e53c07d97fe56b4778d5606a35e70241ae990469c69bb204cdafd24ba74c2f719e057a5872ab25a1564b544538d920e12e99be29373dd4aa6f27c1dc864ce22768cb417f8b562bacdf048a39981be96569864a525a3dc2df127a6bb6843eb284fb42badc28672a1b89c9104fb4dac3b6610cf62904aca3725c713372b796b587b04d29bc2c88071582719933a0cd0ed4e20c7d6a67e8961146d50caae475134fa98927647aa79deed15be569ce4b86f0de3654b3b70d93453ca8c3dbfcb853d94b8f4cad581c51a5506eb546d56a4dca88e38ca3b518e3b09a70af8aeb7413b8ee53111f6b02f17e15f17109712324f1940aef8906f11e50713d29e13a1e92eb415564996a426419924516b2cbd6ae2865dad563bff02bca7b0c5ff3b84c63e33a40543bba2a3864e1a94875f3ec00be98be21797c16a7adec5bb0a5be19e481ed0e532d75fee0a842d7b0cc6e50b57765783d6a10af970cdf561fb00d6611a765f68b0f761e13bda336d111951cf76472645df855e6b4f93c07ee6d2e4bf0dd012e7103e5a765b5f6c596ea0d5918f94655f2bd2f936f3fa49e6ca9d7483b626ba901fb6dc0f243e09256e1f2810c97a70ddaef1ab7df66797b1849c754927ea89254e451dc708a36be4e2f4b7f8341398a1465ae39d558bf9666d9fab84ad2fbcdd0e93ce7d43e373be70bd12a7f4d8cbc62f9293c79e3bab8a170b7d9b4f2a1249d5049fa914cd21f1b90340b4b6e8ee4c3d64be0135f99db526ec115cb97dcdf754a3ca992f8814ce2c735c5e92cf09027dbb58f011a8fd3416b500cbe868149e1f7d4b3086337090d2c959849b9758655b61f41676338fb1978137acc0e007074bd69f5a730cdd42765279e2ca1de439320296cbc70fc099dac392fe265d205cba43e208a71891c5a80346d346e9ba433a855e7303662d27e67b64e6b0ae602cf70bb3ae436143ed3b4093ca39f4800017ce571c01dc3a2c5141512384bd00bd23922e09c2934e188184dcb0e24459ef6e1071ddd45dcbdb236eb28b2d6ed8dd72bfa290e5d017b588bf4f26e2fa14deddbc6f927a295cf282ca5126ae5213283a176f67f1e05331805f1974c5d434ed0c8a055cce9f4ec24e9cbd698983a1d808fb9e66ae46cb0bbcad3fb6a11a41e6fa773b4a80ddbbc4ed87a386c17ae7d56461f68c3ba404b0aa09937636b0b6d085b42802dd30a5babde8b69b5b5982ed02202680b3a418b73d06c02177ae18aea82ab5f806b51275c090e57f5bb008d6e99d00559a700d9522ba259def5d241aba5a574c1d62dc0f6a94ed8621cb6d7fcdd8c46b0b4d9585400eb512bc03ad10f9636cb8a09607dd60a87f4a6174b6d98cac605d83ed7091ba6176750b8f2bc3e6d3f5b1b1440fbe2666cad1d77002901b62f75c2d62dc086ffca72d5a679191300fbaa150b804580b527587d02585feb04ab9783754caf5eaa0f13da71b36408c07da3133879f6df8e99598700d9b7ad8864e2f193c6ed9236e7ec1100fbaed580b563341b10007bdc0ac0ecf4a2a8db25b501d6cb6ecd094c0613a527aceac0439d3edb871e035c4eacfb9959d49ee7a7f8950310937e5788dba330a783fe34834f27b2a2282efd149aa69f669cb8c8246de4f425e9a315937e86799be55f66f67f07d307cd344d66bc0b9ab7895b900a1429432f529fe87f8750fcb8683f0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset.meta b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset.meta new file mode 100644 index 0000000..616ca09 --- /dev/null +++ b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ac078b50d2871149b358560adbcab75 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset new file mode 100644 index 0000000..b55b59b --- /dev/null +++ b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 3053cc98f03a13041a10e0650d9b6e24 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5a5f6f1b45109f737cb6e338b4a5405a28100aa8416d739756e28107a4366921a24da23ac94b851227be44063bb662178a105f80cfc017e18d473e1452f8cddc5eb377b79b8b939c4b426de5cefb6f767ebf99d99dddb6e0113ece1d3cd6e919cdd32cad5193bab4875ff37877f00d4b51fd0aede3bd8b67036d77683a63247f6e39d7f05c44a94f038c7c41db78b7a4bd4e017e2f626c8012d7eee02f402fa788416bb440cbb44453cebb1922d665505fd5398ccba9e0f9907e416b204af1249e344de151474b5fda3a503aeaf79cbe17581db46d63cc3eb521734b2456fee6b182297a5189ebb5b2a3feb87e5c2b339a3f12fd5cad0f69fd786c5595c7b47a7e1754fb44a25c53f2fe52f565831e25bdefc1c1c13fae232c7f0bdc0dea91c7c29c2f8670876864b623889e0505f4964c3b00e53d083058634d6c3da0fb74cf688deb4e4dd37b5e9e0df46889509e2c31c59fa92958b936be81e64a7dd47f239ec8ced442cb2c3dc19b476dd21c9ce37942ca3aa66dc31d035ac5b327f236a176ba67162476bbe4986790194645073511a13d94dba2615d9e3f89a68168bf88ba81c4e81ea2f421de2f65b634f67dfc36cdb9aa2833eb680e0e5b7d18829199168086b5f7c4a7df58e4755884a92f4daa302c7ab2aafc9eb2c41b0ec345c6954d279431172ed1b1ba7be471d1a9a7181c1e631aa1d9bf97a1d90f2a468e4263e6860d7e57301cdad88d83ba4f1e6f12ce8d0c504751caf2660ceb7a96f2ae5bf459c524f58e897ad9e25647483db775454a037d87279f69bd9d203fcdbe5f52dbf78ce44dc3aa60a3b060a0d07755f6927289f184525cb2081e33d9a632eab008fbb5a4dff0961997a424ce81c3cbe40a0a0d0c61b5a665df99a65fc9a7df2c76ab5a1c3f4b3d9bd58a36ab4d9cd26aaec96a92286ee66ab5284bac231df80e6d0df40f64cbe17a9dee0732c36166191f71b43d6bc759e6c4609362b0cfb49cf7b49ad94c59b299f2ad539ab26c12cc0178c9e4d5572d5ebd07ea0602a9213ed94ceb50b5eb50b1e970d9a4c3d7afe88e53b7447c94fb598cf8a38a9659dac077575a3690fb75e1642c48c7c03d4cf26ca61b06d9b80dd91513b2af2cc8d6247cda724069a92061ad17f1eb9071aed11d5adf2e936df19d601844551ba2b74d88beb420b2711bb75753bcaba77a2dc9ad4190c2a2af8ec32099b021b96af33adbaca1d68fc5f33a1892e65bef7d7c2b9d1459cd86ec1d13329ff8aa644f1d7f1fc96c2d39332de06f0b9d22844fe4f666183f5bc708fb6a50c6d771d80e8f648bd8c7c81519c1a53e79e26c3e1dff4a81e7ee401ff6ed5540dc121fcfbe60e00b22db05c34e6a4b3be959330b45781ae2f13b7221119d5f4ce8b231d9cfd56585289205a625182e1ad2f7d8aad1fd58c193b0b87d426fcad682f3b6d298d98786cfe94201d19ae7f0febf21c31be832c8969f7558ba2b02a263d819dca9b1533d00314dc9a1faf8f287433c21fcf19979d9c992f8743c5c9215e825d4eb0ab9014024e28333bdff9ce6d774ff9e49f9c8e1f26a5e167d5e5eafffcf573e9ff9799f49a8440b85cf0bc507794673552cb5a122e5053af1d6e927e739cd25ca782cbecbc701719218977f2d7043ca6ee449d984a2aca3266e4896982b696e5ea41534d23e7c1da4cd9d43d24a1a691fe5495a4d91d652ff60c827a4edbc7d6d322fda5c8db68f47b1a6c58f3a395256cd8bb2b246d9f42828ebc64e50e77145238db24ff2a4aca228e30c6717549d4fba8a1a5d3747e1613bb1bb89f318946374610e133e2ff69f52f8df2954e870a67e4561e1ede62905b2f534c5640d2d6bf7f8c657bb583bde31f66899d92935df71bf3a6a246cd03e331b9cc531c184f4344786da1156f1d8d8171affe749379d92a4720d960f8507b48cce4d518a3feebf8d048bf718260000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset.meta b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset.meta new file mode 100644 index 0000000..9b63321 --- /dev/null +++ b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 893dd6380a425ec429117becef7771be +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset new file mode 100644 index 0000000..99bf3e4 --- /dev/null +++ b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 33324f447d661da40b534c9fa93c0ec2 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b53144714ee5998bd08089a80788b9a18c5083bab58e62d55a2a8245e08b754c54a2d2b2cbaba5cb2bb467dcc53aaf28ff294bf911f91d73c9b73bee9819e99ee1946b6c110678be99dbe9c3ee73ba7cf39ddb3e43c4197334eb72531276e8bb25814ab62536cd0b7db54aed3c77f0aea67458bca6774af51dbb8389f3292afcbce28dd67e8a92d3a34f29558a1b281f67951a7ef3334b64e4f5cbb467f75eae5f4d2a04571473c168fc409673885c41206b5659dc3723945ba4f89b7d45a07533c8987a613749ba79636dad689e9a0df13f113c45aa7b6151ad3124da2f914148b7ff358c884222fcb5ef9bd4f79e6b2204b57b6f7cbe71cfd95989efcaed272e5f837097d03fa3db22cc9f10386f623b2fda87c2e2ae3d4f641dd9cae034ddc276c6a624b7860e24a06930946a61b0b93cee77c7cc96a78da0ea9658b086834b6087be88849715dabb1934ebfc2f76ddc6bd4a301a243f129fe884dc1cc35e95357ccad4df5f760ad6c700d6a298b0754f2a865718d0ce84984ca124ddb2493ad8b05ba6f81de32b11def9926129b6674cc1cd1f457ce3ad504806ed173131ccee3fe0b38ad83fb19aaeb601d6fd04a9ea2f20d668bcbdea2efba391724647a1ef50bc854ef2fd3404d77481ae6de83ed7ed4c8416884a1cf0fc965d8ebc19bfc1ed3c4470c7d27e32230f934aef9a12154775d78fce8ccc510cc2e635c42bd7dfb78df14371265d123c3ea3e0d0976347ce9cfbfde4dd5fff9cd0d8b36293c84ad3329a22501cbf4c69c91188564115cb7b7c28c46e17774f0230ccfef23fc7ebf06fa6557401e9129ac0004dc2068ce8be7d4d02256cb629a98a881eda6647211223511e61ab26e0ae3eae2aef49e9be235848be9b3929769cb9826e0a68965524a4ea794e27e2b25dd0b2529a5b82dd78e52f8d22358322098c68309c11e1d82c8deda56115ca43a3f5d9a466b035654a668cd51ba464f5348abdf6e5b581b7299c6dd423d8f0c62f7438c7f05de9235c049ea598d06cc5ae88316bec6cad94f394c5aecd56991c57296ad6a3148bae729bbfa8eda6ad4bf8e08cef5b344b1467333bd5b986127510f8f48d60f27db1311fde8f53200bd5c54b6107be5cc84b8ab431cbbb4857df43cdcb6092a6c69d97d0f6fdbae462d5f0fed20a01d8d0997ce8209c2bc06c20a7bc3218d477c47975b8a30c67eca40bca0d34fff7e4786c724fe0be1ef28b26be7d8aeedfeb8212aa4cd6f524d51871ece007edd177f92b6f1bf87cca41e922f98d7f7b2cc51b0f39ba3720d5c70fd8a4c1793e74ad6cc27dbf8ec68c6c319c8b4d8fdf1857d293e256e72b0906158c84442c45ac0c91bef79d720e57a629c0a90084727bd758e60ee0f0b1993e59774968fd3ab6707920f2d49e919edc9cc1a49b662f6173d512b66e7eb5c4db093bd71749e93aa9d9bc162466131f6b83069ff884efbec869d1707a2fdef698e1a666ca1c7a60cb1ddb381933a1be070e29413d0ef065f114b483287533007db0c998ca24f97a7707e715a68b6d3df6cbbb97022f948f0bb84d798f7a5dcea9645953ecfd052150fa86d0584d4f4947be8e89912d9589254302749fd26c9cee824bb135902aa73f625d9240eaa84f4cfd0465322cf2da671492de1b6709e9945ca019394677552fe60d09f096f5ff27bd061b0c59ba5b22d8f49b8867be82d31699b681e15767e59b0386ac2e2331d163f76018b392a3bca76b6db58e8567e1644064d889cd321b262f441f1f4a92c6d98d1885a046ff357336013d678162ca2eb68896a1b34b71ea3027d1c873dde34825b8b46ce62043fb58587ccb7922195e3b9d7695df3da5d20ee9e620da727681c0f4c6fecd662c1f87d5fdea449e11faaf1f835bce10b5e08e8a4dbfda622fea2aa20250a6811d29cbb1f3a492fa85acd79c341b2f93ed694cec5e73c5b8fde86b21f42fb041ec9ad89c3894915c3f9c4bc934e3f6d333e0102c11b8d2ebca466a3ba45c0ac22d5698b367028b8b90ae3fe854d700a00875fdead4a8ff45f80e701e029b811e277bbb608dfef654edc5d0cc241bfc16eb8057aab51f7c19bee0f8ef38beaf21f8b2da1318dddec44247d24a97044faf27f1e2c2a1c2c2e31087d816fc51abf6c738d0f405755ac9e35ea52dda6cdf94564b6bdbcc82d8556bebb1b51f6ea1cc76c023722815b919617dd06a9cc5745c51e94255b50e61528afd884f28c84d2cf4f376085bbcba02dc23a6a0bd69202eb570769a1e18dba45288fdb82b2a04079d526947ca4c86184599c26061ad206ad4136680b3257816cdc266417348bba856df42b6c6cbf95bfe43b6c5e33a7003c6113e03e506b21497989e4313869b1065a9f2dd07a14d0ca36411b14a674674376b1065ec116788e029e6713bcb312bc8e780e6f688ad2f15334ab4b79d816b04505d88a4d60cf697c6596c3418be09eb205ee1105dc6b36c1654fbf153be5b606d8802dc07ac5a139d7a8706a7a9d95ee48a58f258433fff0e09894937f1bf01079444d1e2fd49483048fb1766e8a6c8791c934d377f993aa2811fd34bba69f6e9c5ce824ddcb29467f82563cde421d6af96f08ff1fa370b1999e80192f2a275f8fa9f32a98e2cbfd17cd8c331253370000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset.meta b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset.meta new file mode 100644 index 0000000..1b4fe88 --- /dev/null +++ b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0e3dcc3af12eb6f479def8b92b0a0dc1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset new file mode 100644 index 0000000..5e9aa50 --- /dev/null +++ b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 3d024fda64377514ab33fa3baefec378 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5cd95bdb46105f01c69823dc6008108790e01c6003b99bb6014280e6a25c3dd294cbe6e8c7553034bcb5af7deabfd3f7fe59fdbe7466b4b257f2ae2c192f8ad3e00fadb59266677e73ecec68a122c1e0c7b803876536cf26d9305b622976c0f6e1db24b47bf031cfacfe397604ed161cd7e0da1d162bf024fe0c1a5138cec2d931cbc093276c03da1dbabec0d2f07d169e4dc319f66ec26f1aee32aae0a125f68cbd61af59a7d15e80c4323d74ccfb0c94cba881e3043b83ab69620a0749d0a54e382cc09563bab6074c5bf7bd65ef48ac3db8b601cf1cb15da0b94e146b9a2a187d61667399654f59847fafe26da5d057c95b789a55c36faf706ef05fecef13e889fd57f8f790d087bf31ecfbf0e1c3bf0e7ec2c2d875bcad15fa6a791be174ae0ae72427efef17e889fd163ff5bc6d50f0d3c5db4b02ed267eef357edec6db56de3fc0cfbb857e6c9bf9f5eb021dab1fdb46c7f54b423fb6edfcfa0d078f3dbc8d0a3c4679dbc99f19e4e71d8efeb8452b6490b5ce80fdacb1439620c5de64deddca7ab2b043910d55702319a4613360ba87404062d54be4331936c646a556dd65d40b7c4fd2710deed821a238986388bff38640e676e193165cf218faa7c9a3d12977e0ca307b092d3eb5ca46c0c9de3aa82cc3b0bbe0d669b608c743a2b70a6ce7df594824745fe733f340d38c2e7bd063017a08e7bbc4e1021d4f89d334713f0b7d198a75fb10ed26a07d4fa3e5cb7e04df65632e72c8e43cca838caadf0c65969a9e8134c87d82e2ca678d04a11184befa2677c3aa0445fd3ff334f1194333c8e0c435cb698c106486ad6f9425686e4be521e85fc67c092dfb5e64af78fe8272a4e14a067af0a96ddebf043e829a4029968082190655775bf2cad14393182229735610b28b3dc612388d183d05c476031de9c50d9c894a2d5e28549544219cea3364eaa3146141abfaec94cdfb76e83e3763942ba7da8b7292d53cf7894b66d642e3abd0ab90a187d1dd58d58a9e95552cc0f4f102aeadc1fd690a51d83f0714d7606ca4374e23e43211fb13eeb8d678c63542b80e0839d2793953215e29439c52bd9d0b447c8c53dbe7f7ef728ad664bd43ab93239bbc33e4a14e79c70ae8a0d6b30eea480743793a2825af2aad5449b49244add4cbd88f38d847ce1584433275d38ae78f0b5177a1547f9a56ce6958d6aeb35f788e668d7b40f9197264e57af3d06e1217d8bfc12701f7b1dccda3218b4f0edf04ad12a77c2c58f44b810bb80a32d34632d398943bebdb04d0dc86b14e29df3d819164238442724768a2113e2ef9558e532d731c9ca59a69416857ac814bf0151a1f4324f288281dd1222f93756aa7a3e7f95b58ed6f61193f78dae2c591436ac2352a415bbd1076e13822238c11a24de21a49748df6ac2d7690a50c3326245053140d7648ebc352cbb0275cf6fb2dbf7c4505aa13d200d8a9539e26b53cb5b28847b599f75a239e9b4485a68edc74a1a23207967a4605bd0d388ae8b8c7b74ecfd35f9474f9c44597ba2551f9789dcc4251a35d5e4c3faa36957a95e977ab4c1f6b8ab518817d9964836c1c74c99e6082d425998b1093a701b988170975b847af67f7e823f778ecea1efaa450b946a34c93a4dead4034b9cc433ca23be63bd0bbeb0aebec95ce548d00b8eda295f3718469967050244c31b20d7d5ca8b4df24d33e755e6cedc15cf7ef32f742985cabf8b6e58a43ab04b514e97ea6aa3fb8f3a042b0591699d17fae498c2dd96833066e11ceb81b53c7dd16d968a8af0115084ee2fd6ae2ad2a51aeeb10a54d361a4e9d37545327be3632b3c638b316da2a2758a4308a75fa4d52e29ee69cb15de648641bbf0634215a5995f50af7391517b6e05cc73488a5fb5e89fda91df116e9f09eeb74586a19544edca1b2c5db2a5bc477fcb571a9cdbb5849a7cac3867478585425d5b04aaa44515275c9c6c16430c93c64d77d6ac2dd32c2c8c88834dafdfed44fb4bb2c238ea7a35eb8765967f7a8601f53c17eb728d87b65e360ce8e3e95b72698665631c6aa241657911c8695c50a381bae2b56e8159c751dfb65756455ddd9cf7aa34f25eb7d99acf71db216e2c42e538a028e25d96b5e7ec03bc4d027beaff023c91595240f64923c62e27b28f7b750a614c75c8a0cbfd78d6fe7b565a0869af7234f4c25cf43993c4b59cd58453ab14467beb245bd6cd21a08a59ccdde390553a259069ca75c380dbc9ed2ddc35c12bc9a028a272411d2cd3da31b87ab2a1c1ec9709861aa69cf7b89c46eb55b9232195e978f222baaf991b65f25ed6399b4eaf29e8c0fbb5cfb25f6bf6b2acebf9071ae4e3117b3e99b3d76a4e1d10c10b0aee7f39d5b67f8e17b40c5f713550454f1ed4c8ced1298bdbf511d22e56241f6f5a81f49aeab24f9521531bc70604a7100717b05e2e309696187a2f899ab0ebcc9a703871b2a1cbe92e1b0e81231bc548d4c7c30193ee556793eb9dd92733f280caa50f85a86c283a2ed1a5f231dd37326b73a341a57c9f25426cba46f598ecf298bbf792e0c1fc3c0fc748a5bd319641c074439033412548c486667f4c22ff970ec3d88f468398b20e17ab6dae24e619ca9f7686eb2526dd72b24852c3b1916f213513aef2f95f3b72686b944162d409a2a339f9aa413a8d52aaed58a04d5836e17694d85b9406fabae94db90ffdd4826016b6d60e0f264259bce7a4bdfc46548417e9c2f3f9dfc0c11016b5f5b09b631a3118e03bf29aaee1cc3077fc2a18a24eae9994e30c304266eef4c4157c68b3c1f013c312307cf944e788a7bb9570e10fe2340f85c2784d122dcb51c00fc8b5c341c72107f5eb289a3b82da3f9535c2339c97b4a648e885eca39e55141fd63e37c5a9cb2e2e70efbf1a22c312e8990f122c3422ec793e76649ccf166fee7e957b295926300a1d7ca5628467da33346d5933e57e8012482eb810d5ab98d3ac73acf76f7882d2ad57911a498c85429240f2f8281ed813ed81a75c1562fc0f652276cf8a6c55f1492ce8aa58334aa0bd23a01d257c158e2843ed8e2ba608b0ab0bd0e06b6bbfa600be9822d2cc0f646276cf83673c3d394bf40a01e512a8265a4f2b3c51e01d4399da0e2c6664c17b062ba40343151d50658bf2ec0ba05c0be0dc67947f4c116d1055b8500dbbc4ed86a396cf6f7121a21d366692d02640bc158daa3328c686d026c8bc1c076bf0c73b95a01b6a560601b2f436beb10605bd6095b03872d9ddd8591db4d93d4075c581770d50270df05059cc669411b700d0270dfeb042ec6fcae63f377b8955f75a54a80f7079df0a204db0492d5656d492bbfa5d96501b41f83993cc6cab0241512607bab13362cba7a5bd16a03b14f17885d02883fe904d15a59e02a36b75b44e3dc1bd30559a300d9bb60dc55236cdaa21c1360fb59276c2d1c36b77d615a21bca50bc27601c2958b70567b19402364daca004d0264abc138ebc3329c162e09b0ad0503db3d7db075e8822d22c0b6ae13b63a0e9b7357a5c62599b6f9b455006d2308d0ca31096916404be9042dc2413bcd6e172ecf857f8d0058faa2012bc712932100b679d18069dc59a2cd253bd927b3e72d899926fed70d618b99f755705cf1ba32ee52b5899fe3bdb1b975ac99e38cf903fe5922de636e4a5b13b69125e80fac737f96e96d73b73bcdc27bbcb6114a43ee3fbb25b38f52ec5b93497a9e3d6cf52e5a49d01fa17fcaf2e3bfa1ace66a2733ed24175862b9fd926fd811af02e34fe83ff373288cb95f0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset.meta b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset.meta new file mode 100644 index 0000000..e7357ba --- /dev/null +++ b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b40c55a105cf55140a66896c3443bba1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset new file mode 100644 index 0000000..0e58991 --- /dev/null +++ b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 4715e20276be3b141a6a216230cab4e9 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5afd72db44105f3996bfd32440088502a52dc4853452da19f88f99346921434932759c7f3a8ce3d44a30d8a927361086e105185e88b7e2019809bbab537d92ee2c3bf63538d41a4bd67decc76ff776f72e4939801f6b056ffbf014366015aad080177082bf36f0d9c6cb7f0bda77e1149fc778af63df0adc4c98499f65eb1dbc6fe15b177a38f327788ecf26f757c0c3df5b38d7c3376a3dc2af87a3ac344eaac226ecc0362c598b0924f6795257b459a49795c3fb43f8157b3d168a9838dcb584b70af674b9af8d4207e39ec177ac561bfb9ee39c536821cd43a698fb9be6b24ec10332f82d46de4bf8b5cfcfcfff11edb678924679e9373d67c49c59f19e92da2df1a5fe6b91f7b9088f8278e6251ec13317e19195da037a328f4c94876db135be467cead0018785bc3b82db0433931d8648675202cc6566db43d3749080c26a55f6891e3c80fb4aab5db74a92dc1b7cafe3882613256611167fc55890702dbc3cc9e5bad8fe157b2c395d137b56e1093e69d601aca1133d8b50d947b62d745b0ff6f0de617a0728767c64924ae49ed1394f91a6bf7adad81200dac1f7164b58e1fbcf2ca9c7d26f615b8fd7f209aee687f83c636e71dd4ff1b78ae79e804c2da37a11e9dafda51a986913b521e91d5e03af2d721916e1b0342f9661dae168f547cc12af31f4838ccdc9c9a7b1e6a78750db7d7038071cc4101c5dc7b886817f0781b5822be81becabe3788fad44edbb48b18ebc89de3a73e807e3f08c404f356ae40af758bbbef5edb0ba0fc0a1f461dd48507710d844af6cdd9172ccb86ad976da25e1a3e6b254e6e21459316aae30e51dd4f90711d206399fda2899618ce26644ee2f2b3269127f1d7a29157ab9578d9e3faec9e346472fc7a546183d8b8abadfc085df71da2316dbe3c10d0db0790db049a2e9809d5100eb6645a517b3753e22120dd4104eab08d36b7118c2b69eb0ad235c1a93704607c5ec985064558473a2128e794421e411675c44b23f4439e6f51c733a55e6c65425af037f7e4cf00b3ac20b63122eeac07f4305fe972f334138aa6f03edfe7ee105f5a35866ab50c3eb987b6a5806bec0054784e45c412354f4745965142397749abda9d2ec0b8d663a497cedaa3c661de9f77847f33dbb6285df82a298c6c9c1681f5b9b233aecac4e97b754ba7c7e215d024b35b860ef8851db7cc4e0c5b49003ea289a5cd369b2a8f3371d575feac7ec736dc67b908ce11e39cf4e4ab3399d666fab347381ce554ec41ef811736bf2c66913bf873828d0f0091ff544a51ca4c1600fcbe2657162f513ea29cedce519f4d6058783980bc39f2b10ef36ca431bc23d54f1902b89e453064ad3ba53862398d48633498bad9765c511afe16013a3d22e5927fde63a2b340a6821d21cd5af9aa674cc989911564d399c603ebba037254b715de6967852955406fa04829867d14aa88985e1f1692b1924914b52157f8f0904fbae091caf916bad233c0dae8dbb78d1276ba75c42ff5d93102d3044bedde4ac172ed6a701b2b204d97b26219bd742d6af66a701b03f19b0ac1d21fe7862f1ec62bbcb78e49de35c7786e2516b4fd468a148ccc5e27f4df21bb2179635d1a83ce4122c0fe577fde2409dd45d12e2fdff79de76296f7f4020148334c751e3439351a3c4d6f3eddf65fb9db0d2355cb1115ee39cf8e54371c31e46918bc48ebc146c6f9a842d2760abe3806370f1d79a39b8b2a6e0ca49707d6412aea280ab2d18d7795b5843e0a60f344b02edd66580368d9e969140bb6d12b48200ed28b481370859de14645909b23b9793020cc2662c05a425d83e36091b9dbf245547f2a1d8f441694b507e6212ca450d94fd0272ba812c48402e5fce523698698dc106126c6593b0c5abb9692c4c6624b8eebefa1c6b10326339360557e6acc1a5b5ff29f8ffdc27960e6dba17842e1408be058f8342834d569736e00eff29a8ff179ee1ce5307d34cde1dd3f96dc6527b696b623698c48e5fa5e938bbffd200ab38fcc7acabacff4ad44d9778b35345cbfbc43dd8c1c10d168a3ef6bfe62e7530ce2c0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset.meta b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset.meta new file mode 100644 index 0000000..47c242d --- /dev/null +++ b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8279a29fa9e44ed4d8a0d90048060dd3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset new file mode 100644 index 0000000..bc4296d --- /dev/null +++ b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 49ba99e73d9ab4349871a10f182ee457 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b53db46145e19cbc6d860201093344d69d314a74990c169daa6b7844b52a6699ae1f6d0b4e31830291d73191b68f2d8d73ef7cff4bf75869e737665afa55d49c65e1368f0586bad76cf9ef39dab5622e630f8b3eec0619d2db37936cdd6d816db677bf06b1eda5df8f033b7ff39ab41fb0a8e65b876874d86ccc4bf296b028e4b7056678730f3886d42bb43d75758057e2fc1dc0a9c61ef367c2b30ca8ac3a435b6c07e62cf58ce1a0f21b14e93eaa2cf42b9ac7e38ceb13770b5424ce1220e5dcac16105aed4e9da2e30ed8e7bc17e25b176e1da26cca9b12ad0dc208afdbfc0d12299a8c9b2c6294b49bf2df14dc07704bef6c9c9c9bfa26f58b431698e2ddab8d417176d9fa0332acd93fb2f79e867449b9668a5459b1273c6a4736c07449b14d7c73db486a4b143a21d14632f4be78491e8cf4934dd7e1713790df77cc295c3b648f3df832ecaec803924f0ad364cd49d196e9c483a11134a9ba2650fc10c0e8080c242d6c8fe0e5991cd2a2de48a9591f89ea7631946ec10515cccb3c43fbe2590b92a7c2a9279d7a1ff0979071af80e5c99664fa1c5592fd90c18ec0b0f957558b60a2e5261ab703c207a2f816dffc83091d015bc73968126f7d45de871013d80f32a71b842c763e2b442dc2f41df21c58d3d881c73d0bea6d5fcb2d7e0b76acd5501999a47b5c3eafa795870d5b400d220f70efad33b8d9c894628945d116e187728f2fde5d3c43b0c7990b12911721a333cddb4f4cd3287f2c9cf3e04db97d12fa16bdf6e605d010ffa01ae95617c85b484fd6bc46f3300b78e7265532385eabf4b1235356eb78a58640ea60ceb5a8888410023bdbc755dca2ba711c5b6e30564d8ab164ba5164a857ff6442d6139f209956f15a8ad36d8ef22b8b9ebee5360438edc20b90ced367181fd9b02d1e0b582959c68e0d354b24325c2621b99debc14a8b2582121ea97bc35a9e4cefd3507347f83b58e29511cc14aaa156cdb67ceb4428a5678bbe4d7d9774c65df5422968cdaf71af4f17a6a91aeee90943ce46340adc0d843922b6864b06d0e440940a4b13469ec06635de24b87769f0a6d2ada578ca2dd4a998fdba17141294b8d6a2632aa8384aabffe0e5b5f875e5c851edd12edf53045163d123c85b165f0397e86e5849b5f9a631660cc1ff0ab2ac67ab3503104f3a1c8986709f3595f3634c3b54e53b6425305d4d4b04a9094471094414338a132814caf1d480ed3ed3bd04864658e6a1c286c7d9d5a922ab560f8b914452d837ab5f4eb088f754838a5233cde21e1011d61dc0699f210b6d0ff106834981a013d4980e33ed4247bd0d6ca699d6fe43af48d8c8ef044878407554e479dcb3d74bab05bc12097c37bd29c0701fc53bbdd5572bbcb3ed98239d039dd904e2def75a896ac8a309e5e8b42d8d6131e5611464f7c3f0ae1b49ef088cee9aeab9cee4d2389b9e9469fc0c293179add342bc1c79dc96f08b147754328df34961a67bcb4960b6b6e14487d9b3609d1a8971a2317c1d479f1be4cf1ba02dc1dd3685c5736af7518bf03b3da0925a33a3c3f50e1f9a80d3ca394031ccd570c37ed4b245f1d16aad259ab6c329576e4bba4936f5225df7da62bdfb124774b77ce755d707d287a8338ee86a6c674927ca892e4a1514d2d369258b7f434ae93ee239574f39ec02aafca39dd878451628f80f32dd226dfad0dd65154ed9d56c6cb3a196fe864ec8506dd87615e299ba9aa1d19733a193f56c958f4e8719eb4c4a39beb67abd017a48d269fddd2d3844e869b2a190ada98b100df0d18f44aca1a7efee54abcbd3891848f6561b25c240c6a30f339cdc0b33a73a86e28b0e89b48b8f62ef083cf395641c40d2ab9c2b7863e61fa8767dbbe22e8b4cf51c2a450e5d1692993cad245dfb4f43f334a0a895c5a80341552174dd229d46a9fd06acca19aeef629ad299c8bbcbc5ae803d8b00d204ee099d814b5b0262fd1f432859650fa61f7c7778980fb50a10bcf8bd1a878baaa913aeb8443d28e1510f75b26c1192570b8c6fc19a69929ce03687f4ba07d6a12b4b140d056e8ad944dc1d47900ee1e0197b43dc41f772da69d6e03d91f7db394ef5ed3638d1ad1dbf24663ba497cdb38bf2d5b63de1791f26d59543eb2d3368b0475722ff08da9ff77fe2ea051dd451046dc74471164da6404c990064b3481db017f125702aff5acd5c9c3ed544becc84611e434f1232d055ec7246c299286df733f66f87e6015d8300658da1460c3126005938025859d1d898da88239b06c5360c9b5d08c49b0060458ad779c33e6201b340559bf04d9ac49c8d202b25db1709936198cdad9a829d01212684593a08d349c52f7ba885100fb4d01684900de3b9bec69d0598d65cfb804db67bd8f6f060b0e63f12d254176df246448973fc4397f79332b81f4f9d9b863f11cbae39004db1767039bc1e06faca48d49b07d6912367c60127eeb1be5a9c8f9b3cd8c04f283dea70a8376692c552425c8beea3d640623a031c80624c8be3609d9cd00576eddf3ba98ee6c4b407f6312e894b0cde3c6a34ba3a5f25553800d4a807ddb6bc0ce63f4eb63176667bf80b7cddf3169b33a2f95e779cdde20df021f11f26281f523ab50b1b5055f6c9bdbe10ebd1085f713ed3ce50ca619be57fd1045b2d4765ced9a9ebab1ffae92b493bdf84c80561c7a79eb22cb8fefd32584dac94c73b49bb6069ae7c4f1ff796ae2d543fcb3ff036d079e8ea73f0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset.meta b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset.meta new file mode 100644 index 0000000..345f25c --- /dev/null +++ b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 28a42f6c6e79b1442ba9ce055647411b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset new file mode 100644 index 0000000..b6204eb --- /dev/null +++ b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 4eb7aa2be7d95324ea25c03bf1cab34f + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09f6b1bd333d5353f5757575989edda284d27fb1c3fa6d40f5a87655abfad5b0baa96ee84fed3a9dd22f67cbdd7f59cde8744cbf0feabcc36a578e33e1af2ab649bf77e9ad5935a7cf9c57433a9dc0fc5e35a23f77e97347f416ec1dd5ff23faa8d8727d52bfea5097d4455519db9043c4009e346bf6c5c0aed84afddea69ed5b923a8145c24815995faad57e7cc62de9456da3dee31f5389a35a5f386f439336a52cbbc8e1257eed23ac5d026e70afa7f85feef309f9799b4c8ec3f4b8e73f79bd331ff1cd906c9e3667bb9c9ef24db90c64dda64f2cf131d202d3669b3d9d765b6579ab4c4a42d26ff21b35d6ad23293aef29cbfcaa467ccfe0b66bbcd6c3f6cb6dbcd76b7d97ec0a4e526ad30e96a93ae31e95a93b69af32f3ab6228ff8ebafbffe3f937fdaa4eb882ddb091348371b1997ccf64ec204d22d9efcdd8409a45b3df9674cba8f5c732fd907e936cf399bc9b55c99ee71906e30c75f36dbfb094f48377ae45511be90567af25b4d5a67f65f21db90d69b3469f27bc836a447ccfe5e8fbc63667f1fd986f4b8498f7ae41d35692d23efa4d9df4fb6213d65d2468fbc4693263cf20e13bdddebb9c7417ad01c3f60b66bc87eaacf2673dc23a45c5cfe2e67f73848d77bca6d9d67ff5565fc351ec3e8755ec7934135ad1258f16b54fe61d63d337780c558036ff05785979dd3a16c5a0bb044b97e8ca173aa41fb842dca6d8e9511bddbf17d501f318142e1629e4bbc927109506e52bf4648889ed5fb3b31c243909ed039b53a684ce0594f68377d4cbfd2a50ce8cb4eea303fa29d6f5e5f0ae43da1d5ce3c32974910cebde7f468994e6b33a5f7b840a7f5f6246ad88befb750d311d4be4bef9bc3b6ef866efdda747a1baf9669fb8cfe6cbb669f4166d7d1dee870fb9da6cd2da60e6d0d689fc0f667a94416a34400fd8a474d355c9ec016fba58c925862e80419e8c874191975882c96b6af5e25b0afd39741d0bf8d9916dafd1bf26ea294417d6c367bec74a0c80fa115a95256f174bb1a5402fb6adb72d8958d2ac8abc61eb55ffde3f1e549d0d2cb3f66e19f8c9b362dd3a4128f49b0c5482ee22417172a7999cd67b0ff3b26ea33fd7a9fd3189ec5dc098ca0b5ba4b3ca2f7b9830ca0cf1de9fa4b371e3b8f3a64f72c88f5db3db0664ca8c970b024145a09fac821a584f4e53c69b9ad5470f4d11b624dee45ddc7508eff7a0c839d9d5ed764499722e9cc8e562e1d3882715b8d01826576b55a322a4d295f6956d88a0707353d21164fae862d5be1c088b232efc229c7c2d998615b760db8a229b6150dd0abb028055e945134e57cd1ace4ca7d35e78e3ecabd8413bec62afc055f4eb58ac3b2962b2b1f584a39e1eb02105ec6095f6f115e51e54ff8031cf30d01146839277c6300055ac109af0c40f3d59cf04d0168be8613bed922fc3fff7ed897f0b59cf02d0168bece223c8135eb9a5a8cee0c0c3fa0733fa28f9dcbda3d8023b3c76c98fd3ae2e1638fd7d02dae8ec1ec5a307a71917cbd8d36869a70bb297338f486e3fcb784dbf3a6ba43715d94ecd7e7e86db05504a0b7d3a692b712ece02bc1464ef0ae0205577282771728781327784f8182377382f71628780b27785f8182b77282f71728781b27f8408182b7738261babdca2338f6a0debc6e86d8a7b4473ea792ea8e4ee55f7e6cda618b6c656147b64b9ad493ca996ef41fd9aaf38e6c354c64cb757d2eb2ede43ce2a0cd23e0eedd04120cd71f82f0935d364bc14f0ee553a96a78c1bb3984876d08e1a6dda8deb8a977858dd10fae3d1cae2305e2dacbe1aab5e182fb6fb3a4d59605e607d03e0e50a24040fb3940491b2038fa96a9f850dd1b0a42e407c0010e405d8100aa3800f53600103b9fd61f07f1d819ec1b43bc0e0b433587a1a1400c351c86a3360c10de9a30e44fa21f9cd63578af01b04735931c074c9ddedfa47d35b5bfd997d90739b38f1568f6214ef0f102051fe6789eb0f184b12fd03ba5aeeae3ee20b1d4e7fabb9ffd303bc299d658a069b59ce093050a4e70824f15283869130c530bd0e92c74c6a58e13de1480f07a4ef869abf0e7dbfd086fb0084fe0bc1ac80a7f52a4fd6e7408f6fe0e2c4d5ae66195c0293ef099e0b581e8e87d8bdb7bd8b02aaa5a480dae177e94f3a9330138ec314e786b00c28f73c2db02a80d276cc2a136b45bdc27599e59c4a69cbd976ce12fd9c8d9d31100ac939cf0b301083fc5093f1740493cc89544a7584934d92e099bb004b4a01be9a76d9257e1661e8dda365e70b34d30dc5d8155a785deba69e1caf782a57c2b5ffe6fa39ff23d63130ec7c33ad78cbe1148489a979ffe4f2be745ddac17bdf6eaabcde40d6f32f8f1a236cb251378bb6771164dc09aedd4502dd846f5a2856202ef3e655b1651984650af5b526f4c9b0aab76b32fce284c0bae5d6db7953ede327b72514aff8a659c1aac0f5cb6f900dec7abcd423f08bd3c9e90cd1daea03b482bc439450717eb7a6cb1ae5eb94b987bf5991774410f6aec50d9e0118c67f0ba4f99c9a95a754dbfc630e79a963eabf5193485348379b4d0d257aff989a367390b7a6d169c6139c3a290697dd09cd1bc133577d6497568dd9ed1f9b0df7e76fa7aaae0ac3bc759d767b3aedb5391d3afebd875535b790d35bda1759d50ee8a6010d28afbb26b9f3d2f28bb3b39bbfb6d76f3c1b407af3c8ce12bdd236fdd3dddab355dbbe547e7f39cce03369d3b3d6545af4a4baa13ebb25bfffbd4b895343d3b5b4e50e5d3c5d9fa88cdd6161fe5e3ec19b3689b5ab6c5efe772fcd8f61067db559b6d6d81d8b6b0f25ba8a75ee02c7cd466e13e8fa7a6a83a56f5690be962824c2d53797eb47c98d3f24d362d9b161003201f1e198498ed9edbab6bdd38d6b5912cf13ebd8be6c7aa6eceaac76c569d588055d00d9bc388e14476de0a5bcfc28f2d17395bde6cb3e58e0f5b52d34ae775890c2cb8be8495c3114ed9e187eb258eebe336aecd192d49aabe3934cfa1065358d6d96a677a0ebd8d1e549dbecc59f6169b6557735ae6f463867c5a56784e3034ae7034aed9681c60eb4fcacbbc9120a816a387d3f4099ba65d79f66dba717402716a1a97660c79a2d6e2b590bd9cbd83367b1bd992e9468bc6d5e8dd1ec04d1c5a0f63abe9b4a4d92d0da247d3c759733d183fb3d5888571efe7341d0a46d3eb81693ac0693abcb04816448c5e484e3091ec118ec6888dc68545a6118ccd57399b476d361f677d15962af7296749b363fdacf1d639b3373b81f4bc014d0e7ab4764b8af52b160325cf622499d1675ec633606b562570257a52e5ffa83a5c7b0a97464e6a2b06f527f799a7ec1260ca997b707d5479272417fa0c732e2b9c780ae78faa41f25caccdbadc36f1cf6b171b8b5c599a34ae42bfd72c1da7a55a94c0b5e28716e84db9b59880ab2db3fb90ff05ef8e808b0abed9460b70fa61936680d4afa50e9bcf39af946b01ea1114e03ee51bc0b736807bb56afd8671d83aab5fd331a58ae3454928812725311523a6f988e1813f88851ee1e702ab8e0b7bd62333705460a8beadd583bd206fd81b48f0b989379ae64fd140506df192ea2c152cd54ad95b9724b45293f77903928406640a2074b8f1166bfb0dc9dabe0acbec9a678c72dc7b9d42bee0a024adf697e663c44222c049950a90372591ad34c806f501632a298bab460ad741826b5a125799c1e5cccdcee1cce0107a59bd1cb616296c0d04dbd392d8561b6c53784a17428391074c6fdf427c49397ce552f856107c3361c4b5d1b47167831cb21d52c8f61264b3d271cd1936a646b9d1f3b066826b4e125785b23f9a1102bc2b52f0da09bcf930aae738828249d5dbb2114dacdb514e90dd0a03597a4f4d30a28921ab27c89e918e68e93db5ba08f6d476115cb7c3c355275b21c5701d22b89e95c4c5776c8f46b063fb20c1f656496c6b0cb6596c39e7d50cb947d88d62a2d910541080cf85d110a4776d05c7a0625ddb1a82ec6d6144b6593cad5ed6c3c47055125c77c2c3d520db6e8ae1da4670bd3d8c0a99de33136c04c462d83182ecf9303c2cd53313c425d6d5384070bd20892b7e37e447b36d4c12502f86054a306689813a4a40bd232c5082f3b062a01a09a8774a82727bf9a9c70ba23c5bb196607b571801dee9422423dae3da4070bd3b3c5c7511ed716d21b8de2389cb3e048a22b29d04d97b2591a5ee2741f4821508f7c2fda46282ef7dd21e97fa66b310e6f8c59a801682ecfd615452778e3fba533b0f10642f85d10ca486452722382c3a42707d4012173f032bd8146c93c2b68e60fba024b65283cdfbacaf60d58c4b415304da8716039aa0a789418b11681f5e0c6882234e31684504da4724a1e55ef913c5998d9504df47c3c1071ddd90174e89e12b21f83e265d6567c929217475c506576708b48f4b42b3df018862358d13649f080359fa105ef02e809897ed27c83e2989cc361519dd41d51a82ed53e157ce284e7ad711649f964496390e15c425360edd43707d26fc58263874178b658709b2cf86e161a91519519cbddd4a707d4e1257f64553d1bd1fb59a00fc7c78fed610d1fb519b08ae2f48e282e186fbeb38218c00c406ed4d04d817c36802d23b19824d8058953c45907d298c2a99ea641c8b6027a39ae0fab2242e7eb25bf01900b1e5c62708b6af48634bff099910e2d925296c6d04db5725b1c1837af33aa34f39df5812bddb29a709aaaf8511c7524b5da2d895dd4c707d3d3c5cc24f9988e1da48707d4312977d6c29381c1743b69b20fba624b2dc4b5d042ba8d852973282ef5bd22da6bda311c51542ab08b66f87e375dc6d3bc14a2b86af94e0fb8e749c1b52ee97fc85d04713ebdab61264df9544566c3cee2905df552f5a3d4ba4602d23b0be17463b9a3e408fe29cd97282ecfb92c83207e8517c1e7807c1f583f07009afe116c3554b70fd303c5cc2cf648ae14a105c3f0a237ea58f030467ccc4c6015504d98fc30ff982c8c442fe7182ec27e1867cc1c945b14ab98fe0faa924ae12e55d9111cdd98cf504d8cfc28f625144b65ddd335f389a84c9ac9f43b1c74cb15767ccff3adfe0b9c6580763db6e35829303ce777c0eaad4b7792680307e3fb69f6f09ce2e136ccb2eed17d4004fa94c06562a417c7da8cdd2dcf6f1255c96a5541270cbf89eb6ff9750eec5a6dc8b12308f1dab0bc0f7726bf42bc57f616d3877e0df78e57a59c1af154de391a066217e0d8d45babc09bc6e62cb1bd3a783b3fdd734961525b62ed4a7fd6bf4b2a44f3bd2c611bf4776671ed6d9cbc16b73eaa869f407ba506a042f0fbfe9989bc4f618348bbcb456bd3586b64ea0d429e5fe15e3af3214252114fd4692671edfd8792fd7123e42242142bc9256899250897ebbe4dd817af7ef2479e6f9c8f57dece1bfcff4f03f2c7978a01efe47499e793f6b751ffbf89f327dfccf4b3e1ea88fff453a8ae7715ff73ef6f0bf667af8df963c3c500fffbb244f1f2b4cef632fff47a697ff73c9cb03f5f27f49f2f4fd7307f7b1afbf9ae9ebaf2df97a40be0eaf4aec3ad35f18bba48f1f4679f017ff3f86dbf21d0ab70000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset.meta b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset.meta new file mode 100644 index 0000000..f329e35 --- /dev/null +++ b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 498d5ea5a9138a24d89198834280c61f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset new file mode 100644 index 0000000..85d4c5f --- /dev/null +++ b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 5463afdb73b505649b857341d262468a + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5bd976134710ed913d5ab08db113c0800910487062ac91314b9e720e60b385c5f1f6c2498490641091172411c8635e932fca47e40ff229e12455777aec59ba6734426d1c07e97846d34b75d5bdd5d5dd2539e3087a5997e8b22696c42d5114aba226b6c4267dba45f70d7abb4f5ef9a268d1fd395d2b5477499c4de8c9af8bd6045defd1535b74a8e76b51a57b03f5cba24e9fef51df3a3d71e93afdd5a99535489d56c5bc782c1e89e3d6d104116be8d4966516db65e5e97a53fc42b57528c58338a83a4e9765aa69a36e8394f6da3d113fc0ac0daaab529f966892cc679098ff9bfbc226dcb2f23e283f0ffb9ef99e93775bd68fc8e70cfd15589efcec9765cbfe6f63da7af207e4bd20fb1ff63df3fd902c1f0d950fc9f223f239ef6befaf1f53e9605b60e62e615511dbc281525fa57021af67b2f3b0e86cc6c59bbc8887ed104ddb2440c1e02afca323e6c465258327ac619fdeb770ad508b06848e4787f82332042bd7a477dde77e6d2abf03ef65076c504d513ca03bf77a2a66c9a19e84a4acd1b04d72e1ba58a1eb36e43d25b5a32d934c62570df7592299ee4cdaa0120fd06d7a6e42c3655c7f86a675687f8fca3a98d79b34b36fd2fd2d468bdadea2cfaa315724646a1dd5134a57ee4e5b8fa679b286b577e0eb1f19f9108c30f4d971390d071d449fdf224c7cc4d00d3236162a57c6acbb5404ca2e0b871fada50882e96d8c5aa8f66f17ef6be24aac2d6a6498ee53b06097e11fdfbd3bfffb5f8b7fda41d3e68483656c32c1b4386059de94752c2221de04db1e2cb1a261f82d15fc589697f7107eb75d03edd21390c5ca1424c09ac5e6a82637402fa8a245aa16c502295181da4da9e42a4c6a62996bc8b215ecdfaae227a9d43c3d75e8efb68ca65be20d8c8df05bcaca6dcd9462014e325347524645527eaf494a8e4a7124e577ecda25895f6a040b1a049374d02138a04210bbbd574611f4b66fcbe441df515d85dad7b11670f92249acd0d82cef064698d67a9e3f24b8bd8332e3d1e78deb6905fa7a0686c0c055dfb6d5bc0d3af60655ec612ffe745fb1d71b37bce99e0971a3e664049c5ce88193b488db2ac4d925ac953d8c385cb70529156a9b3ee6f0716f3aecf56a684701ed44c4b86415741066151096380a1e5144c27fe86517428a717cd208cfa9f819deeb15e13199ff52b8278bf4ec8c75edf7e39ad520697c1d3579157ac83dfcba27f124290170073b947ac03e6fdc2d9cda5823ef04b844f77568c1e5d5407cd58d15cfcc273bf8ec32e32077b220ba4f6398b7e253d226030f390a0f99c19e6f53262c16c0400323793b3a3efbaec34a3737a76bed21f11049b1d7e0dab6d5de790c63ef2f64749e5f50793eb25f1bfb6a25d5ef217a5b6339760c843d1ad9bdd9beee7074da0d2067c3ecb6e539835172903f9c8ef1da35e91d6cc55c6a8f3dcbdbbbdd8bed6ac10c75a0afd482c3ab558cd1e27b925701a62db4d8924be17be8e22aa499511398517bc38c6ea61c52cd1404c6e746678a194f889f1d2714b3a334a6e24b49d749d065ce8d75140da928e235c17af94128eac7348927ea948aa8f12851716c4d822dd3d35dc7d9b06a57ccbbd9d34291c4f97627040427ed23c1df68bdc1b8de442f8a32bd9fa3a62c1e505d1582fc41825ba8e4e9c249644b9ed36fc94774967da6b26c3ee4a1fead806bc916695026a45f818da6449e6b74fde26a8275c1534d1a2b0febac3ca3b2b2a3e14f87b76bf91d70a80be469394c4a46f44b5e1a144775289e55a1b89012459d86c11912de8c709d7a8607a3771a3b8fe8ec3ca7b2f3ae113bc3db1dbd9daab897c6da319db59fabacad6a2370f4a8529433982d5a0cf17683fe6a8450b75606d94c8345388aac516983c6566394a3b765f11abd8095b7453d17d1839fdac2e1339b5512dd1f9b78ec0d8a6a1cb95648bb678860c987a1f342ff2df97a64a7d0eb17a64956b8896beebf0eaff5be845359d7fd013efae5704e5ae4c922a4f9847ae02cbde06735e3f0090f7bd05ebc29598b2f78b401b50fa5ffa2c715f048a6013049ca086f2c6095a4d6e4e7c4919252603310e0ad757df88908bbd70dd2af862d5f9bde0fa82467674a2ced4b93306501531b71ae45d7ff023802e0e4ec90f0db7d9b8cbd7d911a0d1ba308d46fb12d68415e2d1c46f858beef34bfe80f0353111f998a995cbb2b947a652921abf83f5f3c4abc78f0afd7b2c35eacc54cffdae44c1f016765cca2756a52de91cdfb8dd068eff3638a422002d8dd98d27b1470819b3609dc31095c557a5ef850e857be2c4ae6a02c988232eb83f2924928272594ee7e75135ed8dd8eda20ac274dc17ac807ebcc87f4d060dac220948adfb3f607ca9c0fcaa2492899335e4658c50552a0217dd01864a3a620b37d903926213ba798d4ac448710e183ee7df96bda831635333e804b26013e0c69c1bccc0af6626e3ec6187443a6a01bf041376b12ba51a1dbf46cca26c6c0cb9902cff28177d92478a725781df1023151b75647736b4627f45153c0e67dc0ce9904f6ba04b6498d5c9fd4a5e5fb91ba354ac68429320a3e32ae9824e38c62f94a93bf3508eea42970877ce05e35092eb3b81df15463808d98026c501c98945389a7ec3526dd92a44f25ee30dcacce98b4967f30f510e51599f7a9f8323c0efff2c1e201d2648de36526a75faefb0d0ab1d4ec1b4bfd4829a92c7d9ff4d2700c2b0e9f6d0fb4fddf08f7bf46f162373d8ee4a33f25f9981ad7a014bfec7f0123a6142a803c0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset.meta b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset.meta new file mode 100644 index 0000000..1e29522 --- /dev/null +++ b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 47ee06b4f4fb6d14fa9e9bb8cf946853 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset new file mode 100644 index 0000000..8389278 --- /dev/null +++ b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 566cc00e27d5822449529a3785eae366 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5ceb561bc911ee0184106030f802186c641b8c6c0312e0dd249bc4598c6fc480bde6928bb3c15a1830bb081c4bf87272f2027982e49cfdb13ff30a7987e48d728e5355d3836a46dd1a8d462d659c958ea6a76fd5555f5557f774f7a82d2be0634dc3654b3c174b62566c8a5d712c8ee06e09c2027c9d989bfe4cbc81701fae79c89b16e9809af899b286e1ba0cb1a22841cd13b103e101e5af0b1bee97a1ae0d314cdd839f0da5ac0ea8b429ee8ba7624d0c591702486c51a5a24cb3502eab0baef7c407c8b589296c244b59437059879c22e5158069b7dc0bf135895580bc1da8f3461c02cd6f8862d73fda04dd88d34074c2ef068b5bf287e9532cde2181c6fbab4e5c7c2fe3ed3e3aede53a949e6134314cc02fc5ee31fda6bc7769267d349332bc26d36fc978ca57cea57b5da6df96f15e56dfcdc7b047969bf6c5253f2473e2e3c78fff91f9e76438c8da1a94e159597786c5319c9061bfcc9f6571c0a8ed07191ff2c93224c3f3323dcbe22a592665b99c8c8ffae88dcaf0928fde244bc77058e6cfb138f2f937191ff3d11df3b53f2fe3e33efa5764fe822f2eb126fa098907619eb0a8173d06bbce8bd722db8615b174adddddad19dcd19174275ef03345cd96a04bbd06028adeb6497db90492cc2b7bdb88d5cbf85ea26b1e4a1c10516cccd7c43f2b9a40e60ee16b33575184f447e469d0591c40ceac5881106bbd0475bd80af97ca16347b08eec6161b707d4df45e02db9525834442b7e2aff31c683a5eaf00292ea0af217e481caed3f52d716a13f7cb9056221f7c045ef81e84efa9b54ad9dfc0bdaacd0d09999a47b5f3d3a53b2ed655d37d9006b9cf92fffa5123add0080d25776437ecc8621fb1fe5aa1891f31749c0c0e98cb92c61c416679d2e64516a3d67a0582e165ac94506ddf4f81b36f651fa9268d1a1b54f80cc950d671c22bd482c8d244622c40a86a9022bd8cc2af07319f4874e490453ff4960a7a9ab26c34117acc3b262a79281b1e7c9a2ff9c0af443f87c59204e0708570c12ce8206c534098c366ba945ca57c5c61490de576957290aaf5d2a872dc09c73a8c2c4f202f0fe56df25e98fe0c28e6a16da4b7482d942729de1ad59596aaa5c790ceba4967136cfa1495339d2e3b74baec89aacb848a32467b5530f80927f4843b5546926ab6f374ca1d50b9f0fdf70c4d5dbd18587f87e80bd0e35b482ac10fd9dba16ca719e7f1b32463456820ed299d2616cae5d3e215693f0decd834f349c3841a673c794841007681a5b4c78ab0f43b82e750d64b13846e8d34b4750cd71da08dfea328d35e4178403c1c437d6c29afe4cca616dd897d9a528f28bf74daea89a4eac8cb257c405c3ea6b6f6a1cd125053f7a03ecdb011a4365d3f49aaac193d537f2dd6dcadb7e62e95357737df9a1d480e0326366a6bc6a7e771bfaf10ba016940ab9aea3ce85493d2a96630a26aba558431f19c4e5e3ff1013df11e9d7b3c1fd13df6aa08234617543e6723b2cfb1a94fa6a507707a659aea17e821ba28fdd05b2a55f64445a2ecfa933f8b9cf80b8bcd51ac40651cbf345b89429f1e85333a782f4684b74f47782822e17edd483c1c75243eaba33c1295f2808ef2a5a89407759d7a3462a73ea7233c1691f0799db7b8dc006f714147fc4a03885fd4111f6f00f1211ddee988780feb6cef6a54db1bd1e171ad01785cd211bfde00e2a33ab02722823da6233c1991f0651d1c371a00c71515718c4ed5c275155f3dae228c632cee9f548cb125117e8c7d00f77b34f9d961b379f5088b33ea0dcac5d463493b4dab6deebc7e8ac6e17c0d2377e533c30ed129d012cd6ec5885dff189dd6a9e76644f55cd5b9865b515dc3359db9de5698ebbfffb572378cb95ed7119f56f6851fbe0c437c4287c94c544c26756ccf36a00bdfd0f5b4acaaa7dd15ee8a8977f5638d6cf41df5a7ef647f9a15dbf0dda79c6db172da6ff8d3309650d1d3adbe84b1fe299d643995645f6824db14ce73f30185ce431f72bd0c775bd2c7ec520a7fd8e28ba7fe3cefba601889323a89e654127da5914887edace414f5b54abc9d1031bd5f5da4f5045c8fb0151878e5f4e76e411e221746fe9b3af9e755f2a39a37a165d4dc07f2f7fbc4b70d68d8a09f93531b5da173106174580ff7b774dc2fa8b8df88a0bdea2b3aab84028e6d27a4a50f90521e61fc92f2458346a0705b87c29d66a39017ef5b86c2b40e85cf54283c11c2c74d798dcd91f82179de02c95bc97bb974350bafd5f639bd3032cfe864fe5c25f3425d9a77471b5c832d8f388df3c0b33a197ea29261d9a7376fbb0ec7c7c0bdeb810e24bf8b901bec4f6bf7b5f5cb9bd5c9fb5395bc8b75e9ec510dbd7511e8d4da3fc3c897d3c9f733957c6bda116595787f054f148e4c4ba733faea9ea49e9cc6483ea793fc0b95e40f2b3c50b9556ec7cb84c69fe4ccc1c1a95e041a65c3f33a497fae9274d5d888d3ec31664127f72f5472df6dca1813762449c2d7b27029ff016dccbc81dacf080b8c15459656f973a73a0b3e0687ed178027b4a58dd35db7e04371bf14fa43717ba251e7a382a4704ef060fd3d9167676e54d205cba43f0b969412b9b40069daf6f8d424bdcbb5da96a54d8ddb755a533017bfc2d6dad536147e27d521b046e30c10c09dbf6daa8eeea7144c3fe880cf0c11708f0e35e01c281ad52200b34b7b9a45f8e2279968cb21ee5f9a046784c0411d54f7d14bb43a7744f3c8dd584078c7420893091f71ff80dda8239bb59ecaa87429fde4c4df037bc7649f08b0cfc5d0d6dfff1ae78bdc45642aba59a64edb2a8f6cea11298759f7fecf079d1c0e3a4b08c20dd74793afb86fd257f4923eb7a982a3e723127a1b7aa5afad28e72e531edfd05d8b20f5f8871473b10f4cc2860d143c8b2adcf88d0137600ab8eb0cb8872681eb96f6e6347c028570a69c330759d214641683ec9149c8fa2564e5436fde072b831dd598bd5d66e03d6e2578062dcf18785d0cbce55682371743f0ba1978bf36095e528257a02af1b4b40b0cac2726c1ea9260e164721fa0326a5b095370a5195c2bcd836bceac751983ab8fc1b56a122efd24f74e0c27b9430cb63593b0f548d8f081aa7cc63f9eb3b50e06da5393a0394f067cd339de4f06d71870cf9a616d05d9709ed60ee2e9d9120cb4af5a015a1c47cf1e06daf3568066f041ca1868571868eb2641731fdcf73c1b6306edaccf1464e30cb20d9390e9a71d06613336ed4832d8369bd13dfdc73c0cced58c4d3b8619685bad002d8e73b53606da6f5a019ac1ee690cb47e06da6f5b019ac1d1d31868671968bf6b05680b31046d8081f67b93a0e13b70de37ccf5a7b3e307e35506e30b9330e23b8a08d43b3acc55f4bc0c6437e7e9d41888130cc43f9804d19dfe7acfadc57101fc1283ec6b9390e9a7bf9fc770fa3bc660fba349d8cafb06b8bd1ccf7d838b0cac6d9360e1e36fd8c328fc586bfcecf01c83f6656bbaafc1498b31d806196cf9d6c066b0231b83ad9dc1f64d73c6577eb6da2064c696973a19643bcd80ecd873e83c8ecbe58241b6db1c2be3b3b8388eb0230c32db2464953bf371b4b0330caebdd6b8ffcf62e8fe47196cfb2661739c25ff638878ef9a4e32e05e99042e25ededede9cb4df1f467e7196007cd1802bcfb58719c68f48a4fe665881c82f42daabd43aa3d136af52f1370ec221370603b136291cc79976140a28cdedd391499076e1deecaef3564e96fd8f095ef30ef5855a719fcd2c17708a4a5ee3f870db38e46bc48a19234ca4b15bd55b492a53faefb94e547d93aa5dac94c8768df611334ef10b7c55328bc4b4ce127f15f14b53ffd49650000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset.meta b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset.meta new file mode 100644 index 0000000..492d08b --- /dev/null +++ b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5c43c052b48b4db4999ac27721ee1ba5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset new file mode 100644 index 0000000..0e38066 --- /dev/null +++ b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 62d157ce28de1064b8095c8cd096e77c + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9d07781b47768007a4208aa4aa2d8a94ac5e2c5812098a542f96d844518d129b6cd9b20491a0088bcd2cb2ecb4bb94cbdd25b9f47ee9bdf7e42ebdd7bbf45e2fbd2797de2ef1cd7b3b4b3c2ce62d16e03e40eb9cf809836d6fe6fdf3e6cd9bd9d9455552e97fb143fa63440da82ed5a286d5989a51d3fa5b974ea7f49fb3e5eebfaee6747a5f7fa6f4b1436a67812be1dffe5893feecd35bf36a415fb9a846759ac1e3832aadbff7e96bd37a0bf68eebff697d566c85be685875ab7e754d35c61a0a8818c18be6cdbe18e8155ba53f3bd56bfa681a0b059924f150a3fe18d447e6f1d8942eb47bde0bea36aa35a58f8dea6be6d4a496790f25ae5a58a9f08b7292ab26857c6ac97748579affb7cc765c2d5dba74ae22e7c6c8f717c8b6a68024687ed54486ad0c2a7bedd2be6ab20fd22a93d78b9eeddb1e1935641b8ebf6474396ff65f33e94692d746933698f40973ed1db3bdc1a4b5e49a5a722ea4751e16754ed9abee7af25d47aeb595c54dd793efebc83e48d798bc5cd99b4cba965cb386ec83b4de5c9332db8d265d4daea927fbe0dc7b9e323d49b609dbd815b3bfdfa44de49a2673eea8d9de6cd22172ce16933e45f28dbff1c61b1f32fbaf9b742bb966bb49b7996bc6c839747fdac37a0791b1c3a43b4d7ad3c3f5a649f7926bf69a748f39779c6c43bacbecbf6fb69f37e93e22639f49777bcedd45f6bb8ce0f884d97edaa4fb194e6e790f92bc0e9af480a7bc074c9a60ca7b88c83864d2673ce726c87e486f78ca7b83e801e961733c63b65bc97e4893e6f8cb66bbd9a42d9ee30fccf611b33d69b6874dfa9c498f9ae353645bb7c9f809b3eda6274d7aca9c0fdd80b6ebb86b07a74d7ac6a423267dd69c3fe3a98701939e230ccf99f4bcb966d673cda0493bc8355e7d3a3dfc3a3cfb5ff1c8bc60d25e65b7974b26ed2379f699f4a2b9668e6c6b762b5dd6974d7a85ca36c7318f780cfb818bba05a6b4b64970d8b16754f0aedbbdb270a78d7d017cc0bffd98ed82ee1e67b5004bcf398cfdf2826a576dd69e73736c352977177ea6f41919140a9979b2786f5e1650b849fd9726ddfebcdedf8b510374fc197da445c3cbe0557775137841ffe54a19d1d94eead021ad1bd0a2ce0ae4ddd5c5ce3fb3904a102278af19d0329d08664aef7181ceeaed492ce1207e3ec492a6b1f47d7adf02c653d3da0574eaf411e696affb9cfe6ecb73c820b397d11ec870fb9d70c9ada66ead0d943e8971c3476aa4123502e857ce9b66b8228991db3bf36ae2230c1d27134767ebc8388cc86239fbda541263f0813c82c5eb98afa1ddbe0bf1beed4306aabb1135c8d630fc8be7aad5ae92387cd85a402d3fa8202f11db9427c1bff8f1f88a5628a4177dcc861e87114365440fc766504a4a9f5b3c7e807ad08b3f8f7d2b9c5683f89af2942b5c040e61950d218e2cc74511ba61c1a0f6ff97b57a596933e8d5219f79f439705ebfd6e065d3034099a6f5b76c70e1caf0c70c4a357b30db29d722e50324e009b3945c4d54db6a0263bb89c7bc26dc898c626aa32e706dd4636d1c0aa536ec25e56a6485a5465a617335e7306b3d0ac016233cce095f1382f0959cf0b52108afe184afb3088f15297c954d38b482f53683f10aaee705d772a5de1002923a9b70e0f484d5b77b25d7f092eb6d5e01b37b6b59bc42a1a15e2fcecea6735a5b7eab7463fd019d8e6329d2d81ed3018688fe7ee4c9253e59c04984d6a3820f58e5b58089c22af4670de8cf765a4be77eebd43227745e0f71bcb3a873b2e5108fdb3de626cce1f1d29ff3b1ab6df68d3b0745ed3b57b2735e06cf2b3e806b0cdc973561cde44f6c14ca9fa3b7c6460f774e89d21bd6fb9c49951e3c9a411b69511dba1c2dea1a5aee559432a1f7dd37f6039af95d79156f9c2c6279fc896f0e4c7c0b1287519a7c99b95a5a6bab25dc79a38c361e64ac6ba7fd5460da5b9176439e56be434286da3a1b35dc39f318dab61b598663dfdb0213df8ec4db4bb6ef62cbcdd5d67a2ebcda114278b58113be3304e14f70c2778520fc494ef86e8bf06263e58d36e1d042f6d8ccc72b783b2fb8812bf5de10906cb209076fb84fffaff5086fb009dfca0b6fb4098770026ec0edf7f286cd016c12705f3f2f9f263e9f269b73c236305f26e794dbb033facc9472a7c7bdcd7d1043c871bc1792f634773f39fe4e6a7f6027954027753cc74995a3fc9cb3da6cab3d7432e50d3a9d806fb2a44e19eec7ed0832698b3570407181a77f1938825b6ced0c86a50755fe78ac15c66330815387cd39af9d6de2dbd9535c7b6eb6b5e73ae5acdcc9607da55087d76dbecfa7656fb5d906f611a932b5ecdc0e7818adbb53e7b4a0ff66ccf4aedfd9fe76d312b8d526d166f6293eb428be6c9c3d6db3d5334c8bc04283654da06ce72cf53067a96dca1daab72381161f02b681b31f03b7167243aa625ac40eaed33fb2cc4e7f27d7e91f0da1d3df656b55181cddaf48ab1a317505b5d15e748df9b7b0635aa36aef9414c66a077d2c69792582ca231fccc4d071b467b95270ad7bb7cdb4a0f64f5850b56ecc51c5e8e3b5b5e3bcadede15afc49aec59f5a6af1a79150b30fa1215c900a4b10c691c094707bdf6bd306a678ce0469ef5b78c1fb384c67394cb068aaeeb4b53a7c14789acbe71c97cf79554aa8b0df960f840ab0d62a2f5400825d3ab404737f40d61a8343992f2a604870c6dd2961dccf70b97549e47680abbb6eaeee7a4ab29183b67ca08a2e2cd3c80f710af4720a5c2c4981662e9f3e2e9f4b2519790b67e4976d460e37d3669761da494b6e499c1c28e738c91b5b15374eba62b3206bef08ebdb6d63a442f973bd5eabadae6094090b9af3876e6f3997573507f8aa39cc09efb70ab7446b3ec2db38e1d74310dece09bf1182f0235c3b1ce0dae16049edf0a82d1f1885c0c2a3658d578e71788643c0739c133e1282f0131cfb9b1cfbe74a627fd2924f1267155f17f54a856ea63a6bd8d264a66a1ee7a5606ef155f4170f74f7f8503913ef43fa9c399c865f58f64d7058f9bfcd527b5883565f770b7dddb3aaf02d6249ad38cf79ca6649d0cbc1233a79bd5c359a1844dcc5f46da7396b7d91b3d6db2559eb194e97976cba8417969eb5e50b4dfd4e084dfd595b13c4b9f7e98a3641187c2d6207dd9263949077f6eefa729adadda29b5a0a9b5a5b80a61646e9b92675ce56637817e391688d7103e3ebe82816500648a525f01b50fb5d177c8a061e790916148e62ed9d51fc8480b4265c8d9eb73570d884e7e9bcf3759b6d0d3cce37f00e9bb9e06d93bb15311767a6b94fcb4d61efb2bc39f074e0ea1fc7eadfeb53fdc5968cabce4ece5fdf0fc15f7771c2274210decd09cf8420bc87eb3e5fb6759f5051ed7a735c0789c7f4d5f774daac1bc4097df084fe76447fc2cab5663cd2a63f9bf5306d4c1b669b3e724287f56318dcb7eaab8be96c2fd84a09c1c403c50413f0b05df1c1442f4763ca46238cdb61176d39c2f0053afa650d74fa2c92935be45d4cee2af24e5df879e54c7dc3feeb5a624ae70df23a3007ef7a71f70a7f173313d8c5cc2eb998b04ac6b9984bb6ba04e2afd80aebadca59be2a2f73e63fc799ff7c49e67f8533ff0529f3bf6acb1196922f0641e6b31cfd9a4d30dcc67b1844b0cf6dbc7e9b605899f26a10c1095ef0759b60b831fe2888e0242ff8864d30f41fafa9e5f71f0336e150e1af0729f5282f78d0261822a48f0a22789c173cc4e1f8e810700c73c23f2604e1239cf08fb50b2f6ac2f3a64d380c973f2e086f9f5b04cf71a57e8ba5d4ef7fdf95a24afdbc4d3838a6b72ac6337ebc2ae5fec32d5b3ee0193f41593ce359a554ee2350b607a9f8c7a83ab4639fc3cea845ddd17fce7ccf1ded9fd3d8e12ee8b812f6d3ae31fb846731fef7054eaf4fb4e905a3167b9e4e3967b4864e29613665081fb198f62929bf3ff748eee397c5e8f722a7df27d9f41b09b9de7a4dbdf9e9b99cfc8a21719b23f1361b8923cb24e1e8efacfd847744bc6ab183112d2ba30704c568f112a7c527dbb43817c85e3b7419c64c1433138abd96d616ef70babddda61b8c0aede36058afc92d47b75b6830bf128e9677392ddf61d3f24a885afa6b567c2ec5689de2b47ea74deb4b25694d75cd6fad5eeddd474678ddf36514a3f13d4ee34fb1693cbce46fdc69573ae96abb47d2b77466762a7700bd505a97ff219edd62b486a3635ae2226a0f72b3d778b9d047c5c2f058a31c874fb571389553f3d9dace5d77edb77adbd119d68cc2e07dcc736e181a8d711a7d1ae7a76c83e8dc3b5c0e6fa7ec7dfa783ff6185087bc7ddad686861739a4392ddf65d3929fc0863949ba82d7d171de7824b0c1942e3f9470ac40e9c3a8bb714eab4fe7facf52fd901bb32ee4ade7e36b347fed5f31badde774fb0c9b6ec759ddf24b91ab1178c4794fbc609794bbdab3185d26385d3ed3a6cb00ab4b6e091c3dba95f322a794721e2e0e5afea06779fd69f6098862086438029f6523d0e589f468ae34d6ebc6be21a3e6953dd6a3d7f91d0947c797391d3fdba6e385803a427f70cfb4bb51c545b5e5d5f401a7e9e7d8344d0b47030b9e97df8ee0adc2cc9227f68f09e811bfbea714ff3cc971fa5c2e3a96e2047b5fc16c401fe70640769637c5da55295a4f715a7f9e4deb6b01db412fde28481906ee6c44bffede839a81c0705a45e951c634a7f9e7db347f5b99a3646e155276de22683982ac67928dc36738d25f6023fdae3293ce5ed3ad53f746d4189e3b8a52c7f4b9c1fd52aeb5f29a6497c4d817c484417e9623ff8536f227d958c66f418743b607cb5d68a4bf5c7d5ee1f4f9229b3e677d4706d9750db9e382711cbd4deaa81aea699119a9f21ea914bde638bdbed8a657bbb28febb89ba9b93134446057741947ad5e38883fadd17fb198f348c434b683d774ae33c804e62693f8686beb52290bbfa4074a30a5fb73c87968291628bc24ecdd8a7fc76efe4bfe4a7ddd6a69eb48fbacda055fa497ff6ad91aa3912b4b93c6477adf6c9a7e09d46a8da9d5aa243e407bb0446b2a5c8a2f85dcaaed3654fceb8c1c01d7ccfc087ba3be603e859ecc684601ee4c6208af9706dece74bcbb24f73dba61d5c4ab5a81ff974942727ed5c01917432f1305381f8c67e17cb9249c46843383e1b33b3107933e192d9f4e97a471e21d029728e05bbf328bef2b24f1f9af3a8f02aa0f5467517da524aa86254b7306e55d66d8761f831cefc3765140f76ed248bf4a125df6398d2860992058be5a120bc48ed9971045010dfc83f0d623dc3bff17d6abfb0bf1e46341584fd7a31ee18cf81cca1bf3c686f87a90c7ade45fa3486c97f05848828d9712051c798234c144919e2c911780244ae875b38322fb60a61506455fabfe7f8f575a61bcf27500e19681e078a1af97f442355897509be05eeea8566f0ecb79eb7f6d8e4f6a0f52fc52fcd2769575d9df2009abcec0ca9de1382687ec8014b2e304d9374a225b6d9065d4b4cabdb9d72687ad5e0a5b35c1f64d92d8c0497b5d71d6c1677dd443ec06a2677f2304e43757c6fe8ecb614b48616b22d8bea532d83ae5b09d96c2b68760fbd6f27710ed116ca06d04d9b755c6d28ec8616b90c2564fb07d7bf92d4d109998a5b51364df21892c6e90dd930d738f4b81da4d407d67b9401d8e20a86708a8ef2a07a85444412508a8ef2e17a82836bd5d04d4f748825a87d2b26b4ff2d77c462ffa7a9ec0fb5e4978ab8c954d9b1da2b6d62485ab87e0fa3e495c7ce4d51d412bdb47b0bd4712db1a161bbc3e257a21eb6502eebd950277520edcac14b83e02eefb2b05ee44042dee0201f7039502773482e04e13703f582970511c969f20e07ea852e004271cc7a5c07510703f5c297082375846a5c09d23e07ea452e004c7a46271dc2102ee472b054e70dcb0450adc4102eec72a054e70aa5bac733842c0fd78a5c009de0d1503d74cc0fd8424387ea42ae8e16aa5b055116c3f2989adde60f33eae2de8dd6aa4a01d25d07eaa12d0042d4d0cda4502eda725a1b9336f8e8059591b8b4be1aa21b87e46ba2380e7eb1670f586f7b9f7e8ddc21b22e07e56121c54bd6b6379abac23b07ee82a01f57392a0ecb787057d98986db512643f2f898c0f320427279352d8b6126cbf50196c82c3f6ed52d8d6116cef93c4062c8a59414d1f5c8dde54f92582f5fd9258eb55eefdd3ecdb7fa237a0bf49a0fda22434775c3a667407db735fa211c538ae8180fba5caf83ec11b8162be6f07c1f6cb92d8ecc189e00c885870729820fb957234d1f4d2db30dc43a2e0c41639ec27e07eb552e004272bc5c09d22e07ead52e0a2b8ac663501f7eb95022738001303f71401f71b95022738961003778580fbcd4a8113bc5b2f06ee0c01f75b950227b83e440c5c2f01f7db92e0e0dec8ace7b55782f3716277e90708b0df9104c68f142e44f01efd0182ed7725b1d9470a820b69c4460a5d04d9ef55c6d204c35db131e94682edf7a5bb02ef03b7d997e0456fe1d62001f707d25d01d81b9ce2be0f308a9346e709b03f2cbf4f135cc72be6d3ba09b23faa8c4f13b434b19b80ab08b60f94a369c205637ac723d911a858d3ac25c0feb8dcc0a2e8cb1401f62792c0a08d3899c2cd16fa7312d1bb637a9d40fb53496890f57cce6fa388c1127b11453f81f567d2b09c213a34c968faaf2708ac3f2f27ac28faae9504d65f48c2ca5fb31645db7a92e0fa4b495cd9b095bedb3d8a77021a09b2bf9244e64e2f8e2ae745f9f4a779a2b89cb48e80fbeb4a818be2e2e51801f73792e0d62abab0740085a4f0724744f4c6983708babf9544c78f31bb22b876682fc1f67792d8dc2153b688d1ec47d713607f5f6e60518cd3561060ff506e60824b5ec480ed24c0fe5112987d8251d0c6c49cff6682ec839571fe517cbfc21682ed9f2a834df0eeb9589fb98660fb67496ceb95bbded6fd492defcf6945b1b19e25f8fe45121f6c4c6b59a34a70c981d81dcd6b04d3bf4a62824719609a7154b90f694d98424c2878b031efb750226063cf1178ff56fe3e54d0ab89213b4690fdbb24b2b5ca9d4fcbbed43eda4b465b08baff9044075391057e42260296364c70fd67391a277dd047d4c26e49213b4990fd97b48539c81c89a2b8b64ae15a4b70fd7739700d451ad72682eb7f2471b94374e7d7081695f052f7ab52c09204d887ca0d2c8a13dbdb08b0ff2d37b0283e30d64980fd5f3980cd2bf7779ba239cd1827c0de2837b0284e646f20c0e0c65305267f7a223867f634c11693c4b64e799f39c9fd5d73c1469a9282f7ac7ad3fc30602b4cfc548101ac320690f0bc752691330195b02ce74af8ac8b4b30cfce240aac404f14f993508900af92777e956f83a92568bd57f1cc94a692c234fb0b7d49783a3c069309c5fcd0b4bf4ca8237f69d55011317b4b9c0ccdbac2f849409ba685f5e32d75b54fad2477425dbc99f55f41ebbd2ab90bf43d1c82ed152e513cc6ff086539e6791ebf5a757e4d7416cf84622ec7aa61e626575e06f34dee7e3c2d3a3cdd57e65af49e522dbaf812d5485ab4236d02f17b64f706d0ce5e0f5e9db367cda23da4966cc169df703f632c00896d319811e1a575e8adfba86b06a54e29f71ff494ce5f23f6edc3fa5ac7a7a455bf3e7f0ce5c1bff88701ab33782bf2e20000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset.meta b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset.meta new file mode 100644 index 0000000..19e1d06 --- /dev/null +++ b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa372bccf02bc2043a6d243ef0547ce6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset new file mode 100644 index 0000000..4a7bd52 --- /dev/null +++ b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 6657daa4973ee1249aae293810e8bccd + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed59dd4fd350143f77ac1b53105111303ef00646a00512dfe5432051241bdb8b316340c1990d966d107cf4d5ffc8ffcd047fe7b4655d7bb76e4023206b766f7b3fcec7ef7cdd6e0993f051b3680a94a5159aa73c1dd0091de36e057d1597f3e48d6f531dfd11da12e666692a62277fa6d504da4d3c35a8899da7b48fbe2cf339b271bf89bd369e78f4105f1bab54129bf2b44a9f698bc6d5580489826c6ab8638af552836897e907666d118a999832358e26879986cc5521b4b7ee0b7d15b5aa98dbc79e3a5540734f280e6ef05ed149ba44eb9132eefd80db2bdf18f9c652f8b266c6c5c5c51f4389961be05ba21a9942f04d1fe6f076461b8249a712ae30d3c2b609956b20a041232f5837698916b5684caa219fdc2bd296b0a22c44995980c5ef100b16ae82cbf699b281f175f10436661933f3f4113defdaa50518e74b804a016c2b70079b76d0d684de2ec40eaf8c5289cd1edc93054dc72bab18f100ade1b92212e6a43d13496d917e13634d89916344c932fa73e116d6bd8e7b1dcf1d1732bd8c7ae7ec34ee848067a65568c3d29be2a30f16f9171661e853861b8649936344fd0a59e2014327c91892f41d1a0b4e1a6d1b5b24931fd5cf1082fdeb18d6d0f3ef5e93f1bad4441b056b8fbebb51e4f13d91086289bc68cca23f1429787cdfc5a63b2f0f293deec94b7c5afe6372bd516b7d9494f8b5600913669a057b1d61b86e6ec39acda829ad6adedd32f67e83a06792ce4eb157279e6118ed7eb544168b97160eb70c3c2369b1a183c1a174c1c1d95fe5620d8e76cacebab2aceb16ea7a076671e7020eacb74c462c133eb744f1ef845e42839ec58f8f343165b1e73de649be318c4c404216b0039f011d1f567b484e65ed7c146b69c30e8ed76cb9be15e297e9cc2fd989dfb08e5ffed2d33ddff37b9e5368d8330ee5acc79eb179b972ed52ceacf8bd0dbccf64f53c1571e564f600144fc55e4cb7b5c759d1b2a4df8ec1b902f69641498f431a97526c9d35a15cc7ce6dd9c14f0d32e5506ef511d3ccbb0adfe1c3d10e34df9328898ed4275d4edc873776f88ad24267b5799fddfcdaf55e80c207cdb4ab91470b484becdc374d47d8aade4b5dc26447536fafe84dd1523c656e03bdbeb545653f8780974724bd14ddc0b0e58d9e0d12c9c55fdb745ce6848057b96fe055935deb3de0399022d1c0c51f0ef400f10f31bdd2f45ad5c251312279e85caa7f5de81d04a38433ffad937cd4efe5331d3ca5956af529d2e26dcffef32c6871167cce2024bda46131642fe28eecf0c121c0e53a67ef4c5b8c677a51e12a713e2071ee0036162760c3e2e0450d6845b2ee2070ca07dccb38811b72812bbb3fcd96dc179958614bc5051bf9601b8f13b694502b61fa88ec70d1bd035025ee4f09b6d88927fc756a2664a0990e39d5a981a3aed6ecfb9f647d095c4ad2b7eaa1c95946bda3fe0e8bdd694617ab497f290f58ab72ab0ab04ed3eb14e3a12e5631f9edec5eebff8a9c3f9bdca49636c6e5a89687e51de2fc2b555dfe13abcb1ae32fe3a454410f1c0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset.meta b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset.meta new file mode 100644 index 0000000..f170150 --- /dev/null +++ b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e84957e5839d9fa4092a7f45eb3a4a43 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset new file mode 100644 index 0000000..1aac58e --- /dev/null +++ b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 667c46fd2864a124ea921d98d4914fe5 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5bd976134710ad913d5abc22b02db305484850007bc41242c8826d6c8813b66359ce0327c708231b81bc449601bf25aff986fc474e3e24effc09a9aae9b15b33dd331a5b2d30413a9ad1f4525df756757775b79470005fd645bc2cc01cdc827128c153588735fc760befabf8769fbcf48750c7fb0a5ecb9877114e47d4a4d7396b14afb3f8b4090dacb9054b78af727e112af87d16eb56f0895297f153c1525637562ac1343c80fb90b38623442c70a54d9166112e2b8dd729d8c6dc0a2b458d389c95c34b117336396f1595f6ca3d825f19d62ae62d619d3ad450e61396981ec5abc598f89611f73efc24f133283dd3bd47dcfb45fe21e999d0bdf195ef12e5b2bef46e917ed8976e8bf423bef4a4f80cf9d253227d583ca7157a50fe8878ee15f70109eb80289313cf099147b212b6c556fb11792cc3063894697d19c3bdbc9ad18e45a29309d716e861d46c034db8810214d62db1ef34e00a5c565af7a8d527e97d8baf652c5165a1a3c126fe093441cad5f05d915c7313d3efb06793735631671ceee29d6a3d864be86c8f7c5216b0d91aba7705e6f1bac1f21ea3dac1925190c88dfd75e650a6dbcb5631c52374039f6bac6191af2f59d30a6b3f8b690deef36bd8eba7f0fe9a5b0b62afe377559bf38232b58eeacea64b77bbb467a6694443da3bd46f3e5ae49d588487ac51d10dbb1dea23d69f014b7ce4d01d646c9ec45c1997dc69a429ed3238f468cd05188c8f318850eddf2edfd7e06a2816353364eee38c60d7c2336f8efdf5efdf85b77633b42be0d0b4619d888016462cc9cb5b230109e1106cbbbb408afae9b754f4d31469153b48bf5baecae5e21b20c93353b301389ef326cd223cc38c3aaa3a0e33a84499d5ae09254b0ca9c6d35c55a43dc4e732364680ee71d0e406580d4e0958b5901481455e31ed4681d39926a1324dbad3a6891e8bc24c93dec1b56b1a7aa919cc68188cd241c760978ac14ce79ddbb57d2d62a4543348e1f3a9008313136a067bb53e18ae838ec16e0583858c8892836afd3e61677c6a91461ae1b64e78bf5238c4129ed4091f6883f0944ef8a09a969b7184a7555ecbaba8f90e7a2de5adb39432968defb7b4ccbbe06742edb45976dad100b86815746e9b51d987783dac188fdee22b609f8cde3e3d2afbf4767a547980f09f831bd5c7b70e2d96c77c3ca88d33a41951a2dad799a657c51eafcdff30ca5eab8bef3b1c1d549af079edaef38a8934f2565f73785f662d287d498caee16d855b6678879f5dcb3834205a33d0fa168279141480260ade2648de3aadd4cefb36853229067bc92bd02d6c49d5826dab7d70945b78bff0ebfcbb4fe5df34e7588f3be2df4598869f31af8ce52bbceaa474399e9de416761136d708f7cea32d8f1bc7d86667259bed57331de3fdaac19e06e9e3ca29c83fd267f523fd80ca96bcbfb96cd496254c7337dd6638b7ca1e1b1c7375e53c6bb92b972dd620dcae275ab6eb49b6eb7900235aea6c3ca8b23145619f8062edf7c38ed7357bd07da035dc2b6ef7858888c76111df2b9cb30877316f8905c97e492554f2741e1cf0b194dec70ee9909d5221bbedf33b996b17c93a6ab0c8eba50afc8695ca6265bbcdb9baba6139cd79cd41591ca4591dd2d32aa4931a1bea381f179a921d7f127ba2b37c25cfa29a7e24f29ac89fb78018abe89571f01dd6e13b13c7475bc1e78e3545de22aaa096a6911dd121fb5485ece63e90fdc2625e7410db900edb67edf64a77bc2f73a4d1397cc33a7c6755f866f681ef0ea37b29461b176d85b13430f6338d734487f37315ceeb7bc259e23277f1b3c20763db62be58e798d03b5d69079a9c0ecd172a3437b4b371707e98e6e8c38d3cb605aaa89af110a5f06d59b4ce9be188a88e351f720d7ada0487a7bc428c689eda5e457d68de9947d84f76f6b1c2259c03fdf1683082dbeb4959140a77ef92ea2fb3d778a72f2a74adaf1e83a7822981c893854c67d5b1eac1469a27ab8a1f2040c2e169f7c21ebd295a0b3ab84f76a97d28fe5ebf2be0be589d5a14502f72753a9e6844cb8fda75196301def1511b7e11404e3589c43ce5c17c13dff4a22eee13ee8f4cdb75f2dcead150b03f0cf208f49a57fc7596f7d4df3f38b079df343f2ffb773ee023bbc3ab7a582cf0ceebff7ce42bd0c8474780c9416fa028d0403166b237d39ec373b1f4a0ada52a567b16ecd5fb39fccd34f5efde5640eca58f77711f77291b3749d97176ee45111bac61a1d6e2918239524f9a22754022d531492a35bdd2148c1f3c0f4c4964154c92d52f3c901a5e66fff36453846b8c38db1471201177c924712382b825315df8379164e58d76d88c292a33129597df25951d1bfb864c51d9235179c524956714130a29d1e043a7b59dadc10fcd571312c1574d124c21f3564bfb20c648cc9a22312d91f8954912a9a1ba6f13f7e0cdd1dd125dd74cd235a89da3d7441163e4a54c916749e47d6d92bcbc20af868588ba8dc0e666bcc32da3e3e3315374f749745f3749378df0af02a71807af73db1261df98248c10b81bd2fea39183475a5222ed8649d272100c73f4a7b446bbacb1d9b85f22f35b93649e1464d231156d7079e3a1b70da5ff1193516273a688ed850f6607b740e1e877e41c49e11c79ed365c5e1976e53523763e6460ca2bb658f2312263770b372bf8a65f9cdd035aa294517699efbbdbb90e1f50537815e77c235c66f45eebf720ed41fbfca4d6363f69c7feb10ae97ef692fb42ace2f061fa878c9f7e95e2f52476d31c7783125ade154e1bb175fe0f719dcbd8ff0184d773623f3d0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset.meta b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset.meta new file mode 100644 index 0000000..ca40c94 --- /dev/null +++ b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 200334ef9d2bf894d89a7cf19941c6c7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset new file mode 100644 index 0000000..37f9c06 --- /dev/null +++ b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 68d999abd6627d04999b5bebe2438687 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed585b4f1341143e53d816a48a981834f1c10713300abb40a26f265cbc101508a57d21a62cb060b585a65b15ff82ffc8ff6682df39bb4bf732ed508148806e3ab37339d7ef9c33d3e66cc2473d4753a1755aa4692ad32e1dd201de16d137f004a3687e8d5ae8f7d1ba587b4e8f0d94fc99500fd02e63e4531b94df68077d4dd64be4e17d19b41e463cbb87af875d6a1044655aa2555aa17175dfc0a222447e38a7d82e358476817e62d513a558882d4be3684a58f165ad01a5a37d9bf449cc6a606d07342daa83e7b6701c9a645ab129ea281fbec7c7397cade3e3e33f96122bde81af4b4db279413dedc3dd11a5d9d1cc3a9f0b959810b16d98d404038db565f1659be668566bed43558ce9bd28ad8b1d3561cac252227e6744b072753c5e0c2a1ff36f056906ab869569fa809ea9b66806cedf4c71a9406c1d707bb481b629fcb6a07676a7c92486354db30e9e41d435301339b489715d342c49fb5d34f544fb65ccb525070e90050be88f445ad6f616de7532374297e975d4075fb7f920c4239896600d6b6f0f7098dd20f23f1061d7e707c2341cb43947d4af0c12373e0c8a8c25453de0311394d5c4dc2cd93c545b190ff66f63d6c228bea3c25a4206bdc79a8bfd9ea0c4f36be0e84236f39b17099d629ca488ecd47b8d43614aaceba06f25cd9d235b8e934706737b399bf94daa27b133e6ac6659d6a0c3caa7e1523ab80a3c59ba50b8929c837d35d9d72bf8f4a0e4e5b04c82a25e9d382fe98815b968fc10d2afa1c869aae2d997952a2ae7218433a3b87b79878e5f37203251e1b09a0501367b949b1cd00dbe9c063e87850ce97cf2b28b4fbad910f8a52c7be6c1bf2dd787cf18ed8ac6eec909c4fbe21655305bc32e6b38e505d6cd2ae0516a04afaf25a05aa05c130a1ef964b3f6cae9e38ac5b21bf0139f8d1bd06b5b42d27ce11aee71e1da3bb7b3d76445703a30fd9e7838aae73aebcc3675bf6714428b225ef0343be0ca597a8b518deef2399b87ead93f4693598b91f86dc1786937657ac060457e998101e3530d13c3931f6c0c8851ca2a387d09d1d349991206d111740ebf3438b4e6e19e5da9c83e1efe70a2a798bfb9a01bed698f906c568c4a1d3a827a3cdb0eab5b224b18e24ba779311ee5935d22a5536af525d2e1527bfb9a5741877d772751341c2e1aa31799d945c12b40cc97c3f4408cae9293967596abe47022d3add31872cdb3dde16cb94bc1bf402786293516dac2307d94bba20b5a57fa4e42d98cab7ad1e769d39ba739dac7e2c19bc2a07ea9325867e959b2b9d803159b0bdb95b6ff5e3a4cc7a5d697817cc0dcc355a025ff99b6648ff51757ec5b982f160000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset.meta b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset.meta new file mode 100644 index 0000000..6d267e2 --- /dev/null +++ b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 79ccdf09332b77b40b545556175baaef +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset new file mode 100644 index 0000000..88f1c95 --- /dev/null +++ b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 699261d683532df468f1ed17ff8c8cf1 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09edd3f6cef44c4dd5d7d5d5617a86a284d2ff6287f5d780ea51edaa56f5ab617553ddd0bfda753aa53fce96bbffb29ad1e998fe1ed47987d5ae1c67c2bfaad826fddda5b766d59c3e735e0de97402f37bd588fedda5cf1dd15bb07754ff1fd147c596eb93fa5587baa42eaacad8861c2206f0a459b32f0676c556eaef36f5acce1d41a5e02209ccaad45fbd3a6716f3a6b4d2ee718fa9c7d1ac299d37a4cf9951935ae67594b87297d62986363957d0ff57e8ff1de6f732931699fd67c971ee7e733ae69f23db2079dc6c2f37f99d641bd2b8499b4cfe79a203a4c5266d36fbbaccf64a939698b4c5e43f64b64b4d5a66d2559ef35799f48cd97fc16cb799ed87cd76bbd9ee36db0f98b4dca415265d6dd235265d6bd25673fe45c756e4117ffdf5d7ff67f24f9b741db1653b6102e96623e392d9de499840bac593bf9b308174ab27ff8c49f7916bee25fb20dde6396733b9962bd33d0ed20de6f8cb667b3fe109e9468fbc2ac217d24a4f7eab49ebccfe2b641bd27a93264d7e0fd986f488d9dfeb9177ccecef23db901e37e9518fbca326ad65e49d34fbfbc936a4a74cdae891d768d28447de61a2b77b3df738480f9ae307cc760dd94ff5d9648e7b84948bcbdfe5ec1e07e97a4fb9adf3ecbfaa8cbfc66318bdceeb7832a8a655022b7e8dca3fccba67e60eb0186be00bfe55e165e774289bd6022c51ae1f63e89c6ad03e618b729b636544ef76fc1ed4474ca050b898e712af645c02949bd49f1112a267f5fe4e8cf010a427744ead0e1a1378d613da4d1fd39f742903fab2933acc8f68e79bd79702794f68b5338fcc65128473ef393d5aa6d3da4ce93d2ed069bd3d891af6e2f72dd47404b5efd2fbe6b0edbba15bbf369ddec6ab65da3ea37fdbaed96790d975b4373adc7ea769738ba9435b03da27b0fd592a91c5281140bfe251530d9727b0c57e29a32496183a41063a325d46461d228ba5edab5709ecebf46510f46f63a68576ff86bc9b2865501f9bcd1e3b1d28f2436845aa94553cddae0695c0bedab61c7665a30af2aab147ed57ff787c7912b4f4f28f59f827e3a64dcb34a9c463126c31928b38c9c5854a5e66f319ecff8e89fa4cbfdee73486673177022368adee128fe87dee2003e87347bafed28dc7cea30ed93d0b62fd760fac19136a321c2c098556823e724829217d394f5a6e2b151c7df48658937b51f73194e3bf1ec36067a7d73559d2a5483ab3a3954b078e60dc56638060995dad968c4a53ca579a15b6e2c1414d4f88c593ab61cb563830a2acccbb70cab1703666d8965d03ae688a6d4503f42a2c4a811765144d395f342bb9725fcdb9a38f722fe184afb10a7fc19753ade2b0ace5caca0796524ef8ba00849771c2d75b845754f913fe00c77c4300055ace09df1840815670c22b03d07c35277c53009aafe1846fb608ffcfbf1ff6257c2d277c4b009aafb3084f60cdbaa616a33b03c30fe8dc8fe863e7b2760fe0c8ec311b66bf8e78f8d8e335748bab6330bb168c5e5c245f6fa38da126dc6eca1c0ebde138ff2de1f6bca9ee505c1725fbf5397a1b6c1501e8edb4a9e4ad043bf84ab09113bcab40c1959ce0dd050adec409de53a0e0cd9ce0bd050adec209de57a0e0ad9ce0fd050adec6093e50a0e0ed9c60986eaff2088e3da837af9b21f629ed91cfa9a4baa353f98f1f9b76d8225b59d891ed9226f5a472a61bfd47b6eabc235b0d13d9725d9f8b6c3b398f3868f308b87b378104c3f58720fc6497cd52f09343f954aa1a5ef06e0ee1611b42b86937aa376eea5d6163f4836b0f87eb4881b8f672b86a6db8e0fedb2c69b56581f901b48f03942810d07e0e50d206088ebe652a3e54f7868210f901708003505720802a0e40bd0d00c4cea7f5cf413c7606fbc610afc3c250cd61682810430d87e1a80d0384b7260cf993e807a7750dde6b00ec51cd24c70153a7f737695f4ded6ff665f641ceec63059a7d88137cbc40c187399e276c3c61ec0bf44ea9abfab83b482cf5bbfeee6f3fcc8e70a63516685a2d27f8648182139ce053050a4eda04c3d402743a0b9d71a9e384370520bc9e137eda2afcf9763fc21b2cc21338af06b2c29f1469bf1b1d82bdbf034b9396795825708a0f7c26786d203a7abfe2f61e36ac8aaa165283eb851fe57cea4c000e7b8c13de1a80f0e39cf0b6006ac3099b70a80ded16f749966716b12967ef255bf84b3672f6740400eb2427fc6c00c24f71c2cf0550120f7225d12956124db64bc2262c012de846fa699be455b89947a3b68d17dc6c130c775760d569a1b76e5ab8f2bd6029dfca97ffdbe8a77ccfd884c3f1b0ce35a36f041292e6e3a7ffd3ca795137eb45afbdfa6a33f9c29b0c7ebca8cd72c904deee599c4513b0663b35540bb651bd68a198c0bb4fd9964514a611d4eb96d417d3a6c2aaddec8b330ad3826b57db6da58fb7cc9e5c94d2bf6219a706eb03976d3e80f7f16ab3d00f422f8f276473872be80ed20a714ed1c1c5ba1e5bacab57ee12e65e7de6055dd0831a3b54367804e319bcee536672aa565dd39f31ccb9a6a5cf6a7d064d21cd601e2db4f4d56b7ee2e859ce825e9b056758ceb028645a1f346734ef44cd9d75521d5ab767743eecb79f9dbe9e2a38ebce71d6f5d9acebf654e4f4eb3a76ddd4565e434d6f685d2794bb221884b4e2beecda67cf0bcaee4eceee7e9bdd7c30edc12b0f63f84af7c85b774ff76a4dd76ef9d1f93ca7f3804de74e4f59d1abd292eac4baecd6ff3e356e254dcfce961354f97471b63e62b3b5c547f9387bc62cdaa6966df1fbb91c3fb63dc4d976d5665b5b20b62dacfc16eaa917380b1fb559b8cfe3a929aa8e557dda42ba982053cb549e1f2d1fe6b47c934dcba605c400c88747062166bbe7f6ea5a378e756d244bbc4fefa2f9b1aa9bb3ea319b552716601574c3e6306238919db7c2d6b3f063cb45ce9637db6cb9e3c396d4b4d2795d22030bae2f61e570845376f8e17a89e3fab88d6b73464b92aa6f0ecd73a8c1149675b6da999e436fa30755a72f7396bdc566d9d59c9639fd98219f96159e130c8d2b1c8d6b361a07d8fa93f2326f2408aac5e8e1347dc2a669579e7d9b6e1c9d409c9ac6a519439ea8b5782d642f67efa0cdde46b664bad1a271357ab707701387d6c3d86a3a2d69764b83e8d1f471d65c0fc6cf6c356261dcfb394d8782d1f47a609a0e709a0e2f2c920511a31792134c247b84a33162a3716191690463f355cee6519bcdc7595f85a5ca7dca59d2ec583f6bbc75ceeccd4e203d6f4093831eaddd9262fd89c540c9b3184966f49997f10cd89a55095c899e54f93faa0ed79ec2a59193da8a41fdcb7de629bb049872e61e5c1f55de09c9853ec39ccb0a279ec2f9a36a903c176bb32eb74dfcf3dac5c6225796268dabd0ef354bc769a9162570adf8a1057a536e2d26e06acbec3ee47fc1bb23e0a28237db68014e3f6cd20c90fab5d461f33be795722d403d8202dca77c03786b03b857abd66f1887adb3fa331d53aa385e9484127852125331629a8f181ef807b1d023fc5c60d57161cf7a64068e0a0cd5b7b57ab017e40d7b03093e37f146d3fc291a08aa2d5e529da582a55a297beb9284566af23e6f4092d0804c01840e37de626dbf2159db5761995df38c518e7baf53c80b0e4ad26a7f693e462c24029c54a900795312d94a836c501f30a692b2b86aa4701d24b8a6257195195ccedcec1cce0c0ea197d5cb616b91c2d640b03d2d896db5c13685a77421341879c0f4f62dc49794c3572e856f05c13713465c1b4d1b7736c821db21856c2f41362b1dd79c61636a941b3d0f6b26b8e624715528fba31921c0bb2205af9dc09b0fa37a8e23289854bd2d1bd1c4ba1de504d9ad3090a5f7d404239a18b27a82ec19e98896de53ab8b604f6d17c1753b3c5c75b215520cd72182eb59495c7cc7f668043bb60f126c6f95c4b6c6609bc596735ecd907b84dd28269a0d410501f85c180d417ad756700c2ad6b5ad21c8de1646649bc5d3ea653d4c0c5725c175273c5c0db2eda618ae6d04d7dbc3a890e93d33c146402c861d23c89e0fc3c3523d33415c625d8d0304d70b92b8e277437e34dbc62401f56258a004639618a8a304d43bc20225380f2b06aa91807aa72428b7979f7abc20cab3156b09b6778511e09d2e4432a23dae0d04d7bbc3c35517d11ed71682eb3d92b8ec43a02822db4990bd571259ea7e12442f5881702fdc4f2a26f8de27ed71a9379b8530c72fd604b41064ef0fa392ba73fcd19dda7980207b298c6620352c3a11c161d11182eb0392b8f81958c1a6609b14b67504db0725b1951a6cde677d05ab665c0a9a22d03eb418d0043d4d0c5a8c40fbf06240131c718a412b22d03e22092df7ca9f28ce6cac24f83e1a0e3ee8e886bc704a0c5f09c1f731e92a3b4b4e09a1ab2b36b83a43a07d5c129afd0e4014ab699c20fb4418c8d287f0827701c4bc6c3f41f6494964b6a9c8e80eaad6106c9f0abf724671d2bb8e20fbb424b2cc71a8202eb171e81e82eb33e1c732c1a1bb582c3b4c907d360c0f4badc888e2eced5682eb7392b8b22f9a8aeefda8d504e0e7c3f3b78688de8fda44707d4112170c37dcbf8e13c208406cd0de44807d318c2620bd9321d8048855c95304d997c2a892a94ec6b1087632aa09ae2f4be2e227bb059f01105b6e7c8260fb8a34b6f43f2113423cbb2485ad8d60fbaa243678506f5e67f429e78d25d1bb9d729aa0fa5a18712cb5d4258a5dd9cd04d7d7c3c325fc948918ae8d04d7372471d9c79682c3713164bb09b26f4a22cbbdd445b0828a2d752923f8be25dd62da3b1a515c21b48a60fb76385ec7ddb613acb462f84a09beef48c7b921e5bee42f843e9a58d7b69520fbae24b262e3714f297857bd68f52c9182b58cc0fa5e18ed68fa003d8a7366cb09b2ef4b22cb1ca047f179e01d04d70fc2c325bc865b0c572dc1f5c3f070093f9329862b4170fd288cf8953e0e109c31131b075411643f0e3fe40b22130bf9c709b29f841bf2052717c52ae53e82eba792b84a94774546346733d613603f0b3f8a4511d97675cfbc70340993593f87628f9962afce98ff75dee0b9c6580763db6e35829303ce3b3e0755ea6d9e09208cefc7f6f396e0ec32c1b6ecd27e410df094ca6460a512c4eb436d96e6b68f2fe1b22ca592805bc6f7b4fdbf84722f36e55e948079ec585d00be975ba35f29fe85b5e1dc817fe395eb65057fad681a8f04350bf16b682cd2e54de075135bde983e1d9cedbfa6b1ac28b175a13eed5fa397257dda91368ef83db23bf3b0ce5e0e5e9b53474da33fd08552237879f89b8eb9496c8f41b3c84b6bd55b6368eb044a9d526e8115e35f65284a4228fa8d24cf3cded8792fd7123e42242142bc9256899250897ebbe4dd817af7ef2479e6f9c8f57dece1bfcff4f03f2c7978a01efe47499e793f6b751ffbf89f327dfccf4b3e1ea88fff453a8ae7715ff73ef6f0bf667af8df963c3c500fffbb244f1f2b4cef632fff47a697ff73c9cb03f5f27f49f2f4fde70eee635f7f35d3d75f5bf2f5807c1d3e95d875a67f61ec923e7e18e5c1bff8ff0122e2aa9d0ab70000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset.meta b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset.meta new file mode 100644 index 0000000..95d99a8 --- /dev/null +++ b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e20a7d0f1c2581d45b0a37b0071199c9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset new file mode 100644 index 0000000..2c6a202 --- /dev/null +++ b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 75f3b7bb830f4324a8b2f49814f3493a + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15ac0e108853e2b013dbb163028615603b97130763e290c2d805883fae14c820885c4210497699ca1ba42aef9157c88324799ca4bb77168d7667b45aa11182582aed68e7e8e9fefa9a9d9142168397710f2edb6c832db3399661fbec9815e1db329447f0b6ef9cfa97ac04e5215cb3d0768fddf01989afbbc6185c57e1aecc2a30f22ddb83324fed9b2c07df57616c0eeeb0f6003e39e86574c3a00c7bca5eb0759632467d486cd3a032af33502e230ad727ec145a73c4144e6251530a2e9bd052a6b62360dae9f78afd44621d41db1e8c29b102d07c4d14a3bb703548262aba79d9c54b9c2f0c9f417e6ff232c63f86504679d9c3c70c09f740d75873d176c6f5f2fec3c23d9671a14f98977d425d5ca8c3b29ff71b11ee71dedb2eba09de6f54b8c77280d7275dfd9dfa948bef88708fed631c9ffbbc3ec4db1097906990f67f007d64d909b3b0d1f82c80993a23fd0d14498743b64ec15271da0a98c20910905849866cb0c216d982d44ac68db8c0f7325db3d0234f44c7bd53fce99902992bc03b27987819ea9f9187a091e7a1658ead4189a376d93c18ed2b17956d98b6006e92635b703d217abbc0b6b7a79f48e80eee311b40d3f6d623a871003d81fb0271b849d777c4698eb85f85ba0ac58e22448f2750bea7d9bcb297e0bb6cce2d0e999c47b9d3aaeaedd0e0a8e9294883dc5be46b1f3472111a41e8c3e3dc0dbb2d8aacbf7934f101433bc898940c6d1af3763aaaa95b6016e59e0d0f82c165f44a28b76f1bef8710d0ebc9224706d53d49125435fcf73f7ffc75fdf75f6f99b5a22d328bd2db351fd1ea018bf4a68ca487427d114cb33b8d8cbae13764f053badb6c23fc76bf3cf50bae803065a65a0518338c9d25cd4df633349480d539b6024c6489ed02673243221528cde5cf7ca348d3942801564021b86e3ca4311e9da6c37c89302549ba7ea2a91413922926da6ec5f847a27a8a899ec955550cbee408c61408faf1a042b04b8620ade80a5a11cc409dbd645aa1d63ce559ccb859a2fe02787ec3f3b1b360578d71907c4e0f006f899bfa98f79c495dc5dca2ca3479845ede9c053ebd22a65cd17152743bd8519946b7c434d268ad7d128bfd175e66cc2508da9182b829b3bbde8bc968cdf92d3e4ea51af6db44dd8414d46bc332f4e2ed8e7ba2e105c70f1f23675df8c9b11b54c43cbff955e84564868db6372451293de5bb0d3ba136eca88af8b0ca5e02108fa9888fb480788f84b8459b095b6d342a6c3b262a59e81bdcac701763c68d84dcae926457631ee1fc59505956af0c420c14c69b8ec9a6adcda4a986bd788cd09e0b98d05a95cce232cdd04ed7c18568469f46c61bd6c8046964ba8e467468a24f16c350139332c6ddf16b421dbffa658471b66bd290e0a69c54534ea8285f3f2fe50115e58fce4b7950461933dfc74cf22078c7e5044ba04e7cac3b05e5eec0fb90e10efc0e5b6339527c051e16b15e1c535dca78f88ca8f91c52f17943c6e7928bcfea9c369fc7e0a6369765786fd1236db10ea7eafada96da941044be61957c3765f22db8e4131dd0ad93675c278dca20d20a22c1884a825b320932ca7022ce2f6a6b955a7f81e159bec1704aadfe541aebd32a4d8eaa70f84486c303250eb23457eb6559be0dfd0eee31d914d8410be548aae4b82d93e35b9745d6ce2bea11a5c50da453b60ead87f0ddd94aafcf7beb244ba924bb2393ec51131ab24f229704fd04936d1bdaf29022834835a692ea5399548f1b8a904bc0c33edfcc9369287884f48bfe11781b062e9057a827dac94b4203efcacca25498668d9f00e2ec47a021447b0b00784da8fb9f07de65eaf340ef62b0d9a3213f29aa9ba707e4efce96aa4c3a7f99d4c760112e91430b90a6a5c15593740ab5ca4fee59c8a265c54c93d6e4cf059e5487bbe436147c7bdb26b0cea38e814ff93bdc31aabbebbeb3f86d87cc1201e7d4a40507e1685a762029f10517bed0d15dc4bf6f99ad357722e2f58a04c5a1f7c01ed622bd7db797d0c2add3389f16ad7c4a6129d5502b0f91690cb533fff32898c62888bf8b0a0f3a41238d416356a7674f93be76a0710f3e3b30b87a62d6c8c256b630d96169379fe739398dd54489b14640682652f452a4b0219fd309f92487dc769222c1dec853c3bc3e50277481da27806a7522a81a2d551ba87101d4b44e50fb38a838f1010f0f366d7c62d0069ca90b38260037af13b824076e8fa7a58aebd12453f3d8a2d10663baa0ec16a05cb84828dbe6ce83baa00c0b502eea7667557e2feb032eae0bb82e01b8fb3a81bb29492ec844051029c1fd8ffcc79c57cdc94302c00f74029c50269a22efa20dbc882ef00c01bc873ac11b9558a76a874ce31a32a10bc89800e4e79d02a44677d606645400f28b7600a9cad997dd222302905f760a9097d1224d01c8af740299f2716df71989463093bac0ec11c0fcba93c0d4e8e2dac0ec17c07cd449602e5c4230130298df7412988b9710cc0176654e34d278a281c7f9c20142fd8754fb206190cb5a84dae70c9fc3b2403b4b65f550c1a29f89e0d23bc8895b7d9afe3bfe8f45715c3af2fe81e1224f3164929ee744235e472b16fd54e52acbff1dabf90b45c44cd1795706346f1347532ed1dfc14bd4c7fc0f028bcd320a3f0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset.meta b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset.meta new file mode 100644 index 0000000..4162bc5 --- /dev/null +++ b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1e7b5da86dd8256419b9786129df559b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset new file mode 100644 index 0000000..10da3c5 --- /dev/null +++ b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 8175c20f542fbaf40811f752bfbf8759 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c15c7d6c0e702c109ee50a0a59052200950a01429105c4b0215da420809a424902641eb2d2d2d757777777d75777777f75797c7376776363977ef9c7befdeddb3db7ddf233f32593b33e77f66cee8ce36c815f25f6ca0fcb540cc1313c560315f2c15abc44af9d7441956ca1febc83e3f5754cb7099fc5d2caf0d14bd533c09fffac7bac8dfd3e4518da8954fae1625322c57d70b45a9fc7b9a7cb6541ec1d932f9bf54de156b241f9a2f0ac41c315b748e754c2162817aa8469f8b815eb1a6f2f704b15e5e2d5589824872d5a5cef257a1bc52a3ae55ca44dbf72d147b29b52ae5b512f94cb5a890329728894dbf6f2fd41fc20a3e95ff1bcbffdfebe3d774f8a53eff83e3fc57fafc8ffab8910e1bcaffcdf4df0dd039b8f7dffaf8231d66a17bb3f43d3fe9e3c63a6ce278f6751dbea1c3a6fafacfe818d2f29b3e6ea1c396484e16bade4a87d9f8fa962d5bfe72a4b5354a6b6b1db6d1cffce2b8b72dbaf7631db643e7daa273f0fcaf8ee7dba37bdbebf0337def6f8e7b3ba17b3be9b083bef777740c61471d7eaeafffe190d519c97a45875df4bd7fa27bf0f9bf1cbc3ed1613724ab9b0ebb3b74f9dbf14c4ff44c4f1d6ee548f37f1ccff446cff4d6611f1dbea99fd9e278661bf4cc363aecabc3b78878faa167fae9b0bf0edf26e2d90e3db39d0e07e8f01d473c5f08956f1bcd74c81884640cd2e1601de65a325429865fef6a196d1c32862119c374b8830e872319b25c342a703c3b023d3b42872375b863fcb359c2f16c1e7a364f87f93a1c42a4fde9ccd39e107fba69c7cf8c42cf8cd2e14ea2def7999e19839e19a3c3b13a7ccf6ce7ac6b1c32c62319e3753841c7a7fd63d6eb8e6726a26726eab0403f03be1797cbd7ad781b8fd6c793517a6c1953743855c4fbdc693a9c2ee27ca89285e398619069e7e759c2ec5fbfd0e15c9dee8628bdf6790867ebeb8dd0b1fcbb498e43ce170e39853a2c72e8a4edd0a4b73e5ea0c35de37554d7b3743c38ddbbe97077875cdb97ee8118ec21e2ebb6853adc3309934656955597ef20fc46871bb48e59e818c2fd74f8be0ed7e9fbecba74ad0ef74669db1bdd0be122fd4c13742cd3d2e2047dfca50ecb0c32d6a073dfa073102ed3729ba2e7edf3102ed1d79ba1630817ebf3cd5dc6bf5887c58e73a0cb7297b2ecb4941ace2dd5e96b818e212c11f1f9b044c76da7eb2b1d2e4f11b7cda71c9db3d35d93e6b3b5e85c8de35ab5837bb50e57e9f32dd131842bf4f9563ea4c59659653857a1e3c9f6319e7d0de72a753c769b6e058adfbe0ee14a1deea3efb7ebd8e58e78edebd0c6cbd2f6ce4279ce4ef37a746c970bf03376fbce2e3fefebf020115f7e0e1289be01aeb7d3c787e970a30e3fd0e111fabef6567ccac760df73940e8f44ac8ed4e126fd6c07742cf374b6ed0bed7a69337af6531d9e82ce9da2c313457c1e3b5187c78af83c669261df7b92e1dc71223eef247bfe64c3b9e31d79e25824d7be0ea1ed138f71e489cd3a3cda71dd6e7f6bffdecad9d6390da5c5f60f67a073a7e9f074740de476b26c5927cfee739c899e7d558767a17376bc67a37367a2fbec6b1087ddee3f4787e7eaf0431d9e2fe2f255f6c1fafc053abcd071ffc5f87e94ffec727e134ad34d3abc413fd3451f5fafc34bd0bd97a07b21bc54c4d767975aecdb9ca18fbfb58e5bb7b1d2dda6ca918eab44a2dfbdc910dfd5e8dc55e81c84578a781f7ba50e2f17e6ba2d93382fd7e1158e73a0dbd7846ed7a419cfb5e8dccd3abc0e9dbb06dd675f03bdbaeae35b106ba7ec1bd131f283d98febf3b73a9e35e5952790dc2774f89823af3caac3dbd0bdb7a17b21bcdd91576eb7f8b57f591f7f671db71d6da5b1fd358e74dc6de0f98421be7bd0b9bbd13908ef72e4957b75f82ff4cc5de81c8477ea67baa1e346287d0feaf0be34d3773f3a771f3a07e1030edbda7eeaa134653f2c127ddc0be8dc0b3a7c5187cfeaf8baa363089fd4e77b249165dffb9ce1dc53faf99e693cffbce1dcd3fa797b7ce24924d7be0ee1333a7c44c4d7110f211ef8ba3d36f492a8cf732adf237bda2c1f47c7a8ecb4b1fb192f3b6540d9c98aa93ed454d99a2d962daf5c354807a313e90e9bda4fa61e3005d18de117fcebafa2ad950d9f2a29c0306a395f8d89d68aa1628871d4b2ab6a27d8b14f54bf8be51de54a2844e688e2ce8428207115f2a7140db9d6c8f353d4882d0cba96cb2b8365a7b55c3db558e4cbceda4287940532da0ab15a1e15c9df554ade6299ecc43b53a904c3b3ce67e64999d6e871a53c6303ad92c7152a8585eaf71a95d25295fa69f25cad1acb5e299ba11364b84ec596a87bb5fcdb14679146664ea37910993a6f0d55db662a90da40ea73553fe87f1609c3226af8bd57cc2a868d72d508cae6044bfc8fa1e5646050659a9691af90c5e2ce0d11b96adc655e0241f73a266a68cedfa978ef95840c98bbb3d2a0dec2f02f2b5eada122570d13f548a15632a8202f47f546dc243f2bab511e24d2893e66409f674f1319356ae6d0088e08e10d4c7655edbe4358ed9a6e253b45cd49968a3912d03eda3bdaf1ae529e1152647bd979322c53a980f325da3cc9e34a9e6b9ad4f1a9679cabc61e26b9682af06b01496a90d75837707262bd8da9b3ff9a20652e9771ad5135cd6a19932986acac84b2a16268ae62f867e94f159e86a6fcaddab08501fa2debbe72759f7bcf0543aa831c79d06c9996ca32894dca54f153f41a995c0fd06ba51ab2f14952cdd2457aea7eb56e9a562a66c5893ea925ed93b24c3653630365ac369b2fcf598de849ea6ab9ca9983e3f4007af47d96bd66a96509ab550a925b363b6dcbb656968549538e5452f66f6cb23fb8c43606b798073e08ba6dcd551f2bc1e2cd698b3731c50352da99f2596b95cfe64b2b2f9527e17e2bcfd5ea1c5ee32ab73535e536358b5114a087806bab94946279af7b1f01c387db3bdb02e6acd44165a52e09caa54e02954d9a99cc07083b1a53e5344e07da38cd29c99dbc4a6e4165edce54d6ee9251d66e4965edaea6acdd4abbd0e592fa5a595dd6cabfac355073a0927391ad5b51fa75a3f4eb9e917ed9947e3d4cfa652bfd66a96a1e17e0992aef55b9d2b0b5296648694f9357750a6e4d0b6e63120cf9652baf99ae2d95e45e1e93dccee4c454d6ab6475625425334f35dd962a4945f2f73ad524a8d64d39ff2ad0de266e46afd747793de8c8f2a799f293ed29f36fedd1fc1d4ce6571e20d856ae55ff5688e4630d6653c202b45ee9f4cf9539fb0aaaa59b3c0d94693a9a4c0304b735276be704f3f4a5cdd389b27b3f8f76ef4c09eeef517017936035ac21bc8f397435e556558f9487e2ac664a4dd62b395031d588153e3b29985468e81c4350b5d7a024eec87baaba28c398cbcf00557e78e3a7ca5a3793fd55a5bb3c14fbcfd28d10e821837dfcb5fef669575103954d0626b189d7945216e96e2aeed088830c423452717fd34a17a46a9dab265c0f534e681b9e27c07a0c53fffdcd0b834d9ea05d2a4fe03d55bdd4f2bb4a91a7961f8bbae37cc7f110c7f150c7719e9e09a87f3edff17cbee3f97cc7f3431ccf0f713c3fc4f1fc10c7f3431dcf0f753c3fd4f1bc754c38c1dc944ed03b7aaac8f5341539708279267fe12c5303e932b5155596f34d65b94542598616d406539c49ca712f539ce0268608a251e7a2f5d49b2235d423a93e14a9612652d6a8d35c7968d78b05d2ccb57ae6160cef86d8d686b87355ff00008531c6696be1afc7835714123c9eeaae6c97a4d8659e1ac82cce5f44e91fae4a3f4f32a852bf0d95974778cccb7da9bc3cd29497b389bc9c49d9df962afb3bfa50f6fb51bc4679e4d59fe2b593895747c5ab7e380e93abf1e407724ce9003f30da5070f23a24666e9dc39d510ea7a3dc8e623ac623d30114d3b126a61dd2609a497edc9eca8fe37cc88f034dc2a10edd59781c1a1c445965bc47ab0ca6ac32c16415ab3d601a807663835c539c70086f6739870f62261b24193ec8a348157824954f919ac4476a08456ab2819431b726213594caad53bce6d661940da67ab4c10e940da6996c60f544270b6bed1cd8017b113776184ed961ba0f397604456b86475a23295a337969ed48d19ae543ae1d45d19aed91d64e14ad3974f9860ee03a47dde486d4688ad45c1f488da148ede291d4588ad43c13a9e68ad41e6a0aaf5266bd52d917299517dd701a678a11322c4c6078adb577360907fbc20cbf273f389eb2c07c8f16984059600195570ba5ef9d2376556daa22f9f72469ac425736984829b3ab47650a286576e353661265f3ddbdda7c3225790f83e4981bc9534c9261ce7e61dd05c79c3dbc39ed7ece7e2a658fbd4cf6f077b9cd344ac7bd291d1765a4e3744ac7c5261ddb8a649d914c5627cca07249b1d7fc379322b88422589211c15914c1a5fcb9643645afd42bbd3994e432af92e75292977995bc0b2579b957c9f328c9e55e251752b9741f2a97aec828971651b9b4823f97cea7e8557aa5b780a2b792a2b72a237abb52f4aa4cf4fcf792bb517aee4be9599d919ebb537ad698f4f46b21f31ea6582195b0298397e5190b296cab296c6b32c2b627856d2d7fe1da8b2a5cebbc16aebd4d92e110f6a2f0da275b44257b83d7642fa624efe755723125797faf92971824e7aab556412e4cc3af9db85f987680a9b01a67940e14e64569a9e2a7668b4a28bb1ce4d52e4b29c9077b955c6ab2b85a00b798d5e2f6eb4185b2b739435e83254ba5ea754e388f6baaf12a86fa578ae29f489e170e493b2f1caaf2425f217c4b19954bca4cc4d5cac025ff28e2f62e9ceea91f9636f58d8a7abf0ca8274b1d457e1955911cee4345b2dc6456b52e339cb5510bb40303930cabc3e5df4a8123d236f226916ad98ef7b452262fa74c7ea40f26dfc76472b55a76d93fc0e4fe9a1bf6d74a5818a256866e9fb6611917876c56798c2f2954fe5a61ca5f300e0e7b68791d07afa0841fe383f04a4af8b13e085f49093fce28fce0716e84af3215bbeeff8c6237d4e76277bca9d8f57053ecdca728bd127782ab12e73e155489ab32652db0fe890654793d4c1ec499d74ea0f3dabe546c2771c4566d8a0d1ae3b0db5fca01884369c13526c1d0e63c251dc11b69c1b526c17078aaf05ebfaea6849fe683f03594f0d37d10be96127e860fc2d751c2cff441f87a4af85906e16e17566ca0849fed43caf7a3849fe383f0fd29e1e7fa20fc004af8793e083f90127ebe0fc20fa2845fe083f08329e117fa20fc104af8453e083f94127eb10fc20f330987c1e44bea2e3806932f15990c266f34c503522e1381cc351c4e41bcdc0788471884e7aa773ca0e91ade3e4ad02e829de76ad4dfb02e07622e5271d7ef07e3658724d868b5a7819e22686ce9c1b6af39b1214204927aaaddb7c9941d600814769df534047a2455a0aea60a146c6869edde74ad62036b76a9b6ad692f25f76d613705f7284a9feb287d6043e2e6d7ba75109b4df1c0fa23d8c3d8cbfaa3a329cf73a3c9f358cbd9b0bf992bd1b99bbc3ac614238ce4c0b6c209cd7c18f6e82d127f25d2db4c4779ac294ae822c34ec55efbdfc751c26ff141f8f194f05b7d107e0225fc361f849f68120ebdb9db4d66f6da9b3b898aed0e8ed84ea662bb9323b6534cb1414f15f678f6d2533dd52418dc3c6c1aedc9cd9f66920ceeeaee74929cc45d9d6e120cee0af6c64e705710a3c95d958bfa7d64ddb8ae334cb1c3bcc3bde9a8b589167ca64170ae7a5b359c61b622c1b72fcd7d2656c6c6d0fd22d5b097b77452cd9fb34c66866cf1403a66ee439bf96caa583ce8b1589c63120ccd908704d10c795864d24f39972a7e8f988a9f9f3b5a9d678a190e61d37eaf3d94f34dc2a18702bbfe930d78670457d2115c40d9e771ca3e4f64649f0b29fb3cc96d9f8b28fb3ce5837d2ea6ecf3b44ff6b9844afd333ea4fe529370a866e13b019eaad9cb28c9cf79957c3925f979af92afa024bfe055f29526c9b0a00abe1391d2bb1e480bbeca241846f45f4a47709211fdab4d82e1f0651fb2dd3554aa5ff198ea6ba954bfea43aaaf330987c6ee6be9a43a4963f77a2ad5affb90ea1b28e16ff820fc464af89b06e16ea7096ea272c95b1e73c9cd9421dff668c85b2807f28ec181b87ac7e8564af2bb06c9ae5cd36d9409dff3217fdc4e25fb7dafc9be8392fc8157c97752923ff42af92e2adf7de431dffdcb2418aa978fd3119ca47ab99b2a829f782c82f750b9ee531f72ddbd14e7cf3c72be8fc2f1b9471cf75338bef001c703148e2f3de27890ca765f79cc760f9904c360c6d7e9084e3298f130c5f91b1f383f62120ea3c7f0f1379ed1e347297dbef3419fc728e1dffb20fc714af80f06e16e5b0e4f50e5f4478fe5f44993601896866f207b1d967e8a12fe930fc29fa684ffec83f06728e1bff820fc59aa58fdca56ac9ea3a2fc8d2dcae7a9287f678bf2055394e065ff48a79424f1b22f9a04c3e19fc2bbe378c9241c9a67f0594d4f6dec9729c97f1b24bb6af8bd62920c435cff3119175ec8eb62b6e6003a8e574d71c0a8d89674ac996464f835ca9ae0969dd69ce7d29aaf53cc63318fccdfa02437f02af94d93e4f6ca92d4e66f2d9a361edb7bf5750f8cedbd65cb41e37aaba5ce095126d9fced2d5394e0601bc5bc2fa47e9bd2278bd4e7ce9be68c555ad4ffe54a9f77287d1a1bf479e6e999aef47997b27c1383e55d7988f7a86437359ac1dd76f3ef53e5ac99a19c357259ce3ea08437370877dbdcfa9012dec207e11f9984c33c43cb98b7b7b13fa61c66ab74042771989f9804c3545a763a82934ca57d6a120c1db9d6e9084ed291fbcc241896f2b5317900d8f9fa7f5b533bf1e6d2783f37e105b7d1d6ec365c358fbf3009076fd7ce6b3df7a54932f4a2daa793dd92f4a2be320986164f8774042769787e6d120c03121dd3119c6440e21b936038ec64f070460b26f170df5216ececd582df5192bb7895fcbd49b2fa3e56cc309b3b56d88b46e3dfd09d2d60a389b56afdc30abd3474b058247f96a92b8bd47c6f89128497cac01d2679d45bc26e668b7fa034eb66d26c26a1199592f1f2af6a75ced2d37e316a91dab9a47e4d4afd3767ddea5a1f831bad7fa4b4ee6ed2ba4050eb5ee25fafcc4c5b7792dd68f96f4acb1e262de7d7d9d65ea28c17285b6906ee65a258af679a567767fdb2e7792adda5528b35eaeec15a7bebab55136554354aab4af48c930ffe10a8f3da02f96cb994e486c34f14879e260efd486be31d762cbdf0d7b8fc48e9cf544ab732a514f63ec331c67f1bd14a21ac1e59a42c09e9049dace5762064bc3ae74c77bc94e4d7925d75a3f72f94debd4c7a8f7261a11aed594b95ce4b54ea52ebecdd92bf521af536693423038d6ae5996a5d731409bcfa8ef62af4d7e3fcd0f9374ae73e269dc7bbd0d9ae1fd7eafd6896cad4af223fee43eb9ff8a51437fafd4ee9b7b549bfe119e807dad5aacdba97a9ab55f26f583d6a6f319fe829eb3f24e746933f284db6316932cde16770acd8cbcc52ab39c1c354890a95eee23a7f932ce5c9aef8a3ef9f94be7d4dfad29b76247e6e2cde7e6bea84d075be9b74ff45a57b5b53ba4767e0454a94cd2a34575babe42d16af7ee26f4aab7e26ad66935a393f3456dfd6a84df00774fb225d4fe187e6ffa134ef6fd27c52469a4f16b06d7a71ca7655ba652e133db7507ae650fec5bd9ef59f32c9c4bef4d399e80bc37c467db733e93b21237da7a5d156e62bb3314ac301260dc7b8d470126a9dcd90ffd7eb9a3eb1a5e677dfa001a5d7f654cfde8d5e05f2a82624cd1a529a0da4344baf2f315fd9aa5ade0be319cb92d4f15cbd8546946683a8310b2fbda439061f11461f298bd27a30e563ccde006b5c286f5ea2f25db11a6d30db117b92f43c4c66ad9dc69486b9260da7a7288bcb4599d675a21a35aa541abbd78c53e32694c679548f29b54de1d31635f2a7481230e540f7ba659e679b52fae59bf41b97967ee36509c56534acdcda8cd26d8849b7c9c2dbc8e914516aa8fd331f3775a369734ad3a1d4e88c2925f395c52ab4e5acf72121d5d3e45fd6e3e5865a116f20e05fbe6c416934cca4d15097b68bef1396eb9d40ac717dff746849e9b08349879119e960e53ae7abbae98d5a0f75a54d2b4a9be1266d7248df1f9f82784b987a82998d276453a91de15f6ad7fb96dad6546a47fa97da0dbea5b60d95da1d4da95d92566a87a598914977342ab311ac74d2e786505b8ad02877bdebe4b35785296b9c74a4fad1936947e9bb9349df9dd36a45cc53d78a559acdf33741b523da53da8d3669774c9d1f0f7a96ae4094d6d5124bc56495572a550c998d49d05ad46fa864de4ec98f3cd581a23ec6447d07b20c99363a8af78c76cf0a3429540ccb7c6c0574a4f4184bf585dd8f3ce1129dc9589bff1ea113a5f53893d60b3c6b5def1bbdeb4fcbca8444678ac4ce2612e5495b8153e2e69cecf6f904dd66a76bb222113f93e87eee313debf8c1ab0bc56b3c55eebdf4daead7f5942abd6054c29f5aa32ba5c704931ebb78d423755bc08d743fecd88dd27f223533e6bef73349ec2b1f072189751c4fbfb43ba55581bbd1e8e42dbb74c612fc6eb3f6a0349b94791f64185bffae2795dac9fea5d6bffedd56546aa7f897da4cfa774de44f4c7d297592ca5b30673057957538aa11b9bde4a5585e5dd9a4b7d8b4cf43fc95b2e441e92aaa9b5749bdbde65409a2710361fdeb1f0388a07c15f02813ce7dbdacb9c10a4dc3de9e6cb02a372b757d54228f67aab19ddab4b73935b5ce07a3f639d62efd0d4f9ddf698ac59a688d6c5992746f20fddfa6e934b06a0b6dd506b9f08e82daa32c93dc943a15d321b686e63c94f8352ddc2e34a5dd12305bf71e526e009532be545fef1aa40414690129c5cd47d581495c5795c9aca1f86a614d38349585be4956833cb0c30c4e58d627fcc026b8e69eae3d0bf44ea380ebc8ec7a5c33397125fb506414404193dd06358b13542b0d0ad6dfad45bb7ad7c8bf574602d5fb59f5a866f3a3721641e8e69449415140754b9b7a547338513556a8e0f162b5ba330a70e09f0d672ebf2b4ff635d628e09adaa01ed72efcb8acd15b682ad8232885aa8db5321dfdfe01b860bf4d1bd73c4e5c6d49870ecbc797e9ce4b1490ad6b5c8fac901f59aa2f5a4401d931289715f1b7ddcdcd8632f9130558052a7f35c972089f9c203cd31ea33bc274df163ce024b14e26cf7a57025afb8ebeeed6f2967f5ccae7e3be6a4e42a32027692b3d278d7a322745f33527653ecd49d35fe6a4510de5a4e948ec54d13ddf9c34ba7b3929daa3f50351e601a43c18885af0ff7c8c28afb73cb52b40f85e43b07ce76e9cbeb389b21b580e5ce022e9b11c31f44888217ed77ddb2b9ae26a16e7370f4c27f999f84ed88ed2ae68760f12567e04615d8960ed1124acbc08c25a82602de4efce2f520f5895d24ae57ba0404ee203770217b89310b83dc30257c007ee502e70a720707b85056e720473dcc908dcde61811bcf07ee5a2e704722708bc20237318239ee44046e7158e026f0811bc8056e3302571c16b81df9c035e302771802b7242c7023235854f745e04ac202b743049b23d508dcd2b0c00d8b608e5b85c09586056e4404c15521706561811bce076e2317b81a046e5958e0184744d8c0952170cbc302c7383ac2d61c5988c09587056e281fb84d5ce0962370fb84058e71a497ad39528ac0ade004d73209b8e815d4c6085b4510d89c5b70e4738e8c74e0c2762bc256c989cdfa38b35ae3aa27d5e60af84a71495db64f585119017cdf227c2b39f135d7b90ebf4091cf59a3667121bb1f215bc589ac9d425685a66af1d42f241cde135b174184df208455e1f83ac68e3e5b613d1561db97dfd72d4af26e1a631f82ad61f200c257cd890f566b58af6197eb351bf6eba1d6a285e88d067f82d0d584d3a6631c2769cd85ad3dc256cb89ada9c6b6529f58c439e7d0920bd758846b75b0b8180793d8700d46b8d684538b3276b4d86ad112846d2d27367b718d5515b02eae616ba9ed8760ad0bc7f14771f6b41bc2b63e1c6c8c13326c6320ad10b60dc156008c631f6c15c04e08d77e9cb8c017af12e645ca05ea8ab5d2771567e3763817c6b711c6fd3931b6d6b90ebaed16c2f80da2186b53b60ae22204ef8030e131f648d9e09d87e01d1826bc28364d0e47f00e0ab6b2601c3c62ab2c06205c0707816ba98ab8963777f5e1c27516c27548389d2bc6f5966c9dab3b11b64339b1c1d04a8de11dac0952286cc2082f06591fda891ec43710c4c3382166e9bcb781b790f6e5025589406d0c0a146343830dd4f108d4e14181626cceb2817a1a813a220850eb230aea29046a5350a0a258f48e43a08e0c0a54149d790502755410a0d645b4e83d89406d0e0a541473d40a04eae8a04045d1471d8b401d1304a8b51105750202756c50a0a258f4562250c705052a8acefc1904ea78fe61998ab8d1fbe8ade1f914e13a219c6119c685286c230a97236c277262cbd6d84c5f7c60f5646caf5e1f85d09d14ec3033232eb661e6ee08d7c94114d0c4996fc62d25d8160cf446d84ee1c446bf6d92cfb98909db9281dd10b853c302c798e3d8c02d40e04e0b0b1ce326266c8b3af740e04e0f0b1ce37215b61c370d813b232c708c936a6ce00a11b833c302c7b80c8f0ddc4c04eeacb0c0457113932908dcd9618163dcc484ad1d3711813b272c708ccb53d8c08d42e0ce0d0b1ce39a5936707908dc796181631c136103371e813b3f2c708cef9db0811b83c05d101638c6d90336708310b80bc302c738a8c4066e3b04eea2b0c0316e62c2066e0402777158e018a765d8c00d43e02ee104d742587bdc27ae648cde2cc31708daa5e18cfd32560b6c034a5908db65c1ce30300e5cb2cd309c8e705dce8fab441dc2773c378884ef8a446082f97384eb0a7e4f963863cad88d67f3643310b42bc380c63868c4066d3682765518d018bbef6cd08622685787012d8a1be1ec8ca05d130634c66e3b1bb44908dab561408be2c299c908da75614063ecaeb3416b8aa05d1f0634c65e001bb46608da0d61408be25e2ecd11b41bc380c63828c4066d2082765318d0187b9d6cd0e621683787018d7171161bb4f908da2d6140635c5fc4066d2f04edd630a045711be03908da6d6140635c1ec3066d2e82767b18d0a2b8c3c12e08da1d9cd0cc3b2647719b9b8711b23bb99155ca83758e3daaa287ec3584ecae60e70418c76bd9e60446225cff0a62e629b1c719c5c1c74d08dbdd41e4324b4015efb8065ba15c8f70dd134e2e8be2bcc02d08dbbd41d49885fa910ac13c25cc3669d71121bb2f889c963893ce98d3d866d23b236cf787838d7166800d5b5b84ed81601b1b8c3d00b6c6c6d108d7839cb8e0655afcf98fe86fb5fa2642f710273aeb0b16f048b12aa265ead64af539064b10e3775372b9f07d86f03dcc5d93c2c2972af9d86a157d9160fdd44c1f2e641f23648f7022b3f6485e19d7f3b4bf1405df868af6be0b37238c8f065b45304e1bb355113b205c8f85d35388e21c6831c2f638273658ae5ca9fc1bfea4d63c1d46af67fa2102f70427b8f622d54ef0d15d29f90e82f86438bd07c6a997015cd8ba226c4f85e3eba23837fa32c2f634b7af036ca5628dfc0fc99c2da23cd6bb2b02f74c58e0184747d8c0ed8ec03d1b1638c655466ce05a2270cf85058e71a5111bb86c04eef9b0c0457117ad8608dc0b618163ec41b0816b82c0bd1816b8287e4c701602f75258e0a2d8d52f42e05e0e0b1ce3e4331bb8a908dc2b61818be2977ca62370af86052e8adf97dd88c0bd1616b828ce789d8bc0bd1e16b8287ea1714f04ee8db0c045f125ef0b11b83739c1d91fe95d234f54f3f6160ee482f52082f55610b02ad540392b2cb69d3dce46b0de0e0a16f31734d8e615f647b0de0976da2f8a03457d10ae773971c18a9d627909d681ac957aad9202fe1b7690791d017c2f9c2918c65786d87c5a3f84ed7dfe628ad72431e6b28d5cb8be44b83e08a2559698cb8672ce596de602f73c02f76158e0189bb36ce09e43e03e0a0b1c63076a1317b88710b88fc302c7d8656703f70202f74958e0180789d88aeab308dca76181639c5e66ab55ef43e03e0b0b1ce3820636707723709f87058e71209c0ddc3508dc176181639c7a6103771502f76558e01827fbd89641df85c07d151638c6e965b61cf70402f77558e0181734b07d89e31c04ee9bb0c045719cf73404eedbb0c0312eda622baa372170df85058e71f497ada85e80c07d1fcee025637e63c3d60261fb21086c89ebc7a3b879cf1d08db8f9cd8da89c417db66cadf65524cb45f6abb1721fc37b7a74b7c9137ba6fcabc85c0fd144e918de20ebc97216c3f073b9b1ac5b5bc5b215cbf0481cb1250c53bf9cc3657ff38c2f52b27ae361ad702c960625c15305ec650cebbd481ad32b80ee1fb8d135f5b850f6ad499ca9fc182adb9f2e655aa0d074981d7c5a3e7ddbe43007fe70498b839c14475890d19dbc62b1f21647f84d363602caa6c3d860608db9f9cd89a216c4b45a95ac615c5aae13604ecafa0814571c7ca4b10b0bf830616c585827b2360ffe176fe89bba246b150be88906d0902d91ab56470b58a9e3597b12d6a380321835a800d19ec69803bec78979089f2318bcb5c756db2a8d68f452f0fbe8f80c63881da8ba14b959f8b662dfa1882d520485851ac416f40b01a06092b8ab5e73a04ab1127acc481a1286e64918f706571e2a2871fa3f8dd97a5085b634e6cf6c41e446c75d1578a05758d0f36706cef577d8dc03509a278d60f4446d1f5df887035e5c455bfdf73fd63d1dcefa31142d62c1c8f16c5cfb45e81b0350fc2a395a871dba5f216a0b04a44f563739722702dc20217c54f1b2e42e05a86052e8a5feabb1d816b1544a550a3bae9d5fcc3dcf773213b1321cb0ea252489c1d607cf3856de15f4f84ad3527367bec160f4532bed5c7d65ebb16016b133430c6b7f9d8805d8d80b50d1a18e3fbc96cc0ee41c0da050d8cf1b5473660072360ed8306c6e8f4d9801d8a8075081a18e3f25136608720601d8306c6f8b2191bb0d50858a7a08131be64c6066c1902d63968608c2f97b1012b47c0ba040d8c713d2d1bb0350858d7a081457164368680750b1a581427e60402d63d68608c734c6cc00e44c07a040d2c8a8b0a0e40c07a060d8c71f2970dd84108d8564103639c246103568b80f50a663ace7ac4fafc2aa3dbefcb85ac0342d63b9c9157c69cc6b69cbd13c2d6271c6c8c3d4b366cad11b6adb9b195a9695f6bdfc840dede649b517a1761db86135b0b61bfef542a6fab55370ee3f56c6cbb5bed83a0f50d031a63b7890dda2308dab6c12ecf8be2871dfa235cfdc259cc12c5a5058b11b6fe9cd8e0608342c6f8ce1c5bdbec3d842927080fb6421eac97b525dcc8bc1a9bad48162068db85012d8a8bf226206803c2f1638cb3e36c7eec25846d7b4e6cf01e3af5924e743fe5fb01c23730d8c646143f31d817e11a14c47050fd5b74acab7dd8eacf7108d8e0a0814571b5cf68042c376860515cedb30101cb0b1a581457fb0c47c0f2830616c5d53e4310b02141038be26a9f1d11b0a14103631c931dce056c6b046c58d0c018077dd89a15bd10b01d8206c6b8da872d87e52060c38306c6b8da872d876d8b808d081a18e3a04f1f2e60ed10b09141038be2086c1b046cc7a0813176be73b980f540c046050d2c8aab7dba20603b050d2c8aab7d7211b0d14103635c83c1564b6e8f808de11e7d8dff14e05c7933ac62b65f5465fc3420db0e535f217c6383c86fd6f2956ac1fc395db602ba16011b1734b028aec1be1e01db39686051ac331f45c0c673af5fac54b7978b596a7fd922013b3246afe5ff2a42362188259ff15da5282e8c3a06219bc8bdb143fceec53345001fd31dc005ee1504ae209c459f8cd3706cbb146c83b04de2c4d65ad8fbe3c146e390cc2245c112c05a875ec905ef7c046f7298f0183d1d1bbc2310bc2961c2636c8cb0c1bb58c16b92e5103e3941f844bdceda5afd6a7788068b290a45a9e258228f67ca109e5a2c0be242f9e38ef85ef2c7743ea6e04f928d972a7516e42d55b22be55548598dc883398ea99001daea0c9093a272ca219b48f69562f9375e550ecf80f46261af392f92bf0bc572f5f71c19cbf2bafbdacbfb6a0c572648590502be37542cd35421afe4c4b285e9833a1673d03727c5277772623088b8aa2e96f834274a6b9ff2ee7ac9c956d9e7a86c632fbeccc9709fe19cb4963e590c2a9595ccd7a90f2998aed876ce4ec80113549eab5532ab55e188299b436e831a7a962855b5b5157fb194542cf320948c5ca8046330c3627d4a048ae4525552acf253297fac23fb7c6a99501a924b9b06593e66f67915be95e3541a59ae079e877c6d7df903cea6d234b57eb44f6899c42ab93022f55fadff74b0bb36bbcaa69dd56a555c34e60858ad0a89827f59ff07d254a82d81f50100 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset.meta b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset.meta new file mode 100644 index 0000000..a9ecba1 --- /dev/null +++ b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: db4d2213cd87cc548a19d93400495759 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset new file mode 100644 index 0000000..dbf439c --- /dev/null +++ b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 853a35cf0f51df6498d68490a1f662e3 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed595b53d35010ded3362df50678c3bbbc89a33601479f1c67145199f1365078711c2810983a2d302d32f8e8abffc8ffe60c7ebb3981f4e4a4a1952822cd34694e72f6f2edb77b3669ce257cd47dece6698626a94273b4421bb48e5f933836b10567e1f8076ae1b8867d0dd7eed368ca4cfedc5157b09fc6599bb630f30b2de35897ebb3e4e3f734e6fa38e3d1557c7ddca50a9834472fe83dbda311752945c4bc4c6aeb31c57ea901ec9fd3575cf5c52856e2caa511ec6671a52dd79a303abcef237d12b79ab8b68c392d6a40e692481cd8e1b9e2931c0afba75436c6f291b1bc3ee6f02de2eb44ce95fe16f53794171d2ff19cdddddd9f8e12545ec3ce1a6d922b02eef610be70667ae0c4d69c36e68ea8dd02449b1060416f4e62b3450f69c28ade55752662f7a4ec6bb8a32e425999a1e2474c051bd7c0e64742dfc6f82b610e07bf8e2b157a8323cf5aa47104f3a321651e6a1ba08f4f55ec3745de22cc8edf99e612d3c49c330399018b9b180901ddc479432c9c95fdb658ea8bf5d318db929c5a47563dc77147b4c57d6fe1b74d67554366b7d14ee6a4f12065c230bd80376cbd2bfc3d89c8df8808435f1cd0695870a5ba7c8f45e204c3a0c838b2480432c68332da313641aed4de6f31047bf731ee61c8ef8316e357b286fa58e096e8b3cea250ef8664105b1466e30c8eab62058f2f6b6cbaeb0a91b2e35ed8c3679f3faeac41533d2c29d97bc116e65c5e04d58d94c075a30d7b36a62ad255aceb95674ac25717332b56575852d2fd21906fa5b7f82254711ca793730fc92be9357ceca801eb143c26819938ca96385c845435d3c4313bb20d5960d8bff5ae85c04e6f36f89e416fb207a72cc1b962690ad34c4882306781d0638b4e59ad2a1b56b1410992f336c97c7ada92ce1e939e5baf53d277c6f49492f51492f49c4dd273ae2f3d8e8d6cd239cffe41b205f7d5e5bedea936283d722724ea5162a5b165768516b0ad113fcb2c486fcc6e6ee39c9d6a20b7f97a547d2739edc41e1262c7fbf5347793685db4918283356c43e0a9a1b7d3e2c0e30d846f4170aa41fb573cebf9b0a9b6d75076f73a0513938643c9342c257976dee6d9933e621b3ca73e8b44b637dfe671ad8e3a6ef7aa844d29ae015392228ce50799c1676d72b9f028af87f5877537e1055b5485454b6259faaa72a1cb93e3eaa13d44a47911b4b93c7f55b2296c4c6dde1dbc918a3f3095b447a12c202d85f8b8797a91a31abe9cc8b9bca6a87b7db229dd0a7edb53ccdb39d47b350b04bcd399a9b8885589df62ad493852e59bfda029ff8108087bcf437859c2a47a06605664756963e30fa7b821fce5a1b1acbfe5309e0f83528176a4476d89bc15333fa481386a965f8ef27b2cc691fdf26a2f8b1e97d791ffbcf2798c0f77d145272c141e178aab5966f39048e3e621689e6c0bb0a1f3779e22cb1db95e3c8843fde47b41f23d80ef5a96f0b102ee34eafadd7a4d3f3d2e806dff1e6cf9086cd7b384edb486cd6cd9bcec402b67055a2e02da8dbfc3b50c61cb8c6b1481ed6696b095356cdb7bcf1fff26cfd4f1e9613cee616e75b60c075988823662587bccec7f2bf7d6a0a126c7fd96c2e5f729ea31f5d663779799bededf8e3a6544aa71a47a189ba7bfd3cf9ce91215972971acfd1fa5e0bf665dd64ace88ac7173887c209c89dc92bfd05b728ff30b1f38f2c93e200000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset.meta b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset.meta new file mode 100644 index 0000000..2053ce6 --- /dev/null +++ b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0afc3bbfa8a4ddc4980e693edbfbcc82 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset new file mode 100644 index 0000000..0b56503 --- /dev/null +++ b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 8732b730b248f4344a2839981e1ff9f0 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9ceb53134910c06703210984f026e00b7c82a79228eadd799e1e0f514e544e1e5f2c0ba32c5eae8250095a5c5dddf7abfb8fee7fbb2aafbb77d6743633d9ddb0138c6728b2bbf3e8e9fecd74cfcece422c27e0635d85af4df15c2c8819b121b6c59e7807670b70dc851fe7ca4d5f156538be85ef02e45d15933e35f133658dc1f7325c55c401d47c2fdec0b148f96bc286f365a86bc315a6eec0af0da5ac4ea8b42116c533f15464ad111f119b54a922d32cb4cb4ac2f7bcf81d726d520a1bc9515616bed620a74279bba0b45bee85784966ed42de1ba853162590f99a24264b314127c2390c8a4f9722c5cef1989547fced82df71760d96c516e5f9a83cf630193df29892754f786477b3b2299686c798ac73925de3b143a69f62d7a087f597bc1e63ba7a6d49b0b42e96266da1b4d30dec51e9edea9554a4c5a5cc33ac0d9e3ee19cc75c5b5cdd338a36fb585a86a5e131edd1ddad33c0eaf4b3343cf6ca3a934c064f9ff0c81a66d7987f56da81e9f18f1f3ffe2b6ac7cba82c77cecd8f5be4098f606c16c4bec811a4cb22b8cbba35fd9d95c64e4c2a3b45cd1e805bec830085c76c903f1e88597143e931e3569ae9bd40df05285124a1d898a7897fea9a40e54af0633377af40fa438a16e8f045c899112b70c45aafc47570e0171e299bd06c0942862dd6e17b9fe4bd02b5eb4bfa9984a1c15be739c87422d72ea4b840f7e1ba441aaed1f707d2d426ed9721ed80e2e83b88a4f3703ca4d6ea6d2fc3b9aacd75894cada33a80e9d29d30e976d3225883dae7303e7ced9163e9110ad5e7a51b76e628fafd5dd7135f193a410683e9b29471dd09bb356937440e2fade77504c3db586fa17a7cfbf17ed9800c7677962ca8f6307ee2b566cd8a1c4dc5a77ccc6a0415e54d5ba375121aab1f8f77e651492f7a4b859e6e13d65b881ef3f6484a01ca86c78f50af78f1d7b1cf63b104e11bab33ce5f051dc2980a2186676bad85089f8186bfc9081f1e20aa7bcd0350cd2f45fcea6f2cfcdad7d1eb50d0cb6327752bfb34e5d1094b6a2477aafa85ee10b78cf6cb06a439b74b0f28b74873ac13d1315eda50d661d4a864e3feea09dc5f69ea2f9c98a2d14bd78f7115edee567b8153ae48e5c27b416f60aa198d17f8b5afa3d7a5a2472bcac2673056dde575f3e3b52f30d97e227b31f0780da29b8e7a42157bf07240379d7bc34f5c1f7e92aa2ea585e72ba35deaae16d76059f018f20a50dea65b4f4c5f058905681be5cd510bd515666d8dc61d3a18b84387a8432f08119966baee4ca988a34f5baf3f2be2ee900d4f7d3830f511a27ea909ea8db4d391efd639d268048ed4a3128edd9a55d1f00a1ed10b4eab04e3201a0b2238ad17dcab128c8cc68308cee80567548291cf892082fbf582fb741d7832820eecd7e1c065d09447b885197c544e8a3f445efc198ad380aa450cc8a783704ae9050fea389d8980d3904ef84404c28775c22715c2ad90c24774c2cf46a0f9a8ceffcf1dd1ffb33aadcf2bb44e86d47a4ce7aa178ee8aae33a6fbaa8f2a639513bf3559f12cc882df8d98398bf2556688eabc04dd5afb4fcc51c752d7d7a6d4eed723a8cef9ed0d9774965df4b219433956e7673acc6079f0735b9154a0f23690ececa94d67ccd305c4eeab84ca9b82c85e452d589136a340ec2d91cc6d2533a4ba75596ded158ba417777255a1414e53d1c6abd0c674ef5a2d8aeb3903fc6886e4c9fd659745965d15da15bfce062c65df834d363fe52c358754667d5372aab6e37e5a96fa555dbb435b12f4b3da58d6cbbce5abefc0e63c984ce922b3a4bfc493afa57a4fe0732b591c6debc4d186d3846c35832a9b3e4aaca927b9ed9816be3e8bf442b8f5da8e2a77b502f6ab68fceea2cbba6b2ec7ea0796f0ee86ecb08b117c9bc57cd0963db399d6d332adb568e18dbb157b057a38bee7e335a027e2c0bef7e1e501b6528b94aa31baf2a22470b9bbca8ae56fdf6c751ef5d1865188fd7a1e5d71497fd77cbf1e519dd6ef98e886ae3d4cf0a8734d6dfa1dd7577334e659dbf4dfa4de284b4c89505a469a5f7a5599ae7bd1acbd182f34a93a3c95f0bdcb0ecea508fa1f08f841d01ee8c66e1e2734b3a864d4e851de2db8adff6cb3512e0ee2b46f09a080e2d277c96e5e2013f89782c8ff46f9844d44588b07a018ab4079c9518c249c43dc2972273c4e6f641ea43461f05e943506f8fe0da60842784d0d395cf4df3591e02a6356e345d3776aa33937a46c9e3cc74f37f3e69e47150dc4208e36e8c252fbf6dd2cbd3d4534e1f3afdf58e8cde02aff3b47594d7295235bedf1fc49066fcbf8b05c76f4d62eb96d89c86df4321bc05cf9b43963085ac8321fbee7846da4d73d8d2a6b0a519b6ef4d62eb91d8dc45b9fb18cde0581b3105ad8741bb733c63ed7a1b8eb54e86ed0793d8b0e9da71d67e636c94c1ba6b7a0ac02736879e27dcc690c54d21cb32643f9a4496946ee908d8371bc58ce11a66b8ee1d4f149b35876dc814b624c376df34361ec5966863a204aa18744e63b7b4630cdb4fc733dadaf15623c5b0cd99c49662d8f08fe80edb34aa09066cde24b084046613b0f68435c4602d9884d52b61bda1a709b59b28edb8dab418b84593e0dc05fa5ecd1e9941642953c8620cd983564432be416570b964cc39130cd852ab81b56334eb66c01eb61a98c15b5963c04618b047ad0666f0b9ac31607d0cd8b24960ee0a13b71dde8233b667c81f60b87e36894b7fcf7fab0d974a1986ed712bdcf2c3a7b7458cce941953c07a19b095560333e898c680c519b027ad0056dd426dcf5b8b4106eca94960eefdfe8ee06fd2b5e318eb175fcc3b0c799cc89e899a5706748fcda71b3eb7735e2018900c70927a226cf28d6deaea027b9920477f3e527d1136d88b498d65faeff4afa299967a749722ebbb28de5e50597a943719d20d7a25477f6df325dbff8b70fe29117d70986669cb76037ade116e830794e9d16099cac4ff03d9572e3e5b4c0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset.meta b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset.meta new file mode 100644 index 0000000..d52f219 --- /dev/null +++ b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c627435dfba1fbe49b13b0294c848feb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset new file mode 100644 index 0000000..a5c43d2 --- /dev/null +++ b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 953e2e6278cc9314f9f2913d9bc25309 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15080921409ce28aed248e21c1b002e2dc892d202624c4a6b8feb82810687148094324e122af9037ca1be471f2333f52e574f7cea2d1eeccae56d2088b582a7677ae9eeeaf8fe9d9111193c1c77808973db6c556d83cdb657976ce5ec1d30adccfe06b979cfa4d5684fb4bb8e6a0ed21bb1730123fd3c6185cd7a15462651879c98ee17e4aeddbcc82e775186b41096b4fe0cf825e46270cda65abec397bc6d2c64800893d1a54e27506ca65c4e1bacc7e87568b98c2494c6a4ac3651b5a4ad476064c3bfd5eb07d12eb0cda8e614c911580e611518cff03578364a2db00bfa7e0af0bfe868432defb78fd302ff7b2ebe1ac5b7876fa1afc0fc78c086540c2f8db453b29d070ea127ceca88b768fd03721d4e1bd838f49f372b432e7f5980ea10eef113e664c28238f7ff9f028e3c5a1db25a91be4f5e375d28cfbd09cb0e5bce6d7a1d32f94b1df24c76315ef6fdebcf9376a9055fe0076926317cc44c18d8f59edeee38c0c761cc238c29999a669cb60a217404062bdbbe41b65b6c416a5d63b6e2405be57e89a831ea7441427734df1a7670a64ae005f4b70bd12d4af91e7a2f39d42cb3cdb803b8e3a640be04c2f5c54f660da02b8afc576e07a41f40e816d6fcf2091d04ddd63b680a61d45cea0c601f402ca05e2709baeaf89538bb85f87ba32c5b45710d596e17e45b379652fc2b36cce1d0e999c47793051d5db21cb51d32a4883dc9b64bfef3472131aa1f038c5ddb0d3a408f8874713ef30b4830c06cb754e63c10eab55758bcca4f565cb83607819bd12caed3b08ef7d1f6450dd6992a0a261fc44abc55a62262e17c65480587ea022bd1963d443c19ffd68b433834cbaa13764d0c7b072a785d063db3951c941dff0f023a8b36ef83dd867b05b8ce01bf30817cc820ac28804c24c8c67165eaeba5d5c614f05e50e997290aab1dd42e53c07d97fe56b4778d5606a35e70241ae990469c69bb204cdafd24ba74c2f719e057a5872ab25a1564b544538d920e12e99be29373dd4aa6f27c1dc864ce22768cb417f8b562bacdf048a39981be96569864a525a3dc2df127a6bb6843eb284fb42badc28672a1b89c9104fb4dac3b6610cf62904aca3725c713372b796b587b04d29bc2c88071582719933a0cd0ed4e20c7d6a67e8961146d50caae475134fa98927647aa79deed15be569ce4b86f0de3654b3b70d93453ca8c3dbfcb853d94b8f4cad581c51a5506eb546d56a4dca88e38ca3b518e3b09a70af8aeb7413b8ee53111f6b02f17e15f17109712324f1940aef8906f11e50713d29e13a1e92eb415564996a426419924516b2cbd6ae2865dad563bff02bca7b0c5ff3b84c63e33a40543bba2a3864e1a94875f3ec00be98be21797c16a7adec5bb0a5be19e481ed0e532d75fee0a842d7b0cc6e50b57765783d6a10af970cdf561fb00d6611a765f68b0f761e13bda336d111951cf76472645df855e6b4f93c07ee6d2e4bf0dd012e7103e5a765b5f6c596ea0d5918f94655f2bd2f936f3fa49e6ca9d7483b626ba901fb6dc0f243e09256e1f2810c97a70ddaef1ab7df66797b1849c754927ea89254e451dc708a36be4e2f4b7f8341398a1465ae39d558bf9666d9fab84ad2fbcdd0e93ce7d43e373be70bd12a7f4d8cbc62f9293c79e3bab8a170b7d9b4f2a1249d5049fa914cd21f1b90340b4b6e8ee4c3d64be0135f99db526ec115cb97dcdf754a3ca992f8814ce2c735c5e92cf09027dbb58f011a8fd3416b500cbe868149e1f7d4b3086337090d2c959849b9758655b61f41676338fb1978137acc0e007074bd69f5a730cdd42765279e2ca1de439320296cbc70fc099dac392fe265d205cba43e208a71891c5a80346d346e9ba433a855e7303662d27e67b64e6b0ae602cf70bb3ae436143ed3b4093ca39f4800017ce571c01dc3a2c5141512384bd00bd23922e09c2934e188184dcb0e24459ef6e1071ddd45dcbdb236eb28b2d6ed8dd72bfa290e5d017b588bf4f26e2fa14deddbc6f927a295cf282ca5126ae5213283a176f67f1e05331805f1974c5d434ed0c8a055cce9f4ec24e9cbd698983a1d808fb9e66ae46cb0bbcad3fb6a11a41e6fa773b4a80ddbbc4ed87a386c17ae7d56461f68c3ba404b0aa09937636b0b6d085b42802dd30a5babde8b69b5b5982ed02202680b3a418b73d06c02177ae18aea82ab5f806b51275c090e57f5bb008d6e99d00559a700d9522ba259def5d241aba5a574c1d62dc0f6a94ed8621cb6d7fcdd8c46b0b4d9585400eb512bc03ad10f9636cb8a09607dd60a87f4a6174b6d98cac605d83ed7091ba6176750b8f2bc3e6d3f5b1b1440fbe2666cad1d77002901b62f75c2d62dc086ffca72d5a679191300fbaa150b804580b527587d02585feb04ab9783754caf5eaa0f13da71b36408c07da3133879f6df8e99598700d9b7ad8864e2f193c6ed9236e7ec1100fbaed580b563341b10007bdc0ac0ecf4a2a8db25b501d6cb6ecd094c0613a527aceac0439d3edb871e035c4eacfb9959d49ee7a7f8950310937e5788dba330a783fe34834f27b2a2282efd149aa69f669cb8c8246de4f425e9a315937e86799be55f66f67f07d307cd344d66bc0b9ab7895b900a1429432f529fe87f8750fcb8683f0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset.meta b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset.meta new file mode 100644 index 0000000..350646e --- /dev/null +++ b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7fdd48ef1a96a54da39809853e1b970 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset new file mode 100644 index 0000000..854c742 --- /dev/null +++ b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 96ee11c7074d21e4f84d189ad35d45fc + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b6f1b45149e75b2bee4429ad02629bdd042a12e6dbd4e6ff08090d22694407a516e12aa506b522775712e386e6979434242e29907fe0aff821f0312e205cef976361eefceec7a1d4f4843bdf25ee672e69cef5c66e6ac9df1047d9c4b745a110be296288965f1586c894dbabb45d70d3afca7a0fcbe68d0759dce15aabb24ce24f4e4cf796792ce73f4b4239ad4f39958a56b0df58ba24af773d4b74a4f5cba46df2ab572faa9d3b29811f7c45d31e11c4b20b1824e3bb2cc61b99c3c9d6f8a97545b05533c8887aa093a2d52cd0eea3688e9a0dd03f115c4daa0ba55ead31075a2f93528e6e7e9ec40265c5c79ed9357e6384bdf41f99ca16f81fbc97bb54f565ef3f27e4879663a75d9f647c318c329c62884c628483abfcbb67fc9f201d9ee0de539a0c3df118507959723093ce6e4f3a88e67d781a63f23ec2b625b7810e2420a930c7a261b2393ce667cfd9155f2b04d52fb3611d058c432ecad29ae8a2b5a8b38ee0c297cdfc2b9422d6a203a161de2b7c810cc5c9d8eaa62ce3b547e1bdec0065da39a9298a72bf77a24a6c8401f84a8acd0b0757289aa58a2f336e83d22b6a32d934462d30ff759209abe676e504900e8363dd7c1e122cecfc16915dccf51591371629322c54dbabec06851d91b74af1b734942a6e751efa0a6723f0c046a9a2169987b0fb6fa5a23ff854618faec9874c37e0fd1e4e788265e63e8071917139f4f63ca9f7adacaae080ff17e2182607a19a312eaeddbc7fb86b8162b8b1e1956f70948d0d270e3973f5efc7de3cf9fdc76d1ae0a0f53d8c904d1e280657a45673c42215e04d7ed2f33a361f81d1dfc3cbd398bfb08bfdfae8676e91590c5ccd4ae00875782c1a4b9289e504583582d895962a202b6eb92c9658854c734579365b7e9798b0666724b581faea3fd3d2a7b2a636944b7e5ac5c1a1435936f9288260565740acaefb7829223529c82f2bb72b514c41f3d82050382493c9810ecd321c883384fad22b84c65fed26916b535ccb76c5b1550576d89e531b50f50bc8305ff3370128f372f732f87f0d6633d08ac4bf0157bdc9a34d3afd30cd6e84bfb68db5cb7052a156a9bdeba79d17c316cdd7ab88701f76444b864164c10ba1a08cb79b9e509fbdc3ff4710b21c6d8130cc4b33afd602ff88355fd74ba51d2d96630ee16ec91390a56ca0b745d03175cbe2aa7d7f8b1e2353fb28b4f0b630f7bd2d914db3dfb52f0767680f5e6eacd72146679b07836197c4e67f02cdb9846196556c69bbc29879c4721e719ad9cc1dd4deac6ab85e7d82b3d239e75bcba6ec48f46cd7e94d7f1cc71ee98367484290f9b29174c94c7f74a7940e7fbc87f3cda17df5fa49ded175457a1f655ec9eb8fc3e51acd0d84c6f1a23b4b4d3de23de73273a9e21276133e7149bd92b6726cb1ed4e992cdfdb86e7d7bdd3867eb7cb3241ed2b12e38b1f810491dd6d6737a66ddd4c93bb95ec5aa7d4a8a584ece6c39432639ded2c931b38b6c3b4a77c1eb77d0d73772ddec4b3147f5f7a8c6cf5e7049e738f44eca6193942774527edc85b6fc34f0b4a2ab78eec3b52b5457a3789546aa374c529dd449f5496add0516384f75ab20a4fa0db7d0d13379581ac9464c929dd249f6656ac97c6db5db651a59f662c5dd68fa88098fd3264d9b2dcf47608be4f0a5e0bdf64b60b54ef741d6319df576ef99a326c9ded64936bfabe9606e575721fe8e93b5b486a8c9b3d7dc6ecb597825b7588066aad24f1b12112efd16c3b054fe2c58c3d035f17d0c32f1faccd1e1383c5bcc626cc6fa3e7af0d38ef0e0c4e514ab391e7b83ec6b0bd98e0addd53b5aa3f14acaf4fa612db24ae836139d24854e4725454baa749daff8a359f79c9428a0454823a81c3649cfb256fba456331e02c5c52ead29998b77d4d1125f612565d17c027765cc747879fc503a4615af78592189a384731de1512e834090a4edc17b3736ad6982e73116a73b74fc4a2539375366f4dfb50951161071778edaaf06384201e79c4d70c6000e9be90c863605f05701b46b002de786887fdab3e8d55d4a3f1a674730b3bd4026a1017a8fc3711753fc41e3fc3dd5128b11c72a766c4d4543dc6a4dfcfa09bbcc13fffbfff339b9cce6739e41180ca630c489a2cd387106fa0a34b6498dd22efecb619ef6f28ab0d0164d263b11b89b8832a084e10b36e11d96f0f2c06b0037a0cdab646bc0b9b68053e7af0f6c02372e815b958edd0c6d3454e6adda60c11694ae02e5459b500e819afe4db035d8066dc1d6a7c076c9266c67359191996822b5be293e973f5f3a6c76995100be6c13e011636cdc944dac8197b3059ea38057b209de69095e533cc102275d12cea25d5a73fcac02ad6713da098de3c765ff2c82396c0bccbc0266f9208139f50a825950c09cb209260fc4ce3e8b08e96f9d2cae22ad01d6af0076c52660a72251b23d616e7e756ed5ad8fda0236270e4da6a4cc9992ab6c1cf25f1ea218bb92f5530ca35252feadc61d2cd62a44b9826b2bdde0e117173744bacc703ccde45cc03555989086ea3dd3502ff21b3a49f792eb188ad18ac73f7239d4f25f57f59ef1d8f99da91ed85e32476ce19dffc9c6c66474f0f4eaff6b6e1b2d99cdbdd835a791dae9f9bfc2f68e1d4c9bee9dec1fb6dbf478b7369d9ea38f6cdab44fcd5f2b8468dfee403abd1ec232b75a6dc31e5ae973dfc39f08fefd713212a7902433539ba6a775c85a03d50d117c726e704c2029bf4c7dfda8c2736a037fce6ca0a5fb2fb53a883d983a0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset.meta b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset.meta new file mode 100644 index 0000000..94577be --- /dev/null +++ b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf0830881c253f849ad09ae1ce0df583 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset new file mode 100644 index 0000000..cd68e9e --- /dev/null +++ b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 980a7697571ae1540827c8b930f79790 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5a5b53db46143e32c87708699b92f4169ab4c529010998e96ba7104a9949930cb679c9741c8345e2d606c6364cfad6bef617b56ffd619da1e71cadecb5b4922ce275631a7b2c597b3997ef5cf6ecda290bf0653cc4cb01ecc336ac41151a700a27f86d1bef6d7cbb4f5efb33e8e0fd255eebd8f710966266d26bd9b88dd73d7cea420f679ec311de9bdc5f0607bfefe15c079fa8f5183f0e8e32667152151ec15378028bc6ad1812073ca92bda0cd2cbc8e2750b7ec55e8785222616772de2a58c3d5dee6ba3d0deb8e7f013abd5c6be239cd38116d23c648ad9bf692eebc4b719fca4f153909ee99e177743f417a567fae40664b87f4e7a26adff14cf197137a53959896e4eeaf7dae8332fc9e1c9670abae6e5e5e53fa6c1e8fe80fad6e10cac144d7890c00dbc99f10e40a4d329a1dc32b3ed21d467484061852adbb8079bb0a1b4c21da328c9bdcdd73a8e68325162e663f157800509d7c2b723b95017db77d903c9899ad8b3068ff14eb35ec03a3ac5731f950364db423774a082d733a6f702c50e8e8c5389dccd3f671f69bad1d0c6160fd0337c6eb18465be5eb0a40e4bbf876d3d8ecd138cce2dbcbf666e41dd3bf85dc5b3222053cba80e8ab07637f43c333d426d487a8be3e39d45fe0b8b70aabae1e5188b62c4f82360897718ba49c6e4c5c6a5b1eea6fba1b60db038e756020826d731a8a1dabfa9ef94a9d4716c943e6a74c8e42bacc5c0ca600eebb50916ad17c627317a45a14af44abce22795df34676d92d28fbfa1c29fd7c6f204f12fe31c1ad38af12635fa04eb5d3ffaa030809d160b7f49b13cc6c91086604a81a09d11d58452ac9c4f2c1a1c427c268c786e0cc467c388e7c740dc5439161758bf6b75ac51abac5d2eb21dac800fe167b13c7a7c4f79692489bc65761fefc72c05b51f091789e615edb4853e3e038c2d2e3a7712d48afab5a09a30657b9574c958524ae77ddb429aaf90d705971ae7c849c5c134d5a139cf1cde2efdc3c23eadf2effce413678f4b381a973c7152cdb2eaf341b5651642936634ff30f432aad443d9e1a6222c6c0a8bf7282f910b9a812c341f9e85b22a3e64a5f781b633c37c0ce2e3a01d5caf79227c2bc06f219c5f2e2ca57ea04ca9bf7d9b24a5e6c388df1a43be2e8421f5a10aa912d0f9c189d81beeb0fd9b1c6f95be97d7f0fd12e8fca0d6f77d6a933d485e7493e05c0c93765125edf73ebf95b9ba729e62349264e7e8b33d3e80196c97a2648eea198fa673619ade5669ba3ba2a6bb1cff751ed5419bbde2c2713c9a0e17a349749d0fd3f58e4ad76a7f9df032b79cb7dd2d146977ccd6a4bcbad71fb9d38ff27d5e351cd4e78247af097da8b78114cf592fa23b9813c4699005fd7d0738b78994d43864f06d18147b3b4cb983339ff10c7aea82c5616927581189771bbd982c5041cd0ffb056d34858f20fc2ce93890f7af7aac10a785ca6a6b92dd64ed46afc082472819a191470b91e69472dd34fd98acea1d7fa62c4e262b57f4a67829686b9b9e51fb50f2dac125e0adc26cb21a9f9c3444e28ae52057852a0eab4cc0db708fe1009564fc0ee56b707aede29b5e14e43ee2fe15695c0775a3d683c188b8c139e835d7cd1da6d7f04708a7e7b74df24f650f2f29bc649062d5a9d1a6aecffee7d9cfa6ec7797402878c9c2a664b1a433a2f36cab9aaf98d8f4f3799303b3dc5084674651e22a513ecb51ee42f6b94ec8d43b146d802de8022c2b01764f276005e163c345690d6c7da099ba400309b4fb930fccf5290ccc9404d91793876c630a219b9120fb5227647302b2603ed31a9eda725a5a02ee2bddc0b5f0810878c72d1dfe7604bf4ca1c7e525e096750257141ed704f7bf2e75710aacd5dfe674c1664ab09574c296666a75ec768ff3a60faa8c04d5039d50515dd3e0df3deafd9dc1f405644e82ebebc9af9a1a83511b64fc97b2ebb1cfb7699fbf229bbd144801a5909d48491901ee16fca6c08272ee8f4ca52e36e975693b6e9180c63790ec8c2a9a66fc5e99fea6d93f45f0d9b035361b8e63ffafd2f44dce028a1156b1a856bad6faaf82fb2f4e7e919b2ef28eb12a9d1f3dc5c10d168a5ee6bf3fca3989d82b0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset.meta b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset.meta new file mode 100644 index 0000000..ee71024 --- /dev/null +++ b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 10f0b52937f9f9844978554ad22de157 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset new file mode 100644 index 0000000..59824e8 --- /dev/null +++ b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 9d916a2228b78c646aa46fe3ba85879d + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5c5b531b3714d61a6c633031376348b8b5691be702362149dbb44d1b2e21341032dc1e9ae9382498840e0e0c3669f2d8d7fe9f3e74a63fa88ffd019d49cf392b617957da0bb60c4e63c62baf563a3ae73b171d499b44720c3ed60db86cb13536c7a6d826db6107ec35fc9a83b2047ff69da87fc28ea07c09d76d7876834df8f4c4cf156b08ae4b70576615e879cc5e40b947cfd759117e2f41df22dc61ed2e7c8bd0ca6a874e9b6c9eadb2c72c63a57d486c51a732afb3502eab03aeb3ec1d3c2d125338488e1e65e0b20e4fcaf4ac044c8b764fd9cf2456099ebd803e476c1f683e278a1d7fc3d522994461d7c33721fdc6320edf187c33d2bdc5bf583fe441437ca38aba182fdbf8ef61079d84d44794edbced45a9afa8c732e2a025ee2f210fefdfbfff97d777f1b253a2dda9699be6f523d23d9649a9ef002fbba5ba7e5e5e90ea0679d923d525a5bea23d9629a92d96bd9c8f51057f58f64934fb78db31d1366a91153e04bbd866872c87c05857597077113dfd1d85308f70455ea1612b609287404061ad9be40b1536c36e2aad75d84a4a7ccfd1751b5aec11511ccc31c49fae2190b97df82b4aae5686fa45f25474b63d7832c596a1c45ecfd83438cf5307952d18761fdcb5c836e07a48f49e01dbee967e22a15b3afbac014d3b6a94a046007a08f7fbc4e13a5ddf10a745e27e09ea2a14c35e43149b85f22d8de696fd087eabc6dce090a97954070f5dbd1da2849ae6411ae43e47fef9512367a1110aabe3dc0ddb7314217f7769e223867690c1096a89d398b6a7a09aba9b2c87b756d185607819dd120afb1681751d3ce811208d789440432f89f2127f5ead9b87debf029d7d28b721185783b3a0202456e3874631497256ed205a2bf80ccbd1443de223b817ec482f5b33db344ec068b43d8f62385568a95448a9cbba5115d652b6dbed513b2f8354ab2716443d796c152784ddb3abdff83af4222af43a9a8dde2a70f80b9f24c2a3d71118bd84063dbff175e8b529d0cbc7798ae96229e160091b6a08b7eb0877d54938aa239cac93704c47b89b92c35ac2160237c1eec237cc187195b15226bc7786d1da2f942d00d52332a6b0511b1708a30ee8c4476de02932f049df005c0fcf3a67e8505900def60431ada85eed091de1de3a0977aa08a3187d410827f484bb74ced0af728638192fee0fd8a6580ee5144995539064bbe7d8298aa7708781c0713e4d6e70ad6e375073a973806e9526c8147e6aa2266681f3b224dd26cd624e29442b6fc40703239e21c4c75c8887e34687ec0515b264f8af8c22bb0975f6fec3023ddda345eb145b017e2bcc5ebe6e7379746d05962bb49b774c5c78a33e1418f561421d37434d71aad3484aa5117280df9a62eb7ebb588bb4d95bacc9ecc4b807242f7224b631d6a0dc252eb01eb9f0dffdf2d6e1c5137caa3acc91192fb0e07b71e6a5c03dd0485eec7a66ad092577e2d72cd07c0563bda1ad9ce39ae8586d158daaad759446385ff2ebecbb4765df64f485339c5537e0fa16fa1e938cb84db30bbdc3cea36381e3cb3869ecb2ef3c1a942f1ddabdba0c6fa2ce0caf4f451893a34f82104eeb09f7ab08e38cf46910c2c37ac2032ac298445c0e4238a3279cd641f1599d500caa08a3ab7c1e84f0b89e7046451833e12f98228b5e3eb152616d550bf5df6f9a6205f8c3271528abcb1facd5510dbe880a93cf0fe9a4bea292faae87d4c1f9b3a5df80dff23e12d6c911447e1646a2619d44599544738ef82a8f6af37900b1b5c0ee83043b94c7d8c70a5edc7a3d698c8c1775325e55c978cf88adae307bf568f76a94649774925d53499667ba5c741ebecfa191d0e2323b50e02fcff4ce675bd0630fe40fc3fd888efbeb2aee17ebf0a6e2891f21ef2276d4133f8a2123c7a84ed61b2a59ff6888acce27d53e4ec9c51a4f5e071634b6e25cb5144e7ad9399c9cc1d98755d87697ce8bd107964e5a2e40de6567896b645545a0f8865aebf5a2ce66bc34e9efb361f438a6d3e3a44a8fb71aa4473c80c5acbaac881dde9e17873fcbc21c6581903e829e4fa807de95598e92e93c0b9ef7e3d82588047878bc019c3ea74cda3f9b9f62fa3712dcbb61a73d9cf6e341659153924dcad2055f67ba0fe2e35c22410b90a644fa4393145ff98ab573ad467294d35f3fa535f97381761a6b53db50f873379bc063be8eb570d950e0614b38e53277c6da2d60df91fdceac26898038ad6dc0eb39686e76d275c479fc076ae2d1481e35326d12b618c186ddb7a149a525c019b1aae0dc34094eaf874d5593c356808c49f6346312b2ce13c8e669687b37e65d4b80f417d9553cea20fea06141ff742f36b8a7a71425046f29a938227a3bcee98a7651ce1be7b7e4e9261bd0bdb221427bd615cfb25a8bace656ea9c288fb9d5edff79da93471ddd411032224ba018f2a5c91892248d15a883ad497bcfb900beec18ab9e57aa123511251a4490d3449584147abf32095b1749a35a6019036ddc14688312685f9bce7fc40a780d1cd318541953500d4850dd3509559cbbe531df60c8b72058dd1258df98cf830a8e1dd1697390c54d41d62641f6ad49c830abf1de5031065eda14786909bcefce66cebcd582b0f549b0dd33091bbe92e6dc123506d7b029b8fa25b8be37095717b7b212ab3d0f313815244c81169140fbe12c403338191803ad5302ed7ef3e74f83b1ccd8fc1993209b3509592f13f999ee9522a38e3a620ac09404e09c4900f1cd15bfdd08fff3a8d65ba13209e0799300eb931483b1d0186c1d126c0b26614b73d8fc6dcfa8831b03b25702f2814920531c48ecae3a8636089eb19d921e09bcc5e6cfc80677e48ccdc8ed12640f9b0fd9ed1684ac4b826ca9195344c9f59e8a41e734b630bb20c1f6e3d9ccac332db8fc4f4ab03d3a1bd80c5a5bca146c7109b6e5e6c7358390198b6b9604d94af32133e89cc6208bb20fe6943cdf4f2a92d49e55ee08665dc744598fd336fb60b997e38101055f1fae5082be4d65f5903947ff28e10e0bf7ca95374dff13e05514d9525bfa7ec3f4d888536d95a4f59c70273db492a37fc7f121cbff84d9ffa5157dd04c3364c69ba0f91d6ef2abd0d83e6cc14ff43fe1586c64154e0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset.meta b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset.meta new file mode 100644 index 0000000..ff24dff --- /dev/null +++ b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 106ba5ba747308943ada92db495564f8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset new file mode 100644 index 0000000..02350fb --- /dev/null +++ b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: a1125ad687f8d9f41b0da3667d153a30 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5d0957dcc811d60063c0800df800db60e30333e69a017c7bd736e063c9fa0ad726713618c3d8b0069b65c06be7dadd64736deefbb7e4bdfca0fc88bce754955a438da65b23cda84696b3f0981eb55ad5555f1d5ddd6a899ab4053f8941f898b7a6ad496bd89ab396ad17d673f83609e53afcda474efd036b13caa7f0b908e706ad9e1257e24f5fa2133ea7e028676dc195dbd61294ab747ec6cac2f729b8360b4758fb04feb2d02a510717cd5937acfbd63dab2371a0048979ba28a7ea122857a2013e27acd770364b4c6127693ad5011f33702647e7d68169a7dd43eb63126b1dce2dc1359bd61ad07c4c141b52c0538264a2625895fbe0af917dc7b20dfe76c1df59768c65adaa3fe741c369dbaea9ab53d79f67f49c7a2c93aadca5ca7a55d6a8ba0b565e041b25d7f98b3ef8dacdea1a54c9db94a2e3f0bc97d5f9c5c191b35543cf39b747f170891d63d9a2ea2fabe3265536bbce23efc9376fdefc57d5ef576507eb734c959dacae83d5617948950714dd2b01e91d50e541571dc859bbac8e33aa3caca17584d51d6675c8cb7baeebbb58db2ed5e67d753ca2ca6ed6c6b9ee28abeb667578fd55757c4295c759db63aaec61e7f2d82bf9b80e4695dc5fd9e7eb9ceb1cbb39c5689f52b4aea9e3b42a7b599b5e559e56659f2a53aa3ca3685c57c743aa1c6434fa5539c0ce15d84f324151ec03882b8bd6869546274b2065bfe1d6b9b274a025ffc50ffce9a36eb720a46d00014db49ba358ba059632aa8d768712cd8cef49fa5c8416ab44143b7375f1afa22e90b935f8cdb2509d83fadb14e93158afc29961eb0e9478d52330b387f05b48651eba5d83709fb566e17383e83d02b68b5b961209c3bafb9a69a0698f3aeb50e300ba01c76bc4e10c7dbe244eb3c4fd14d46dd118f81c46c109285f516fc5b26fc2775d9fb30a323d8ffac1c7546f0f718e9a6e8034c87d9ae2e1371a89422334bc8f2b37ac4bd388f4759126bec1d00e3298ac4c291a230459a2a06ed44a533ef3651182c1652c96d0b16fbfc1f836e5bc5948481f5b9f282f72fa7d411e841c39de380de513e202eb971436de7d3948e971afcbe3b3633f69caf36e061852e4a5400e6bd294787695509c97d9a064a9448f5634e7db045cbb028cbea470b60dd7ead84b2693857635666590bd7aeae12d032f59974145bb9d23a1730e4abe67449da390b2dd6e95da79b9bade801b28352934e00426b7e3d0f83541344dd02d03294c379ec1d13218491618da22f5662dbd2a1b4995c5894e29864d70d7e8e06eac36dcdccc82c38dd3b42117dc7af49a0ce895eadf845ead0e3d6427315d45f44a8d9c5ed861fadbe1c20e7ff4f8b5107e078b64f3e6c0845e9d06bd0ca2b7c7c454a38b29e4c7403ca9530d4d84d74555330775f6ece1269d5da56839ec72ee5b04cf3a48671b9ce92a474d776955679bf8f15628ae3574bbb0ab53799a5ea9ada4544c4be4793799c22e9db668b962b68a8e84e75e109545681bdc99701d67c06db77ad0db09f4ce22e14ab36082b05ee74d08e13e0d578922576a37bb52838e321eeed7246a1954252edeecc62fc9a27eeacdfd34eafac1ce0feac6531cb936a15d510f8de61e76eb7ac0f61dba21c44db8c94cb8c90451a709a2436541d46c82e8b00e22f4ecad02dfb5a7c6684c37c87f1703c1d76282ef4885f0ed318d045d218c047b4dc4bb4320de6a227e3404e26dbaa8484a88660cc3a4f539dd5dd8748d09e18e61c774e6a40da33d56a9b12b3c9e4d81b75d6702a8a5e37ebca2c7acfe7d3af593ab3c8944fd936a5288f7c4c255f809df0a3f490aeff75078255c9a54bc5fa7098a2b9ba29a70a6d03310ae3f04080acdd99eed0dab563b73cbdbd60390da3dc3c4e34f09d99c4adceceb1cdade1a3ae55b43bda4a1f3965555ee4d9a3ba0734e1c45f17e4871ae16202b3a68a2dc5729e50e1d65b4b6949f80d26b26dca9219ca6116c35a280e26423387574ee48871756cef836da7e32da21cfb05229af26133d644a21064248210eeb54de169dca0b87e051f0de70553ee85be54325555e39af26951fd1a91c1d71d88f87f79bd5dda5238cea4efb213c6426dcadb323ca7c5622b1a3bb347db1c71194275c2bcaf8b6a211b2a2410f2baa9453930d1dd5698452c6a76f816787ab8f51dffa18237d0cf8f6eab0b4714ce7787878d6322c00e0c6a8e00b003dba7e700100132eed3d07bcc7fd1154ad92fe513e7b01ef0ed421d2736007cbca46832c061cd77182ed2ff809351e8b01274c89d5c54a13ab9326ca972aa57c4a4719a76a97fd8071d24cb8574718bdfc8a1fc26366c2a7758431ebc00d5395661d7d3ae2a872dc69655c9d7677d06aee206572b7ab2677bb5696bb9dd1f583a9f8753ff07ba4e2fd2601c64d024c9425c080295e4c563b5e0c9ae2c58d0ae3c590c9ab6f6abc3ad0c2f7b0c9ab6f55e8d5691d61f4a7db7e08f7980967748431fffbc00f618ffc6f4447b89d0e7d101e31131e3569ef5b1aed058ac9633aca18533ef4c3b247927d5647187dea8ecea730f0e8330cbe52356c2dc0ef530bb7782f58b830bfa98e0af3156ca5a7665ee80ce2a5e74cb2ddd5c9665e7835735328e967d07e19bead502dcffe76ee2907e1ffbc89ff7b3afe472be67f05ca55385aa1a33024b86092e0be4e82cf8d1214cf5e6dce718f03c67333b7e67a3f3df1dbc385940aef6d7a9ff3d7174a1504db8b266c1fe8b0cd5ace1aa6b385896f60b27141fb78426b94386f9acab7bc09b3297b93145ad21259c94b6a3dac9047fb297cca649ebc1e67898f0909b786f81e9fc2337cff8afbaa79e8017d2c084e974c387d5b87138eb37a8bb1657d0119c30204109c41614eb14177b297c842ecddb9e5d86218be76d924e7b44ece1b1e919c2f0e8e43891a7d1dc0e34cf66ea21c44ca2b26296774523ecb5bbdb3b65ebc6a5fce9abd8dc52cd0784d3bb1b7f2b7a0834befd72a0aa34a10ccde336136abc3ec76e028ecf8ff2a9ccd02995c99761086b7bf6f92754e276b2ab0ace3e0f1e8f3e1707bd5c4edbc2936e9b975afcbd9bce6d4b8be4e33a0e7beb3afe27695ca79cd24e7473a394f07c832b93f87c1e97513a7dfd171faefd0e2cb8e343b51c6bf86c2cb71c2cf1116f254c38dc17aadd6c36f228133ec9bc40d46e80764077894b3d274fb3b93d75be9ede388ed3af080316b369fcf94de14fe5dcbfc7057f19e87729ff32925854e6bc34c6f5c3affcf3a143fd354af24726801d274bbfa5d93f47ba8d55aa5d59a34dd381f28d39a4a73f190f756f201c152fbe66d02f7540c4de0fadb025dbe489b0f4bd22fb5b37c8808388f8784f03c231ad53800b34c812a07bff8539facc920eedf9704a79ec0d966eb83718067ad76079e8f25e13942f0a089f2a0bd0180b983b6737b6e8d929178c0f89f04c2589f7411bf155a2c2bef019de2a8bb97c6b957f420d326d15b764761da80f3b671fe036e9ba9a24894aac0be521ad7dd490af48379663f5df2ff3d5e6770bc7e84209c7586378a238b9271a499805fa00b6cfddbcfdc2d80b7bafaaae4b1c4c6829871d28f20e5c48d7d6c747a2c095b9b826dcb2393cfc801d82a05609201b82409e06e05e09a9a122dd2444510b27629c8ea1964cb929005bd9f1a3f284719945949285b94f52d1389f8bb6d1f03ee4934c3c50539d886a4603bcc607b5a8d68b7945f78cdc95a5abf14644718642b9290d52bc872d0604916ac3129b07a1958abd570cb75ba2136a516f75ec9c2d62205db6906db27d144b3891826bfa7186ccfa281edac1c6cbba4606b60b0ad49c216f49d1df11b4f330cca7549281b2c277f736efac6712ced64703d97846b0f49b3b30bcc7db7520cba1129e84618742fa4a1b3d3909da51ae7e402b02c065da314743d0cba0d49e89c35926de36ba744dd566cc04831003f8d669c1d9183ad470ab63606db66742e2b98a288b9ec00832e27095d9382cebd81521034b1c5a42106da5614a0c57131f300036d3b0ad004239b18680719682fa3004df0568d18682718689f45019a60ee2606da4906da2b49d09cf761c52fcd4833885e4b42e4e77d58f19b938e31f87e28095fa3724bfecc4e1c172b6b19603f9204cc3c1bb814c3097c3783edc7d1c0765e0eb65e29d83a186c3f8906b6f1184ed98f31d87e2a099bf7dc5330b9159b7b3632e83e97840e5f0151ce7eb3c24de9f173e9fd0ce02faae1d2f64dc2495a8b5b8ded4c751783edcb6822a1e00ca2470ab67606dbcfa28b84823356b148d8cca0fbb924744877890ee277137a9881f4952448ce969ac267e6e33883a86390fd229a4816c7db301683ed97d1c0361943d8fa196cbf9284cd99e0f3c72105136031f7dccb00fb75b5018b633cdbc300fb4db501134c2cc4006b65807d1d4d24bb18c3dd465d0cb6df56c3ced6e82509f623d57174cc430cb0df456367e76238623631d87e2f099bf79449d0e2c4a64c0906dd1f24a13baaa02be73d06a2d08a2d1b9d61d0feb11ad1ef65fead1ba26edc2405d82003ec4fd5064c70038d1860c719607fae366082330531c07633c0fe526dc00463981860350cb0bf561b30c1d55bb1078a8e32c0fe566dc004a7566216d662bd332f92c820227fe74a4fb195e254e0c74b52251f0bb0dfdad0a6b042aa77a9dd62feb98b9d3738a4e9dfc1f07fd4e3e7453cde3411296f6aff4038127a1f580b4dc761bc3242276969f9ccf6d2eca19534fd13987759fe7fa2de95dac94c3b689b1f7ffafd3e34b6df70863fc9ff0194d9ebfcb6870000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset.meta b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset.meta new file mode 100644 index 0000000..4e888ee --- /dev/null +++ b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c630e98cc2cc0c84f9e76cbd71c5ab22 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset new file mode 100644 index 0000000..525bad3 --- /dev/null +++ b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: a3b924aa5d416d94c86ddd019ccb8441 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5c59731b45109e95b53a6cc9576ccb244e702010411249760eae10f045303847f9aaa25254a238b2a3201f48cac55b9ea8e2297f84375e78a7f805fc00fe0974f7ce4ab3bb33bb5a49632c13a9b4ab9da3a7fbeb9eee9e19d9913c839771112e9b6c952db01cdb608fd83edb836f0b70df85b7f56497df6555b8efc0b5087517d974404f7c9d3726e1ba0c4f3556879e4fd916dccb54bfc64af07d19fa96e0094bb7e153825646143a6db0457687dd6619633c80c42675aaf13203e53212709d672fa1b6444ce12079aacac0650d6a6a54b70b4cdbedeeb1ef49ac5da8db823e5556019a0f8962e237b81a2413dd4c7eefe377e438069f21fe1c814f12fbf1ef629f04bfc7f86758783678bfa40f1d3fda6e7e465ae893e26d478567e86facf0e77e7e4ff3762784676c3765d1321679f9206f37263cdb74b07c9cb77fe0c35bd425c744807c03fc3923a3691a64515f838e8bec80e569900f4298bedd33d8e891742c62d909583f0e5b07f33a000212cbdb20bbaeb3cb6c566a796f192981ef05ba16a14599884e7a87f8dd3304325781774998363528bf49b30e274e196a726c05eed8eb019b818970cf45651386adc0d42bb175b81e10bd07c0b6b765904838c5dc7d5681a6e50176a1c406f4009e2bc4e11a5d9f11a725e27e19caeae48ff6c023cdc3fd058de695bd0adf6563ae73c8e43cca1d81aadc7237b69a16411ae43e4fb6fa4623ff854610fad8249f86d13c79935f3c9a7883a1e56430102c731a330499e1289b65798a15ab1e04c3cbe895506edf16ded7d8155f59e4c8a0ba4f91044d0dfffad7d89faffe7efdb3e914ed32cb53d89d0a10cd0f58a49735263c14fc4530cd68011975c36fc8e08f63e1da21c26fb52b53bbf00a885164722ac0c08cd30e9a6bec31545481d51c5b02268ac4768533b941225528cc9579d92d68630d540565601eba43edef00334fb82ff5e8b6808cc4493ddee01b24a24a411199821287ada0608fe4a7a04443aea682f0254730a94030880715827d320429e37da215c10d28b352a725aa2d53bcc5c85b24eaa22da13caaf6368ab76861f19438f1c71b53df4b2ebce5580f10d6399a2bfab85569262ad30ce5ffeb8768db58b74f548ad036bc7563d27cc16ddd72b8d304f7a447b8601654109a12080b38df062573ee1f7899491763381314c46332e2a89f21a9c86eca6935e5b84cf3688cb44cd3a7797b39b50679f3b750875ebe44b91996df058a45181be9cdd108cd2598b387bf450cb73cff46c820ce098bc34e3953194a42a64b447c54c6ac5b95236a552665aa4c1d768072bba77053f844cb0a1b5304a7a0f1556ae997a18713c77875281321682f42e6feed71f7c9e52347f6627415eedbc405962317c17b18fe9a196fe0d3d44c9eb6789658eb3b2afaa5c07cbc1fa79329b79b0cd9cdd1e259659303325781363929514681020d7c2224e74992735a2aa7fd6d1eba6142fe8cb6239e02cf325e4dd3e385326a2f945285aa539d86aab48af254a79407552ef974872e7948461843ee192659295d65aaec4f668239761fde3b0cb7c2efd3f6203aa467f08ceea7024688f5e2647626371e39e26a39865572bc2d93e34ac3e89c115115419d92e0ee97b8eaeb9e14232a29a665525c6f431bd6c1c49ca00b7feeddb59b505786691746aa519554676552cd2a74739b387f4ecefe07be3a76ea65599b5e4ea824784726c162680990f33b50b3d7e0bb75bd764fca319594efcaa4bcd1b69e56a06e8b0889330d5b84999361241b5749764e26d977a125b3669553836164e944dfedccc809151eefa934adb6300b817d90c3920277cf5e12563bf0dd3e4708e765dab7e18c4ab2f76592ad34346da71262d263ed21a196b6297a61a2bcdc68b944de135bac92664adc9f56392258fa230d835259097799862eb39f7c90f1d7671cde8681917f89c646acef520f7caab13c05f48234a992278f38f62ed817e2bd0e7c3d24dc8353c2f34c7da0b8cdba75b61424854c4739414ba274ad2f30bce768712e914d0b90a694e3b8499a45ad46b95623794a482eb4694dc15ce05177ac4f6e43e1f7c52d02b7b9cf343068dfa7619a8eb906ab89325f03352767e0c8414bf64b44c03e8ae9c2e93a9adb1c40f6885669357863ca1a372305d4c8873a614b126ce586b559797b2f40f48700d1059d10c50822ec8ec1ae37c061023817758233da98768b34b42aeef50268af09b4b8e922fe55d79c7e7b679bdef0344409c10bdaefa912bd47ee7045abb0a3c6f92531dc643d132b1bc289675bb6bcacc2c735732b794e54409473fff3b4a780690f9e98c786ec2c817c4a41a74f99267dd91adb834661d75705374f9dfcae22e9f03c23ad08dc8ef719145cf68c4e78d31c5e1c789bc0b569e342441b70a62ee0c45837ab1338dc316ec537399fb05def59635c00f5b24e5027b8356e716f59772d9045e6b54eeca42e284d01ca2b3aa14c1135f96f92b4c136a00bb63e01b6ab3a613b2b0937c8449d4ea0f6d837fc87b4c7cd2e2302c0d774023ca40c387bbc8936f0e2bac03304f03e3aac686d5b64734f531b7063ba804b0ac07dacdbea30cd16bde012599c95df6b4c75d2bac08b0ae07da213bc33dceaea94e0d4421e5968f486dac24dbf00eda73aa1cd48c28ddf59894630b5d9694a00f3b3a304e64c0f829916c0bcae13ccd39e49ef3c2d53ff4c47ab959ed405ec8000ece73a8145095a5938e231ea73a155ef2d1b1302a43774423ac56db5c0cfa383c16d2651bde702e8ef478ec7ce7401f76dbf40d330b869647d17aed636ed0897147fc1788b945804ca45ba37b76cf3f4cb1d5ccb8439c0f4a719bc9ffaa5288c4b4395ae69a81b7bc432493bd92f4ef968254fbf2f3acef2cf897a8fe4e95747335db0bd608ee65998bfeed6bd6e3a7a3ab6fe45c401b544363bb1715c1738e9597f0a989f389af6dd3dd9179cf69d69d7bec373b4a8d3be2d6a5686eba27db305e9e47a70cbdc6c7540f6d03c8eb466fb63867f04178cc469da1f57539b83a71d92b54c547799fd8a9bf63b43879c1bd0d7f230185fabf49f48aad4d2fc179c15e1bc85450000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset.meta b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset.meta new file mode 100644 index 0000000..7561833 --- /dev/null +++ b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0852567dbbf99bc4486460c92bd65bfa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset new file mode 100644 index 0000000..95f3557 --- /dev/null +++ b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: a7250c474046ad245ac64456f76800ca + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed59dd4fd350143f775b378620a222607ce00d8cb016487c970f81449030c60b316340c1990dc806888fbefa1ff9bf99e0ef9cb6ac6befd60d680464cdfa71ef3d5fbff375bb254cc2474de2b4451b344f392ad03e1dd311eee671ade2709ebcf175aae17a8873097393341641c99f713582f30a9eea740aca33dac3b52cf379b271bf025a1b4f3c7a80af8d552a05a2022dd0675aa3613514c1624b88eaee9862bb540fce73f403b3b628c5424c991ac6298f99bacc55a1b4b76e9bbe885955cced81a64615f0dc158e3dcb4c2b36c925d978a4ac7b9f70afca3746beb134be6c99717979f9c75062e532e496e8844c217edb853b3cca684730eb74c255665cc49ec2e41330d0a05110ac4f699666b4688caa3e9fdef3722e61455998b2b08088df2111ac5c0587ed73651de34b1209eccc326672f40957a6daa16938673bc0650b622b08079b36713e117e3b503bbc32ca24767b9066033c9da8ac62c403f404cf15d1302fe773d1d416ed5730762a3972842c99c3f542a4856dafe15e2773d3854cafa33e385b8d3b29e0b96901d6b0f6a6c4eda347fe854718fab4e1a661cae41c51bf429e78c4d0293286147d87c7b453469bc666c8e447f5338460f736862df4e2bbd362bc243dd146c3daa56f6e1679728f258358232f1b37703d102d787ccfc5a6bd2c0f293deea92b7c1af16372bf518b5db494f8ad600d136686157b13e1b87661c3964da831ad69dedd1c68bf42d173296767a0d5a9671846735ccd92c5ea6544c21d03cf4859ece86072285d7270f557f95893a399b3b3ae2cebdaa5ba3e8059dda94000eb3d9315cf84f72d51f25ba197d0a067b13abdb25b6a5649b1741bf838de5c737d6e64039af2b216f2923a79fcf84493c316473aefb77af9c608c9c9b496936a6557bfceaec255a47bb1e78f3ca7d170641cc85e8f2363e56ae5e2151e1b12f736f03e97d5392ae2c8cbec3e389e89bf986f83c659d1f0a4df8fc1b92dd096c1498f770687520ce3a270ae81725d28f8a94ea66ccaad2e729a6557113bbc39da84e5bb9225d199fab4cd8efbe0d6365f5156e8bc96f3f9cd6f5de70d28bcd1ccb81679bc8034e7ce83b37480bdeabdd4254cc9d777d78ca6682d9eb1b464a76f6d51d5cf61e0d52b79852b8a9855698e750c2ee0ee3b462265f93b9c4ed69430f0faf72dbc7072807d0048fbd22aea38f8c3e91e60fe31a6179b4e7b5b383706a41a5dc81ea026fcf683b9c2beb8739a0ffa637da26dbc34caaebe5c5a5c769fffe715d1e28af88241487905c462c85ec699e5facd4a40ca4df6e1d9a64ccf7662c275b23d21d9ee0036142760fd12e6450d6845b2ee2170ca07dcabf8fb4951089849c97da98915b6745cb0910fb6e138614b0bb712a60f897fc9be7f50251f4e23b6388847fc7d6aa245059d0839cee98183aed51cfbab325e8294925c1bfdd0e42aa3de53771bc7f63ca39bd5a8bfa107bc55b9530d5867e94d9a715f1baf98fca6f6a0ed7f4dce1f4f6e51cb18c3b2552bc0f30e73fec5aa26ff8fd5648df11714f5ef581b1c0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset.meta b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset.meta new file mode 100644 index 0000000..df3925d --- /dev/null +++ b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2df10b654ffd4ab4e9e1dafbca06089e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset new file mode 100644 index 0000000..70cf5f5 --- /dev/null +++ b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: acd8738ca64f5a9448dfb040d1f2e4d5 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5a59531b4710ee155a1ddce0d8e09cbe126473ec82abf290872406db09558e7171bdb852b280852825b04a222ef217f28ff2df5245ba7b66d1687746ab058d8888a5d21e73f4f1754f4f6faf321ee0c759c0c32e6cc21a2cc10e1cc07b38c1ab353c1fe357dc85ed6fa081e7233c56b06f01ee25cca4cf9c338bc775bc6bc229cefc03f6f15ce5fe2d08f07a1de7067847ad87f80b709493c5493bf01c36e035cc38b71348ecf2a4a66c73482fa780c755f8137b03168a9878dc3583872dec6972df310a1d8e7b0bbfb25ac7d8b78f731a50439a7b4cb1b080478775e2d3285cdc4251b976e42f87bf71791df66722d7741e93e721396742b947149c47117e598546d85650da0a0a7ffa4d46f8e595b139a58dceae6c9b5278a9ede3115a23ca3df54fcbb13fd2f9fcfcfc1fd7614bfe8cd856a00e1e4f7c9cc2e5c299c9cec63264a411e698ed299ab58e043416df617f3a85a7b0a2b5f85d6754917b8d8f151c5165a2c42cc2e2ef180b12ae86df4071d726b6ffc4de4e0e5bc59e257885679af50e96d101df46a8ec22db1aba7c00db78ac33bd7728767c64924ae4dad1399b4853acbc636c0901ade37d8d25dce2e307963460e9d7b1ed94e3c0094682553c9f31b7b8ee0dbcd6f1dc9690e965d42f4053bb58e6a1999ea33624bd476be7a345aec5221cc66ec96598f53882fc15b3c4470c4590717963133496c5f6d1d6b6021edd3ae51882e9758c6b18faf70eb689c0f6827babbc1a04f6a45980634f59834e23432df59891232cb26e2ddbbbedca3e058f37a4cf1394ed0435d12b390f397be88552ae9bf549f4a8a91c9da9781bddb26aaa76ca625c95c775723cbd4972bc51b69bc4a1c61a0e788f0236e1bbb88dfc9c4c184a9a6d354920139c191d9c9cc96cf611cea448d3094c12762602267df4f81519bf3b31dd3a4b60426f48871ee778db7d446f95bda6c67bf1c925101c4659e7a308eae11b61f86663ca258b608230ab81d077658a1d8b5bc58850746720ecea08d3f219eb8670de4c38a733fa70bf23d00662fabb4ca8d29b7cbc9b4dc10f9f8a74012789bfc9de799d5908bdc96ecc3261364bc1e448535774a4a28e30719b36459e28f1a299f8b089f8ad1e101f3111ff4443dc49497cd484f7ed2be23d6692fa8e46ea624aa9c74d51813c3cb6277f0ba67486529430955982327e9b40059132533de3ab72db925177e868df2e2e9c2a3e5ca7094313264d66759a3c8b2ce0d67e27a4a7aca38ccf5f14849aa8d96f1cc8a372b66699dbdb7bda378634fa4d9af4bbabd3ef490a4b1da5b0541a89a74c127faa93f8fb884554ae42ce35de06f6714a5c4635fc76eae98d66d326cd3ed369f64357bef60cfdfd80ed25ea0157f7b5568f5eb73c7e1d8782e20b1ed9c0b96f78e5d15d133c8e973e745f2423eec7883779f83602b0c79e9e5c32a3072d53c9ec107a553d49d242e045f30fb9c4163e91ebb44bd6c95c29ca4b8d425a88346f1e374dd32fc8aa61353ae3f13e367f496f4a96e24be236a4f7a1f4cf8782c06b7ebf8004c8640dce5d5fc947d2440e4909e12213084b083da813938c228834e4b6451f5ae411e22f7be667972b02c457c404c7a033148f5a89de41748570a2f25f93fc2bd5c34b1a2f6985587d68f4a9ebdeff3cfaf914fdee1308e361b0f029583cb0b9a289276d9855f936afc2a945802d2b515e57290316db56b9db8d229759e9055ee902b6873661230627fc76638f7d6503bd2574f6a63de08ab6801b53807b6413b822531309f64b7eb95c433106cfd34615c0beb60958412ed00a0e38c2185606df1e5c13b6e0ca2b707d733df16c7900bd2cabc036d70f2f1304ea76bdcc5a141b51e02a5d8f975984cd9a978102db63dbc13f84ed803781c1f4b38c02d8139b80e5256001033698600d2b60cddb046b4c82b5cf99777b0dc9227023b6801b52805be847f01729863fa029464e816bb11f51ecc34569d36a7291b70598ab00b6d46fc02c7a9835c01c0530af1f8089d4822a418319fa8b70630a6f3ed564e81dc04585aa6478962d251407442d6c4a624079e32f10b0a10ff8954e45a98b79fc368f5e37a6291677a6995cb4a23fbe5d94f322b6abf5cc76bd28c4e934bd4a516eb483553c7ef37893f55f01f1af71fe909bce70c976072d2f8807e8ca0dcedc1b3cc6fd1748cbb878b4300000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset.meta b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset.meta new file mode 100644 index 0000000..eda4058 --- /dev/null +++ b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f13b0992d5e17354d9234c6477b4a443 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset new file mode 100644 index 0000000..2f70d91 --- /dev/null +++ b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: b35f97b1813cb064d852c92d1c5c1751 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9df77f14c715c0e704870a02098c105d7409217427d18b01551045809a0bc6704802644b82a8101cc789d31327717a777aefbd38717a4f9cdefbaff913f2433e1f67deecaceeeddebcbbddbb7d7b5ec7d24737b7b3bb6fdefbce9b3765e74e2509217f624df26548f4890ed12c06c588b82e26e5bb0e994ec85febc8ce3f2ba6647a55bea6e4b926b13ec79df0531f5b215f7be4d1b4989177ce8a61998ea9f3fd6254beef91f78eca23c8bd22ff46e555b1f9f2a641d129ce885e511babc9216248dd34adf3626057ac4cbeb68b07e4d951a514149250a76ae54bbf3c33adce4d48a5edebce8b0bcaac09796e58de3325c6a5cccb4a62d97f4a857a23ace4ac4e97c9bf72f41ed2a5f26f812ac53a5e22e66e9dbb56a06b63fa0fee1940c79242897d7c4ea77124c3a48340b2cad13d761ea4f3f4fb417d5c9a2e6fee9e79280fd2127dcf103a06fd9a5cba5479d4af1ae555a13c4817e9b2eed0c7b53aad41f7d4e874b94e17eb7bee4432ec7c482bf5f9bbd031a4153aff6e7dbc42a70b515915284ff982bee73c3a8ee9eb21ff1e8bf91c1bdbe6dbd0315c7741d7cd51573dac4665dbb6af4179abd075f63948576ab9f7ba8e2f42394f3df5d47f5df5d28264b6e834219cbedbacd3b5e8dab5e85a48d709a7efc2b1f48db85d9fb6ef6e1499bed16290bb09e56d447990ae174edfddacd30de89ef5280fd23ae1f4dd3a4bbff9ff76e9d2e451bf1d28af09e541da289cbebb4ba7ade89e569deed4e976e1f4dd46940fe936e1f4dd6d3aad174edfddadd30654563dca83748b70faee169d6e150edf9d6363db9c44c7c8774bc0a74cbed58374e8d1e931e1f4ad6e9dee41d7ee41d742ba57387d6baf5577a58fb9caeb34d45d8f416e17caeb44799076b8eaae43a76d3aff923e3eaad37d48d63e742da4fb5d7aefd77acf04a0b7add761c3bdf9c8b3753f6228e3884e0f09a70f9ed0e9ede89e43280fd203fa9e143a86f4a048fb1a2ebf1d1d231f5b60c7115bf7e3e8185d17b7dbcf499d9ed2e9699df6eaeb2f0ba7cff6e9f40cb2e58cbe76d8be361e53a392e3729c90123744023ac018b444afc327fbcedc0327d5d7c20bfcd4ab6267e410e586146018bd0caab1d18c8c26adc6d1cbca5825d2bb43bda6e415634a2814e62ae2f18c2240b971f93b8a865ed332ff981ab9c1e06b4c9e6996c0c7d45d9764d83c2f7f9d528664b1e372f8362a1bc5ac2c0ae45d926a675e99cb2418a6b9efe99332ad51e484ccb181de90c7e34ac37ef57a53693aaab4ef9179336a4c3b2947b5ed32bda54acbb47d4abe379539a0919975340f26a97c6bc86a5753a7b406b44fa871d8b335528c1a51c3e411dd0ce727d448f8918c9a7896a11564e2aaa3b164b4286431475eab48a879485f0641ff36665a68f6ef5cbc2f642103d55dab2c48d730fcc49d66ed140935ad5a93c3ac6c50415e436c798684eceac7e3f393a0a41b7dcc845e4d2d0642440fe7ae2b292979ad7ffc0075bb1b7f06fb245c56aaf0adc8302eb70a14c21203c224145366d4aadca5155c49489e67926ccfe98deee6161ea785cfa7845704203c6e72abb2b0dd2add24a8c59aec6e0553f81d2e1266afaa24bc2ab70694572da0aa675100d5534a095f1c80f03253ddab91f225d6ba1f9479d630b54b9d1d53631bab27859a9890165dd54135dbb5d97da2cab34f542b9f802587a034a37ca59c8a404b0c1128e627025598ea5265be88b52ebd4e938ea9d5e5513901bb2ceed3e35bbbdceb8a1c68648f93fb647a456901f9c39a78f6b2b27bc3d2393e69c009b5f2d725bc4ff6f8ad80c5c412e595cb94573667f14a9336d93cd366715a2d9ccfaada8ec7cd6da24695fef46243b5aa8526df572bc1e742ecc3bc8cafcdbeb9dc73a4aa55b552936155d6612841add2148b2062ac30349524305e39e79bab941e3bb2f8e6807a9e04b3d72b4a97897c3cd31dff6ae8f8b788b26635650d0ced2bc0105fe52ca63ae4b50174c85526475696dd5f940e39b312edc1919f8acceefceb3c3b7f9d72ba842fa7cb475faac1545355bf3e80aa5f4209df1080f0a594f08d0108bf8d12bec9203ce653f832937068119b4d6ee3165c470baea1b4de120092e594f0ad06e1953e85d752c2eb03d07c8549b89a33c9bf7297f06a93f05a5af84a53785301b59f35bc3925bb474bfefaea6d9ec355a30a57990bfbb9caa7c2cf2a13bdaab0e959d78da9ebfcd383479ff5ee900093a20745523c246f3b20ff1e94053f44406d22a0e6528b82bada0035092eb9c34b7c69a47d7d0d25b8b940c16ba9e69f08a0f9af33098759273c272e6885ac8e92dc52a8e4f51490d600806ca084ef0c40f84693705894d9e5c5472a69c19b28ad7707a0f5664af89e00846f31098700b1d70b926a5af056cafff615ea7ff526c930f3d82f8899073c30af80918daf994783a91c7082835ed064e996b751061ca20c809d00fea74e8d543987a9728ee455ce76ca418f06e0a04d26e130206df3520b5906a43b28addb03d0ba9912de1180f00425bc3300e1494a789741b8dfd9450b5599dd0556662ba5f5b10090eca4841f3708f73bbbd84509ef0940f3dd26e1a0216c3b2a7476b187d2fc64009aef3509874e01362315d47deca3d43e1d80dafb29b57b0b55fb80493274d467bc349d2c1df5414ae5b385aa7cc82419fa9f7382e87f605383fffee776cacbfbbda0c9e2e187290306280306f332e008e5924301b8e4514af81d01086fa384df1980f0764af85d06e17ebba20eaa6eefa6eaf67c5e75db692a07babc7bbc3867962eaf8ba2732100f4dd94f07b03107e8c127e3100e1c729e19702709a1eaa32530556e60993600861b0c7b6d08efa24e5eac394abc36e3debc1135440436cbd303d96b4dfb5cbabae490137d506ca5931657cb4e8eff1d22993ceb0f87645102b5a67e5414a3c2043d2ac2c1134c928af892eefb4a1bc847a0011ee629fb5a20672fc2ff65d959ad665349f878f9857f6ae096a652fbb0ed4ca5eaf89a07aca32c94a30d7e37278fe34abac80f73785f5587c40959d5ebf2c64abc398b46fad216ca9d065647f9f62df6a6c55c16b4fd5d819538da947579742a9b17ed9399e94489a65eb1b536db6599fb38fed363dea8829f67dd96be57e534836d6c6b8b0b72305a51945fc2cd57f4c14d87f9c33098695cd492f82b3ac6cf69904838f5cf722789c16dc4f05f81ba6000f5370f323e5cc47d06df2754a554eb31c515c54fbc766647a4a359eabf2fd35958fdd26bd1bd14fa73140d9f01c930d6dae46952ed3d2f3ba34ddd2725afe0ea82e75328ba674bef38c73ffae1ffb0629fba64cf62549fbdc35724cd788570bf2ab9d214afbe9fc6ba74b56edacbac9f2c462d6ce1d947d3326fbda0b68415eeacbab6c3f16de4959386bb2f0a8a71aec53e7524abf1115be0bafc3fcfcf32ecaba9b85d61faeb50e1947a0931e2942fddd4d59f85c9385877c5b6847f6ab869d90b44da67d937eac3a4f5975cb6455376995490f67cdb9f772ba6bd0de8548db9a29c38fa5f750963e60b2f4206929ecd04eefe5b66c9cd675075aa524018880993eea8c8eeeb343f21c0cc7fcd87481b2e979269b8e788a296d52871165b7f509c26245947b29db1e34d976d2651bded26159d7ad5b5bcae07bf86ae719672ba4cfd0f2fcd87c91b2f9f9d418c5eca39df2efb2bcc8b6fd94b8ae2cf36e413ede7889d2fe2193f6ad7947c8e1b95ea0432dd198a2497e3e97a22c7881c982aebc7bb162c7c2cb949d2f34d9f9a8b02793f6941c4fc82dd230f6b822527ac2dc3377657a9adfa73c0d16186eaaab9bb5d5a36aecd2218b02eb416efa1ef0637b6a3aa2ae1d565247e4b5dedb305e04ba98c592f4f2847971228836324c917fd8447efb1c797b326e4fd9e909bcc5d5cef1a773a9fc8dc560d1b44b593f25ef3cabee80a3699150db759322f7528f9d0f654f487f837e6f60ae6fccbdcc039f3ba2beeee08a702fe8e4fbc9f75c56987cbb197937b6cefbc25be6a7fc4bb545b62c495aed5d7ea659fa62a8d5f9ba564b126a1bf5f63cbd29b7162f81d2e6997dc8ff26504b40af1ee712abf4394bc9b57f77871260c7ff00bee7035ccb1ad24d096b31e64999551a2f4902fd977222b2be660a6e4fc94b66220167453c0de7659c702a159c091dc07be58520e88c6c7e572201ea899234a89773825a48809a8c0426f8815ed525bc3bb0c09edf06fbcc2ea84a75fab7d490724ac91b717749ea83294f37cd5f81bb94862cded290b5c9356444ab0622c4a7c748e6b14d12c648affc3f1fbe2461f8f22a80d06ff7f62a523cc21f522faa1bac7ab43e1b7c51b6575759857c334bb9236a547b31249fc85126d201f6d59cd8ca34364b002c01ede4c315e7c2d58e70bda6385eb6970f5b1d17b61684edb5c5c1d6ce876d1517b66d08dba361344ee893aeaa15c2241fae462e5c6b10aed715c7cb7645d0cb2a11b6d773625ba8b14de882ad671bd1f4b59508da1bc2689ab644d661462d17aedb11ae3786816b20d2b84e205c6fe2c4059b0d4dd3980ebd9506e605e3111ca79522806f0eb779b644d0df1a10aeb784db3ca3886b37c2f5564e5cf440a33382b3802684ed6de147355880e9558fde2e0b58ad885e54db8500be9d13e022d2efe003926ce0c6b9c09d41e0de512c708c7383512e702711b877160b1c6317c1b6ae7600817b57b1c0314eacd83a894e04eeb16281635c9a649bc61f46e0de5d2c708c932d36708710b8f77082a347738c11ae920b5b1c617b2f27367bd9c8bdb19531ba9572412b41d0de570c688c9ec606ad0e417b3f27b4cc67548c3ec6364bb80de1fa4071e2d9fe088ed8b6206c1f2c0eb63d111caf55216c1f2a0eb6363e6ccbb8b0d5236c1fe6c4668fd646e7361bdba758a35b1317b85308dc4738c1c12776cd8b48515f1cdf8c107eb4384db63b82f3840e84ed63c5c1c6382f658b741508dbc739b1417bb9aa6e800f6e44af273d8b407d8213140c73871d318c1117dbfcf31cc2f5496e5cce5901e32a075bd03f8e707daa38d12b8acb91cb10b64f73622b47d8e043f6b778e7036c7e760401fb4cd8c0189f4db101db87807d366c608ccfa4d880ed41c03e1736b0286e5ade8e807d3e6c6051ec2bd722605f081b18e30a2d1bb0c508d817c30616c5355a81807d891358a9b0977f005834e3571b82f5e530614531761d43b0be1226ac28c6ad0482f5d530614531662d45b0bec6090b1ef1983625477bf35e2dc2f73827beccf58a2836cd24c2f5754e5cf60312b8645238bf932a8a4fcbd72170df2816b828eecd8821704f140b1ce3f88c0ddc7e04ee9bc502c738566303b71781fb1627387a4db623820fe21a11b66f7362b3679b691559371bb0f5a5ad08d877c206c6e8616cc0ba10b0ef860d8cf193ea6cc0762260df0b1b581457fd972360df0f1b581457fd6b10b01f840d8cf13b37d8806d40c07e1836b0283eb95c8f80fd286c60519ca2cf47c07e1c36b028aea0cd43c07e1236b028aefc5723603f0d1b581457ff1720603f0b1b18e3ae7f36603b10b09f870d6c5f04816d42c09ee404e6fc4eaa246fc867fb9ea0d508d72f3871d14b3c8c5ec6b6b97323c2f6cbe260639c55b2ad8c2d42d87ec589ad5a63833d18d65797babf369fb1b15ee3c2771ae1fb35273ee8a66f88f4b7e9b3a162fb468d3e84ea37617403b64456cf62fbc6a08508d76fc3c03510695c2b10aedf71e2b2476537e7fe1b46341ffa6e45c07e1f36b0283eec2d47c0fe1036b0283eab3c8880fd310c60d6680cbe233d9a8b3d4b10b03f850d2c8acb89cd08d89fc30616c5c59e6e04ec2f61038be272e25104ecaf9cc02a3430fbffb2a5b8a318dbc7ed5721647fe344464fc4bbf8b0b17d6cb00761fb3b27b62ae1fe7a07e7ff9263f4b9fbb8e0f58a67cc7fb349c273fe7f600768707d4ebdc1f871ec868c2502eb1fc22cd10ca06d9c16a3aa9d8ca8f09212e97f0e93807a88c1e7e4fcfccbb3ec3281407669ff043363663f1f0facee82f86f34264b73db47fb4165965a49c05cf6196dffbfa0de75b52b37ad55df3e36286bde120ebbf7a784f59fc3e127fe3ff2cf137e02bc0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset.meta b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset.meta new file mode 100644 index 0000000..f6912bf --- /dev/null +++ b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d812305ae6dc5c845b94e4264ad548bb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset new file mode 100644 index 0000000..bc369b7 --- /dev/null +++ b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: b42eae3a19d2e89448e47dd9c7f5d0e2 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5c4973134714ee91359225cb36f2826c4212b222626cc9982d2bc10ba00086f29603953202c9a0c4362e493624b75c73ce317f245539e6989f942af2de9b1ea9d5d33df2486a06115069dad33dfdfabdefaddda3229263f0cf3a0f972db6c696d81cdb6425f68cedc35f4bd0eec1c7b973fbefb32ab44fe05a84b1f3ec4c9b99f8efac3505d702dcd5581d661eb2c7d056687c9d95e1ef02cc2dc31df6eec0b70c4f595198b4c996d93db6ca32d6641b125b34a9c6fb2c94cb1a84eb22fb1946cbc4142e92a3a10c5cd661a446637bc0b4fbdc03f60389b507638f614e95ed02cd474471f02fb85a2493db503b01df187c27f9bdfb8df0fe93f0b55fbe7cf92fef1fe3ad0ddf84f0b74b0bdb013e37e3336780b751a90fefffe6f771de0e8abcf071154f0981568ab7493e774a7846ec9f16eeb11d929e017eacdfa575868567c6793b2af48df27644c27658ea3fe5c843f445794ef0362debc0b6c8b26e81ae8bec80e55049d6b9002ee0ce6c6ffca4ff083794b3b46c1dccec0008282c7093ecbbce16d805a5054e5b2981ef25ba16e1890a11c5c5a425fef42c81ccedc2a72cb84f0dfa6f92f7a1035560648edd8116673d64f3e0100f242a5bb0ec2eb860996dc0f580e83d04b6bd4fb613095d4d9eb306349d48b0073d2ea00770bf4b1caed3f588382d13f705e8ab535cda87c8b408ed0b5acd2b7b15fe56adb9c12153f3a80e08ba7e27ecb86a5a066990fb1cf9ea5b8d84a1110aa5ef70378ce6d047acdf3c9a788ba11364303914388d7982cc6ae9bbc07294ab7ef520185c46af84ae7d1f3718dfa43aa40c45c223f623f72277dd67e441c891eb8d6bd0ee1017d8ff9863e3bf968b941af768039fa6fde430df582b01528a792990c3488e8a81d36d14e767362859d69a655899edf3ccb342eaab109b6874581a6210dba1794e91a87bda85f12e5567876428b66db75adc02cbc77925937ddd60b5a3793401d96d2c85dbe46d5e86c9f6928ff1ba2742722649ce334a39ddbf1661da5320704429e3107856f10a4826242471010dcf1195ab13bfeb465dbd95b2f35c859ef30b5c6a771ca242ab155e2bc99cad4385182e12a15fd0d094669622f8bde5593bc674a630a08295aadc8d57082b8e3d232ae89cc181c5b27b46025603e0080138e511ae3d0b3a08a30a08f309be49f07225dbfc88dee66d9572681bb3675439ba78781df89883fd2e7af65da2f214fa9ef048e5174971a61845fdd589bba3590938b536d3a4cd799f88df3b9e75fa8fa9b484ae6e3d09454b5b3c9720960b81f39bbf66707f3c201714b4119ff1d141771c61ae112e9afc3b4e96608e0b9df6e3ba5c3aa1cba57856904c922401f2dfa06a1dec3c1928a9c82ba6f42b26542b22e18cca3d65c2693de1a42e604e751b30877494a7bba59cd2a9f9944ecdb8a5734aa6d3649a733ea6a92a053b284c0398d3b04eb9ef76a9dc111561d4cb7b8ad0914fb5b836f76f79b571fd6aa33ab5bcaf530bae918c05f5be13ba753ed0adf361475e9ed679f947a6bc7c4c67081f776908e33ac83ed141f66947aa9950ad4395b609839bd42928ab52d015adcf7b37a2736c1b3e5898d4a1c52d608d2b16933f8ea929b5a6b520aa3fa993e59c4a964de66ef9dc0d9cb8d574ce9cb078d9a1635f2c5e0a8d2757a0a4710aae35e2b60cbc1fd1d38ed4eb345a028a87547420dde61ce789663922ee75e4b12d985b014a4170c8e870f84c85c39256a75830ea0a4d47ceef61b40aba3dae3665e95a372941649cd2c938a39271b9a1eb75b6cc6ec3ba45e0a10cd2a1753e27ee7ee21a70242bc0f83d18714e85f5f2a9325defa49cd649795e25e562179aac713fc5be22c882dc96da48d20b5b3da593705625e1ed1e4858a2f13acd2b068e47c1648ec3c7b23078af10275598799f66e05d8de5a86cc9b3e31fb2e1da7ba01fd4c2464353ed8fceb05ad3bd1cdb61bd7a4fd28e0755549d13e2aa28ddf1cf8abdef84e25c229716204d75dc9b2629fea22016e55a8de4a87a9ce9d09ada7381761a1b50db50f0133c87c02a8f9fdadaafed3af21e435e679608b8c7ec3d782f8cc6751d002ad196a5069f7fa0276e47f288ffbc4990b098dca6e99877eb7d010e13c0b960129c0c818386da4cdc98082a405f2c4fb1bf4ae9ad1fe0fbc36ac2b760123e4c5f6bb468b94f2ceb2a5956dc9688dfe85990efec5d89371d8d5201f082364155a25792d3136dc85f37ce2f8ae925eb893e59c966b2da209eedc0399bb593bae6c963ed74e97f5ed6e4b1acb98c204cba5500458a2b2623459c7489dac410b00d7581b44237efbc132d71e3f471d8ef2476a484ac74d52458290e5685ed73d771de766f03b3c6604b9b82cd1660fbdc246ce8f7ea9d9a31d062a6401b1740fb221c5bbb620eb6a429d84e08b07d190e6c17fbd04513026c5f99846d94c38699f3391d6bb41ef01a4c0be3a6c08b09e07d1d8ecdcdf7a1ab5a026cdf984e0b089b7c1069d0d6464c81362080762d0cd00c5a9a31d0a20268df86019ac1aacd1868430268d74d8286e561b171eede7fb9734c006a319cf07fb90f0bdc5101b62593b00d73d8ca8d77a9ee9051c74c99022e2d00b71c16700673a731e02202702b610167307f1a036e5000ee4638116ea10f0bdcb800db4dd3f6d63c61953755fdb7a19a1080bb158ebd198c6fc6322a13602b8403dba53eacdf8605d8be33095b82c376d4f86d8ad17460cc3d4704c06ebf6ac0fa71d39e646fcc3bc73c1eb0de61c20bb4acb481cbfa1cc33bafe7d25c6e0c1af8c32b0c20257aaa28bcaacbd1cf80f13555901fa6f8d36cff1eed2e8a66a9ed79b767faeac5bb4195a4ddbc274cf96825473f907e93e55f65ceff41c19368dcce90196f82e61de2f86bcd2a9975959eb1ff03ad110f209a450000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset.meta b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset.meta new file mode 100644 index 0000000..b9bec30 --- /dev/null +++ b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d374eaca11eacc34b8d96507df6c6289 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset new file mode 100644 index 0000000..b463548 --- /dev/null +++ b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: b5280742086799a4c8c0a14e90cd913d + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed595b6f1b45143ee378eda4a42d014a5a285010528368bd6e23f18894a46989a021c4715e2a9438f1a672b11bcb76a13cf2ca3fe2bf2185ef9c998937b3b3de38f5a66d6856decb5ccee53b9739332984843f7507b76ddaa415aa509d9a7448cff1b682670797feb2ed1bd4c3f329ee0df4dda15b1933f9efb6ba8efb1abefa34c0cc17b48f674bfa6b14e17d0d73237c71eb017e1146a92226d5e901fd4ceb34afae6590d896497dd3a6582f358dfb32fd89de48846226a174cde356434f5ffa3a10da8e7b42bf8a5a1df4ed634e8fdaa0b92714a79b3c57749247d13ca7f09b31ef85589b194a25f353e6c7efe5587fbc9d650e8e8e8efe0d9420f003646a50974221fccd18a6b233b38dc4a44b0523cc6d613b001c5d10f02055173b0c6891ee7b91baa1666372afc8bd81112d21cacc1c16ff2458b0706d5c51cccc7db43f122f6143b7d053a19ff0e459bb740f867be250d906db365c25a22ddcbb426f1762274766a9c42ee1ced9044dedb11db45840bbf86e8b8435b9ff2e924622fd1ada06123fcf1141cb78be146e49dd7b78f7f1dc3290f965f43b6e5abb0e0f6ba607d086a50fc56fdf59e4755884a12fcd98302c86925dfe4e58e21d863ac904b220681af7741a3dd1769f42fe54cf12088eaf635243ebdf36b1d610413f02e921b543890be6d317abf1b825506da0a5016a1be86d0afd81587498a62d2dabbb1f49768fbba2f1d0238293102c5228cbcecd0c08461980e92da84a6cddc943d52028565921d7acca6756593a77cfd1accb90ba2f3475fb062836c09be92d090757233b63b4094ba73161d5560b0beaeb8415ce2e591ae2051fe2bc52a8bfce05f1acaae691149e11aac23d7a6696a3a41fda656d13cf039182dbf78d8f8fe635da66d3c7f80c6d164af1b73a466d96bf162c52417ce7d27104d7d1aeabb055b1404b3855bcd23087b4f1168bc75253bf106b0781df73df13ee6f163669be3fe5f37d864ffd92abef8fbf1cfa7d73f6d4f9e4b258e55a42ab912b410a6a450f6a5546ed0a6f8b5c71787b33e388c4d2a4100f7cc4f9f3aa4f579770904eb8e4b3353babaa9da3adf5b8968c1bdfdeefcb76ed2406ea616aa0fb02ab423bb8b88af70519f7c5595bf7e0763f8f240dbf03ce89032637975980a43961d9e7276cce0f7c187d7f9c8e4e2e8aeb82c31fc2ef37238546e8a9f4ec607f73087998507ca9e5113e7a698b72c251e7d21d753a4db30f7d9ad51dcd16bd455a76895631b667ade3e3eaa2d7b8faba7eb40d695ae0e7c7a18c4b29567155e4ed61e686ccd0d2879ce754758c25857977e03dbc87dd826c7b12b8d90bc547947e307230b13d7296167a17c7f30fe420c5eebb7cda9dbebc499e07948d46961690e6cc7ce134e565af64cfde0a212f53eadb337a53b6141f33b729bf0f8d9fff34817593c91557793b263022399465836472710b3d97cb5d2160b3fd044e04d9b596004f53d6ad3e2efee34077883f9c98af9d6da14d46c555c9432f2583f6845ed38d121ef2c6493e1ff7f285144f19a65a7f8aac72aabdfe3fcf8255ce82371884924d1a554e1a9fe419d9b3622f6d31bd28ebddcd0ee07278bdcaf1cecc8948bf741a45ce12ed0589760ddba779c2c6d552d7a96572832bc80bae2006d7cdd7e365d5b710368ac1f6599eb05d71606b611a57c887b217c811ba725ed0a918749fe71da00c9da5982b5c97f3826b2a06d717e701d7d65b0d57912e4cb157e521b748ffb3de641caea1e68c2e9c3f1f5324b9b469b6cdc37a2ae4231bf51d8db7d9184d33bbd8f99262a5a06383f6c46c308902cea7e9ab1473b323ac12b2c92eb4fe5fb96e3a2fa57e1d96d7c4f92cb027b5524fc604ff0191c95a1c12240000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset.meta b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset.meta new file mode 100644 index 0000000..eafe6c5 --- /dev/null +++ b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 944314b84893a044eb53f8173e8393f8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset new file mode 100644 index 0000000..bf12bd2 --- /dev/null +++ b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: b8e95bf9755820c4380659898968aaf5 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5c5973134710ee95b592251fb27c201b42422e10012419732440487c61140238be5ea894b12d1904b67149b603794a5ef2907f94aa3ce667a58a74f7ce4aa3dd191d96c64204a9b4b33b474ff7d73d3d3d336b07d2801feb325ed66009662105ab908357b08777b398eee2d77972f317a188e933bc6e60d9653857a7257d2e58e378cde253090eb0e5216c615ae0f265c8e37d16dbe6f18972b7f197c75a56101badc21c3c864790b0c6ea9058e346259167915c562f5e67e00d96e69929ea24cd4509bc2c634989cb769169b7de13f899c5dac5b22d6c53841da4b9c9147bffc1abc532713204e5478848f796f885f03722ee0322ed116950948fe2cf7efbf6edbf227f58a4b644d31675c73c75e3220d4b75c352dff43b253d07058b32efbd52db88a89790cae4fc718717a621f3e1d28a4ab4a222ed937050c93928b51914e9806833213d53da2ff24f4bcf24d3df1e9a3189664cc64ed4653e6c8b2dec3eea7c03f621cd0aba088d0f05b765fd4140a44301611c17b8db0334b77d24a0b0c455b6f3039882ab4a4b9cb0fa25be67f9ba81350a4c943af374f197af0b626e07bf79691895307f8147210da40296a4e0474ca9d55398c481f1c443650dbbddc1a1988715bcee33bda7c8b6bf663d9168c879db2c214dc723ec628e0be83e3eef3087cb7c3d624ef3cc7d16f30ed83feda1879ac1f435f7e697bd88f7aa3e5704646a1ed58e4197efb81f574d73280d719fe6f1ff41239dd008411f3a238661304d63c4fad3a7890f183a4e86269daca031e94c6b557957214d8fd68e0fc1e665f44be8daf72ae6398e6d9e4b0b3c1aa88f023fe590579ad8dfb014bada8bf09c39a41e4bf0905b1c3237aefc6a34c944aeb0d415abb0ab619882344d2fd6477560a8a504a297b43200c6c5b5ed608684f2aad752a997438915a3eaf5c660afd80d92cbdcab69ae6a7591222e79d465f9f49509893029c97169b32ce8200ca820e408ea77a310361aae2c70c49ec7707a135e8879c6edf7151b0e71e4ce574b986e331794bf250cb7765fb595d35bc6a7a29c344769f34d045de6a52096026c2351b691734aeedcbb19a4f91cfb3ae239fb107b52f560db6a2bece31ede2df975f6dda3b26f8ef27feda87d3b7330d1dbe630d8a1f7086851f80bdbde4b748f47029915ac53c43ea8b4558ba630fcacc7a2dd8f5adf03acefbb0de8dba4543a0d07551a2613b5964f701270ea15b85ef353c020afb03c5300397b1a0a9bf8480ce634ea89b17afc2bb27a2ce900b5558092d558a5130a9a52308d7d93e1382eea19a6eef2c2cd7dc8f49e23bd43c9dcaae38b5a746a2b64a891108ad18f33fa37aba2a093e05fa7bd90427b1932a56145980176c42313d5d4500eabec823739364fc4952ee372f401b298524c1d255e0251bd45a6f992174115a7e2b6adadf59186b53eca5a3f2fb9c47670a7d369af4aa7f438a662d8ab525bafd2884aa5bc9ff5a223eba39fb08f0d3183ec0943afb5647015d7f8da8836167bbcf11c79502b556321d30ebe2822f35e34015682adcb34433a6b8beaac6dbc456bebd3b9a689565d53bf8ef2e956290fa828d3783c03fe854186c6132da99d48fc6c5d35aae2e2e6d5e893a74f2fcfa04a1e82efe346941bd7138ee9087fd222e1219d399e6bd11ce32ac2a4ef4f1b213caa273cac83e2b316a118511126657f0e8af8715a6b78fe7d9914ace3b7c4a1f83a6fd63e10757745ccb1c53564a75abde9e02d5dc332eac1275f4c2fdfa84ebe2f54f2fd01eeeceb2e18e4e5826a29922dd7ac2c429678d8e591d723ae9d129250690e291eb2444457b78ca1facdf1d1c882a81a4d39966f07d2633aa4bf54217dabca9228265545a4b5e25a07d599f24aa6ba6e3b243aa593e8bc4aa21b65db71632f55d4e68fd91c395c0d65b10e6d5a9044b5474733922474925c5049725b3bca55314235ff05e9009b5a5359e3b49a91695c27535225d3bd637b2e0a370f249b6c4ea276d8e1844ed28b2a4917da34b25c8d3e5304147a0c54e14733b29ed6c9fa954ad639cf989bc122d25bb537747c9c23158dafc758e21c253627c771c66318bf964502ccf3a82862fb45b601c71fa43916c940fd8d30379f38d8655bdd61efbec91cd4dfecba04fab3f76d68d731ecf1b6f3b24ae91adf96f41f398785442e2d449a83b3f74d527a6529640bad06d21c275e3aa635d5e7e20af5d6a3b6a1e6770b1d028fc448536c4ed6edc1bbc8f1f6708509b8278e6d78e184789c46ce72bc662ae1f78e0510b60319423e65121ef221eb58e4cc30ab483527eebb01a6dfa00253da244c1186c97943af1264750344bd9225654c421462884a1cd514f1da0de0ac48f63369da0b39f633c7a15f77d80e303c61db43fc5edb66bbe31d4df9e7e5184742af795554647a39ef3ccd5b12ef1ae757e57936a9b092a46f58256bb8eca4c64f2515b360258454877e190a21a7fee7d15d86a2bb6b04c2881b0cb1afb86ede579016c901aca3d7f6f4d0cabb50912aaf71b611f68fe3390624c77ac32458fd02ac02ec8941e2bc88b18ecc1a832d6e0a365b82ed666760bbd985b0c524d8beee0c6cd7ccc1669b82ad5782ed9bcec036690eb6a829d802126cb74cc2d62760f39e5f189c10c2a6400b49a0ddee0468062dcd1868fd1268773a33406f74e1743028c1f6ad49d806046cf9f2c1985b647490c64c01179480bbdb197b9b3207dba829d8c2126cdf75063683d6662cfc0009b6ef4dc2465d97aacea2bacfa70d4b604d77c6c6ae77a18d4525d8664cc246f1cdbe7e6bb80bbc585c826ad6245451616107552f9118f46003a620eb91209b3309196deb51f5ea370aba6f380e4980cd9b068c6ceca87caa6f7405903005584402ecde4903d68deb4c4b026ce1a40133b8e5680cb03e786fce7832b4497f5f567a52e33993bef93aa988129d2392b84082c2a0873c596d8803970de9b824cdaf8456ded66bec1d89da34eb9f656449584b6de1fe3f1cefe4f98c4ad256ce6afa6b6825cd2f8dbecff2ff00ce7f5de10f996982f7bde4b3c0c75839c74cd1c7fe0fa88850bc8c480000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset.meta b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset.meta new file mode 100644 index 0000000..318080b --- /dev/null +++ b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: efa643e1c9dd4c346b616ea40ee76a73 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset new file mode 100644 index 0000000..1a558cd --- /dev/null +++ b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: c8df303ceb45ae84f85a11591f741734 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5a4b531b4710ee155a24210106ec801327761227c8e1b10b54e59043628cf3200fa02c2007574ac86671618b472139766e39e71fe53fe59863aa4877efac19cdce6859a41111b154dad5ce4cf7747fddd3d3d352c6037c39b378d98647b002f3b005bb700487f86d05ef07f80e9fa2f60d38c1fb33bcd6b06f16ee2450d26bda99c2eb2a3e35a089942fe129def7b9bf02017e5f45da009fa8750f3f018e72b248b4050f611dd660d2b991c0629b891aa2cd21bd9c3c5e1fc06fd81bb0503489c75d9378a9604f83fb0e50e868dc63f885d53ac0bea748730275e4f98439e6ff265ad629bac1207e46a467477ca87d547a266dfe12df330a5d46dc8744fb35a59d680b4a5b518c1d53da0735634ba27d5c69cf6bc60e8bb113f87185cceee9e9e93faec316f90e31aac131784c702f85eb4494c94ec3f86404a0d33c6d13cd738c0c3496db62bf68c2122c6a2d77d3294972aff0b58623f699294da64cf1676c0a12ae8eef4072bb06b67fcb5e4b8eb78f3df3f023de896a0716d0911e2b5cb671da3aba6e009b783d667e3b28767c64924ae4a22acd23e419aea0036c89003dc6e73a4b58e1ebaf2c69c0d2af625b93d7f321aee807787fcdb3c5753fc1efba393705647a19f50bc9d41e2ed7c84c0f511b92de1b20377b6b91cbb008413f785d2cc3ac476bc4f9236689b7188641c6e50d2ae4b1106e052d6d8be0d1a3538921985ec7b8867aff5e47c99e8b35d24e1b3d3664f039d6e1ccc66eab524be0d166e1dc4a50aa1da4c4afac89eb49c2bb6ed6271155e81d1df4396adcec21f4d477c45c6a38363df804eb8c027e1c7d9f86e518c0294d4a93248209c28c0e420acfce8e5508a3b4a082f1ff07ecabe1f880630cb56f20c71ace4dfc967986b354a295a23db4f9f3f8b51f255265e7ae94e4742a9909f1011de2855ec78b0ad2d0987a42f4d3e34ae9eb6dd565c1e4b545c3b24f92c184605683a09f17d96fccdc05452482dac0d8d5312e885459abafcabc68663e68927aa443a97326a947bb2075de24f5b50ea52e98a41eeb82d44326e6e35ae6f7efa7615e34319fd04b9e8a79c9c4fcba96f9efa9980f9b98dfe882e423bab836d4fbb8d6e413018d4b1fd7de013a22b6e2e07c09a00df06b40d588574cfa424c390f557c3fe39e2a1e498e707262246f1b3442c7cfb4c1e883eaa431a8b607c014544775be41e69bd261f28501932d366a9d4fdcfbc274a4ef2a7e0bc9f761975b64a9e5fc4fed6b4d6d620e396976c86b268d6eea345a366864b2cabc90942cfdbd38c2aef2f5258e254a551379bb53fbb6514742268d7e6326fdded5e9f75507fafdcc6c5ee01365f681c682ddd66ddca4db7b6956e879740b4351ef349b306976abdb5e1946821aece1930dfd72f8761cda11bee6607e82941b4c414f0df078a3f4e1fc75439afb006301adf74d94fcc99bd4b03d87f7c15c45dc8b45c88b169492b4084b1e44bfc755c7a848a1d32e592773f12c27348a7821d29c355c354d3f20ab46c5f68cc7c9cbcc05bd29598adb34db80de87d2efb2218335fee90419d0865d65f21a0e6926f34faa88cc3183a8d6d285c23939d53202b3cb795003dff4a225ae30ffa66b5e76b1c42dbe1e463902bd46f18e185c8a72cafae0dcf4bf26f91dd9bfcb311f390baffab0e853d787fff3c8e753e4fb8840188902854f81e2639babb9c496aa324168af4356ba8aab4b99ab936a69a1658d17cea3c845d639d715dd10b6bb36611b12b0851353964cd9be6f0fb29c2dc81c09b24f6c42567ce369ad070b8ba0156d81362081f6a96dd09e6b4f64fd07da9004daf4e5c4b4853e8c695909b6b24dd8a8127aa29c20fbcfcb4a125cf72ec7cb96fad0cbf2126c9f5d0e6c1637026bb06524d8666cc2461abc8a95aefa6f791625c0666def9ce1bfeed4aa51ff81362c81366713b428ad3d6a29625b5c98ae2dc840826cdef6c2acf261f7ac2ad98f29ad2b01e6f51a308b799935c07212607eaf01b37838b7065801ae4c11cea70a0dfd5d6e302b8c5e6e73542b1b76efb236e52eb7d9bac23ada98408c12a79f20e0246a173f743faba979fc2be8e790aec8dc9e6772c16b11a442a062e97ad72cdd8d229e4ed34e0a7aa53656f1f8f7dbabacff12847fc0171b6fce9d6437de42cb87cc0358c7c1bb2c14bddc7f018e249ae5c7310000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset.meta b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset.meta new file mode 100644 index 0000000..b1e23d0 --- /dev/null +++ b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c5381b39793f0f4b9ca3351a6ab472d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset new file mode 100644 index 0000000..6e7dd69 --- /dev/null +++ b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: da113172081f2ba40b9cc46674a846d0 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5ceb53144710ef3d590e8e973c0f05a3891a310a7b3cd53c4c0011898816afaa94953a0f38f4125ee1c0987ccbd7fc47f97ff2317f42aa4c77ef2c37bb37b37b0b370718ef8adddb79f474ffbaa7bb676635e1007eacbb7859854598862158810dd8851dfc358df76dfcba4f5ef90bd8c7fb6bbce6b0ee2e5c8be8499f5b562f5ee7f0a90807d8f310d6f15ee0fa25c8e3ef39ec9bc7272addc4bf3cb6b2eab0d30a3c82e7b00069ab3b82c42a772a8a328be4b21af03a05bf616d9e99a2411cae4ae365096b8a5cb78d4c7bed5ec28f2cd636d6ad639f7dd8429a6b4cb16103af16cbc4b77671a7711aa5df96f8abc7bf2ee999fe2ec21109aeef969e49e2bfc5f30551df233d5ba20d95a74378f0fe9252992df124f3d72b7e378ae74ba22df161bf7ffffe5f51df21ee2989a6274b93e87b596a2397f705786d9168b448b4a86dbf37ae6db1053c419de4600f9c0435bc1dc354bd9ed1464aa4eb134209b778d80334873d24a0b09415b6c303188511a5a55cb29a25bea7f99ac31605264a830586f8ab6c08626e0bbf79c9cc8b583ecbb3840cbd803543308f77eaf50a86d1705f06a8ace2b05b3855f2b08cd73da6f70ad92e6f1925124d89609f45a4e9ced86d2cf100ddc3e72de67089af6f99d33c733f876507ec3f76d0834ce1fd1d8f562efb3efe568db92c2053f3a89eb8ba72d73d786a7a84d210f70ecfb38f1a390d8db0cbbbe2f94287e688f56799263e62e83a199b03a24b63d80d49beb21170d8e72f9721185fc67209d5f64d75bb4c25876dc3e451a3432abfc35294b40cb65fae51703886f547c815862ad11be0ac242effb65d97212e83f85b2afc29fe5a4b35c47f09fb509bad086b52a34fb05e0da20f0a0564ea457231a0088f513ce8104c2810cc244566a364ab31c01635d610bfa0520fa76aaf8caac7cb3b9630c03cc5ba1cb6cfb313a3f2174831876313bd491ea194abf87b842b8e72a9c100426aa5a5586937a42ceaa49ce9d459a7429c93be3f6a8278547638cb0b983cae2ed6e02711d6bd717739a413475e7ab088f74de682cad78569878f15aeb3a6237c4a3a7338719e8991e39a978272d904db4e0bdbce10d0aa6c4764b333ac81028f34a4e48646d0b5f7b078c66bb343d6b66dab2db795473f5bd8e86cdf56b932b2fd3685d23329b1fa71516e6739af29e5f47e4d61b73748e02d27a287c8b38a574432e8215bf51eb25e355f9b6a1fc00e3895a676f10358072fdffcf05a244391bb6f305b512eb2531bd7c259d3194352056c73ad810d4ec978c076551c60ba35e8458daf43af41851eef19e48ca2a77359b4a6a07e257b0a7370d43a1cd99e8a914d33b23743dc6f7cde74a837ea1c58afce81d1b6518a7c572ca793526997da5bd953d4ee32fe7e1711baa2357bb962cdf6b166af476ab652be745a6d5269950afb55ac06d5d8a95763b38a30f93d5acc9f34756f5111a7c24f2ae13aad27dcaae3fa6a15b86e531127acafa9621425e413701ffb6df2fd3ede07f1d71a64601c7f8dc13d78c0656b38ec38960e629b31fc0ee3d338ef704ce07d02e77d1cc55dd441f069152068d729eeb3132aae434598b479bd12c27d7ac29d2ac264dc372a21dcad27dca5b3869b2a6b18d47a8215de6d2af9f721c8e2f735d00148167d9f47824a65af24afc9e3d847b78eefcf557c3f0ef86c795497d35df4d759de95cbc32fd829c7b29094611c87d5f8ebfcfb377124edd1497a4b25e94300e562788135f12b47809f059f7e1dcd63dd3a139297d8d442454fb7188f23595a27d9804ab21f624be61ebf3dc7ba9d63c992d5d8ba6af916d4f72af25388e9f37a7578dc56e1913fc2c35b56c90b40777f9964d9e4231eca3be68e5acee08c7417998bcc7f1e797d2bcd5b1739ff892a0d4dab8c1c4aadb2707915e2afa9364e9774387da1c269de204e8bc25be4591e37cf2b08dff13bdebdf3986a487d5927f51d95d437233dde32f2e0d7995e9f71f8ecd3f17957c5e7446844f1f24a97e3a2f05407a234dc024f8e78bf4e924195240f62c6464f9aca62633c7992f8b5787f6186ad771f7bbee01ef454048793c00c54be6545636fe33ca618b67ce403a237a268534e7780bd09d53acb8ce24135cb87a4792e4b57f9f669f9b96d5248e4d142a43991fdd0247564ad261ccea7ef1cd39aa2b9203badbfa0b6a1f8bb612e810511c32dcace9f63e3d24c9ee61dcc1d4e8c36a2c78bda3f1a6402de995f15dee120239b44ce3678315fc42f7d927622437a18360916652859d6899b0dc85065357b99e701c07f18c0a41d201e5c3654eb658b4af792cb1d4c1bbbf4777c4eb0cff436820e87d7a0678df311d9610c444eba8163595a29eaa9a35586d01bfd9f07a40c05a43102a1cbf3dfec37c64dfa8d246b93f449533d8b1e3d30c2495e9968f4f987964ad83f8e8fa8939cec8449b09a05580570df2925b35f67b31f31075bbb29d81a25d8ee9d0e6c63e6604b9a82ad5982edbe49d81a046c3ba2c0e8e4ec3405579b04d783d3b1b2e17338396d09b62f4dc2d62460f36f831ab535db14682081f69549d0520234ff3e80413b33e6cd1212645f9bf6668758216fb718832b6d0aae7609ae6f6a61617bbe1d7f839332650ab20b12640f4d7bb28a16bae7605a5e9440fbf674a2e6a839d8fa4cc1969260fbce246cf5c29b79dbe0e70faa0e09aac9d3b13083decc58006890609b32095b8b808d063ee0f735776ae1d1ba4d01d72901375d8bc8e9cfcd0cda9ab1206049903d3a9d293a7e0ea7688b04db8c49d85a056c45286de32d9cebc57abd04dd6393d0350ae8e4235683cb276380354980cdd61a308316662c0c2425c09ed41a3083bbb4c682402b7c30076019ca39e7c077dea4da1618284bafddf3a376213305a7679c16e5b0478eefa5b32487dfc8a473803867dee134a30f7abe27b12cb52d6f554d57d538bc52497a9283ace610ad38fc12eb872cff5359ef09875f7e1dae82ed4573340f71fe030a537b29674fb7eebb917bdc92d83c896dd35ac24fafc0e33a3d67d3aeab27fb33bf5da78f6bd7f1395a3069d72eb5370c7f80f66c05d2a9f51094b9d46a8feda1f4b6a93bcbdf00fdd3d56824ae583d0021d426f1e935cb5a60aadbe07d92b6f74df3545ec1beae67a177a3f7c5a4a68ffd1f253bed9bd0490000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset.meta b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset.meta new file mode 100644 index 0000000..2bbef2a --- /dev/null +++ b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c33a48de6fbe43b4eb491cac621b1ac6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset new file mode 100644 index 0000000..bee97db --- /dev/null +++ b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: dfcb9d6121fc4084e97b5303b0054618 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed57db4ac340109dada6515b101fa4fae69b08d254053fc07a2b78c35e5e4430d55402492d4914fd34ffce339304355d1b8a8a524dc86e7676e772e64652b008975ac7d0a173aa5395da744377d4c75b1db38f3b5ea5f4330a30df62b4b1b74e2b399c7cadaa258c0dac428ac0794fd7985dd96f9283f706781dac98dac3e3e0949a06539b76e9944ea8a21673447484294c688a71a9198c3bf4845d478c6225966c553034b113ca9e0fa3d373177429b07cec5d8327200f32bb227146dc85c75062dd21cedb3420abc0f4b531dc9872e63b9045170b448927596d04530710a041d1161f45b4459b5a14cbaafcc6eeba8c364eb822949565543c0fa960e33cdcce9b1084a01f480439082e76aa748499b9ae68034ebdc848e940ad87303ad4c238107957307bf8641e240e5796e71c32e36cf241491d3ac0da130b9b323e88a58e58df002d92dcee23bb77303f8ab661ec01de753a5b89cbf436ea93ea237a9cba6998768186adb7a638cdfe23f2131161d717932a24d330d1014a78db135001149de1b02bab902c2e21551ba31fb0e13ed470205b084457dc92df1da6477487de97254a1e8a381d98bf27dd240da00e5d3ea68f8bc24c10a5b2e069833d3d69488df7c99689ebfe373580b8dc5c29b7f19ad5bc54c223cc632acbbbc9c689e1fc3acb8bfaa2d617638d8360fef17aab19c967d064a5678de1cc0e67c34282a50f89c7f2996983d796f935332cf693da1eb3dd8f96991fb6393657e953d1fb55a9a843fa99b42c8f888ac5c939d1f84bd934ad48d36a23f2b170077f4c81fceb0472c67801bf86115ae70d0000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset.meta b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset.meta new file mode 100644 index 0000000..2aaa56a --- /dev/null +++ b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d5fdcd4b33f8b194981c0b246b4bb7c7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset new file mode 100644 index 0000000..f82c26a --- /dev/null +++ b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: fa52d8b703fd906459112715b1ef1f3a + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5a6b5b1347149e0db9ca1d0482a0606b6b2c4a02586b6f6a00b178414b807ef0e98311824d9f707948b4dacffdd47fd47fd07fd48fed396767c9ecec4c964d76a2a1264f76b36767ce9ef73d67cedc369265f0b1aec3618badb32536cb36d92e3b6407f06f09cefbf0b5af1cf933760ce757702cc2bdeb6cdaa7267eae5a6938aec25595d5a0e66bb603e732dd2fb012fc5f85ba25b842e91efc4a50ca8a42a54db6cc9eb23536668df8a8d8a24a552eb310979584e3227b07774b64143e244bb7c6e050803b55bab70f463be59eb39f09d63edcdb813ac7ac023a5f92c6e41f70b408139dfaf9b98f9f07e01787dfb0708d286ec32f06a223a97c172f7f5e9247b97c4492c7b87c5492c7f96f8c5f27f87990cbd35279473e2ec9935c7e4192a7b87c42929fe3f24949decde51725790f975fe2d7bdfc3ca4b1d3914ff1eb08b705ed8cc42c8a901fc0674576c4b278d3ba1620949d9afe418caae311dbef10cdf8d81a84cb11285044d226c5698d2db07965248d5b3d82dd4b742c428932299df63ee22fcf23d0b80a7c4b4233a882fc01b5226c0865b833cb1ec3196bbd607310d8cf252d5bf0d80a34a512db80e311e97b01667b4bfa41c22623d759079d768bde078943e8115c57c8c2021ddf90a525b27e156435ca2f07906116e1fc969ee6c57e0cff55cfdce094a96d54376c9ddc4e1f8e9b96010d5a9fc536fbd123efc523942ea779338c66b18d587f7a3cf191433bc96067b1ca75ccd95d964b36cfb27869ad7b180c8ed18b501ddf36dfb7d8cd8658d4cca0bb270841ddc35d77fe99b91c7dbc1873435b6059ec36ac491f688d88457d196bd4a3a13184582c9a434365fa2d15fdd44d17da48bf5dae4ce5823b204e3d93db01168e209d4eb3c07e811bc760ea2cbb0f4614c9ec0a3772932055a89b2b73d94ffce1bb2c0fea76296fdac3b91a37b3ca3cbecdc5f91027a3e87cfd20ea1c14513928d96e07f967a4460e4a9ee0aa3b083f6a06531a06fd6cd031d8a56230d5fe10b77d5ff1c9976a0671403be561f028af66b05b1b838d6dd031185530984bf171b3d7acbff3b19464165aa4511ed329ef552a073d0194c775cafb42509e5005167acada686360e1bd43d25284b2c1430be78a333213eab81aa0b84a7bc0f99ba08baca4ce3f834aff4c078aac944ef9905af96210e5e774ca874350dead537e3e04e53d2ae50867441909b2e601bde65e9de6d15635f7a99a1ab1f4c2685373a6df0598673d827b45285fa2b13cca9f81c6223c1bf5e5e909f529bbbb46e3268899fa86448fba05a6a9055e612c34cb742db35fe54beac899b733ff173e1e77a6f4ee1cd005ca8556036550a779a255cd433acd93ad6a1e5669c6ce0597a93c03db8513e7bb1da973fc2cdb86ef2b1abc6ed324ff3184dd0e29c43b6248ba13b90743428fe1bc0ec3251586bb4d6170d6530f79d37d00a5704023a3108739f23dbbf66e206c233a6c532a6c2ba1605be6cb31e807bc5ea1098c69a4a33aa4d32aa40f8c205da3e8338f754c87f5b20aeba350b06e51eb7a4d1d538d2fbdad434d9c60be067da631a775983f5161be2375adeeec60233c04b4db30353b209fbd23efbd82ffce5263e30c135efe19d721fb54856c29146f621efd8dd6c8ab0adf3546da8cf72ee8305e5161bcdf02c63c0c8f8ad4268f85059076e5db091dcecf54381f868ed3ceb5ed6c97933ac49f879d8bd4889d9cdb4ecc177598afaa30ff183ae6f79d8b2fe9f06754f8d70c44394e3e308f15288761c6f61f1386817c4a87fc9a0af993d0912f917f6b342dc4ff3819f4fab415dc09f85a16ce4fefd354147bc6675403afaa2c4b73f01cab4fe3fcf684f1d9fbec2559b40116bd3c59c46bace10ba6df21de63616d16faa1b0176eb1fe1eed283b1b502a74fe98f41ba3098ec8d1054cd39ac459433a835ee5ef7bb048965647669a8c267f2bf0359c78973a86826f74d80ad668130614e03ac336b3dfe0a937e587bcb194c020df273e05adbf724faa9e788314387b6a21bc2681619607cb7669f506077ff8c1462f295f092dee9adb2ff3b6907eca496fc13c94d68860a9c5d0cacf8766f90d31e233a7889a7a0a56a7ce1ca6e0d9ff7976cc6176c49dd2f8b0934c72984c72265b3c2ea415858ef9091cdf2aa619d2735bd9334fb93240f769403593059294056c0ae74c5288de7a23ada03881ed9e951a2371c014890981c47993248e4b71280f8877f880b8cc7e1716343a8fd01e81d0059384f65252dea607efd14cc2d15df676e3e1111733451c1388bb6992b8514edc0eef526ad26443347e1b92b3312a53a6a8ec17a8fcd2249529576674d6353aaf2b890984dd3249d8888b30bf4591ce23322e10f995e93ed93bac51adac751e89e704126f9b2411b7111b8dea45b9311ad3a668ec1368fcda248d97798762af371d505f7c4c4d1a57bb0e8052fba5f1b3d6cd440482bf314970d29535573ab493890a747d6b92ae7ea61b191ef022c6c84b9822cf12c8fbce247969a963714ff7d48bd99d374be915e8fcde249dee1162e72e36740984dd3149987abdc6bb49da7914a6040aef9aa4704cd11f37da6b32d8f71a6bc0030299f73e2432e73a90cc4181ccfc8744e67c0792392490b968924c7945d1ce94676f4eddcdcecc6e570e8be0eb60f16e1e1419cd0821a31cf4cba59df97e26e0c24a26c09a7ee6d45b28ba92dece3b1360fd22d364a07beb9d6ec93dd3d410d8de001ce43189ef963e21bbd01e5b4f7d33304b2fa4e33a5b901df4c63afd77ea9699b0a729b5a54a686d298cdd4715d25676227b1a78254baff09f65fcf866669cbb9dc2748cf6a937c1f3b6f2127b0a8577c928fcc4fe035c3a8e7110450000 + serializedProgramBytesString: + serializedSignature: + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset.meta b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset.meta new file mode 100644 index 0000000..9990ef0 --- /dev/null +++ b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b43f06441bb6a484aacd0ab9f9679df2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Silly Home.unity b/Assets/Silly Home.unity new file mode 100644 index 0000000..5de21cc --- /dev/null +++ b/Assets/Silly Home.unity @@ -0,0 +1,317 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &743971517 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 743971520} + - component: {fileID: 743971519} + - component: {fileID: 743971518} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &743971518 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743971517} + m_Enabled: 1 +--- !u!20 &743971519 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743971517} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &743971520 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743971517} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2105906646 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2105906648} + - component: {fileID: 2105906647} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &2105906647 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2105906646} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &2105906648 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2105906646} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 743971520} + - {fileID: 2105906648} diff --git a/Assets/Silly Home.unity.meta b/Assets/Silly Home.unity.meta new file mode 100644 index 0000000..6fa2740 --- /dev/null +++ b/Assets/Silly Home.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fff8aa54e982fa54a9e37881626536d9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp.meta b/Assets/UdonSharp.meta new file mode 100644 index 0000000..189b239 --- /dev/null +++ b/Assets/UdonSharp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d134aa02190289a4193fb860dbb1ac64 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UdonSharpDataLocator.asset b/Assets/UdonSharp/UdonSharpDataLocator.asset new file mode 100644 index 0000000..d1f55cd --- /dev/null +++ b/Assets/UdonSharp/UdonSharpDataLocator.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6769ed80171cc314bb08688a48d812a1, type: 3} + m_Name: UdonSharpDataLocator + m_EditorClassIdentifier: diff --git a/Assets/UdonSharp/UdonSharpDataLocator.asset.meta b/Assets/UdonSharp/UdonSharpDataLocator.asset.meta new file mode 100644 index 0000000..b48f852 --- /dev/null +++ b/Assets/UdonSharp/UdonSharpDataLocator.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af9e39bf8956af04781531720b839597 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts.meta b/Assets/UdonSharp/UtilityScripts.meta new file mode 100644 index 0000000..38d333b --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02c97cdfe39df484ca97818fd318c469 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/BoneFollower.asset b/Assets/UdonSharp/UtilityScripts/BoneFollower.asset new file mode 100644 index 0000000..1e1a00b --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/BoneFollower.asset @@ -0,0 +1,214 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: BoneFollower + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 0e3dcc3af12eb6f479def8b92b0a0dc1, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: d1a6820e86752e14d8227ad846e6ab81, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 2 + hasInteractEvent: 0 + scriptID: -8649896170860527834 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 3 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: trackedBone + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: trackedBone + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.HumanBodyBones, UnityEngine.AnimationModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: playerApi + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: playerApi + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: VRC.SDKBase.VRCPlayerApi, VRCSDKBase + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: isInEditor + - Name: $v + Entry: 7 + Data: 8|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: isInEditor + - Name: k__BackingField + Entry: 7 + Data: 9|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 9 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 10|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/UtilityScripts/BoneFollower.asset.meta b/Assets/UdonSharp/UtilityScripts/BoneFollower.asset.meta new file mode 100644 index 0000000..7884603 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/BoneFollower.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 33324f447d661da40b534c9fa93c0ec2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/BoneFollower.cs b/Assets/UdonSharp/UtilityScripts/BoneFollower.cs new file mode 100644 index 0000000..d6e760c --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/BoneFollower.cs @@ -0,0 +1,35 @@ + +using UnityEngine; +using VRC.SDK3.Components; +using VRC.SDKBase; +using VRC.Udon; + +namespace UdonSharp.Examples.Utilities +{ + /// + /// Follows a chosen bone on humanoid avatars using the playerapi + /// + [AddComponentMenu("Udon Sharp/Utilities/Bone Follower")] + [UdonBehaviourSyncMode(BehaviourSyncMode.NoVariableSync)] + public class BoneFollower : UdonSharpBehaviour + { + public HumanBodyBones trackedBone; + + VRCPlayerApi playerApi; + bool isInEditor; + + void Start() + { + playerApi = Networking.LocalPlayer; + isInEditor = playerApi == null; + } + + void Update() + { + if (isInEditor) + return; + + transform.SetPositionAndRotation(playerApi.GetBonePosition(trackedBone), playerApi.GetBoneRotation(trackedBone)); + } + } +} diff --git a/Assets/UdonSharp/UtilityScripts/BoneFollower.cs.meta b/Assets/UdonSharp/UtilityScripts/BoneFollower.cs.meta new file mode 100644 index 0000000..fe7b81b --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/BoneFollower.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1a6820e86752e14d8227ad846e6ab81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/ExampleUtilityTemplate.txt b/Assets/UdonSharp/UtilityScripts/ExampleUtilityTemplate.txt new file mode 100644 index 0000000..c79bfd1 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/ExampleUtilityTemplate.txt @@ -0,0 +1,15 @@ + +using UnityEngine; +using VRC.SDK3.Components; +using VRC.SDKBase; +using VRC.Udon; + +namespace UdonSharp.Examples.Utilities +{ + /// + /// + /// + public class : UdonSharpBehaviour + { + } +} diff --git a/Assets/UdonSharp/UtilityScripts/ExampleUtilityTemplate.txt.meta b/Assets/UdonSharp/UtilityScripts/ExampleUtilityTemplate.txt.meta new file mode 100644 index 0000000..b859eec --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/ExampleUtilityTemplate.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8b953b0aef25b204eb36afc5968f41b7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/InteractToggle.asset b/Assets/UdonSharp/UtilityScripts/InteractToggle.asset new file mode 100644 index 0000000..51c1421 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/InteractToggle.asset @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: InteractToggle + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 1e7b5da86dd8256419b9786129df559b, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: c145dd4792c31da4b83d542b11ca2b66, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 2 + hasInteractEvent: 1 + scriptID: 2484734778703140822 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: toggleObjects + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: toggleObjects + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.GameObject[], UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 5|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: List of objects to toggle on and off + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/UtilityScripts/InteractToggle.asset.meta b/Assets/UdonSharp/UtilityScripts/InteractToggle.asset.meta new file mode 100644 index 0000000..d253885 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/InteractToggle.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 75f3b7bb830f4324a8b2f49814f3493a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/InteractToggle.cs b/Assets/UdonSharp/UtilityScripts/InteractToggle.cs new file mode 100644 index 0000000..04daa23 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/InteractToggle.cs @@ -0,0 +1,28 @@ + +using UnityEngine; +using VRC.SDK3.Components; + +namespace UdonSharp.Examples.Utilities +{ + /// + /// A Basic example class that demonstrates how to toggle a list of object on and off when someone interacts with the UdonBehaviour + /// This toggle only works locally + /// + [AddComponentMenu("Udon Sharp/Utilities/Interact Toggle")] + [UdonBehaviourSyncMode(BehaviourSyncMode.NoVariableSync)] + public class InteractToggle : UdonSharpBehaviour + { + [Tooltip("List of objects to toggle on and off")] + public GameObject[] toggleObjects; + + public override void Interact() + { + foreach (GameObject toggleObject in toggleObjects) + { + if (toggleObject != null) { + toggleObject.SetActive(!toggleObject.activeSelf); + } + } + } + } +} diff --git a/Assets/UdonSharp/UtilityScripts/InteractToggle.cs.meta b/Assets/UdonSharp/UtilityScripts/InteractToggle.cs.meta new file mode 100644 index 0000000..c75041a --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/InteractToggle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c145dd4792c31da4b83d542b11ca2b66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/PlayerModSetter.asset b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.asset new file mode 100644 index 0000000..e293255 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.asset @@ -0,0 +1,361 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: PlayerModSetter + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 200334ef9d2bf894d89a7cf19941c6c7, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: b8c59fc0a015dcc4b86d7e90312acf63, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 2 + hasInteractEvent: 0 + scriptID: -58344667080892347 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 6 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: jumpHeight + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: jumpHeight + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Single, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: runSpeed + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: runSpeed + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 6|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: walkSpeed + - Name: $v + Entry: 7 + Data: 7|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: walkSpeed + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 8|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: strafeSpeed + - Name: $v + Entry: 7 + Data: 9|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: strafeSpeed + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 10|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: gravity + - Name: $v + Entry: 7 + Data: 11|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: gravity + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 12|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: useLegacyLocomotion + - Name: $v + Entry: 7 + Data: 13|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: useLegacyLocomotion + - Name: k__BackingField + Entry: 7 + Data: 14|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 14 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 15|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 16|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: Enables legacy locomotion which allows stutter stepping and wall climbing + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/UtilityScripts/PlayerModSetter.asset.meta b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.asset.meta new file mode 100644 index 0000000..f393f91 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 667c46fd2864a124ea921d98d4914fe5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/PlayerModSetter.cs b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.cs new file mode 100644 index 0000000..1b5669b --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.cs @@ -0,0 +1,41 @@ + +using UnityEngine; +using UdonSharp; +using VRC.SDKBase; + +namespace UdonSharp.Examples.Utilities +{ + [AddComponentMenu("Udon Sharp/Utilities/Player Mod Setter")] + [UdonBehaviourSyncMode(BehaviourSyncMode.NoVariableSync)] + public class PlayerModSetter : UdonSharpBehaviour + { + public float jumpHeight = 3f; + public float runSpeed = 4f; + public float walkSpeed = 2f; + public float strafeSpeed = 2f; + public float gravity = 1f; + + [Tooltip("Enables legacy locomotion which allows stutter stepping and wall climbing")] + public bool useLegacyLocomotion = false; + + void Start() + { + var playerApi = Networking.LocalPlayer; + + // Prevent error in editor from null player API + if (playerApi != null) + { + playerApi.SetJumpImpulse(jumpHeight); + playerApi.SetRunSpeed(runSpeed); + playerApi.SetWalkSpeed(walkSpeed); + playerApi.SetStrafeSpeed(strafeSpeed); + playerApi.SetGravityStrength(gravity); + + if (useLegacyLocomotion) + playerApi.UseLegacyLocomotion(); + } + + Destroy(this); + } + } +} diff --git a/Assets/UdonSharp/UtilityScripts/PlayerModSetter.cs.meta b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.cs.meta new file mode 100644 index 0000000..8fc0e8c --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/PlayerModSetter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8c59fc0a015dcc4b86d7e90312acf63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/Synced.meta b/Assets/UdonSharp/UtilityScripts/Synced.meta new file mode 100644 index 0000000..8ea2234 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c67458d48fdcc634aa0a93f106cd250b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.asset b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.asset new file mode 100644 index 0000000..d35861a --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.asset @@ -0,0 +1,166 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: GlobalToggleObject + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: cf0830881c253f849ad09ae1ce0df583, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: a3d8ddeb56f3a0c4daf49fe9d7447a3e, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 4 + hasInteractEvent: 1 + scriptID: -8649947059896150926 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 2 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: toggleObject + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: toggleObject + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.GameObject, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: isEnabled + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: isEnabled + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 3 + Data: 1 + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 8|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.asset.meta b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.asset.meta new file mode 100644 index 0000000..cc28257 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96ee11c7074d21e4f84d189ad35d45fc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.cs b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.cs new file mode 100644 index 0000000..513403a --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.cs @@ -0,0 +1,43 @@ + +using UnityEngine; +using VRC.SDK3.Components; +using VRC.SDKBase; +using VRC.Udon; + +namespace UdonSharp.Examples.Utilities +{ + /// + /// This class allows anyone to toggle a gameobject for everyone in the world. + /// This script assumes that the object it is on will not have other things transferring ownership of it. + /// + [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] + public class GlobalToggleObject : UdonSharpBehaviour + { + public GameObject toggleObject; + + [UdonSynced] + bool isEnabled; + + private void Start() + { + isEnabled = toggleObject.activeSelf; + } + + public override void OnDeserialization() + { + if (!Networking.IsOwner(gameObject)) + toggleObject.SetActive(isEnabled); + } + + public override void Interact() + { + if (!Networking.IsOwner(gameObject)) + Networking.SetOwner(Networking.LocalPlayer, gameObject); + + isEnabled = !isEnabled; + toggleObject.SetActive(isEnabled); + + RequestSerialization(); + } + } +} diff --git a/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.cs.meta b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.cs.meta new file mode 100644 index 0000000..5eb0355 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/GlobalToggleObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3d8ddeb56f3a0c4daf49fe9d7447a3e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.asset b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.asset new file mode 100644 index 0000000..6eb562d --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.asset @@ -0,0 +1,166 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: MasterToggleObject + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 0852567dbbf99bc4486460c92bd65bfa, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: fe5e5216dff1add40961bf62f441e92d, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 4 + hasInteractEvent: 1 + scriptID: -8678189633964288851 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 2 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: toggleObject + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: toggleObject + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.GameObject, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: isObjectEnabled + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: isObjectEnabled + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 3 + Data: 1 + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 8|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.asset.meta b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.asset.meta new file mode 100644 index 0000000..504891a --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a3b924aa5d416d94c86ddd019ccb8441 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.cs b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.cs new file mode 100644 index 0000000..d74ceda --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.cs @@ -0,0 +1,47 @@ + +using UnityEngine; +using VRC.SDKBase; + +namespace UdonSharp.Examples.Utilities +{ + /// + /// Allows the master and only the master to toggle a game object globally + /// + [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] + public class MasterToggleObject : UdonSharpBehaviour + { + public GameObject toggleObject; + + [UdonSynced] + bool isObjectEnabled; + + private void Start() + { + isObjectEnabled = toggleObject.activeSelf; + } + + // Prevents people who are not the master from taking ownership + public override bool OnOwnershipRequest(VRCPlayerApi requestingPlayer, VRCPlayerApi requestedOwner) + { + return requestedOwner.isMaster; + } + + public override void OnDeserialization() + { + toggleObject.SetActive(isObjectEnabled); + } + + public override void Interact() + { + if (!Networking.IsMaster) + return; + else if (!Networking.IsOwner(gameObject)) // The object may have transfer ownership on collision checked which would allow people to take ownership by accident + Networking.SetOwner(Networking.LocalPlayer, gameObject); + + isObjectEnabled = !isObjectEnabled; + toggleObject.SetActive(isObjectEnabled); + + RequestSerialization(); + } + } +} diff --git a/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.cs.meta b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.cs.meta new file mode 100644 index 0000000..3934b83 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/Synced/MasterToggleObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fe5e5216dff1add40961bf62f441e92d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.asset b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.asset new file mode 100644 index 0000000..eed51bb --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.asset @@ -0,0 +1,214 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: TrackingDataFollower + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 47ee06b4f4fb6d14fa9e9bb8cf946853, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: cfa6b6afca5fc44419a259edec93cea2, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 2 + hasInteractEvent: 0 + scriptID: -3652176807635059362 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 3 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: trackingTarget + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: trackingTarget + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: VRC.SDKBase.VRCPlayerApi+TrackingDataType, VRCSDKBase + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: playerApi + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: playerApi + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: VRC.SDKBase.VRCPlayerApi, VRCSDKBase + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: isInEditor + - Name: $v + Entry: 7 + Data: 8|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: isInEditor + - Name: k__BackingField + Entry: 7 + Data: 9|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 9 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 10|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.asset.meta b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.asset.meta new file mode 100644 index 0000000..aba1add --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5463afdb73b505649b857341d262468a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.cs b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.cs new file mode 100644 index 0000000..08a2766 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.cs @@ -0,0 +1,35 @@ + +using UnityEngine; +using VRC.SDKBase; + +namespace UdonSharp.Examples.Utilities +{ + /// + /// Follows one of the chosen playerApi tracking targets + /// + [AddComponentMenu("Udon Sharp/Utilities/Tracking Data Follower")] + [UdonBehaviourSyncMode(BehaviourSyncMode.NoVariableSync)] + public class TrackingDataFollower : UdonSharpBehaviour + { + public VRCPlayerApi.TrackingDataType trackingTarget; + + VRCPlayerApi playerApi; + bool isInEditor; + + private void Start() + { + playerApi = Networking.LocalPlayer; + isInEditor = playerApi == null; // PlayerApi will be null in editor + } + + private void LateUpdate() + { + // PlayerApi data will only be valid in game so we don't run the update if we're in editor + if (isInEditor) + return; + + VRCPlayerApi.TrackingData trackingData = playerApi.GetTrackingData(trackingTarget); + transform.SetPositionAndRotation(trackingData.position, trackingData.rotation); + } + } +} diff --git a/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.cs.meta b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.cs.meta new file mode 100644 index 0000000..2dece04 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/TrackingDataFollower.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cfa6b6afca5fc44419a259edec93cea2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.asset b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.asset new file mode 100644 index 0000000..c54a5f0 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.asset @@ -0,0 +1,736 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: WorldAudioSettings + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: b43f06441bb6a484aacd0ab9f9679df2, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: fdc09c11006c3474f91cfe7e809c9b96, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 2 + hasInteractEvent: 0 + scriptID: 4777197845251309059 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 11 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: voiceGain + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: voiceGain + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Single, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 3 + - Name: + Entry: 7 + Data: 5|UnityEngine.HeaderAttribute, UnityEngine.CoreModule + - Name: header + Entry: 1 + Data: Player voice + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: 6|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: Adjusts the player volume + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: 7|UnityEngine.RangeAttribute, UnityEngine.CoreModule + - Name: min + Entry: 4 + Data: 0 + - Name: max + Entry: 4 + Data: 24 + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: voiceFar + - Name: $v + Entry: 7 + Data: 8|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: voiceFar + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 9|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 10|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: The end of the range for hearing a user's voice + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: voiceNear + - Name: $v + Entry: 7 + Data: 11|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: voiceNear + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 12|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 13|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: The near radius in meters where player audio starts to fall off, it is + recommended to keep this at 0 + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: voiceVolumetricRadius + - Name: $v + Entry: 7 + Data: 14|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: voiceVolumetricRadius + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 15|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 16|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: The volumetric radius for the player voice, this should be left at 0 + unless you know what you're doing + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: voiceDisableLowpass + - Name: $v + Entry: 7 + Data: 17|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: voiceDisableLowpass + - Name: k__BackingField + Entry: 7 + Data: 18|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Boolean, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 18 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 19|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 20|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: Disables the low-pass filter when players are far away + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: avatarMaxAudioGain + - Name: $v + Entry: 7 + Data: 21|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: avatarMaxAudioGain + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 22|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 3 + - Name: + Entry: 7 + Data: 23|UnityEngine.HeaderAttribute, UnityEngine.CoreModule + - Name: header + Entry: 1 + Data: Avatar audio + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: 24|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: The maximum gain allowed on avatar audio sources + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: 25|UnityEngine.RangeAttribute, UnityEngine.CoreModule + - Name: min + Entry: 4 + Data: 0 + - Name: max + Entry: 4 + Data: 10 + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: avatarMaxFarRadius + - Name: $v + Entry: 7 + Data: 26|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: avatarMaxFarRadius + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 27|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 28|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: The maximum end of avatar audio range, a value of 0 will effectively + mute avatar audio + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: avatarMaxNearRadius + - Name: $v + Entry: 7 + Data: 29|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: avatarMaxNearRadius + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 30|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 31|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: The maximum for the radius where avatar audio starts to fall off + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: avatarMaxVolumetricRadius + - Name: $v + Entry: 7 + Data: 32|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: avatarMaxVolumetricRadius + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 33|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 34|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: The max volumetric radius for avatar audio sources + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: avatarForceSpacialization + - Name: $v + Entry: 7 + Data: 35|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: avatarForceSpacialization + - Name: k__BackingField + Entry: 9 + Data: 18 + - Name: k__BackingField + Entry: 9 + Data: 18 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 36|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 37|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: Forces avatars to have spatialized audio + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: avatarDisableCustomCurve + - Name: $v + Entry: 7 + Data: 38|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: avatarDisableCustomCurve + - Name: k__BackingField + Entry: 9 + Data: 18 + - Name: k__BackingField + Entry: 9 + Data: 18 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 39|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 40|UnityEngine.TooltipAttribute, UnityEngine.CoreModule + - Name: tooltip + Entry: 1 + Data: Disables custom curves on avatar audio sources + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.asset.meta b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.asset.meta new file mode 100644 index 0000000..1e5ddf9 --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa52d8b703fd906459112715b1ef1f3a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.cs b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.cs new file mode 100644 index 0000000..44e5bda --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.cs @@ -0,0 +1,76 @@ + +using UnityEngine; +using VRC.SDK3.Components; +using VRC.SDKBase; +using VRC.Udon; + +namespace UdonSharp.Examples.Utilities +{ + /// + /// Sets the default voice and avatar audio settings for players when they enter the world + /// See https://docs.vrchat.com/docs/player-audio for more detailed documentation + /// + [AddComponentMenu("Udon Sharp/Utilities/World Audio Settings")] + [UdonBehaviourSyncMode(BehaviourSyncMode.NoVariableSync)] + public class WorldAudioSettings : UdonSharpBehaviour + { + [Header("Player voice")] + [Tooltip("Adjusts the player volume")] + [Range(0f, 24f)] + public float voiceGain = 15f; + + [Tooltip("The end of the range for hearing a user's voice")] + public float voiceFar = 25f; + + [Tooltip("The near radius in meters where player audio starts to fall off, it is recommended to keep this at 0")] + public float voiceNear = 0f; + + [Tooltip("The volumetric radius for the player voice, this should be left at 0 unless you know what you're doing")] + public float voiceVolumetricRadius = 0f; + + [Tooltip("Disables the low-pass filter when players are far away")] + public bool voiceDisableLowpass = false; + + [Header("Avatar audio")] + [Tooltip("The maximum gain allowed on avatar audio sources")] + [Range(0f, 10f)] + public float avatarMaxAudioGain = 10f; + + [Tooltip("The maximum end of avatar audio range, a value of 0 will effectively mute avatar audio")] + public float avatarMaxFarRadius = 40f; + + // I don't think the docs are accurate for this one, they say it's for the maximum radius where you can start to hear an audio source + [Tooltip("The maximum for the radius where avatar audio starts to fall off")] + public float avatarMaxNearRadius = 40f; + + [Tooltip("The max volumetric radius for avatar audio sources")] + public float avatarMaxVolumetricRadius = 40f; + + [Tooltip("Forces avatars to have spatialized audio")] + public bool avatarForceSpacialization = false; + + [Tooltip("Disables custom curves on avatar audio sources")] + public bool avatarDisableCustomCurve = false; + + public override void OnPlayerJoined(VRCPlayerApi player) + { + if (!player.isLocal) + { + // Player voice + player.SetVoiceGain(voiceGain); + player.SetVoiceDistanceFar(voiceFar); + player.SetVoiceDistanceNear(voiceNear); + player.SetVoiceVolumetricRadius(voiceVolumetricRadius); + player.SetVoiceLowpass(!voiceDisableLowpass); + + // Avatar audio + player.SetAvatarAudioGain(avatarMaxAudioGain); + player.SetAvatarAudioFarRadius(avatarMaxFarRadius); + player.SetAvatarAudioNearRadius(avatarMaxNearRadius); + player.SetAvatarAudioVolumetricRadius(avatarMaxVolumetricRadius); + player.SetAvatarAudioForceSpatial(avatarForceSpacialization); + player.SetAvatarAudioCustomCurve(!avatarDisableCustomCurve); + } + } + } +} diff --git a/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.cs.meta b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.cs.meta new file mode 100644 index 0000000..8230e2b --- /dev/null +++ b/Assets/UdonSharp/UtilityScripts/WorldAudioSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fdc09c11006c3474f91cfe7e809c9b96 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR.meta b/Assets/XR.meta new file mode 100644 index 0000000..54d53bc --- /dev/null +++ b/Assets/XR.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3274279558cfd3145a7f9f4bb255ea2c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Loaders.meta b/Assets/XR/Loaders.meta new file mode 100644 index 0000000..908b2b6 --- /dev/null +++ b/Assets/XR/Loaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8381ce0a7de793944b1ff7f000588e8f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Loaders/OculusLoader.asset b/Assets/XR/Loaders/OculusLoader.asset new file mode 100644 index 0000000..9ff33a5 --- /dev/null +++ b/Assets/XR/Loaders/OculusLoader.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 03bc68f14d65e7747a59d5ff74bd199b, type: 3} + m_Name: OculusLoader + m_EditorClassIdentifier: diff --git a/Assets/XR/Loaders/OculusLoader.asset.meta b/Assets/XR/Loaders/OculusLoader.asset.meta new file mode 100644 index 0000000..95f8f5a --- /dev/null +++ b/Assets/XR/Loaders/OculusLoader.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 34bd447d5512b2a49b233bc0948bfe42 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Settings.meta b/Assets/XR/Settings.meta new file mode 100644 index 0000000..e39e64d --- /dev/null +++ b/Assets/XR/Settings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fd8648762276d564bb18bc8810b49ded +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Settings/OculusSettings.asset b/Assets/XR/Settings/OculusSettings.asset new file mode 100644 index 0000000..f9c9138 --- /dev/null +++ b/Assets/XR/Settings/OculusSettings.asset @@ -0,0 +1,33 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c353a8f1e58cf884584123914fe63cd5, type: 3} + m_Name: OculusSettings + m_EditorClassIdentifier: + m_StereoRenderingModeDesktop: 1 + m_StereoRenderingModeAndroid: 2 + SharedDepthBuffer: 1 + DepthSubmission: 0 + DashSupport: 1 + LowOverheadMode: 0 + OptimizeBufferDiscards: 1 + PhaseSync: 1 + SymmetricProjection: 1 + SubsampledLayout: 0 + FoveatedRenderingMethod: 0 + LateLatching: 0 + LateLatchingDebug: 0 + EnableTrackingOriginStageMode: 0 + SpaceWarp: 0 + TargetQuest2: 1 + TargetQuestPro: 0 + TargetQuest3: 0 + SystemSplashScreen: {fileID: 0} diff --git a/Assets/XR/Settings/OculusSettings.asset.meta b/Assets/XR/Settings/OculusSettings.asset.meta new file mode 100644 index 0000000..364ada4 --- /dev/null +++ b/Assets/XR/Settings/OculusSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2573b92be2c473549964d78f8f6d34ab +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/XRGeneralSettings.asset b/Assets/XR/XRGeneralSettings.asset new file mode 100644 index 0000000..a28ff5b --- /dev/null +++ b/Assets/XR/XRGeneralSettings.asset @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-7473401770480542583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d236b7d11115f2143951f1e14045df39, type: 3} + m_Name: Standalone Settings + m_EditorClassIdentifier: + m_LoaderManagerInstance: {fileID: -5041414694535346216} + m_InitManagerOnStart: 0 +--- !u!114 &-5041414694535346216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4c3631f5e58749a59194e0cf6baf6d5, type: 3} + m_Name: Standalone Providers + m_EditorClassIdentifier: + m_RequiresSettingsUpdate: 0 + m_AutomaticLoading: 0 + m_AutomaticRunning: 0 + m_Loaders: + - {fileID: 11400000, guid: 34bd447d5512b2a49b233bc0948bfe42, type: 2} +--- !u!114 &-3979826037960516741 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d236b7d11115f2143951f1e14045df39, type: 3} + m_Name: iPhone Settings + m_EditorClassIdentifier: + m_LoaderManagerInstance: {fileID: 0} + m_InitManagerOnStart: 0 +--- !u!114 &-1188267505514541362 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d236b7d11115f2143951f1e14045df39, type: 3} + m_Name: Android Settings + m_EditorClassIdentifier: + m_LoaderManagerInstance: {fileID: 0} + m_InitManagerOnStart: 0 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d2dc886499c26824283350fa532d087d, type: 3} + m_Name: XRGeneralSettings + m_EditorClassIdentifier: + Keys: 010000000700000004000000 + Values: + - {fileID: -7473401770480542583} + - {fileID: -1188267505514541362} + - {fileID: -3979826037960516741} diff --git a/Assets/XR/XRGeneralSettings.asset.meta b/Assets/XR/XRGeneralSettings.asset.meta new file mode 100644 index 0000000..7537381 --- /dev/null +++ b/Assets/XR/XRGeneralSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c2b52a4975cb6b40843e76e64b23c15 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/.Examples/DPIDMipmapper.cs b/Packages/com.vrchat.base/.Examples/DPIDMipmapper.cs new file mode 100644 index 0000000..f5309a0 --- /dev/null +++ b/Packages/com.vrchat.base/.Examples/DPIDMipmapper.cs @@ -0,0 +1,373 @@ +/* + * BSD 3-Clause License + * + * Copyright (c) 2016, Nicolas Weber, Sandra C. Amend / GCC / TU-Darmstadt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * HLSL/Unity version Copyright (c) 2024, Chelsea "Feilen" Jaggi and VRChat Inc + * The following is also licensed under the BSD 3-Clause License. + * + * This is a HLSL/Unity Compute shader implementation of the original cuda code + * available at https://github.com/mergian/dpid, adjusted to be used as an + * AssetPostprocessor (in-SDK) and a fully GPU-side texture updater (in-game) + * for generating mipmaps in Unity. The algorithm is intended to intentionally + * over-emphasize 'perceptually relevant' details, avoiding the need for + * post-sharpening typical in traditional downscaling algorithms. + * + * This file gets compiled into the SDKBase DLL, but we want to keep it open + * source, so it's been copied to .Examples directory to keep Unity from trying + * to compile it. + */ +using UnityEngine; +using UnityEngine.Rendering; +using System.Collections; +using System; +using VRC.Core; +using VRC.SDKBase.Editor; +using System.IO; + +public class DPIDMipmapper +{ + private static DPIDMipmapper Instance { get { return _instance ?? (_instance = new DPIDMipmapper()); } } + private static DPIDMipmapper _instance; + + private ComputeShader computeShader; + private int kernelDownsampling; + private int kernelGuidance; + + public static bool ComputeShaderReady { get { return Instance.computeShader != null; } } + + private const int THREADS = 64; + + private static int TmpGuidanceProperty = Shader.PropertyToID("_TmpGuidance"); + private static int OutputProperty = Shader.PropertyToID("_Output"); + + private DPIDMipmapper() + { + if (Application.isBatchMode) + { + Debug.Log("DPIDMipmapper is not supported in batch mode."); + return; + } + computeShader = Resources.Load("PerceptualMipmapping/PerceptualPostProcessor"); + + if (computeShader == null) + { + // ComputeShaders load after Textures import. We set a flag here and force all textures imported this way to re-import after the compute shader. + // This also lets us detect when we need to forcibly re-import Kaiser textures the first time. + return; + } + kernelGuidance = computeShader.FindKernel("KernelGuidance"); + kernelDownsampling = computeShader.FindKernel("KernelDownsampling"); + } + + /// + /// Generate DPID mipmaps for a texture. + /// + /// The input texture to generate mipmaps for. + /// The output texture to write the mipmaps to. + /// Whether the alpha channel should be treated as transparency (premultiplied to prevent edge bleed). + /// Whether the output texture should be sRGB. + /// Whether to only use the GPU for mip generation - this doesn't read-back mips from the GPU, and expects input and output formats to be the same. This will immediately return control. + /// Whether to generate mipmaps in-place (using the first mipmap as the input texture) + /// Whether we expect our input texture is already what we use for a guidance texture, e.g. a box-mipped texture + /// Whether to use a more conservative algorithm that doesn't over-emphasize details + /// The minimum size we care about scaling. At the default of 4x4, we stop processing anything below 5 pixels in width or height (and therefore save 3 passes) + public static void GenerateDPIDMipmaps(Texture2D input, Texture2D output, bool alphaIsTransparency, bool sRGB, bool asyncOnGPU = false, bool inPlace = true, bool inputIsGuidance = false, bool conservative = false, uint minimumSize = 4U, bool normalMap = false) + { + Instance.ExecuteComputeShader(input, output, alphaIsTransparency, sRGB, asyncOnGPU, inPlace, inputIsGuidance, conservative, minimumSize, normalMap: normalMap); + } + + /// + /// Generate DPID mipmaps for a texture - convienience method for in-place, CPU+GPU generation for highest quality. + /// + /// The input texture to generate mipmaps for. + /// The output texture to write the mipmaps to. + /// Whether the alpha channel should be treated as transparency (premultiplied to prevent edge bleed). + /// Whether the output texture should be sRGB. + /// Whether to use a more conservative algorithm that doesn't over-emphasize details + public static void GenerateDPIDMipmapsQuality(Texture2D input, Texture2D output, bool alphaIsTransparency, bool sRGB, bool conservative = false, bool normalMap = false) + { + bool inPlace = input.width == output.width && input.height == output.height; + Instance.ExecuteComputeShader(input, output, alphaIsTransparency, sRGB, false, inPlace, false, conservative, normalMap: normalMap); + } + + /// + /// Generate DPID mipmaps for a texture - convienience method for in-place, GPU-only generation. + /// + /// The texture to generate mipmaps for. + /// Whether the alpha channel should be treated as transparency (premultiplied to prevent edge bleed). + /// Whether the output texture should be sRGB. + /// Whether to use a more conservative algorithm that doesn't over-emphasize details + public static void GenerateDPIDMipmapsFast(Texture2D texture, bool alphaIsTransparency, bool sRGB, bool conservative = false, bool normalMap = false) + { + Instance.ExecuteComputeShader(texture, texture, alphaIsTransparency, sRGB, true, true, true, conservative, normalMap: normalMap); + } + + /// + /// Execute the compute shader to generate mipmaps using the DPID algorithm. + /// + /// The input texture to generate mipmaps for. + /// The output texture to write the mipmaps to. + /// Whether the alpha channel should be treated as transparency (premultiplied to prevent edge bleed). + /// Whether the output texture should be sRGB. + /// Whether to only use the GPU for mip generation - this doesn't read-back mips from the GPU, and expects input and output formats to be the same. This will immediately return control. + /// Whether to generate mipmaps in-place (using the first mipmap as the input texture) + /// Whether we expect our input texture is already what we use for a guidance texture, e.g. a box-mipped texture + /// The minimum size we care about scaling. At the default of 4x4, we stop processing anything below 5 pixels in width or height (and therefore save 3 passes) + private void ExecuteComputeShader(Texture2D input, Texture2D output, bool alphaIsTransparency, bool sRGB, bool asyncOnGPU = false, bool inPlace = true, bool inputIsGuidance = false, bool conservative = false, uint minimumSize = 4U, bool normalMap = false) + { + if (input == null || output == null) + { + Debug.LogError("Input and output textures must be non-null, input: {input != null}, output: {output != null}"); + return; + } + if (asyncOnGPU && (output.format != TextureFormat.RGBA32) && (output.format != TextureFormat.ARGB32)) + { +#if UNITY_EDITOR + Debug.Log($"Currently DPIDMipmapper only supports ARGB textures when on-GPU, currently: {output.format}"); +#endif + return; + } + if (Application.isBatchMode) + { + Debug.LogError("DPIDMipmapper is not supported in batch mode."); + return; + } + if (inputIsGuidance && (alphaIsTransparency || sRGB)) + { + // Unity's runtime mipmapping always runs with the equivalent of alphaIsTransparency == false, so we have to run our own + // InputIsGuidance also doesn't seem to like sRGB + inputIsGuidance = false; + } + if (inputIsGuidance && + (input.format == TextureFormat.RGB24) || + (input.format == TextureFormat.RGB565) || + (input.format == TextureFormat.RGBA4444) || + (input.format == TextureFormat.R8) || + (input.format == TextureFormat.R16) || + (input.format == TextureFormat.RG16) || + (input.format == TextureFormat.ARGB4444) || + (input.format == TextureFormat.RGBA64)) + { + // inputIsGuidance doesn't like non-RGBA formats + inputIsGuidance = false; + } + if (sRGB && (input.format == TextureFormat.R16 || + input.format == TextureFormat.RG16 || + input.format == TextureFormat.RGFloat || + input.format == TextureFormat.RFloat || + input.format == TextureFormat.RHalf || + input.format == TextureFormat.RGBA64 || + input.format == TextureFormat.RGBAFloat || + input.format == TextureFormat.RGBAHalf || + input.format == TextureFormat.R8 || + input.format == TextureFormat.RGBA4444 || + input.format == TextureFormat.RGB565 || + input.format == TextureFormat.ARGB4444)) + { + // Texture format does not support sRGB, will be tested as Linear to maintain consistency with Unity importer behavior + sRGB = false; + } + if (normalMap) + { + alphaIsTransparency = false; + } + if (!ComputeShaderReady) + { + // Double check that this is in fact the first import + computeShader = (ComputeShader)Resources.Load("PerceptualMipmapping/PerceptualPostProcessor"); + if (!ComputeShaderReady) + { + // Textures must be marked for re-import outside of DPIDMipmapper, since we don't have UnityEditor access. + return; + } + // If not, clear the flag and proceed as normal + kernelGuidance = computeShader.FindKernel("KernelGuidance"); + kernelDownsampling = computeShader.FindKernel("KernelDownsampling"); + } + + CommandBuffer commandBuffer = new CommandBuffer(); + if (asyncOnGPU) + { + commandBuffer.SetExecutionFlags(CommandBufferExecutionFlags.AsyncCompute); + } + + int startMip = inPlace? 1 : 0; + + commandBuffer.SetComputeTextureParam(computeShader, kernelDownsampling, "_Input", input); + commandBuffer.SetComputeTextureParam(computeShader, kernelGuidance, "_Input", input); + int iWidth = input.width; + int iHeight = input.height; + float lambda = conservative ? 0.5f : 1.0f; + commandBuffer.SetComputeIntParam(computeShader, "iWidth", iWidth); + commandBuffer.SetComputeIntParam(computeShader, "iHeight", iHeight); + commandBuffer.SetComputeFloatParam(computeShader, "lambda", lambda); + commandBuffer.SetComputeIntParam(computeShader, "premultiplyAlpha", alphaIsTransparency ? 1 : 0); + // output sRGB from compute shader with a variant, avoid blits + commandBuffer.SetComputeIntParam(computeShader, "sRGB", sRGB ? 1 : 0); + commandBuffer.SetComputeIntParam(computeShader, "normalMap", normalMap ? 1 : 0); + + int rtWidth = output.width; + int rtHeight = output.height; + + RenderTextureFormat intermediateFormat = RenderTextureFormat.ARGB32; + switch(input.format) + { + case TextureFormat.RGBAFloat: + intermediateFormat = RenderTextureFormat.ARGBFloat; + break; + case TextureFormat.RGBA32: + case TextureFormat.ARGB32: + case TextureFormat.RGB24: + case TextureFormat.RGB565: // Not supported for random write + intermediateFormat = RenderTextureFormat.ARGB32; + break; + case TextureFormat.RGBAHalf: + intermediateFormat = RenderTextureFormat.ARGBHalf; + break; + case TextureFormat.RGBA4444: + intermediateFormat = RenderTextureFormat.ARGB4444; + break; + case TextureFormat.RFloat: + intermediateFormat = RenderTextureFormat.RFloat; + break; + case TextureFormat.RGFloat: + intermediateFormat = RenderTextureFormat.RGFloat; + break; + case TextureFormat.RHalf: + intermediateFormat = RenderTextureFormat.RHalf; + break; + case TextureFormat.RGHalf: + intermediateFormat = RenderTextureFormat.RGHalf; + break; + case TextureFormat.R8: + intermediateFormat = RenderTextureFormat.R8; + break; + case TextureFormat.R16: + intermediateFormat = RenderTextureFormat.R16; + break; + } + + RenderTextureDescriptor outputTextureDesc = new RenderTextureDescriptor(rtWidth, rtHeight, intermediateFormat, 0); + outputTextureDesc.sRGB = false; + outputTextureDesc.autoGenerateMips = false; + outputTextureDesc.enableRandomWrite = true; + outputTextureDesc.useMipMap = true; + commandBuffer.GetTemporaryRT(OutputProperty, outputTextureDesc); + + RenderTargetIdentifier outputTexture = new RenderTargetIdentifier(OutputProperty); + RenderTargetIdentifier inputTexture = new RenderTargetIdentifier(input); + + for (int mip = startMip; mip < output.mipmapCount; mip++) + { + int downscaleFactor = 1 << mip; + + int oWidth = Math.Max(output.width / downscaleFactor, 1); + int oHeight = Math.Max(output.height / downscaleFactor, 1); + if (asyncOnGPU && (oWidth <= minimumSize && oHeight <= minimumSize)) + { + break; + } + float pWidth = (float)input.width / oWidth; + float pHeight = (float)input.height / oHeight; + + commandBuffer.SetComputeIntParam(computeShader, "oWidth", oWidth); + commandBuffer.SetComputeIntParam(computeShader, "oHeight", oHeight); + commandBuffer.SetComputeFloatParam(computeShader, "pWidth", pWidth); + commandBuffer.SetComputeFloatParam(computeShader, "pHeight", pHeight); + + // TODO: apparently you can't bind input Texture2Ds by-mip, it'll just silently bind mip 0. Before removing this, + // confirm with DEBUG_GUIDANCE in the compute shader. + RenderTextureDescriptor tmpGuidanceTextureRTDesc = new RenderTextureDescriptor(oWidth, oHeight, intermediateFormat, 0); + tmpGuidanceTextureRTDesc.sRGB = false; + tmpGuidanceTextureRTDesc.autoGenerateMips = false; + tmpGuidanceTextureRTDesc.enableRandomWrite = !inputIsGuidance; + tmpGuidanceTextureRTDesc.useMipMap = false; + commandBuffer.GetTemporaryRT(TmpGuidanceProperty, tmpGuidanceTextureRTDesc); + RenderTargetIdentifier tmpGuidanceTexture = new RenderTargetIdentifier(TmpGuidanceProperty); + + if (inputIsGuidance) + { + commandBuffer.CopyTexture(inputTexture, 0, mip, tmpGuidanceTexture, 0, 0); + } + else + { + commandBuffer.SetComputeTextureParam(computeShader, kernelGuidance, "_Output", tmpGuidanceTexture); + commandBuffer.DispatchCompute(computeShader, kernelGuidance, Math.Max(oWidth, 1), Math.Max(oHeight, 1), 1); + } + + // TODO: I might be able to modify the algorithm to perform some form of 'hinting' by having a cutoff for contribution at a certain range. Then you'd get even sharper edges on text and such + // TODO: compute shader could batch based on samples, not output pixels - this would spread more evenly + // TODO: how can we get rid of the alpha channel? downcasting RGBA to RGB is apparently weirdly difficult + commandBuffer.SetComputeTextureParam(computeShader, kernelDownsampling, "_Guidance", tmpGuidanceTexture); + commandBuffer.SetComputeTextureParam(computeShader, kernelDownsampling, "_Output", outputTexture, mip); + commandBuffer.DispatchCompute(computeShader, kernelDownsampling, Math.Max(oWidth, 1), Math.Max(oHeight, 1), 1); + if(asyncOnGPU) + { + commandBuffer.CopyTexture(outputTexture, 0, mip, output, 0, mip); + } + commandBuffer.ReleaseTemporaryRT(TmpGuidanceProperty); + } + if (!asyncOnGPU) + { + RenderTexture exportTexture = new RenderTexture(outputTextureDesc); + for (int mip = startMip; mip < output.mipmapCount; mip++) + { + int downscaleFactor = 1 << mip; + + int oWidth = Math.Max(output.width / downscaleFactor, 1); + int oHeight = Math.Max(output.height / downscaleFactor, 1); + if (asyncOnGPU && (oWidth <= minimumSize && oHeight <= minimumSize)) + { + break; + } + commandBuffer.CopyTexture(outputTexture, 0, mip, exportTexture, 0, mip); + int mipCopy = mip; + commandBuffer.RequestAsyncReadback(exportTexture, mip, output.graphicsFormat, (AsyncGPUReadbackRequest req) => + { + if (req.hasError) + { + Debug.LogError("GPU readback error detected."); + return; + } + if (req.done) + { + output.SetPixelData(req.GetData(), mipCopy); + } + }); + } + commandBuffer.WaitAllAsyncReadbackRequests(); + commandBuffer.ReleaseTemporaryRT(OutputProperty); + Graphics.ExecuteCommandBuffer(commandBuffer); + exportTexture.Release(); + } + else + { + commandBuffer.ReleaseTemporaryRT(OutputProperty); + Graphics.ExecuteCommandBufferAsync(commandBuffer, ComputeQueueType.Background); + } + } +} diff --git a/Packages/com.vrchat.base/Editor.meta b/Packages/com.vrchat.base/Editor.meta new file mode 100644 index 0000000..905699e --- /dev/null +++ b/Packages/com.vrchat.base/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3783acec36b0a84ba0c81ccfd1fc308 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK.meta b/Packages/com.vrchat.base/Editor/VRCSDK.meta new file mode 100644 index 0000000..8a02b43 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fbb143d2122482848aff63a633c20704 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies.meta new file mode 100644 index 0000000..84e055b --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8a5eb0ad795b9544799dec3b042b6af9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus.meta new file mode 100644 index 0000000..dab2bac --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 16568113592da1e4c9924393ab2ab4ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer.meta new file mode 100644 index 0000000..528faba --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d7067d2f71f9a4468d9d28dd19eeccf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer/ONSPAudioSourceEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer/ONSPAudioSourceEditor.cs new file mode 100644 index 0000000..62ad97c --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer/ONSPAudioSourceEditor.cs @@ -0,0 +1,101 @@ +/************************************************************************************ +Filename : ONSPAudioSourceEditor.cs +Content : This script adds editor functionality to OculusSpatializerUserParams script. +Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. + +Licensed under the Oculus SDK Version 3.5 (the "License"); +you may not use the Oculus SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +https://developer.oculus.com/licenses/sdk-3.5/ + +Unless required by applicable law or agreed to in writing, the Oculus SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +************************************************************************************/ +#define CUSTOM_LAYOUT + +using UnityEditor; +using UnityEngine; +using System.Collections.Generic; + +[CustomEditor(typeof(ONSPAudioSource))] + +public class OculusSpatializerUserParamsEditor : Editor +{ + // target component + private ONSPAudioSource m_Component; + + // OnEnable + void OnEnable() + { + m_Component = (ONSPAudioSource)target; + } + + // OnInspectorGUI + public override void OnInspectorGUI() + { + GUI.color = Color.white; + Undo.RecordObject(m_Component, "OculusSpatializerUserParams"); + + { + EditorGUILayout.HelpBox("Please use a VRC_SpatialAudioSource in the future.", MessageType.Error); + #if CUSTOM_LAYOUT + m_Component.EnableSpatialization = EditorGUILayout.Toggle("Spatialization Enabled", m_Component.EnableSpatialization); + m_Component.EnableRfl = EditorGUILayout.Toggle("Reflections Enabled", m_Component.EnableRfl); + m_Component.Gain = EditorGUILayout.FloatField("Gain", m_Component.Gain); + + Separator(); + + Label ("OCULUS ATTENUATION"); + m_Component.UseInvSqr = EditorGUILayout.Toggle("Enabled", m_Component.UseInvSqr); + Label (""); + Label("RANGE (0.0 - 1000000.0 meters)"); + m_Component.Near = EditorGUILayout.FloatField("Minimum", m_Component.Near); + m_Component.Far = EditorGUILayout.FloatField("Maximum", m_Component.Far); + + Label(""); + Label("VOLUMETRIC RADIUS (0.0 - 1000.0 meters)"); + m_Component.VolumetricRadius = EditorGUILayout.FloatField("Radius", m_Component.VolumetricRadius); + + Separator(); + + Label("REVERB SEND LEVEL (-60.0 - 20.0 decibels)"); + m_Component.ReverbSend = EditorGUILayout.FloatField(" ", m_Component.ReverbSend); + + Separator(); + + #else + DrawDefaultInspector (); + #endif + } + + if (GUI.changed) + { + EditorUtility.SetDirty(m_Component); + } + } + + // Utilities, move out of here (or copy over to other editor script) + + // Separator + void Separator() + { + GUI.color = new Color(1, 1, 1, 0.25f); + GUILayout.Box("", "HorizontalSlider", GUILayout.Height(16)); + GUI.color = Color.white; + } + + // Label + void Label(string label) + { + EditorGUILayout.LabelField (label); + } + +} + diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer/ONSPAudioSourceEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer/ONSPAudioSourceEditor.cs.meta new file mode 100644 index 0000000..cabe438 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/Oculus/Spatializer/ONSPAudioSourceEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cb850b86de9091d4db4595959c56f954 +timeCreated: 1442269815 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat.meta new file mode 100644 index 0000000..882fc66 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02f6a9b57a5644647b5ccc8b9c8acf28 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API.meta new file mode 100644 index 0000000..082b698 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c4c0a58edfe7425bb1e4b7a5de9a87b1 +timeCreated: 1683056861 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/IVRCContent.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/IVRCContent.cs new file mode 100644 index 0000000..436bc6f --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/IVRCContent.cs @@ -0,0 +1,8 @@ +namespace VRC.SDKBase.Editor.Api +{ + public interface IVRCContent + { + string ID { get; set; } + string Name { get; set; } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/IVRCContent.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/IVRCContent.cs.meta new file mode 100644 index 0000000..39219e3 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/IVRCContent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2970d5a709404efb9249205c86afaf20 +timeCreated: 1687867386 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAgreement.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAgreement.cs new file mode 100644 index 0000000..299b303 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAgreement.cs @@ -0,0 +1,32 @@ +using Newtonsoft.Json; + +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCAgreement + { + [JsonProperty("id")] + public string ID { get; set; } + public string AgreementCode { get; set; } + public string ContentId { get; set; } + public string AgreementFulltext { get; set; } + public int Version { get; set; } + public string[] Tags { get; set; } + } + + public struct VRCAgreementCheckRequest + { + public string UserId { get; set; } + public string AgreementCode { get; set; } + public string ContentId { get; set; } + public int Version { get; set; } + } + + public struct VRCAgreementCheckResponse + { + public bool Agreed { get; set; } + public string UserId { get; set; } + public string AgreementCode { get; set; } + public string ContentId { get; set; } + public int Version { get; set; } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAgreement.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAgreement.cs.meta new file mode 100644 index 0000000..ab93720 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAgreement.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e4a6b18f112e459c871dee35e8dc2858 +timeCreated: 1739229610 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApi.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApi.cs new file mode 100644 index 0000000..3760502 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApi.cs @@ -0,0 +1,1382 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using UnityEditor; +using UnityEngine; +using VRC.Core; + +[assembly: InternalsVisibleTo("VRC.SDK3.Editor")] +[assembly: InternalsVisibleTo("VRC.SDK3A.Editor")] +namespace VRC.SDKBase.Editor.Api { + [InitializeOnLoad] + public static class VRCApi + { + private static Uri VRC_BASE_URL; + private static Uri VRC_COOKIE_BASE_URL; + internal static JsonSerializerSettings JSON_OPTIONS; + private static int DEFAULT_RETRY_COUNT; + private static float DEFAULT_RETRY_DELAY; + private static float DEFAULT_EXP_BACKOFF; + private static int MULTIPART_PART_SIZE; + internal static string AVATAR_FALLBACK_TAG = "author_quest_fallback"; + + static VRCApi() + { + + VRC_COOKIE_BASE_URL = new Uri("https://api.vrchat.cloud"); + VRC_BASE_URL = new Uri("https://api.vrchat.cloud/api/1/"); + JSON_OPTIONS = new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + MissingMemberHandling = MissingMemberHandling.Ignore, + ContractResolver = new CamelCasePropertyNamesContractResolver(), + Converters = new List + { + new DateTimeNoneHandler(), + new InstanceHandler() + } + }; + + DEFAULT_RETRY_COUNT = 5; + DEFAULT_RETRY_DELAY = 1f; + DEFAULT_EXP_BACKOFF = 2f; + + MULTIPART_PART_SIZE = 100 * 1024 * 1024; + + Headers = new Dictionary + { + {"User-Agent", "VRC.Core.BestHTTP"}, + {"X-MacAddress", API.DeviceID}, + {"X-SDK-Version", Tools.SdkVersion}, + {"X-Platform", Tools.Platform}, + {"X-Unity-Version", Application.unityVersion}, + {"Accept", "application/json"} + }; + } + + #region API Internals + + private static readonly Dictionary Headers; + + private static CookieContainer GetCookies(Uri url) + { + if (url.Host != VRC_COOKIE_BASE_URL.Host) return new CookieContainer(); + if (!ApiCredentials.IsLoaded()) + { + ApiCredentials.Load(); + } + var authCookie = ApiCredentials.GetAuthTokenCookie(); + var twoFa = ApiCredentials.GetTwoFactorAuthTokenCookie(); + var cookies = new CookieContainer(); + if (authCookie != null) + { + cookies.Add(VRC_COOKIE_BASE_URL, new Cookie(authCookie.Name, authCookie.Value)); + } + + if (twoFa != null) + { + cookies.Add(VRC_COOKIE_BASE_URL, new Cookie(twoFa.Name, twoFa.Value)); + } + return cookies; + + } + + private static HttpClient GetClient(Uri url) + { + { + var cookies = GetCookies(url); + var handler = new HttpClientHandler + { + CookieContainer = cookies, + UseProxy = false + }; + var client = new HttpClient(handler); + foreach (var header in Headers) + { + client.DefaultRequestHeaders.Add(header.Key, header.Value); + } + + return client; + } + } + + private static void SetApiUrl() + { + VRCSdkControlPanel.RefreshApiUrlSetting(); + var apiUrl = API.GetApiUrlForEnvironment(VRCSdkControlPanel.ApiEnvironment); + VRC_BASE_URL = new Uri(apiUrl); + VRC_COOKIE_BASE_URL = new Uri($"{VRC_BASE_URL.Scheme}://{VRC_BASE_URL.Host}"); + } + + private static async Task BuildUrl(string requestUrl, Dictionary queryParams = null) + { + var uri = new UriBuilder(VRC_BASE_URL); + if (requestUrl.StartsWith(VRC_BASE_URL.ToString())) + { + requestUrl = requestUrl.Remove(0, VRC_BASE_URL.ToString().Length); + } else if (requestUrl.StartsWith("https://")) // fir any non-vrc URLs we just return them as-is + { + return new Uri(requestUrl); + } + uri.Path += requestUrl; + if (queryParams != null) + { + var query = new FormUrlEncodedContent(queryParams); + uri.Query = await query.ReadAsStringAsync(); + } + + return uri.Uri; + } + + private class EmptyResponse {} + + #endregion + + #region REST API Methods + + [PublicAPI] + public static async Task<(TResponse responseData, HttpResponseMessage responseMessage)> MakeRequestWithResponse(string requestUrl, HttpMethod method, + Dictionary queryParams = null, + bool forceRefresh = false, + T body = default, + string contentType = null, + byte[] contentMD5 = null, + int contentLength = 0, + int timeout = 30, + Action onProgress = null, + CancellationToken cancellationToken = default, + JsonSerializerSettings jsonSettings = null) + { + SetApiUrl(); + var uri = await BuildUrl(requestUrl, queryParams); + var cachedResponse = VRCApiCache.Get(uri.ToString(), out var isCached); + if (method == HttpMethod.Get) + { + // If cache has not expired yet - return cached value + if (isCached && !forceRefresh) + { + Core.Logger.Log($"Got Cached Response for {uri.ToString()}", API.LOG_CATEGORY); + return (cachedResponse, null); + } + } + else + { + if (isCached || forceRefresh) + { + VRCApiCache.Invalidate(uri.ToString()); + } + } + + var request = new HttpRequestMessage(method, uri); + var type = typeof(T); + var isByteArray = type.IsArray && type.GetElementType() == typeof(byte); + + if (body != null) + { + if (isByteArray) + { + var byteArray = body as byte[] ?? Array.Empty(); + if (onProgress != null) + { + var byteStream = new MemoryStream(byteArray); + request.Content = new VRCProgressContent(new StreamContent(byteStream), onProgress); + } + else + { + request.Content = new ByteArrayContent(byteArray); + } + + if (!string.IsNullOrWhiteSpace(contentType)) + { + request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + } + + if (contentMD5 != null) + { + request.Content.Headers.ContentMD5 = contentMD5; + } + } + else + { + string json; + try + { + json = JsonConvert.SerializeObject(body, jsonSettings ?? JSON_OPTIONS); + Core.Logger.Log($"Request body - json: {json}", API.LOG_CATEGORY); + + } + catch (Exception ex) + { + throw new JsonSerializationException("Failed to serialize data to JSON", ex); + } + request.Content = new StringContent(json); + } + } + + if (method != HttpMethod.Get && method != HttpMethod.Delete && !isByteArray && body != null) + { + request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + } + + HttpResponseMessage result; + try + { + var client = GetClient(request.RequestUri); + client.Timeout = TimeSpan.FromSeconds(timeout); + var sendTask = client.SendAsync(request, cancellationToken); + + if (body != null) + { + await Task.WhenAll( + sendTask, + VRCTools.IncreaseSendBuffer(request.RequestUri, sendTask, cancellationToken) + ); + result = sendTask.Result; + } + else + { + result = await sendTask; + } + } + catch (TaskCanceledException) + { + if (cancellationToken.IsCancellationRequested) + { + Core.Logger.LogError("Request cancelled", API.LOG_CATEGORY); + } + else + { + Core.Logger.LogError("Request timeout", API.LOG_CATEGORY); + } + + throw; + } + catch (Exception e) + { + Core.Logger.LogError("Failed to send request", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + throw; + } + + Core.Logger.Log($"Request finished - result: {result}", API.LOG_CATEGORY); + + if (!result.IsSuccessStatusCode) + { + if (result.Content.Headers.ContentLength > 0) + { + try + { + throw new ApiErrorException(result, await result.Content.ReadAsStringAsync()); + } + catch (ApiErrorException ex) + { + Core.Logger.LogError($"Got API Error: {ex.ErrorMessage}", API.LOG_CATEGORY); + // Provide an actionable error message + if (ex.StatusCode == HttpStatusCode.Unauthorized) + { + Core.Logger.LogError("Unauthorized, try logging out and in again"); + } + throw; + } + catch + { + // Fall-through to the generic error exception if encountered non-api exception + } + Core.Logger.LogError($"Error data {await result.Content.ReadAsStringAsync()}", API.LOG_CATEGORY); + } + throw new RequestFailedException($"Failed to perform a request to VRChat API for {uri} and data {JsonConvert.SerializeObject(body, JSON_OPTIONS)}", result, result.StatusCode); + } + + var responseType = typeof(TResponse); + + // Sometimes we do not care about response data + if (responseType == typeof(EmptyResponse)) + { + return (default, result); + } + + + if (responseType.IsArray && responseType.GetElementType() == typeof(byte)) + { + var bytes = await result.Content.ReadAsByteArrayAsync(); + if (method == HttpMethod.Get) + { + VRCApiCache.Add(uri.ToString(), bytes); + } + return ((TResponse) (object) bytes, result); + } + + var text = await result.Content.ReadAsStringAsync(); + try + { + Core.Logger.Log($"Request finished - result: {text}", API.LOG_CATEGORY); + + var parsed = JsonConvert.DeserializeObject(text, JSON_OPTIONS); + if (method == HttpMethod.Get) + { + VRCApiCache.Add(uri.ToString(), parsed); + } + return (parsed, result); + } + catch (JsonException ex) + { + throw new JsonSerializationException($"Failed to deserialize data from JSON, original text: {text}", ex); + } + } + + [PublicAPI] + public static async Task MakeRequest(string requestUrl, HttpMethod method, + Dictionary queryParams = null, bool forceRefresh = false, T body = default, string contentType = null, byte[] contentMD5 = null, int contentLength = 0, int timeout = 30, Action onProgress = null, CancellationToken cancellationToken = default, JsonSerializerSettings jsonSettings = null) + { + var result = await MakeRequestWithResponse(requestUrl, method, queryParams, forceRefresh, body, contentType, contentMD5, contentLength, timeout, onProgress, cancellationToken, jsonSettings); + return result.responseData; + } + + [PublicAPI] + public static async Task Get(string requestUrl, Dictionary queryParams = null, bool forceRefresh = false, bool allowRetry = false, CancellationToken cancellationToken = default) + { + T result = default; + if (string.IsNullOrWhiteSpace(requestUrl)) + { + return result; + } + + for (var i = 0; i < DEFAULT_RETRY_COUNT; i++) + { + try + { + result = await MakeRequest(requestUrl, HttpMethod.Get, queryParams, forceRefresh, cancellationToken: cancellationToken); + break; + } + catch (Exception ex) + { + var delay = TimeSpan.FromSeconds(Math.Pow((i + 1) * DEFAULT_RETRY_DELAY, DEFAULT_EXP_BACKOFF)); + if (!allowRetry) + { + throw; + } + Core.Logger.LogError(ex.Message, API.LOG_CATEGORY); + if (ex.InnerException != null) + { + Core.Logger.LogError(ex.InnerException.Message, API.LOG_CATEGORY); + } + + result = default; + await Task.Delay(delay); + } + } + + return result; + } + + [PublicAPI] + public static async Task Post(string requestUrl, T body, + Dictionary queryParams = null, bool forceRefresh = false, CancellationToken cancellationToken = default, JsonSerializerSettings jsonSettings = null) + { + return await MakeRequest(requestUrl, HttpMethod.Post, queryParams, forceRefresh, body, cancellationToken: cancellationToken, jsonSettings: jsonSettings); + } + + [PublicAPI] + public static async Task Put(string requestUrl, T body, + Dictionary queryParams = null, bool forceRefresh = false, CancellationToken cancellationToken = default, JsonSerializerSettings jsonSettings = null) + { + return await MakeRequest(requestUrl, HttpMethod.Put, queryParams, forceRefresh, body, cancellationToken: cancellationToken, jsonSettings: jsonSettings); + } + + [PublicAPI] + public static async Task Put(string requestUrl, + Dictionary queryParams = null, bool forceRefresh = false, CancellationToken cancellationToken = default, JsonSerializerSettings jsonSettings = null) + { + return await MakeRequest(requestUrl, HttpMethod.Put, queryParams, forceRefresh, cancellationToken: cancellationToken, jsonSettings: jsonSettings); + } + + [PublicAPI] + public static async Task Delete(string requestUrl, Dictionary queryParams = null, bool forceRefresh = false, CancellationToken cancellationToken = default) + { + return await MakeRequest(requestUrl, HttpMethod.Delete, queryParams, forceRefresh, cancellationToken: cancellationToken); + } + + public static async Task Delete(string requestUrl, Dictionary queryParams = null, bool forceRefresh = false, CancellationToken cancellationToken = default) + { + await MakeRequest(requestUrl, HttpMethod.Delete, queryParams, forceRefresh, cancellationToken: cancellationToken); + } + + #endregion + + #region VRC API Calls + + [PublicAPI] + public static async Task GetWorld(string id, bool forceRefresh = false, CancellationToken cancellationToken = default) + { + return await Get($"worlds/{id}", forceRefresh: forceRefresh, cancellationToken: cancellationToken); + } + + [PublicAPI] + public static async Task UpdateWorldInfo(string id, VRCWorld data, CancellationToken cancellationToken = default) + { + var changes = new VRCWorldChanges + { + Name = data.Name, + Description = data.Description, + Tags = data.Tags, + Capacity = data.Capacity, + RecommendedCapacity = data.RecommendedCapacity, + PreviewYoutubeId = data.PreviewYoutubeId + }; + return await Put($"worlds/{id}", changes, cancellationToken: cancellationToken); + } + + public static async Task GetCanPublishWorld(string id, CancellationToken cancellationToken = default) + { + return (await Get($"worlds/{id}/publish", cancellationToken: cancellationToken)).Value( + "canPublish"); + } + + public static async Task PublishWorld(string id, CancellationToken cancellationToken = default) + { + return await Put($"worlds/{id}/publish", cancellationToken: cancellationToken); + } + + public static async Task UnpublishWorld(string id, CancellationToken cancellationToken = default) + { + return await Delete($"worlds/{id}/publish", cancellationToken: cancellationToken); + } + + [PublicAPI] + public static async Task UpdateWorldImage(string id, VRCWorld data, string pathToImage, Action onProgress = null, CancellationToken cancellationToken = default) + { + var fileName = "World - " + data.Name + " - Image - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + var fileId = ApiFile.ParseFileIdFromFileAPIUrl(data.ImageUrl); + var newImageUrl = await UploadFile(pathToImage, fileId, fileName, onProgress, cancellationToken); + if (string.IsNullOrWhiteSpace(newImageUrl)) + { + Debug.Log("new image url is empty, aborting"); + return data; + } + var imageUpdateRequest = new Dictionary + { + {"imageUrl", newImageUrl} + }; + return await Put($"worlds/{id}", imageUpdateRequest, cancellationToken: cancellationToken); + } + + [PublicAPI] + public static async Task UpdateWorldBundle(string id, VRCWorld data, string pathToBundle, string worldSignature, + Action onProgress = null, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(pathToBundle)) + { + Core.Logger.LogError("Bundle path cannot be empty", API.LOG_CATEGORY); + return data; + } + var fileName = "World - " + data.Name + " - Asset bundle - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + + string newBundleUrl = null; + var currentAssetUrl = data.GetLatestAssetUrlForPlatform(Tools.Platform); + + // new platform + if (string.IsNullOrWhiteSpace(currentAssetUrl)) + { + newBundleUrl = await UploadFile(pathToBundle, "", fileName, onProgress, cancellationToken); + } + else + { + var fileId = ApiFile.ParseFileIdFromFileAPIUrl(currentAssetUrl); + newBundleUrl = await UploadFile(pathToBundle, fileId, fileName, onProgress, cancellationToken); + } + if (string.IsNullOrWhiteSpace(newBundleUrl)) + { + Core.Logger.LogError("New bundle url is empty, aborting", API.LOG_CATEGORY); + return data; + } + var bundleUpdateRequest = new Dictionary + { + {"name", data.Name}, + {"assetUrl", newBundleUrl}, + {"platform", Tools.Platform.ToString()}, + {"unityVersion", Tools.UnityVersion.ToString()}, + {"assetVersion", 4}, + {"udonProducts", data.UdonProducts}, + {"worldSignature", worldSignature}, + }; + Core.Logger.Log($"Updating with new bundle {newBundleUrl}", API.LOG_CATEGORY); + await VRCApi.Put($"worlds/{id}", bundleUpdateRequest, cancellationToken: cancellationToken); + Core.Logger.Log("Fetching latest", API.LOG_CATEGORY); + return await VRCApi.Get($"worlds/{id}", forceRefresh: true, cancellationToken: cancellationToken); + } + + [PublicAPI] + public static async Task CreateNewWorld(string id, VRCWorld data, string pathToBundle, string pathToImage, string worldSignature, + Action onProgress = null, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(pathToBundle) || string.IsNullOrWhiteSpace(pathToImage)) + { + Core.Logger.LogError("Both bundle and image paths must be provided"); + return data; + } + var fileName = "World - " + data.Name + " - Asset bundle - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + var newBundleUrl = await UploadFile(pathToBundle, "", fileName, onProgress: (status, percentage) => + { + onProgress?.Invoke(status, percentage * 0.5f); + }, cancellationToken); + if (string.IsNullOrWhiteSpace(newBundleUrl)) + { + Core.Logger.LogError("New bundle url is empty, aborting"); + return data; + } + var imageFileName = "World - " + data.Name + " - Image - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + var newImageUrl = await UploadFile(pathToImage, "", imageFileName, onProgress: (status, percentage) => + { + onProgress?.Invoke(status, 0.5f + percentage * 0.5f); + }, cancellationToken); + if (string.IsNullOrWhiteSpace(newImageUrl)) + { + Core.Logger.LogError("New image url is empty, aborting"); + return data; + } + var newWorldData = new Dictionary + { + {"id", id}, + {"name", data.Name}, + {"description", data.Description}, + {"assetUrl", newBundleUrl}, + {"imageUrl", newImageUrl}, + {"platform", Tools.Platform}, + {"unityVersion", Tools.UnityVersion.ToString()}, + {"tags", data.Tags}, + {"capacity", data.Capacity}, + {"recommendedCapacity", data.RecommendedCapacity}, + {"previewYoutubeId", data.PreviewYoutubeId}, + {"assetVersion", 4}, + {"udonProducts", data.UdonProducts}, + {"worldSignature", worldSignature}, + }; + var createdWorld = await Post, VRCWorld>($"worlds", newWorldData, cancellationToken: cancellationToken); + Core.Logger.Log("Created a new World"); + return createdWorld; + } + + [PublicAPI] + public static async Task GetAvatar(string id, bool forceRefresh = false, CancellationToken cancellationToken = default) + { + return await Get($"avatars/{id}", forceRefresh: forceRefresh, cancellationToken: cancellationToken); + } + + [PublicAPI] + public static async Task UpdateAvatarInfo(string id, VRCAvatar data, CancellationToken cancellationToken = default) + { + var changes = new VRCAvatarChanges + { + Name = data.Name, + Description = data.Description, + Tags = data.Tags, + ReleaseStatus = data.ReleaseStatus, + // API doesn't allow null values, so we have to map to empty strings + PrimaryStyle = data.Styles.Primary ?? string.Empty, + SecondaryStyle = data.Styles.Secondary ?? string.Empty, + }; + + return await VRCApi.Put($"avatars/{id}", changes, cancellationToken: cancellationToken); + } + + [PublicAPI] + public static async Task UpdateAvatarImage(string id, VRCAvatar data, string pathToImage, Action onProgress = null, CancellationToken cancellationToken = default) + { + var fileName = "Avatar - " + data.Name + " - Image - " + Application.unityVersion + "_" + ApiAvatar.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + var fileId = ApiFile.ParseFileIdFromFileAPIUrl(data.ImageUrl); + var newImageUrl = await UploadFile(pathToImage, fileId, fileName, onProgress, cancellationToken); + if (string.IsNullOrWhiteSpace(newImageUrl)) + { + Core.Logger.LogError("New image url is empty, aborting", API.LOG_CATEGORY); + return data; + } + var imageUpdateRequest = new Dictionary + { + {"imageUrl", newImageUrl} + }; + return await VRCApi.Put($"avatars/{id}", imageUpdateRequest, cancellationToken: cancellationToken); + } + + [PublicAPI] + public static async Task UpdateAvatarBundle(string id, VRCAvatar data, string pathToBundle, + Action onProgress = null, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(pathToBundle)) + { + Core.Logger.LogError("Bundle path cannot be empty", API.LOG_CATEGORY); + return data; + } + var fileName = "Avatar - " + data.Name + " - Asset bundle - " + Application.unityVersion + "_" + ApiAvatar.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + + string newBundleUrl = null; + var currentAssetUrl = data.GetLatestAssetUrlForPlatform(Tools.Platform); + + // new platform + if (string.IsNullOrWhiteSpace(currentAssetUrl)) + { + newBundleUrl = await UploadFile(pathToBundle, "", fileName, onProgress, cancellationToken); + } + else + { + var fileId = ApiFile.ParseFileIdFromFileAPIUrl(currentAssetUrl); + newBundleUrl = await UploadFile(pathToBundle, fileId, fileName, onProgress, cancellationToken); + } + if (string.IsNullOrWhiteSpace(newBundleUrl)) + { + Core.Logger.LogError("new bundle url is empty, aborting", API.LOG_CATEGORY); + return data; + } + var bundleUpdateRequest = new Dictionary + { + {"assetUrl", newBundleUrl}, + {"platform", Tools.Platform.ToString()}, + {"unityVersion", Tools.UnityVersion.ToString()}, + {"assetVersion", 1} + }; + Core.Logger.Log($"Updating with new bundle {newBundleUrl}", API.LOG_CATEGORY); + await VRCApi.Put($"avatars/{id}", bundleUpdateRequest, cancellationToken: cancellationToken); + Core.Logger.Log("Fetching latest", API.LOG_CATEGORY); + return await VRCApi.Get($"avatars/{id}", forceRefresh: true, cancellationToken: cancellationToken); + } + + /// + /// Creates an avatar entry in the database. + /// Use this method to get a new ID to assign to the avatar blueprint before building and uploading it. + /// + /// + /// + /// + /// + [PublicAPI] + public static async Task CreateAvatarRecord(VRCAvatar data, Action onProgress = null, + CancellationToken cancellationToken = default) + { + var newAvatarData = new Dictionary + { + {"name", data.Name}, + {"description", data.Description}, + {"tags", data.Tags}, + {"releaseStatus", data.ReleaseStatus}, + {"platform", Tools.Platform}, + {"unityVersion", Tools.UnityVersion.ToString()}, + {"assetVersion", 1} + }; + var createdAvatar = await Post, VRCAvatar>($"avatars", newAvatarData, cancellationToken: cancellationToken); + return createdAvatar; + } + + [PublicAPI] + public static async Task CreateNewAvatar(string id, VRCAvatar data, string pathToBundle, string pathToImage, + Action onProgress = null, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(pathToBundle) || string.IsNullOrWhiteSpace(pathToImage)) + { + Core.Logger.LogError("Both bundle and image paths must be provided"); + return data; + } + + var remoteData = await VRCApi.GetAvatar(id, forceRefresh: true, cancellationToken); + if (!remoteData.PendingUpload) + { + throw new UploadException("Avatar creation is only allowed for a reserved avatar ID pending first upload"); + } + + var fileName = "Avatar - " + data.Name + " - Asset bundle - " + Application.unityVersion + "_" + ApiAvatar.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + var newBundleUrl = await UploadFile(pathToBundle, "", fileName, onProgress: (status, percentage) => + { + onProgress?.Invoke(status, percentage * 0.5f); + }, cancellationToken); + if (string.IsNullOrWhiteSpace(newBundleUrl)) + { + Core.Logger.LogError("New bundle url is empty, aborting"); + return data; + } + var imageFileName = "Avatar - " + data.Name + " - Image - " + Application.unityVersion + "_" + ApiAvatar.VERSION.ApiVersion + + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl(); + var fileId = ApiFile.ParseFileIdFromFileAPIUrl(data.ImageUrl); + var newImageUrl = await UploadFile(pathToImage, "", imageFileName, onProgress: (status, percentage) => + { + onProgress?.Invoke(status, 0.5f + percentage * 0.5f); + }, cancellationToken); + if (string.IsNullOrWhiteSpace(newImageUrl)) + { + Core.Logger.LogError("New image url is empty, aborting"); + return data; + } + var newAvatarData = new Dictionary + { + {"name", data.Name}, + {"description", data.Description}, + {"assetUrl", newBundleUrl}, + {"imageUrl", newImageUrl}, + {"tags", data.Tags}, + {"releaseStatus", data.ReleaseStatus}, + {"platform", Tools.Platform}, + {"unityVersion", Tools.UnityVersion.ToString()}, + {"assetVersion", 1} + }; + // The expects either a style ID or no style keys + if (data.Styles.Primary != null) + { + newAvatarData["primaryStyle"] = data.Styles.Primary; + } + if (data.Styles.Secondary != null) + { + newAvatarData["secondaryStyle"] = data.Styles.Secondary; + } + var createdAvatar = await Put, VRCAvatar>($"avatars/{remoteData.ID}", newAvatarData, cancellationToken: cancellationToken); + return createdAvatar; + } + + [PublicAPI] + public static async Task DeleteAvatar(string id) + { + return await VRCApi.Delete($"avatars/{id}", cancellationToken: CancellationToken.None); + } + + [PublicAPI] + public static async Task SetAvatarAsFallback(string id, VRCAvatar data) + { + if (!data.Tags.Contains(AVATAR_FALLBACK_TAG)) + { + data.Tags.Add(AVATAR_FALLBACK_TAG); + data = await VRCApi.UpdateAvatarInfo(id, data); + } + await Put($"avatars/{id}/selectFallback"); + return await Get($"avatars/{id}", forceRefresh: true); + } + + [PublicAPI] + public static async Task> GetAvatarStyles() + { + return await VRCApi.Get>("avatarStyles"); + } + + public static async Task ContentUploadConsent(VRCAgreement data) + { + return await Post("agreement", data); + } + + public static async Task CheckContentUploadConsent(VRCAgreementCheckRequest data) + { + return await Get("agreement", new Dictionary + { + {"agreementCode", data.AgreementCode}, + {"contentId", data.ContentId}, + {"version", data.Version.ToString()} + }, forceRefresh: true); + } + + internal static async Task SubmitAssetReviewNotes(string id, string notes) + { + var avatarData = await GetAvatar(id, forceRefresh: true); + if (string.IsNullOrWhiteSpace(avatarData.ActiveAssetReviewId)) + { + Core.Logger.LogError("Avatar review doesn't exist, cannot submit notes"); + return; + } + + var request = new VRCAssetReviewNotesRequest + { + ReviewNotes = notes + }; + await Put($"assetReview/{avatarData.ActiveAssetReviewId}/notes", request); + } + + + + + #endregion + + #region Public Utilities + + [PublicAPI] + public static async Task GetImage(string url, bool forceRefresh = false, CancellationToken cancellationToken = default) + { + var imageBytes = await Get(url, forceRefresh: forceRefresh, cancellationToken: cancellationToken); + var image = new Texture2D(512, 512) + { + wrapMode = TextureWrapMode.Clamp + }; + image.LoadImage(imageBytes); + return image; + } + + #endregion + + #region VRC API Internals + + private static async Task UploadFile(string filename, string fileId, string friendlyFileName, Action onProgress = null, CancellationToken cancellationToken = default) + { + // This setting often gets cleared on assembly reload, so we re-enable it here + if (UnityEditor.EditorPrefs.GetBool("apiLoggingEnabled")) + { + Core.Logger.EnableCategory(API.LOG_CATEGORY); + } + + var extension = Path.GetExtension(filename); + var mimeType = VRCTools.GetMimeTypeFromExtension(extension); + var creatingNewFile = fileId == ""; + VRCFile currentFile = default; + if (!creatingNewFile) + { + currentFile = await Get("file/" + fileId, forceRefresh: true, cancellationToken: cancellationToken); + Core.Logger.Log($"Updating existing file {fileId}", API.LOG_CATEGORY); + } + else + { + var requestData = new Dictionary + { + {"name", friendlyFileName}, + {"mimeType", mimeType}, + {"extension", extension} + }; + currentFile = await Post, VRCFile>("file", requestData, cancellationToken: cancellationToken); + Core.Logger.Log($"Created a new file {currentFile.ID}", API.LOG_CATEGORY); + } + + onProgress?.Invoke("Preparing for file upload...", 0.0f); + + if (string.IsNullOrWhiteSpace(currentFile.ID)) + { + Core.Logger.LogError("Failed to load file info, aborting", API.LOG_CATEGORY); + return null; + } + + if (currentFile.HasQueuedOperation()) + { + Core.Logger.Log("Existing file is not fully uploaded, cleaning up", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}/{currentFile.GetLatestVersion()}", cancellationToken: cancellationToken); + Core.Logger.Log("Cleaned up leftover queued uploads", API.LOG_CATEGORY); + await Task.Delay(1000, cancellationToken); + // reload the file without a queued version + currentFile = await Get("file/" + fileId, forceRefresh: true, cancellationToken: cancellationToken); + } + + if (currentFile.IsLatestVersionErrored()) + { + Core.Logger.Log("Existing file failed to upload, cleaning up", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}/{currentFile.GetLatestVersion()}", cancellationToken: cancellationToken); + Core.Logger.Log("Cleaned up leftover errored uploads", API.LOG_CATEGORY); + await Task.Delay(1000, cancellationToken); + // reload the file without a broken version + currentFile = await Get("file/" + fileId, forceRefresh: true, cancellationToken: cancellationToken); + } + + onProgress?.Invoke("Processing file...", 0.05f); + + byte[] fileMD5bytes; + string fileMD5b64; + try + { + fileMD5bytes = VRCTools.GetFileMD5(filename); + fileMD5b64 = Convert.ToBase64String(fileMD5bytes); + } + catch (Exception e) + { + Core.Logger.LogError("Failed to get file MD5, exiting upload", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + return null; + } + + var signatureFilePath = VRC.Tools.GetTempFileName(".sig", out var tempFileError, new GUID().ToString()); + if (!string.IsNullOrWhiteSpace(tempFileError)) + { + Core.Logger.LogError("Failed to create temp file for signature, exiting upload", API.LOG_CATEGORY); + Core.Logger.LogError(tempFileError, API.LOG_CATEGORY); + return null; + } + + await VRCTools.GenerateFileSignature(filename, signatureFilePath); + VRC.Tools.GetFileSize(signatureFilePath, out var sigFileSize, out var sigFileSizeErrorStr); + + if (!string.IsNullOrWhiteSpace(sigFileSizeErrorStr)) + { + Core.Logger.LogError("failed to get signature file size, exiting upload", API.LOG_CATEGORY); + return null; + } + + byte[] sigMD5bytes; + string sigMD5b64; + var sigMimeType = VRCTools.GetMimeTypeFromExtension(".sig"); + try + { + sigMD5bytes = VRCTools.GetFileMD5(signatureFilePath); + sigMD5b64 = Convert.ToBase64String(sigMD5bytes); + } + catch (Exception e) + { + Core.Logger.LogError("Failed to get signature MD5, exiting upload", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message); + return null; + } + + VRC.Tools.GetFileSize(filename, out var fullFileSize, out var fileSizeErrorStr); + + if (!string.IsNullOrWhiteSpace(fileSizeErrorStr)) + { + Core.Logger.LogError("failed to get file size, exiting upload", API.LOG_CATEGORY); + return null; + } + + onProgress?.Invoke("Checking existing records...", 0.1f); + + // Check for existing files with same hashes first + var isRetrying = false; + if (currentFile.HasExistingOrPendingVersion()) + { + // if there is a file with the same hash + if (string.Equals(fileMD5b64, currentFile.Versions[currentFile.GetLatestVersion()]?.File?.MD5 ?? "")) + { + if (!currentFile.IsLatestVersionWaiting()) + { + Core.Logger.LogError("file with the same hash is already uploaded", API.LOG_CATEGORY); + throw new UploadException("This file was already uploaded"); + } + + // file already exists and is in waiting state - we should try to upload + isRetrying = true; + Core.Logger.Log("File MD5 match, going to retry the file upload", API.LOG_CATEGORY); + } else if (currentFile.IsLatestVersionWaiting()) + { + Core.Logger.Log("Latest file upload failed and we have a new file, we're going to clean up", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}/{currentFile.GetLatestVersion()}", cancellationToken: cancellationToken); + await Task.Delay(1000, cancellationToken); + // reload the file without a broken version + currentFile = await Get("file/" + fileId, forceRefresh: true, cancellationToken: cancellationToken); + } + } + + // check that we're trying to re-upload the exact same file on retry + var versionAlreadyExists = false; + if (isRetrying) + { + var version = currentFile.Versions[currentFile.GetLatestVersion()]; + var isMatch = fullFileSize == version.File.SizeInBytes && + string.Equals(fileMD5b64, version.File.MD5) && + sigFileSize == version.Signature.SizeInBytes && + string.Equals(sigMD5b64, version.Signature.MD5); + if (isMatch) + { + versionAlreadyExists = true; + Core.Logger.Log("Files match, will attempt to re-upload", API.LOG_CATEGORY); + } + else + { + Core.Logger.Log("Files do not fully match, removing latest version", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}/{currentFile.GetLatestVersion()}", cancellationToken: cancellationToken); + await Task.Delay(1000, cancellationToken); + // reload the file without a broken version + currentFile = await Get("file/" + fileId, forceRefresh: true, cancellationToken: cancellationToken); + } + } + + // if not retrying the last upload - create a new version entry + if (!versionAlreadyExists) + { + var requestData = new Dictionary + { + {"signatureMd5", sigMD5b64}, + {"signatureSizeInBytes", sigFileSize}, + {"fileMd5", fileMD5b64}, + {"fileSizeInBytes", fullFileSize}, + }; + var updatedFile = await Post, VRCFile>($"file/{currentFile.ID}", requestData, cancellationToken: cancellationToken); + if (string.IsNullOrWhiteSpace(updatedFile.ID)) + { + Core.Logger.LogError("Failed to create new file version, exiting upload", API.LOG_CATEGORY); + return null; + } + Core.Logger.Log($"Created new record. {currentFile.GetLatestVersion()} -> {updatedFile.GetLatestVersion()}", API.LOG_CATEGORY); + currentFile = updatedFile; + await Task.Delay(1000, cancellationToken); + } + else + { + Core.Logger.Log("File already exists, skipping record creation", API.LOG_CATEGORY); + } + + Core.Logger.Log($"Is target version waiting? {currentFile.Versions[currentFile.GetLatestVersion()].File.Status == "waiting"}", API.LOG_CATEGORY); + + var fileDescriptor = currentFile.Versions[currentFile.GetLatestVersion()].File; + var fileCategory = fileDescriptor.Category; + + Core.Logger.Log("File upload type: " + fileCategory, API.LOG_CATEGORY); + + onProgress?.Invoke("Starting file upload...", 0.15f); + + if (currentFile.Versions[currentFile.GetLatestVersion()].File.Status == "waiting") + { + Core.Logger.Log("Starting file upload", API.LOG_CATEGORY); + if (fileCategory != "simple") + { + if (await UploadMultipart(filename, FileUploadType.File, currentFile, mimeType, fileMD5bytes, + (status, percentage) => { onProgress?.Invoke(status, 0.15f + percentage * 0.75f); }, cancellationToken)) + { + // cleanup the file if we created it + if (creatingNewFile) + { + Core.Logger.Log("Cleanup, deleting created file", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}", cancellationToken: cancellationToken); + } + + throw new UploadException("Failed to upload file"); + } + } + else + { + if (await UploadSimple(filename, FileUploadType.File, currentFile, mimeType, fileMD5bytes, + (status, percentage) => { onProgress?.Invoke(status, 0.15f + percentage * 0.75f); }, cancellationToken)) + { + // cleanup the file if we created it + if (creatingNewFile) + { + Core.Logger.Log("Cleanup, deleting created file", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}", cancellationToken: cancellationToken); + } + + throw new UploadException("Failed to upload file"); + } + } + onProgress?.Invoke("File Uploaded!", 0.9f); + await Task.Delay(1000, cancellationToken); + } + else + { + Core.Logger.Log("File upload not waiting, thus isn't needed", API.LOG_CATEGORY); + throw new UploadException("This file was already uploaded, you should make a new build"); + } + + fileDescriptor = currentFile.Versions[currentFile.GetLatestVersion()].Signature; + fileCategory = fileDescriptor.Category; + + onProgress?.Invoke("Starting signature upload...", 0.95f); + + if (currentFile.Versions[currentFile.GetLatestVersion()].Signature.Status == "waiting") + { + Core.Logger.Log("Starting signature upload", API.LOG_CATEGORY); + if (fileCategory != "simple") + { + if (await UploadMultipart(signatureFilePath, FileUploadType.Signature, currentFile, + sigMimeType, sigMD5bytes, + (status, percentage) => { onProgress?.Invoke(status, 0.95f + percentage * 0.04f); }, cancellationToken)) + { + // cleanup the file if we created it + if (creatingNewFile) + { + Core.Logger.Log("Cleanup, deleting created file", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}", cancellationToken: cancellationToken); + } + + return null; + } + } + else + { + if (await UploadSimple(signatureFilePath, FileUploadType.Signature, currentFile, + sigMimeType, sigMD5bytes, + (status, percentage) => { onProgress?.Invoke(status, 0.95f + percentage * 0.04f); }, cancellationToken)) + { + // cleanup the file if we created it + if (creatingNewFile) + { + Core.Logger.Log("Cleanup, deleting created file", API.LOG_CATEGORY); + await Delete($"file/{currentFile.ID}", cancellationToken: cancellationToken); + } + + return null; + } + } + onProgress?.Invoke("Signature Uploaded!", 0.99f); + await Task.Delay(1000, cancellationToken); + } + else + { + Core.Logger.Log("Signature upload not waiting, thus isn't needed", API.LOG_CATEGORY); + return null; + } + + Core.Logger.Log("Everything should be now uploaded", API.LOG_CATEGORY); + currentFile = await Get($"file/{currentFile.ID}", forceRefresh: true, cancellationToken: cancellationToken); + var latestVersion = currentFile.Versions[currentFile.GetLatestVersion()]; + + Core.Logger.Log($"File upload complete? {latestVersion.File.Status == "complete"}", API.LOG_CATEGORY); + Core.Logger.Log($"Signature upload complete? {latestVersion.Signature.Status == "complete"}", API.LOG_CATEGORY); + + Core.Logger.Log("waiting for file to finish processing", API.LOG_CATEGORY); + onProgress?.Invoke("Refreshing data...", 0.99f); + Core.Logger.Log("waiting for 5s", API.LOG_CATEGORY); + await Task.Delay(5000, cancellationToken); + + Core.Logger.Log("Everything should be good now", API.LOG_CATEGORY); + + onProgress?.Invoke($"Cleaning up Temp Files...", 0.99f); + await VRCTools.CleanupTempFiles(currentFile.ID); + + currentFile = await Get($"file/{currentFile.ID}", forceRefresh: true, cancellationToken: cancellationToken); + + onProgress?.Invoke("File upload finished", 1.0f); + + return currentFile.Versions[currentFile.GetLatestVersion()].File.URL; + } + + private enum FileUploadType + { + File, + Signature + } + + private static async Task UploadSimple(string filename, FileUploadType fileUploadType, VRCFile currentFile, string mimeType, byte[] fileContent, Action onProgress, CancellationToken cancellationToken = default) + { + var startUploadResp = await Put($"file/{currentFile.ID}/{currentFile.GetLatestVersion()}/{fileUploadType.ToString().ToLowerInvariant()}/start", cancellationToken: cancellationToken); + var uploadUrl = startUploadResp.Value("url"); + + Core.Logger.Log($"got upload url {uploadUrl}", API.LOG_CATEGORY); + if (string.IsNullOrWhiteSpace(uploadUrl)) + { + Core.Logger.LogError("Got invalid upload url, exiting upload", API.LOG_CATEGORY); + return true; + } + + var fileData = await File.ReadAllBytesAsync(filename, cancellationToken); + + onProgress?.Invoke($"Uploading {fileUploadType.ToString().ToLowerInvariant()}...", 0f); + try + { + await MakeRequest(uploadUrl, HttpMethod.Put, body: fileData, contentType: mimeType, + contentMD5: fileContent, + timeout: 60 * 60, + onProgress: (percentage) => { onProgress?.Invoke($"Uploading {fileUploadType.ToString()} ({(percentage * 100):F0}%)...", percentage); }, cancellationToken: cancellationToken); + } + catch (Exception e) + { + Core.Logger.LogError($"failed to upload {fileUploadType.ToString()} to {uploadUrl}, exiting upload", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + return true; + } + + await Put($"file/{currentFile.ID}/{currentFile.GetLatestVersion()}/{fileUploadType.ToString().ToLowerInvariant()}/finish", cancellationToken: cancellationToken); + Core.Logger.Log($"{fileUploadType.ToString()} upload complete", API.LOG_CATEGORY); + + return false; + } + + private static async Task UploadMultipart(string filename, FileUploadType fileUploadType, VRCFile currentFile, + string mimeType, byte[] fileContent, Action onProgress, CancellationToken cancellationToken = default) + { + JObject uploadStatus; + try + { + uploadStatus = + await Get( + $"file/{currentFile.ID}/{currentFile.GetLatestVersion()}/{fileUploadType.ToString().ToLowerInvariant()}/status", + cancellationToken: cancellationToken); + } + catch (Exception e) + { + Core.Logger.LogError("Failed to get current file status, aborting upload", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + return true; + } + var nextPartNumber = 1; + var etags = new List(); + nextPartNumber += uploadStatus.Value("nextPartNumber"); + + var statusEtags = uploadStatus.Value("etags").ToObject>(); + etags.AddRange(statusEtags); + Core.Logger.Log($"Loaded up existing etags: {string.Join(", ", statusEtags)}", API.LOG_CATEGORY); + + await using var fileStream = File.OpenRead(filename); + var parts = Mathf.Max(1, Mathf.FloorToInt((float)fileStream.Length / (float)MULTIPART_PART_SIZE)); + + if (nextPartNumber > 1) + { + onProgress?.Invoke("Resuming upload...", (float) nextPartNumber / parts); + } + + var perPartProgress = 1f / parts; + + // intermediary buffer + var buffer = new byte[MULTIPART_PART_SIZE * 2]; + for (var partNumber = nextPartNumber; partNumber <= parts; partNumber++) + { + var partProgressStart = (float) (partNumber - 1) / parts; + if (cancellationToken.IsCancellationRequested) + { + Core.Logger.Log("Upload cancelled", API.LOG_CATEGORY); + return true; + } + + JObject startUploadResp; + try + { + startUploadResp = await Put( + $"file/{currentFile.ID}/{currentFile.GetLatestVersion()}/{fileUploadType.ToString().ToLowerInvariant()}/start", + queryParams: new Dictionary { { "partNumber", partNumber.ToString() }}, + cancellationToken: cancellationToken); + } + catch (Exception e) + { + Core.Logger.LogError($"Failed to start upload for part {partNumber}", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + return true; + } + + var uploadUrl = startUploadResp.Value("url"); + + Core.Logger.Log($"got upload url {uploadUrl}", API.LOG_CATEGORY); + if (string.IsNullOrWhiteSpace(uploadUrl)) + { + Core.Logger.LogError("Got invalid upload url, exiting upload", API.LOG_CATEGORY); + return true; + } + + onProgress?.Invoke($"Uploading {fileUploadType.ToString()}...", partProgressStart); + + var bytesToRead = partNumber < parts ? MULTIPART_PART_SIZE : (int)(fileStream.Length - fileStream.Position); + var bytesRead = 0; + try + { + bytesRead = await fileStream.ReadAsync(buffer, 0, bytesToRead, cancellationToken); + } + catch (Exception e) + { + Core.Logger.LogError("Could not read file, aborting", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + return true; + } + + Core.Logger.Log($"Loaded {bytesRead} from file", API.LOG_CATEGORY); + + var sizedArray = new byte[bytesRead]; + Array.Copy(buffer, sizedArray, bytesRead); + + try + { + var result = await MakeRequestWithResponse( + uploadUrl, + HttpMethod.Put, + body: sizedArray, + timeout: 60 * 60, + onProgress: (percentage) => + { + onProgress?.Invoke($"Uploading {fileUploadType.ToString()} ({(percentage * 100):F0}%)...", partProgressStart + percentage * perPartProgress); + }, + cancellationToken: cancellationToken + ); + if (result.responseMessage.Headers.ETag != null) + { + Core.Logger.Log($"Got an etag {result.responseMessage.Headers.ETag.Tag.Trim('"', '\'')} from S3", API.LOG_CATEGORY); + etags.Add(result.responseMessage.Headers.ETag.Tag.Trim('"', '\'')); + } + } + catch (Exception e) + { + Core.Logger.LogError($"failed to upload {fileUploadType.ToString()} to {uploadUrl}, exiting upload", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + return true; + } + + await Task.Delay(1000, cancellationToken); + Core.Logger.Log($"Uploaded part {partNumber} out of {parts}", API.LOG_CATEGORY); + } + + try + { + var requestData = new Dictionary> + { + {"etags", etags} + }; + await Put>, EmptyResponse>( + $"file/{currentFile.ID}/{currentFile.GetLatestVersion()}/{fileUploadType.ToString().ToLowerInvariant()}/finish", + cancellationToken: cancellationToken, body: requestData); + } + catch (Exception e) + { + Core.Logger.LogError("Failed to finish upload", API.LOG_CATEGORY); + Core.Logger.LogError(e.Message, API.LOG_CATEGORY); + return true; + } + + Core.Logger.Log($"{fileUploadType.ToString()} upload complete", API.LOG_CATEGORY); + + return false; + } + + #endregion + + #region Handlers + + internal class DateTimeNoneHandler : JsonConverter + { + public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var value = reader.Value.ToString(); + if (reader.TokenType == JsonToken.String) + { + if (value == "none") + { + return DateTime.MinValue; + } + } + return DateTime.Parse(value); + } + + public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer) + { + if (value == DateTime.MinValue) + { + writer.WriteValue("none"); + } + else + { + writer.WriteValue(value.ToString()); + } + } + } + + // Instances come in as an array of arrays, like [ [ Id, Occupant count ], ... ] + internal class InstanceHandler : JsonConverter + { + public override VRCWorld.Instance ReadJson(JsonReader reader, Type objectType, VRCWorld.Instance existingValue, bool hasExistingValue, + JsonSerializer serializer) + { + var array = JArray.Load(reader); + return new VRCWorld.Instance + { + ID = (string) array[0], + Occupants = (int) array[1] + }; + } + + public override void WriteJson(JsonWriter writer, VRCWorld.Instance value, JsonSerializer serializer) + { + var array = new JArray + { + value.ID, + value.Occupants + }; + array.WriteTo(writer); + } + } + #endregion + } +} diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApi.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApi.cs.meta new file mode 100644 index 0000000..d104de8 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cffdc642f18a45c9865fc930726518fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiCache.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiCache.cs new file mode 100644 index 0000000..253dd5d --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiCache.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using UnityEditor; + +namespace VRC.SDKBase.Editor.Api +{ + [InitializeOnLoad] + internal static class VRCApiCache + { + private static long DEFAULT_CACHE_TIME; + private static Dictionary _cache; + + static VRCApiCache() + { + _cache = new Dictionary(); + DEFAULT_CACHE_TIME = 1000 * 60 * 1; // 1 minute + } + + public static T Add(string key, T value) + { + _cache[key] = (DateTime.UtcNow, value); + return value; + } + + public static T Get(string key, out bool cached) + { + if (_cache.TryGetValue(key, out var value)) + { + if (DateTime.UtcNow.Subtract(value.timestamp).TotalMilliseconds < DEFAULT_CACHE_TIME) + { + cached = true; + return (T) value.data; + } + + cached = false; + return default; + } + + cached = false; + return default; + } + + public static void Invalidate(string key) + { + _cache.Remove(key); + } + + public static void Clear() + { + _cache = new Dictionary(); + } + } +} + diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiCache.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiCache.cs.meta new file mode 100644 index 0000000..60812ff --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiCache.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c2861b3597c849e08c2126c83ef3fca7 +timeCreated: 1683145545 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiError.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiError.cs new file mode 100644 index 0000000..e865d1c --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiError.cs @@ -0,0 +1,12 @@ +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCApiError + { + public VRCApiErrorContent Error { get; set; } + + public struct VRCApiErrorContent { + public string Message { get; set; } + public int Code { get; set; } + } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiError.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiError.cs.meta new file mode 100644 index 0000000..c6f4c4e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiError.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 67fd710f3e92422eba267779143a9c5f +timeCreated: 1687964156 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiExceptions.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiExceptions.cs new file mode 100644 index 0000000..08dd1e5 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiExceptions.cs @@ -0,0 +1,59 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Runtime.CompilerServices; +using Newtonsoft.Json; + +[assembly: InternalsVisibleTo("VRC.SDK3A.Editor")] +[assembly: InternalsVisibleTo("VRC.SDK3.Editor")] +namespace VRC.SDKBase.Editor.Api +{ + /// + /// VRCApi request failed + /// + public class RequestFailedException : Exception + { + public HttpResponseMessage HttpMessage; + public HttpStatusCode StatusCode; + + public RequestFailedException(string message) : base(message) + { + } + + public RequestFailedException(string message, HttpResponseMessage httpMessage) : base(message) + { + HttpMessage = httpMessage; + } + + public RequestFailedException(string message, HttpResponseMessage httpMessage, HttpStatusCode statusCode) : base(message) + { + HttpMessage = httpMessage; + StatusCode = statusCode; + } + } + + public class JsonSerializationException : Exception + { + public JsonSerializationException(string message, Exception innerException) : base(message, innerException) + { + } + } + + /// + /// VRChat API returned an error + /// + public class ApiErrorException : Exception + { + public HttpResponseMessage HttpMessage; + public HttpStatusCode StatusCode; + public string ErrorMessage; + + public ApiErrorException(HttpResponseMessage httpMessage, string jsonContent) + { + var json = JsonConvert.DeserializeObject(jsonContent, VRCApi.JSON_OPTIONS); + HttpMessage = httpMessage; + StatusCode = httpMessage.StatusCode; + ErrorMessage = json.Error.Message; + } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiExceptions.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiExceptions.cs.meta new file mode 100644 index 0000000..8e1f9f9 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApiExceptions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 536cf9130a7e41a19f0d7e5d7900210d +timeCreated: 1683135644 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAssetReview.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAssetReview.cs new file mode 100644 index 0000000..d99c09e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAssetReview.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCAssetReviewNotesRequest + { + public string ReviewNotes { get; set; } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAssetReview.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAssetReview.cs.meta new file mode 100644 index 0000000..0a9517e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAssetReview.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 37f2155d6021416b8ad57feb5216957d +timeCreated: 1743116496 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatar.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatar.cs new file mode 100644 index 0000000..4cbde2f --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatar.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using VRC.Core; + +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCAvatar: IVRCContent + { + public enum AvatarVariant + { + Standard, + Impostor + } + + public struct AvatarStyles + { + public string Primary { get; set; } + public string Secondary { get; set; } + } + + [JsonProperty("id")] + public string ID { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public List Tags { get; set; } + + public string AuthorName { get; set; } + public string AuthorId { get; set; } + + public string ImageUrl { get; set; } + public string ThumbnailImageUrl { get; set; } + + public string ReleaseStatus { get; set; } + + public AvatarStyles Styles { get; set; } + public bool Lock { get; set; } + public string ActiveAssetReviewId { get; set; } + + public bool PendingUpload { get; set; } + + [JsonProperty("created_at")] + public DateTime CreatedAt { get; set; } + [JsonProperty("updated_at")] + public DateTime UpdatedAt { get; set; } + + public int Version { get; set; } + public List UnityPackages { get; set; } + + public bool Featured { get; set; } + public string UnityPackageUrl { get; set; } + public Dictionary UnityPackageUrlObject { get; set; } + + public string GetLatestAssetUrlForPlatform(string platform) + { + string assetUrl = null; + var preferredUnityVersion = new UnityVersion(); + if (this.UnityPackages == null) return null; + + foreach (var unityPackage in this.UnityPackages) + { + if (UnityVersion.Parse(unityPackage.UnityVersion).CompareTo(preferredUnityVersion) < 0) continue; + + if (unityPackage.Variant != null) + { + AvatarVariant variant = (AvatarVariant)Enum.Parse(typeof(AvatarVariant), unityPackage.Variant, true); + if (variant == AvatarVariant.Impostor) continue; + } + + if (unityPackage.Platform != platform) continue; + assetUrl = unityPackage.AssetUrl; + preferredUnityVersion = UnityVersion.Parse(unityPackage.UnityVersion); + } + + return assetUrl; + } + + public string GetLatestAssetUrlForCurrentPlatform() + { + return GetLatestAssetUrlForPlatform(Tools.Platform); + } + + /// + /// Checks if user-editable data is equal between avatar records + /// + /// + /// + public bool ContentInfoEqual(VRCAvatar target) + { + return target.Name.Equals(Name) && + target.Description.Equals(Description) && + target.Tags.SequenceEqual(Tags) && + target.ReleaseStatus.Equals(ReleaseStatus); + } + } + + // Only a subset of fields is allowed to be changed through the SDK + public struct VRCAvatarChanges { + public string Name { get; set; } + public string Description { get; set; } + public List Tags { get; set; } + public string ReleaseStatus { get; set; } + + // Styles should be submitted via style ID and not the style Name + public string PrimaryStyle { get; set; } + public string SecondaryStyle { get; set; } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatar.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatar.cs.meta new file mode 100644 index 0000000..60d4eb4 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatar.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 93e3e8f8e94746a6b83e7431081ef622 +timeCreated: 1683135174 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatarStyle.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatarStyle.cs new file mode 100644 index 0000000..f26008e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatarStyle.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCAvatarStyle + { + [JsonProperty("id")] + public string ID { get; set; } + + public string StyleName { get; set; } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatarStyle.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatarStyle.cs.meta new file mode 100644 index 0000000..986d4aa --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCAvatarStyle.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a53e0d0d4a9549dbbb6fedba8fec4f2d +timeCreated: 1744068776 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCFile.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCFile.cs new file mode 100644 index 0000000..558cf0e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCFile.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; + +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCFile + { + [JsonProperty("id")] + public string ID { get; set; } + public string Name { get; set; } + public string OwnerId { get; set; } + public string MimeType { get; set; } + public string Extension { get; set; } + public List Versions { get; set; } + + public class VersionEntry + { + public int Version { get; set; } + public string Status { get; set; } + public DateTime CreatedAt { get; set; } + public bool Deleted { get; set; } + public FileDescriptor File { get; set; } + public FileDescriptor Signature { get; set; } + public FileDescriptor Delta { get; set; } + + public class FileDescriptor + { + public string Status { get; set; } + public string URL { get; set; } + public string MD5 { get; set; } + public string Category { get; set; } + public int SizeInBytes { get; set; } + public string FileName { get; set; } + public string UploadId { get; set; } + [JsonProperty("cdns")] + public List CDNs { get; set; } + } + } + + public int GetLatestVersion() + { + return (this.Versions?.Count ?? 0) - 1; + } + + /// + /// Returns true if there is a valid version that is not deleted. + /// + public bool HasExistingOrPendingVersion() + { + var latestVersion = GetLatestVersion(); + if (latestVersion > 0) + { + latestVersion -= Versions.Count(v => v == null || v.Deleted); + } + + return latestVersion > 0; + } + + public bool IsLatestVersionWaiting() + { + if (!HasExistingOrPendingVersion()) return false; + var version = Versions[GetLatestVersion()]; + if (version.Status == "waiting") return true; + return ((version.File?.Status == "waiting") || + (version.Signature?.Status == "waiting")); + } + + public bool IsLatestVersionQueued() + { + if (!HasExistingOrPendingVersion()) return false; + var version = Versions[GetLatestVersion()]; + if (version.Status == "queued") return true; + return ((version.File?.Status == "queued") || + (version.Signature?.Status == "queued")); + } + + public bool IsLatestVersionErrored() + { + if (!HasExistingOrPendingVersion()) return false; + var version = Versions[GetLatestVersion()]; + if (version.Status == "error") return true; + return ((version.File?.Status == "error") || + (version.Signature?.Status == "error")); + } + + public bool HasQueuedOperation() + { + if (IsLatestVersionWaiting()) return false; + + return HasExistingOrPendingVersion() && IsLatestVersionQueued(); + } + } + +} + diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCFile.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCFile.cs.meta new file mode 100644 index 0000000..b65a1a9 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCFile.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 45cf16ea678f4615920c2d510d154633 +timeCreated: 1686655895 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCProgressContent.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCProgressContent.cs new file mode 100644 index 0000000..f60bb82 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCProgressContent.cs @@ -0,0 +1,48 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using VRC.Core; + +namespace VRC.SDKBase.Editor.Api +{ + internal class VRCProgressContent: HttpContent + { + private readonly HttpContent _source; + private readonly Action _onProgress; + + public VRCProgressContent(HttpContent source, Action onProgress) + { + _source = source; + _onProgress = onProgress; + } + + protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context) + { + var sendBuffer = new byte[4 * 1024 * 1024]; + var totalBytesRead = 0L; + + using (var inputStream = await _source.ReadAsStreamAsync()) + { + var totalBytes = inputStream.Length; + var bytesRead = 0; + + while ((bytesRead = await inputStream.ReadAsync(sendBuffer, 0, sendBuffer.Length)) > 0) + { + await stream.WriteAsync(sendBuffer, 0, bytesRead); + + totalBytesRead += bytesRead; + _onProgress((float)totalBytesRead / totalBytes); + Core.Logger.Log($"Sent {totalBytesRead} out of {totalBytes}", API.LOG_CATEGORY); + } + } + } + + protected override bool TryComputeLength(out long length) + { + length = _source.Headers.ContentLength.GetValueOrDefault(); + return true; + } + } +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCProgressContent.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCProgressContent.cs.meta new file mode 100644 index 0000000..a7650bf --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCProgressContent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 685a233b2bbf4a99a5f62f2d9727f484 +timeCreated: 1686669873 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCTools.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCTools.cs new file mode 100644 index 0000000..3429f21 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCTools.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Security.Cryptography; +using System.Threading; +using System.Threading.Tasks; + +[assembly: InternalsVisibleTo("VRC.SDK3A.Editor")] +[assembly: InternalsVisibleTo("VRC.SDK3.Editor")] +namespace VRC.SDKBase.Editor.Api +{ + internal class VRCTools + { + internal static byte[] GetFileMD5(string filePath) + { + var hash = MD5.Create(); + using var fileStream = File.OpenRead(filePath); + return hash.ComputeHash(fileStream); + } + + internal static async Task GenerateFileSignature(string sourceFilePath, string targetFilePath) + { + await using var fileStream = File.OpenRead(sourceFilePath); + await using var inStream = librsync.net.Librsync.ComputeSignature(fileStream); + await using var signatureStream = File.Open(targetFilePath, FileMode.Create, FileAccess.Write); + await inStream.CopyToAsync(signatureStream); + return targetFilePath; + } + + internal static async Task CleanupTempFiles(string fileId) + { + var folder = VRC.Tools.GetTempFolderPath(fileId); + + while (Directory.Exists(folder)) + { + try + { + if (Directory.Exists(folder)) + Directory.Delete(folder, true); + } + catch (System.Exception) + { + // ignored + } + + await Task.Delay(10); + } + } + + internal static string GetMimeTypeFromExtension(string extension) + { + if (extension == ".vrcw") + return "application/x-world"; + if (extension == ".vrca") + return "application/x-avatar"; + if (extension == ".vrcp") + return "application/x-prop"; + if (extension == ".dll") + return "application/x-msdownload"; + if (extension == ".unitypackage") + return "application/gzip"; + if (extension == ".gz") + return "application/gzip"; + if (extension == ".jpg") + return "image/jpg"; + if (extension == ".png") + return "image/png"; + if (extension == ".sig") + return "application/x-rsync-signature"; + if (extension == ".delta") + return "application/x-rsync-delta"; + + return "application/octet-stream"; + } + + /// + /// This expands the send buffer size from around 256KB up to 4MB (our preferred send buffer size) + /// This dramatically speeds up file uploads + /// + /// Unfortunately, APIs meant to be used for this aren't available in Mono version of .NET in Unity + /// So we have to use reflection to get to the private fields and properties we need + /// + /// Url to expand the send buffer for + /// Request task to expand the buffer for + /// + internal static async Task IncreaseSendBuffer(Uri targetUrl, Task sendRequest, + CancellationToken cancellationToken) + { + var servicePointScheduler = typeof(ServicePoint).GetProperty("Scheduler", BindingFlags.NonPublic | BindingFlags.Instance); + var servicePointGroups = servicePointScheduler?.PropertyType.GetField("groups", BindingFlags.NonPublic | BindingFlags.Instance); + var groupsList = servicePointGroups?.FieldType.GetProperty("Values"); + + var connectionStateType = servicePointGroups?.FieldType.GenericTypeArguments[1]; + var connectionsList = connectionStateType?.GetField("connections", BindingFlags.NonPublic | BindingFlags.Instance); + + var connection = connectionsList?.FieldType.GenericTypeArguments[0]; + var socket = connection?.GetField("socket", BindingFlags.NonPublic | BindingFlags.Instance); + + while (!sendRequest.IsCompleted && !cancellationToken.IsCancellationRequested) + { + await Task.Delay(250, cancellationToken); + + try + { + var servicePoint = ServicePointManager.FindServicePoint(targetUrl); + var scheduler = servicePointScheduler?.GetValue(servicePoint); + if (scheduler == null) + { + continue; + } + + // This can be null on mac/linux, so we add an extra check + var servicePointGroup = servicePointGroups?.GetValue(scheduler); + if (servicePointGroup == null) + { + continue; + } + + var groups = (IEnumerable) groupsList?.GetValue(servicePointGroup); + + // we're going to retry finding the active service point + if (groups == null) + { + continue; + } + + foreach (var group in groups) + { + var connections = (IEnumerable) connectionsList?.GetValue(group); + if (connections == null) + { + continue; + } + + foreach (var webConnection in connections) + { + if (webConnection == null) + { + continue; + } + + var socketInstance = (Socket) socket?.GetValue(webConnection); + if (socketInstance != null && socketInstance.Connected && + socketInstance.SendBufferSize < 4 * 1024 * 1024) + { + socketInstance.SendBufferSize = 4 * 1024 * 1024; + return; + } + } + } + } + catch (Exception e) + { + Core.Logger.LogWarning($"Failed to increase send buffer {e.Message}", Core.API.LOG_CATEGORY); + } + } + } + } +} + diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCTools.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCTools.cs.meta new file mode 100644 index 0000000..3804187 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCTools.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3e259a399dbb4ef19a7a89d2b4233247 +timeCreated: 1686658578 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCUnityPackage.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCUnityPackage.cs new file mode 100644 index 0000000..2ab466f --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCUnityPackage.cs @@ -0,0 +1,20 @@ +using System; +using Newtonsoft.Json; + +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCUnityPackage + { + [JsonProperty("id")] + public string ID { get; set; } + public string AssetUrl { get; set; } + public string UnityVersion { get; set; } + public long UnitySortNumber { get; set; } + public int AssetVersion { get; set; } + public string Platform { get; set; } + [JsonProperty("created_at")] + public DateTime CreatedAt { get; set; } + public string Variant { get; set; } + } +} + diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCUnityPackage.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCUnityPackage.cs.meta new file mode 100644 index 0000000..14488cc --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCUnityPackage.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f7f09500761d4a019e606df903a022c8 +timeCreated: 1683134817 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCWorld.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCWorld.cs new file mode 100644 index 0000000..ce3e3c9 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCWorld.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using VRC.Core; + +namespace VRC.SDKBase.Editor.Api +{ + public struct VRCWorld: IVRCContent + { + [JsonProperty("id")] + public string ID { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string PreviewYoutubeId { get; set; } + public List Tags { get; set; } + public List UdonProducts { get; set; } + + public string AuthorName { get; set; } + public string AuthorId { get; set; } + + public string ImageUrl { get; set; } + public string ThumbnailImageUrl { get; set; } + + public string ReleaseStatus { get; set; } + + public int Capacity { get; set; } + public int RecommendedCapacity { get; set; } + public int Favorites { get; set; } + public int Visits { get; set; } + // public int Popularity { get; set; } // this field doesn't deserialize correctly for VERY popular worlds, ignoring in SDK for now + public int Heat { get; set; } + public int Occupants { get; set; } + public int PublicOccupants { get; set; } + public int PrivateOccupants { get; set; } + + public List Instances { get; set; } + + public struct Instance + { + public string ID { get; set; } + public int Occupants { get; set; } + } + + [JsonProperty("created_at")] + public DateTime CreatedAt { get; set; } + [JsonProperty("updated_at")] + public DateTime UpdatedAt { get; set; } + public DateTime PublicationDate { get; set; } + public DateTime LabsPublicationDate { get; set; } + + public int Version { get; set; } + public List UnityPackages { get; set; } + + public string Organization { get; set; } + public bool Featured { get; set; } + + public string GetLatestAssetUrlForPlatform(string platform) + { + string assetUrl = null; + var preferredUnityVersion = new UnityVersion(); + if (this.UnityPackages == null) return null; + foreach (var unityPackage in this.UnityPackages) + { + if (UnityVersion.Parse(unityPackage.UnityVersion).CompareTo(preferredUnityVersion) < 0) continue; + if (unityPackage.Platform != platform) continue; + assetUrl = unityPackage.AssetUrl; + preferredUnityVersion = UnityVersion.Parse(unityPackage.UnityVersion); + } + + return assetUrl; + } + } + + // Only a subset of fields is allowed to be changed through the SDK + public struct VRCWorldChanges { + public string Name { get; set; } + public string Description { get; set; } + public int Capacity { get; set; } + public int RecommendedCapacity { get; set; } + public string PreviewYoutubeId { get; set; } + public List Tags { get; set; } + } +} + diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCWorld.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCWorld.cs.meta new file mode 100644 index 0000000..80f6de5 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/API/VRCWorld.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bcf1554494894265b68fbf2e7c089782 +timeCreated: 1683134291 \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline.meta new file mode 100644 index 0000000..7500711 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 41dfa12618ada604f98c12a95a3f455a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples.meta new file mode 100644 index 0000000..e86cac9 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6e2ea84994e53bd458fa73dfcfd0d671 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs new file mode 100644 index 0000000..80f026e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs @@ -0,0 +1,18 @@ +#if VRC_SDK_PIPELINE_SAMPLES + +using UnityEditor; + +namespace VRC.SDKBase.Editor.BuildPipeline.Samples +{ + public class VRCSDKBuildRequestedCallbackSample : IVRCSDKBuildRequestedCallback + { + public int callbackOrder => 0; + + public bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType) + { + return EditorUtility.DisplayDialog("Build Confirmation", "Are you sure you want to build?", "Yes", "Not Yes"); + } + } +} + +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs.meta new file mode 100644 index 0000000..1b52ab1 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/Samples/VRCSDKBuildRequestedCallbackSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a1d20f4241085e46bdddc71b691465b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef new file mode 100644 index 0000000..a59fc7d --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef @@ -0,0 +1,12 @@ +{ + "name": "VRC.SDKBase.Editor.BuildPipeline", + "references": [], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef.meta new file mode 100644 index 0000000..ec3710a --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/BuildPipeline/VRC.SDKBase.Editor.BuildPipeline.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 21332e1f0d937794d916d2402ba1943a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components.meta new file mode 100644 index 0000000..a656218 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 027731dadc7571046abaf43e4f52e9ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/AutoAddSpatialAudioComponents.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/AutoAddSpatialAudioComponents.cs new file mode 100644 index 0000000..205f466 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/AutoAddSpatialAudioComponents.cs @@ -0,0 +1,230 @@ +using UnityEngine; +using System.Collections; +using UnityEditor; +using VRC.SDKBase; + +[InitializeOnLoad] +public class AutoAddSpatialAudioComponents +{ + + public static bool Enabled = true; + + static AutoAddSpatialAudioComponents() + { + EditorApplication.hierarchyChanged += OnHierarchyWindowChanged; + EditorApplication.projectChanged += OnProjectWindowChanged; + RegisterCallbacks(); + } + + static void OnHierarchyWindowChanged() + { + if (!Enabled) + { + EditorApplication.hierarchyChanged -= OnHierarchyWindowChanged; + return; + } + + // check for proper use of VRCSP, and warn + //TryToAddSpatializationToAllAudioSources(true, false); + } + + static void OnProjectWindowChanged() + { + RegisterCallbacks(); + } + + static void RegisterCallbacks() + { + VRCSdkControlPanel._EnableSpatialization = VRCSDKControlPanel_EnableSpatialization; + } + + // callback from VrcSdkControlPanel in dll + public static void VRCSDKControlPanel_EnableSpatialization() + { + Debug.Log("Enabling spatialization on 3D AudioSources..."); + TryToAddSpatializationToAllAudioSources(false, true); + } + + static bool ApplyDefaultSpatializationToAudioSource(AudioSource audioSrc, bool force = false) + { + if (audioSrc == null) + return false; + + var vrcsp = audioSrc.gameObject.GetComponent(); + + // don't make changes if we already have a vrcsp and we aren't forcing + if (vrcsp != null && !force) + return false; + + if (force) + audioSrc.spatialBlend = 1; + + bool initValues = force; + + // is audio source set to be 2D? + bool is2D = audioSrc.spatialBlend == 0; + + if (vrcsp == null) + { + // no onsp and no vrcsp, so add + vrcsp = audioSrc.gameObject.AddComponent(); + if (is2D) + { + // this audio source was marked as 2D, leave the vrcsp disabled + vrcsp.EnableSpatialization = false; + } + initValues = true; + } + + audioSrc.spatialize = vrcsp.EnableSpatialization; + vrcsp.enabled = true; + + if (initValues) + { + bool isAvatar = audioSrc.GetComponentInParent(); + + vrcsp.Gain = isAvatar ? AudioManagerSettings.AvatarAudioMaxGain : AudioManagerSettings.RoomAudioGain; + vrcsp.Near = 0; + vrcsp.Far = isAvatar ? AudioManagerSettings.AvatarAudioMaxRange : AudioManagerSettings.RoomAudioMaxRange; + vrcsp.UseAudioSourceVolumeCurve = false; + } + + return true; + } + + public static void TryToAddSpatializationToAllAudioSources(bool newAudioSourcesOnly, bool includeInactive) + { + AudioSource[] allAudioSources = includeInactive ? Resources.FindObjectsOfTypeAll() : Object.FindObjectsByType(FindObjectsSortMode.None); + foreach (AudioSource src in allAudioSources) + { + if (src == null || src.gameObject == null || src.gameObject.scene != UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()) + { + continue; + } + + if (newAudioSourcesOnly) + { + if (!IsNewAudioSource(src)) + continue; + + UnityEngine.Audio.AudioMixerGroup mixer = AssetDatabase.LoadAssetAtPath("Assets/VRCSDK/Dependencies/OSPNative/scenes/mixers/SpatializerMixer.mixer"); + if (mixer != null) + { + src.outputAudioMixerGroup = mixer; + } + } + + if (ApplyDefaultSpatializationToAudioSource(src, false)) + { + Debug.Log("Automatically added VRC_SpatialAudioSource component to " + GetGameObjectPath(src.gameObject) + "!"); + } + } + } + + static bool IsNewAudioSource(AudioSource src) + { + var vrcsp = src.GetComponent(); + if (vrcsp != null) + return false; + + if (src.clip != null) + return false; + if (src.outputAudioMixerGroup != null) + return false; + + if (src.mute || src.bypassEffects || src.bypassReverbZones || !src.playOnAwake || src.loop) + return false; + + if (src.priority != 128 || + !Mathf.Approximately(src.volume, 1.0f) || + !Mathf.Approximately(src.pitch, 1.0f) || + !Mathf.Approximately(src.panStereo, 0.0f) || + !Mathf.Approximately(src.spatialBlend, 0.0f) || + !Mathf.Approximately(src.reverbZoneMix, 1.0f)) + { + return false; + } + + if (!Mathf.Approximately(src.dopplerLevel, 1.0f) || + !Mathf.Approximately(src.spread, 0.0f) || + src.rolloffMode != AudioRolloffMode.Logarithmic || + !Mathf.Approximately(src.minDistance, 1.0f) || + !Mathf.Approximately(src.maxDistance, 500.0f)) + { + return false; + } + + return true; + } + + static string GetGameObjectPath(GameObject obj) + { + string path = "/" + obj.name; + while (obj.transform.parent != null) + { + obj = obj.transform.parent.gameObject; + path = "/" + obj.name + path; + } + return path; + } + + public static void ConvertONSPAudioSource(AudioSource src) + { + if (src == null) return; + + var onsp = src.GetComponent(); + if (onsp != null) + { + var vrcsp = src.gameObject.GetComponent(); + if (vrcsp == null) + { + // copy the values from deprecated component + vrcsp = src.gameObject.AddComponent(); + vrcsp.Gain = onsp.Gain; + vrcsp.Near = onsp.Near; + vrcsp.Far = onsp.Far; + vrcsp.UseAudioSourceVolumeCurve = !onsp.UseInvSqr; + vrcsp.EnableSpatialization = onsp.EnableSpatialization; + } + // remove deprecated component + Component.DestroyImmediate(onsp); + } + } + + public static void AddVRCSpatialToBareAudioSource(AudioSource src) + { + if (src == null) return; + + var vrcsp = src.gameObject.GetComponent(); + if (vrcsp != null) return; + +#if VRC_SDK_VRCSDK2 + vrcsp = src.gameObject.AddComponent(); +#elif UDON + vrcsp = src.gameObject.AddComponent(); +#endif + + // add default values + bool isAvatar = src.gameObject.GetComponentInParent(); + + vrcsp.Gain = isAvatar ? AudioManagerSettings.AvatarAudioMaxGain : AudioManagerSettings.RoomAudioGain; + vrcsp.Near = 0; + vrcsp.Far = isAvatar ? AudioManagerSettings.AvatarAudioMaxRange : AudioManagerSettings.RoomAudioMaxRange; + vrcsp.UseAudioSourceVolumeCurve = false; + + // enable spatialization if src is not 2D + vrcsp.EnableSpatialization = false; + AnimationCurve curve = src.GetCustomCurve(AudioSourceCurveType.SpatialBlend); + if (curve != null) + { + foreach (var key in curve.keys) + { + if (key.value != 0 || key.inTangent != 0) + { + vrcsp.EnableSpatialization = true; + break; + } + } + } + } +} diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/AutoAddSpatialAudioComponents.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/AutoAddSpatialAudioComponents.cs.meta new file mode 100644 index 0000000..2269c8f --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/AutoAddSpatialAudioComponents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a364ece829b6234888c59987a305a00 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorCoroutine.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorCoroutine.cs new file mode 100644 index 0000000..8363d45 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorCoroutine.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +public class EditorCoroutine +{ + public static EditorCoroutine Start( IEnumerator _routine ) + { + EditorCoroutine coroutine = new EditorCoroutine(_routine); + coroutine.start(); + return coroutine; + } + + + public static EditorCoroutine Start(System.Action _action) + { + EditorCoroutine coroutine = new EditorCoroutine(_action); + coroutine.start(); + return coroutine; + } + + readonly IEnumerator routine; + EditorCoroutine( IEnumerator _routine ) + { + routine = _routine; + } + + readonly System.Action action; + EditorCoroutine(System.Action _action) + { + action = _action; + } + + void start() + { + EditorApplication.update += update; + } + public void stop() + { + EditorApplication.update -= update; + } + + void update() + { + if (routine != null) + { + if (!routine.MoveNext()) + stop(); + } + else if (action != null) + { + action(); + stop(); + } + else + stop(); + + } +} diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorCoroutine.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorCoroutine.cs.meta new file mode 100644 index 0000000..dc45228 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorCoroutine.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 89005ebc9543e0a4284893c09ca19b1d +timeCreated: 1473271738 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorHandling.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorHandling.cs new file mode 100644 index 0000000..32923b5 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorHandling.cs @@ -0,0 +1,17 @@ +using UnityEditor; +using UnityEngine.SceneManagement; + +[InitializeOnLoad] +public static class EditorHandling +{ + static EditorHandling() + { + UnityEditor.SceneManagement.EditorSceneManager.sceneOpened += SceneOpenedCallback; + } + + static void SceneOpenedCallback( Scene scene, UnityEditor.SceneManagement.OpenSceneMode mode) + { + // refresh window when scene is opened to display content images correctly + if (null != VRCSdkControlPanel.window) VRCSdkControlPanel.window.Reset(); + } +} diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorHandling.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorHandling.cs.meta new file mode 100644 index 0000000..7657e22 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EditorHandling.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d6c2e367eaa9564ebf6267ec163cfbd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EventHandlerEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EventHandlerEditor.cs new file mode 100644 index 0000000..fcca309 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EventHandlerEditor.cs @@ -0,0 +1,358 @@ +#if UNITY_EDITOR + +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; +using System.Collections.Generic; +using System.Linq; +using VRC.SDKBase; + +namespace VRCSDK2 +{ +#if VRC_SDK_VRCSDK2 + [CustomEditor(typeof(VRCSDK2.VRC_EventHandler))] + public class EventHandlerEditor : UnityEditor.Editor + { + bool showDeferredEvents = false; + + static VRCSDK2.VRC_EventHandler.VrcEventType lastAddedEventType = VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage; + + public override void OnInspectorGUI() + { + VRCSDK2.VRC_EventHandler myTarget = (VRCSDK2.VRC_EventHandler)target; + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("ID:"); + EditorGUILayout.EndHorizontal(); + + if (myTarget.GetComponent() != null) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Add Events via the VRC_Trigger on this object."); + EditorGUILayout.EndHorizontal(); + } + else + { + EditorGUI.BeginChangeCheck(); + + RenderOldEditor(myTarget); + + if (EditorGUI.EndChangeCheck()) + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + } + + if (myTarget.deferredEvents.Count > 0) + { + showDeferredEvents = EditorGUILayout.Foldout(showDeferredEvents, "Deferred Events"); + if (showDeferredEvents) + RenderEvents(myTarget.deferredEvents); + } + } + + int[] sendMessageMethodIndicies; + private void RenderOldEditor(VRCSDK2.VRC_EventHandler myTarget) + { + EditorGUILayout.HelpBox("Please use a VRC_Trigger in the future.", MessageType.Error); + + if (GUILayout.Button("Add Event Handler")) + myTarget.Events.Add(new VRCSDK2.VRC_EventHandler.VrcEvent()); + + bool first = true; + int deleteEventIndex = -1; + if (sendMessageMethodIndicies == null || sendMessageMethodIndicies.Length != myTarget.Events.Count) + sendMessageMethodIndicies = new int[myTarget.Events.Count + 1]; + + for (int i = 0; i < myTarget.Events.Count; ++i) + { + if (!first) + EditorGUILayout.Separator(); + first = false; + + EditorGUILayout.LabelField("Event " + (i + 1).ToString()); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Event Name"); + myTarget.Events[i].Name = EditorGUILayout.TextField(myTarget.Events[i].Name); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Event Type"); + myTarget.Events[i].EventType = (VRCSDK2.VRC_EventHandler.VrcEventType)EditorGUILayout.EnumPopup(myTarget.Events[i].EventType); + EditorGUILayout.EndHorizontal(); + + switch (myTarget.Events[i].EventType) + { + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationBool: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Variable"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationFloat: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Variable"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Value"); + myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationTrigger: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Trigger"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AudioTrigger: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("AudioSource"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Mesh"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.PlayAnimation: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Target"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Animation"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Command"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Receiver"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Message"); + + // sorry for this shit show. Below allows us to show a list of public methods, but also allow custom messages + var methods = VRC_EditorTools.GetAccessibleMethodsOnGameObject(myTarget.Events[i].ParameterObject); + List methodList = methods.Values.Aggregate(new List(), (acc, lst) => { acc.AddRange(lst.Select(mi => mi.Name)); return acc; }); + methodList.Add("Custom Message"); + + string[] _choices = methodList.ToArray(); + + int currentIndex = methodList.Count - 1; + + if (methodList.Contains(myTarget.Events[i].ParameterString)) + currentIndex = methodList.IndexOf(myTarget.Events[i].ParameterString); + + sendMessageMethodIndicies[i] = EditorGUILayout.Popup(currentIndex, _choices); + + if (sendMessageMethodIndicies[i] != methodList.Count - 1) + { + myTarget.Events[i].ParameterString = _choices[sendMessageMethodIndicies[i]]; + } + else + { + if (methodList.Contains(myTarget.Events[i].ParameterString)) + myTarget.Events[i].ParameterString = ""; + + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + } + + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetGameObjectActive: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("GameObject"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetParticlePlaying: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Target"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Operation"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.TeleportPlayer: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Location"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Align Room To Destination"); + myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelURI: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("URI"); + myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Panel"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelVolume: + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Volume"); + myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Panel"); + myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); + EditorGUILayout.EndHorizontal(); + break; + default: + EditorGUILayout.BeginHorizontal(); + GUIStyle redText = new GUIStyle(); + redText.normal.textColor = Color.red; + EditorGUILayout.LabelField("Unsupported event type", redText); + EditorGUILayout.EndHorizontal(); + break; + } + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Delete " + myTarget.Events[i].Name + "?"); + if (GUILayout.Button("delete")) + deleteEventIndex = i; + EditorGUILayout.EndHorizontal(); + + if (myTarget.Events[i].ParameterObject == null) + myTarget.Events[i].ParameterObject = myTarget.gameObject; + } + + + if (deleteEventIndex != -1) + myTarget.Events.RemoveAt(deleteEventIndex); + } + + private void RenderEvents(IEnumerable entries) + { + foreach (VRCSDK2.VRC_EventHandler.EventInfo entry in entries) + { + EditorGUILayout.PrefixLabel("Target"); + EditorGUILayout.ObjectField(entry.evt.ParameterObject, typeof(GameObject), true); + + EditorGUILayout.LabelField(string.Format("Name: {0}", entry.evt.Name)); + EditorGUILayout.LabelField(string.Format("Type: {0}", entry.evt.EventType)); + EditorGUILayout.LabelField(string.Format("Bool: {0}", entry.evt.ParameterBool)); + EditorGUILayout.LabelField(string.Format("Float: {0}", entry.evt.ParameterFloat)); + EditorGUILayout.LabelField(string.Format("Int: {0}", entry.evt.ParameterInt)); + EditorGUILayout.LabelField(string.Format("String: {0}", entry.evt.ParameterString)); + + EditorGUILayout.Space(); + } + } + + public static void RenderEditor(VRCSDK2.VRC_EventHandler myTarget) + { + bool first = true; + int deleteEventIndex = -1; + + for (int i = 0; i < myTarget.Events.Count; ++i) + { + if (!first) + EditorGUILayout.Separator(); + first = false; + + if (RenderEventHeader(myTarget, myTarget.Events[i])) + deleteEventIndex = i; + + RenderEventHeader(myTarget, myTarget.Events[i]); + + if (myTarget.Events[i].ParameterObject == null) + myTarget.Events[i].ParameterObject = myTarget.gameObject; + } + + if (deleteEventIndex != -1) + myTarget.Events.RemoveAt(deleteEventIndex); + } + + public static VRCSDK2.VRC_EventHandler.VrcEvent RenderAddEvent(VRCSDK2.VRC_EventHandler myTarget) + { + VRCSDK2.VRC_EventHandler.VrcEvent newEvent = null; + + EditorGUILayout.BeginHorizontal(); + lastAddedEventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", lastAddedEventType, (v) => v != VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject && v != VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage); + if (GUILayout.Button("Add")) + { + newEvent = new VRCSDK2.VRC_EventHandler.VrcEvent + { + EventType = lastAddedEventType, + ParameterObject = myTarget.gameObject + }; + myTarget.Events.Add(newEvent); + EditorUtility.SetDirty(myTarget); + } + EditorGUILayout.EndHorizontal(); + + return newEvent; + } + + public static bool RenderEventHeader(VRCSDK2.VRC_EventHandler myTarget, VRCSDK2.VRC_EventHandler.VrcEvent evt) + { + EditorGUILayout.BeginHorizontal(); + evt.EventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", evt.EventType, (v) => v != VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject && v != VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage); + bool delete = GUILayout.Button("Remove"); + EditorGUILayout.EndHorizontal(); + + return delete; + } + } + + [CustomEditor(typeof(VRC.SDKBase.VRC_EventHandler))] + public class SDKBaseEventHandlerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.LabelField("Event Handlers are not supported in VRCSDK3."); + if (GUILayout.Button("replace me with the correct VRC_EventHandler")) + { + var go = ((VRC.SDKBase.VRC_EventHandler)target).gameObject; + DestroyImmediate(target); + go.AddComponent(); + } + } + } +#else + + [CustomEditor(typeof(VRC.SDKBase.VRC_EventHandler))] + public class SDKBaseEventHandlerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.LabelField("Event Handlers are not supported in VRCSDK3."); + if( GUILayout.Button("delete me") ) + DestroyImmediate(target); + } + } + +#endif + + +} +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EventHandlerEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EventHandlerEditor.cs.meta new file mode 100644 index 0000000..d0632d4 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/EventHandlerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4810e652e8242384c834320970702290 +timeCreated: 1454469344 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/OldTriggerEditors.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/OldTriggerEditors.cs new file mode 100644 index 0000000..ab085ca --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/OldTriggerEditors.cs @@ -0,0 +1,48 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR + +#pragma warning disable 0618 + +using UnityEditor; +using System.Collections; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_KeyEvents))] + public class VRC_KeyEventsEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_UseEvents))] + public class VRC_UseEventsEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_TriggerColliderEventTrigger))] + public class VRC_TriggerColliderEventTriggerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_TimedEvents))] + public class VRC_TimedEventsEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error); + } + } +} + +#pragma warning restore 0618 +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/OldTriggerEditors.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/OldTriggerEditors.cs.meta new file mode 100644 index 0000000..d3b115e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/OldTriggerEditors.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 482185bf29f12074dada194ffef6a682 +timeCreated: 1475877803 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCAvatarDescriptorEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCAvatarDescriptorEditor.cs new file mode 100644 index 0000000..a980732 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCAvatarDescriptorEditor.cs @@ -0,0 +1,225 @@ +#if VRC_SDK_VRCSDK2 && !VRC_CLIENT +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; +using VRC.SDK3.Editor; +using VRC.SDKBase.Editor; + +[CustomEditor(typeof(VRCSDK2.VRC_AvatarDescriptor))] +public class AvatarDescriptorEditor : Editor +{ + VRCSDK2.VRC_AvatarDescriptor avatarDescriptor; + VRC.Core.PipelineManager pipelineManager; + + SkinnedMeshRenderer selectedMesh; + List blendShapeNames = null; + + bool shouldRefreshVisemes = false; + + public override void OnInspectorGUI() + { + if (avatarDescriptor == null) + avatarDescriptor = (VRCSDK2.VRC_AvatarDescriptor)target; + + if (pipelineManager == null) + { + pipelineManager = avatarDescriptor.GetComponent(); + if (pipelineManager == null) + avatarDescriptor.gameObject.AddComponent(); + } + + // DrawDefaultInspector(); + + if(VRCSdkControlPanel.window != null) + { + if( GUILayout.Button( "Select this avatar in the SDK control panel" ) ) + VRCSdkControlPanelAvatarBuilder.SelectAvatar(avatarDescriptor); + } + + avatarDescriptor.ViewPosition = EditorGUILayout.Vector3Field("View Position", avatarDescriptor.ViewPosition); + //avatarDescriptor.Name = EditorGUILayout.TextField("Avatar Name", avatarDescriptor.Name); + avatarDescriptor.Animations = (VRCSDK2.VRC_AvatarDescriptor.AnimationSet)EditorGUILayout.EnumPopup("Default Animation Set", avatarDescriptor.Animations); + avatarDescriptor.CustomStandingAnims = (AnimatorOverrideController)EditorGUILayout.ObjectField("Custom Standing Anims", avatarDescriptor.CustomStandingAnims, typeof(AnimatorOverrideController), true, null); + avatarDescriptor.CustomSittingAnims = (AnimatorOverrideController)EditorGUILayout.ObjectField("Custom Sitting Anims", avatarDescriptor.CustomSittingAnims, typeof(AnimatorOverrideController), true, null); + avatarDescriptor.ScaleIPD = EditorGUILayout.Toggle("Scale IPD", avatarDescriptor.ScaleIPD); + + avatarDescriptor.lipSync = (VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle)EditorGUILayout.EnumPopup("Lip Sync", avatarDescriptor.lipSync); + switch (avatarDescriptor.lipSync) + { + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.Default: + if (GUILayout.Button("Auto Detect!")) + AutoDetectLipSync(); + break; + + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape: + avatarDescriptor.VisemeSkinnedMesh = (SkinnedMeshRenderer)EditorGUILayout.ObjectField("Face Mesh", avatarDescriptor.VisemeSkinnedMesh, typeof(SkinnedMeshRenderer), true); + if (avatarDescriptor.VisemeSkinnedMesh != null) + { + DetermineBlendShapeNames(); + + int current = -1; + for (int b = 0; b < blendShapeNames.Count; ++b) + if (avatarDescriptor.MouthOpenBlendShapeName == blendShapeNames[b]) + current = b; + + string title = "Jaw Flap Blend Shape"; + int next = EditorGUILayout.Popup(title, current, blendShapeNames.ToArray()); + if (next >= 0) + avatarDescriptor.MouthOpenBlendShapeName = blendShapeNames[next]; + } + break; + + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBone: + avatarDescriptor.lipSyncJawBone = (Transform)EditorGUILayout.ObjectField("Jaw Bone", avatarDescriptor.lipSyncJawBone, typeof(Transform), true); + break; + + case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape: + SkinnedMeshRenderer prev = avatarDescriptor.VisemeSkinnedMesh; + avatarDescriptor.VisemeSkinnedMesh = (SkinnedMeshRenderer)EditorGUILayout.ObjectField("Face Mesh", avatarDescriptor.VisemeSkinnedMesh, typeof(SkinnedMeshRenderer), true); + if (avatarDescriptor.VisemeSkinnedMesh != prev) + shouldRefreshVisemes = true; + if (avatarDescriptor.VisemeSkinnedMesh != null) + { + DetermineBlendShapeNames(); + + if (avatarDescriptor.VisemeBlendShapes == null || avatarDescriptor.VisemeBlendShapes.Length != (int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count) + avatarDescriptor.VisemeBlendShapes = new string[(int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count]; + for (int i = 0; i < (int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count; ++i) + { + int current = -1; + for (int b = 0; b < blendShapeNames.Count; ++b) + if (avatarDescriptor.VisemeBlendShapes[i] == blendShapeNames[b]) + current = b; + + string title = "Viseme: " + ((VRCSDK2.VRC_AvatarDescriptor.Viseme)i).ToString(); + int next = EditorGUILayout.Popup(title, current, blendShapeNames.ToArray()); + if (next >= 0) + avatarDescriptor.VisemeBlendShapes[i] = blendShapeNames[next]; + } + + if (shouldRefreshVisemes) + AutoDetectVisemes(); + } + break; + } + EditorGUILayout.LabelField("Unity Version", avatarDescriptor.unityVersion); + } + + void DetermineBlendShapeNames() + { + if (avatarDescriptor.VisemeSkinnedMesh != null && + avatarDescriptor.VisemeSkinnedMesh != selectedMesh) + { + blendShapeNames = new List(); + blendShapeNames.Add("-none-"); + selectedMesh = avatarDescriptor.VisemeSkinnedMesh; + if ((selectedMesh != null) && (selectedMesh.sharedMesh != null)) + { + for (int i = 0; i < selectedMesh.sharedMesh.blendShapeCount; ++i) + blendShapeNames.Add(selectedMesh.sharedMesh.GetBlendShapeName(i)); + } + } + } + + void AutoDetectVisemes() + { + + // prioritize strict - but fallback to looser - naming and don't touch user-overrides + + List blendShapes = new List(blendShapeNames); + blendShapes.Remove("-none-"); + + for (int v = 0; v < avatarDescriptor.VisemeBlendShapes.Length; v++) + { + if (string.IsNullOrEmpty(avatarDescriptor.VisemeBlendShapes[v])) + { + string viseme = ((VRCSDK2.VRC_AvatarDescriptor.Viseme)v).ToString().ToLowerInvariant(); + + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant() == "vrc.v_" + viseme) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant() == "v_" + viseme) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant().EndsWith(viseme)) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant() == viseme) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + foreach (string s in blendShapes) + { + if (s.ToLowerInvariant().Contains(viseme)) + { + avatarDescriptor.VisemeBlendShapes[v] = s; + goto next; + } + } + next: { } + } + } + + shouldRefreshVisemes = false; + + } + + void AutoDetectLipSync() + { + var smrs = avatarDescriptor.GetComponentsInChildren(); + foreach (var smr in smrs) + { + if (smr.sharedMesh.blendShapeCount > 0) + { + avatarDescriptor.lipSyncJawBone = null; + + if (smr.sharedMesh.blendShapeCount > 1) + { + avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape; + avatarDescriptor.VisemeSkinnedMesh = smr; + shouldRefreshVisemes = true; + } + else + { + avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape; + avatarDescriptor.VisemeSkinnedMesh = null; + } + + return; + } + } + + Animator a = avatarDescriptor.GetComponent(); + if (!a) + EditorUtility.DisplayDialog("Ooops", "This avatar has no Animator and can have no lipsync.", "OK"); + else if (a.GetBoneTransform(HumanBodyBones.Jaw) != null) + { + avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBone; + avatarDescriptor.lipSyncJawBone = avatarDescriptor.GetComponent().GetBoneTransform(HumanBodyBones.Jaw); + avatarDescriptor.VisemeSkinnedMesh = null; + return; + } + + } +} +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCAvatarDescriptorEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCAvatarDescriptorEditor.cs.meta new file mode 100644 index 0000000..efb9de9 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCAvatarDescriptorEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5e83254bb97e84795ac882692ae124ba +timeCreated: 1450462624 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSpawnEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSpawnEditor.cs new file mode 100644 index 0000000..ab194e3 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSpawnEditor.cs @@ -0,0 +1,23 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using System.Collections; +using UnityEditor; +using System; + +[CustomEditor(typeof(VRCSDK2.VRC_ObjectSpawn))] +public class VRCObjectSpawnEditor : Editor +{ + VRCSDK2.VRC_ObjectSpawn spawn; + + void OnEnable() + { + if (spawn == null) + spawn = (VRCSDK2.VRC_ObjectSpawn)target; + } + + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSpawnEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSpawnEditor.cs.meta new file mode 100644 index 0000000..9e23871 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSpawnEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 26a75599848adb449b7aceed5090e35c +timeCreated: 1463516633 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSyncEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSyncEditor.cs new file mode 100644 index 0000000..4272f04 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSyncEditor.cs @@ -0,0 +1,25 @@ +#if VRC_SDK_VRCSDK2 + +using UnityEngine; +using System.Collections; +using UnityEditor; +using System; + +[CustomEditor(typeof(VRCSDK2.VRC_ObjectSync))] +public class VRCObjectSyncEditor : Editor +{ + VRCSDK2.VRC_ObjectSync sync; + + void OnEnable() + { + if (sync == null) + sync = (VRCSDK2.VRC_ObjectSync)target; + } + + public override void OnInspectorGUI() + { + sync.SynchronizePhysics = EditorGUILayout.Toggle("Synchronize Physics",sync.SynchronizePhysics); + sync.AllowCollisionTransfer = EditorGUILayout.Toggle("Allow Collision Transfer", sync.AllowCollisionTransfer); + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSyncEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSyncEditor.cs.meta new file mode 100644 index 0000000..c95d4e3 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCObjectSyncEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed4aad2698d3b62408e69b57c7748791 +timeCreated: 1463516212 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModEditorWindow.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModEditorWindow.cs new file mode 100644 index 0000000..693cd36 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModEditorWindow.cs @@ -0,0 +1,37 @@ +#if VRC_SDK_VRCSDK2 + +using UnityEngine; +using UnityEditor; + +public class VRCPlayerModEditorWindow : EditorWindow { + + public delegate void AddModCallback(); + public static AddModCallback addModCallback; + + private static VRCSDK2.VRC_PlayerMods myTarget; + + private static VRCSDK2.VRCPlayerModFactory.PlayerModType type; + + public static void Init (VRCSDK2.VRC_PlayerMods target, AddModCallback callback) + { + // Get existing open window or if none, make a new one: + EditorWindow.GetWindow (typeof (VRCPlayerModEditorWindow)); + addModCallback = callback; + myTarget = target; + + type = VRCSDK2.VRCPlayerModFactory.PlayerModType.Jump; + } + + void OnGUI () + { + type = (VRCSDK2.VRCPlayerModFactory.PlayerModType)EditorGUILayout.EnumPopup("Mods", type); + if(GUILayout.Button("Add Mod")) + { + VRCSDK2.VRCPlayerMod mod = VRCSDK2.VRCPlayerModFactory.Create(type); + myTarget.AddMod(mod); + addModCallback(); + } + } +} + +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModEditorWindow.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModEditorWindow.cs.meta new file mode 100644 index 0000000..e43182b --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModEditorWindow.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8986a640e24a0754ea0aded12234b808 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModsEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModsEditor.cs new file mode 100644 index 0000000..5efaa35 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCPlayerModsEditor.cs @@ -0,0 +1,109 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using System; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_PlayerMods))] + public class VRCPlayerModsEditor : UnityEditor.Editor + { + VRCSDK2.VRC_PlayerMods myTarget; + + void OnEnable() + { + if(myTarget == null) + myTarget = (VRCSDK2.VRC_PlayerMods)target; + } + + public override void OnInspectorGUI() + { + myTarget.isRoomPlayerMods = EditorGUILayout.Toggle("isRoomPlayerMods", myTarget.isRoomPlayerMods); + + List playerMods = myTarget.playerMods; + for(int i=0; i(); + if(pipelineManager == null) + sceneDescriptor.gameObject.AddComponent(); + } + + DrawDefaultInspector(); + + + } +} +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCSceneDescriptorEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCSceneDescriptorEditor.cs.meta new file mode 100644 index 0000000..6632567 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRCSceneDescriptorEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e9cbc493bbbc443fb92898aa84d221ec +timeCreated: 1450463561 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_AvatarVariationsEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_AvatarVariationsEditor.cs new file mode 100644 index 0000000..c902642 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_AvatarVariationsEditor.cs @@ -0,0 +1,130 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace VRCSDK2 +{ + //[CustomPropertyDrawer(typeof(VRC_AvatarVariations.VariationCategory))] + //public class PropertyDrawer_AvatarVariation_VariationCategory : PropertyDrawer + //{ + // public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + // { + // //EditorGUILayout.Label("blah"); + + // if (property == null) + // return; + + // SerializedProperty nameProperty = property.FindPropertyRelative("name"); + // //SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror"); + // //SerializedProperty typeProperty = property.FindPropertyRelative("type"); + // //SerializedProperty valueProperty = null; + // //switch (typeProperty.enumValueIndex) + // //{ + // // case (int)VRC_DataStorage.VrcDataType.Bool: + // // valueProperty = property.FindPropertyRelative("valueBool"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.Float: + // // valueProperty = property.FindPropertyRelative("valueFloat"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.Int: + // // valueProperty = property.FindPropertyRelative("valueInt"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.String: + // // valueProperty = property.FindPropertyRelative("valueString"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.SerializeObject: + // // valueProperty = property.FindPropertyRelative("serializeComponent"); + // // break; + // // case (int)VRC_DataStorage.VrcDataType.None: + // // case (int)VRC_DataStorage.VrcDataType.SerializeBytes: + // // break; + // //} + + // EditorGUI.BeginProperty(rect, label, property); + + // int baseWidth = (int)(rect.width / 4); + // Rect nameRect = new Rect(rect.x, rect.y, baseWidth, rect.height); + // //Rect mirrorRect = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height); + // //Rect typeRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height); + // //Rect valueRect = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height); + // //Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height); + + // EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none); + // //EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none); + + // //switch (mirrorProperty.enumValueIndex) + // //{ + // // case (int)VRC_DataStorage.VrcDataMirror.None: + // // if (valueProperty == null) + // // VRC_EditorTools.FilteredEnumPopup(typeValueRect, typeProperty, t => true); + // // else + // // { + // // VRC_EditorTools.FilteredEnumPopup(typeRect, typeProperty, t => true); + // // EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none); + // // } + // // break; + // // case (int)VRC_DataStorage.VrcDataMirror.SerializeComponent: + // // typeProperty.enumValueIndex = (int)VRC_DataStorage.VrcDataType.SerializeObject; + // // EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none); + // // break; + // // default: + // // VRC_EditorTools.FilteredEnumPopup(typeValueRect, typeProperty, t => true); + // // break; + // //} + + // EditorGUI.EndProperty(); + // } + //} + + //[CustomEditor(typeof(VRC_AvatarVariations))] + //public class VRC_AvatarVariationsEditor : Editor + //{ + // SerializedProperty categories; + + // void OnEnable() + // { + // categories = serializedObject.FindProperty("categories"); + // } + + // public override void OnInspectorGUI() + // { + // //serializedObject.Update(); + // // EditorGUILayout.PropertyField(categories); + // //serializedObject.ApplyModifiedProperties(); + + + + // //if (target == null) + // // return; + + // ////var prop = serializedObject.FindProperty("root"); + // ////EditorGUILayout.PropertyField(prop, new GUIContent("Show Help")); + // //VRCSDK2.VRC_AvatarVariations variations = target as VRCSDK2.VRC_AvatarVariations; + // //if (variations.categories == null) + // // variations.categories = new VRC_AvatarVariations.VariationCategory[0]; + + // //foreach ( var vc in variations.categories ) + // //{ + // // vc.name = EditorGUILayout.TextField("Variation Name", vc.name); + // //// SerializedProperty triggers = triggersProperty.Copy(); + // //// int triggersLength = triggers.arraySize; + + // //// List to_remove = new List(); + // //// for (int idx = 0; idx < triggersLength; ++idx) + // //// { + // //// SerializedProperty triggerProperty = triggers.GetArrayElementAtIndex(idx); + // //// } + + // //// EditorGUILayout.LabelField(""); + // ////// helpProperty = serializedObject.FindProperty("ShowHelp"); + // ////// EditorGUILayout.PropertyField(helpProperty, new GUIContent("Show Help")); + // //} + + // ////EditorGUILayout. + + // DrawDefaultInspector(); + // } + //} + +} diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_AvatarVariationsEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_AvatarVariationsEditor.cs.meta new file mode 100644 index 0000000..b4f3a9f --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_AvatarVariationsEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eeda995d0ceac6443a54716996eab52e +timeCreated: 1511373338 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DataStorageEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DataStorageEditor.cs new file mode 100644 index 0000000..bdc1918 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DataStorageEditor.cs @@ -0,0 +1,91 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR +using UnityEditor; +using UnityEngine; +using VRC.SDKBase; + +namespace VRCSDK2 +{ + [CustomPropertyDrawer(typeof(VRCSDK2.VRC_DataStorage.VrcDataElement))] + public class CustomDataElementDrawer : PropertyDrawer + { + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + if (property == null) + return; + + SerializedProperty nameProperty = property.FindPropertyRelative("name"); + SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror"); + SerializedProperty typeProperty = property.FindPropertyRelative("type"); + SerializedProperty valueProperty = null; + switch (typeProperty.enumValueIndex) + { + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Bool: + valueProperty = property.FindPropertyRelative("valueBool"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Float: + valueProperty = property.FindPropertyRelative("valueFloat"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Int: + valueProperty = property.FindPropertyRelative("valueInt"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.String: + valueProperty = property.FindPropertyRelative("valueString"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeObject: + valueProperty = property.FindPropertyRelative("serializeComponent"); + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.None: + case (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeBytes: + break; + } + + EditorGUI.BeginProperty(rect, label, property); + + int baseWidth = (int)(rect.width / 4); + Rect nameRect = new Rect(rect.x, rect.y, baseWidth, rect.height); + Rect mirrorRect = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height); + Rect typeRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height); + Rect valueRect = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height); + Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height); + + EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none); + EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none); + + switch (mirrorProperty.enumValueIndex) + { + case (int)VRCSDK2.VRC_DataStorage.VrcDataMirror.None: + if (valueProperty == null) + VRC_EditorTools.FilteredEnumPopup(typeValueRect, typeProperty, t => true); + else + { + VRC_EditorTools.FilteredEnumPopup(typeRect, typeProperty, t => true); + EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none); + } + break; + case (int)VRCSDK2.VRC_DataStorage.VrcDataMirror.SerializeComponent: + typeProperty.enumValueIndex = (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeObject; + EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none); + break; + default: + VRC_EditorTools.FilteredEnumPopup(typeValueRect, typeProperty, t => true); + break; + } + + EditorGUI.EndProperty(); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_DataStorage)), CanEditMultipleObjects] + public class VRC_DataStorageEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + VRCSDK2.VRC_ObjectSync os = ((VRCSDK2.VRC_DataStorage)target).GetComponent(); + if (os != null && os.SynchronizePhysics) + EditorGUILayout.HelpBox("Consider either removing the VRC_ObjectSync or disabling SynchronizePhysics.", MessageType.Warning); + + DrawDefaultInspector(); + } + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DataStorageEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DataStorageEditor.cs.meta new file mode 100644 index 0000000..a46a6e7 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DataStorageEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0ac7998a36f085844847acbc046d4e27 +timeCreated: 1478191469 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DestructibleStandardEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DestructibleStandardEditor.cs new file mode 100644 index 0000000..5eaf7be --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DestructibleStandardEditor.cs @@ -0,0 +1,57 @@ +using UnityEngine; +using UnityEditor; +using VRC_DestructibleStandard = VRC.SDKBase.VRC_DestructibleStandard; +using VRC.SDKBase; + +[CustomEditor(typeof(VRC_DestructibleStandard))] +[CanEditMultipleObjects] +public class VRC_DestructibleStandardEditor : Editor +{ + VRC_DestructibleStandard ds; + + SerializedProperty maxHealth; + SerializedProperty currentHealth; + SerializedProperty healable; + SerializedProperty onDamagedTrigger; + SerializedProperty onDestroyedTrigger; + SerializedProperty onHealedTrigger; + SerializedProperty onFullHealedTrigger; + + void OnEnable() + { + maxHealth = serializedObject.FindProperty("maxHealth"); + currentHealth = serializedObject.FindProperty("currentHealth"); + healable = serializedObject.FindProperty("healable"); + onDamagedTrigger = serializedObject.FindProperty("onDamagedTrigger"); + onDestroyedTrigger = serializedObject.FindProperty("onDestructedTrigger"); + onHealedTrigger = serializedObject.FindProperty("onHealedTrigger"); + onFullHealedTrigger = serializedObject.FindProperty("onFullHealedTrigger"); + } + + public override void OnInspectorGUI() + { + ds = (VRC_DestructibleStandard)target; + + // Update the serializedProperty - always do this in the beginning of OnInspectorGUI. + serializedObject.Update (); + + EditorGUILayout.PropertyField(maxHealth, new GUIContent("Max Health")); + EditorGUILayout.PropertyField(currentHealth, new GUIContent("Current Health")); + EditorGUILayout.PropertyField(healable, new GUIContent("Is Healable")); + + EditorGUILayout.PropertyField(onDamagedTrigger, new GUIContent("On Damaged Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Damaged Action", ds.onDamagedTrigger, ds.onDamagedEvent); + + EditorGUILayout.PropertyField(onDestroyedTrigger, new GUIContent("On Destructed Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Destructed Action", ds.onDestructedTrigger, ds.onDestructedEvent); + + EditorGUILayout.PropertyField(onHealedTrigger, new GUIContent("On Healed Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Healed Action", ds.onHealedTrigger, ds.onHealedEvent); + + EditorGUILayout.PropertyField(onFullHealedTrigger, new GUIContent("On Full Healed Trigger")); + VRC_EditorTools.DrawTriggerActionCallback("On Full Healed Action", ds.onFullHealedTrigger, ds.onFullHealedEvent); + + // Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI. + serializedObject.ApplyModifiedProperties (); + } +} diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DestructibleStandardEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DestructibleStandardEditor.cs.meta new file mode 100644 index 0000000..34d65d2 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_DestructibleStandardEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3b63b118c0591b548ba1797e6be4292e +timeCreated: 1477161996 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_ObjectSyncEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_ObjectSyncEditor.cs new file mode 100644 index 0000000..13686ea --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_ObjectSyncEditor.cs @@ -0,0 +1,19 @@ +#if VRC_SDK_VRCSDK2 +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +[CustomEditor(typeof(VRCSDK2.VRC_ObjectSync))] +public class VRC_ObjectSyncEditor : Editor { + public override void OnInspectorGUI() + { + VRCSDK2.VRC_ObjectSync c = ((VRCSDK2.VRC_ObjectSync)target); + if ((c.gameObject.GetComponent() != null || c.gameObject.GetComponent() != null) && c.SynchronizePhysics) + EditorGUILayout.HelpBox("If the Animator or Animation moves the root position of this object then it will conflict with physics synchronization.", MessageType.Warning); + if (c.GetComponent() != null && c.SynchronizePhysics) + EditorGUILayout.HelpBox("Consider either removing the VRC_DataStorage or disabling SynchronizePhysics.", MessageType.Warning); + DrawDefaultInspector(); + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_ObjectSyncEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_ObjectSyncEditor.cs.meta new file mode 100644 index 0000000..7cf90f3 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_ObjectSyncEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e19a7147a2386554a8e4d6e414f190a2 +timeCreated: 1504908295 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PickupEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PickupEditor.cs new file mode 100644 index 0000000..947dba7 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PickupEditor.cs @@ -0,0 +1,70 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR +using UnityEditor; +using UnityEngine; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_Pickup))] + public class VRC_PickupEditor : UnityEditor.Editor + { + private void InspectorField(string propertyName, string humanName) + { + SerializedProperty propertyField = serializedObject.FindProperty(propertyName); + EditorGUILayout.PropertyField(propertyField, new GUIContent(humanName), true); + } + + private SerializedProperty momentumTransferMethodProperty; + private SerializedProperty disallowTheftProperty; + private SerializedProperty exactGunProperty; + private SerializedProperty exactGripProperty; + private SerializedProperty allowManipulationWhenEquippedProperty; + private SerializedProperty orientationProperty; + private SerializedProperty autoHoldProperty; + private SerializedProperty interactionTextProperty; + private SerializedProperty useTextProperty; + private SerializedProperty throwVelocityBoostMinSpeedProperty; + private SerializedProperty throwVelocityBoostScaleProperty; + private SerializedProperty pickupableProperty; + private SerializedProperty proximityProperty; + + public override void OnInspectorGUI() + { + momentumTransferMethodProperty = serializedObject.FindProperty("MomentumTransferMethod"); + disallowTheftProperty = serializedObject.FindProperty("DisallowTheft"); + exactGunProperty = serializedObject.FindProperty("ExactGun"); + exactGripProperty = serializedObject.FindProperty("ExactGrip"); + allowManipulationWhenEquippedProperty = serializedObject.FindProperty("allowManipulationWhenEquipped"); + orientationProperty = serializedObject.FindProperty("orientation"); + autoHoldProperty = serializedObject.FindProperty("AutoHold"); + interactionTextProperty = serializedObject.FindProperty("InteractionText"); + useTextProperty = serializedObject.FindProperty("UseText"); + throwVelocityBoostMinSpeedProperty = serializedObject.FindProperty("ThrowVelocityBoostMinSpeed"); + throwVelocityBoostScaleProperty = serializedObject.FindProperty("ThrowVelocityBoostScale"); + pickupableProperty = serializedObject.FindProperty("pickupable"); + proximityProperty = serializedObject.FindProperty("proximity"); + + EditorGUILayout.BeginVertical(GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 30)); + + EditorGUILayout.PropertyField(momentumTransferMethodProperty, new GUIContent("Momentum Transfer Method")); + EditorGUILayout.PropertyField(disallowTheftProperty, new GUIContent("Disallow Theft")); + EditorGUILayout.PropertyField(exactGunProperty, new GUIContent("Exact Gun")); + EditorGUILayout.PropertyField(exactGripProperty, new GUIContent("Exact Grip")); + EditorGUILayout.PropertyField(allowManipulationWhenEquippedProperty, new GUIContent("Allow Manipulation When Equipped")); + EditorGUILayout.PropertyField(orientationProperty, new GUIContent("Orientation")); + EditorGUILayout.PropertyField(autoHoldProperty, new GUIContent("AutoHold", "If the pickup is supposed to be aligned to the hand (i.e. orientation field is set to Gun or Grip), auto-detect means that it will be Equipped(not dropped when they release trigger), otherwise just hold as a normal pickup.")); + EditorGUILayout.PropertyField(interactionTextProperty, new GUIContent("Interaction Text","Text displayed when user hovers over the pickup.")); + if (autoHoldProperty.enumValueIndex != (int)VRCSDK2.VRC_Pickup.AutoHoldMode.No) + EditorGUILayout.PropertyField(useTextProperty, new GUIContent("Use Text", "Text to display describing action for clicking button, when this pickup is already being held.")); + EditorGUILayout.PropertyField(throwVelocityBoostMinSpeedProperty, new GUIContent("Throw Velocity Boost Min Speed")); + EditorGUILayout.PropertyField(throwVelocityBoostScaleProperty, new GUIContent("Throw Velocity Boost Scale")); + EditorGUILayout.PropertyField(pickupableProperty, new GUIContent("Pickupable")); + EditorGUILayout.PropertyField(proximityProperty, new GUIContent("Proximity")); + + EditorGUILayout.EndVertical(); + + serializedObject.ApplyModifiedProperties(); + } + + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PickupEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PickupEditor.cs.meta new file mode 100644 index 0000000..0204212 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PickupEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4aff4e5c0d600c845b29d7b8b7965d68 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PlayerAudioOverrideEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PlayerAudioOverrideEditor.cs new file mode 100644 index 0000000..e213812 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PlayerAudioOverrideEditor.cs @@ -0,0 +1,106 @@ +#if VRC_SDK_VRCSDK2 +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using System; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_PlayerAudioOverride))] + public class VRC_PlayerAudioOverrideEditor : UnityEditor.Editor + { + private bool voShow = true; + private bool voAdv = false; + private bool avShow = true; + private bool avAdv = false; + private SerializedProperty prioProperty; + private SerializedProperty globalProperty; + private SerializedProperty regionProperty; + private SerializedProperty voGainProperty; + private SerializedProperty voNearProperty; + private SerializedProperty voFarProperty; + private SerializedProperty voRadiusProperty; + private SerializedProperty voDisableLpProperty; + private SerializedProperty avGainProperty; + private SerializedProperty avNearProperty; + private SerializedProperty avFarProperty; + private SerializedProperty avRadiusProperty; + private SerializedProperty avForceSpatialProperty; + private SerializedProperty avAllowCustomProperty; + + public override void OnInspectorGUI() + { + globalProperty = serializedObject.FindProperty("global"); + regionProperty = serializedObject.FindProperty("region"); + prioProperty = serializedObject.FindProperty("regionPriority"); + + voGainProperty = serializedObject.FindProperty("VoiceGain"); + voNearProperty = serializedObject.FindProperty("VoiceNear"); + voFarProperty = serializedObject.FindProperty("VoiceFar"); + voRadiusProperty = serializedObject.FindProperty("VoiceVolumetricRadius"); + voDisableLpProperty = serializedObject.FindProperty("VoiceDisableLowpass"); + + avGainProperty = serializedObject.FindProperty("AvatarGainLimit"); + avNearProperty = serializedObject.FindProperty("AvatarNearLimit"); + avFarProperty = serializedObject.FindProperty("AvatarFarLimit"); + avRadiusProperty = serializedObject.FindProperty("AvatarVolumetricRadiusLimit"); + avForceSpatialProperty = serializedObject.FindProperty("AvatarForceSpatial"); + avAllowCustomProperty = serializedObject.FindProperty("AvatarAllowCustomCurve"); + + serializedObject.Update(); + + EditorGUILayout.BeginVertical(); + + var ovr = serializedObject.targetObject as VRCSDK2.VRC_PlayerAudioOverride; + + EditorGUILayout.PropertyField(globalProperty, new GUIContent("Global")); + if (!ovr.global) + { + EditorGUILayout.PropertyField(regionProperty, new GUIContent("Region")); + EditorGUILayout.PropertyField(prioProperty, new GUIContent("Priority")); + } + + voShow = EditorGUILayout.Foldout(voShow, "Voice Settings"); + + if (voShow) + { + EditorGUILayout.PropertyField(voGainProperty, new GUIContent("Gain")); + EditorGUILayout.PropertyField(voFarProperty, new GUIContent("Far")); + + EditorGUI.indentLevel++; + voAdv = EditorGUILayout.Foldout(voAdv, "Advanced Options"); + if (voAdv) + { + EditorGUILayout.PropertyField(voNearProperty, new GUIContent("Near")); + EditorGUILayout.PropertyField(voRadiusProperty, new GUIContent("Volumetric Radius")); + EditorGUILayout.PropertyField(voDisableLpProperty, new GUIContent("Disable Lowpass Filter")); + } + EditorGUI.indentLevel--; + } + + avShow = EditorGUILayout.Foldout(avShow, "Avatar Audio Limits"); + + if (avShow) + { + EditorGUILayout.PropertyField(avGainProperty, new GUIContent("Gain Limit")); + EditorGUILayout.PropertyField(avFarProperty, new GUIContent("Far Limit")); + + EditorGUI.indentLevel++; + avAdv = EditorGUILayout.Foldout(avAdv, "Advanced Options"); + if (avAdv) + { + EditorGUILayout.PropertyField(avNearProperty, new GUIContent("Near Limit")); + EditorGUILayout.PropertyField(avRadiusProperty, new GUIContent("Volumetric Radius Limit")); + EditorGUILayout.PropertyField(avForceSpatialProperty, new GUIContent("Force Spatial")); + EditorGUILayout.PropertyField(avAllowCustomProperty, new GUIContent("Allow Custom Curve")); + } + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndVertical(); + + serializedObject.ApplyModifiedProperties(); + } + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PlayerAudioOverrideEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PlayerAudioOverrideEditor.cs.meta new file mode 100644 index 0000000..d7bfd85 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_PlayerAudioOverrideEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5c545625e0bf93045ac1c5864141c5c1 +timeCreated: 1474315179 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SpatialAudioSourceEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SpatialAudioSourceEditor.cs new file mode 100644 index 0000000..c7145db --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SpatialAudioSourceEditor.cs @@ -0,0 +1,58 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR + +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using System; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_SpatialAudioSource))] + public class VRC_SpatialAudioSourceEditor : UnityEditor.Editor + { + private bool showAdvancedOptions = false; + private SerializedProperty gainProperty; + private SerializedProperty nearProperty; + private SerializedProperty farProperty; + private SerializedProperty volRadiusProperty; + private SerializedProperty enableSpatialProperty; + private SerializedProperty useCurveProperty; + + public override void OnInspectorGUI() + { + gainProperty = serializedObject.FindProperty("Gain"); + nearProperty = serializedObject.FindProperty("Near"); + farProperty = serializedObject.FindProperty("Far"); + volRadiusProperty = serializedObject.FindProperty("VolumetricRadius"); + enableSpatialProperty = serializedObject.FindProperty("EnableSpatialization"); + useCurveProperty = serializedObject.FindProperty("UseAudioSourceVolumeCurve"); + + serializedObject.Update(); + + VRCSDK2.VRC_SpatialAudioSource target = serializedObject.targetObject as VRCSDK2.VRC_SpatialAudioSource; + AudioSource source = target.GetComponent(); + + EditorGUILayout.BeginVertical(); + + EditorGUILayout.PropertyField(gainProperty, new GUIContent("Gain")); + EditorGUILayout.PropertyField(farProperty, new GUIContent("Far")); + showAdvancedOptions = EditorGUILayout.Foldout(showAdvancedOptions, "Advanced Options"); + bool enableSp = enableSpatialProperty.boolValue; + if (showAdvancedOptions) + { + EditorGUILayout.PropertyField(nearProperty, new GUIContent("Near")); + EditorGUILayout.PropertyField(volRadiusProperty, new GUIContent("Volumetric Radius")); + EditorGUILayout.PropertyField(enableSpatialProperty, new GUIContent("Enable Spatialization")); + if (enableSp) + EditorGUILayout.PropertyField(useCurveProperty, new GUIContent("Use AudioSource Volume Curve")); + } + + EditorGUILayout.EndVertical(); + + if (source != null) + source.spatialize = enableSp; + serializedObject.ApplyModifiedProperties(); + } + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SpatialAudioSourceEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SpatialAudioSourceEditor.cs.meta new file mode 100644 index 0000000..3f7ca46 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SpatialAudioSourceEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0d2d4cba733f5eb4ba170368e67710d2 +timeCreated: 1474315179 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoPlayerEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoPlayerEditor.cs new file mode 100644 index 0000000..5498e5d --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoPlayerEditor.cs @@ -0,0 +1,105 @@ +#if VRC_SDK_VRCSDK2 + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using VRC.SDKBase; + +[CustomPropertyDrawer(typeof(VRCSDK2.VRC_SyncVideoPlayer.VideoEntry))] +public class CustomVideoEntryDrawer : PropertyDrawer +{ + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty ratio = property.FindPropertyRelative("AspectRatio"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + + return EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(ratio, new GUIContent("Aspect Ratio"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing + + Mathf.Max(EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true), EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true)) + EditorGUIUtility.standardVerticalSpacing; + } + + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty ratio = property.FindPropertyRelative("AspectRatio"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + + EditorGUI.BeginProperty(rect, label, property); + float x = rect.x; + float y = rect.y; + float w = rect.width; + float h = EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing; + VRC_EditorTools.FilteredEnumPopup(new Rect(x, y, w, h), source, (e) => e == UnityEngine.Video.VideoSource.Url); + y += h; + + if (source.enumValueIndex == (int)UnityEngine.Video.VideoSource.Url) + { + h = EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), url); + y += h; + } + else + { + h = EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), clip); + y += h; + } + + h = EditorGUI.GetPropertyHeight(ratio, new GUIContent("AspectRatio"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), ratio); + y += h; + + h = EditorGUI.GetPropertyHeight(ratio, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), speed); + if (speed.floatValue == 0f) + speed.floatValue = 1f; + y += h; + + EditorGUI.EndProperty(); + } +} + +[CustomEditor(typeof(VRCSDK2.VRC_SyncVideoPlayer))] +public class SyncVideoPlayerEditor : Editor +{ + ReorderableList sourceList; + + public override void OnInspectorGUI() + { + SerializedProperty searchRoot = serializedObject.FindProperty("VideoSearchRoot"); + EditorGUILayout.PropertyField(searchRoot); + SerializedProperty maxQual = serializedObject.FindProperty("MaxStreamQuality"); + EditorGUILayout.PropertyField(maxQual); + + EditorGUILayout.Space(); + + sourceList.DoLayoutList(); + + serializedObject.ApplyModifiedProperties(); + } + + private void OnEnable() + { + SerializedProperty videos = serializedObject.FindProperty("Videos"); + sourceList = new ReorderableList(serializedObject, videos); + sourceList.drawElementCallback += (Rect rect, int index, bool active, bool focused) => + { + EditorGUI.PropertyField(rect, serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index)); + }; + sourceList.elementHeightCallback += (int index) => + { + SerializedProperty element = serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index); + return EditorGUI.GetPropertyHeight(element); + }; + sourceList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Videos"); + } +} +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoPlayerEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoPlayerEditor.cs.meta new file mode 100644 index 0000000..616cee0 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoPlayerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ae0e74693b7899f47bd98864f94b9311 +timeCreated: 1499468412 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoStreamEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoStreamEditor.cs new file mode 100644 index 0000000..198f7ff --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoStreamEditor.cs @@ -0,0 +1,117 @@ +#if VRC_SDK_VRCSDK2 + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using VRC.SDKBase; + +[CustomPropertyDrawer(typeof(VRCSDK2.VRC_SyncVideoStream.VideoEntry))] +public class CustomVideoStreamEntryDrawer : PropertyDrawer +{ + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + SerializedProperty live = property.FindPropertyRelative("SyncType"); + SerializedProperty sync = property.FindPropertyRelative("SyncMinutes"); + + return EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing + + Mathf.Max(EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true), EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true)) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(live, new GUIContent("SyncType"), true) + EditorGUIUtility.standardVerticalSpacing + + EditorGUI.GetPropertyHeight(sync, new GUIContent("SyncMinutes"), true) + EditorGUIUtility.standardVerticalSpacing; + } + + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + SerializedProperty source = property.FindPropertyRelative("Source"); + SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed"); + SerializedProperty clip = property.FindPropertyRelative("VideoClip"); + SerializedProperty url = property.FindPropertyRelative("URL"); + SerializedProperty live = property.FindPropertyRelative("SyncType"); + SerializedProperty sync = property.FindPropertyRelative("SyncMinutes"); + + EditorGUI.BeginProperty(rect, label, property); + float x = rect.x; + float y = rect.y; + float w = rect.width; + float h = EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing; + VRC_EditorTools.FilteredEnumPopup(new Rect(x, y, w, h), source, (e) => e == UnityEngine.Video.VideoSource.Url); + y += h; + + if (source.enumValueIndex == (int)UnityEngine.Video.VideoSource.Url) + { + h = EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), url); + y += h; + } + else + { + h = EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), clip); + y += h; + } + + h = EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), speed); + if (speed.floatValue == 0f) + speed.floatValue = 1f; + y += h; + + h = EditorGUI.GetPropertyHeight(live, new GUIContent("SyncType"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), live); + y += h; + + h = EditorGUI.GetPropertyHeight(sync, new GUIContent("SyncMinutes"), true) + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(new Rect(x, y, w, h), sync); + if (sync.floatValue < 1f) + sync.floatValue = 0; + y += h; + + EditorGUI.EndProperty(); + } +} + +[CustomEditor(typeof(VRCSDK2.VRC_SyncVideoStream))] +public class SyncVideoStreamEditor : Editor +{ + ReorderableList sourceList; + + public override void OnInspectorGUI() + { + SerializedProperty searchRoot = serializedObject.FindProperty("VideoSearchRoot"); + EditorGUILayout.PropertyField(searchRoot); + SerializedProperty maxQual = serializedObject.FindProperty("MaxStreamQuality"); + EditorGUILayout.PropertyField(maxQual); + SerializedProperty autoStart = serializedObject.FindProperty("AutoStart"); + EditorGUILayout.PropertyField(autoStart); + + EditorGUILayout.Space(); + + sourceList.DoLayoutList(); + + serializedObject.ApplyModifiedProperties(); + } + + private void OnEnable() + { + SerializedProperty videos = serializedObject.FindProperty("Videos"); + sourceList = new ReorderableList(serializedObject, videos); + sourceList.drawElementCallback += (Rect rect, int index, bool active, bool focused) => + { + EditorGUI.PropertyField(rect, serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index)); + }; + sourceList.elementHeightCallback += (int index) => + { + SerializedProperty element = serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index); + return EditorGUI.GetPropertyHeight(element); + }; + sourceList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Videos"); + } +} + +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoStreamEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoStreamEditor.cs.meta new file mode 100644 index 0000000..ad3b7ed --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_SyncVideoStreamEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3f9dccfed0b072f49a307b3f20a7e768 +timeCreated: 1528745185 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_TriggerEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_TriggerEditor.cs new file mode 100644 index 0000000..51c7c35 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_TriggerEditor.cs @@ -0,0 +1,1528 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR + +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using UnityEditorInternal; +#if VRC_CLIENT +using ZLinq; +#else +using System.Linq; +#endif +using System.Collections.Generic; +using System.Reflection; +using System; +using VRC.SDKBase; +using VRC.SDKBase.Editor; + +namespace VRCSDK2 +{ + [CustomPropertyDrawer(typeof(VRCSDK2.VRC_Trigger.CustomTriggerTarget))] + public class CustomTriggerTargetDrawer : PropertyDrawer + { + public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + if (Application.isPlaying) + { + EditorGUI.HelpBox(rect, "Trigger Editor disabled while application is running.", MessageType.Info); + return; + } + + if (property == null) + return; + + SerializedProperty objectProperty = property.FindPropertyRelative("TriggerObject"); + SerializedProperty nameProperty = property.FindPropertyRelative("CustomName"); + + EditorGUI.BeginProperty(rect, label, property); + + rect = EditorGUI.PrefixLabel(rect, GUIUtility.GetControlID(FocusType.Passive), label); + Rect objectRect = new Rect(rect.x, rect.y, rect.width / 2 - 5, rect.height); + Rect nameRect = new Rect(rect.x + rect.width / 2, rect.y, rect.width / 2, rect.height); + + VRCSDK2.VRC_Trigger current = null; + if (objectProperty.objectReferenceValue != null) + current = (objectProperty.objectReferenceValue as GameObject).GetComponent(); + current = EditorGUI.ObjectField(objectRect, current, typeof(VRCSDK2.VRC_Trigger), true) as VRCSDK2.VRC_Trigger; + objectProperty.objectReferenceValue = current == null ? null : current.gameObject; + + VRC_EditorTools.CustomTriggerPopup(nameRect, objectProperty, nameProperty); + + EditorGUI.EndProperty(); + } + } + + [CustomEditor(typeof(VRCSDK2.VRC_Trigger)), CanEditMultipleObjects] + public class VRC_TriggerEditor : UnityEditor.Editor + { + private List ActiveTypes + { + get + { + List activeTypes = new List(); + + SerializedProperty triggers = triggersProperty.Copy(); + int triggersLength = triggers.arraySize; + + for (int idx = 0; idx < triggersLength; ++idx) + { + VRCSDK2.VRC_Trigger.TriggerType triggerType = (VRCSDK2.VRC_Trigger.TriggerType)triggers.GetArrayElementAtIndex(idx).FindPropertyRelative("TriggerType").intValue; + activeTypes.Add(triggerType); + } + + return activeTypes; + } + } + +#pragma warning disable CS0618 // Type or member is obsolete + private static List hiddenTriggerTypes = new List { /*VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageAdd, VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageRemove*/ }; + private static List hiddenEventTypes = new List { VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility, VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage, VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand }; + private static List unbufferedBroadcastTypes = new List { VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered, VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterUnbuffered, VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerUnbuffered, VRCSDK2.VRC_EventHandler.VrcBroadcastType.Local }; + private static List bufferOneBroadcastTypes = new List { VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne, VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterBufferOne, VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerBufferOne }; + private static List hiddenBroadcastTypes = new List { }; +#pragma warning restore CS0618 // Type or member is obsolete + + private ReorderableList[] eventLists = new ReorderableList[0]; + private ReorderableList[] relayLists = new ReorderableList[0]; + private ReorderableList[] objectLists = new ReorderableList[0]; + private bool[] visible = new bool[0]; + + private SerializedProperty triggersProperty; + private SerializedProperty proximityProperty; + private SerializedProperty interactTextProperty; + private SerializedProperty ownershipProperty; + private SerializedProperty drawLinesProperty; + + private Dictionary rpcByteCache = new Dictionary(); + + private VRCSDK2.VRC_Trigger.TriggerType addTriggerSelectedType = VRCSDK2.VRC_Trigger.TriggerType.Custom; + + private void OnEnable() + { + rpcByteCache.Clear(); + } + + public override void OnInspectorGUI() + { +#pragma warning disable CS0618 // Type or member is obsolete + bool showedOldWarning = false; + foreach (VRCSDK2.VRC_Trigger t in targets.Cast().Where(tr => tr != null)) + { + if (!showedOldWarning && (t.GetComponent() != null || t.GetComponent() != null || t.GetComponent() != null || t.GetComponent() != null)) + { + EditorGUILayout.HelpBox("Do not use VRC_Trigger in combination with deprecated event components.", MessageType.Error); + showedOldWarning = true; + } + VRCSDK2.VRC_EventHandler handler = t.GetComponent(); + if (handler != null) + handler.Events = new List(); + } +#pragma warning restore CS0618 // Type or member is obsolete + + triggersProperty = serializedObject.FindProperty("Triggers"); + proximityProperty = serializedObject.FindProperty("proximity"); + interactTextProperty = serializedObject.FindProperty("interactText"); + ownershipProperty = serializedObject.FindProperty("TakesOwnershipIfNecessary"); + drawLinesProperty = serializedObject.FindProperty("DrawLines"); + + serializedObject.Update(); + + SerializedProperty triggers = triggersProperty.Copy(); + int triggersLength = triggers.arraySize; + + if (eventLists.Length != triggersLength) + eventLists = new ReorderableList[triggersLength]; + + if (relayLists.Length != triggersLength) + relayLists = new ReorderableList[triggersLength]; + + if (objectLists.Length != triggersLength) + objectLists = new ReorderableList[triggersLength]; + + if (visible.Length != triggersLength) + { + bool[] newVisible = new bool[triggersLength]; + for (int idx = 0; idx < visible.Length && idx < newVisible.Length; ++idx) + newVisible[idx] = visible[idx]; + for (int idx = visible.Length; idx < newVisible.Length && idx < newVisible.Length; ++idx) + newVisible[idx] = true; + visible = newVisible; + } + + EditorGUILayout.BeginVertical(GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 30)); + + EditorGUILayout.Space(); + + EditorGUILayout.PropertyField(ownershipProperty, new GUIContent("Take Ownership of Action Targets")); + VRCSDK2.VRC_Trigger.EditorGlobalTriggerLineMode = (VRCSDK2.VRC_Trigger.EditorTriggerLineMode)EditorPrefs.GetInt("VRCSDK2_triggerLineMode", 0); + if (VRCSDK2.VRC_Trigger.EditorGlobalTriggerLineMode == VRCSDK2.VRC_Trigger.EditorTriggerLineMode.PerTrigger) + EditorGUILayout.PropertyField(drawLinesProperty, new GUIContent("Draw Lines")); + + EditorGUILayout.Space(); + + RenderTriggers(); + + EditorGUILayout.Space(); + + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(10); + EditorGUILayout.BeginVertical(); + + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); + + serializedObject.ApplyModifiedProperties(); + } + + private void RenderHelpBox(string message, MessageType messageType) + { + if (VRCSettings.DisplayHelpBoxes || messageType == MessageType.Error || messageType == MessageType.Warning) + EditorGUILayout.HelpBox(message, messageType); + } + + private void RenderTriggers() + { + GUIStyle triggerStyle = new GUIStyle(EditorStyles.helpBox); + + SerializedProperty triggers = triggersProperty.Copy(); + int triggersLength = triggers.arraySize; + + List to_remove = new List(); + for (int idx = 0; idx < triggersLength; ++idx) + { + SerializedProperty triggerProperty = triggers.GetArrayElementAtIndex(idx); + SerializedProperty broadcastProperty = triggerProperty.FindPropertyRelative("BroadcastType"); + + EditorGUILayout.BeginVertical(triggerStyle); + + if (RenderTriggerHeader(triggerProperty, ref visible[idx])) + { + to_remove.Add(idx); + EditorGUILayout.EndVertical(); + + continue; + } + + if (!visible[idx]) + { + EditorGUILayout.EndVertical(); + continue; + } + + if (!unbufferedBroadcastTypes.Contains((VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastProperty.intValue) && + !bufferOneBroadcastTypes.Contains((VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastProperty.intValue) && + ActiveEvents(triggerProperty).Any(e => e == VRCSDK2.VRC_EventHandler.VrcEventType.SendRPC)) + RenderHelpBox("Consider using unbuffered broadcasts with RPCs.", MessageType.Error); + + EditorGUILayout.Separator(); + + RenderTriggerEditor(triggerProperty, idx); + + if (eventLists.Length == triggersLength) + { + EditorGUILayout.Separator(); + + if (triggerProperty.FindPropertyRelative("TriggerType").intValue != (int)VRCSDK2.VRC_Trigger.TriggerType.Relay) + { + RenderTriggerEventsEditor(triggerProperty, idx); + + EditorGUILayout.Separator(); + } + } + EditorGUILayout.EndVertical(); + } + + foreach (int idx in ((IEnumerable)to_remove).Reverse()) + triggersProperty.Copy().DeleteArrayElementAtIndex(idx); + + RenderAddTrigger(); + } + + private void RenderTriggerEditor(SerializedProperty triggerProperty, int idx) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("AfterSeconds"), new GUIContent("Delay in Seconds")); + + VRC_Trigger.TriggerType triggerType = (VRC_Trigger.TriggerType)triggerProperty.FindPropertyRelative("TriggerType").intValue; + switch (triggerType) + { + case VRCSDK2.VRC_Trigger.TriggerType.Custom: + RenderCustom(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.Relay: + RenderRelay(triggerProperty, idx); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnEnterTrigger: + case VRCSDK2.VRC_Trigger.TriggerType.OnExitTrigger: + case VRCSDK2.VRC_Trigger.TriggerType.OnEnterCollider: + case VRCSDK2.VRC_Trigger.TriggerType.OnExitCollider: + RenderCollider(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnKeyDown: + case VRCSDK2.VRC_Trigger.TriggerType.OnKeyUp: + RenderKey(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnTimer: + RenderTimer(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageChange: + // case VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageAdd: + // case VRCSDK2.VRC_Trigger.TriggerType.OnDataStorageRemove: + RenderDataStorage(triggerProperty); + break; + case VRCSDK2.VRC_Trigger.TriggerType.OnParticleCollision: + //RenderHelpBox("Triggers for each particle in attached particle system that collides with something.", MessageType.Info); + RenderCollider(triggerProperty); + break; + default: + if (VRCSDK2.VRC_Trigger.TypeCollections.InteractiveTypes.Contains(triggerType) || VRCSDK2.VRC_Trigger.TypeCollections.PickupTypes.Contains(triggerType)) + RenderInteractableEditor(); + else + RenderEmpty(triggerProperty); + break; + } + } + + private List ActiveEvents(SerializedProperty triggerProperty) + { + List activeTypes = new List(); + + SerializedProperty events = triggerProperty.FindPropertyRelative("Events").Copy(); + int eventsLength = events.arraySize; + + for (int idx = 0; idx < eventsLength; ++idx) + { + VRCSDK2.VRC_EventHandler.VrcEventType eventType = (VRCSDK2.VRC_EventHandler.VrcEventType)events.GetArrayElementAtIndex(idx).FindPropertyRelative("EventType").intValue; + activeTypes.Add(eventType); + } + + return activeTypes; + } + + private void RenderAddTrigger() + { + Rect rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(15f)); + EditorGUILayout.Space(); + + Rect selectedRect = new Rect(rect.x, rect.y, rect.width / 4 * 3 - 5, rect.height); + Rect addRect = new Rect(selectedRect.x + selectedRect.width + 5, rect.y, rect.width / 4, rect.height); + + bool showStationTypes = serializedObject.targetObjects.Any(o => (o as VRCSDK2.VRC_Trigger).GetComponent() != null); + System.Func predicate = + v => hiddenTriggerTypes.Contains(v) == false && (showStationTypes || (v != VRCSDK2.VRC_Trigger.TriggerType.OnStationEntered && v != VRCSDK2.VRC_Trigger.TriggerType.OnStationExited)); + + addTriggerSelectedType = VRC_EditorTools.FilteredEnumPopup(selectedRect, addTriggerSelectedType, predicate); + + if (GUI.Button(addRect, "Add")) + { + SerializedProperty triggersAry = triggersProperty; + + // hacks + triggersAry.Next(true); + triggersAry.Next(true); + + int triggersLength = triggersAry.intValue; + triggersAry.intValue = triggersLength + 1; + triggersAry.Next(true); + + for (int idx = 0; idx < triggersLength; ++idx) + triggersAry.Next(false); + + triggersAry.FindPropertyRelative("TriggerType").intValue = (int)addTriggerSelectedType; + triggersAry.FindPropertyRelative("BroadcastType").intValue = (int)VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne; + triggersAry.FindPropertyRelative("TriggerIndividuals").boolValue = true; + triggersAry.FindPropertyRelative("Layers").intValue = LayerMask.GetMask("Default"); + } + + EditorGUILayout.EndHorizontal(); + } + + private bool RenderTriggerHeader(SerializedProperty triggerProperty, ref bool expand) + { + bool delete = false; + + if (!delete) + { + VRCSDK2.VRC_EventHandler.VrcBroadcastType? broadcast = null; + + Rect rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(15f)); + EditorGUILayout.Space(); + + int baseWidth = (int)((rect.width - 40) / 4); + + Rect foldoutRect = new Rect(rect.x + 10, rect.y, 20, rect.height); + Rect typeRect = new Rect(rect.x + 20, rect.y, baseWidth, rect.height); + Rect broadcastRect = new Rect(rect.x + 25 + baseWidth, rect.y, baseWidth, rect.height); + Rect randomRect = new Rect(rect.x + 30 + baseWidth * 2, rect.y, baseWidth, rect.height); + Rect removeRect = new Rect(rect.x + 35 + baseWidth * 3, rect.y, baseWidth, rect.height); + + expand = EditorGUI.Foldout(foldoutRect, expand, GUIContent.none); + + SerializedProperty triggerTypeProperty = triggerProperty.FindPropertyRelative("TriggerType"); + VRCSDK2.VRC_Trigger.TriggerType currentType = (VRCSDK2.VRC_Trigger.TriggerType)triggerTypeProperty.intValue; + + SerializedProperty nameProperty = triggerProperty.FindPropertyRelative("Name"); + if (string.IsNullOrEmpty(nameProperty.stringValue)) + nameProperty.stringValue = "Unnamed"; + + bool showStationTypes = serializedObject.targetObjects.Any(o => (o as VRCSDK2.VRC_Trigger).GetComponent() != null); + System.Func rename = s => s == "Custom" ? s + " (" + nameProperty.stringValue + ")" : s; + System.Func predicate = + v => hiddenTriggerTypes.Contains(v) == false && (showStationTypes || (v != VRCSDK2.VRC_Trigger.TriggerType.OnStationEntered && v != VRCSDK2.VRC_Trigger.TriggerType.OnStationExited)); + + triggerTypeProperty.intValue = (int)VRC_EditorTools.FilteredEnumPopup(typeRect, currentType, predicate, rename); + currentType = (VRCSDK2.VRC_Trigger.TriggerType)triggerTypeProperty.intValue; + + SerializedProperty broadcastTypeProperty = triggerProperty.FindPropertyRelative("BroadcastType"); + List activeEvents = ActiveEvents(triggerProperty); + if ((VRCSDK2.VRC_Trigger.TriggerType)triggerTypeProperty.intValue == VRCSDK2.VRC_Trigger.TriggerType.Relay || activeEvents.Contains(VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject)) + { + broadcast = VRCSDK2.VRC_EventHandler.VrcBroadcastType.Always; + broadcastTypeProperty.intValue = (int)broadcast; + } + else + { + VRC_EditorTools.FilteredEnumPopup(broadcastRect, broadcastTypeProperty, b => !hiddenBroadcastTypes.Contains(b)); + broadcast = (VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastTypeProperty.intValue; + } + + SerializedProperty probabilitiesProperty = triggerProperty.FindPropertyRelative("Probabilities"); + SerializedProperty probabilityLockProperty = triggerProperty.FindPropertyRelative("ProbabilityLock"); + SerializedProperty eventsProperty = triggerProperty.FindPropertyRelative("Events"); + + if (triggerProperty.FindPropertyRelative("Events").arraySize < 1) + GUI.enabled = false; + if (GUI.Toggle(randomRect, probabilitiesProperty.arraySize > 0, new GUIContent(" Randomize"))) + probabilityLockProperty.arraySize = probabilitiesProperty.arraySize = eventsProperty.arraySize; + else + probabilityLockProperty.arraySize = probabilitiesProperty.arraySize = 0; + GUI.enabled = true; + + if (GUI.Button(removeRect, "Remove")) + delete = true; + + EditorGUILayout.EndHorizontal(); + + if (broadcast.HasValue && expand) + { + string message = null; + switch (broadcast.Value) + { + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Always: + message = "All are able to activate the trigger for everyone, and late-joiners will also trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered: + message = "All are able to activate the trigger for everyone, but late-joiners will not trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Local: + message = "All are able to activate the trigger for themselves only."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Master: + message = "Only the Master is able to activate the trigger for everyone, and late-joiners will also trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterUnbuffered: + message = "Only the Master is able to activate the trigger for everyone, but late-joiners will not trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.Owner: + message = "Only the Owner is able to activate the trigger for everyone, and late-joiners will also trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerUnbuffered: + message = "Only the Owner is able to activate the trigger for everyone, but late-joiners will not trigger it."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne: + message = "All are able to activate the trigger for everyone, and late-joiners will trigger the most recent one."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.MasterBufferOne: + message = "Only the Master is able to activate the trigger for everyone, and late-joiners will trigger the most recent one."; + break; + case VRCSDK2.VRC_EventHandler.VrcBroadcastType.OwnerBufferOne: + message = "Only the Owner is able to activate the trigger for everyone, and late-joiners will trigger the most recent one."; + break; + } + if (message != null) + RenderHelpBox(message, MessageType.Info); + } + } + + return delete; + } + + private void RenderInteractableEditor() + { + EditorGUILayout.PropertyField(interactTextProperty, new GUIContent("Interaction Text")); + proximityProperty.floatValue = EditorGUILayout.Slider("Proximity", proximityProperty.floatValue, 0f, 100f); + } + + private void RenderTriggerEventsEditor(SerializedProperty triggerProperty, int idx) + { + if (eventLists[idx] == null) + { + ReorderableList newList = new ReorderableList(serializedObject, triggerProperty.FindPropertyRelative("Events"), true, true, true, true); + newList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Actions"); + newList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty eventsListProperty = triggerProperty.FindPropertyRelative("Events"); + SerializedProperty probabilitiesProperty = triggerProperty.FindPropertyRelative("Probabilities"); + SerializedProperty probabilityLockProperty = triggerProperty.FindPropertyRelative("ProbabilityLock"); + SerializedProperty shadowListProperty = triggerProperty.FindPropertyRelative("DataStorageShadowValues"); + + if (shadowListProperty != null && shadowListProperty.arraySize != eventsListProperty.arraySize) + shadowListProperty.arraySize = eventsListProperty.arraySize; + + SerializedProperty shadowProperty = shadowListProperty == null ? null : shadowListProperty.GetArrayElementAtIndex(index); + SerializedProperty eventProperty = eventsListProperty.GetArrayElementAtIndex(index); + SerializedProperty eventTypeProperty = eventProperty.FindPropertyRelative("EventType"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + + string label = ((VRCSDK2.VRC_EventHandler.VrcEventType)eventTypeProperty.intValue).ToString(); + if (!string.IsNullOrEmpty(parameterStringProperty.stringValue)) + label += " (" + parameterStringProperty.stringValue + ")"; + + if (probabilitiesProperty.arraySize == 0) + EditorGUI.LabelField(rect, label); + else + { + Rect labelRect = new Rect(rect.x, rect.y, rect.width / 2, rect.height); + Rect sliderLockRect = new Rect(rect.x + rect.width / 2, rect.y, 30, rect.height); + Rect sliderRect = new Rect(rect.x + rect.width / 2 + 30, rect.y, rect.width / 2 - 30, rect.height); + + EditorGUI.LabelField(labelRect, label); + + probabilityLockProperty.GetArrayElementAtIndex(index).boolValue = GUI.Toggle(sliderLockRect, probabilityLockProperty.GetArrayElementAtIndex(index).boolValue, new GUIContent()); + probabilitiesProperty.GetArrayElementAtIndex(index).floatValue = EditorGUI.Slider(sliderRect, new GUIContent(), probabilitiesProperty.GetArrayElementAtIndex(index).floatValue, 0f, 1f); + + bool allLocked = true; + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + allLocked = allLocked && probabilityLockProperty.GetArrayElementAtIndex(pIdx).boolValue; + if (allLocked) + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + if (pIdx != index) + probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue = probabilitiesProperty.GetArrayElementAtIndex(index).floatValue; + + // Squish 'em down + float probabilitySum = 1f; + const int MAX_SCALE_PROBABILITIES_LOOP_ITERATIONS = 8; + const int PROBABILITY_VALUE_DECIMAL_PLACES = 3; + int loopIterations = 0; + do + { + if (probabilitySum > 1f) + { + float fixRatio = 1f / probabilitySum; + int countChanged = 0; + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + { + if (allLocked) + { + countChanged++; + probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue *= fixRatio; + } + else + { + if (pIdx == index || probabilityLockProperty.GetArrayElementAtIndex(pIdx).boolValue || probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue == 0f) + continue; + countChanged++; + probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue *= fixRatio; + } + } + if (countChanged == 0) + probabilitiesProperty.GetArrayElementAtIndex(index).floatValue -= probabilitySum - 1f; + probabilitiesProperty.GetArrayElementAtIndex(index).floatValue = (float)Math.Round(probabilitiesProperty.GetArrayElementAtIndex(index).floatValue, PROBABILITY_VALUE_DECIMAL_PLACES); + } + probabilitySum = 0f; + for (int pIdx = 0; pIdx < probabilitiesProperty.arraySize; ++pIdx) + probabilitySum += probabilitiesProperty.GetArrayElementAtIndex(pIdx).floatValue; + loopIterations++; + } while ((probabilitySum > 1f) && (loopIterations < MAX_SCALE_PROBABILITIES_LOOP_ITERATIONS)); + } + + if (isFocused) + objectLists[idx] = null; + if (isActive) + { + EditorGUILayout.Space(); + + RenderEventEditor(shadowProperty, triggerProperty, eventProperty, idx); + } + }; + newList.onAddDropdownCallback = (Rect buttonRect, ReorderableList list) => + { + GenericMenu menu = new GenericMenu(); + SerializedProperty eventsList = triggerProperty.FindPropertyRelative("Events"); + foreach (VRCSDK2.VRC_EventHandler.VrcEventType type in System.Enum.GetValues(typeof(VRCSDK2.VRC_EventHandler.VrcEventType)).Cast().Where(v => !hiddenEventTypes.Contains(v)).OrderBy(et => System.Enum.GetName(typeof(VRCSDK2.VRC_EventHandler.VrcEventType), et))) + { + menu.AddItem(new GUIContent("Basic Events/" + type.ToString()), false, (t) => + { + eventsList.arraySize++; + + SerializedProperty newEventProperty = eventsList.GetArrayElementAtIndex(eventsList.arraySize - 1); + newEventProperty.FindPropertyRelative("EventType").intValue = (int)(VRCSDK2.VRC_EventHandler.VrcEventType)t; + newEventProperty.FindPropertyRelative("ParameterObjects").arraySize = 0; + newEventProperty.FindPropertyRelative("ParameterInt").intValue = 0; + newEventProperty.FindPropertyRelative("ParameterFloat").floatValue = 0f; + newEventProperty.FindPropertyRelative("ParameterString").stringValue = null; + + serializedObject.ApplyModifiedProperties(); + }, type); + } + VRC.SDKBase.IVRCEventProvider[] providers = FindObjectsByType(FindObjectsSortMode.None).Where(b => b is VRC.SDKBase.IVRCEventProvider).Cast().ToArray(); + foreach (VRC.SDKBase.IVRCEventProvider provider in providers) + { + foreach (VRCSDK2.VRC_EventHandler.VrcEvent evt in provider.ProvideEvents()) + { + string name = "Events from Scene/" + (provider as MonoBehaviour).name + "/" + evt.Name; + menu.AddItem(new GUIContent(name), false, (t) => + { + eventsList.arraySize++; + + VRCSDK2.VRC_EventHandler.VrcEvent e = (VRCSDK2.VRC_EventHandler.VrcEvent)t; + + SerializedProperty newEventProperty = eventsList.GetArrayElementAtIndex(eventsList.arraySize - 1); + newEventProperty.FindPropertyRelative("Name").stringValue = e.Name; + newEventProperty.FindPropertyRelative("EventType").intValue = (int)e.EventType; + newEventProperty.FindPropertyRelative("ParameterInt").intValue = e.ParameterInt; + newEventProperty.FindPropertyRelative("ParameterFloat").floatValue = e.ParameterFloat; + newEventProperty.FindPropertyRelative("ParameterString").stringValue = e.ParameterString; + newEventProperty.FindPropertyRelative("ParameterObjects").arraySize = e.ParameterObjects.Length; + for (int obj_idx = 0; obj_idx < e.ParameterObjects.Length; ++obj_idx) + newEventProperty.FindPropertyRelative("ParameterObjects").GetArrayElementAtIndex(obj_idx).objectReferenceValue = e.ParameterObjects[obj_idx]; + +#pragma warning disable CS0618 // Type or member is obsolete + newEventProperty.FindPropertyRelative("ParameterObject").objectReferenceValue = e.ParameterObject; +#pragma warning restore CS0618 // Type or member is obsolete + + serializedObject.ApplyModifiedProperties(); + }, evt); + } + } + menu.ShowAsContext(); + + eventLists = new ReorderableList[0]; + objectLists = new ReorderableList[0]; + relayLists = new ReorderableList[0]; + }; + + eventLists[idx] = newList; + } + + ReorderableList eventList = eventLists[idx]; + eventList.DoLayoutList(); + } + + private void RenderDataStorage(SerializedProperty triggerProperty) + { + if (triggerProperty.serializedObject.targetObjects.Any(obj => (obj as VRCSDK2.VRC_Trigger).gameObject.GetComponent() == null)) + RenderHelpBox("Data Storage Triggers require a VRC_DataStorage Component.", MessageType.Warning); + else + { + SerializedProperty idxProperty = triggerProperty.FindPropertyRelative("DataElementIdx"); + VRCSDK2.VRC_DataStorage ds = (target as VRCSDK2.VRC_Trigger).gameObject.GetComponent(); + + if (ds.data == null) + { + ds.data = new VRCSDK2.VRC_DataStorage.VrcDataElement[0]; + idxProperty.intValue = -1; + } + + List names = new List(); + names.Add("Any Data Element"); + foreach (VRCSDK2.VRC_DataStorage.VrcDataElement element in ds.data) + names.Add(element.name); + + int selectedIdx = idxProperty.intValue; + if (selectedIdx == -1) + selectedIdx = 0; + else + selectedIdx += 1; + + selectedIdx = EditorGUILayout.Popup("Data Element", selectedIdx, names.ToArray()); + + if (selectedIdx == 0) + idxProperty.intValue = -1; + else + idxProperty.intValue = selectedIdx - 1; + } + } + + private void RenderKey(SerializedProperty triggerProperty) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Key")); + } + + private void RenderCollider(SerializedProperty triggerProperty) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("TriggerIndividuals")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Layers")); + } + + private void RenderTimer(SerializedProperty triggerProperty) + { + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Repeat")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("ResetOnEnable")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("LowPeriodTime")); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("HighPeriodTime")); + } + + private void RenderCustom(SerializedProperty triggerProperty) + { + SerializedProperty nameProperty = triggerProperty.FindPropertyRelative("Name"); + EditorGUILayout.PropertyField(triggerProperty.FindPropertyRelative("Name")); + + if (string.IsNullOrEmpty(nameProperty.stringValue)) + nameProperty.stringValue = "Unnamed"; + } + + private void RenderRelay(SerializedProperty triggerProperty, int idx) + { + if (relayLists[idx] == null) + { + ReorderableList newList = new ReorderableList(serializedObject, triggerProperty.FindPropertyRelative("Others"), true, true, true, true); + newList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, new GUIContent("Targets")); + newList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty target = newList.serializedProperty.GetArrayElementAtIndex(index); + + EditorGUI.PropertyField(rect, target, GUIContent.none); + + target.serializedObject.ApplyModifiedProperties(); + }; + relayLists[idx] = newList; + } + relayLists[idx].DoLayoutList(); + } + + private void RenderEmpty(SerializedProperty triggerProperty) + { + } + + private bool doesPropertyContainAnyNullReceivers(SerializedProperty objectsProperty) + { + bool containsNullReceivers = false; + if (objectsProperty.arraySize > 0) + { + for (int i = 0; i < objectsProperty.arraySize; i++) + { + SerializedProperty elem = objectsProperty.GetArrayElementAtIndex(i); + if (elem.objectReferenceValue == null) containsNullReceivers = true; + } + } + return containsNullReceivers; + } + + private void RenderTargetGameObjectList(SerializedProperty objectsProperty, int idx, bool receiverRequired = true) + { + if (objectLists[idx] == null) + { + objectLists[idx] = new ReorderableList(objectsProperty.serializedObject, objectsProperty, true, true, true, true); + objectLists[idx].drawHeaderCallback = (Rect rect) => + { + string infoString = "Receivers"; + if (objectsProperty.arraySize == 0) + infoString = "Receivers: This GameObject"; + EditorGUI.LabelField(rect, new GUIContent(infoString)); + + Event evt = Event.current; + if (!rect.Contains(evt.mousePosition)) + return; + + if (evt.type == EventType.DragUpdated) + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if (evt.type == EventType.DragPerform) + { + GameObject[] dragObjects = DragAndDrop.objectReferences.OfType().ToArray(); + int startIndex = objectsProperty.arraySize; + objectsProperty.arraySize = objectsProperty.arraySize + dragObjects.Length; + + for (int i = 0; i < dragObjects.Length; i++) + { + SerializedProperty newElem = objectsProperty.GetArrayElementAtIndex(startIndex + i); + newElem.objectReferenceValue = dragObjects[i]; + } + + DragAndDrop.AcceptDrag(); + evt.Use(); + } + }; + objectLists[idx].drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty target = objectLists[idx].serializedProperty.GetArrayElementAtIndex(index); + EditorGUI.PropertyField(rect, target, GUIContent.none); + target.serializedObject.ApplyModifiedProperties(); + }; + } + objectLists[idx].DoLayoutList(); + if (objectsProperty.arraySize == 0) + RenderHelpBox("This trigger will target the GameObject it's on, because the receivers list is empty.", MessageType.Error); + else if (receiverRequired && doesPropertyContainAnyNullReceivers(objectsProperty)) + RenderHelpBox("Trigger with no object set will be ignored!", MessageType.Info); + } + + private void RenderTargetComponentList(SerializedProperty objectsProperty, int idx, string label = "Receivers") where T : Component + { + if (objectLists[idx] == null) + { + objectLists[idx] = new ReorderableList(objectsProperty.serializedObject, objectsProperty, true, true, true, true); + objectLists[idx].drawHeaderCallback = (Rect rect) => + { + string infoString = label; + if (objectsProperty.arraySize == 0) + infoString = label + ": This " + typeof(T).Name; + EditorGUI.LabelField(rect, new GUIContent(infoString)); + + Event evt = Event.current; + if (!rect.Contains(evt.mousePosition)) + return; + + if (evt.type == EventType.DragUpdated) + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if (evt.type == EventType.DragPerform) + { + GameObject[] dragObjects = DragAndDrop.objectReferences.OfType().ToArray(); + int startIndex = objectsProperty.arraySize; + objectsProperty.arraySize = objectsProperty.arraySize + dragObjects.Length; + + for (int i = 0; i < dragObjects.Length; i++) + { + SerializedProperty newElem = objectsProperty.GetArrayElementAtIndex(startIndex + i); + newElem.objectReferenceValue = dragObjects[i]; + } + + DragAndDrop.AcceptDrag(); + evt.Use(); + } + }; + objectLists[idx].drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty target = objectLists[idx].serializedProperty.GetArrayElementAtIndex(index); + + T current = null; + if (target.objectReferenceValue != null) + current = (target.objectReferenceValue as GameObject).GetComponent(); + + current = EditorGUI.ObjectField(rect, current, typeof(T), true) as T; + target.objectReferenceValue = current == null ? null : current.gameObject; + target.serializedObject.ApplyModifiedProperties(); + }; + } + objectLists[idx].DoLayoutList(); + if (objectsProperty.arraySize == 0) + RenderHelpBox("This trigger will target the GameObject it's on, because the receivers list is empty.", MessageType.Error); + else if (doesPropertyContainAnyNullReceivers(objectsProperty)) + RenderHelpBox("Trigger with no object set will be ignored!", MessageType.Info); + } + + public void RenderEventEditor(SerializedProperty shadowProperty, SerializedProperty triggerProperty, SerializedProperty eventProperty, int triggerIdx) + { + SerializedProperty eventTypeProperty = eventProperty.FindPropertyRelative("EventType"); + SerializedProperty parameterObjectProperty = eventProperty.FindPropertyRelative("ParameterObject"); + SerializedProperty parameterObjectsProperty = eventProperty.FindPropertyRelative("ParameterObjects"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + SerializedProperty parameterBoolOpProperty = eventProperty.FindPropertyRelative("ParameterBoolOp"); + SerializedProperty parameterFloatProperty = eventProperty.FindPropertyRelative("ParameterFloat"); + SerializedProperty parameterIntProperty = eventProperty.FindPropertyRelative("ParameterInt"); + SerializedProperty parameterBytesProperty = eventProperty.FindPropertyRelative("ParameterBytes"); + + if (parameterObjectProperty.objectReferenceValue != null && parameterObjectsProperty.arraySize == 0) + { + parameterObjectsProperty.arraySize = 1; + parameterObjectsProperty.GetArrayElementAtIndex(0).objectReferenceValue = parameterObjectProperty.objectReferenceValue; + } + parameterObjectProperty.objectReferenceValue = null; + + switch ((VRCSDK2.VRC_EventHandler.VrcEventType)eventTypeProperty.intValue) + { + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationBool: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Variable")); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationFloat: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Variable")); + RenderPropertyEditor(shadowProperty, parameterFloatProperty, new GUIContent("Value")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationInt: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntAdd: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntDivide: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntMultiply: + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationIntSubtract: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Variable")); + RenderPropertyEditor(shadowProperty, parameterIntProperty, new GUIContent("Value")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationTrigger: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Trigger")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.PlayAnimation: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Clip")); + + for (int idx = 0; idx < parameterObjectsProperty.arraySize; ++idx) + { + GameObject obj = parameterObjectsProperty.GetArrayElementAtIndex(idx).objectReferenceValue as GameObject; + Animation anim = obj == null ? null : obj.GetComponent(); + if (anim != null && anim.GetClip(parameterStringProperty.stringValue) == null) + { + RenderHelpBox("Could not locate " + parameterStringProperty.stringValue + " on " + obj.name + "; is it legacy?", MessageType.Error); + break; + } + } + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.AudioTrigger: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + + List clipNames = new List(); + if (parameterObjectsProperty.arraySize > 0) + { + int idx = 0; + for (; idx < parameterObjectsProperty.arraySize; ++idx) + { + SerializedProperty prop = parameterObjectsProperty.GetArrayElementAtIndex(0); + GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; + if (obj != null) + { + foreach (AudioSource source in obj.GetComponents()) + if (source.clip != null && !string.IsNullOrEmpty(source.clip.name)) + clipNames.Add(source.clip.name); + break; + } + } + for (; idx < parameterObjectsProperty.arraySize; ++idx) + { + SerializedProperty prop = parameterObjectsProperty.GetArrayElementAtIndex(0); + GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; + if (obj != null) + { + List thisClipNames = new List(); + foreach (AudioSource source in obj.GetComponents()) + if (source.clip != null && !string.IsNullOrEmpty(source.clip.name)) + thisClipNames.Add(source.clip.name); + clipNames.RemoveAll(s => thisClipNames.Contains(s) == false); + } + } + } + + clipNames.Insert(0, ""); + int selectedIdx; + for (selectedIdx = clipNames.Count - 1; selectedIdx > 0; --selectedIdx) + if (parameterStringProperty.stringValue == clipNames[selectedIdx]) + break; + + parameterStringProperty.stringValue = clipNames[EditorGUILayout.Popup("Clip", selectedIdx, clipNames.ToArray())]; + break; + } +#pragma warning disable CS0618 // Type or member is obsolete + case VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility: +#pragma warning restore CS0618 // Type or member is obsolete + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand: + { + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Command")); + break; + } +#pragma warning disable CS0618 // Type or member is obsolete + case VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage: +#pragma warning restore CS0618 // Type or member is obsolete + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + if (parameterObjectsProperty.arraySize > 0) + RenderMethodSelector(eventProperty); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetGameObjectActive: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SetParticlePlaying: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Operation"), true); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.TeleportPlayer: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Align Room To Destination"), true); + parameterIntProperty.intValue = EditorGUILayout.Toggle("Lerp On Remote Clients", (parameterIntProperty.intValue != 0)) ? 1 : 0; + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelURI: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("URI")); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelVolume: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + parameterFloatProperty.floatValue = EditorGUILayout.Slider("Volume", parameterFloatProperty.floatValue, 0f, 1f); + break; + } + case VRCSDK2.VRC_EventHandler.VrcEventType.SendRPC: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + + if (parameterObjectsProperty.arraySize > 0) + { + RenderMethodSelector(eventProperty); + RenderRPCParameterEditor(eventProperty); + } + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.ActivateCustomTrigger: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + + VRC_EditorTools.CustomTriggerPopup("Name", parameterObjectsProperty, parameterStringProperty); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject: + { + VRCSDK2.VRC_SceneDescriptor scene = FindFirstObjectByType(); + + string path = parameterStringProperty.stringValue; + GameObject found = scene != null ? scene.DynamicPrefabs.FirstOrDefault(p => AssetDatabase.GetAssetOrScenePath(p) == path) : null; + found = found == null ? AssetDatabase.LoadAssetAtPath(path) : found; + GameObject newFound = EditorGUILayout.ObjectField("Prefab", found, typeof(GameObject), false) as GameObject; + parameterStringProperty.stringValue = newFound == null ? null : AssetDatabase.GetAssetOrScenePath(newFound); + + RenderTargetComponentList(parameterObjectsProperty, triggerIdx, "Locations"); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.DestroyObject: + { + SerializedProperty broadcastTypeProperty = triggerProperty.FindPropertyRelative("BroadcastType"); + VRCSDK2.VRC_EventHandler.VrcBroadcastType broadcast = (VRCSDK2.VRC_EventHandler.VrcBroadcastType)broadcastTypeProperty.intValue; + if (broadcast != VRCSDK2.VRC_EventHandler.VrcBroadcastType.Always && broadcast != VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysUnbuffered && broadcast != VRCSDK2.VRC_EventHandler.VrcBroadcastType.AlwaysBufferOne) + RenderHelpBox("Not all clients will destroy the object.", MessageType.Warning); + + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetLayer: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + parameterIntProperty.intValue = (int)EditorGUILayout.LayerField("Layer", parameterIntProperty.intValue); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetMaterial: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + + VRCSDK2.VRC_SceneDescriptor scene = FindFirstObjectByType(); + + string path = parameterStringProperty.stringValue; + Material found = scene != null ? scene.DynamicMaterials.FirstOrDefault(p => AssetDatabase.GetAssetOrScenePath(p) == path) : null; + found = found == null ? AssetDatabase.LoadAssetAtPath(path) : found; + Material newFound = EditorGUILayout.ObjectField("Material", found, typeof(Material), false) as Material; + parameterStringProperty.stringValue = newFound == null ? null : AssetDatabase.GetAssetOrScenePath(newFound); + + if (scene != null && found != newFound) + { + scene.DynamicMaterials.Add(newFound); + scene.DynamicMaterials.Remove(found); + } + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddDamage: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx, false); + RenderPropertyEditor(shadowProperty, parameterFloatProperty, new GUIContent("Damage")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddHealth: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx, false); + RenderPropertyEditor(shadowProperty, parameterFloatProperty, new GUIContent("Health")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetComponentActive: + { + RenderTargetGameObjectList(parameterObjectsProperty, triggerIdx); + if (RenderTargetComponentEditor(parameterStringProperty, parameterObjectsProperty, triggerIdx)) + RenderPropertyEditor(shadowProperty, parameterBoolOpProperty, new GUIContent("Enable"), true); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddVelocity: + case VRCSDK2.VRC_EventHandler.VrcEventType.SetVelocity: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + RenderVector3andSpacePropertyEditor(parameterBytesProperty, new GUIContent("Velocity")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddAngularVelocity: + case VRCSDK2.VRC_EventHandler.VrcEventType.SetAngularVelocity: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + RenderVector3andSpacePropertyEditor(parameterBytesProperty, new GUIContent("Angular Velocity")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.AddForce: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + RenderVector3andSpacePropertyEditor(parameterBytesProperty, new GUIContent("Force")); + } + break; + case VRCSDK2.VRC_EventHandler.VrcEventType.SetUIText: + { + RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Text")); + } + break; + +#if UDON + case VRCSDK2.VRC_EventHandler.VrcEventType.CallUdonMethod: + //{ + // RenderTargetComponentList(parameterObjectsProperty, triggerIdx); + // RenderPropertyEditor(shadowProperty, parameterStringProperty, new GUIContent("Method Name")); + //} + break; +#endif + default: + RenderHelpBox("Unsupported event type", MessageType.Error); + break; + } + } + + private void RenderVector3andSpacePropertyEditor(SerializedProperty propertyBytes, GUIContent label) + { + object[] parameters = null; + parameters = VRC.SDKBase.VRC_Serialization.ParameterDecoder(VRC_EditorTools.ReadBytesFromProperty(propertyBytes)); + if (parameters.Length == 0) + parameters = new object[1] { new Vector4() }; + + EditorGUI.BeginChangeCheck(); + Vector3 vec3Field = EditorGUILayout.Vector3Field(label, new Vector3(((Vector4)parameters[0]).x, ((Vector4)parameters[0]).y, ((Vector4)parameters[0]).z)); + bool spaceField = EditorGUILayout.Toggle("Use World Space", ((Vector4)parameters[0]).w > .5f ? true : false); + parameters[0] = new Vector4(vec3Field.x, vec3Field.y, vec3Field.z, Convert.ToSingle(spaceField)); + if (EditorGUI.EndChangeCheck()) + { + VRC_EditorTools.WriteBytesToProperty(propertyBytes, VRC.SDKBase.VRC_Serialization.ParameterEncoder(parameters)); + } + } + + private void RenderVector3PropertyEditor(SerializedProperty propertyBytes, GUIContent label) + { + object[] parameters = null; + parameters = VRC.SDKBase.VRC_Serialization.ParameterDecoder(VRC_EditorTools.ReadBytesFromProperty(propertyBytes)); + if (parameters.Length == 0) + parameters = new object[1] { new Vector3() }; + + EditorGUI.BeginChangeCheck(); + parameters[0] = EditorGUILayout.Vector3Field(label, (Vector3)parameters[0]); + + if (EditorGUI.EndChangeCheck()) + { + VRC_EditorTools.WriteBytesToProperty(propertyBytes, VRC.SDKBase.VRC_Serialization.ParameterEncoder(parameters)); + } + } + + bool RenderTargetComponentEditor(SerializedProperty componentNameProperty, SerializedProperty objectsProperty, int triggerIdx) + { + if (!objectsProperty.isArray || objectsProperty.arraySize == 0) + return false; + + HashSet behaviours = new HashSet(); + bool isFirst = true; + for (int objIdx = 0; objIdx < objectsProperty.arraySize; ++objIdx) + { + if (objectsProperty.GetArrayElementAtIndex(objIdx) == null || objectsProperty.GetArrayElementAtIndex(objIdx).objectReferenceValue == null || !(objectsProperty.GetArrayElementAtIndex(objIdx).objectReferenceValue is GameObject)) + continue; + + if (isFirst) + { + foreach (Component component in (objectsProperty.GetArrayElementAtIndex(0).objectReferenceValue as GameObject).GetComponents(typeof(Component))) + { + Type t = component.GetType(); + if (t.GetProperty("enabled") != null) + behaviours.Add(component.GetType()); + } + isFirst = false; + } + else + { + HashSet thisBehaviours = new HashSet(); + foreach (Component component in (objectsProperty.GetArrayElementAtIndex(objIdx).objectReferenceValue as GameObject).GetComponents(typeof(Component))) + { + Type t = component.GetType(); + if (t.GetProperty("enabled") != null) + thisBehaviours.Add(component.GetType()); + } + behaviours.RemoveWhere(s => thisBehaviours.Contains(s) == false); + } + } + + if (behaviours.Count == 0) + return false; + + Type[] types = behaviours.ToArray(); + string[] options = behaviours.Select(t => t.FullName).ToArray(); + int selectedIdx = 0; + for (int typeIdx = 0; typeIdx < types.Length; ++typeIdx) + if (types[typeIdx].FullName == componentNameProperty.stringValue) + { + selectedIdx = typeIdx; + break; + } + + selectedIdx = EditorGUILayout.Popup("Component", selectedIdx, options); + componentNameProperty.stringValue = types[selectedIdx].FullName; + + return true; + } + + void RenderRPCParameterEditor(SerializedProperty eventProperty) + { + EditorGUI.BeginChangeCheck(); + + SerializedProperty parameterIntProperty = eventProperty.FindPropertyRelative("ParameterInt"); + SerializedProperty parameterObjectsProperty = eventProperty.FindPropertyRelative("ParameterObjects"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + SerializedProperty parameterBytesProperty = eventProperty.FindPropertyRelative("ParameterBytes"); + + if (parameterIntProperty.intValue == -1) + parameterIntProperty.intValue = (int)(VRCSDK2.VRC_EventHandler.VrcTargetType.All); + + parameterIntProperty.intValue = (int)VRC_EditorTools.FilteredEnumPopup("Targets", (VRCSDK2.VRC_EventHandler.VrcTargetType)parameterIntProperty.intValue, e => e != VRCSDK2.VRC_EventHandler.VrcTargetType.TargetPlayer); + + string message = null; + switch ((VRCSDK2.VRC_EventHandler.VrcTargetType)parameterIntProperty.intValue) + { + case VRCSDK2.VRC_EventHandler.VrcTargetType.All: + message = "Will execute on all clients, except for those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.AllBuffered: + message = "Will execute on all clients, including those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Local: + message = "Will execute for the instigator only."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Master: + message = "Will execute on the Master."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Others: + message = "Will execute for others but not locally, except for those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.OthersBuffered: + message = "Will execute for others but not locally, including those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.Owner: + message = "Will execute on the Owner."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.AllBufferOne: + message = "Will execute on all clients, and only the most recent is executed for those that join later."; + break; + case VRCSDK2.VRC_EventHandler.VrcTargetType.OthersBufferOne: + message = "Will execute for others but not locally, and only the most recent is executed for those that join later."; + break; + } + if (message != null) + RenderHelpBox(message, MessageType.Info); + + Dictionary> methods = VRC_EditorTools.GetSharedAccessibleMethodsOnGameObjects(parameterObjectsProperty); + if (methods.Count == 0) + { + RenderHelpBox("No applicable methods found.", MessageType.Error); + return; + } + + List methodInfos = methods.Values.Aggregate(new List(), (acc, lst) => { acc.AddRange(lst); return acc; }); + + MethodInfo info = methodInfos.FirstOrDefault(m => m.Name == parameterStringProperty.stringValue); + if (info == null) + return; + + ParameterInfo[] paramInfo = info.GetParameters(); + + // Editor-only + foreach (var p in paramInfo) + if (p.ParameterType.Namespace.StartsWith("VRCSDK2")) + VRC.SDKBase.VRC_Serialization.RegisterType(p.ParameterType); + + object[] parameters = null; + if (rpcByteCache.ContainsKey(eventProperty.propertyPath)) + parameters = rpcByteCache[eventProperty.propertyPath]; + else + { + parameters = VRC.SDKBase.VRC_Serialization.ParameterDecoder(VRC_EditorTools.ReadBytesFromProperty(parameterBytesProperty)); + rpcByteCache.Add(eventProperty.propertyPath, parameters); + } + + if (parameters == null) + parameters = new object[paramInfo.Length]; + if (parameters.Length != paramInfo.Length) + Array.Resize(ref parameters, paramInfo.Length); + + EditorGUI.BeginChangeCheck(); + + bool finalParamIsPlayer = false; + + for (int idx = 0; idx < parameters.Length; ++idx) + { + Type paramType = paramInfo[idx].ParameterType; + if (paramType == typeof(Color)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = Color.black; + parameters[idx] = EditorGUILayout.ColorField(paramInfo[idx].Name, (Color)parameters[idx]); + } + else if (paramType == typeof(bool)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = false; + parameters[idx] = EditorGUILayout.Toggle(paramInfo[idx].Name, (bool)parameters[idx]); + } + else if (paramType.IsEnum) + { + // make an array of strings of the enum values + var values = Enum.GetValues(paramType); + string[] itemStrings = new string[values.Length]; + int i = 0; + foreach (var item in Enum.GetValues(paramType)) + { + itemStrings[i++] = item.ToString(); + } + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = Enum.Parse(paramType, itemStrings[0]); + parameters[idx] = Enum.Parse(paramType, itemStrings[EditorGUILayout.Popup(paramInfo[idx].Name, (int)parameters[idx], itemStrings)]); + } + else if (paramType == typeof(double)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0d; + parameters[idx] = EditorGUILayout.DoubleField(paramInfo[idx].Name, (double)parameters[idx]); + } + else if (paramType == typeof(float)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0f; + parameters[idx] = EditorGUILayout.FloatField(paramInfo[idx].Name, (float)parameters[idx]); + } + else if (paramType == typeof(int)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0; + parameters[idx] = EditorGUILayout.IntField(paramInfo[idx].Name, (int)parameters[idx]); + } + else if (typeof(VRC.SDKBase.VRCPlayerApi).IsAssignableFrom(paramType)) + { + if (idx == parameters.Length - 1) + finalParamIsPlayer = true; + parameters[idx] = null; + } + else if (paramType == typeof(long)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = 0; + parameters[idx] = EditorGUILayout.LongField(paramInfo[idx].Name, (long)parameters[idx]); + } + else if (paramType == typeof(UnityEngine.Rect)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Rect(); + parameters[idx] = EditorGUILayout.RectField(paramInfo[idx].Name, (UnityEngine.Rect)parameters[idx]); + } + else if (paramType == typeof(string)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = ""; + parameters[idx] = EditorGUILayout.TextField(paramInfo[idx].Name, (string)parameters[idx]); + } + else if (paramType == typeof(Vector2)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Vector2(); + parameters[idx] = EditorGUILayout.Vector2Field(paramInfo[idx].Name, (Vector2)parameters[idx]); + } + else if (paramType == typeof(Vector3)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Vector3(); + parameters[idx] = EditorGUILayout.Vector3Field(paramInfo[idx].Name, (Vector3)parameters[idx]); + } + else if (paramType == typeof(Vector4)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Vector4(); + parameters[idx] = EditorGUILayout.Vector4Field(paramInfo[idx].Name, (Vector4)parameters[idx]); + } + else if (paramType == typeof(Quaternion)) + { + if (parameters[idx] == null || parameters[idx].GetType() != paramType) + parameters[idx] = new Quaternion(); + parameters[idx] = Quaternion.Euler(EditorGUILayout.Vector3Field(paramInfo[idx].Name, ((Quaternion)parameters[idx]).eulerAngles)); + } + else if (paramType == typeof(UnityEngine.Object) || paramType.IsSubclassOf(typeof(UnityEngine.Object))) + { + if (parameters[idx] != null && parameters[idx].GetType() != paramType) + parameters[idx] = null; + parameters[idx] = EditorGUILayout.ObjectField(paramInfo[idx].Name, (UnityEngine.Object)parameters[idx], paramType, true); + } + else + EditorGUILayout.LabelField("Unable to handle " + paramType.Name, EditorStyles.boldLabel); + } + + if (finalParamIsPlayer) + Array.Resize(ref parameters, parameters.Length - 1); + + if (EditorGUI.EndChangeCheck()) + { + VRC_EditorTools.WriteBytesToProperty(parameterBytesProperty, VRC.SDKBase.VRC_Serialization.ParameterEncoder(parameters)); + rpcByteCache[eventProperty.propertyPath] = parameters; + } + } + + void RenderMethodSelector(SerializedProperty eventProperty) + { + SerializedProperty parameterObjectsProperty = eventProperty.FindPropertyRelative("ParameterObjects"); + SerializedProperty parameterStringProperty = eventProperty.FindPropertyRelative("ParameterString"); + SerializedProperty parameterBytesProperty = eventProperty.FindPropertyRelative("ParameterBytes"); + + Dictionary> methods = VRC_EditorTools.GetSharedAccessibleMethodsOnGameObjects(parameterObjectsProperty); + if (methods.Count == 0) + return; + + var combined = methods + .Select(pair => pair.Value.Select(s => pair.Key + "." + s.Name).ToList()) + .Aggregate((a, b) => + { + var v = new List(); + v.AddRange(a); + v.AddRange(b); + return v; + }).ToList(); + combined.Insert(0, "Custom Method"); + + int currentIndex = string.IsNullOrEmpty(parameterStringProperty.stringValue) ? 0 : combined.FindIndex(s => + { + var split = s.Split('.'); + return split.Length > 1 && s.Split('.')[1] == parameterStringProperty.stringValue; + }); + if (currentIndex < 0 || currentIndex >= combined.Count) + currentIndex = 0; + + int newIndex = EditorGUILayout.Popup("Method", currentIndex, combined.ToArray()); + if (newIndex != currentIndex) + { + parameterStringProperty.stringValue = ""; + parameterBytesProperty.arraySize = 0; + } + currentIndex = newIndex; + + if (currentIndex == 0) + EditorGUILayout.PropertyField(parameterStringProperty, new GUIContent("Custom Method")); + else + parameterStringProperty.stringValue = combined[currentIndex].Split('.')[1]; + } + + private void RenderPropertyEditor(SerializedProperty shadowProperty, SerializedProperty property, GUIContent label, bool isBoolOp = false) + { + VRCSDK2.VRC_DataStorage ds = (target as VRCSDK2.VRC_Trigger).gameObject.GetComponent(); + if (ds != null && ds.data != null && ds.data.Length != 0 && shadowProperty != null) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel(label); + + bool renderField = false; + switch (property.propertyType) + { + case SerializedPropertyType.Boolean: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterBoolOp"); + List vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.Bool).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + case SerializedPropertyType.Float: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterFloat"); + List vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.Float).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + case SerializedPropertyType.Integer: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterInt"); + List vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.Int).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + case SerializedPropertyType.String: + { + SerializedProperty prop = shadowProperty.FindPropertyRelative("ParameterString"); + List vals = ds.data.Where(el => el.type == VRCSDK2.VRC_DataStorage.VrcDataType.String).Select(el => el.name).ToList(); + renderField = !ListPopup(vals, prop); + } + break; + default: + { + renderField = true; + } + break; + } + + if (renderField) + EditorGUILayout.PropertyField(property, GUIContent.none); + EditorGUILayout.EndHorizontal(); + } + else + { + if (isBoolOp) + VRC_EditorTools.FilteredEnumPopup(label.text, property, s => s != VRCSDK2.VRC_EventHandler.VrcBooleanOp.Unused); + else + EditorGUILayout.PropertyField(property, label); + return; + } + } + + private bool ListPopup(List vals, SerializedProperty prop, bool custom = true) + { + if (vals.Count == 0) + return false; + + if (custom) + vals.Insert(0, "Custom"); + + int selectedIdx = prop.stringValue == null ? 0 : vals.IndexOf(prop.stringValue); + if (selectedIdx < 0 || selectedIdx > vals.Count) + selectedIdx = 0; + + int idx = EditorGUILayout.Popup(selectedIdx, vals.ToArray()); + if (idx == 0 && custom) + { + prop.stringValue = null; + return false; + } + else + { + prop.stringValue = vals[idx]; + return true; + } + } + } +} +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_TriggerEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_TriggerEditor.cs.meta new file mode 100644 index 0000000..f108aeb --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_TriggerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3aecd666943878944a811acb9db2ace7 +timeCreated: 1474315179 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_WebPanelEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_WebPanelEditor.cs new file mode 100644 index 0000000..5253d70 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_WebPanelEditor.cs @@ -0,0 +1,215 @@ +#if VRC_SDK_VRCSDK2 && UNITY_EDITOR +using System.IO; +using UnityEditor; +using UnityEngine; +using UnityEditor.Build; +using System; +using ZLinq; +using VRC.SDKBase.Editor; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRCSDK2.VRC_WebPanel))] + public class VRC_WebPanelEditor : UnityEditor.Editor + { + private void InspectorField(string propertyName, string humanName) + { + SerializedProperty propertyField = serializedObject.FindProperty(propertyName); + EditorGUILayout.PropertyField(propertyField, new GUIContent(humanName), true); + } + + bool showFiles = false; + System.Collections.Generic.List directories = null; + System.Collections.Generic.List files = null; + + public override void OnInspectorGUI() + { + serializedObject.Update(); + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.BeginVertical(); + + EditorGUILayout.HelpBox("Do not play any videos with Web Panels, use VRC_SyncVideoPlayer instead!", MessageType.Error); + + EditorGUILayout.Space(); + + InspectorField("proximity", "Proximity for Interactivity"); + EditorGUILayout.Space(); + + VRCSDK2.VRC_WebPanel web = (VRCSDK2.VRC_WebPanel)target; + + if (Application.isPlaying) + { + InspectorField("webRoot", "Web Root"); + InspectorField("defaultUrl", "URI"); + + showFiles = web.webData != null && EditorGUILayout.Foldout(showFiles, web.webData.Count.ToString() + " files imported"); + if (showFiles) + foreach (var file in web.webData) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel(file.path); + EditorGUILayout.LabelField(file.data.Length.ToString()); + EditorGUILayout.EndHorizontal(); + } + } + else + { + SerializedProperty webRoot = serializedObject.FindProperty("webRoot"); + RenderDirectoryList(serializedObject, "webRoot", "Path To Web Content"); + + if (string.IsNullOrEmpty(webRoot.stringValue)) + { + InspectorField("defaultUrl", "Start URI"); + } + else + { + RenderWebRootSelector(serializedObject, "defaultUrl", "Start Page"); + + if (VRCSettings.DisplayHelpBoxes) + { + EditorGUILayout.HelpBox("Javascript API bindings are called with engine.call('methodName', ...), which returns a promise-like object.", MessageType.Info); + EditorGUILayout.HelpBox("Javascript may call ListBindings() to discover available API bindings.", MessageType.Info); + EditorGUILayout.HelpBox("Javascript may listen for the 'onBindingsReady' event to execute script when the page is fully loaded and API bindings are available.", MessageType.Info); + } + } + } + + EditorGUILayout.Space(); + + InspectorField("cookiesEnabled", "Enable Cookies"); + + InspectorField("interactive", "Is Interactive"); + + InspectorField("localOnly", "Only Visible Locally"); + + if (!web.localOnly) + { + InspectorField("syncURI", "Synchronize URI"); + InspectorField("syncInput", "Synchronize Mouse Position"); + } + + InspectorField("transparent", "Transparent Background"); + + InspectorField("autoFormSubmit", "Input should Submit Forms"); + + EditorGUILayout.Space(); + + InspectorField("station", "Interaction Station"); + EditorGUILayout.Space(); + + InspectorField("cursor", "Mouse Cursor Object"); + + EditorGUILayout.Space(); + + InspectorField("resolutionWidth", "Resolution Width"); + InspectorField("resolutionHeight", "Resolution Height"); + InspectorField("displayRegion", "Display Region"); + + EditorGUILayout.Space(); + + InspectorField("extraVideoScreens", "Duplicate Screens"); + + EditorGUILayout.EndVertical(); + + if (EditorGUI.EndChangeCheck()) + serializedObject.ApplyModifiedProperties(); + } + + private void AddSubDirectories(ref System.Collections.Generic.List l, string root) + { + if (!Directory.Exists(root)) + { + return; + } + + if (!root.StartsWith(Application.dataPath + Path.DirectorySeparatorChar + "VRCSDK") + || root == Application.dataPath + Path.DirectorySeparatorChar + "VRCSDK" + Path.DirectorySeparatorChar + "Examples" + Path.DirectorySeparatorChar + "Sample Assets" + Path.DirectorySeparatorChar + "WebRoot") + l.Add(root.Substring(Application.dataPath.Length)); + + string[] subdirectories = Directory.GetDirectories(root); + foreach (string dir in subdirectories) + AddSubDirectories(ref l, dir); + } + + private void RenderDirectoryList(SerializedObject obj, string propertyName, string humanName) + { + if (directories == null) + { + directories = new System.Collections.Generic.List(); + directories.Add("No Web Content Directory"); + + AddSubDirectories(ref directories, Application.dataPath + Path.DirectorySeparatorChar); + } + + SerializedProperty target = serializedObject.FindProperty(propertyName); + + int selectedIdx = target.stringValue == null ? 0 : directories.IndexOf(target.stringValue); + if (selectedIdx < 0 || selectedIdx >= directories.Count) + selectedIdx = 0; + + selectedIdx = EditorGUILayout.Popup(humanName, selectedIdx, directories.ToArray()); + if (selectedIdx > 0 && selectedIdx < directories.Count) + target.stringValue = directories[selectedIdx]; + else + target.stringValue = null; + } + + private void AddSubDirectoryFiles(ref System.Collections.Generic.List l, string root) + { + if (!Directory.Exists(root)) + return; + + string[] files = Directory.GetFiles(root); + foreach (string file in files.Where(f => f.ToLower().EndsWith(".html") || f.ToLower().EndsWith(".htm"))) + l.Add(file.Substring(Application.dataPath.Length)); + + string[] subdirectories = Directory.GetDirectories(root); + foreach (string dir in subdirectories) + AddSubDirectoryFiles(ref l, dir); + } + + private void RenderWebRootSelector(SerializedObject obj, string propertyName, string humanName) + { + SerializedProperty webRoot = obj.FindProperty("webRoot"); + SerializedProperty target = serializedObject.FindProperty(propertyName); + + if (files == null) + { + files = new System.Collections.Generic.List(); + + AddSubDirectoryFiles(ref files, Application.dataPath + webRoot.stringValue); + if (files.Count == 0) + { + EditorGUILayout.HelpBox("No suitable html files found in Web Content path.", MessageType.Error); + return; + } + } + + int selectedIdx = 0; + + try + { + System.Uri uri = string.IsNullOrEmpty(target.stringValue) ? null : new Uri(target.stringValue); + + selectedIdx = uri == null ? 0 : files.IndexOf(uri.AbsolutePath.Replace('/', System.IO.Path.DirectorySeparatorChar)); + if (selectedIdx < 0 || selectedIdx >= files.Count) + selectedIdx = 0; + } + catch { } + + selectedIdx = EditorGUILayout.Popup(humanName, selectedIdx, files.ToArray()); + if (selectedIdx >= 0 && selectedIdx < files.Count) + { + System.UriBuilder builder = new UriBuilder() + { + Scheme = "file", + Path = files[selectedIdx].Replace(System.IO.Path.DirectorySeparatorChar, '/'), + Host = "" + }; + target.stringValue = builder.Uri.ToString(); + } + } + } +} +#endif \ No newline at end of file diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_WebPanelEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_WebPanelEditor.cs.meta new file mode 100644 index 0000000..06aa899 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_WebPanelEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d09b36020f697be4d9a0f5a6a48cfa83 +timeCreated: 1457992191 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_YouTubeSyncEditor.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_YouTubeSyncEditor.cs new file mode 100644 index 0000000..0193737 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_YouTubeSyncEditor.cs @@ -0,0 +1,20 @@ +#if UNITY_EDITOR && VRC_SDK_VRCSDK2 +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.IO; + +namespace VRCSDK2 +{ + [CustomEditor(typeof(VRC_YouTubeSync))] + public class VRC_YouTubeSyncEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("This component is deprecated, please use the VRC_SyncVideoPlayer component instead.", MessageType.Error); + } + } +} +#endif diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_YouTubeSyncEditor.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_YouTubeSyncEditor.cs.meta new file mode 100644 index 0000000..29cadd5 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/Components/VRC_YouTubeSyncEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 764e26c1ca28e2e45a30c778c1955a47 +timeCreated: 1474675311 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel.meta new file mode 100644 index 0000000..7dca637 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e751dcaa3656a324f91244e7b795d83a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/IVRCSdkControlPanelBuilder.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/IVRCSdkControlPanelBuilder.cs new file mode 100644 index 0000000..c5e8a55 --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/IVRCSdkControlPanelBuilder.cs @@ -0,0 +1,36 @@ + +using System; +using UnityEngine; +using UnityEngine.UIElements; + +// Common interface used by all builder panels inside their respective packages + +/// +/// This interface is reserved for SDK use, refer to Interfaces inside the Public SDK API folder for public APIs +/// +public interface IVRCSdkControlPanelBuilder +{ + void Initialize(); + void ShowSettingsOptions(); + bool IsValidBuilder(out string message); + void CreateBuilderErrorGUI(VisualElement root); + + void CreateValidationsGUI(VisualElement root); + + EventHandler OnContentChanged { get; set; } + EventHandler OnShouldRevalidate { get; set; } + + void RegisterBuilder(VRCSdkControlPanel baseBuilder); + void SelectAllComponents(); + void CreateContentInfoGUI(VisualElement root); + void CreateBuildGUI(VisualElement root); + + /// + /// Returns the image to show within the Builder tab. If no image is provided - the default image is used + /// + /// + Texture2D GetHeaderImage() + { + return null; + } +} diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/IVRCSdkControlPanelBuilder.cs.meta b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/IVRCSdkControlPanelBuilder.cs.meta new file mode 100644 index 0000000..685eb8e --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/IVRCSdkControlPanelBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 310a760e312f2984e85eece367bab19a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/VRCSdkControlPanel.cs b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/VRCSdkControlPanel.cs new file mode 100644 index 0000000..9323b4f --- /dev/null +++ b/Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/ControlPanel/VRCSdkControlPanel.cs @@ -0,0 +1,511 @@ +using System; +using System.Linq; +using System.Runtime.CompilerServices; +using JetBrains.Annotations; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; +using VRC.Core; +using VRC.Editor; +using VRC.SDKBase.Editor; + +[assembly:InternalsVisibleTo("VRC.ExampleCentral.Editor")] + +/// This class sets up the basic panel layout and draws the main tabs +/// Implementation of each tab is handled within other files extending this partial class + + +[ExecuteInEditMode] +public partial class VRCSdkControlPanel : EditorWindow, IVRCSdkPanelApi +{ + public static VRCSdkControlPanel window; + + [MenuItem("VRChat SDK/Show Control Panel", false, 600)] + internal static void ShowControlPanel() + { + if (!ConfigManager.RemoteConfig.IsInitialized()) + { + VRC.Core.API.SetOnlineMode(true); + ConfigManager.RemoteConfig.Init(() => ShowControlPanel()); + return; + } + + GetWindow(typeof(VRCSdkControlPanel)); + window.titleContent.text = "VRChat SDK"; + window.minSize = new Vector2(SdkWindowWidth + 4, 450); + window.maxSize = new Vector2(SdkWindowWidth + 4, 2000); + window.Init(); + window.Show(); + } + + public VRCSdkControlPanel() + { + window = this; + } + + #region IMGUI Init + + public static GUIStyle titleGuiStyle; + public static GUIStyle boxGuiStyle; + public static GUIStyle infoGuiStyle; + public static GUIStyle listButtonStyleEven; + public static GUIStyle listButtonStyleOdd; + public static GUIStyle listButtonStyleSelected; + public static GUIStyle scrollViewSeparatorStyle; + public static GUIStyle searchBarStyle; + public static GUIStyle accountWindowStyle; + public static GUIStyle centeredLabelStyle; + public static GUIStyle contentDescriptionStyle; + public static GUIStyle contentTitleStyle; + public static GUIStyle unityUpgradeBannerStyle; + + void InitializeStyles() + { + titleGuiStyle = new GUIStyle(); + titleGuiStyle.fontSize = 15; + titleGuiStyle.fontStyle = FontStyle.BoldAndItalic; + titleGuiStyle.alignment = TextAnchor.MiddleCenter; + titleGuiStyle.wordWrap = true; + if (EditorGUIUtility.isProSkin) + titleGuiStyle.normal.textColor = Color.white; + else + titleGuiStyle.normal.textColor = Color.black; + + boxGuiStyle = new GUIStyle + { + padding = new RectOffset(5,5,5,5) + }; + if (EditorGUIUtility.isProSkin) + { + boxGuiStyle.normal.background = CreateBackgroundColorImage(new Color(0.3f, 0.3f, 0.3f)); + boxGuiStyle.normal.textColor = Color.white; + } + else + { + boxGuiStyle.normal.background = CreateBackgroundColorImage(new Color(0.85f, 0.85f, 0.85f)); + boxGuiStyle.normal.textColor = Color.black; + } + + infoGuiStyle = new GUIStyle(); + infoGuiStyle.wordWrap = true; + if (EditorGUIUtility.isProSkin) + infoGuiStyle.normal.textColor = Color.white; + else + infoGuiStyle.normal.textColor = Color.black; + infoGuiStyle.margin = new RectOffset(10, 10, 10, 10); + + listButtonStyleEven = new GUIStyle(); + listButtonStyleEven.margin = new RectOffset(0, 0, 0, 0); + listButtonStyleEven.border = new RectOffset(0, 0, 0, 0); + if (EditorGUIUtility.isProSkin) + { + listButtonStyleEven.normal.textColor = new Color(0.8f, 0.8f, 0.8f); + listButtonStyleEven.normal.background = CreateBackgroundColorImage(new Color(0.540f, 0.540f, 0.54f)); + } + else + { + listButtonStyleEven.normal.textColor = Color.black; + listButtonStyleEven.normal.background = CreateBackgroundColorImage(new Color(0.85f, 0.85f, 0.85f)); + } + + listButtonStyleOdd = new GUIStyle(); + listButtonStyleOdd.margin = new RectOffset(0, 0, 0, 0); + listButtonStyleOdd.border = new RectOffset(0, 0, 0, 0); + if (EditorGUIUtility.isProSkin) + { + listButtonStyleOdd.normal.textColor = new Color(0.8f, 0.8f, 0.8f); + //listButtonStyleOdd.normal.background = CreateBackgroundColorImage(new Color(0.50f, 0.50f, 0.50f)); + } + else + { + listButtonStyleOdd.normal.textColor = Color.black; + listButtonStyleOdd.normal.background = CreateBackgroundColorImage(new Color(0.90f, 0.90f, 0.90f)); + } + + listButtonStyleSelected = new GUIStyle(); + listButtonStyleSelected.normal.textColor = Color.white; + listButtonStyleSelected.margin = new RectOffset(0, 0, 0, 0); + if (EditorGUIUtility.isProSkin) + { + listButtonStyleSelected.normal.textColor = new Color(0.8f, 0.8f, 0.8f); + listButtonStyleSelected.normal.background = CreateBackgroundColorImage(new Color(0.4f, 0.4f, 0.4f)); + } + else + { + listButtonStyleSelected.normal.textColor = Color.black; + listButtonStyleSelected.normal.background = CreateBackgroundColorImage(new Color(0.75f, 0.75f, 0.75f)); + } + + scrollViewSeparatorStyle = new GUIStyle("Toolbar"); + scrollViewSeparatorStyle.fixedWidth = SdkWindowWidth + 10; + scrollViewSeparatorStyle.fixedHeight = 4; + scrollViewSeparatorStyle.margin.top = 1; + + searchBarStyle = new GUIStyle("Toolbar"); + searchBarStyle.fixedWidth = SdkWindowWidth - 8; + searchBarStyle.fixedHeight = 23; + searchBarStyle.padding.top = 3; + + accountWindowStyle = new GUIStyle("window") + { + padding = new RectOffset(10, 10, 10, 10), + margin = new RectOffset(0,0,30,30) + }; + + centeredLabelStyle = new GUIStyle(EditorStyles.boldLabel) + { + alignment = TextAnchor.UpperCenter, + margin = new RectOffset(0,0,0,10) + }; + + contentDescriptionStyle = new GUIStyle(EditorStyles.wordWrappedLabel) + { + wordWrap = true + }; + + contentTitleStyle = new GUIStyle(EditorStyles.boldLabel) + { + wordWrap = true + }; + + unityUpgradeBannerStyle = new GUIStyle + { + normal = new GUIStyleState + { + background = Resources.Load("vrcSdkMigrateTo2022Splash") + }, + alignment = TextAnchor.LowerCenter, + margin = new RectOffset(0,0,20,0), + fixedWidth = 506, + fixedHeight = 148 + }; + } + + #endregion + + private void Init() + { + InitializeStyles(); + ResetIssues(); + InitAccount(); + } + + private void OnEnable() + { + OnEnableAccount(); + _stylesInitialized = false; + OnPanelLoggedIn -= RestoreTab; + OnPanelLoggedIn += RestoreTab; + OnUserPlatformsFetched -= RefreshPlatformSwitcher; + OnUserPlatformsFetched += RefreshPlatformSwitcher; + AssemblyReloadEvents.afterAssemblyReload -= BuilderAssemblyReload; + AssemblyReloadEvents.afterAssemblyReload += BuilderAssemblyReload; + OnSdkPanelEnable?.Invoke(this, null); + _panelState = SdkPanelState.Idle; + OnSdkPanelStateChange?.Invoke(this, _panelState); + TabsEnabled = true; + } + + private void OnDisable() + { + OnPanelLoggedIn -= RestoreTab; + OnUserPlatformsFetched -= RefreshPlatformSwitcher; + AssemblyReloadEvents.afterAssemblyReload -= BuilderAssemblyReload; + OnSdkPanelDisable?.Invoke(this, null); + _panelState = SdkPanelState.Idle; + OnSdkPanelStateChange?.Invoke(this, _panelState); + } + + private void RestoreTab(object sender, APIUser e) + { + rootVisualElement.schedule.Execute(() => + { + SelectTab(PanelTab.Builder); + }).ExecuteLater(200); + } + + private void OnDestroy() + { + AccountDestroy(); + } + + public const int SdkWindowWidth = 512; + + private readonly bool[] _toolbarOptionsLoggedIn = new bool[4] {true, true, true, true}; + private readonly bool[] _toolbarOptionsNotLoggedIn = new bool[4] {true, false, false, true}; + private bool _stylesInitialized; + + private SdkPanelState _panelState = SdkPanelState.Idle; + + private Button _authenticationTabBtn; + private Button _buildTabBtn; + private Button _contentManagerTabBtn; + private Button _settingsTabBtn; + private Button[] _tabButtons; + private VisualElement _sdkPanel; + private VisualElement _builderPanel; + private VisualTreeAsset _builderPanelLayout; + private StyleSheet _builderPanelStyles; + private float _windowOpenTime; + + private bool _tabsEnabled; + internal bool TabsEnabled + { + get => _tabsEnabled; + set + { + _tabsEnabled = value; + if (_tabButtons != null) + { + foreach (var button in _tabButtons) + { + button.SetEnabled(value); + } + } + } + } + + internal enum PanelTab + { + Account, + Builder, + ContentManager, + Settings + } + + private void CreateGUI() + { + if (window == null) + { + window = (VRCSdkControlPanel)EditorWindow.GetWindow(typeof(VRCSdkControlPanel)); + } + + _windowOpenTime = Time.realtimeSinceStartup; + + var visualTree = Resources.Load("VRCSdkPanelLayout"); + visualTree.CloneTree(rootVisualElement); + var styles = Resources.Load("VRCSdkPanelStyles"); + rootVisualElement.styleSheets.Add(styles); + rootVisualElement.AddToClassList(EditorGUIUtility.isProSkin ? "dark" : "light"); + + _sdkPanel = rootVisualElement.Q("sdk-container"); + _builderPanel = rootVisualElement.Q("builder-panel"); + + CreateTabs(); + RenderTabs(); + + rootVisualElement.schedule.Execute(() => + { + var currentPanel = VRCSettings.ActiveWindowPanel; + if (EditorApplication.isPlaying && currentPanel != 0) + { + SelectTab(PanelTab.Account); + return; + } + // Check that the tabs are enabled, if not - we must re-render tabs + if (APIUser.IsLoggedIn && (!_tabButtons[1].enabledSelf || !_tabButtons[2].enabledSelf)) + { + RenderTabs(); + return; + } + // When the user isn't logged in - we only allow Settings and Authentication tabs to be viewed + if (APIUser.IsLoggedIn || currentPanel == 0 || currentPanel == 3) return; + SelectTab(PanelTab.Account); + }).Every(500); + + var sdkContainer = rootVisualElement.Q("sdk-container"); + sdkContainer.Add(new IMGUIContainer(() => + { + if (!_stylesInitialized) + { + InitializeStyles(); + _stylesInitialized = true; + } + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.BeginVertical(); + + if (Application.isPlaying) + { + GUI.enabled = false; + GUILayout.Space(20); + EditorGUILayout.LabelField("Unity Application is running ...\nStop it to access the Control Panel", titleGuiStyle, GUILayout.Width(SdkWindowWidth)); + GUI.enabled = true; + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + return; + } + + EditorGUILayout.Space(); + + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + switch ((PanelTab) VRCSettings.ActiveWindowPanel) + { + case PanelTab.Builder: + break; + case PanelTab.ContentManager: + ShowContent(); + break; + case PanelTab.Settings: + ShowSettings(); + break; + case PanelTab.Account: + default: + ShowAccount(); + break; + } + })); + + EnvConfig.SetActiveSDKDefines(); + } + + private void CreateTabs() + { + _authenticationTabBtn = rootVisualElement.Q