@directivegames/genesys.sdk 3.2.2 → 3.2.4

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 (82) hide show
  1. package/README.md +60 -60
  2. package/dist/src/core/cli.js +22 -22
  3. package/dist/src/templates/scripts/genesys/genesys-mcp.js +25 -25
  4. package/dist/src/templates/scripts/genesys/mcp/editor-functions.js +4 -4
  5. package/dist/src/templates/src/templates/vehicle/src/ui-hints.js +30 -30
  6. package/package.json +176 -176
  7. package/scripts/post-install.ts +143 -143
  8. package/src/asset-pack/.gitattributes +88 -88
  9. package/src/asset-pack/eslint.config.js +45 -45
  10. package/src/asset-pack/gitignore +11 -11
  11. package/src/asset-pack/scripts/postinstall.ts +81 -81
  12. package/src/asset-pack/tsconfig.json +33 -33
  13. package/src/templates/.cursor/mcp.json +20 -20
  14. package/src/templates/.cursorignore +2 -2
  15. package/src/templates/.gitattributes +88 -88
  16. package/src/templates/.vscode/settings.json +6 -6
  17. package/src/templates/AGENTS.md +86 -86
  18. package/src/templates/README.md +24 -24
  19. package/src/templates/eslint.config.js +45 -45
  20. package/src/templates/gitignore +11 -11
  21. package/src/templates/index.html +34 -34
  22. package/src/templates/pnpm-lock.yaml +3676 -3676
  23. package/src/templates/scripts/genesys/build-project.ts +51 -51
  24. package/src/templates/scripts/genesys/calc-bounding-box.ts +272 -272
  25. package/src/templates/scripts/genesys/common.ts +46 -46
  26. package/src/templates/scripts/genesys/const.ts +9 -9
  27. package/src/templates/scripts/genesys/dev/dump-default-scene.ts +11 -11
  28. package/src/templates/scripts/genesys/dev/generate-manifest.ts +146 -146
  29. package/src/templates/scripts/genesys/dev/launcher.ts +46 -46
  30. package/src/templates/scripts/genesys/dev/storage-provider.ts +229 -229
  31. package/src/templates/scripts/genesys/dev/update-template-scenes.ts +84 -84
  32. package/src/templates/scripts/genesys/doc-server.ts +16 -16
  33. package/src/templates/scripts/genesys/genesys-mcp.ts +526 -526
  34. package/src/templates/scripts/genesys/mcp/doc-tools.ts +86 -86
  35. package/src/templates/scripts/genesys/mcp/editor-functions.ts +151 -151
  36. package/src/templates/scripts/genesys/mcp/editor-tools.ts +73 -73
  37. package/src/templates/scripts/genesys/mcp/get-scene-state.ts +35 -35
  38. package/src/templates/scripts/genesys/mcp/run-subprocess.ts +30 -30
  39. package/src/templates/scripts/genesys/mcp/search-actors.ts +858 -858
  40. package/src/templates/scripts/genesys/mcp/search-assets.ts +380 -380
  41. package/src/templates/scripts/genesys/mcp/utils.ts +281 -281
  42. package/src/templates/scripts/genesys/misc.ts +42 -42
  43. package/src/templates/scripts/genesys/mock.ts +6 -6
  44. package/src/templates/scripts/genesys/place-actors.ts +179 -179
  45. package/src/templates/scripts/genesys/post-install.ts +30 -30
  46. package/src/templates/scripts/genesys/prefab.schema.json +84 -84
  47. package/src/templates/scripts/genesys/remove-engine-comments.ts +134 -134
  48. package/src/templates/scripts/genesys/run-mcp-inspector.bat +4 -4
  49. package/src/templates/scripts/genesys/storageProvider.ts +182 -182
  50. package/src/templates/scripts/genesys/validate-prefabs.ts +138 -138
  51. package/src/templates/src/index.ts +22 -22
  52. package/src/templates/src/templates/firstPerson/assets/default.genesys-scene +165 -165
  53. package/src/templates/src/templates/firstPerson/src/game.ts +39 -39
  54. package/src/templates/src/templates/firstPerson/src/player.ts +63 -63
  55. package/src/templates/src/templates/fps/assets/default.genesys-scene +9459 -9459
  56. package/src/templates/src/templates/fps/src/game.ts +39 -39
  57. package/src/templates/src/templates/fps/src/player.ts +69 -69
  58. package/src/templates/src/templates/fps/src/weapon.ts +54 -54
  59. package/src/templates/src/templates/freeCamera/assets/default.genesys-scene +165 -165
  60. package/src/templates/src/templates/freeCamera/src/game.ts +39 -39
  61. package/src/templates/src/templates/freeCamera/src/player.ts +45 -45
  62. package/src/templates/src/templates/sideScroller/assets/default.genesys-scene +121 -121
  63. package/src/templates/src/templates/sideScroller/src/const.ts +45 -45
  64. package/src/templates/src/templates/sideScroller/src/game.ts +122 -122
  65. package/src/templates/src/templates/sideScroller/src/level-generator.ts +361 -361
  66. package/src/templates/src/templates/sideScroller/src/player.ts +125 -125
  67. package/src/templates/src/templates/thirdPerson/assets/default.genesys-scene +165 -165
  68. package/src/templates/src/templates/thirdPerson/src/game.ts +39 -39
  69. package/src/templates/src/templates/thirdPerson/src/player.ts +61 -61
  70. package/src/templates/src/templates/vehicle/assets/default.genesys-scene +225 -225
  71. package/src/templates/src/templates/vehicle/src/base-vehicle.ts +145 -145
  72. package/src/templates/src/templates/vehicle/src/game.ts +43 -43
  73. package/src/templates/src/templates/vehicle/src/mesh-vehicle.ts +191 -191
  74. package/src/templates/src/templates/vehicle/src/player.ts +109 -109
  75. package/src/templates/src/templates/vehicle/src/primitive-vehicle.ts +266 -266
  76. package/src/templates/src/templates/vehicle/src/ui-hints.ts +101 -101
  77. package/src/templates/src/templates/vr-game/assets/default.genesys-scene +246 -246
  78. package/src/templates/src/templates/vr-game/src/auto-imports.ts +1 -1
  79. package/src/templates/src/templates/vr-game/src/game.ts +66 -66
  80. package/src/templates/src/templates/vr-game/src/sample-vr-actor.ts +26 -26
  81. package/src/templates/tsconfig.json +34 -34
  82. package/src/templates/vite.config.ts +52 -52
