three-stdlib 2.20.4 → 2.21.0

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.
@@ -1,13 +1,28 @@
1
- import { Object3D, SphereGeometry, MeshBasicMaterial, Mesh } from 'three';
1
+ import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
2
+ import { Object3D, Mesh, SphereGeometry, MeshBasicMaterial } from 'three';
2
3
  import { GLTFLoader } from '../loaders/GLTFLoader.js';
3
4
  import { fetchProfile, MotionController, MotionControllerConstants } from '../libs/MotionControllers.js';
4
5
 
5
6
  const DEFAULT_PROFILES_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles';
6
7
  const DEFAULT_PROFILE = 'generic-trigger';
7
8
 
9
+ const applyEnvironmentMap = (envMap, obj) => {
10
+ obj.traverse(child => {
11
+ if (child instanceof Mesh && 'envMap' in child.material) {
12
+ child.material.envMap = envMap;
13
+ child.material.needsUpdate = true;
14
+ }
15
+ });
16
+ };
17
+
8
18
  class XRControllerModel extends Object3D {
9
19
  constructor() {
10
20
  super();
21
+
22
+ _defineProperty(this, "envMap", void 0);
23
+
24
+ _defineProperty(this, "motionController", void 0);
25
+
11
26
  this.motionController = null;
12
27
  this.envMap = null;
13
28
  }
@@ -18,12 +33,7 @@ class XRControllerModel extends Object3D {
18
33
  }
19
34
 
20
35
  this.envMap = envMap;
21
- this.traverse(child => {
22
- if (child.isMesh) {
23
- child.material.envMap = this.envMap;
24
- child.material.needsUpdate = true;
25
- }
26
- });
36
+ applyEnvironmentMap(this.envMap, this);
27
37
  return this;
28
38
  }
29
39
  /**
@@ -52,9 +62,9 @@ class XRControllerModel extends Object3D {
52
62
 
53
63
  if (!valueNode) return; // Calculate the new properties based on the weight supplied
54
64
 
55
- if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.VISIBILITY) {
65
+ if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.VISIBILITY && typeof value === 'boolean') {
56
66
  valueNode.visible = value;
57
- } else if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM) {
67
+ } else if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM && minNode && maxNode && typeof value === 'number') {
58
68
  valueNode.quaternion.slerpQuaternions(minNode.quaternion, maxNode.quaternion, value);
59
69
  valueNode.position.lerpVectors(minNode.position, maxNode.position, value);
60
70
  }
@@ -79,7 +89,7 @@ function findNodes(motionController, scene) {
79
89
  visualResponses
80
90
  } = component;
81
91
 
82
- if (type === MotionControllerConstants.ComponentType.TOUCHPAD) {
92
+ if (type === MotionControllerConstants.ComponentType.TOUCHPAD && touchPointNodeName) {
83
93
  component.touchPointNode = scene.getObjectByName(touchPointNodeName);
84
94
 
85
95
  if (component.touchPointNode) {
@@ -104,7 +114,7 @@ function findNodes(motionController, scene) {
104
114
  valueNodeProperty
105
115
  } = visualResponse; // If animating a transform, find the two nodes to be interpolated between.
106
116
 
107
- if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM) {
117
+ if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM && minNodeName && maxNodeName) {
108
118
  visualResponse.minNode = scene.getObjectByName(minNodeName);
109
119
  visualResponse.maxNode = scene.getObjectByName(maxNodeName); // If the extents cannot be found, skip this animation
110
120
 
@@ -134,12 +144,7 @@ function addAssetSceneToControllerModel(controllerModel, scene) {
134
144
  findNodes(controllerModel.motionController, scene); // Apply any environment map that the mesh already has set.
135
145
 
136
146
  if (controllerModel.envMap) {
137
- scene.traverse(child => {
138
- if (child.isMesh) {
139
- child.material.envMap = controllerModel.envMap;
140
- child.material.needsUpdate = true;
141
- }
142
- });
147
+ applyEnvironmentMap(controllerModel.envMap, scene);
143
148
  } // Add the glTF scene to the controllerModel.
144
149
 
145
150
 
@@ -148,6 +153,12 @@ function addAssetSceneToControllerModel(controllerModel, scene) {
148
153
 
149
154
  class XRControllerModelFactory {
150
155
  constructor(gltfLoader = null) {
156
+ _defineProperty(this, "gltfLoader", void 0);
157
+
158
+ _defineProperty(this, "path", void 0);
159
+
160
+ _defineProperty(this, "_assetCache", void 0);
161
+
151
162
  this.gltfLoader = gltfLoader;
152
163
  this.path = DEFAULT_PROFILES_PATH;
153
164
  this._assetCache = {}; // If a GLTFLoader wasn't supplied to the constructor create a new one.
@@ -167,8 +178,13 @@ class XRControllerModelFactory {
167
178
  profile,
168
179
  assetPath
169
180
  }) => {
181
+ if (!assetPath) {
182
+ throw new Error('no asset path');
183
+ }
184
+
170
185
  controllerModel.motionController = new MotionController(xrInputSource, profile, assetPath);
171
- const cachedAsset = this._assetCache[controllerModel.motionController.assetUrl];
186
+ const assetUrl = controllerModel.motionController.assetUrl;
187
+ const cachedAsset = this._assetCache[assetUrl];
172
188
 
173
189
  if (cachedAsset) {
174
190
  scene = cachedAsset.scene.clone();
@@ -180,11 +196,16 @@ class XRControllerModelFactory {
180
196
 
181
197
  this.gltfLoader.setPath('');
182
198
  this.gltfLoader.load(controllerModel.motionController.assetUrl, asset => {
183
- this._assetCache[controllerModel.motionController.assetUrl] = asset;
199
+ if (!controllerModel.motionController) {
200
+ console.warn('motionController gone while gltf load, bailing...');
201
+ return;
202
+ }
203
+
204
+ this._assetCache[assetUrl] = asset;
184
205
  scene = asset.scene.clone();
185
206
  addAssetSceneToControllerModel(controllerModel, scene);
186
207
  }, null, () => {
187
- throw new Error(`Asset ${controllerModel.motionController.assetUrl} missing or malformed.`);
208
+ throw new Error(`Asset ${assetUrl} missing or malformed.`);
188
209
  });
189
210
  }
190
211
  }).catch(err => {
@@ -193,7 +214,11 @@ class XRControllerModelFactory {
193
214
  });
194
215
  controller.addEventListener('disconnected', () => {
195
216
  controllerModel.motionController = null;
196
- controllerModel.remove(scene);
217
+
218
+ if (scene) {
219
+ controllerModel.remove(scene);
220
+ }
221
+
197
222
  scene = null;
198
223
  });
199
224
  return controllerModel;