@dcl-regenesislabs/bevy-explorer-web 0.1.0-18229784557.commit-ef374b9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/asset_loader.js +31 -0
  2. package/assets/animations/Dance_Female.glb +0 -0
  3. package/assets/animations/Dance_Male.glb +0 -0
  4. package/assets/animations/F_FistPump.glb +0 -0
  5. package/assets/animations/F_RobotDance.glb +0 -0
  6. package/assets/animations/Hands_Air.glb +0 -0
  7. package/assets/animations/M_FistPump.glb +0 -0
  8. package/assets/animations/M_RobotDance.glb +0 -0
  9. package/assets/animations/Raise_Hand.glb +0 -0
  10. package/assets/animations/Throw Money-Emote.glb +0 -0
  11. package/assets/animations/Wave_Female.glb +0 -0
  12. package/assets/animations/Wave_Male.glb +0 -0
  13. package/assets/animations/clap.glb +0 -0
  14. package/assets/animations/disco_dance.glb +0 -0
  15. package/assets/animations/dont_wanna_see.glb +0 -0
  16. package/assets/animations/f_head_explode.glb +0 -0
  17. package/assets/animations/idle.glb +0 -0
  18. package/assets/animations/jump2.glb +0 -0
  19. package/assets/animations/kiss.glb +0 -0
  20. package/assets/animations/m_head_explode.glb +0 -0
  21. package/assets/animations/mchammer-dance.glb +0 -0
  22. package/assets/animations/run.glb +0 -0
  23. package/assets/animations/shrug.glb +0 -0
  24. package/assets/animations/tektonik-dance.glb +0 -0
  25. package/assets/animations/thumbnails/clap.png +0 -0
  26. package/assets/animations/thumbnails/dance.png +0 -0
  27. package/assets/animations/thumbnails/disco.png +0 -0
  28. package/assets/animations/thumbnails/dontsee.png +0 -0
  29. package/assets/animations/thumbnails/fistpump.png +0 -0
  30. package/assets/animations/thumbnails/hammer.png +0 -0
  31. package/assets/animations/thumbnails/handsair.png +0 -0
  32. package/assets/animations/thumbnails/headexplode.png +0 -0
  33. package/assets/animations/thumbnails/kiss.png +0 -0
  34. package/assets/animations/thumbnails/money.png +0 -0
  35. package/assets/animations/thumbnails/raisehand.png +0 -0
  36. package/assets/animations/thumbnails/robot.png +0 -0
  37. package/assets/animations/thumbnails/shrug.png +0 -0
  38. package/assets/animations/thumbnails/tektonik.png +0 -0
  39. package/assets/animations/thumbnails/tik.png +0 -0
  40. package/assets/animations/thumbnails/wave.png +0 -0
  41. package/assets/animations/tik-tok-dance.glb +0 -0
  42. package/assets/animations/walk.glb +0 -0
  43. package/assets/fonts/NotoSans-Bold.ttf +0 -0
  44. package/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
  45. package/assets/fonts/NotoSans-Italic.ttf +0 -0
  46. package/assets/fonts/NotoSans-Regular.ttf +0 -0
  47. package/assets/fonts/NotoSansMono-Bold.ttf +0 -0
  48. package/assets/fonts/NotoSansMono-Regular.ttf +0 -0
  49. package/assets/fonts/NotoSerif-Bold.ttf +0 -0
  50. package/assets/fonts/NotoSerif-BoldItalic.ttf +0 -0
  51. package/assets/fonts/NotoSerif-Italic.ttf +0 -0
  52. package/assets/fonts/NotoSerif-Regular.ttf +0 -0
  53. package/assets/fonts/OFL.txt +93 -0
  54. package/assets/images/FriendsIcon.png +0 -0
  55. package/assets/images/ask.png +0 -0
  56. package/assets/images/backpack/Background.jpeg +0 -0
  57. package/assets/images/backpack/empty.png +0 -0
  58. package/assets/images/backpack/item_bg.png +0 -0
  59. package/assets/images/backpack/wearable_categories/body_shape.png +0 -0
  60. package/assets/images/backpack/wearable_categories/earring.png +0 -0
  61. package/assets/images/backpack/wearable_categories/eyebrows.png +0 -0
  62. package/assets/images/backpack/wearable_categories/eyes.png +0 -0
  63. package/assets/images/backpack/wearable_categories/eyewear.png +0 -0
  64. package/assets/images/backpack/wearable_categories/facial_hair.png +0 -0
  65. package/assets/images/backpack/wearable_categories/feet.png +0 -0
  66. package/assets/images/backpack/wearable_categories/hair.png +0 -0
  67. package/assets/images/backpack/wearable_categories/hands_wear.png +0 -0
  68. package/assets/images/backpack/wearable_categories/hat.png +0 -0
  69. package/assets/images/backpack/wearable_categories/helmet.png +0 -0
  70. package/assets/images/backpack/wearable_categories/lower_body.png +0 -0
  71. package/assets/images/backpack/wearable_categories/mask.png +0 -0
  72. package/assets/images/backpack/wearable_categories/mouth.png +0 -0
  73. package/assets/images/backpack/wearable_categories/skin.png +0 -0
  74. package/assets/images/backpack/wearable_categories/tiara.png +0 -0
  75. package/assets/images/backpack/wearable_categories/top_head.png +0 -0
  76. package/assets/images/backpack/wearable_categories/upper_body.png +0 -0
  77. package/assets/images/button copy.png +0 -0
  78. package/assets/images/button.png +0 -0
  79. package/assets/images/button_base.png +0 -0
  80. package/assets/images/chat_button.png +0 -0
  81. package/assets/images/copy.png +0 -0
  82. package/assets/images/crosshair.png +0 -0
  83. package/assets/images/cursor.png +0 -0
  84. package/assets/images/dao_small.png +0 -0
  85. package/assets/images/dcl-godot-bevy.png +0 -0
  86. package/assets/images/discover/art.png +0 -0
  87. package/assets/images/discover/business.png +0 -0
  88. package/assets/images/discover/casino.png +0 -0
  89. package/assets/images/discover/crypto.png +0 -0
  90. package/assets/images/discover/education.png +0 -0
  91. package/assets/images/discover/eye.png +0 -0
  92. package/assets/images/discover/fashion.png +0 -0
  93. package/assets/images/discover/featured.png +0 -0
  94. package/assets/images/discover/game.png +0 -0
  95. package/assets/images/discover/icons.png +0 -0
  96. package/assets/images/discover/music.png +0 -0
  97. package/assets/images/discover/point of interest.png +0 -0
  98. package/assets/images/discover/shop.png +0 -0
  99. package/assets/images/discover/social.png +0 -0
  100. package/assets/images/discover/sports.png +0 -0
  101. package/assets/images/discover/thumbsup.png +0 -0
  102. package/assets/images/emote-button-background.png +0 -0
  103. package/assets/images/emote_button.png +0 -0
  104. package/assets/images/genesis_tx.png +0 -0
  105. package/assets/images/grid.png +0 -0
  106. package/assets/images/grip.png +0 -0
  107. package/assets/images/left-arrow.png +0 -0
  108. package/assets/images/line.png +0 -0
  109. package/assets/images/mic_button_inactive.png +0 -0
  110. package/assets/images/mic_button_off.png +0 -0
  111. package/assets/images/mic_button_on.png +0 -0
  112. package/assets/images/next.png +0 -0
  113. package/assets/images/person.png +0 -0
  114. package/assets/images/person_button.png +0 -0
  115. package/assets/images/profile_button.png +0 -0
  116. package/assets/images/redx.png +0 -0
  117. package/assets/images/right-arrow.png +0 -0
  118. package/assets/images/screenshots/montage.png +0 -0
  119. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_avatar_attach_1.png.png +0 -0
  120. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_avatar_attach_2.png.png +0 -0
  121. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_avatar_attach_3.png.png +0 -0
  122. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_avatar_attach_4.png.png +0 -0
  123. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_gltfcontainer_avocado.png.png +0 -0
  124. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_gltfcontainer_hev.png.png +0 -0
  125. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_01.png.png +0 -0
  126. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_02.png.png +0 -0
  127. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_03.png.png +0 -0
  128. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_04.png.png +0 -0
  129. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_05.png.png +0 -0
  130. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_06.png.png +0 -0
  131. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_07.png.png +0 -0
  132. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_08.png.png +0 -0
  133. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_09.png.png +0 -0
  134. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_10.png.png +0 -0
  135. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_11.png.png +0 -0
  136. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_12.png.png +0 -0
  137. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_13.png.png +0 -0
  138. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_material_14.png.png +0 -0
  139. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_mesh_renderer_box.png.png +0 -0
  140. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_mesh_renderer_cylinder.png.png +0 -0
  141. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_mesh_renderer_plane.png.png +0 -0
  142. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_mesh_renderer_sphere.png.png +0 -0
  143. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_text_shape_1.png.png +0 -0
  144. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_text_shape_2.png.png +0 -0
  145. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_text_shape_3.png.png +0 -0
  146. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_text_shape_4.png.png +0 -0
  147. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_text_shape_5.png.png +0 -0
  148. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_text_shape_6.png.png +0 -0
  149. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_ui_background_all_screen_green.png.png +0 -0
  150. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_ui_background_all_screen_red.png.png +0 -0
  151. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_ui_background_all_screen_rocks.png.png +0 -0
  152. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_ui_text_1.png.png +0 -0
  153. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_ui_text_2.png.png +0 -0
  154. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_video_player_1.png.png +0 -0
  155. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_video_player_2.png.png +0 -0
  156. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_video_player_3.png.png +0 -0
  157. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_video_player_4.png.png +0 -0
  158. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_visibility_false.png.png +0 -0
  159. package/assets/images/screenshots/screenshot%2Fbevy_snapshot_visibility_true.png.png +0 -0
  160. package/assets/images/skybox/skybox_cubemap.png +0 -0
  161. package/assets/images/skybox/skybox_cubemap_original.png +0 -0
  162. package/assets/images/spinner.png +0 -0
  163. package/assets/images/spinner_atlas.png +0 -0
  164. package/assets/images/tick.png +0 -0
  165. package/assets/images/toggle-off.png +0 -0
  166. package/assets/images/toggle-on.png +0 -0
  167. package/assets/images/unknown_person.png +0 -0
  168. package/assets/images/you_are_here.png +0 -0
  169. package/assets/nft_shapes/Baroque_Ornament.glb +0 -0
  170. package/assets/nft_shapes/Blocky.glb +0 -0
  171. package/assets/nft_shapes/Canvas.glb +0 -0
  172. package/assets/nft_shapes/Classic.glb +0 -0
  173. package/assets/nft_shapes/Diamond_Ornament.glb +0 -0
  174. package/assets/nft_shapes/Floor_Wood01.png +0 -0
  175. package/assets/nft_shapes/Genesis_TX.png +0 -0
  176. package/assets/nft_shapes/Gold_Carved.glb +0 -0
  177. package/assets/nft_shapes/Gold_Edges.glb +0 -0
  178. package/assets/nft_shapes/Gold_Rounded.glb +0 -0
  179. package/assets/nft_shapes/Gold_Wide.glb +0 -0
  180. package/assets/nft_shapes/Metal_Medium.glb +0 -0
  181. package/assets/nft_shapes/Metal_Rounded.glb +0 -0
  182. package/assets/nft_shapes/Metal_Slim.glb +0 -0
  183. package/assets/nft_shapes/Metal_Wide.glb +0 -0
  184. package/assets/nft_shapes/Minimal_Black.glb +0 -0
  185. package/assets/nft_shapes/Minimal_Grey.glb +0 -0
  186. package/assets/nft_shapes/Minimal_White.glb +0 -0
  187. package/assets/nft_shapes/Minimal_Wide.glb +0 -0
  188. package/assets/nft_shapes/MulticolorDotsLoading.png +0 -0
  189. package/assets/nft_shapes/NFTIcon.png +0 -0
  190. package/assets/nft_shapes/NoneIcon.png +0 -0
  191. package/assets/nft_shapes/Pins.glb +0 -0
  192. package/assets/nft_shapes/Tape.glb +0 -0
  193. package/assets/nft_shapes/Wood_Slim.glb +0 -0
  194. package/assets/nft_shapes/Wood_Twigs.glb +0 -0
  195. package/assets/nft_shapes/Wood_Wide.glb +0 -0
  196. package/assets/shaders/bound_material.wgsl +183 -0
  197. package/assets/shaders/bound_material_baker.wgsl +145 -0
  198. package/assets/shaders/bound_node.wgsl +57 -0
  199. package/assets/shaders/bound_prepass.wgsl +160 -0
  200. package/assets/shaders/floor_bake.wgsl +30 -0
  201. package/assets/shaders/floor_fragment.wgsl +74 -0
  202. package/assets/shaders/floor_vertex.wgsl +47 -0
  203. package/assets/shaders/loading.wgsl +35 -0
  204. package/assets/shaders/mask_material.wgsl +117 -0
  205. package/assets/shaders/nineslice_material.wgsl +47 -0
  206. package/assets/shaders/nishita_cloud.wgsl +378 -0
  207. package/assets/shaders/outline.wgsl +69 -0
  208. package/assets/shaders/simplex.wgsl +77 -0
  209. package/assets/shaders/stretch_uv_material.wgsl +79 -0
  210. package/assets/shaders/text_quad_vertex.wgsl +78 -0
  211. package/assets/sounds/avatar/avatar_footstep_jump01.wav +0 -0
  212. package/assets/sounds/avatar/avatar_footstep_jump02.wav +0 -0
  213. package/assets/sounds/avatar/avatar_footstep_jump03.wav +0 -0
  214. package/assets/sounds/avatar/avatar_footstep_land01.wav +0 -0
  215. package/assets/sounds/avatar/avatar_footstep_land02.wav +0 -0
  216. package/assets/sounds/avatar/avatar_footstep_run01.wav +0 -0
  217. package/assets/sounds/avatar/avatar_footstep_run02.wav +0 -0
  218. package/assets/sounds/avatar/avatar_footstep_run03.wav +0 -0
  219. package/assets/sounds/avatar/avatar_footstep_run04.wav +0 -0
  220. package/assets/sounds/avatar/avatar_footstep_run05.wav +0 -0
  221. package/assets/sounds/avatar/avatar_footstep_run06.wav +0 -0
  222. package/assets/sounds/avatar/avatar_footstep_run07.wav +0 -0
  223. package/assets/sounds/avatar/avatar_footstep_run08.wav +0 -0
  224. package/assets/sounds/avatar/avatar_footstep_walk01.wav +0 -0
  225. package/assets/sounds/avatar/avatar_footstep_walk02.wav +0 -0
  226. package/assets/sounds/avatar/avatar_footstep_walk03.wav +0 -0
  227. package/assets/sounds/avatar/avatar_footstep_walk04.wav +0 -0
  228. package/assets/sounds/avatar/avatar_footstep_walk05.wav +0 -0
  229. package/assets/sounds/avatar/avatar_footstep_walk06.wav +0 -0
  230. package/assets/sounds/avatar/avatar_footstep_walk07.wav +0 -0
  231. package/assets/sounds/avatar/avatar_footstep_walk08.wav +0 -0
  232. package/assets/sounds/ui/generic_button_hover.wav +0 -0
  233. package/assets/sounds/ui/generic_button_press.wav +0 -0
  234. package/assets/sounds/ui/mainmenu_widget_open.wav +0 -0
  235. package/assets/sounds/ui/toggle_disable.wav +0 -0
  236. package/assets/sounds/ui/toggle_enable.wav +0 -0
  237. package/assets/sounds/ui/voice_chat_mic_off.wav +0 -0
  238. package/assets/sounds/ui/voice_chat_mic_on.wav +0 -0
  239. package/assets/sounds/ui/widget_chat_message_private_send.wav +0 -0
  240. package/assets/sounds/ui/widget_emotes_close.wav +0 -0
  241. package/assets/sounds/ui/widget_emotes_highlight.wav +0 -0
  242. package/assets/sounds/ui/widget_emotes_open.wav +0 -0
  243. package/assets/ui/app_settings.dui +91 -0
  244. package/assets/ui/avatar.dui +18 -0
  245. package/assets/ui/button.dui +78 -0
  246. package/assets/ui/change-realm.dui +46 -0
  247. package/assets/ui/chat.dui +182 -0
  248. package/assets/ui/combo.dui +23 -0
  249. package/assets/ui/dialog.dui +46 -0
  250. package/assets/ui/discover.dui +139 -0
  251. package/assets/ui/emote-select.dui +45 -0
  252. package/assets/ui/emote.dui +116 -0
  253. package/assets/ui/foreign-profile-dialog.dui +18 -0
  254. package/assets/ui/fullscreen-block.dui +12 -0
  255. package/assets/ui/login.dui +72 -0
  256. package/assets/ui/map.dui +8 -0
  257. package/assets/ui/minimap.dui +16 -0
  258. package/assets/ui/motd.dui +25 -0
  259. package/assets/ui/nft-dialog.dui +29 -0
  260. package/assets/ui/oow.dui +41 -0
  261. package/assets/ui/permissions-dialog.dui +39 -0
  262. package/assets/ui/permissions.dui +54 -0
  263. package/assets/ui/profile-detail.dui +24 -0
  264. package/assets/ui/profile.dui +29 -0
  265. package/assets/ui/spinner.dui +3 -0
  266. package/assets/ui/toast.dui +27 -0
  267. package/assets/ui/tracker.dui +21 -0
  268. package/assets/ui/update.dui +16 -0
  269. package/assets/ui/utils.dui +40 -0
  270. package/assets/ui/wearables.dui +134 -0
  271. package/gpu_cache.js +302 -0
  272. package/index.html +134 -0
  273. package/main.js +284 -0
  274. package/package.json +9 -0
  275. package/sandbox_worker.js +394 -0
  276. package/serve.json +21 -0
  277. package/service_worker.js +93 -0
