three-stdlib 2.8.1 → 2.8.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. package/{BufferGeometryUtils-582025b8.js → BufferGeometryUtils-1a7a235c.js} +2 -1
  2. package/{BufferGeometryUtils-9eb5c2e7.js → BufferGeometryUtils-971dfde3.js} +0 -0
  3. package/animation/MMDAnimationHelper.d.ts +17 -17
  4. package/animation/MMDPhysics.d.ts +3 -3
  5. package/csm/CSM.d.ts +47 -22
  6. package/csm/CSMHelper.d.ts +20 -7
  7. package/effects/OutlineEffect.d.ts +4 -4
  8. package/effects/OutlineEffect.js +8 -2
  9. package/exporters/GLTFExporter.js +5 -10
  10. package/geometries/ConvexGeometry.d.ts +1 -1
  11. package/geometries/ParametricGeometries.d.ts +4 -2
  12. package/helpers/RectAreaLightHelper.d.ts +3 -3
  13. package/index.cjs.js +1 -1
  14. package/index.d.ts +9 -4
  15. package/index.js +9 -4
  16. package/libs/MotionControllers.cjs.js +1 -0
  17. package/libs/MotionControllers.js +403 -0
  18. package/loaders/AssimpLoader.js +39 -10
  19. package/loaders/ColladaLoader.js +22 -5
  20. package/loaders/EXRLoader.js +5 -1
  21. package/loaders/FBXLoader.js +10 -2
  22. package/loaders/GLTFLoader.cjs.js +1 -1
  23. package/loaders/GLTFLoader.d.ts +44 -20
  24. package/loaders/GLTFLoader.js +0 -2
  25. package/loaders/LDrawLoader.d.ts +6 -0
  26. package/loaders/MTLLoader.d.ts +18 -18
  27. package/loaders/RGBMLoader.d.ts +10 -10
  28. package/loaders/RGBMLoader.js +253 -178
  29. package/loaders/SVGLoader.d.ts +5 -3
  30. package/loaders/SVGLoader.js +10 -5
  31. package/loaders/lwo/IFFParser.js +4 -1
  32. package/math/OBB.d.ts +1 -1
  33. package/misc/GPUComputationRenderer.d.ts +8 -6
  34. package/misc/MD2CharacterComplex.js +9 -2
  35. package/misc/Volume.d.ts +2 -0
  36. package/modifiers/EdgeSplitModifier.cjs.js +1 -1
  37. package/modifiers/SimplifyModifier.cjs.js +1 -1
  38. package/nodes/inputs/ColorNode.d.ts +2 -2
  39. package/nodes/inputs/TextureNode.d.ts +3 -2
  40. package/nodes/materials/StandardNodeMaterial.d.ts +1 -1
  41. package/nodes/materials/nodes/StandardNode.d.ts +1 -0
  42. package/nodes/utils/ColorSpaceNode.d.ts +1 -1
  43. package/nodes/utils/JoinNode.d.ts +1 -0
  44. package/objects/MarchingCubes.d.ts +12 -4
  45. package/objects/Reflector.d.ts +4 -2
  46. package/objects/ReflectorForSSRPass.d.ts +6 -6
  47. package/objects/Refractor.d.ts +4 -2
  48. package/objects/Water.d.ts +4 -3
  49. package/objects/Water2.d.ts +12 -3
  50. package/package.json +2 -3
  51. package/postprocessing/ClearPass.d.ts +3 -3
  52. package/postprocessing/SAOPass.d.ts +3 -2
  53. package/postprocessing/SSAARenderPass.d.ts +3 -3
  54. package/postprocessing/SSAOPass.d.ts +3 -2
  55. package/postprocessing/SSRPass.d.ts +14 -17
  56. package/postprocessing/TAARenderPass.d.ts +2 -2
  57. package/renderers/CSS2DRenderer.d.ts +5 -1
  58. package/renderers/CSS3DRenderer.d.ts +5 -1
  59. package/renderers/webgpu/WebGPUTextures.js +62 -41
  60. package/shaders/SSRShader.d.ts +1 -2
  61. package/utils/BufferGeometryUtils.cjs.js +1 -1
  62. package/utils/BufferGeometryUtils.js +2 -1
  63. package/utils/LDrawUtils.cjs.js +1 -1
  64. package/utils/LDrawUtils.d.ts +5 -0
  65. package/utils/LDrawUtils.js +1 -1
  66. package/utils/RoughnessMipmapper.js +5 -1
  67. package/utils/SceneUtils.d.ts +10 -12
  68. package/utils/ShadowMapViewer.js +4 -1
  69. package/webxr/OculusHandModel.cjs.js +1 -0
  70. package/webxr/OculusHandModel.d.ts +19 -0
  71. package/webxr/OculusHandModel.js +72 -0
  72. package/webxr/OculusHandPointerModel.cjs.js +1 -0
  73. package/webxr/OculusHandPointerModel.d.ts +63 -0
  74. package/webxr/OculusHandPointerModel.js +248 -0
  75. package/webxr/Text2D.cjs.js +1 -0
  76. package/webxr/Text2D.d.ts +3 -0
  77. package/webxr/Text2D.js +32 -0
  78. package/webxr/VRButton.cjs.js +1 -1
  79. package/webxr/VRButton.js +17 -1
  80. package/webxr/XRControllerModelFactory.cjs.js +1 -1
  81. package/webxr/XRControllerModelFactory.js +65 -66
  82. package/webxr/XREstimatedLight.cjs.js +1 -1
  83. package/webxr/XREstimatedLight.js +1 -0
  84. package/webxr/XRHandMeshModel.cjs.js +1 -0
  85. package/webxr/XRHandMeshModel.d.ts +11 -0
  86. package/webxr/XRHandMeshModel.js +55 -0
  87. package/webxr/XRHandModelFactory.cjs.js +1 -1
  88. package/webxr/XRHandModelFactory.d.ts +3 -3
  89. package/webxr/XRHandModelFactory.js +47 -50
  90. package/webxr/XRHandPrimitiveModel.cjs.js +1 -1
  91. package/webxr/XRHandPrimitiveModel.d.ts +1 -1
  92. package/webxr/XRHandPrimitiveModel.js +31 -41
  93. package/csm/Frustum.d.ts +0 -16
  94. package/csm/Shader.d.ts +0 -6
  95. package/loaders/XLoader.d.ts +0 -19
  96. package/shaders/FresnelShader.d.ts +0 -13
  97. package/shaders/ParallaxShader.d.ts +0 -20
  98. package/utils/RoughnessMipmapper.d.ts +0 -7
  99. package/webxr/XRHandOculusMeshModel.cjs.js +0 -1
  100. package/webxr/XRHandOculusMeshModel.d.ts +0 -23
  101. package/webxr/XRHandOculusMeshModel.js +0 -89
