@needle-tools/engine 2.38.0-pre → 2.38.0-pre.2

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 (53) hide show
  1. package/dist/needle-engine.d.ts +38 -6
  2. package/dist/needle-engine.js +351 -351
  3. package/dist/needle-engine.js.map +4 -4
  4. package/dist/needle-engine.min.js +19 -19
  5. package/dist/needle-engine.min.js.map +4 -4
  6. package/lib/engine/engine_physics.d.ts +9 -0
  7. package/lib/engine/engine_physics.js +34 -14
  8. package/lib/engine/engine_physics.js.map +1 -1
  9. package/lib/engine/engine_setup.d.ts +5 -5
  10. package/lib/engine/engine_setup.js +20 -20
  11. package/lib/engine/engine_setup.js.map +1 -1
  12. package/lib/engine/engine_types.d.ts +2 -0
  13. package/lib/engine/engine_types.js.map +1 -1
  14. package/lib/engine-components/Camera.d.ts +1 -0
  15. package/lib/engine-components/Camera.js +7 -1
  16. package/lib/engine-components/Camera.js.map +1 -1
  17. package/lib/engine-components/CharacterController.d.ts +3 -0
  18. package/lib/engine-components/CharacterController.js +13 -1
  19. package/lib/engine-components/CharacterController.js.map +1 -1
  20. package/lib/engine-components/Collider.d.ts +0 -1
  21. package/lib/engine-components/Collider.js +0 -3
  22. package/lib/engine-components/Collider.js.map +1 -1
  23. package/lib/engine-components/Joints.d.ts +15 -0
  24. package/lib/engine-components/Joints.js +42 -0
  25. package/lib/engine-components/Joints.js.map +1 -0
  26. package/lib/engine-components/OrbitControls.js +1 -1
  27. package/lib/engine-components/OrbitControls.js.map +1 -1
  28. package/lib/engine-components/codegen/components.d.ts +1 -0
  29. package/lib/engine-components/codegen/components.js +1 -0
  30. package/lib/engine-components/codegen/components.js.map +1 -1
  31. package/package.json +2 -2
  32. package/src/engine/codegen/register_types.js +4 -0
  33. package/src/engine/engine_physics.ts +44 -17
  34. package/src/engine/engine_setup.ts +27 -28
  35. package/src/engine/engine_types.ts +2 -0
  36. package/src/engine-components/Camera.ts +6 -1
  37. package/src/engine-components/CharacterController.ts +15 -1
  38. package/src/engine-components/Collider.ts +0 -4
  39. package/src/engine-components/Joints.ts +40 -0
  40. package/src/engine-components/OrbitControls.ts +1 -1
  41. package/src/engine-components/codegen/components.ts +1 -0
  42. package/src/include/console/ConsoleReroute.js +79 -0
  43. package/src/include/draco/draco_decoder.js +48 -0
  44. package/src/include/draco/draco_decoder.wasm +0 -0
  45. package/src/include/ktx2/basis_transcoder.js +21 -0
  46. package/src/include/ktx2/basis_transcoder.wasm +0 -0
  47. package/src/include/three/ARButton.js +208 -0
  48. package/src/include/three/DragControls.js +232 -0
  49. package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +67 -0
  50. package/src/include/three/VRButton.js +196 -0
  51. package/src/include/three-mesh-ui-assets/backspace.png +0 -0
  52. package/src/include/three-mesh-ui-assets/enter.png +0 -0
  53. package/src/include/three-mesh-ui-assets/shift.png +0 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Mesh GPU Instancing extension
