@needle-tools/engine 4.5.0-alpha.3 → 4.5.0-alpha.5

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 (31) hide show
  1. package/CHANGELOG.md +22 -2
  2. package/dist/{needle-engine.bundle-56f095f1.light.min.js → needle-engine.bundle-3a87a331.light.min.js} +89 -88
  3. package/dist/{needle-engine.bundle-ef2b8438.umd.cjs → needle-engine.bundle-6f1f506d.umd.cjs} +83 -82
  4. package/dist/{needle-engine.bundle-1b8f44f4.js → needle-engine.bundle-716cf6ce.js} +2245 -2248
  5. package/dist/{needle-engine.bundle-d710d96f.light.js → needle-engine.bundle-946378ce.light.js} +1681 -1684
  6. package/dist/{needle-engine.bundle-baacde19.min.js → needle-engine.bundle-d2825f28.min.js} +89 -88
  7. package/dist/{needle-engine.bundle-9fe9a394.light.umd.cjs → needle-engine.bundle-ee9f7e66.light.umd.cjs} +88 -87
  8. package/dist/needle-engine.js +24 -24
  9. package/dist/needle-engine.light.js +24 -24
  10. package/dist/needle-engine.light.min.js +1 -1
  11. package/dist/needle-engine.light.umd.cjs +1 -1
  12. package/dist/needle-engine.min.js +1 -1
  13. package/dist/needle-engine.umd.cjs +1 -1
  14. package/lib/engine/engine_components.js +6 -14
  15. package/lib/engine/engine_components.js.map +1 -1
  16. package/lib/engine/engine_loaders.callbacks.d.ts +43 -9
  17. package/lib/engine/engine_loaders.callbacks.js +42 -12
  18. package/lib/engine/engine_loaders.callbacks.js.map +1 -1
  19. package/lib/engine/engine_loaders.js +35 -19
  20. package/lib/engine/engine_loaders.js.map +1 -1
  21. package/lib/engine/engine_utils_format.d.ts +5 -5
  22. package/lib/engine/engine_utils_format.js +37 -34
  23. package/lib/engine/engine_utils_format.js.map +1 -1
  24. package/package.json +11 -3
  25. package/plugins/types/next.d.ts +3 -0
  26. package/plugins/types/vite.d.ts +4 -0
  27. package/plugins/vite/dependencies.js +1 -1
  28. package/src/engine/engine_components.ts +4 -12
  29. package/src/engine/engine_loaders.callbacks.ts +63 -17
  30. package/src/engine/engine_loaders.ts +34 -19
  31. package/src/engine/engine_utils_format.ts +51 -37
@@ -1,13 +1,24 @@
1
1
  import { isDevEnvironment } from "./debug/index.js";
2
- import { NeedleEngineModelLoader, registeredFileTypeCallbacks } from "./engine_loaders.callbacks.js";
2
+ import { registeredMimetypeCallbacks } from "./engine_loaders.callbacks.js";
3
3
  import { getParam } from "./engine_utils.js";
4
4
 
5
5
  const debug = getParam("debugfileformat");
6
-
7
6
  /**
8
- * The supported file types that can be determined by the engine. Used in {@link tryDetermineFileTypeFromURL} and {@link tryDetermineFileTypeFromBinary}
7
+ * The supported file types that can be determined by the engine. Used in {@link tryDetermineMimetypeFromURL} and {@link tryDetermineMimetypeFromBinary}
9
8
  */
10
- export declare type FileType = "gltf" | "glb" | "vrm" | "fbx" | "obj" | "usdz" | "usd" | "usda" | "unknown" | ({} & string);
9
+ export type NeedleMimetype = "unknown" |
10
+ "model/gltf+json" |
11
+ "model/gltf-binary" |
12
+ "model/vrm" |
13
+ "model/vnd.usdz+zip" |
14
+ "model/vnd.usd" |
15
+ "model/vnd.usda" |
16
+ "model/vnd.usdc" |
17
+ "model/fbx" |
18
+ "model/vnd.autodesk.fbx" |
19
+ "model/obj"
20
+ | (string & {})
21
+
11
22
 
12
23
  /**
13
24
  * Tries to determine the file type of a file from its URL
@@ -21,7 +32,7 @@ export declare type FileType = "gltf" | "glb" | "vrm" | "fbx" | "obj" | "usdz" |
21
32
  * const fileType = await tryDetermineFileTypeFromURL(url);
22
33
  * console.log(fileType); // "glb"
23
34
  */
