@loaders.gl/obj 4.0.0-alpha.4 → 4.0.0-alpha.6

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 (89) hide show
  1. package/dist/bundle.d.ts +2 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/bundle.js +2 -2
  4. package/dist/dist.min.js +744 -0
  5. package/dist/es5/bundle.js +6 -0
  6. package/dist/es5/bundle.js.map +1 -0
  7. package/dist/es5/index.js +74 -0
  8. package/dist/es5/index.js.map +1 -0
  9. package/dist/es5/lib/get-obj-schema.js +54 -0
  10. package/dist/es5/lib/get-obj-schema.js.map +1 -0
  11. package/dist/es5/lib/obj-types.js +2 -0
  12. package/dist/es5/lib/obj-types.js.map +1 -0
  13. package/dist/es5/lib/parse-mtl.js +86 -0
  14. package/dist/es5/lib/parse-mtl.js.map +1 -0
  15. package/dist/es5/lib/parse-obj-meshes.js +486 -0
  16. package/dist/es5/lib/parse-obj-meshes.js.map +1 -0
  17. package/dist/es5/lib/parse-obj.js +100 -0
  18. package/dist/es5/lib/parse-obj.js.map +1 -0
  19. package/dist/es5/mtl-loader.js +26 -0
  20. package/dist/es5/mtl-loader.js.map +1 -0
  21. package/dist/es5/obj-loader.js +27 -0
  22. package/dist/es5/obj-loader.js.map +1 -0
  23. package/dist/es5/workers/obj-worker.js +6 -0
  24. package/dist/es5/workers/obj-worker.js.map +1 -0
  25. package/dist/esm/bundle.js +4 -0
  26. package/dist/esm/bundle.js.map +1 -0
  27. package/dist/esm/index.js +18 -0
  28. package/dist/esm/index.js.map +1 -0
  29. package/dist/esm/lib/get-obj-schema.js +49 -0
  30. package/dist/esm/lib/get-obj-schema.js.map +1 -0
  31. package/dist/esm/lib/obj-types.js +2 -0
  32. package/dist/esm/lib/obj-types.js.map +1 -0
  33. package/dist/esm/lib/parse-mtl.js +68 -0
  34. package/dist/esm/lib/parse-mtl.js.map +1 -0
  35. package/dist/esm/lib/parse-obj-meshes.js +385 -0
  36. package/dist/esm/lib/parse-obj-meshes.js.map +1 -0
  37. package/dist/{lib/load-obj.js → esm/lib/parse-obj.js} +5 -15
  38. package/dist/esm/lib/parse-obj.js.map +1 -0
  39. package/dist/esm/mtl-loader.js +16 -0
  40. package/dist/esm/mtl-loader.js.map +1 -0
  41. package/dist/esm/obj-loader.js +19 -0
  42. package/dist/esm/obj-loader.js.map +1 -0
  43. package/dist/esm/workers/obj-worker.js +4 -0
  44. package/dist/esm/workers/obj-worker.js.map +1 -0
  45. package/dist/index.d.ts +18 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +26 -8
  48. package/dist/lib/get-obj-schema.d.ts +4 -0
  49. package/dist/lib/get-obj-schema.d.ts.map +1 -0
  50. package/dist/lib/get-obj-schema.js +33 -33
  51. package/dist/lib/obj-types.d.ts +1 -0
  52. package/dist/lib/obj-types.d.ts.map +1 -0
  53. package/dist/lib/obj-types.js +1 -2
  54. package/dist/lib/parse-mtl.d.ts +34 -0
  55. package/dist/lib/parse-mtl.d.ts.map +1 -0
  56. package/dist/lib/parse-mtl.js +201 -0
  57. package/dist/lib/parse-obj-meshes.d.ts +5 -0
  58. package/dist/lib/parse-obj-meshes.d.ts.map +1 -0
  59. package/dist/lib/parse-obj-meshes.js +440 -0
  60. package/dist/lib/parse-obj.d.ts +3 -0
  61. package/dist/lib/parse-obj.d.ts.map +1 -0
  62. package/dist/lib/parse-obj.js +63 -449
  63. package/dist/mtl-loader.d.ts +12 -0
  64. package/dist/mtl-loader.d.ts.map +1 -0
  65. package/dist/mtl-loader.js +24 -0
  66. package/dist/obj-loader.d.ts +11 -0
  67. package/dist/obj-loader.d.ts.map +1 -0
  68. package/dist/obj-loader.js +24 -18
  69. package/dist/obj-worker.js +213 -507
  70. package/dist/workers/obj-worker.d.ts +2 -0
  71. package/dist/workers/obj-worker.d.ts.map +1 -0
  72. package/dist/workers/obj-worker.js +5 -4
  73. package/package.json +9 -9
  74. package/src/index.ts +25 -4
  75. package/src/lib/get-obj-schema.ts +24 -20
  76. package/src/lib/parse-mtl.ts +246 -0
  77. package/src/lib/parse-obj-meshes.ts +525 -0
  78. package/src/lib/parse-obj.ts +67 -508
  79. package/src/mtl-loader.ts +31 -0
  80. package/src/obj-loader.ts +8 -3
  81. package/dist/bundle.js.map +0 -1
  82. package/dist/index.js.map +0 -1
  83. package/dist/lib/get-obj-schema.js.map +0 -1
  84. package/dist/lib/load-obj.js.map +0 -1
  85. package/dist/lib/obj-types.js.map +0 -1
  86. package/dist/lib/parse-obj.js.map +0 -1
  87. package/dist/obj-loader.js.map +0 -1
  88. package/src/lib/load-obj.ts +0 -83
  89. /package/src/workers/{obj-worker.js → obj-worker.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=obj-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obj-worker.d.ts","sourceRoot":"","sources":["../../src/workers/obj-worker.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
- import {createLoaderWorker} from '@loaders.gl/loader-utils';
2
- import {OBJLoader} from '../index';
3
-
4
- createLoaderWorker(OBJLoader);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const loader_utils_1 = require("@loaders.gl/loader-utils");
4
+ const index_1 = require("../index");
5
+ (0, loader_utils_1.createLoaderWorker)(index_1.OBJLoader);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/obj",
3
- "version": "4.0.0-alpha.4",
3
+ "version": "4.0.0-alpha.6",
4
4
  "description": "Framework-independent loader for the OBJ format",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -18,9 +18,9 @@
18
18
  "point cloud",
19
19
  "OBJ"
20
20
  ],