@@ -1,247 +1,247 @@
1
- {
2
- "$version": 0,
3
- "class": "ENGINE.World",
4
- "uuid": "c0ae85792bc3b946",
5
- "ctor": {
6
- "backgroundColor": "#2E2E2E",
7
- "navigationOptions": {
8
- "engine": "recast-navigation",
9
- "debug": false,
10
- "generateOnStartUp": false
11
- },
12
- "physicsOptions": {
13
- "gravity": [
14
- 0,
15
- -9.81,
16
- 0,
17
- "v"
18
- ],
19
- "engine": "rapier"
20
- },
21
- "useManifold": true
22
- },
23
- "actors": [
24
- {
25
- "uuid": "9a86d389088b361c",
26
- "class": "ENGINE.Actor",
27
- "properties": {
28
- "editorData": {
29
- "displayName": "Directional Light",
30
- "hidden": false
31
- }
32
- },
33
- "ctor": {
34
- "rootComponent": {
35
- "class": "ENGINE.DirectionalLightComponent",
36
- "uuid": "cfe05433-9edc-4dfe-a535-c71f33e92d78",
37
- "ctor": {
38
- "color": 16777215,
39
- "intensity": 1,
40
- "castShadow": true,
41
- "shadowMapSize": 2048,
42
- "shadowBias": 0,
43
- "shadowNormalBias": 0,
44
- "shadowNear": 0.1,
45
- "shadowFar": 100
46
- },
47
- "properties": {
48
- "position": [
49
- 10,
50
- 50,
51
- -10,
52
- "v"
53
- ],
54
- "castShadow": true
55
- }
56
- }
57
- }
58
- },
59
- {
60
- "uuid": "9d428f2a16e5374a",
61
- "class": "ENGINE.Actor",
62
- "properties": {
63
- "editorData": {
64
- "displayName": "Ground",
65
- "hidden": false
66
- }
67
- },
68
- "ctor": {
69
- "rootComponent": {
70
- "class": "ENGINE.MeshComponent",
71
- "uuid": "71caea24-62d7-4e45-a76e-4c7519de2c3c",
72
- "ctor": {
73
- "geometry": {
74
- "class": "THREE.BoxGeometry",
75
- "ctor": [
76
- 500,
77
- 0.1,
78
- 500
79
- ]
80
- },
81
- "material": {
82
- "@external": "DefaultMaterial"
83
- },
84
- "uvScaleTilesPerUnit": 0.2
85
- },
86
- "properties": {
87
- "position": [
88
- 0,
89
- -0.9,
90
- 0,
91
- "v"
92
- ],
93
- "receiveShadow": true
94
- }
95
- }
96
- }
97
- },
98
- {
99
- "uuid": "b87cbc5e60a2e54c",
100
- "class": "ENGINE.PlayerStart",
101
- "properties": {
102
- "editorData": {
103
- "displayName": "Player Start",
104
- "hidden": false
105
- }
106
- },
107
- "ctor": {
108
- "rootComponent": {
109
- "class": "ENGINE.SceneComponent",
110
- "uuid": "b4d5f8f7-2512-45e1-9157-c7ff6772402d",
111
- "properties": {
112
- "position": [
113
- 0,
114
- 0.9,
115
- 0,
116
- "v"
117
- ]
118
- }
119
- }
120
- }
121
- },
122
- {
123
- "uuid": "0ba1f4677e8370d1",
124
- "class": "ENGINE.Actor",
125
- "properties": {
126
- "editorData": {
127
- "displayName": "Skybox",
128
- "hidden": false
129
- }
130
- },
131
- "ctor": {
132
- "rootComponent": {
133
- "class": "ENGINE.SceneComponent",
134
- "uuid": "195e88df-73ff-4f4b-82ae-7fb58671463d",
135
- "children": [
136
- {
137
- "class": "ENGINE.SkyboxComponent",
138
- "uuid": "f7e33ae7d5ac74f9",
139
- "ctor": {
140
- "textureUrl": "@engine/assets/textures/skybox/citrus_orchard_road_puresky_2k.hdr",
141
- "width": 2048,
142
- "height": 1024,
143
- "bottomColor": "#E6F3FF",
144
- "middleColor": "#4A90E2",
145
- "topColor": "#0F1B3C",
146
- "envMapIntensity": 1,
147
- "backgroundIntensity": 1,
148
- "backgroundBlurriness": 0,
149
- "envMapRotation": [
150
- 0,
151
- 0,
152
- 0,
153
- "e"
154
- ]
155
- }
156
- }
157
- ]
158
- }
159
- }
160
- },
161
- {
162
- "uuid": "01155a02b0cf79cc",
163
- "class": "GAME.SampleVRActor",
164
- "ctor": {
165
- "actorTags": [],
166
- "rootComponent": {
167
- "class": "ENGINE.MeshComponent",
168
- "uuid": "eab8ac7623a2c4c8",
169
- "ctor": {
170
- "physicsOptions": {
171
- "motionType": "dynamic",
172
- "collisionMeshType": "boundingBox"
173
- },
174
- "geometry": {
175
- "class": "THREE.BoxGeometry",
176
- "ctor": [
177
- 1,
178
- 1,
179
- 1
180
- ]
181
- },
182
- "material": {
183
- "class": "THREE.MeshStandardMaterial",
184
- "ctor": {
185
- "defines": {
186
- "STANDARD": ""
187
- }
188
- }
189
- },
190
- "excludeFromNavigation": false,
191
- "uvScaleTilesPerUnit": 1
192
- },
193
- "children": [
194
- {
195
- "class": "ENGINE.VRGrabbableComponent",
196
- "uuid": "d9fd1e6fd3409c76",
197
- "ctor": {
198
- "vrAttachmentInputType": "select",
199
- "hideController": false,
200
- "attachmentMode": "beam"
201
- }
202
- }
203
- ],
204
- "properties": {
205
- "position": [
206
- 0,
207
- 0,
208
- -7.4,
209
- "v"
210
- ]
211
- }
212
- }
213
- }
214
- }
215
- ],
216
- "properties": {
217
- "editorData": {
218
- "sceneTree": {
219
- "id": "c0ae85792bc3b946",
220
- "nodeType": "scene",
221
- "children": [
222
- {
223
- "id": "9a86d389088b361c",
224
- "nodeType": "actor"
225
- },
226
- {
227
- "id": "9d428f2a16e5374a",
228
- "nodeType": "actor"
229
- },
230
- {
231
- "id": "b87cbc5e60a2e54c",
232
- "nodeType": "actor"
233
- },
234
- {
235
- "id": "0ba1f4677e8370d1",
236
- "nodeType": "actor"
237
- },
238
- {
239
- "id": "01155a02b0cf79cc",
240
- "nodeType": "actor"
241
- }
242
- ]
243
- }
244
- },
245
- "postProcessConfiguration": null
246
- }
1
+ {
2
+ "$version": 0,
3
+ "class": "ENGINE.World",
4
+ "uuid": "c0ae85792bc3b946",
5
+ "ctor": {
6
+ "backgroundColor": "#2E2E2E",
7
+ "navigationOptions": {
8
+ "engine": "recast-navigation",
9
+ "debug": false,
10
+ "generateOnStartUp": false
11
+ },
12
+ "physicsOptions": {
13
+ "gravity": [
14
+ 0,
15
+ -9.81,
16
+ 0,
17
+ "v"
18
+ ],
19
+ "engine": "rapier"
20
+ },
21
+ "useManifold": true
22
+ },
23
+ "actors": [
24
+ {
25
+ "uuid": "9a86d389088b361c",
26
+ "class": "ENGINE.Actor",
27
+ "properties": {
28
+ "editorData": {
29
+ "displayName": "Directional Light",
30
+ "hidden": false
31
+ }
32
+ },
33
+ "ctor": {
34
+ "rootComponent": {
35
+ "class": "ENGINE.DirectionalLightComponent",
36
+ "uuid": "cfe05433-9edc-4dfe-a535-c71f33e92d78",
37
+ "ctor": {
38
+ "color": 16777215,
39
+ "intensity": 1,
40
+ "castShadow": true,
41
+ "shadowMapSize": 2048,
42
+ "shadowBias": 0,
43
+ "shadowNormalBias": 0,
44
+ "shadowNear": 0.1,
45
+ "shadowFar": 100
46
+ },
47
+ "properties": {
48
+ "position": [
49
+ 10,
50
+ 50,
51
+ -10,
52
+ "v"
53
+ ],
54
+ "castShadow": true
55
+ }
56
+ }
57
+ }
58
+ },
59
+ {
60
+ "uuid": "9d428f2a16e5374a",
61
+ "class": "ENGINE.Actor",
62
+ "properties": {
63
+ "editorData": {
64
+ "displayName": "Ground",
65
+ "hidden": false
66
+ }
67
+ },
68
+ "ctor": {
69
+ "rootComponent": {
70
+ "class": "ENGINE.MeshComponent",
71
+ "uuid": "71caea24-62d7-4e45-a76e-4c7519de2c3c",
72
+ "ctor": {
73
+ "geometry": {
74
+ "class": "THREE.BoxGeometry",
75
+ "ctor": [
76
+ 500,
77
+ 0.1,
78
+ 500
79
+ ]
80
+ },
81
+ "material": {
82
+ "@external": "DefaultMaterial"
83
+ },
84
+ "uvScaleTilesPerUnit": 0.2
85
+ },
86
+ "properties": {
87
+ "position": [
88
+ 0,
89
+ -0.9,
90
+ 0,
91
+ "v"
92
+ ],
93
+ "receiveShadow": true
94
+ }
95
+ }
96
+ }
97
+ },
98
+ {
99
+ "uuid": "b87cbc5e60a2e54c",
100
+ "class": "ENGINE.PlayerStart",
101
+ "properties": {
102
+ "editorData": {
103
+ "displayName": "Player Start",
104
+ "hidden": false
105
+ }
106
+ },
107
+ "ctor": {
108
+ "rootComponent": {
109
+ "class": "ENGINE.SceneComponent",
110
+ "uuid": "b4d5f8f7-2512-45e1-9157-c7ff6772402d",
111
+ "properties": {
112
+ "position": [
113
+ 0,
114
+ 0.9,
115
+ 0,
116
+ "v"
117
+ ]
118
+ }
119
+ }
120
+ }
121
+ },
122
+ {
123
+ "uuid": "0ba1f4677e8370d1",
124
+ "class": "ENGINE.Actor",
125
+ "properties": {
126
+ "editorData": {
127
+ "displayName": "Skybox",
128
+ "hidden": false
129
+ }
130
+ },
131
+ "ctor": {
132
+ "rootComponent": {
133
+ "class": "ENGINE.SceneComponent",
134
+ "uuid": "195e88df-73ff-4f4b-82ae-7fb58671463d",
135
+ "children": [
136
+ {
137
+ "class": "ENGINE.SkyboxComponent",
138
+ "uuid": "f7e33ae7d5ac74f9",
139
+ "ctor": {
140
+ "textureUrl": "@engine/assets/textures/skybox/citrus_orchard_road_puresky_2k.hdr",
141
+ "width": 2048,
142
+ "height": 1024,
143
+ "bottomColor": "#E6F3FF",
144
+ "middleColor": "#4A90E2",
145
+ "topColor": "#0F1B3C",
146
+ "envMapIntensity": 1,
147
+ "backgroundIntensity": 1,
148
+ "backgroundBlurriness": 0,
149
+ "envMapRotation": [
150
+ 0,
151
+ 0,
152
+ 0,
153
+ "e"
154
+ ]
155
+ }
156
+ }
157
+ ]
158
+ }
159
+ }
160
+ },
161
+ {
162
+ "uuid": "01155a02b0cf79cc",
163
+ "class": "GAME.SampleVRActor",
164
+ "ctor": {
165
+ "actorTags": [],
166
+ "rootComponent": {
167
+ "class": "ENGINE.MeshComponent",
168
+ "uuid": "eab8ac7623a2c4c8",
169
+ "ctor": {
170
+ "physicsOptions": {
171
+ "motionType": "dynamic",
172
+ "collisionMeshType": "boundingBox"
173
+ },
174
+ "geometry": {
175
+ "class": "THREE.BoxGeometry",
176
+ "ctor": [
177
+ 1,
178
+ 1,
179
+ 1
180
+ ]
181
+ },
182
+ "material": {
183
+ "class": "THREE.MeshStandardMaterial",
184
+ "ctor": {
185
+ "defines": {
186
+ "STANDARD": ""
187
+ }
188
+ }
189
+ },
190
+ "excludeFromNavigation": false,
191
+ "uvScaleTilesPerUnit": 1
192
+ },
193
+ "children": [
194
+ {
195
+ "class": "ENGINE.VRGrabbableComponent",
196
+ "uuid": "d9fd1e6fd3409c76",
197
+ "ctor": {
198
+ "vrAttachmentInputType": "select",
199
+ "hideController": false,
200
+ "attachmentMode": "beam"
201
+ }
202
+ }
203
+ ],
204
+ "properties": {
205
+ "position": [
206
+ 0,
207
+ 0,
208
+ -7.4,
209
+ "v"
210
+ ]
211
+ }
212
+ }
213
+ }
214
+ }
215
+ ],
216
+ "properties": {
217
+ "editorData": {
218
+ "sceneTree": {
219
+ "id": "c0ae85792bc3b946",
220
+ "nodeType": "scene",
221
+ "children": [
222
+ {
223
+ "id": "9a86d389088b361c",
224
+ "nodeType": "actor"
225
+ },
226
+ {
227
+ "id": "9d428f2a16e5374a",
228
+ "nodeType": "actor"
229
+ },
230
+ {
231
+ "id": "b87cbc5e60a2e54c",
232
+ "nodeType": "actor"
233
+ },
234
+ {
235
+ "id": "0ba1f4677e8370d1",
236
+ "nodeType": "actor"
237
+ },
238
+ {
239
+ "id": "01155a02b0cf79cc",
240
+ "nodeType": "actor"
241
+ }
242
+ ]
243
+ }
244
+ },
245
+ "postProcessConfiguration": null
246
+ }
247
247
  }
@@ -1 +1 @@
1
- import './sample-vr-actor.ts';
1
+ import './sample-vr-actor.ts';
@@ -1,66 +1,66 @@
1
-
2
- import * as ENGINE from 'genesys.js';
3
- import * as THREE from 'three';
4
-
5
- import './auto-imports.js';
6
-
7
- class MyGame extends ENGINE.BaseGameLoop {
8
- private pawn: ENGINE.VRPawn | null = null;
9
- private controller: ENGINE.PlayerController | null = null;
10
-
11
- protected override createLoadingScreen(): ENGINE.ILoadingScreen | null {
12
- // enable the default loading screen
13
- return new ENGINE.DefaultLoadingScreen();
14
- }
15
-
16
- static override get DEFAULT_OPTIONS(): ENGINE.BaseGameLoopOptions {
17
- return {
18
- ...ENGINE.BaseGameLoop.DEFAULT_OPTIONS,
19
- xrEnabled: true,
20
- vrSessionOptions: {
21
- optionalFeatures: ['hand-tracking', 'local-floor'],
22
- requiredFeatures: []
23
- }
24
- };
25
- }
26
-
27
- protected override async preStart(): Promise<void> {
28
- // Disable tone mapping for VR because it breaks VR
29
- this.world.postProcessManager.disablePasses(ENGINE.PostProcessPass.ToneMapping);
30
-
31
- // create the vr pawn
32
- this.pawn = new ENGINE.VRPawn({
33
- position: new THREE.Vector3(0, 0, 0),
34
- movementComponent: null,
35
- camera: new THREE.PerspectiveCamera(ENGINE.CAMERA_FOV, 1, ENGINE.CAMERA_NEAR, ENGINE.CAMERA_FAR),
36
- controllerOptions: {
37
- rayVisualizationEnabled: true,
38
- maxRayDistance: 10
39
- },
40
- enableTeleportation: true,
41
- enableSnapTurn: true,
42
- snapTurnAngle: 30,
43
- maxTeleportDistance: 15
44
- });
45
-
46
- // create the controller and possess the pawn
47
- this.controller = new ENGINE.PlayerController();
48
- this.controller.possess(this.pawn);
49
-
50
- this.pawn.addComponent(new ENGINE.VRGrabComponent({}));
51
- this.pawn.addComponent(new ENGINE.VRSnapTurnComponent({ angleDeg: this.pawn.getSnapTurnAngleDegrees() }));
52
- this.pawn.addComponent(new ENGINE.VRInteractComponent({ button: ENGINE.XRButton.Trigger }));
53
- this.pawn.addComponent(new ENGINE.VRTeleportComponent({ maxDistance: 15 }));
54
-
55
- // add both to the world
56
- this.world.addActors(this.pawn, this.controller);
57
- }
58
- }
59
-
60
- export function main(container: HTMLElement, gameId: string): ENGINE.IGameLoop {
61
- const game = new MyGame(container, {
62
- ...MyGame.DEFAULT_OPTIONS,
63
- gameId
64
- });
65
- return game;
66
- }
1
+
2
+ import * as ENGINE from 'genesys.js';
3
+ import * as THREE from 'three';
4
+
5
+ import './auto-imports.js';
6
+
7
+ class MyGame extends ENGINE.BaseGameLoop {
8
+ private pawn: ENGINE.VRPawn | null = null;
9
+ private controller: ENGINE.PlayerController | null = null;
10
+
11
+ protected override createLoadingScreen(): ENGINE.ILoadingScreen | null {
12
+ // enable the default loading screen
13
+ return new ENGINE.DefaultLoadingScreen();
14
+ }
15
+
16
+ static override get DEFAULT_OPTIONS(): ENGINE.BaseGameLoopOptions {
17
+ return {
18
+ ...ENGINE.BaseGameLoop.DEFAULT_OPTIONS,
19
+ xrEnabled: true,
20
+ vrSessionOptions: {
21
+ optionalFeatures: ['hand-tracking', 'local-floor'],
22
+ requiredFeatures: []
23
+ }
24
+ };
25
+ }
26
+
27
+ protected override async preStart(): Promise<void> {
28
+ // Disable tone mapping for VR because it breaks VR
29
+ this.world.postProcessManager.disablePasses(ENGINE.PostProcessPass.ToneMapping);
30
+
31
+ // create the vr pawn
32
+ this.pawn = new ENGINE.VRPawn({
33
+ position: new THREE.Vector3(0, 0, 0),
34
+ movementComponent: null,
35
+ camera: new THREE.PerspectiveCamera(ENGINE.CAMERA_FOV, 1, ENGINE.CAMERA_NEAR, ENGINE.CAMERA_FAR),
36
+ controllerOptions: {
37
+ rayVisualizationEnabled: true,
38
+ maxRayDistance: 10
39
+ },
40
+ enableTeleportation: true,
41
+ enableSnapTurn: true,
42
+ snapTurnAngle: 30,
43
+ maxTeleportDistance: 15
44
+ });
45
+
46
+ // create the controller and possess the pawn
47
+ this.controller = new ENGINE.PlayerController();
48
+ this.controller.possess(this.pawn);
49
+
50
+ this.pawn.addComponent(new ENGINE.VRGrabComponent({}));
51
+ this.pawn.addComponent(new ENGINE.VRSnapTurnComponent({ angleDeg: this.pawn.getSnapTurnAngleDegrees() }));
52
+ this.pawn.addComponent(new ENGINE.VRInteractComponent({ button: ENGINE.XRButton.Trigger }));
53
+ this.pawn.addComponent(new ENGINE.VRTeleportComponent({ maxDistance: 15 }));
54
+
55
+ // add both to the world
56
+ this.world.addActors(this.pawn, this.controller);
57
+ }
58
+ }
59
+
60
+ export function main(container: HTMLElement, gameId: string): ENGINE.IGameLoop {
61
+ const game = new MyGame(container, {
62
+ ...MyGame.DEFAULT_OPTIONS,
63
+ gameId
64
+ });
65
+ return game;
66
+ }