@@ -1,19 +1,18 @@
1
- import { Object3D, Quaternion, SphereGeometry, MeshBasicMaterial, Mesh } from 'three';
1
+ import { Object3D, SphereGeometry, MeshBasicMaterial, Mesh } from 'three';
2
2
  import { GLTFLoader } from '../loaders/GLTFLoader.js';
3
- import { Constants, fetchProfile, MotionController } from '@webxr-input-profiles/motion-controllers';
3
+ import { fetchProfile, MotionController, MotionControllerConstants } from '../libs/MotionControllers.js';
4
4
 
5
5
  const DEFAULT_PROFILES_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles';
6
6
  const DEFAULT_PROFILE = 'generic-trigger';
7
7
 
8
- function XRControllerModel() {
9
- Object3D.call(this);
10
- this.motionController = null;
11
- this.envMap = null;
12
- }
8
+ class XRControllerModel extends Object3D {
9
+ constructor() {
10
+ super();
11
+ this.motionController = null;
12
+ this.envMap = null;
13
+ }
13
14
 
14
- XRControllerModel.prototype = Object.assign(Object.create(Object3D.prototype), {
15
- constructor: XRControllerModel,
16
- setEnvironmentMap: function (envMap) {
15
+ setEnvironmentMap(envMap) {
17
16
  if (this.envMap == envMap) {
18
17
  return this;
19
18
  }
@@ -26,14 +25,15 @@ XRControllerModel.prototype = Object.assign(Object.create(Object3D.prototype), {
26
25
  }
27
26
  });
28
27
  return this;
29
- },
30
-
28
+ }
31
29
  /**
32
30
  * Polls data from the XRInputSource and updates the model's components to match
33
31
  * the real world data
34
32
  */
35
- updateMatrixWorld: function (force) {
36
- Object3D.prototype.updateMatrixWorld.call(this, force);
33
+
34
+
35
+ updateMatrixWorld(force) {
36
+ super.updateMatrixWorld(force);
37
37
  if (!this.motionController) return; // Cause the MotionController to poll the Gamepad for data
38
38
 
39
39
  this.motionController.updateFromGamepad(); // Update the 3D model to reflect the button, thumbstick, and touchpad state
@@ -52,22 +52,24 @@ XRControllerModel.prototype = Object.assign(Object.create(Object3D.prototype), {
52
52
 
53
53
  if (!valueNode) return; // Calculate the new properties based on the weight supplied
54
54
 
55
- if (valueNodeProperty === Constants.VisualResponseProperty.VISIBILITY) {
55
+ if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.VISIBILITY) {
56
56
  valueNode.visible = value;
57
- } else if (valueNodeProperty === Constants.VisualResponseProperty.TRANSFORM) {
58
- Quaternion.slerp(minNode.quaternion, maxNode.quaternion, valueNode.quaternion, value);
57
+ } else if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM) {
58
+ valueNode.quaternion.slerpQuaternions(minNode.quaternion, maxNode.quaternion, value);
59
59
  valueNode.position.lerpVectors(minNode.position, maxNode.position, value);
60
60
  }
61
61
  });
62
62
  });
63
63
  }
64
- });
64
+
65
+ }
65
66
  /**
66
67
  * Walks the model's tree to find the nodes needed to animate the components and
67
68
  * saves them to the motionContoller components for use in the frame loop. When
68
69
  * touchpads are found, attaches a touch dot to them.
69
70
  */
70
71
 