21
- "types": "src/index.ts",
22
- "main": "dist/index.js",
23
- "module": "dist/index.js",
21
+ "types": "dist/index.d.ts",
22
+ "main": "dist/es5/index.js",
23
+ "module": "dist/esm/index.js",
24
24
  "sideEffects": false,
25
25
  "files": [
26
26
  "src",
@@ -29,13 +29,13 @@
29
29
  ],
30
30
  "scripts": {
31
31
  "pre-build": "npm run build-worker && npm run build-bundle",
32
- "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/bundle.js",
33
- "build-worker": "esbuild src/workers/obj-worker.js --bundle --outfile=dist/obj-worker.js"
32
+ "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js",
33
+ "build-worker": "esbuild src/workers/obj-worker.ts --bundle --outfile=dist/obj-worker.js --define:__VERSION__=\\\"$npm_package_version\\\""
34
34
  },
35
35
  "dependencies": {
36
36
  "@babel/runtime": "^7.3.1",
37
- "@loaders.gl/loader-utils": "4.0.0-alpha.4",
38
- "@loaders.gl/schema": "4.0.0-alpha.4"
37
+ "@loaders.gl/loader-utils": "4.0.0-alpha.6",
38
+ "@loaders.gl/schema": "4.0.0-alpha.6"
39
39
  },
40
- "gitHead": "53026061b3c8871f7e96d3a5826125cc6613bddc"
40
+ "gitHead": "acc1985050dfaa0f1f0c066f8da5bce7454a046c"
41
41
  }
package/src/index.ts CHANGED
@@ -1,7 +1,14 @@
1
1
  import type {LoaderWithParser} from '@loaders.gl/loader-utils';
2
- import loadOBJ from './lib/load-obj';
2
+ import type {Mesh} from '@loaders.gl/schema';
3
+ import {parseOBJ} from './lib/parse-obj';
4
+ import type {OBJLoaderOptions} from './obj-loader';
3
5
  import {OBJLoader as OBJWorkerLoader} from './obj-loader';
4
6
 
7
+ import type {MTLMaterial} from './lib/parse-mtl';
8
+ import {parseMTL} from './lib/parse-mtl';
9
+ import type {MTLLoaderOptions} from './mtl-loader';
10
+ import {MTLLoader as MTLWorkerLoader} from './mtl-loader';
11
+
5
12
  // OBJLoader
6
13
 
7
14
  export {OBJWorkerLoader};
