hytopia 0.3.0-dev.2 → 0.3.1

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 (108) hide show
  1. package/boilerplate/index.ts +17 -9
  2. package/docs/server.modelregistry.md +38 -0
  3. package/docs/server.modelregistry.optimize.md +13 -0
  4. package/docs/server.modelregistry.optimizeeverystart.md +13 -0
  5. package/docs/server.playerui.md +0 -19
  6. package/docs/server.playeruievent.md +14 -0
  7. package/docs/server.playeruieventpayloads._player_ui.data_.md +16 -0
  8. package/docs/server.playeruieventpayloads._player_ui.send_data_.md +2 -2
  9. package/docs/server.playeruieventpayloads.md +21 -2
  10. package/examples/custom-ui/index.ts +4 -3
  11. package/examples/payload-game/assets/models/.optimized/bullet/baseColor.png +0 -0
  12. package/examples/payload-game/assets/models/.optimized/bullet/bullet-named-nodes.bin +0 -0
  13. package/examples/payload-game/assets/models/.optimized/bullet/bullet-named-nodes.gltf +308 -0
  14. package/examples/payload-game/assets/models/.optimized/bullet/bullet.bin +0 -0
  15. package/examples/payload-game/assets/models/.optimized/bullet/bullet.gltf +142 -0
  16. package/examples/payload-game/assets/models/.optimized/bullet/bullet.gltf.md5 +1 -0
  17. package/examples/payload-game/assets/models/.optimized/payload/baseColor.png +0 -0
  18. package/examples/payload-game/assets/models/.optimized/payload/payload-named-nodes.bin +0 -0
  19. package/examples/payload-game/assets/models/.optimized/payload/payload-named-nodes.gltf +2868 -0
  20. package/examples/payload-game/assets/models/.optimized/payload/payload.bin +0 -0
  21. package/examples/payload-game/assets/models/.optimized/payload/payload.gltf +1109 -0
  22. package/examples/payload-game/assets/models/.optimized/payload/payload.gltf.md5 +1 -0
  23. package/examples/payload-game/assets/models/.optimized/player-with-gun/baseColor_1.png +0 -0
  24. package/examples/payload-game/assets/models/.optimized/player-with-gun/baseColor_2.png +0 -0
  25. package/examples/payload-game/assets/models/.optimized/player-with-gun/player-with-gun-named-nodes.bin +0 -0
  26. package/examples/payload-game/assets/models/.optimized/player-with-gun/player-with-gun-named-nodes.gltf +8572 -0
  27. package/examples/payload-game/assets/models/.optimized/player-with-gun/player-with-gun.bin +0 -0
  28. package/examples/payload-game/assets/models/.optimized/player-with-gun/player-with-gun.gltf +7849 -0
  29. package/examples/payload-game/assets/models/.optimized/player-with-gun/player-with-gun.gltf.md5 +1 -0
  30. package/examples/payload-game/assets/models/.optimized/raygun/baseColor_1.png +0 -0
  31. package/examples/payload-game/assets/models/.optimized/raygun/baseColor_2.png +0 -0
  32. package/examples/payload-game/assets/models/.optimized/raygun/raygun-named-nodes.bin +0 -0
  33. package/examples/payload-game/assets/models/.optimized/raygun/raygun-named-nodes.gltf +7752 -0
  34. package/examples/payload-game/assets/models/.optimized/raygun/raygun.bin +0 -0
  35. package/examples/payload-game/assets/models/.optimized/raygun/raygun.gltf +832 -0
  36. package/examples/payload-game/assets/models/.optimized/raygun/raygun.gltf.md5 +1 -0
  37. package/examples/payload-game/assets/models/.optimized/soldier-player/baseColor_1.png +0 -0
  38. package/examples/payload-game/assets/models/.optimized/soldier-player/baseColor_2.png +0 -0
  39. package/examples/payload-game/assets/models/.optimized/soldier-player/baseColor_3.png +0 -0
  40. package/examples/payload-game/assets/models/.optimized/soldier-player/baseColor_4.png +0 -0
  41. package/examples/payload-game/assets/models/.optimized/soldier-player/soldier-player-named-nodes.bin +0 -0
  42. package/examples/payload-game/assets/models/.optimized/soldier-player/soldier-player-named-nodes.gltf +7679 -0
  43. package/examples/payload-game/assets/models/.optimized/soldier-player/soldier-player.bin +0 -0
  44. package/examples/payload-game/assets/models/.optimized/soldier-player/soldier-player.gltf +7774 -0
  45. package/examples/payload-game/assets/models/.optimized/soldier-player/soldier-player.gltf.md5 +1 -0
  46. package/examples/payload-game/assets/models/raygun.gltf +1 -0
  47. package/examples/payload-game/assets/models/soldier-player.gltf +1 -0
  48. package/examples/payload-game/index.ts +23 -4
  49. package/examples/zombies-fps/assets/models/environment/.optimized/barbedfence/barbedfence-named-nodes.bin +0 -0
  50. package/examples/zombies-fps/assets/models/environment/.optimized/barbedfence/barbedfence-named-nodes.gltf +806 -0
  51. package/examples/zombies-fps/assets/models/environment/.optimized/barbedfence/barbedfence.bin +0 -0
  52. package/examples/zombies-fps/assets/models/environment/.optimized/barbedfence/barbedfence.gltf +15 -686
  53. package/examples/zombies-fps/assets/models/environment/.optimized/binoculars/binoculars-named-nodes.bin +0 -0
  54. package/examples/zombies-fps/assets/models/environment/.optimized/binoculars/binoculars-named-nodes.gltf +1633 -0
  55. package/examples/zombies-fps/assets/models/environment/.optimized/binoculars/binoculars.bin +0 -0
  56. package/examples/zombies-fps/assets/models/environment/.optimized/binoculars/binoculars.gltf +86 -1578
  57. package/examples/zombies-fps/assets/models/environment/.optimized/bombbox/bombbox-named-nodes.bin +0 -0
  58. package/examples/zombies-fps/assets/models/environment/.optimized/bombbox/bombbox-named-nodes.gltf +2480 -0
  59. package/examples/zombies-fps/assets/models/environment/.optimized/bombbox/bombbox.bin +0 -0
  60. package/examples/zombies-fps/assets/models/environment/.optimized/bombbox/bombbox.gltf +88 -2427
  61. package/examples/zombies-fps/assets/models/environment/.optimized/bullet-hole/bullet-hole-named-nodes.bin +0 -0
  62. package/examples/zombies-fps/assets/models/environment/.optimized/bullet-hole/bullet-hole-named-nodes.gltf +136 -0
  63. package/examples/zombies-fps/assets/models/environment/.optimized/bullet-hole/bullet-hole.gltf +1 -1
  64. package/examples/zombies-fps/assets/models/environment/.optimized/healthkit/healthkit-named-nodes.bin +0 -0
  65. package/examples/zombies-fps/assets/models/environment/.optimized/healthkit/healthkit-named-nodes.gltf +831 -0
  66. package/examples/zombies-fps/assets/models/environment/.optimized/healthkit/healthkit.bin +0 -0
  67. package/examples/zombies-fps/assets/models/environment/.optimized/healthkit/healthkit.gltf +16 -706
  68. package/examples/zombies-fps/assets/models/environment/.optimized/metalshelf/metalshelf-named-nodes.bin +0 -0
  69. package/examples/zombies-fps/assets/models/environment/.optimized/metalshelf/metalshelf-named-nodes.gltf +4025 -0
  70. package/examples/zombies-fps/assets/models/environment/.optimized/metalshelf/metalshelf.bin +0 -0
  71. package/examples/zombies-fps/assets/models/environment/.optimized/metalshelf/metalshelf.gltf +136 -3944
  72. package/examples/zombies-fps/assets/models/environment/.optimized/muzzle-flash/muzzle-flash-named-nodes.bin +0 -0
  73. package/examples/zombies-fps/assets/models/environment/.optimized/muzzle-flash/muzzle-flash-named-nodes.gltf +196 -0
  74. package/examples/zombies-fps/assets/models/environment/.optimized/muzzle-flash/muzzle-flash.bin +0 -0
  75. package/examples/zombies-fps/assets/models/environment/.optimized/muzzle-flash/muzzle-flash.gltf +57 -28
  76. package/examples/zombies-fps/assets/models/environment/.optimized/weaponbox/weaponbox-named-nodes.bin +0 -0
  77. package/examples/zombies-fps/assets/models/environment/.optimized/weaponbox/weaponbox-named-nodes.gltf +3412 -0
  78. package/examples/zombies-fps/assets/models/environment/.optimized/weaponbox/weaponbox.bin +0 -0
  79. package/examples/zombies-fps/assets/models/environment/.optimized/weaponbox/weaponbox.gltf +133 -3323
  80. package/examples/zombies-fps/assets/models/items/.optimized/ak-47/ak-47-named-nodes.glb +0 -0
  81. package/examples/zombies-fps/assets/models/items/.optimized/ak-47/ak-47.glb +0 -0
  82. package/examples/zombies-fps/assets/models/items/.optimized/ar-15/ar-15-named-nodes.glb +0 -0
  83. package/examples/zombies-fps/assets/models/items/.optimized/ar-15/ar-15.glb +0 -0
  84. package/examples/zombies-fps/assets/models/items/.optimized/auto-pistol/auto-pistol-named-nodes.glb +0 -0
  85. package/examples/zombies-fps/assets/models/items/.optimized/auto-pistol/auto-pistol.glb +0 -0
  86. package/examples/zombies-fps/assets/models/items/.optimized/auto-shotgun/auto-shotgun-named-nodes.glb +0 -0
  87. package/examples/zombies-fps/assets/models/items/.optimized/auto-shotgun/auto-shotgun.glb +0 -0
  88. package/examples/zombies-fps/assets/models/items/.optimized/pistol/pistol-named-nodes.glb +0 -0
  89. package/examples/zombies-fps/assets/models/items/.optimized/pistol/pistol.glb +0 -0
  90. package/examples/zombies-fps/assets/models/items/.optimized/shotgun/shotgun-named-nodes.glb +0 -0
  91. package/examples/zombies-fps/assets/models/items/.optimized/shotgun/shotgun.glb +0 -0
  92. package/examples/zombies-fps/assets/models/npcs/.optimized/ripper-boss/ripper-boss-named-nodes.bin +0 -0
  93. package/examples/zombies-fps/assets/models/npcs/.optimized/ripper-boss/ripper-boss-named-nodes.gltf +10037 -0
  94. package/examples/zombies-fps/assets/models/npcs/.optimized/ripper-boss/ripper-boss.bin +0 -0
  95. package/examples/zombies-fps/assets/models/npcs/.optimized/ripper-boss/ripper-boss.gltf +1262 -4533
  96. package/examples/zombies-fps/assets/models/players/.optimized/soldier-player/soldier-player-named-nodes.bin +0 -0
  97. package/examples/zombies-fps/assets/models/players/.optimized/soldier-player/soldier-player-named-nodes.gltf +7679 -0
  98. package/examples/zombies-fps/assets/models/players/.optimized/soldier-player/soldier-player.bin +0 -0
  99. package/examples/zombies-fps/assets/models/players/.optimized/soldier-player/soldier-player.gltf +529 -434
  100. package/examples/zombies-fps/assets/models/projectiles/.optimized/bullet-trace/bullet-trace-named-nodes.bin +0 -0
  101. package/examples/zombies-fps/assets/models/projectiles/.optimized/bullet-trace/bullet-trace-named-nodes.gltf +136 -0
  102. package/examples/zombies-fps/assets/models/projectiles/.optimized/bullet-trace/bullet-trace.gltf +1 -1
  103. package/package.json +5 -2
  104. package/server.api.json +148 -43
  105. package/server.d.ts +18 -15
  106. package/server.js +132 -90
  107. package/tsdoc-metadata.json +1 -1
  108. package/docs/server.playerui.ondata.md +0 -18