24
- export async function tryDetermineFileTypeFromURL(url: string, opts: { useExtension: boolean }): Promise<FileType> {
35
+ export async function tryDetermineMimetypeFromURL(url: string, opts: { useExtension: boolean }): Promise<NeedleMimetype> {
25
36
 
26
37
  const { useExtension = true } = opts;
27
38
 
@@ -41,24 +52,24 @@ export async function tryDetermineFileTypeFromURL(url: string, opts: { useExtens
41
52
  if (!ext?.length) {
42
53
  ext = urlobj.pathname.split(".").pop()?.toUpperCase();
43
54
  }
44
- if (debug) console.debug("Use file extension to determine type: " + ext);
55
+ if (debug) console.warn(`[Needle Engine] Try to use file extension to determine type: '${ext}'`);
45
56
  switch (ext) {
46
57
  case "GLTF":
47
- return "gltf";
58
+ return "model/gltf+json"
48
59
  case "VRM":
49
- return "vrm";
60
+ return "model/vrm";
50
61
  case "GLB":
51
- return "glb";
62
+ return "model/gltf-binary";
52
63
  case "FBX":
53
- return "fbx";
64
+ return "model/fbx";
54
65
  case "USD":
55
- return "usd";
66
+ return "model/vnd.usd+zip";
56
67
  case "USDA":
57
- return "usda";
68
+ return "model/vnd.usda+zip";
58
69
  case "USDZ":
59
- return "usdz";
70
+ return "model/vnd.usdz+zip";
60
71
  case "OBJ":
61
- return "obj";
72
+ return "model/obj";
62
73
  }
63
74
  }
64
75
 
@@ -88,8 +99,8 @@ export async function tryDetermineFileTypeFromURL(url: string, opts: { useExtens
88
99
 
89
100
  if (header?.ok) {
90
101
  const data = await header.arrayBuffer();
91
- const res = tryDetermineFileTypeFromBinary(originalUrl, data, header);
92
- if (debug) console.log("Determined file type from header: " + res);
102
+ const res = tryDetermineMimetypeFromBinary(originalUrl, data, header);
103
+ if (debug) console.log("[Needle Engine] Determined file type from header: " + res);
93
104
  return res;
94
105
  }
95
106
 
@@ -100,7 +111,7 @@ export async function tryDetermineFileTypeFromURL(url: string, opts: { useExtens
100
111
  /** Attempts to determine the file type of a binary file by looking at the first few bytes of the file.
101
112
  * @hidden
102
113
  */
103
- export function tryDetermineFileTypeFromBinary(url: string, data: ArrayBuffer, response: Response): FileType {
114
+ export function tryDetermineMimetypeFromBinary(url: string, data: ArrayBuffer, response: Response): NeedleMimetype {
104
115
 
105
116
  if (data.byteLength < 4) {
106
117
  return "unknown";
@@ -109,70 +120,73 @@ export function tryDetermineFileTypeFromBinary(url: string, data: ArrayBuffer, r
109
120
  const bytes = new Uint8Array(data);
110
121
 
111
122
  if (debug) {
112
- console.warn("Trying to determine file type from binary data\n", "\"" + new TextDecoder().decode(data) + "\"\n", bytes);
123
+ console.warn("[Needle Engine] Trying to determine file type from binary data\n", "\"" + new TextDecoder().decode(data) + "\"\n", bytes);
113
124
  }
114
125
 
115
- // GLTF or GLB
116
- if (bytes[0] == 103 && bytes[1] == 108 && bytes[2] == 84 && bytes[3] == 70) {
126
+ // GLTF
127
+ if (bytes[0] == 103 && bytes[1] == 108 && bytes[2] == 84 && bytes[3] == 70 && bytes[4] == 10) {
128
+ // GLTF
117
129
  console.debug("GLTF detected");
118
- return "glb";
130
+ return "model/gltf+json";
131
+ }
132
+ // GLB
133
+ else if (bytes[0] == 103 && bytes[1] == 108 && bytes[2] == 84 && bytes[3] == 70 && bytes[4] == 98) {
134
+ // GLB
135
+ console.debug("GLB detected");
136
+ return "model/gltf-binary";
119
137
  }
120
138
  // USDZ
121
139
  if (bytes[0] == 80 && bytes[1] == 75 && bytes[2] == 3 && bytes[3] == 4) {
122
140
  console.debug("USDZ detected");
123
- return "usdz";
141
+ return "model/vnd.usdz+zip";
124
142
  }
125
143
  // USD
126
144
  if (bytes[0] == 80 && bytes[1] == 88 && bytes[2] == 82 && bytes[3] == 45 && bytes[4] == 85 && bytes[5] == 83 && bytes[6] == 68 && bytes[7] == 67) {
127
145
  console.debug("Binary USD detected");
128
- return "usd";
146
+ return "model/vnd.usd";
129
147
  }
130
148
  // USDA: check if the file starts with #usda
131
149
  else if (bytes[0] == 35 && bytes[1] == 117 && bytes[2] == 115 && bytes[3] == 100 && bytes[4] == 97) {
132
150
  console.debug("ASCII USD detected");
133
- return "usda";
151
+ return "model/vnd.usda";
134
152
  }
135
153
  // FBX
136
154
  if (bytes[0] == 75 && bytes[1] == 97 && bytes[2] == 121 && bytes[3] == 100 && bytes[4] == 97 && bytes[5] == 114 && bytes[6] == 97 && bytes[7] == 32) {
137
155
  console.debug("Binary FBX detected");
138
- return "fbx";
156
+ return "model/fbx";
139
157
  }
140
158
  // ASCII FBX
141
159
  else if (bytes[0] == 59 && bytes[1] == 32 && bytes[2] == 70 && bytes[3] == 66 && bytes[4] == 88 && bytes[5] == 32) {
142
160
  console.debug("ASCII FBX detected");
143
- return "fbx";
161
+ return "model/fbx";
144
162
  }
145
163
  // OBJ - in this case exported from blender it starts with "# Blender" - we only check the first 10 bytes, technically it could still be a different file so we should do this check at the end
146
164
  else if (bytes[0] == 35 && bytes[1] == 32 && bytes[2] == 66 && bytes[3] == 108 && bytes[4] == 101 && bytes[5] == 110 && bytes[6] == 100 && bytes[7] == 101 && bytes[8] == 114 && bytes[9] == 32) {
147
165
  console.debug("OBJ detected");
148
- return "obj";
166
+ return "model/obj";
149
167
  }
150
168
  // Check if it starts "# Alias OBJ"
151
169
  else if (bytes[0] == 35 && bytes[1] == 32 && bytes[2] == 65 && bytes[3] == 108 && bytes[4] == 105 && bytes[5] == 97 && bytes[6] == 115 && bytes[7] == 32 && bytes[8] == 79 && bytes[9] == 66 && bytes[10] == 74) {
152
170
  console.debug("OBJ detected");
153
- return "obj";
171
+ return "model/obj";
154
172
  }
155
173
  else if (response.headers.has("content-type")) {
156
174
  const content_type = response.headers.get("content-type");
157
175
  console.debug("Content-Type: " + content_type);
158
176
  switch (content_type) {
159
177
  case "model/gltf+json":
160
- return "gltf";
161
178
  case "model/gltf-binary":
162
- return "glb";
163
179
  case "model/vrm":
164
- return "vrm";
165
180
  case "model/vnd.usdz+zip":
166
- return "usdz";
167
181
  case "model/vnd.usd+zip":
168
- return "usd";
182
+ case "model/vnd.usd":
169
183
  case "model/vnd.usda+zip":
170
- return "usda";
184
+ case "model/vnd.usda":
185
+ case "model/vnd.usdc":
171
186
  case "model/fbx":
172
187
  case "model/vnd.autodesk.fbx":
173
- return "fbx";
174
188
  case "model/obj":
175
- return "obj";
189
+ return content_type;
176
190
  // case "model/stl":
177
191
  // return "stl";
178
192
  case "text/plain":
@@ -205,7 +219,7 @@ export function tryDetermineFileTypeFromBinary(url: string, data: ArrayBuffer, r
205
219
  // return "gltf";
206
220
  // }
207
221
 
208
- for (const callback of registeredFileTypeCallbacks) {
222
+ for (const callback of registeredMimetypeCallbacks) {
209
223
  const mimetype = callback({
210
224
  url: url,
211
225
  response: response,