@@ -9,10 +16,24 @@ export {OBJWorkerLoader};
9
16
  /**
10
17
  * Loader for the OBJ geometry format
11
18
  */
12
- export const OBJLoader = {
19
+ export const OBJLoader: LoaderWithParser<Mesh, never, OBJLoaderOptions> = {
13
20
  ...OBJWorkerLoader,
14
- parse: async (arrayBuffer, options) => loadOBJ(new TextDecoder().decode(arrayBuffer), options),
15
- parseTextSync: loadOBJ
21
+ parse: async (arrayBuffer: ArrayBuffer, options?: OBJLoaderOptions) =>
22
+ parseOBJ(new TextDecoder().decode(arrayBuffer), options),
23
+ parseTextSync: (text: string, options?: OBJLoaderOptions) => parseOBJ(text, options)
24
+ };
25
+
26
+ // MTLLoader
27
+
28
+ /**
29
+ * Loader for the MTL material format
30
+ */
31
+ export const MTLLoader: LoaderWithParser<MTLMaterial[], never, MTLLoaderOptions> = {
32
+ ...MTLWorkerLoader,
33
+ parse: async (arrayBuffer: ArrayBuffer, options?: MTLLoaderOptions) =>
34
+ parseMTL(new TextDecoder().decode(arrayBuffer), options?.mtl),
35
+ parseTextSync: (text: string, options?: MTLLoaderOptions) => parseMTL(text, options?.mtl)
16
36
  };
17
37
 
18
38
  export const _typecheckOBJLoader: LoaderWithParser = OBJLoader;
39
+ export const _typecheckMTLLoader: LoaderWithParser = MTLLoader;
@@ -1,39 +1,43 @@
1
- import {Schema, Field, FixedSizeList, getArrowTypeFromTypedArray} from '@loaders.gl/schema';
1
+ // loaders.gl, MIT license
2
2
 
3
- export function getOBJSchema(attributes, metadata = {}) {
4
- let metadataMap;
3
+ import type {Schema, SchemaMetadata, Field, MeshAttribute} from '@loaders.gl/schema';
4
+ import {getDataTypeFromArray} from '@loaders.gl/schema';
5
+
6
+ /** Get Mesh Schema */
7
+ export function getOBJSchema(
8
+ attributes: Record<string, MeshAttribute>,
9
+ metadata: Record<string, unknown> = {}
10
+ ): Schema {
11
+ const stringMetadata: SchemaMetadata = {};
5
12
  for (const key in metadata) {
6
- metadataMap = metadataMap || new Map();
7
13
  if (key !== 'value') {
8
- metadataMap.set(key, JSON.stringify(metadata[key]));
14
+ stringMetadata[key] = JSON.stringify(metadata[key]);
9
15
  }
10
16
  }
11
17
 
12
18
  const fields: Field[] = [];
13
19
  for (const attributeName in attributes) {
14
20
  const attribute = attributes[attributeName];
15
- const field = getArrowFieldFromAttribute(attributeName, attribute);
21
+ const field = getFieldFromAttribute(attributeName, attribute);
16
22
  fields.push(field);
17
23
  }
18
- return new Schema(fields, metadataMap);
24
+
25
+ return {fields, metadata: stringMetadata};
19
26
  }
20
27
 
21
- function getArrowFieldFromAttribute(attributeName, attribute) {
22
- const metadataMap = new Map();
28
+ /** Get a Field describing the column from an OBJ attribute */
29
+ function getFieldFromAttribute(name: string, attribute: MeshAttribute): Field {
30
+ const metadata: Record<string, string> = {};
23
31
  for (const key in attribute) {
24
32
  if (key !== 'value') {
25
- metadataMap.set(key, JSON.stringify(attribute[key]));
33
+ metadata[key] = JSON.stringify(attribute[key]);
26
34
  }
27
35
  }
28
36
 
29
- const type = getArrowTypeFromTypedArray(attribute.value);
30
- const isSingleValue = !('size' in attribute) || attribute.size === 1;
31
- return isSingleValue
32
- ? new Field(attributeName, type, false, metadataMap)
33
- : new Field(
34
- attributeName,
35
- new FixedSizeList(attribute.size, new Field('value', type)),
36
- false,
37
- metadataMap
38
- );
37
+ let {type} = getDataTypeFromArray(attribute.value);
38
+ const isSingleValue = attribute.size === 1 || attribute.size === undefined;
39
+ if (!isSingleValue) {
40
+ type = {type: 'fixed-size-list', listSize: attribute.size, children: [{name: 'values', type}]};
41
+ }
42
+ return {name, type, nullable: false, metadata};
39
43
  }
@@ -0,0 +1,246 @@
1
+ // loaders.gl, MIT license
2
+ // Forked from THREE.js under MIT license
3
+ // https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/MTLLoader.js
4
+
5
+ // import type {DiffuseMaterial} from '@loaders.gl/schema';
6
+
7
+ export type MTLMaterial = {
8
+ name: string;
9
+ ambientColor?: [number, number, number];
10
+ diffuseColor?: [number, number, number];
11
+ specularColor?: [number, number, number];
12
+ emissiveColor?: [number, number, number];
13
+ // specular?: number;
14
+ shininess?: number;
15
+ refraction?: number;
16
+ illumination?: number;
17
+ diffuseTextureUrl?: string;
18
+ emissiveTextureUrl?: string;
19
+ specularTextureUrl?: string;
20
+ };
21
+
22
+ const DELIMITER_PATTERN = /\s+/;
23
+
24
+ /**
25
+ * Set of options on how to construct materials
26
+ * @param normalizeRGB: RGBs need to be normalized to 0-1 from 0-255 (Default: false, assumed to be already normalized)
27
+ * @param ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's Default: false
28
+ * @param baseUrl - Url relative to which textures are loaded
29
+ */
30
+ export type ParseMTLOptions = {
31
+ normalizeRGB?: boolean;
32
+ ignoreZeroRGBs?: boolean;
33
+ baseUrl?: string;
34
+ };
35
+
36
+ /**
37
+ * Parses a MTL file.
38
+ * Parses a Wavefront .mtl file specifying materials
39
+ * http://paulbourke.net/dataformats/mtl/
40
+ * https://www.loc.gov/preservation/digital/formats/fdd/fdd000508.shtml
41
+ *
42
+ * @param text - Content of MTL file
43
+ */
44
+ // eslint-disable-next-line complexity
45
+ export function parseMTL(text: string, options?: ParseMTLOptions): MTLMaterial[] {
46
+ // const materialsInfo: Record<string, MTLMaterial> = {};
47
+ const materials: MTLMaterial[] = [];
48
+
49
+ let currentMaterial: MTLMaterial = {name: 'placeholder'};
50
+
51
+ const lines = text.split('\n');
52
+ for (let line of lines) {
53
+ line = line.trim();
54
+
55
+ if (line.length === 0 || line.charAt(0) === '#') {
56
+ // Blank line or comment ignore
57
+ continue; // eslint-disable-line no-continue
58
+ }
59
+
60
+ const pos = line.indexOf(' ');
61
+
62
+ let key = pos >= 0 ? line.substring(0, pos) : line;
63
+ key = key.toLowerCase();
64
+
65
+ let value = pos >= 0 ? line.substring(pos + 1) : '';
66
+ value = value.trim();
67
+
68
+ switch (key) {
69
+ case 'newmtl':
70
+ // New material
71
+ currentMaterial = {name: value};
72
+ // insert into map
73
+ materials.push(currentMaterial);
74
+ break;
75
+
76
+ case 'ka': // Ka
77
+ currentMaterial.ambientColor = parseColor(value);
78
+ break;
79
+
80
+ case 'kd':
81
+ // Kd: Diffuse color (color under white light) using RGB values
82
+ currentMaterial.diffuseColor = parseColor(value);
83
+ break;
84
+ case 'map_kd':
85
+ // Diffuse texture map
86
+ currentMaterial.diffuseTextureUrl = value;
87
+ // setMapForType('map', value);
88
+ break;
89
+
90
+ case 'ks':
91
+ // Specular color (color when light is reflected from shiny surface) using RGB values
92
+ currentMaterial.specularColor = parseColor(value);
93
+ break;
94
+ case 'map_ks':
95
+ // Specular map
96
+ currentMaterial.specularTextureUrl = value;
97
+ // setMapForType('specularMap', value);
98
+ break;
99
+
100
+ case 'ke':
101
+ // Emissive using RGB values
102
+ currentMaterial.emissiveColor = parseColor(value);
103
+ break;
104
+ case 'map_ke':
105
+ // Emissive map
106
+ currentMaterial.emissiveTextureUrl = value;
107
+ // setMapForType('emissiveMap', value);
108
+ break;
109
+
110
+ case 'ns':
111
+ // Ns is material specular exponent (defines the focus of the specular highlight)
112
+ // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.
113
+ currentMaterial.shininess = parseFloat(value);
114
+ break;
115
+ case 'map_ns':
116
+ // Ns is material specular exponent
117
+ // TODO?
118
+ // currentMaterial.shininessMap = parseFloat(value);
119
+ break;
120
+ case 'ni':
121
+ currentMaterial.refraction = parseFloat(value);
122
+ break;
123
+ case 'illum':
124
+ currentMaterial.illumination = parseFloat(value);
125
+ break;
126
+
127
+ default:
128
+ // log unknown message?
129
+ break;
130
+
131
+ /*
132
+ case 'norm':
133
+ setMapForType('normalMap', value);
134
+ break;
135
+
136
+ case 'map_bump':
137
+ case 'bump':
138
+ // Bump texture map
139
+ setMapForType('bumpMap', value);
140
+ break;
141
+
142
+ case 'd':
143
+ n = parseFloat(value);
144
+ if (n < 1) {
145
+ params.opacity = n;
146
+ params.transparent = true;
147
+ }
148
+ break;
149
+
150
+ case 'map_d':
151
+ // Alpha map
152
+ setMapForType('alphaMap', value);
153
+ params.transparent = true;
154
+ break;
155
+
156
+ case 'tr':
157
+ n = parseFloat(value);
158
+ if (this.options && this.options.invertTrProperty) n = 1 - n;
159
+ if (n > 0) {
160
+ params.opacity = 1 - n;
161
+ params.transparent = true;
162
+ }
163
+ */
164
+ }
165
+ }
166
+
167
+ return materials;
168
+ }
169
+
170
+ function parseColor(value: string, options?: ParseMTLOptions): [number, number, number] {
171
+ const rgb = value.split(DELIMITER_PATTERN, 3);
172
+ const color: [number, number, number] = [
173
+ parseFloat(rgb[0]),
174
+ parseFloat(rgb[1]),
175
+ parseFloat(rgb[2])
176
+ ];
177
+ // TODO auto detect big values?
178
+ // if (this.options && this.options.normalizeRGB) {
179
+ // value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];
180
+ // }
181
+
182
+ // if (this.options && this.options.ignoreZeroRGBs) {
183
+ // if (value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0) {
184
+ // // ignore
185
+ // save = false;
186
+ // }
187
+ // }
188
+ return color;
189
+ }
190
+
191
+ /* TODO parse url options
192
+ function parseTexture(value, matParams) {
193
+ const texParams = {
194
+ scale: new Vector2(1, 1),
195
+ offset: new Vector2(0, 0)
196
+ };
197
+
198
+ const items = value.split(/\s+/);
199
+ let pos;
200
+
201
+ pos = items.indexOf('-bm');
202
+ if (pos >= 0) {
203
+ matParams.bumpScale = parseFloat(items[ pos + 1 ]);
204
+ items.splice(pos, 2);
205
+ }
206
+
207
+ pos = items.indexOf('-s');
208
+ if (pos >= 0) {
209
+ texParams.scale.set(parseFloat(items[ pos + 1 ]), parseFloat(items[ pos + 2 ]));
210
+ items.splice(pos, 4); // we expect 3 parameters here!
211
+
212
+ }
213
+
214
+ pos = items.indexOf('-o');
215
+
216
+ if (pos >= 0) {
217
+ texParams.offset.set(parseFloat(items[ pos + 1 ]), parseFloat(items[ pos + 2 ]));
218
+ items.splice(pos, 4); // we expect 3 parameters here!
219
+ }
220
+
221
+ texParams.url = items.join(' ').trim();
222
+ return texParams;
223
+ }
224
+
225
+ *function resolveURL(baseUrl, url) {
226
+ * baseUrl?: string;
227
+ // Absolute URL
228
+ if (/^https?:\/\//i.test(url)) return url;
229
+ return baseUrl + url;
230
+ }
231
+
232
+ function setMapForType(mapType, value) {
233
+ if (params[ mapType ]) return; // Keep the first encountered texture
234
+
235
+ const texParams = scope.getTextureParams(value, params);
236
+ const map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url));
237
+
238
+ map.repeat.copy(texParams.scale);
239
+ map.offset.copy(texParams.offset);
240
+
241
+ map.wrapS = scope.wrap;
242
+ map.wrapT = scope.wrap;
243
+
244
+ params[ mapType ] = map;
245
+ }
246
+ */