@loaders.gl/obj 3.1.3 → 3.1.7
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.
- package/dist/dist.min.js +269 -164
- package/dist/es5/index.js +42 -4
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parse-mtl.js +110 -0
- package/dist/es5/lib/parse-mtl.js.map +1 -0
- package/dist/es5/lib/parse-obj-meshes.js +559 -0
- package/dist/es5/lib/parse-obj-meshes.js.map +1 -0
- package/dist/es5/lib/parse-obj.js +84 -526
- package/dist/es5/lib/parse-obj.js.map +1 -1
- package/dist/es5/mtl-loader.js +26 -0
- package/dist/es5/mtl-loader.js.map +1 -0
- package/dist/es5/obj-loader.js +1 -1
- package/dist/es5/obj-loader.js.map +1 -1
- package/dist/esm/index.js +10 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parse-mtl.js +86 -0
- package/dist/esm/lib/parse-mtl.js.map +1 -0
- package/dist/esm/lib/parse-obj-meshes.js +458 -0
- package/dist/esm/lib/parse-obj-meshes.js.map +1 -0
- package/dist/esm/lib/parse-obj.js +71 -437
- package/dist/esm/lib/parse-obj.js.map +1 -1
- package/dist/esm/mtl-loader.js +16 -0
- package/dist/esm/mtl-loader.js.map +1 -0
- package/dist/esm/obj-loader.js +1 -1
- package/dist/esm/obj-loader.js.map +1 -1
- package/dist/index.d.ts +41 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -7
- package/dist/lib/parse-mtl.d.ts +34 -0
- package/dist/lib/parse-mtl.d.ts.map +1 -0
- package/dist/lib/parse-mtl.js +201 -0
- package/dist/lib/parse-obj-meshes.d.ts +5 -0
- package/dist/lib/parse-obj-meshes.d.ts.map +1 -0
- package/dist/lib/parse-obj-meshes.js +440 -0
- package/dist/lib/parse-obj.d.ts +12 -4
- package/dist/lib/parse-obj.d.ts.map +1 -1
- package/dist/lib/parse-obj.js +67 -434
- package/dist/mtl-loader.d.ts +24 -0
- package/dist/mtl-loader.d.ts.map +1 -0
- package/dist/mtl-loader.js +24 -0
- package/dist/obj-loader.d.ts +5 -2
- package/dist/obj-loader.d.ts.map +1 -1
- package/dist/obj-worker.js +99 -9
- package/package.json +5 -5
- package/src/index.ts +21 -3
- package/src/lib/parse-mtl.ts +246 -0
- package/src/lib/parse-obj-meshes.ts +525 -0
- package/src/lib/parse-obj.ts +66 -508
- package/src/mtl-loader.ts +31 -0
- package/src/obj-loader.ts +6 -2
- package/dist/es5/lib/load-obj.js +0 -121
- package/dist/es5/lib/load-obj.js.map +0 -1
- package/dist/esm/lib/load-obj.js +0 -92
- package/dist/esm/lib/load-obj.js.map +0 -1
- package/dist/lib/load-obj.d.ts +0 -14
- package/dist/lib/load-obj.d.ts.map +0 -1
- package/dist/lib/load-obj.js +0 -73
- package/src/lib/load-obj.ts +0 -83
package/dist/dist.min.js
CHANGED
|
@@ -562,10 +562,160 @@
|
|
|
562
562
|
}
|
|
563
563
|
});
|
|
564
564
|
|
|
565
|
-
// src/lib/parse-obj.ts
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
565
|
+
// src/lib/parse-obj-meshes.ts
|
|
566
|
+
function parseOBJMeshes(text) {
|
|
567
|
+
const state = new ParserState();
|
|
568
|
+
if (text.indexOf("\r\n") !== -1) {
|
|
569
|
+
text = text.replace(/\r\n/g, "\n");
|
|
570
|
+
}
|
|
571
|
+
if (text.indexOf("\\\n") !== -1) {
|
|
572
|
+
text = text.replace(/\\\n/g, "");
|
|
573
|
+
}
|
|
574
|
+
const lines = text.split("\n");
|
|
575
|
+
let line = "";
|
|
576
|
+
let lineFirstChar = "";
|
|
577
|
+
let lineLength = 0;
|
|
578
|
+
let result = [];
|
|
579
|
+
const trimLeft = typeof "".trimLeft === "function";
|
|
580
|
+
for (let i = 0, l = lines.length; i < l; i++) {
|
|
581
|
+
line = lines[i];
|
|
582
|
+
line = trimLeft ? line.trimLeft() : line.trim();
|
|
583
|
+
lineLength = line.length;
|
|
584
|
+
if (lineLength === 0)
|
|
585
|
+
continue;
|
|
586
|
+
lineFirstChar = line.charAt(0);
|
|
587
|
+
if (lineFirstChar === "#")
|
|
588
|
+
continue;
|
|
589
|
+
if (lineFirstChar === "v") {
|
|
590
|
+
const data = line.split(/\s+/);
|
|
591
|
+
switch (data[0]) {
|
|
592
|
+
case "v":
|
|
593
|
+
state.vertices.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
|
|
594
|
+
if (data.length === 8) {
|
|
595
|
+
state.colors.push(parseFloat(data[4]), parseFloat(data[5]), parseFloat(data[6]));
|
|
596
|
+
}
|
|
597
|
+
break;
|
|
598
|
+
case "vn":
|
|
599
|
+
state.normals.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
|
|
600
|
+
break;
|
|
601
|
+
case "vt":
|
|
602
|
+
state.uvs.push(parseFloat(data[1]), parseFloat(data[2]));
|
|
603
|
+
break;
|
|
604
|
+
default:
|
|
605
|
+
}
|
|
606
|
+
} else if (lineFirstChar === "f") {
|
|
607
|
+
const lineData = line.substr(1).trim();
|
|
608
|
+
const vertexData = lineData.split(/\s+/);
|
|
609
|
+
const faceVertices = [];
|
|
610
|
+
for (let j = 0, jl = vertexData.length; j < jl; j++) {
|
|
611
|
+
const vertex = vertexData[j];
|
|
612
|
+
if (vertex.length > 0) {
|
|
613
|
+
const vertexParts = vertex.split("/");
|
|
614
|
+
faceVertices.push(vertexParts);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
const v1 = faceVertices[0];
|
|
618
|
+
for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) {
|
|
619
|
+
const v2 = faceVertices[j];
|
|
620
|
+
const v3 = faceVertices[j + 1];
|
|
621
|
+
state.addFace(v1[0], v2[0], v3[0], v1[1], v2[1], v3[1], v1[2], v2[2], v3[2]);
|
|
622
|
+
}
|
|
623
|
+
} else if (lineFirstChar === "l") {
|
|
624
|
+
const lineParts = line.substring(1).trim().split(" ");
|
|
625
|
+
let lineVertices;
|
|
626
|
+
const lineUVs = [];
|
|
627
|
+
if (line.indexOf("/") === -1) {
|
|
628
|
+
lineVertices = lineParts;
|
|
629
|
+
} else {
|
|
630
|
+
lineVertices = [];
|
|
631
|
+
for (let li = 0, llen = lineParts.length; li < llen; li++) {
|
|
632
|
+
const parts = lineParts[li].split("/");
|
|
633
|
+
if (parts[0] !== "")
|
|
634
|
+
lineVertices.push(parts[0]);
|
|
635
|
+
if (parts[1] !== "")
|
|
636
|
+
lineUVs.push(parts[1]);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
state.addLineGeometry(lineVertices, lineUVs);
|
|
640
|
+
} else if (lineFirstChar === "p") {
|
|
641
|
+
const lineData = line.substr(1).trim();
|
|
642
|
+
const pointData = lineData.split(" ");
|
|
643
|
+
state.addPointGeometry(pointData);
|
|
644
|
+
} else if ((result = OBJECT_RE.exec(line)) !== null) {
|
|
645
|
+
const name = (" " + result[0].substr(1).trim()).substr(1);
|
|
646
|
+
state.startObject(name);
|
|
647
|
+
} else if (MATERIAL_USE_RE.test(line)) {
|
|
648
|
+
state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);
|
|
649
|
+
} else if (MATERIAL_RE.test(line)) {
|
|
650
|
+
state.materialLibraries.push(line.substring(7).trim());
|
|
651
|
+
} else if (lineFirstChar === "s") {
|
|
652
|
+
result = line.split(" ");
|
|
653
|
+
if (result.length > 1) {
|
|
654
|
+
const value = result[1].trim().toLowerCase();
|
|
655
|
+
state.object.smooth = value !== "0" && value !== "off";
|
|
656
|
+
} else {
|
|
657
|
+
state.object.smooth = true;
|
|
658
|
+
}
|
|
659
|
+
const material = state.object.currentMaterial();
|
|
660
|
+
if (material)
|
|
661
|
+
material.smooth = state.object.smooth;
|
|
662
|
+
} else {
|
|
663
|
+
if (line === "\0")
|
|
664
|
+
continue;
|
|
665
|
+
throw new Error(`Unexpected line: "${line}"`);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
state.finalize();
|
|
669
|
+
const meshes = [];
|
|
670
|
+
const materials = [];
|
|
671
|
+
for (const object of state.objects) {
|
|
672
|
+
const { geometry } = object;
|
|
673
|
+
if (geometry.vertices.length === 0)
|
|
674
|
+
continue;
|
|
675
|
+
const mesh = {
|
|
676
|
+
header: {
|
|
677
|
+
vertexCount: geometry.vertices.length / 3
|
|
678
|
+
},
|
|
679
|
+
attributes: {}
|
|
680
|
+
};
|
|
681
|
+
switch (geometry.type) {
|
|
682
|
+
case "Points":
|
|
683
|
+
mesh.mode = 0;
|
|
684
|
+
break;
|
|
685
|
+
case "Line":
|
|
686
|
+
mesh.mode = 1;
|
|
687
|
+
break;
|
|
688
|
+
default:
|
|
689
|
+
mesh.mode = 4;
|
|
690
|
+
break;
|
|
691
|
+
}
|
|
692
|
+
mesh.attributes.POSITION = { value: new Float32Array(geometry.vertices), size: 3 };
|
|
693
|
+
if (geometry.normals.length > 0) {
|
|
694
|
+
mesh.attributes.NORMAL = { value: new Float32Array(geometry.normals), size: 3 };
|
|
695
|
+
}
|
|
696
|
+
if (geometry.colors.length > 0) {
|
|
697
|
+
mesh.attributes.COLOR_0 = { value: new Float32Array(geometry.colors), size: 3 };
|
|
698
|
+
}
|
|
699
|
+
if (geometry.uvs.length > 0) {
|
|
700
|
+
mesh.attributes.TEXCOORD_0 = { value: new Float32Array(geometry.uvs), size: 2 };
|
|
701
|
+
}
|
|
702
|
+
mesh.materials = [];
|
|
703
|
+
for (const sourceMaterial of object.materials) {
|
|
704
|
+
const _material = {
|
|
705
|
+
name: sourceMaterial.name,
|
|
706
|
+
flatShading: !sourceMaterial.smooth
|
|
707
|
+
};
|
|
708
|
+
mesh.materials.push(_material);
|
|
709
|
+
materials.push(_material);
|
|
710
|
+
}
|
|
711
|
+
mesh.name = object.name;
|
|
712
|
+
meshes.push(mesh);
|
|
713
|
+
}
|
|
714
|
+
return { meshes, materials };
|
|
715
|
+
}
|
|
716
|
+
var OBJECT_RE, MATERIAL_RE, MATERIAL_USE_RE, MeshMaterial, MeshObject, ParserState;
|
|
717
|
+
var init_parse_obj_meshes = __esm({
|
|
718
|
+
"src/lib/parse-obj-meshes.ts"() {
|
|
569
719
|
OBJECT_RE = /^[og]\s*(.+)?/;
|
|
570
720
|
MATERIAL_RE = /^mtllib /;
|
|
571
721
|
MATERIAL_USE_RE = /^usemtl /;
|
|
@@ -780,156 +930,6 @@
|
|
|
780
930
|
}
|
|
781
931
|
}
|
|
782
932
|
};
|
|
783
|
-
parse_obj_default = (text) => {
|
|
784
|
-
const state = new ParserState();
|
|
785
|
-
if (text.indexOf("\r\n") !== -1) {
|
|
786
|
-
text = text.replace(/\r\n/g, "\n");
|
|
787
|
-
}
|
|
788
|
-
if (text.indexOf("\\\n") !== -1) {
|
|
789
|
-
text = text.replace(/\\\n/g, "");
|
|
790
|
-
}
|
|
791
|
-
const lines = text.split("\n");
|
|
792
|
-
let line = "";
|
|
793
|
-
let lineFirstChar = "";
|
|
794
|
-
let lineLength = 0;
|
|
795
|
-
let result = [];
|
|
796
|
-
const trimLeft = typeof "".trimLeft === "function";
|
|
797
|
-
for (let i = 0, l = lines.length; i < l; i++) {
|
|
798
|
-
line = lines[i];
|
|
799
|
-
line = trimLeft ? line.trimLeft() : line.trim();
|
|
800
|
-
lineLength = line.length;
|
|
801
|
-
if (lineLength === 0)
|
|
802
|
-
continue;
|
|
803
|
-
lineFirstChar = line.charAt(0);
|
|
804
|
-
if (lineFirstChar === "#")
|
|
805
|
-
continue;
|
|
806
|
-
if (lineFirstChar === "v") {
|
|
807
|
-
const data = line.split(/\s+/);
|
|
808
|
-
switch (data[0]) {
|
|
809
|
-
case "v":
|
|
810
|
-
state.vertices.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
|
|
811
|
-
if (data.length === 8) {
|
|
812
|
-
state.colors.push(parseFloat(data[4]), parseFloat(data[5]), parseFloat(data[6]));
|
|
813
|
-
}
|
|
814
|
-
break;
|
|
815
|
-
case "vn":
|
|
816
|
-
state.normals.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
|
|
817
|
-
break;
|
|
818
|
-
case "vt":
|
|
819
|
-
state.uvs.push(parseFloat(data[1]), parseFloat(data[2]));
|
|
820
|
-
break;
|
|
821
|
-
default:
|
|
822
|
-
}
|
|
823
|
-
} else if (lineFirstChar === "f") {
|
|
824
|
-
const lineData = line.substr(1).trim();
|
|
825
|
-
const vertexData = lineData.split(/\s+/);
|
|
826
|
-
const faceVertices = [];
|
|
827
|
-
for (let j = 0, jl = vertexData.length; j < jl; j++) {
|
|
828
|
-
const vertex = vertexData[j];
|
|
829
|
-
if (vertex.length > 0) {
|
|
830
|
-
const vertexParts = vertex.split("/");
|
|
831
|
-
faceVertices.push(vertexParts);
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
const v1 = faceVertices[0];
|
|
835
|
-
for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) {
|
|
836
|
-
const v2 = faceVertices[j];
|
|
837
|
-
const v3 = faceVertices[j + 1];
|
|
838
|
-
state.addFace(v1[0], v2[0], v3[0], v1[1], v2[1], v3[1], v1[2], v2[2], v3[2]);
|
|
839
|
-
}
|
|
840
|
-
} else if (lineFirstChar === "l") {
|
|
841
|
-
const lineParts = line.substring(1).trim().split(" ");
|
|
842
|
-
let lineVertices;
|
|
843
|
-
const lineUVs = [];
|
|
844
|
-
if (line.indexOf("/") === -1) {
|
|
845
|
-
lineVertices = lineParts;
|
|
846
|
-
} else {
|
|
847
|
-
lineVertices = [];
|
|
848
|
-
for (let li = 0, llen = lineParts.length; li < llen; li++) {
|
|
849
|
-
const parts = lineParts[li].split("/");
|
|
850
|
-
if (parts[0] !== "")
|
|
851
|
-
lineVertices.push(parts[0]);
|
|
852
|
-
if (parts[1] !== "")
|
|
853
|
-
lineUVs.push(parts[1]);
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
state.addLineGeometry(lineVertices, lineUVs);
|
|
857
|
-
} else if (lineFirstChar === "p") {
|
|
858
|
-
const lineData = line.substr(1).trim();
|
|
859
|
-
const pointData = lineData.split(" ");
|
|
860
|
-
state.addPointGeometry(pointData);
|
|
861
|
-
} else if ((result = OBJECT_RE.exec(line)) !== null) {
|
|
862
|
-
const name = (" " + result[0].substr(1).trim()).substr(1);
|
|
863
|
-
state.startObject(name);
|
|
864
|
-
} else if (MATERIAL_USE_RE.test(line)) {
|
|
865
|
-
state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);
|
|
866
|
-
} else if (MATERIAL_RE.test(line)) {
|
|
867
|
-
state.materialLibraries.push(line.substring(7).trim());
|
|
868
|
-
} else if (lineFirstChar === "s") {
|
|
869
|
-
result = line.split(" ");
|
|
870
|
-
if (result.length > 1) {
|
|
871
|
-
const value = result[1].trim().toLowerCase();
|
|
872
|
-
state.object.smooth = value !== "0" && value !== "off";
|
|
873
|
-
} else {
|
|
874
|
-
state.object.smooth = true;
|
|
875
|
-
}
|
|
876
|
-
const material = state.object.currentMaterial();
|
|
877
|
-
if (material)
|
|
878
|
-
material.smooth = state.object.smooth;
|
|
879
|
-
} else {
|
|
880
|
-
if (line === "\0")
|
|
881
|
-
continue;
|
|
882
|
-
throw new Error(`Unexpected line: "${line}"`);
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
state.finalize();
|
|
886
|
-
const meshes = [];
|
|
887
|
-
const materials = [];
|
|
888
|
-
for (const object of state.objects) {
|
|
889
|
-
const { geometry } = object;
|
|
890
|
-
if (geometry.vertices.length === 0)
|
|
891
|
-
continue;
|
|
892
|
-
const mesh = {
|
|
893
|
-
header: {
|
|
894
|
-
vertexCount: geometry.vertices.length / 3
|
|
895
|
-
},
|
|
896
|
-
attributes: {}
|
|
897
|
-
};
|
|
898
|
-
switch (geometry.type) {
|
|
899
|
-
case "Points":
|
|
900
|
-
mesh.mode = 0;
|
|
901
|
-
break;
|
|
902
|
-
case "Line":
|
|
903
|
-
mesh.mode = 1;
|
|
904
|
-
break;
|
|
905
|
-
default:
|
|
906
|
-
mesh.mode = 4;
|
|
907
|
-
break;
|
|
908
|
-
}
|
|
909
|
-
mesh.attributes.POSITION = { value: new Float32Array(geometry.vertices), size: 3 };
|
|
910
|
-
if (geometry.normals.length > 0) {
|
|
911
|
-
mesh.attributes.NORMAL = { value: new Float32Array(geometry.normals), size: 3 };
|
|
912
|
-
}
|
|
913
|
-
if (geometry.colors.length > 0) {
|
|
914
|
-
mesh.attributes.COLOR_0 = { value: new Float32Array(geometry.colors), size: 3 };
|
|
915
|
-
}
|
|
916
|
-
if (geometry.uvs.length > 0) {
|
|
917
|
-
mesh.attributes.TEXCOORD_0 = { value: new Float32Array(geometry.uvs), size: 2 };
|
|
918
|
-
}
|
|
919
|
-
mesh.materials = [];
|
|
920
|
-
for (const sourceMaterial of object.materials) {
|
|
921
|
-
const _material = {
|
|
922
|
-
name: sourceMaterial.name,
|
|
923
|
-
flatShading: !sourceMaterial.smooth
|
|
924
|
-
};
|
|
925
|
-
mesh.materials.push(_material);
|
|
926
|
-
materials.push(_material);
|
|
927
|
-
}
|
|
928
|
-
mesh.name = object.name;
|
|
929
|
-
meshes.push(mesh);
|
|
930
|
-
}
|
|
931
|
-
return { meshes, materials };
|
|
932
|
-
};
|
|
933
933
|
}
|
|
934
934
|
});
|
|
935
935
|
|
|
@@ -967,9 +967,9 @@
|
|
|
967
967
|
}
|
|
968
968
|
});
|
|
969
969
|
|
|
970
|
-
// src/lib/
|
|
971
|
-
function
|
|
972
|
-
const { meshes } =
|
|
970
|
+
// src/lib/parse-obj.ts
|
|
971
|
+
function parseOBJ(text, options) {
|
|
972
|
+
const { meshes } = parseOBJMeshes(text);
|
|
973
973
|
const vertexCount = meshes.reduce((s, mesh) => s + mesh.header.vertexCount, 0);
|
|
974
974
|
const attributes = mergeAttributes(meshes, vertexCount);
|
|
975
975
|
const header = {
|
|
@@ -1026,14 +1026,88 @@
|
|
|
1026
1026
|
}
|
|
1027
1027
|
return attributes;
|
|
1028
1028
|
}
|
|
1029
|
-
var
|
|
1030
|
-
"src/lib/
|
|
1029
|
+
var init_parse_obj = __esm({
|
|
1030
|
+
"src/lib/parse-obj.ts"() {
|
|
1031
1031
|
init_src();
|
|
1032
|
-
|
|
1032
|
+
init_parse_obj_meshes();
|
|
1033
1033
|
init_get_obj_schema();
|
|
1034
1034
|
}
|
|
1035
1035
|
});
|
|
1036
1036
|
|
|
1037
|
+
// src/lib/parse-mtl.ts
|
|
1038
|
+
function parseMTL(text, options) {
|
|
1039
|
+
const materials = [];
|
|
1040
|
+
let currentMaterial = { name: "placeholder" };
|
|
1041
|
+
const lines = text.split("\n");
|
|
1042
|
+
for (let line of lines) {
|
|
1043
|
+
line = line.trim();
|
|
1044
|
+
if (line.length === 0 || line.charAt(0) === "#") {
|
|
1045
|
+
continue;
|
|
1046
|
+
}
|
|
1047
|
+
const pos = line.indexOf(" ");
|
|
1048
|
+
let key = pos >= 0 ? line.substring(0, pos) : line;
|
|
1049
|
+
key = key.toLowerCase();
|
|
1050
|
+
let value = pos >= 0 ? line.substring(pos + 1) : "";
|
|
1051
|
+
value = value.trim();
|
|
1052
|
+
switch (key) {
|
|
1053
|
+
case "newmtl":
|
|
1054
|
+
currentMaterial = { name: value };
|
|
1055
|
+
materials.push(currentMaterial);
|
|
1056
|
+
break;
|
|
1057
|
+
case "ka":
|
|
1058
|
+
currentMaterial.ambientColor = parseColor(value);
|
|
1059
|
+
break;
|
|
1060
|
+
case "kd":
|
|
1061
|
+
currentMaterial.diffuseColor = parseColor(value);
|
|
1062
|
+
break;
|
|
1063
|
+
case "map_kd":
|
|
1064
|
+
currentMaterial.diffuseTextureUrl = value;
|
|
1065
|
+
break;
|
|
1066
|
+
case "ks":
|
|
1067
|
+
currentMaterial.specularColor = parseColor(value);
|
|
1068
|
+
break;
|
|
1069
|
+
case "map_ks":
|
|
1070
|
+
currentMaterial.specularTextureUrl = value;
|
|
1071
|
+
break;
|
|
1072
|
+
case "ke":
|
|
1073
|
+
currentMaterial.emissiveColor = parseColor(value);
|
|
1074
|
+
break;
|
|
1075
|
+
case "map_ke":
|
|
1076
|
+
currentMaterial.emissiveTextureUrl = value;
|
|
1077
|
+
break;
|
|
1078
|
+
case "ns":
|
|
1079
|
+
currentMaterial.shininess = parseFloat(value);
|
|
1080
|
+
break;
|
|
1081
|
+
case "map_ns":
|
|
1082
|
+
break;
|
|
1083
|
+
case "ni":
|
|
1084
|
+
currentMaterial.refraction = parseFloat(value);
|
|
1085
|
+
break;
|
|
1086
|
+
case "illum":
|
|
1087
|
+
currentMaterial.illumination = parseFloat(value);
|
|
1088
|
+
break;
|
|
1089
|
+
default:
|
|
1090
|
+
break;
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
return materials;
|
|
1094
|
+
}
|
|
1095
|
+
function parseColor(value, options) {
|
|
1096
|
+
const rgb = value.split(DELIMITER_PATTERN, 3);
|
|
1097
|
+
const color = [
|
|
1098
|
+
parseFloat(rgb[0]),
|
|
1099
|
+
parseFloat(rgb[1]),
|
|
1100
|
+
parseFloat(rgb[2])
|
|
1101
|
+
];
|
|
1102
|
+
return color;
|
|
1103
|
+
}
|
|
1104
|
+
var DELIMITER_PATTERN;
|
|
1105
|
+
var init_parse_mtl = __esm({
|
|
1106
|
+
"src/lib/parse-mtl.ts"() {
|
|
1107
|
+
DELIMITER_PATTERN = /\s+/;
|
|
1108
|
+
}
|
|
1109
|
+
});
|
|
1110
|
+
|
|
1037
1111
|
// src/obj-loader.ts
|
|
1038
1112
|
function testOBJFile(text) {
|
|
1039
1113
|
return text[0] === "v";
|
|
@@ -1058,24 +1132,55 @@
|
|
|
1058
1132
|
}
|
|
1059
1133
|
});
|
|
1060
1134
|
|
|
1135
|
+
// src/mtl-loader.ts
|
|
1136
|
+
var VERSION2, MTLLoader;
|
|
1137
|
+
var init_mtl_loader = __esm({
|
|
1138
|
+
"src/mtl-loader.ts"() {
|
|
1139
|
+
VERSION2 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
|
|
1140
|
+
MTLLoader = {
|
|
1141
|
+
name: "MTL",
|
|
1142
|
+
id: "mtl",
|
|
1143
|
+
module: "mtl",
|
|
1144
|
+
version: VERSION2,
|
|
1145
|
+
worker: true,
|
|
1146
|
+
extensions: ["mtl"],
|
|
1147
|
+
mimeTypes: ["text/plain"],
|
|
1148
|
+
testText: (text) => text.includes("newmtl"),
|
|
1149
|
+
options: {
|
|
1150
|
+
mtl: {}
|
|
1151
|
+
}
|
|
1152
|
+
};
|
|
1153
|
+
}
|
|
1154
|
+
});
|
|
1155
|
+
|
|
1061
1156
|
// src/index.ts
|
|
1062
1157
|
var src_exports = {};
|
|
1063
1158
|
__export(src_exports, {
|
|
1159
|
+
MTLLoader: () => MTLLoader2,
|
|
1064
1160
|
OBJLoader: () => OBJLoader2,
|
|
1065
1161
|
OBJWorkerLoader: () => OBJLoader,
|
|
1162
|
+
_typecheckMTLLoader: () => _typecheckMTLLoader,
|
|
1066
1163
|
_typecheckOBJLoader: () => _typecheckOBJLoader
|
|
1067
1164
|
});
|
|
1068
|
-
var OBJLoader2, _typecheckOBJLoader;
|
|
1165
|
+
var OBJLoader2, MTLLoader2, _typecheckOBJLoader, _typecheckMTLLoader;
|
|
1069
1166
|
var init_src2 = __esm({
|
|
1070
1167
|
"src/index.ts"() {
|
|
1071
|
-
|
|
1168
|
+
init_parse_obj();
|
|
1169
|
+
init_parse_mtl();
|
|
1072
1170
|
init_obj_loader();
|
|
1171
|
+
init_mtl_loader();
|
|
1073
1172
|
OBJLoader2 = {
|
|
1074
1173
|
...OBJLoader,
|
|
1075
|
-
parse: async (arrayBuffer, options) =>
|
|
1076
|
-
parseTextSync:
|
|
1174
|
+
parse: async (arrayBuffer, options) => parseOBJ(new TextDecoder().decode(arrayBuffer), options),
|
|
1175
|
+
parseTextSync: (text, options) => parseOBJ(text, options)
|
|
1176
|
+
};
|
|
1177
|
+
MTLLoader2 = {
|
|
1178
|
+
...MTLLoader,
|
|
1179
|
+
parse: async (arrayBuffer, options) => parseMTL(new TextDecoder().decode(arrayBuffer), options?.mtl),
|
|
1180
|
+
parseTextSync: (text, options) => parseMTL(text, options?.mtl)
|
|
1077
1181
|
};
|
|
1078
1182
|
_typecheckOBJLoader = OBJLoader2;
|
|
1183
|
+
_typecheckMTLLoader = MTLLoader2;
|
|
1079
1184
|
}
|
|
1080
1185
|
});
|
|
1081
1186
|
|
package/dist/es5/index.js
CHANGED
|
@@ -11,7 +11,7 @@ Object.defineProperty(exports, "OBJWorkerLoader", {
|
|
|
11
11
|
return _objLoader.OBJLoader;
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
|
-
exports._typecheckOBJLoader = exports.OBJLoader = void 0;
|
|
14
|
+
exports._typecheckMTLLoader = exports._typecheckOBJLoader = exports.MTLLoader = exports.OBJLoader = void 0;
|
|
15
15
|
|
|
16
16
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
17
17
|
|
|
@@ -19,10 +19,14 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
|
|
|
19
19
|
|
|
20
20
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
21
21
|
|
|
22
|
-
var
|
|
22
|
+
var _parseObj = require("./lib/parse-obj");
|
|
23
|
+
|
|
24
|
+
var _parseMtl = require("./lib/parse-mtl");
|
|
23
25
|
|
|
24
26
|
var _objLoader = require("./obj-loader");
|
|
25
27
|
|
|
28
|
+
var _mtlLoader = require("./mtl-loader");
|
|
29
|
+
|
|
26
30
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
27
31
|
|
|
28
32
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
@@ -34,7 +38,7 @@ var OBJLoader = _objectSpread(_objectSpread({}, _objLoader.OBJLoader), {}, {
|
|
|
34
38
|
while (1) {
|
|
35
39
|
switch (_context.prev = _context.next) {
|
|
36
40
|
case 0:
|
|
37
|
-
return _context.abrupt("return", (0,
|
|
41
|
+
return _context.abrupt("return", (0, _parseObj.parseOBJ)(new TextDecoder().decode(arrayBuffer), options));
|
|
38
42
|
|
|
39
43
|
case 1:
|
|
40
44
|
case "end":
|
|
@@ -50,10 +54,44 @@ var OBJLoader = _objectSpread(_objectSpread({}, _objLoader.OBJLoader), {}, {
|
|
|
50
54
|
|
|
51
55
|
return parse;
|
|
52
56
|
}(),
|
|
53
|
-
parseTextSync:
|
|
57
|
+
parseTextSync: function parseTextSync(text, options) {
|
|
58
|
+
return (0, _parseObj.parseOBJ)(text, options);
|
|
59
|
+
}
|
|
54
60
|
});
|
|
55
61
|
|
|
56
62
|
exports.OBJLoader = OBJLoader;
|
|
63
|
+
|
|
64
|
+
var MTLLoader = _objectSpread(_objectSpread({}, _mtlLoader.MTLLoader), {}, {
|
|
65
|
+
parse: function () {
|
|
66
|
+
var _parse2 = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(arrayBuffer, options) {
|
|
67
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
68
|
+
while (1) {
|
|
69
|
+
switch (_context2.prev = _context2.next) {
|
|
70
|
+
case 0:
|
|
71
|
+
return _context2.abrupt("return", (0, _parseMtl.parseMTL)(new TextDecoder().decode(arrayBuffer), options === null || options === void 0 ? void 0 : options.mtl));
|
|
72
|
+
|
|
73
|
+
case 1:
|
|
74
|
+
case "end":
|
|
75
|
+
return _context2.stop();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}, _callee2);
|
|
79
|
+
}));
|
|
80
|
+
|
|
81
|
+
function parse(_x3, _x4) {
|
|
82
|
+
return _parse2.apply(this, arguments);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return parse;
|
|
86
|
+
}(),
|
|
87
|
+
parseTextSync: function parseTextSync(text, options) {
|
|
88
|
+
return (0, _parseMtl.parseMTL)(text, options === null || options === void 0 ? void 0 : options.mtl);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
exports.MTLLoader = MTLLoader;
|
|
57
93
|
var _typecheckOBJLoader = OBJLoader;
|
|
58
94
|
exports._typecheckOBJLoader = _typecheckOBJLoader;
|
|
95
|
+
var _typecheckMTLLoader = MTLLoader;
|
|
96
|
+
exports._typecheckMTLLoader = _typecheckMTLLoader;
|
|
59
97
|
//# sourceMappingURL=index.js.map
|
package/dist/es5/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"names":["OBJLoader","OBJWorkerLoader","parse","arrayBuffer","options","TextDecoder","decode","parseTextSync","
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"names":["OBJLoader","OBJWorkerLoader","parse","arrayBuffer","options","TextDecoder","decode","parseTextSync","text","MTLLoader","MTLWorkerLoader","mtl","_typecheckOBJLoader","_typecheckMTLLoader"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AAEA;;AAEA;;;;;;AASO,IAAMA,SAAS,mCACjBC,oBADiB;AAEpBC,EAAAA,KAAK;AAAA,2EAAE,iBAAOC,WAAP,EAAiCC,OAAjC;AAAA;AAAA;AAAA;AAAA;AAAA,+CACL,wBAAS,IAAIC,WAAJ,GAAkBC,MAAlB,CAAyBH,WAAzB,CAAT,EAAgDC,OAAhD,CADK;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAF;;AAAA;AAAA;AAAA;;AAAA;AAAA,KAFe;AAIpBG,EAAAA,aAAa,EAAE,uBAACC,IAAD,EAAeJ,OAAf;AAAA,WAA8C,wBAASI,IAAT,EAAeJ,OAAf,CAA9C;AAAA;AAJK,EAAf;;;;AAYA,IAAMK,SAAS,mCACjBC,oBADiB;AAEpBR,EAAAA,KAAK;AAAA,4EAAE,kBAAOC,WAAP,EAAiCC,OAAjC;AAAA;AAAA;AAAA;AAAA;AAAA,gDACL,wBAAS,IAAIC,WAAJ,GAAkBC,MAAlB,CAAyBH,WAAzB,CAAT,EAAgDC,OAAhD,aAAgDA,OAAhD,uBAAgDA,OAAO,CAAEO,GAAzD,CADK;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAF;;AAAA;AAAA;AAAA;;AAAA;AAAA,KAFe;AAIpBJ,EAAAA,aAAa,EAAE,uBAACC,IAAD,EAAeJ,OAAf;AAAA,WAA8C,wBAASI,IAAT,EAAeJ,OAAf,aAAeA,OAAf,uBAAeA,OAAO,CAAEO,GAAxB,CAA9C;AAAA;AAJK,EAAf;;;AAOA,IAAMC,mBAAqC,GAAGZ,SAA9C;;AACA,IAAMa,mBAAqC,GAAGJ,SAA9C","sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {parseOBJ} from './lib/parse-obj';\nimport {parseMTL} from './lib/parse-mtl';\nimport type {OBJLoaderOptions} from './obj-loader';\nimport {OBJLoader as OBJWorkerLoader} from './obj-loader';\nimport type {MTLLoaderOptions} from './mtl-loader';\nimport {MTLLoader as MTLWorkerLoader} from './mtl-loader';\n\n// OBJLoader\n\nexport {OBJWorkerLoader};\n\n/**\n * Loader for the OBJ geometry format\n */\nexport const OBJLoader = {\n ...OBJWorkerLoader,\n parse: async (arrayBuffer: ArrayBuffer, options?: OBJLoaderOptions) =>\n parseOBJ(new TextDecoder().decode(arrayBuffer), options),\n parseTextSync: (text: string, options?: OBJLoaderOptions) => parseOBJ(text, options)\n};\n\n// MTLLoader\n\n/**\n * Loader for the MTL material format\n */\nexport const MTLLoader = {\n ...MTLWorkerLoader,\n parse: async (arrayBuffer: ArrayBuffer, options?: MTLLoaderOptions) =>\n parseMTL(new TextDecoder().decode(arrayBuffer), options?.mtl),\n parseTextSync: (text: string, options?: MTLLoaderOptions) => parseMTL(text, options?.mtl)\n};\n\nexport const _typecheckOBJLoader: LoaderWithParser = OBJLoader;\nexport const _typecheckMTLLoader: LoaderWithParser = MTLLoader;\n"],"file":"index.js"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.parseMTL = parseMTL;
|
|
7
|
+
|
|
8
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
9
|
+
|
|
10
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
11
|
+
|
|
12
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
13
|
+
|
|
14
|
+
var DELIMITER_PATTERN = /\s+/;
|
|
15
|
+
|
|
16
|
+
function parseMTL(text, options) {
|
|
17
|
+
var materials = [];
|
|
18
|
+
var currentMaterial = {
|
|
19
|
+
name: 'placeholder'
|
|
20
|
+
};
|
|
21
|
+
var lines = text.split('\n');
|
|
22
|
+
|
|
23
|
+
var _iterator = _createForOfIteratorHelper(lines),
|
|
24
|
+
_step;
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
28
|
+
var line = _step.value;
|
|
29
|
+
line = line.trim();
|
|
30
|
+
|
|
31
|
+
if (line.length === 0 || line.charAt(0) === '#') {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var pos = line.indexOf(' ');
|
|
36
|
+
var key = pos >= 0 ? line.substring(0, pos) : line;
|
|
37
|
+
key = key.toLowerCase();
|
|
38
|
+
var value = pos >= 0 ? line.substring(pos + 1) : '';
|
|
39
|
+
value = value.trim();
|
|
40
|
+
|
|
41
|
+
switch (key) {
|
|
42
|
+
case 'newmtl':
|
|
43
|
+
currentMaterial = {
|
|
44
|
+
name: value
|
|
45
|
+
};
|
|
46
|
+
materials.push(currentMaterial);
|
|
47
|
+
break;
|
|
48
|
+
|
|
49
|
+
case 'ka':
|
|
50
|
+
currentMaterial.ambientColor = parseColor(value);
|
|
51
|
+
break;
|
|
52
|
+
|
|
53
|
+
case 'kd':
|
|
54
|
+
currentMaterial.diffuseColor = parseColor(value);
|
|
55
|
+
break;
|
|
56
|
+
|
|
57
|
+
case 'map_kd':
|
|
58
|
+
currentMaterial.diffuseTextureUrl = value;
|
|
59
|
+
break;
|
|
60
|
+
|
|
61
|
+
case 'ks':
|
|
62
|
+
currentMaterial.specularColor = parseColor(value);
|
|
63
|
+
break;
|
|
64
|
+
|
|
65
|
+
case 'map_ks':
|
|
66
|
+
currentMaterial.specularTextureUrl = value;
|
|
67
|
+
break;
|
|
68
|
+
|
|
69
|
+
case 'ke':
|
|
70
|
+
currentMaterial.emissiveColor = parseColor(value);
|
|
71
|
+
break;
|
|
72
|
+
|
|
73
|
+
case 'map_ke':
|
|
74
|
+
currentMaterial.emissiveTextureUrl = value;
|
|
75
|
+
break;
|
|
76
|
+
|
|
77
|
+
case 'ns':
|
|
78
|
+
currentMaterial.shininess = parseFloat(value);
|
|
79
|
+
break;
|
|
80
|
+
|
|
81
|
+
case 'map_ns':
|
|
82
|
+
break;
|
|
83
|
+
|
|
84
|
+
case 'ni':
|
|
85
|
+
currentMaterial.refraction = parseFloat(value);
|
|
86
|
+
break;
|
|
87
|
+
|
|
88
|
+
case 'illum':
|
|
89
|
+
currentMaterial.illumination = parseFloat(value);
|
|
90
|
+
break;
|
|
91
|
+
|
|
92
|
+
default:
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
} catch (err) {
|
|
97
|
+
_iterator.e(err);
|
|
98
|
+
} finally {
|
|
99
|
+
_iterator.f();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return materials;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function parseColor(value, options) {
|
|
106
|
+
var rgb = value.split(DELIMITER_PATTERN, 3);
|
|
107
|
+
var color = [parseFloat(rgb[0]), parseFloat(rgb[1]), parseFloat(rgb[2])];
|
|
108
|
+
return color;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=parse-mtl.js.map
|