@@ -26,8 +26,8 @@
26
26
  import {
27
27
  startServer,
28
28
  Audio,
29
- GameServer,
30
29
  PlayerEntity,
30
+ PlayerEvent,
31
31
  } from 'hytopia';
32
32
 
33
33
  import worldMap from './assets/map.json';
@@ -65,14 +65,18 @@ startServer(world => {
65
65
  world.loadMap(worldMap);
66
66
 
67
67
  /**
68
- * Handle player joining the game. The onPlayerJoin
69
- * function is called when a new player connects to
68
+ * Handle player joining the game. The PlayerEvent.JOINED_WORLD
69
+ * event is emitted to the world when a new player connects to
70
70
  * the game. From here, we create a basic player
71
71
  * entity instance which automatically handles mapping
72
72
  * their inputs to control their in-game entity and
73
73
  * internally uses our player entity controller.
74
+ *
75
+ * The HYTOPIA SDK is heavily driven by events, you
76
+ * can find documentation on how the event system works,
77
+ * here: https://dev.hytopia.com/sdk-guides/events
74
78
  */
75
- world.onPlayerJoin = player => {
79
+ world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
76
80
  const playerEntity = new PlayerEntity({
77
81
  player,
78
82
  name: 'Player',
@@ -89,11 +93,11 @@ startServer(world => {
89
93
  world.chatManager.sendPlayerMessage(player, 'Press space to jump.');
90
94
  world.chatManager.sendPlayerMessage(player, 'Hold shift to sprint.');
91
95
  world.chatManager.sendPlayerMessage(player, 'Press \\ to enter or exit debug view.');
92
- };
96
+ });
93
97
 
94
98
  /**
95
- * Handle player leaving the game. The onPlayerLeave
96
- * function is called when a player leaves the game.
99
+ * Handle player leaving the game. The PlayerEvent.LEFT_WORLD
100
+ * event is emitted to the world when a player leaves the game.
97
101
  * Because HYTOPIA is not opinionated on join and
98
102
  * leave game logic, we are responsible for cleaning
99
103
  * up the player and any entities associated with them
@@ -101,10 +105,14 @@ startServer(world => {
101
105
  * getting all the known PlayerEntity instances for
102
106
  * the player who left by using our world's EntityManager
103
107
  * instance.
108
+ *
109
+ * The HYTOPIA SDK is heavily driven by events, you
110
+ * can find documentation on how the event system works,
111
+ * here: https://dev.hytopia.com/sdk-guides/events
104
112
  */
105
- world.onPlayerLeave = player => {
113
+ world.on(PlayerEvent.LEFT_WORLD, ({ player }) => {
106
114
  world.entityManager.getPlayerEntitiesByPlayer(player).forEach(entity => entity.despawn());
107
- };
115
+ });
108
116
 
109
117
  /**
110
118
  * A silly little easter egg command. When a player types
@@ -73,6 +73,44 @@ Description
73
73
  The global ModelRegistry instance as a singleton.
74
74
 
75
75
 
76
+ </td></tr>
77
+ <tr><td>
78
+
79
+ [optimize](./server.modelregistry.optimize.md)
80
+
81
+
82
+ </td><td>
83
+
84
+
85
+ </td><td>
86
+
87
+ boolean
88
+
89
+
90
+ </td><td>
91
+
92
+ Whether to use optimized models when they are loaded.
93
+
94
+
95
+ </td></tr>
96
+ <tr><td>
97
+
98
+ [optimizeEveryStart](./server.modelregistry.optimizeeverystart.md)
99
+
100
+
101
+ </td><td>
102
+
103
+
104
+ </td><td>
105
+
106
+ boolean
107
+
108
+
109
+ </td><td>
110
+
111
+ Whether to always run model optimization on server start.
112
+
113
+
76
114
  </td></tr>
77
115
  </tbody></table>
78
116
 
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [server](./server.md) &gt; [ModelRegistry](./server.modelregistry.md) &gt; [optimize](./server.modelregistry.optimize.md)
4
+
5
+ ## ModelRegistry.optimize property
6
+
7
+ Whether to use optimized models when they are loaded.
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ optimize: boolean;
13
+ ```
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [server](./server.md) &gt; [ModelRegistry](./server.modelregistry.md) &gt; [optimizeEveryStart](./server.modelregistry.optimizeeverystart.md)
4
+
5
+ ## ModelRegistry.optimizeEveryStart property
6
+
7
+ Whether to always run model optimization on server start.
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ optimizeEveryStart: boolean;
13
+ ```
@@ -48,25 +48,6 @@ Description
48
48
  </th></tr></thead>
49
49
  <tbody><tr><td>
50
50
 
51
- [onData?](./server.playerui.ondata.md)
52
-
53
-
54
- </td><td>
55
-
56
-
57
- </td><td>
58
-
59
- (playerUI: [PlayerUI](./server.playerui.md)<!-- -->, data: object) =&gt; void
60
-
61
-
62
- </td><td>
63
-
64
- _(Optional)_ A function that is called when the player's client UI sends data to the server.
65
-
66
-
67
- </td></tr>
68
- <tr><td>
69
-
70
51
  [player](./server.playerui.player.md)
71
52
 
72
53
 
@@ -32,6 +32,20 @@ Description
32
32
  </th></tr></thead>
33
33
  <tbody><tr><td>
34
34
 
35
+ DATA
36
+
37
+
38
+ </td><td>
39
+
40
+ `"PLAYER_UI.DATA"`
41
+
42
+
43
+ </td><td>
44
+
45
+
46
+ </td></tr>
47
+ <tr><td>
48
+
35
49
  LOAD
36
50
 
37
51
 
@@ -0,0 +1,16 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [server](./server.md) &gt; [PlayerUIEventPayloads](./server.playeruieventpayloads.md) &gt; ["PLAYER\_UI.DATA"](./server.playeruieventpayloads._player_ui.data_.md)
4
+
5
+ ## PlayerUIEventPayloads."PLAYER\_UI.DATA" property
6
+
7
+ Emitted when data is received by the server from the player's client UI.
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ [PlayerUIEvent.DATA]: {
13
+ playerUI: PlayerUI;
14
+ data: Record<string, any>;
15
+ };
16
+ ```
@@ -4,13 +4,13 @@
4
4
 
5
5
  ## PlayerUIEventPayloads."PLAYER\_UI.SEND\_DATA" property
6
6
 
7
- Emitted when the player's client UI sends data to the server.
7
+ Emitted when data is sent from the server to the player's client UI.
8
8
 
9
9
  **Signature:**
10
10
 
11
11
  ```typescript
12
12
  [PlayerUIEvent.SEND_DATA]: {
13
13
  playerUI: PlayerUI;
14
- data: object;
14
+ data: Record<string, any>;
15
15
  };
16
16
  ```
@@ -37,6 +37,25 @@ Description
37
37
  </th></tr></thead>
38
38
  <tbody><tr><td>
39
39
 
40
+ ["PLAYER\_UI.DATA"](./server.playeruieventpayloads._player_ui.data_.md)
41
+
42
+
43
+ </td><td>
44
+
45
+
46
+ </td><td>
47
+
48
+ { playerUI: [PlayerUI](./server.playerui.md)<!-- -->; data: Record&lt;string, any&gt;; }
49
+
50
+
51
+ </td><td>
52
+
53
+ Emitted when data is received by the server from the player's client UI.
54
+
55
+
56
+ </td></tr>
57
+ <tr><td>
58
+
40
59
  ["PLAYER\_UI.LOAD"](./server.playeruieventpayloads._player_ui.load_.md)
41
60
 
42
61
 
@@ -83,12 +102,12 @@ Emitted when the player's mouse pointer is locked or unlocked.
83
102
 
84
103
  </td><td>
85
104
 
86
- { playerUI: [PlayerUI](./server.playerui.md)<!-- -->; data: object; }
105
+ { playerUI: [PlayerUI](./server.playerui.md)<!-- -->; data: Record&lt;string, any&gt;; }
87
106
 
88
107
 
89
108
  </td><td>
90
109
 
91
- Emitted when the player's client UI sends data to the server.
110
+ Emitted when data is sent from the server to the player's client UI.
92
111
 
93
112
 
94
113
  </td></tr>
@@ -4,7 +4,7 @@ import {
4
4
  Player,
5
5
  PlayerEntity,
6
6
  PlayerEvent,
7
- PlayerUI,
7
+ PlayerUIEvent,
8
8
  } from 'hytopia';
9
9
 
10
10
  import worldMap from './assets/map.json';
@@ -40,7 +40,8 @@ startServer(world => {
40
40
 
41
41
  // Handle data sent from player to server by client UI interactions we define.
42
42
  // See the ui/index.html file for the UI code that sends the data.
43
- player.ui.onData = (playerUI: PlayerUI, data: Record<string, any>) => {
43
+ player.ui.on(PlayerUIEvent.DATA, ({ playerUI, data }) => {
44
+ console.log('data', data);
44
45
  if (data.type === 'teleport') {
45
46
  const randomX = Math.random() * 40 - 20; // Random between -20 and 20
46
47
  const randomY = Math.random() * 13 + 2; // Random between 2 and 15
@@ -48,7 +49,7 @@ startServer(world => {
48
49
 
49
50
  playerEntity.setPosition({ x: randomX, y: randomY, z: randomZ });
50
51
  }
51
- };
52
+ });
52
53
  });
53
54
 
54
55
  world.on(PlayerEvent.LEFT_WORLD, ({ player }) => {
@@ -0,0 +1,308 @@
1
+ {
2
+ "asset": {
3
+ "generator": "glTF-Transform v4.1.2",
4
+ "version": "2.0"
5
+ },
6
+ "accessors": [
7
+ {
8
+ "type": "SCALAR",
9
+ "componentType": 5123,
10
+ "count": 132,
11
+ "bufferView": 0,
12
+ "byteOffset": 0
13
+ },
14
+ {
15
+ "type": "SCALAR",
16
+ "componentType": 5123,
17
+ "count": 6,
18
+ "bufferView": 0,
19
+ "byteOffset": 264
20
+ },
21
+ {
22
+ "type": "VEC3",
23
+ "componentType": 5126,
24
+ "count": 96,
25
+ "max": [
26
+ 0.0625,
27
+ 0.78125,
28
+ 0.0625
29
+ ],
30
+ "min": [
31
+ -0.0625,
32
+ -0.28125,
33
+ -0.0625
34
+ ],
35
+ "bufferView": 1,
36
+ "byteOffset": 0
37
+ },
38
+ {
39
+ "type": "VEC3",
40
+ "componentType": 5126,
41
+ "count": 96,
42
+ "bufferView": 1,
43
+ "byteOffset": 12
44
+ },
45
+ {
46
+ "type": "VEC2",
47
+ "componentType": 5126,
48
+ "count": 96,
49
+ "bufferView": 1,
50
+ "byteOffset": 24
51
+ },
52
+ {
53
+ "type": "VEC3",
54
+ "componentType": 5126,
55
+ "count": 4,
56
+ "max": [
57
+ 0.25,
58
+ 0,
59
+ 0.25
60
+ ],
61
+ "min": [
62
+ -0.25,
63
+ 0,
64
+ -0.25
65
+ ],
66
+ "bufferView": 2,
67
+ "byteOffset": 0
68
+ },
69
+ {
70
+ "type": "VEC3",
71
+ "componentType": 5126,
72
+ "count": 4,
73
+ "bufferView": 2,
74
+ "byteOffset": 12
75
+ },
76
+ {
77
+ "type": "VEC2",
78
+ "componentType": 5126,
79
+ "count": 4,
80
+ "bufferView": 2,
81
+ "byteOffset": 24
82
+ },
83
+ {
84
+ "type": "VEC3",
85
+ "componentType": 5126,
86
+ "count": 4,
87
+ "max": [
88
+ 0.78125,
89
+ 0,
90
+ 0.28125
91
+ ],
92
+ "min": [
93
+ -0.78125,
94
+ 0,
95
+ -0.28125
96
+ ],
97
+ "bufferView": 3,
98
+ "byteOffset": 0
99
+ },
100
+ {
101
+ "type": "VEC2",
102
+ "componentType": 5126,
103
+ "count": 4,
104
+ "bufferView": 3,
105
+ "byteOffset": 12
106
+ }
107
+ ],
108
+ "bufferViews": [
109
+ {
110
+ "buffer": 0,
111
+ "byteOffset": 0,
112
+ "byteLength": 276,
113
+ "target": 34963
114
+ },
115
+ {
116
+ "buffer": 0,
117
+ "byteOffset": 276,
118
+ "byteLength": 3072,
119
+ "byteStride": 32,
120
+ "target": 34962
121
+ },
122
+ {
123
+ "buffer": 0,
124
+ "byteOffset": 3348,
125
+ "byteLength": 128,
126
+ "byteStride": 32,
127
+ "target": 34962
128
+ },
129
+ {
130
+ "buffer": 0,
131
+ "byteOffset": 3476,
132
+ "byteLength": 80,
133
+ "byteStride": 20,
134
+ "target": 34962
135
+ }
136
+ ],
137
+ "samplers": [
138
+ {
139
+ "magFilter": 9728,
140
+ "minFilter": 9728,
141
+ "wrapS": 33071,
142
+ "wrapT": 33071
143
+ }
144
+ ],
145
+ "textures": [
146
+ {
147
+ "source": 0,
148
+ "sampler": 0
149
+ }
150
+ ],
151
+ "images": [
152
+ {
153
+ "mimeType": "image/png",
154
+ "uri": "baseColor.png"
155
+ }
156
+ ],
157
+ "buffers": [
158
+ {
159
+ "uri": "bullet-named-nodes.bin",
160
+ "byteLength": 3556
161
+ }
162
+ ],
163
+ "materials": [
164
+ {
165
+ "alphaMode": "MASK",
166
+ "alphaCutoff": 0.05,
167
+ "doubleSided": true,
168
+ "pbrMetallicRoughness": {
169
+ "metallicFactor": 0,
170
+ "baseColorTexture": {
171
+ "index": 0
172
+ }
173
+ }
174
+ }
175
+ ],
176
+ "meshes": [
177
+ {
178
+ "primitives": [
179
+ {
180
+ "attributes": {
181
+ "POSITION": 2,
182
+ "NORMAL": 3,
183
+ "TEXCOORD_0": 4
184
+ },
185
+ "mode": 4,
186
+ "material": 0,
187
+ "indices": 0
188
+ }
189
+ ]
190
+ },
191
+ {
192
+ "primitives": [
193
+ {
194
+ "attributes": {
195
+ "POSITION": 5,
196
+ "NORMAL": 6,
197
+ "TEXCOORD_0": 7
198
+ },
199
+ "mode": 4,
200
+ "material": 0,
201
+ "indices": 1
202
+ }
203
+ ]
204
+ },
205
+ {
206
+ "primitives": [
207
+ {
208
+ "attributes": {
209
+ "POSITION": 8,
210
+ "TEXCOORD_0": 9,
211
+ "NORMAL": 6
212
+ },
213
+ "mode": 4,
214
+ "material": 0,
215
+ "indices": 1
216
+ }
217
+ ]
218
+ },
219
+ {
220
+ "primitives": [
221
+ {
222
+ "attributes": {
223
+ "POSITION": 8,
224
+ "NORMAL": 6,
225
+ "TEXCOORD_0": 9
226
+ },
227
+ "mode": 4,
228
+ "material": 0,
229
+ "indices": 1
230
+ }
231
+ ]
232
+ }
233
+ ],
234
+ "nodes": [
235
+ {
236
+ "name": "beveled_cuboid",
237
+ "translation": [
238
+ 0,
239
+ 0.1875,
240
+ -0.25
241
+ ],
242
+ "rotation": [
243
+ 0.7071067811865475,
244
+ 0,
245
+ 0,
246
+ 0.7071067811865476
247
+ ],
248
+ "mesh": 0
249
+ },
250
+ {
251
+ "name": "plane",
252
+ "translation": [
253
+ 0,
254
+ 0.1875,
255
+ 0
256
+ ],
257
+ "rotation": [
258
+ 0.7071067811865475,
259
+ 0,
260
+ 0,
261
+ 0.7071067811865476
262
+ ],
263
+ "mesh": 1
264
+ },
265
+ {
266
+ "name": "plane",
267
+ "translation": [
268
+ 0,
269
+ 0.1875,
270
+ 0
271
+ ],
272
+ "rotation": [
273
+ 0.5,
274
+ -0.4999999999999999,
275
+ 0.5,
276
+ 0.5000000000000001
277
+ ],
278
+ "mesh": 2
279
+ },
280
+ {
281
+ "name": "plane",
282
+ "translation": [
283
+ 0,
284
+ 0.1875,
285
+ 0
286
+ ],
287
+ "rotation": [
288
+ 0.7071067811865475,
289
+ 5.551115123125786e-17,
290
+ 0.7071067811865476,
291
+ 1.6653345369377348e-16
292
+ ],
293
+ "mesh": 3
294
+ }
295
+ ],
296
+ "scenes": [
297
+ {
298
+ "name": "blockbench_export",
299
+ "nodes": [
300
+ 0,
301
+ 1,
302
+ 2,
303
+ 3
304
+ ]
305
+ }
306
+ ],
307
+ "scene": 0
308
+ }