package/gpu_cache.js ADDED
@@ -0,0 +1,302 @@
1
+ function simpleHash(s) {
2
+ var h = 0x811c9dc5;
3
+
4
+ for (let i = 0; i < s.length; i++) {
5
+ h ^= s.charCodeAt(i);
6
+ h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);
7
+ }
8
+
9
+ return h >>> 0;
10
+ }
11
+
12
+ var gpuSessionState = {};
13
+ var requiredItemTypes = new Map();
14
+ var precaching = false;
15
+
16
+ const dbConfig = {
17
+ name: "GpuCacheDB",
18
+ version: 1,
19
+ onUpgrade: (db) => {
20
+ if (!db.objectStoreNames.contains("shader")) db.createObjectStore("shader");
21
+ if (!db.objectStoreNames.contains("bindgroup"))
22
+ db.createObjectStore("bindgroup");
23
+ if (!db.objectStoreNames.contains("layout")) db.createObjectStore("layout");
24
+ if (!db.objectStoreNames.contains("pipeline"))
25
+ db.createObjectStore("pipeline");
26
+ if (!db.objectStoreNames.contains("requiredItems"))
27
+ db.createObjectStore("requiredItems");
28
+ if (!db.objectStoreNames.contains("deviceConfig"))
29
+ db.createObjectStore("deviceConfig");
30
+ },
31
+ };
32
+
33
+ var dbPromise;
34
+ function openDB() {
35
+ if (dbPromise) {
36
+ return dbPromise;
37
+ }
38
+ dbPromise = new Promise((resolve, reject) => {
39
+ const request = indexedDB.open(dbConfig.name, dbConfig.version);
40
+ request.onupgradeneeded = (event) => {
41
+ dbConfig.onUpgrade(event.target.result);
42
+ };
43
+ request.onsuccess = (event) => resolve(event.target.result);
44
+ request.onerror = (event) => reject(event.target.error);
45
+ });
46
+ return dbPromise;
47
+ }
48
+
49
+ async function fetchRequiredItems() {
50
+ const db = await openDB();
51
+ return new Promise((resolve) => {
52
+ const tx = db.transaction("requiredItems", "readonly");
53
+ const request = tx.objectStore("requiredItems").get("it");
54
+ request.onsuccess = () => {
55
+ resolve(request.result ?? new Map());
56
+ };
57
+ request.onerror = () => {
58
+ resolve(new Map());
59
+ };
60
+ });
61
+ }
62
+
63
+ async function storeRequiredItems() {
64
+ const db = await openDB();
65
+ return new Promise((resolve, reject) => {
66
+ const tx = db.transaction("requiredItems", "readwrite");
67
+ tx.oncomplete = () => {
68
+ resolve();
69
+ };
70
+ tx.onerror = () => {
71
+ console.log("[GPU Cache] failed to store requiredItems");
72
+ reject(tx.error);
73
+ };
74
+ tx.objectStore("requiredItems").put(requiredItemTypes, "it");
75
+ });
76
+ }
77
+
78
+ async function fetchInstance(type, hash) {
79
+ const db = await openDB();
80
+ return new Promise((resolve, reject) => {
81
+ const tx = db.transaction(type, "readonly");
82
+ const request = tx.objectStore(type).get(hash);
83
+ request.onsuccess = () => {
84
+ if (request.result) {
85
+ resolve(JSON.parse(request.result));
86
+ } else {
87
+ reject("undefined");
88
+ }
89
+ };
90
+ request.onerror = () => {
91
+ reject("error");
92
+ };
93
+ });
94
+ }
95
+
96
+ async function storeInstance(type, hash, value) {
97
+ const db = await openDB();
98
+ return new Promise((resolve, reject) => {
99
+ const tx = db.transaction(type, "readwrite");
100
+ tx.oncomplete = () => {
101
+ resolve();
102
+ };
103
+ tx.onerror = () => {
104
+ console.log("[GPU Cache] failed to store ${type} instance");
105
+ reject(tx.error);
106
+ };
107
+ tx.objectStore(type).put(JSON.stringify(value), hash);
108
+ });
109
+ }
110
+
111
+ async function clearDatabase() {
112
+ const storeNames = ["shader", "bindgroup", "layout", "pipeline"];
113
+
114
+ const tx = await db.transaction("rqeuiredItems", "readwrite");
115
+ await tx.objectStore("requiredItems").clear();
116
+
117
+ const clearPromises = storeNames.map((name) => {
118
+ const tx = db.transaction(name, "readwrite");
119
+ return new Promise((resolve, reject) => {
120
+ const request = tx.objectStore(name).clear();
121
+ request.onsuccess = () => resolve();
122
+ request.onerror = () => reject(request.error);
123
+ });
124
+ });
125
+
126
+ // Wait for all clear operations to complete
127
+ await Promise.all(clearPromises);
128
+ await tx.done;
129
+ }
130
+
131
+ export async function initGpuCache() {
132
+ patchWebgpuAdater();
133
+ await createGpuCache();
134
+ }
135
+
136
+ function patchWebgpuAdater() {
137
+ const originalRequestDevice = GPUAdapter.prototype.requestDevice;
138
+ GPUAdapter.prototype.requestDevice = async function (descriptor) {
139
+ const jsonDescriptor = JSON.stringify(descriptor || {});
140
+ if (gpuSessionState.deviceDescriptor === jsonDescriptor) {
141
+ console.log("[GPU Cache] using precached device");
142
+ return gpuSessionState.device;
143
+ }
144
+
145
+ if (!precaching) {
146
+ console.log(
147
+ "[GPU Cache] device params are different: creating device and clearing cache"
148
+ );
149
+ clearDatabase();
150
+ }
151
+ gpuSessionState = {
152
+ shader: new Map(),
153
+ bindgroup: new Map(),
154
+ layout: new Map(),
155
+ pipeline: new Map(),
156
+ };
157
+ gpuSessionState.deviceDescriptor = jsonDescriptor;
158
+ const device = await originalRequestDevice.apply(this, [descriptor]);
159
+ gpuSessionState.device = device;
160
+ localStorage.setItem("deviceDescriptor", jsonDescriptor);
161
+
162
+ function wrapDeviceFunction(itemType, originalFunction) {
163
+ return (...args) => {
164
+ const jsonArgs = JSON.stringify(args);
165
+ const hash = simpleHash(jsonArgs);
166
+ const cachedItem = gpuSessionState[itemType].get(hash);
167
+ if (cachedItem !== undefined) {
168
+ return cachedItem;
169
+ }
170
+
171
+ const item = originalFunction.apply(device, args);
172
+ item.__gpu_item_type = itemType;
173
+ item.__gpu_hash = hash;
174
+ gpuSessionState[itemType].set(hash, item);
175
+
176
+ if (!precaching) {
177
+ console.log(`[GPU Cache] no cached ${itemType} for ${hash}`);
178
+ if (!requiredItemTypes.has(itemType)) {
179
+ requiredItemTypes.set(itemType, new Set());
180
+ }
181
+ const requiredItems = requiredItemTypes.get(itemType);
182
+ if (!requiredItems.has(hash)) {
183
+ requiredItems.add(hash);
184
+ storeRequiredItems();
185
+ storeInstance(itemType, hash, args);
186
+ }
187
+ }
188
+ return item;
189
+ };
190
+ }
191
+
192
+ device.createShaderModule = wrapDeviceFunction(
193
+ "shader",
194
+ device.createShaderModule
195
+ );
196
+ device.createBindGroupLayout = wrapDeviceFunction(
197
+ "bindgroup",
198
+ device.createBindGroupLayout
199
+ );
200
+ device.createPipelineLayout = wrapDeviceFunction(
201
+ "layout",
202
+ device.createPipelineLayout
203
+ );
204
+ device.createRenderPipeline = wrapDeviceFunction(
205
+ "pipeline",
206
+ device.createRenderPipeline
207
+ );
208
+
209
+ return device;
210
+ };
211
+ }
212
+
213
+ async function createGpuCache() {
214
+ const cachedDeviceDescriptor = localStorage.getItem("deviceDescriptor");
215
+ if (cachedDeviceDescriptor === null) {
216
+ return;
217
+ }
218
+ precaching = true;
219
+ const adapter = await navigator.gpu.requestAdapter();
220
+ const device = await adapter.requestDevice(
221
+ JSON.parse(cachedDeviceDescriptor)
222
+ );
223
+
224
+ requiredItemTypes = await fetchRequiredItems();
225
+ try {
226
+ await createItemType("shader", async (args) => {
227
+ return device.createShaderModule(args);
228
+ });
229
+ await createItemType("bindgroup", async (args) => {
230
+ return device.createBindGroupLayout(args);
231
+ });
232
+ await createItemType("layout", async (args) => {
233
+ return device.createPipelineLayout(args);
234
+ });
235
+ await createItemType("pipeline", async (args) => {
236
+ return await device.createRenderPipelineAsync(args);
237
+ });
238
+ } finally {
239
+ precaching = false;
240
+ }
241
+ storeRequiredItems();
242
+ const stats = Object.keys(gpuSessionState).map(
243
+ (k) => `\n${k}: ${gpuSessionState[k].size ?? "ok"}`
244
+ );
245
+ console.log(`[GPU Cache]: preloaded ${stats}`);
246
+ }
247
+
248
+ async function createItemType(itemType, asyncCreateFunction) {
249
+ const storedItems = requiredItemTypes.get(itemType) ?? new Set();
250
+
251
+ await Promise.all(
252
+ [...storedItems].map(async (hash) => {
253
+ try {
254
+ const args = await fetchInstance(itemType, hash);
255
+ rehydrateItem(args);
256
+ const item = await asyncCreateFunction(args[0]);
257
+ gpuSessionState[itemType].set(hash, item);
258
+ } catch (e) {
259
+ console.warn(`[GPU Cache] failed to precreate ${itemType}: ${e}`);
260
+ storedItems.delete(hash);
261
+ }
262
+ })
263
+ );
264
+ }
265
+
266
+ function rehydrateItem(currentObject) {
267
+ if (typeof currentObject !== "object" || currentObject === null) {
268
+ return;
269
+ }
270
+
271
+ if (Array.isArray(currentObject)) {
272
+ for (let i = 0; i < currentObject.length; i++) {
273
+ const item = currentObject[i];
274
+ if (item && item.__gpu_hash) {
275
+ const type = item.__gpu_item_type;
276
+ const hash = item.__gpu_hash;
277
+ currentObject[i] = gpuSessionState[type].get(hash);
278
+ if (!currentObject[i]) {
279
+ throw `failed to rehydrate: missing ${type} with hash ${hash}`;
280
+ }
281
+ } else {
282
+ rehydrateItem(item);
283
+ }
284
+ }
285
+ } else {
286
+ for (const key in currentObject) {
287
+ if (Object.prototype.hasOwnProperty.call(currentObject, key)) {
288
+ const value = currentObject[key];
289
+ if (value && value.__gpu_hash) {
290
+ const type = value.__gpu_item_type;
291
+ const hash = value.__gpu_hash;
292
+ currentObject[key] = gpuSessionState[type].get(hash);
293
+ if (!currentObject[key]) {
294
+ throw `failed to rehydrate: missing ${type} with hash ${hash}`;
295
+ }
296
+ } else {
297
+ rehydrateItem(value);
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
package/index.html ADDED
@@ -0,0 +1,134 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Bevy Explorer</title>
7
+ <style>
8
+ video {
9
+ display: none;
10
+ }
11
+ body {
12
+ font-family: 'Inter', sans-serif; /* Changed to Inter */
13
+ margin: 0px;
14
+ background-color: #f7fafc; /* Lighter gray */
15
+ color: #2d3748; /* Darker gray for text */
16
+ display: flex;
17
+ flex-direction: column;
18
+ align-items: center; /* Center content */
19
+ }
20
+ .container {
21
+ background-color: #ffffff;
22
+ padding: 25px;
23
+ margin-top: 100px;
24
+ border-radius: 8px;
25
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
26
+ width: 100%;
27
+ max-width: 700px; /* Max width for content */
28
+ }
29
+ h1 {
30
+ color: #2b6cb0; /* Tailwind blue-700 */
31
+ text-align: center;
32
+ margin-bottom: 20px;
33
+ }
34
+ label {
35
+ display: block;
36
+ margin-top: 15px;
37
+ margin-bottom: 5px;
38
+ font-weight: 600;
39
+ color: #4a5568; /* Tailwind gray-700 */
40
+ }
41
+ input[type="text"] {
42
+ width: calc(100% - 22px); /* Full width minus padding and border */
43
+ padding: 10px;
44
+ border: 1px solid #cbd5e0; /* Tailwind gray-400 */
45
+ border-radius: 6px;
46
+ font-size: 1rem;
47
+ color: #2d3748;
48
+ }
49
+ input[type="text"]:focus {
50
+ outline: none;
51
+ border-color: #4299e1; /* Tailwind blue-500 */
52
+ box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5);
53
+ }
54
+ button {
55
+ padding: 12px 20px;
56
+ background-color: #3182ce; /* Tailwind blue-600 */
57
+ color: white;
58
+ border: none;
59
+ border-radius: 6px;
60
+ cursor: pointer;
61
+ margin-top: 25px;
62
+ font-size: 1rem;
63
+ font-weight: 600;
64
+ transition: background-color 0.2s ease-in-out;
65
+ display: block; /* Make button block to center it */
66
+ margin-left: auto;
67
+ margin-right: auto;
68
+ }
69
+ button:hover {
70
+ background-color: #2b6cb0; /* Tailwind blue-700 */
71
+ }
72
+ #canvas-parent {
73
+ display: none;
74
+ width: 100%;
75
+ height: 100vh;
76
+ }
77
+ #mygame-canvas {
78
+ width: 100%;
79
+ height: 100%;
80
+ display: block; /* Remove extra space below canvas */
81
+ }
82
+ /* Added for better structure and responsiveness */
83
+ .input-group {
84
+ margin-bottom: 15px;
85
+ }
86
+
87
+ /* For smaller screens */
88
+ @media (max-width: 600px) {
89
+ body {
90
+ margin: 10px;
91
+ }
92
+ .container {
93
+ padding: 20px;
94
+ }
95
+ h1 {
96
+ font-size: 1.8rem;
97
+ }
98
+ button {
99
+ width: 100%;
100
+ }
101
+ }
102
+ </style>
103
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
104
+ </head>
105
+ <body>
106
+ <div id="header" class="container">
107
+ <h1>Bevy Explorer</h1>
108
+
109
+ <div class="input-group">
110
+ <label for="initialRealm">Initial Realm:</label>
111
+ <input type="text" id="initialRealm" name="initialRealm" placeholder="e.g., world_alpha">
112
+ </div>
113
+
114
+ <div class="input-group">
115
+ <label for="location">Location:</label>
116
+ <input type="text" id="location" name="location" placeholder="e.g., 0,0">
117
+ </div>
118
+
119
+ <div class="input-group">
120
+ <label for="system scene">System Scene:</label>
121
+ <input type="text" id="systemScene" name="systemScene" placeholder="">
122
+ </div>
123
+
124
+ <button id="initButton" disabled="true">Loading...</button>
125
+
126
+ </div>
127
+ <div id="canvas-parent">
128
+ <canvas id="mygame-canvas"></canvas>
129
+ </div>
130
+ <script src="https://cdn.jsdelivr.net/npm/livekit-client/dist/livekit-client.umd.min.js"></script>
131
+ <script src="https://cdn.jsdelivr.net/npm/hls.js@1"></script>
132
+ <script type="module" src="main.js"></script>
133
+ </body>
134
+ </html>