72
+
71
73
  function findNodes(motionController, scene) {
72
74
  // Loop through the components and find the nodes needed for each components' visual responses
73
75
  Object.values(motionController.components).forEach(component => {
@@ -77,7 +79,7 @@ function findNodes(motionController, scene) {
77
79
  visualResponses
78
80
  } = component;
79
81
 
80
- if (type === Constants.ComponentType.TOUCHPAD) {
82
+ if (type === MotionControllerConstants.ComponentType.TOUCHPAD) {
81
83
  component.touchPointNode = scene.getObjectByName(touchPointNodeName);
82
84
 
83
85
  if (component.touchPointNode) {
@@ -102,7 +104,7 @@ function findNodes(motionController, scene) {
102
104
  valueNodeProperty
103
105
  } = visualResponse; // If animating a transform, find the two nodes to be interpolated between.
104
106
 
105
- if (valueNodeProperty === Constants.VisualResponseProperty.TRANSFORM) {
107
+ if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM) {
106
108
  visualResponse.minNode = scene.getObjectByName(minNodeName);
107
109
  visualResponse.maxNode = scene.getObjectByName(maxNodeName); // If the extents cannot be found, skip this animation
108
110
 
@@ -144,8 +146,8 @@ function addAssetSceneToControllerModel(controllerModel, scene) {
144
146
  controllerModel.add(scene);
145
147
  }
146
148
 
147
- var XRControllerModelFactory = function () {
148
- function XRControllerModelFactory(gltfLoader = null) {
149
+ class XRControllerModelFactory {
150
+ constructor(gltfLoader = null) {
149
151
  this.gltfLoader = gltfLoader;
150
152
  this.path = DEFAULT_PROFILES_PATH;
151
153
  this._assetCache = {}; // If a GLTFLoader wasn't supplied to the constructor create a new one.
@@ -155,51 +157,48 @@ var XRControllerModelFactory = function () {
155
157
  }
156
158
  }
157
159
 
158
- XRControllerModelFactory.prototype = {
159
- constructor: XRControllerModelFactory,
160
- createControllerModel: function (controller) {
161
- const controllerModel = new XRControllerModel();
162
- let scene = null;
163
- controller.addEventListener('connected', event => {
164
- const xrInputSource = event.data;
165
- if (xrInputSource.targetRayMode !== 'tracked-pointer' || !xrInputSource.gamepad) return;
166
- fetchProfile(xrInputSource, this.path, DEFAULT_PROFILE).then(({
167
- profile,
168
- assetPath
169
- }) => {
170
- controllerModel.motionController = new MotionController(xrInputSource, profile, assetPath);
171
- const cachedAsset = this._assetCache[controllerModel.motionController.assetUrl];
172
-
173
- if (cachedAsset) {
174
- scene = cachedAsset.scene.clone();
175
- addAssetSceneToControllerModel(controllerModel, scene);
176
- } else {
177
- if (!this.gltfLoader) {
178
- throw new Error('GLTFLoader not set.');
179
- }
180
-
181
- this.gltfLoader.setPath('');
182
- this.gltfLoader.load(controllerModel.motionController.assetUrl, asset => {
183
- this._assetCache[controllerModel.motionController.assetUrl] = asset;
184
- scene = asset.scene.clone();
185
- addAssetSceneToControllerModel(controllerModel, scene);
186
- }, null, () => {
187
- throw new Error(`Asset ${controllerModel.motionController.assetUrl} missing or malformed.`);
188
- });
160
+ createControllerModel(controller) {
161
+ const controllerModel = new XRControllerModel();
162
+ let scene = null;
163
+ controller.addEventListener('connected', event => {
164
+ const xrInputSource = event.data;
165
+ if (xrInputSource.targetRayMode !== 'tracked-pointer' || !xrInputSource.gamepad) return;
166
+ fetchProfile(xrInputSource, this.path, DEFAULT_PROFILE).then(({
167
+ profile,
168
+ assetPath
169
+ }) => {
170
+ controllerModel.motionController = new MotionController(xrInputSource, profile, assetPath);
171
+ const cachedAsset = this._assetCache[controllerModel.motionController.assetUrl];
172
+
173
+ if (cachedAsset) {
174
+ scene = cachedAsset.scene.clone();
175
+ addAssetSceneToControllerModel(controllerModel, scene);
176
+ } else {
177
+ if (!this.gltfLoader) {
178
+ throw new Error('GLTFLoader not set.');
189
179
  }
190
- }).catch(err => {
191
- console.warn(err);
192
- });
193
- });
194
- controller.addEventListener('disconnected', () => {
195
- controllerModel.motionController = null;
196
- controllerModel.remove(scene);
197
- scene = null;
180
+
181
+ this.gltfLoader.setPath('');
182
+ this.gltfLoader.load(controllerModel.motionController.assetUrl, asset => {
183
+ this._assetCache[controllerModel.motionController.assetUrl] = asset;
184
+ scene = asset.scene.clone();
185
+ addAssetSceneToControllerModel(controllerModel, scene);
186
+ }, null, () => {
187
+ throw new Error(`Asset ${controllerModel.motionController.assetUrl} missing or malformed.`);
188
+ });
189
+ }
190
+ }).catch(err => {
191
+ console.warn(err);
198
192
  });
199
- return controllerModel;
200
- }
201
- };
202
- return XRControllerModelFactory;
203
- }();
193
+ });
194
+ controller.addEventListener('disconnected', () => {
195
+ controllerModel.motionController = null;
196
+ controllerModel.remove(scene);
197
+ scene = null;
198
+ });
199
+ return controllerModel;
200
+ }
201
+
202
+ }
204
203
 
205
204
  export { XRControllerModelFactory };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("three");class i{constructor(i,e,n,s,r){this.xrLight=i,this.renderer=e,this.lightProbe=n,this.xrWebGLBinding=null,this.estimationStartCallback=r,this.frameCallback=this.onXRFrame.bind(this);const h=e.xr.getSession();if(s&&"XRWebGLBinding"in window){const n=new t.WebGLCubeRenderTarget(16);i.environment=n.texture;const s=e.getContext();switch(h.preferredReflectionFormat){case"srgba8":s.getExtension("EXT_sRGB");break;case"rgba16f":s.getExtension("OES_texture_half_float")}this.xrWebGLBinding=new XRWebGLBinding(h,s),this.lightProbe.addEventListener("reflectionchange",(()=>{this.updateReflection()}))}h.requestAnimationFrame(this.frameCallback)}updateReflection(){const t=this.renderer.properties.get(this.xrLight.environment);if(t){const i=this.xrWebGLBinding.getReflectionCubeMap(this.lightProbe);i&&(t.__webglTexture=i)}}onXRFrame(t,i){if(!this.xrLight)return;i.session.requestAnimationFrame(this.frameCallback);const e=i.getLightEstimate(this.lightProbe);if(e){this.xrLight.lightProbe.sh.fromArray(e.sphericalHarmonicsCoefficients),this.xrLight.lightProbe.intensity=1;const t=Math.max(1,Math.max(e.primaryLightIntensity.x,Math.max(e.primaryLightIntensity.y,e.primaryLightIntensity.z)));this.xrLight.directionalLight.color.setRGB(e.primaryLightIntensity.x/t,e.primaryLightIntensity.y/t,e.primaryLightIntensity.z/t),this.xrLight.directionalLight.intensity=t,this.xrLight.directionalLight.position.copy(e.primaryLightDirection),this.estimationStartCallback&&(this.estimationStartCallback(),this.estimationStartCallback=null)}}dispose(){this.xrLight=null,this.renderer=null,this.lightProbe=null,this.xrWebGLBinding=null}}class e extends t.Group{constructor(e,n=!0){super(),this.lightProbe=new t.LightProbe,this.lightProbe.intensity=0,this.add(this.lightProbe),this.directionalLight=new t.DirectionalLight,this.directionalLight.intensity=0,this.add(this.directionalLight),this.environment=null;let s=null,r=!1;e.xr.addEventListener("sessionstart",(()=>{const t=e.xr.getSession();"requestLightProbe"in t&&t.requestLightProbe({reflectionFormat:t.preferredReflectionFormat}).then((t=>{s=new i(this,e,t,n,(()=>{r=!0,this.dispatchEvent({type:"estimationstart"})}))}))})),e.xr.addEventListener("sessionend",(()=>{s&&(s.dispose(),s=null),r&&this.dispatchEvent({type:"estimationend"})})),this.dispose=()=>{s&&(s.dispose(),s=null),this.remove(this.lightProbe),this.lightProbe=null,this.remove(this.directionalLight),this.directionalLight=null,this.environment=null}}}exports.XREstimatedLight=e;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("three");class i{constructor(i,e,n,s,r){this.xrLight=i,this.renderer=e,this.lightProbe=n,this.xrWebGLBinding=null,this.estimationStartCallback=r,this.frameCallback=this.onXRFrame.bind(this);const h=e.xr.getSession();if(s&&"XRWebGLBinding"in window){const n=new t.WebGLCubeRenderTarget(16);i.environment=n.texture;const s=e.getContext();switch(h.preferredReflectionFormat){case"srgba8":s.getExtension("EXT_sRGB");break;case"rgba16f":s.getExtension("OES_texture_half_float")}this.xrWebGLBinding=new XRWebGLBinding(h,s),this.lightProbe.addEventListener("reflectionchange",(()=>{this.updateReflection()}))}h.requestAnimationFrame(this.frameCallback)}updateReflection(){const t=this.renderer.properties.get(this.xrLight.environment);if(t){const i=this.xrWebGLBinding.getReflectionCubeMap(this.lightProbe);i&&(t.__webglTexture=i,this.xrLight.environment.needsPMREMUpdate=!0)}}onXRFrame(t,i){if(!this.xrLight)return;i.session.requestAnimationFrame(this.frameCallback);const e=i.getLightEstimate(this.lightProbe);if(e){this.xrLight.lightProbe.sh.fromArray(e.sphericalHarmonicsCoefficients),this.xrLight.lightProbe.intensity=1;const t=Math.max(1,Math.max(e.primaryLightIntensity.x,Math.max(e.primaryLightIntensity.y,e.primaryLightIntensity.z)));this.xrLight.directionalLight.color.setRGB(e.primaryLightIntensity.x/t,e.primaryLightIntensity.y/t,e.primaryLightIntensity.z/t),this.xrLight.directionalLight.intensity=t,this.xrLight.directionalLight.position.copy(e.primaryLightDirection),this.estimationStartCallback&&(this.estimationStartCallback(),this.estimationStartCallback=null)}}dispose(){this.xrLight=null,this.renderer=null,this.lightProbe=null,this.xrWebGLBinding=null}}class e extends t.Group{constructor(e,n=!0){super(),this.lightProbe=new t.LightProbe,this.lightProbe.intensity=0,this.add(this.lightProbe),this.directionalLight=new t.DirectionalLight,this.directionalLight.intensity=0,this.add(this.directionalLight),this.environment=null;let s=null,r=!1;e.xr.addEventListener("sessionstart",(()=>{const t=e.xr.getSession();"requestLightProbe"in t&&t.requestLightProbe({reflectionFormat:t.preferredReflectionFormat}).then((t=>{s=new i(this,e,t,n,(()=>{r=!0,this.dispatchEvent({type:"estimationstart"})}))}))})),e.xr.addEventListener("sessionend",(()=>{s&&(s.dispose(),s=null),r&&this.dispatchEvent({type:"estimationend"})})),this.dispose=()=>{s&&(s.dispose(),s=null),this.remove(this.lightProbe),this.lightProbe=null,this.remove(this.directionalLight),this.directionalLight=null,this.environment=null}}}exports.XREstimatedLight=e;
@@ -46,6 +46,7 @@ class SessionLightProbe {
46
46
 
47
47
  if (cubeMap) {
48
48
  textureProperties.__webglTexture = cubeMap;
49
+ this.xrLight.environment.needsPMREMUpdate = true;
49
50
  }
50
51
  }
51
52
  }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../loaders/GLTFLoader.cjs.js");require("three");exports.XRHandMeshModel=class{constructor(i,n,a,t){this.controller=n,this.handModel=i,this.bones=[];const r=new e.GLTFLoader;r.setPath(a||"https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/"),r.load(`${t}.glb`,(e=>{const i=e.scene.children[0];this.handModel.add(i);const n=i.getObjectByProperty("type","SkinnedMesh");n.frustumCulled=!1,n.castShadow=!0,n.receiveShadow=!0;["wrist","thumb-metacarpal","thumb-phalanx-proximal","thumb-phalanx-distal","thumb-tip","index-finger-metacarpal","index-finger-phalanx-proximal","index-finger-phalanx-intermediate","index-finger-phalanx-distal","index-finger-tip","middle-finger-metacarpal","middle-finger-phalanx-proximal","middle-finger-phalanx-intermediate","middle-finger-phalanx-distal","middle-finger-tip","ring-finger-metacarpal","ring-finger-phalanx-proximal","ring-finger-phalanx-intermediate","ring-finger-phalanx-distal","ring-finger-tip","pinky-finger-metacarpal","pinky-finger-phalanx-proximal","pinky-finger-phalanx-intermediate","pinky-finger-phalanx-distal","pinky-finger-tip"].forEach((e=>{const n=i.getObjectByName(e);void 0!==n?n.jointName=e:console.warn(`Couldn't find ${e} in ${t} hand mesh`),this.bones.push(n)}))}))}updateMesh(){const e=this.controller.joints;for(let i=0;i<this.bones.length;i++){const n=this.bones[i];if(n){const i=e[n.jointName];if(i.visible){const e=i.position;n.position.copy(e),n.quaternion.copy(i.quaternion)}}}}};
@@ -0,0 +1,11 @@
1
+ import { Object3D } from 'three';
2
+
3
+ export class XRHandMeshModel {
4
+ controller: Object3D;
5
+ handModel: Object3D;
6
+ bones: Object3D[];
7
+
8
+ constructor(handModel: Object3D, controller: Object3D, path: string, handedness: string);
9
+
10
+ updateMesh(): void;
11
+ }
@@ -0,0 +1,55 @@
1
+ import { GLTFLoader } from '../loaders/GLTFLoader.js';
2
+
3
+ const DEFAULT_HAND_PROFILE_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/';
4
+
5
+ class XRHandMeshModel {
6
+ constructor(handModel, controller, path, handedness) {
7
+ this.controller = controller;
8
+ this.handModel = handModel;
9
+ this.bones = [];
10
+ const loader = new GLTFLoader();
11
+ loader.setPath(path || DEFAULT_HAND_PROFILE_PATH);
12
+ loader.load(`${handedness}.glb`, gltf => {
13
+ const object = gltf.scene.children[0];
14
+ this.handModel.add(object);
15
+ const mesh = object.getObjectByProperty('type', 'SkinnedMesh');
16
+ mesh.frustumCulled = false;
17
+ mesh.castShadow = true;
18
+ mesh.receiveShadow = true;
19
+ const joints = ['wrist', 'thumb-metacarpal', 'thumb-phalanx-proximal', 'thumb-phalanx-distal', 'thumb-tip', 'index-finger-metacarpal', 'index-finger-phalanx-proximal', 'index-finger-phalanx-intermediate', 'index-finger-phalanx-distal', 'index-finger-tip', 'middle-finger-metacarpal', 'middle-finger-phalanx-proximal', 'middle-finger-phalanx-intermediate', 'middle-finger-phalanx-distal', 'middle-finger-tip', 'ring-finger-metacarpal', 'ring-finger-phalanx-proximal', 'ring-finger-phalanx-intermediate', 'ring-finger-phalanx-distal', 'ring-finger-tip', 'pinky-finger-metacarpal', 'pinky-finger-phalanx-proximal', 'pinky-finger-phalanx-intermediate', 'pinky-finger-phalanx-distal', 'pinky-finger-tip'];
20
+ joints.forEach(jointName => {
21
+ const bone = object.getObjectByName(jointName);
22
+
23
+ if (bone !== undefined) {
24
+ bone.jointName = jointName;
25
+ } else {
26
+ console.warn(`Couldn't find ${jointName} in ${handedness} hand mesh`);
27
+ }
28
+
29
+ this.bones.push(bone);
30
+ });
31
+ });
32
+ }
33
+
34
+ updateMesh() {
35
+ // XR Joints
36
+ const XRJoints = this.controller.joints;
37
+
38
+ for (let i = 0; i < this.bones.length; i++) {
39
+ const bone = this.bones[i];
40
+
41
+ if (bone) {
42
+ const XRJoint = XRJoints[bone.jointName];
43
+
44
+ if (XRJoint.visible) {
45
+ const position = XRJoint.position;
46
+ bone.position.copy(position);
47
+ bone.quaternion.copy(XRJoint.quaternion); // bone.scale.setScalar( XRJoint.jointRadius || defaultRadius );
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ }
54
+
55
+ export { XRHandMeshModel };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),t=require("./XRHandPrimitiveModel.cjs.js"),o=require("./XRHandOculusMeshModel.cjs.js");function r(t){e.Object3D.call(this),this.controller=t,this.motionController=null,this.envMap=null,this.mesh=null}require("../loaders/FBXLoader.cjs.js"),require("fflate"),require("../curves/NURBSCurve.cjs.js"),require("../curves/NURBSUtils.cjs.js"),r.prototype=Object.assign(Object.create(e.Object3D.prototype),{constructor:r,updateMatrixWorld:function(t){e.Object3D.prototype.updateMatrixWorld.call(this,t),this.motionController&&this.motionController.updateMesh()}});const n=function(){function e(){this.path=""}return e.prototype={constructor:e,setPath:function(e){return this.path=e,this},createHandModel:function(e,n,s){const i=new r(e);return e.addEventListener("connected",(r=>{const l=r.data;l.hand&&!i.motionController&&(i.visible=!0,i.xrInputSource=l,void 0===n||"spheres"===n?i.motionController=new t.XRHandPrimitiveModel(i,e,this.path,l.handedness,{primitive:"sphere"}):"boxes"===n?i.motionController=new t.XRHandPrimitiveModel(i,e,this.path,l.handedness,{primitive:"box"}):"oculus"===n&&(i.motionController=new o.XRHandOculusMeshModel(i,e,this.path,l.handedness,s)))})),e.addEventListener("disconnected",(()=>{})),i}},e}();exports.XRHandModelFactory=n;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),t=require("./XRHandPrimitiveModel.cjs.js"),r=require("./XRHandMeshModel.cjs.js");require("../loaders/GLTFLoader.cjs.js");class o extends e.Object3D{constructor(e){super(),this.controller=e,this.motionController=null,this.envMap=null,this.mesh=null}updateMatrixWorld(e){super.updateMatrixWorld(e),this.motionController&&this.motionController.updateMesh()}}exports.XRHandModelFactory=class{constructor(){this.path=null}setPath(e){return this.path=e,this}createHandModel(e,n){const s=new o(e);return e.addEventListener("connected",(o=>{const i=o.data;i.hand&&!s.motionController&&(s.xrInputSource=i,void 0===n||"spheres"===n?s.motionController=new t.XRHandPrimitiveModel(s,e,this.path,i.handedness,{primitive:"sphere"}):"boxes"===n?s.motionController=new t.XRHandPrimitiveModel(s,e,this.path,i.handedness,{primitive:"box"}):"mesh"===n&&(s.motionController=new r.XRHandMeshModel(s,e,this.path,i.handedness)))})),e.addEventListener("disconnected",(()=>{})),s}};
@@ -1,14 +1,14 @@
1
1
  import { Group, Object3D } from 'three';
2
2
 
3
3
  import { XRHandPrimitiveModel, XRHandPrimitiveModelOptions } from './XRHandPrimitiveModel';
4
- import { XRHandOculusMeshModel, XRHandOculusMeshModelOptions } from './XRHandOculusMeshModel';
4
+ import { XRHandMeshModel } from './XRHandMeshModel';
5
5
 
6
6
  export type XRHandModelHandedness = 'left' | 'right';
7
7
 
8
8
  export class XRHandModel extends Object3D {
9
9
  constructor();
10
10
 
11
- motionController: XRHandPrimitiveModel | XRHandOculusMeshModel;
11
+ motionController: XRHandPrimitiveModel | XRHandMeshModel;
12
12
  }
13
13
 
14
14
  export class XRHandModelFactory {
@@ -20,6 +20,6 @@ export class XRHandModelFactory {
20
20
  createHandModel(
21
21
  controller: Group,
22
22
  profile?: 'spheres' | 'boxes' | 'oculus',
23
- options?: XRHandPrimitiveModelOptions | XRHandOculusMeshModelOptions,
23
+ options?: XRHandPrimitiveModelOptions,
24
24
  ): XRHandModel;
25
25
  }
@@ -1,67 +1,64 @@
1
1
  import { Object3D } from 'three';
2
2
  import { XRHandPrimitiveModel } from './XRHandPrimitiveModel.js';
3
- import { XRHandOculusMeshModel } from './XRHandOculusMeshModel.js';
3
+ import { XRHandMeshModel } from './XRHandMeshModel.js';
4
4
 
5
- function XRHandModel(controller) {
6
- Object3D.call(this);
7
- this.controller = controller;
8
- this.motionController = null;
9
- this.envMap = null;
10
- this.mesh = null;
11
- }
5
+ class XRHandModel extends Object3D {
6
+ constructor(controller) {
7
+ super();
8
+ this.controller = controller;
9
+ this.motionController = null;
10
+ this.envMap = null;
11
+ this.mesh = null;
12
+ }
12
13
 
13
- XRHandModel.prototype = Object.assign(Object.create(Object3D.prototype), {
14
- constructor: XRHandModel,
15
- updateMatrixWorld: function (force) {
16
- Object3D.prototype.updateMatrixWorld.call(this, force);
14
+ updateMatrixWorld(force) {
15
+ super.updateMatrixWorld(force);
17
16
 
18
17
  if (this.motionController) {
19
18
  this.motionController.updateMesh();
20
19
  }
21
20
  }
22
- });
23
21
 
24
- const XRHandModelFactory = function () {
25
- function XRHandModelFactory() {
26
- this.path = '';
22
+ }
23
+
24
+ class XRHandModelFactory {
25
+ constructor() {
26
+ this.path = null;
27
+ }
28
+
29
+ setPath(path) {
30
+ this.path = path;
31
+ return this;
27
32
  }
28
33
 
29
- XRHandModelFactory.prototype = {
30
- constructor: XRHandModelFactory,
31
- setPath: function (path) {
32
- this.path = path;
33
- return this;
34
- },
35
- createHandModel: function (controller, profile, options) {
36
- const handModel = new XRHandModel(controller);
37
- controller.addEventListener('connected', event => {
38
- const xrInputSource = event.data;
34
+ createHandModel(controller, profile) {
35
+ const handModel = new XRHandModel(controller);
36
+ controller.addEventListener('connected', event => {
37
+ const xrInputSource = event.data;
39
38
 
40
- if (xrInputSource.hand && !handModel.motionController) {
41
- handModel.visible = true;
42
- handModel.xrInputSource = xrInputSource; // @todo Detect profile if not provided
39
+ if (xrInputSource.hand && !handModel.motionController) {
40
+ handModel.xrInputSource = xrInputSource; // @todo Detect profile if not provided
43
41
 
44
- if (profile === undefined || profile === 'spheres') {
45
- handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, {
46
- primitive: 'sphere'
47
- });
48
- } else if (profile === 'boxes') {
49
- handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, {
50
- primitive: 'box'
51
- });
52
- } else if (profile === 'oculus') {
53
- handModel.motionController = new XRHandOculusMeshModel(handModel, controller, this.path, xrInputSource.handedness, options);
54
- }
42
+ if (profile === undefined || profile === 'spheres') {
43
+ handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, {
44
+ primitive: 'sphere'
45
+ });
46
+ } else if (profile === 'boxes') {
47
+ handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, {
48
+ primitive: 'box'
49
+ });
50
+ } else if (profile === 'mesh') {
51
+ handModel.motionController = new XRHandMeshModel(handModel, controller, this.path, xrInputSource.handedness);
55
52
  }
56
- });
57
- controller.addEventListener('disconnected', () => {// handModel.motionController = null;
58
- // handModel.remove( scene );
59
- // scene = null;
60
- });
61
- return handModel;
62
- }
63
- };
64
- return XRHandModelFactory;
65
- }();
53
+ }
54
+ });
55
+ controller.addEventListener('disconnected', () => {// handModel.motionController = null;
56
+ // handModel.remove( scene );
57
+ // scene = null;
58
+ });
59
+ return handModel;
60
+ }
61
+
62
+ }
66
63
 
67
64
  export { XRHandModelFactory };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");exports.XRHandPrimitiveModel=class{constructor(i,n,a,r,t){if(this.controller=n,this.handModel=i,this.envMap=null,this.handMesh=new e.Group,this.handModel.add(this.handMesh),window.XRHand){let i;t&&t.primitive&&"sphere"!==t.primitive?"box"===t.primitive&&(i=new e.BoxGeometry(1,1,1)):i=new e.SphereGeometry(1,10,10);const n=new e.MeshStandardMaterial({color:16777215,roughness:1,metalness:0}),a=new e.MeshStandardMaterial({color:10066329,roughness:1,metalness:0}),r=["wrist","thumb-metacarpal","thumb-phalanx-proximal","thumb-phalanx-distal","thumb-tip","index-finger-metacarpal","index-finger-phalanx-proximal","index-finger-phalanx-intermediate","index-finger-phalanx-distal","index-finger-tip","middle-finger-metacarpal","middle-finger-phalanx-proximal","middle-finger-phalanx-intermediate","middle-finger-phalanx-distal","middle-finger-tip","ring-finger-metacarpal","ring-finger-phalanx-proximal","ring-finger-phalanx-intermediate","ring-finger-phalanx-distal","ring-finger-tip","pinky-finger-metacarpal","pinky-finger-phalanx-proximal","pinky-finger-phalanx-intermediate","pinky-finger-phalanx-distal","pinky-finger-tip"];for(let t of r){var l=new e.Mesh(i,-1!==t.indexOf("tip")?a:n);l.castShadow=!0,l.receiveShadow=!0,l.jointName=t,this.handMesh.add(l)}}}updateMesh(){const e=this.handMesh.children,i=this.controller.joints;for(let n=0;n<e.length;n++){const a=e[n],r=i[a.jointName];r.visible&&(a.position.copy(r.position),a.quaternion.copy(r.quaternion),a.scale.setScalar(r.jointRadius||.008)),a.visible=r.visible}}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");const i=new e.Matrix4,n=new e.Vector3;exports.XRHandPrimitiveModel=class{constructor(i,n,a,t,r){let s;this.controller=n,this.handModel=i,this.envMap=null,r&&r.primitive&&"sphere"!==r.primitive?"box"===r.primitive&&(s=new e.BoxGeometry(1,1,1)):s=new e.SphereGeometry(1,10,10);const h=new e.MeshStandardMaterial;this.handMesh=new e.InstancedMesh(s,h,30),this.handMesh.instanceMatrix.setUsage(e.DynamicDrawUsage),this.handMesh.castShadow=!0,this.handMesh.receiveShadow=!0,this.handModel.add(this.handMesh),this.joints=["wrist","thumb-metacarpal","thumb-phalanx-proximal","thumb-phalanx-distal","thumb-tip","index-finger-metacarpal","index-finger-phalanx-proximal","index-finger-phalanx-intermediate","index-finger-phalanx-distal","index-finger-tip","middle-finger-metacarpal","middle-finger-phalanx-proximal","middle-finger-phalanx-intermediate","middle-finger-phalanx-distal","middle-finger-tip","ring-finger-metacarpal","ring-finger-phalanx-proximal","ring-finger-phalanx-intermediate","ring-finger-phalanx-distal","ring-finger-tip","pinky-finger-metacarpal","pinky-finger-phalanx-proximal","pinky-finger-phalanx-intermediate","pinky-finger-phalanx-distal","pinky-finger-tip"]}updateMesh(){const e=this.controller.joints;let a=0;for(let t=0;t<this.joints.length;t++){const r=e[this.joints[t]];r.visible&&(n.setScalar(r.jointRadius||.008),i.compose(r.position,r.quaternion,n),this.handMesh.setMatrixAt(t,i),a++)}this.handMesh.count=a,this.handMesh.instanceMatrix.needsUpdate=!0}};
@@ -3,7 +3,7 @@ import { Group, Texture } from 'three';
3
3
  import { XRHandModel, XRHandModelHandedness } from './XRHandModelFactory';
4
4
 
5
5
  export interface XRHandPrimitiveModelOptions {
6
- primitive?: 'sphere' | 'box';
6
+ primitive?: 'sphere' | 'box' | undefined;
7
7
  }
8
8
 
9
9
  export class XRHandPrimitiveModel {
@@ -1,62 +1,52 @@
1
- import { Group, SphereGeometry, BoxGeometry, MeshStandardMaterial, Mesh } from 'three';
1
+ import { Matrix4, Vector3, SphereGeometry, BoxGeometry, MeshStandardMaterial, InstancedMesh, DynamicDrawUsage } from 'three';
2
+
3
+ const _matrix = new Matrix4();
4
+
5
+ const _vector = new Vector3();
2
6
 
3
7
  class XRHandPrimitiveModel {
4
8
  constructor(handModel, controller, path, handedness, options) {
5
9
  this.controller = controller;
6
10
  this.handModel = handModel;
7
11
  this.envMap = null;
8
- this.handMesh = new Group();
9
- this.handModel.add(this.handMesh);
12
+ let geometry;
10
13
 
11
- if (window.XRHand) {
12
- let geometry;
13
-
14
- if (!options || !options.primitive || options.primitive === 'sphere') {
15
- geometry = new SphereGeometry(1, 10, 10);
16
- } else if (options.primitive === 'box') {
17
- geometry = new BoxGeometry(1, 1, 1);
18
- }
14
+ if (!options || !options.primitive || options.primitive === 'sphere') {
15
+ geometry = new SphereGeometry(1, 10, 10);
16
+ } else if (options.primitive === 'box') {
17
+ geometry = new BoxGeometry(1, 1, 1);
18
+ }
19
19
 
20
- const jointMaterial = new MeshStandardMaterial({
21
- color: 0xffffff,
22
- roughness: 1,
23
- metalness: 0
24
- });
25
- const tipMaterial = new MeshStandardMaterial({
26
- color: 0x999999,
27
- roughness: 1,
28
- metalness: 0
29
- });
30
- const joints = ['wrist', 'thumb-metacarpal', 'thumb-phalanx-proximal', 'thumb-phalanx-distal', 'thumb-tip', 'index-finger-metacarpal', 'index-finger-phalanx-proximal', 'index-finger-phalanx-intermediate', 'index-finger-phalanx-distal', 'index-finger-tip', 'middle-finger-metacarpal', 'middle-finger-phalanx-proximal', 'middle-finger-phalanx-intermediate', 'middle-finger-phalanx-distal', 'middle-finger-tip', 'ring-finger-metacarpal', 'ring-finger-phalanx-proximal', 'ring-finger-phalanx-intermediate', 'ring-finger-phalanx-distal', 'ring-finger-tip', 'pinky-finger-metacarpal', 'pinky-finger-phalanx-proximal', 'pinky-finger-phalanx-intermediate', 'pinky-finger-phalanx-distal', 'pinky-finger-tip'];
20
+ const material = new MeshStandardMaterial();
21
+ this.handMesh = new InstancedMesh(geometry, material, 30);
22
+ this.handMesh.instanceMatrix.setUsage(DynamicDrawUsage); // will be updated every frame
31
23
 
32
- for (let jointName of joints) {
33
- var cube = new Mesh(geometry, jointName.indexOf('tip') !== -1 ? tipMaterial : jointMaterial);
34
- cube.castShadow = true;
35
- cube.receiveShadow = true;
36
- cube.jointName = jointName;
37
- this.handMesh.add(cube);
38
- }
39
- }
24
+ this.handMesh.castShadow = true;
25
+ this.handMesh.receiveShadow = true;
26
+ this.handModel.add(this.handMesh);
27
+ this.joints = ['wrist', 'thumb-metacarpal', 'thumb-phalanx-proximal', 'thumb-phalanx-distal', 'thumb-tip', 'index-finger-metacarpal', 'index-finger-phalanx-proximal', 'index-finger-phalanx-intermediate', 'index-finger-phalanx-distal', 'index-finger-tip', 'middle-finger-metacarpal', 'middle-finger-phalanx-proximal', 'middle-finger-phalanx-intermediate', 'middle-finger-phalanx-distal', 'middle-finger-tip', 'ring-finger-metacarpal', 'ring-finger-phalanx-proximal', 'ring-finger-phalanx-intermediate', 'ring-finger-phalanx-distal', 'ring-finger-tip', 'pinky-finger-metacarpal', 'pinky-finger-phalanx-proximal', 'pinky-finger-phalanx-intermediate', 'pinky-finger-phalanx-distal', 'pinky-finger-tip'];
40
28
  }
41
29
 
42
30
  updateMesh() {
43
31
  const defaultRadius = 0.008;
44
- const objects = this.handMesh.children; // XR Joints
32
+ const joints = this.controller.joints;
33
+ let count = 0;
45
34
 
46
- const XRJoints = this.controller.joints;
35
+ for (let i = 0; i < this.joints.length; i++) {
36
+ const joint = joints[this.joints[i]];
47
37
 
48
- for (let i = 0; i < objects.length; i++) {
49
- const jointMesh = objects[i];
50
- const XRJoint = XRJoints[jointMesh.jointName];
38
+ if (joint.visible) {
39
+ _vector.setScalar(joint.jointRadius || defaultRadius);
51
40
 
52
- if (XRJoint.visible) {
53
- jointMesh.position.copy(XRJoint.position);
54
- jointMesh.quaternion.copy(XRJoint.quaternion);
55
- jointMesh.scale.setScalar(XRJoint.jointRadius || defaultRadius);
56
- }
41
+ _matrix.compose(joint.position, joint.quaternion, _vector);
57
42
 
58
- jointMesh.visible = XRJoint.visible;
43
+ this.handMesh.setMatrixAt(i, _matrix);
44
+ count++;
45
+ }
59
46
  }
47
+
48
+ this.handMesh.count = count;
49
+ this.handMesh.instanceMatrix.needsUpdate = true;
60
50
  }
61
51
 
62
52
  }
package/csm/Frustum.d.ts DELETED
@@ -1,16 +0,0 @@
1
- export default class Frustum {
2
- constructor(data: any);
3
- vertices: {
4
- near: any[];
5
- far: any[];
6
- };
7
- setFromProjectionMatrix(
8
- projectionMatrix: any,
9
- maxFar: any,
10
- ): {
11
- near: any[];
12
- far: any[];
13
- };
14
- split(breaks: any, target: any): void;
15
- toSpace(cameraMatrix: any, target: any): void;
16
- }
package/csm/Shader.d.ts DELETED
@@ -1,6 +0,0 @@
1
- declare namespace _default {
2
- const lights_fragment_begin: string;
3
- const lights_pars_begin: string;
4
- }
5
-
6
- export default _default;
@@ -1,19 +0,0 @@
1
- import { Mesh, Loader, LoadingManager } from 'three';
2
-
3
- export interface XResult {
4
- animations: object[];
5
- models: Mesh[];
6
- }
7
-
8
- export class XLoader extends Loader {
9
- constructor(manager?: LoadingManager);
10
-
11
- load(
12
- url: string,
13
- onLoad: (object: XResult) => void,
14
- onProgress?: (event: ProgressEvent) => void,
15
- onError?: (event: ErrorEvent) => void,
16
- ): void;
17
- loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<XResult>;
18
- parse(data: ArrayBuffer | string, onLoad: (object: object) => void): object;
19
- }
@@ -1,13 +0,0 @@
1
- import { Uniform } from 'three';
2
-
3
- export const FresnelShader: {
4
- uniforms: {
5
- mRefractionRatio: Uniform;
6
- mFresnelBias: Uniform;
7
- mFresnelPower: Uniform;
8
- mFresnelScale: Uniform;
9
- tCube: Uniform;
10
- };
11
- vertexShader: string;
12
- fragmentShader: string;
13
- };