3
+ *
4
+ * Specification: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing
5
+ */
6
+
7
+ import {
8
+ BufferAttribute,
9
+ Matrix4,
10
+ Vector3,
11
+ Quaternion,
12
+ } from 'three';
13
+
14
+ export default class GLTFMeshGPUInstancingExtension {
15
+
16
+ constructor( writer ) {
17
+
18
+ this.writer = writer;
19
+ this.name = 'EXT_mesh_gpu_instancing';
20
+
21
+ }
22
+
23
+ writeNode( node, nodeDef ) {
24
+
25
+ if(node.constructor.name !== "InstancedMesh") return;
26
+
27
+ const writer = this.writer;
28
+ const extensionsUsed = writer.extensionsUsed;
29
+ const extensionDef = {};
30
+
31
+ nodeDef.extensions = nodeDef.extensions || {};
32
+ nodeDef.extensions[ this.name ] = extensionDef;
33
+
34
+ let mat = new Matrix4();
35
+ const pos0 = new Array();
36
+ const rot0 = new Array();
37
+ const scl0 = new Array();
38
+
39
+ for(let i = 0; i < node.count; i++)
40
+ {
41
+ node.getMatrixAt(i, mat);
42
+
43
+ let p = new Vector3();
44
+ let r = new Quaternion();
45
+ let s = new Vector3();
46
+
47
+ mat.decompose(p,r,s);
48
+
49
+ pos0.push(p.x,p.y,p.z);
50
+ rot0.push(r.x,r.y,r.z,r.w);
51
+ scl0.push(s.x,s.y,s.z);
52
+ };
53
+
54
+ const pos = new Float32Array(pos0);
55
+ const rot = new Float32Array(rot0);
56
+ const scl = new Float32Array(scl0);
57
+
58
+ extensionDef.attributes = {
59
+ "TRANSLATION" : writer.processAccessor( new BufferAttribute( pos, 3 ) ),
60
+ "ROTATION" : writer.processAccessor( new BufferAttribute( rot, 4 ) ),
61
+ "SCALE" : writer.processAccessor( new BufferAttribute( scl, 3 ) ),
62
+ };
63
+
64
+ extensionsUsed[ this.name ] = true;
65
+
66
+ }
67
+ }
@@ -0,0 +1,196 @@
1
+ class VRButton {
2
+
3
+ static createButton( renderer, options ) {
4
+
5
+ if ( options ) {
6
+
7
+ console.error( 'THREE.VRButton: The "options" parameter has been removed. Please set the reference space type via renderer.xr.setReferenceSpaceType() instead.' );
8
+
9
+ }
10
+
11
+ const button = document.createElement( 'button' );
12
+
13
+ function showEnterVR( /*device*/ ) {
14
+
15
+ let currentSession = null;
16
+
17
+ async function onSessionStarted( session ) {
18
+
19
+ session.addEventListener( 'end', onSessionEnded );
20
+
21
+ // console.log("Session started, features: ",session)
22
+
23
+ await renderer.xr.setSession( session );
24
+ button.textContent = 'EXIT VR';
25
+
26
+ currentSession = session;
27
+
28
+ }
29
+
30
+ function onSessionEnded( /*event*/ ) {
31
+
32
+ currentSession.removeEventListener( 'end', onSessionEnded );
33
+
34
+ button.textContent = 'ENTER VR';
35
+
36
+ currentSession = null;
37
+
38
+ }
39
+
40
+ //
41
+
42
+ button.style.display = '';
43
+
44
+ button.style.cursor = 'pointer';
45
+ button.style.left = 'calc(50% - 50px)';
46
+ button.style.width = '100px';
47
+
48
+ button.textContent = 'ENTER VR';
49
+
50
+ button.onmouseenter = function () {
51
+
52
+ button.style.opacity = '1.0';
53
+
54
+ };
55
+
56
+ button.onmouseleave = function () {
57
+
58
+ button.style.opacity = '0.5';
59
+
60
+ };
61
+
62
+ button.onclick = function () {
63
+
64
+ if ( currentSession === null ) {
65
+
66
+ // WebXR's requestReferenceSpace only works if the corresponding feature
67
+ // was requested at session creation time. For simplicity, just ask for
68
+ // the interesting ones as optional features, but be aware that the
69
+ // requestReferenceSpace call will fail if it turns out to be unavailable.
70
+ // ('local' is always available for immersive sessions and doesn't need to
71
+ // be requested separately.)
72
+
73
+ const sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor', 'hand-tracking', 'high-fixed-foveation-level', 'layers' ] };
74
+ navigator.xr.requestSession( 'immersive-vr', sessionInit ).then( onSessionStarted );
75
+
76
+ } else {
77
+
78
+ currentSession.end();
79
+
80
+ }
81
+
82
+ };
83
+
84
+ }
85
+
86
+ function disableButton() {
87
+
88
+ button.disabled = true;
89
+
90
+ button.style.display = '';
91
+
92
+ button.style.cursor = 'auto';
93
+ button.style.left = 'calc(50% - 75px)';
94
+ button.style.width = '150px';
95
+
96
+ button.onmouseenter = null;
97
+ button.onmouseleave = null;
98
+
99
+ button.onclick = null;
100
+
101
+ }
102
+
103
+ function showWebXRNotFound() {
104
+
105
+ disableButton();
106
+
107
+ button.textContent = 'VR NOT SUPPORTED';
108
+
109
+ }
110
+
111
+ function stylizeElement( element ) {
112
+
113
+ element.style.position = 'absolute';
114
+ element.style.bottom = '20px';
115
+ element.style.padding = '12px 6px';
116
+ element.style.border = '1px solid #fff';
117
+ element.style.borderRadius = '4px';
118
+ element.style.background = 'rgba(0,0,0,0.1)';
119
+ element.style.color = '#fff';
120
+ element.style.font = 'normal 13px sans-serif';
121
+ element.style.textAlign = 'center';
122
+ element.style.opacity = '0.5';
123
+ element.style.outline = 'none';
124
+ element.style.zIndex = '999';
125
+
126
+ }
127
+
128
+ if ( 'xr' in navigator ) {
129
+
130
+ button.id = 'VRButton';
131
+ button.style.display = 'none';
132
+
133
+ stylizeElement( button );
134
+
135
+ navigator.xr.isSessionSupported( 'immersive-vr' ).then( function ( supported ) {
136
+
137
+ supported ? showEnterVR() : showWebXRNotFound();
138
+
139
+ if(VRButton.xrSessionIsGranted){
140
+ console.log("XR session is granted - will enter immersive web now")
141
+ button.click();
142
+ }
143
+
144
+ } );
145
+
146
+ return button;
147
+
148
+ } else {
149
+
150
+ const message = document.createElement( 'a' );
151
+
152
+ if ( window.isSecureContext === false ) {
153
+
154
+ message.href = document.location.href.replace( /^http:/, 'https:' );
155
+ message.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message
156
+
157
+ } else {
158
+
159
+ message.href = 'https://immersiveweb.dev/';
160
+ message.innerHTML = 'WEBXR NOT AVAILABLE';
161
+
162
+ }
163
+
164
+ message.style.left = 'calc(50% - 90px)';
165
+ message.style.width = '180px';
166
+ message.style.textDecoration = 'none';
167
+
168
+ stylizeElement( message );
169
+
170
+ return message;
171
+
172
+ }
173
+
174
+ }
175
+
176
+
177
+ static xrSessionIsGranted = false;
178
+
179
+ static registerSessionGrantedListener() {
180
+ if ('xr' in navigator) {
181
+ try {
182
+ navigator.xr.addEventListener('sessiongranted', () => {
183
+ console.log("Received session granted event");
184
+ VRButton.xrSessionIsGranted = true;
185
+ });
186
+ }
187
+ catch(error) {
188
+ console.error(error);
189
+ }
190
+ }
191
+ }
192
+ }
193
+
194
+ VRButton.registerSessionGrantedListener();
195
+
196
+ export { VRButton };