2025-06-14 01:05:08 -04:00
|
|
|
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
|
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
2025-07-06 23:44:33 -04:00
|
|
|
(function() {
|
|
|
|
|
|
|
|
|
|
let load = self.load = self.load || {};
|
|
|
|
|
if (load.OBJ) return;
|
|
|
|
|
|
|
|
|
|
gapp.register('load.obj');
|
|
|
|
|
|
|
|
|
|
load.OBJ = {
|
|
|
|
|
parse,
|
|
|
|
|
parseAsync
|
|
|
|
|
};
|
2025-06-14 01:05:08 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {String} text
|
|
|
|
|
* @returns {Array} vertex face array
|
|
|
|
|
*/
|
2025-07-06 23:44:33 -04:00
|
|
|
|
|
|
|
|
function parseAsync(text) {
|
2025-06-14 01:05:08 -04:00
|
|
|
return new Promise((resolve,reject) => {
|
|
|
|
|
resolve(parse(text));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 23:44:33 -04:00
|
|
|
function parse(text) {
|
|
|
|
|
|
2025-06-14 01:05:08 -04:00
|
|
|
let lines = text.replaceAll(/ +/g,' ').split('\n').map(l => l.trim());
|
|
|
|
|
let verts = [];
|
|
|
|
|
let faces = [];
|
|
|
|
|
let objs = [ faces ];
|
|
|
|
|
|
|
|
|
|
for (let line of lines) {
|
|
|
|
|
let toks = line.split(' ');
|
|
|
|
|
switch (toks.shift()) {
|
|
|
|
|
case 'v':
|
|
|
|
|
let v = toks.map(v => parseFloat(v)).slice(0,3);
|
|
|
|
|
if (v.length < 3) {
|
|
|
|
|
console.log('??',toks,line);
|
|
|
|
|
}
|
|
|
|
|
verts.push(v);
|
|
|
|
|
break;
|
|
|
|
|
case 'f':
|
|
|
|
|
let tok = toks.map(f => parseInt(f.split('/')[0]));
|
|
|
|
|
if (tok.length > 3) {
|
|
|
|
|
const p = tok.map(t => verts[t-1]).flat();
|
2025-07-06 23:44:33 -04:00
|
|
|
const t = base.util.triangulate(p, [], 3, true);
|
2025-06-14 01:05:08 -04:00
|
|
|
const r = t.map(i => tok[i]);
|
|
|
|
|
for (let v of r) {
|
|
|
|
|
faces.appendAll(verts[v - 1]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// add support for negative indices (offset from last vertex array point)
|
|
|
|
|
faces.appendAll(verts[tok[0]-1]);
|
|
|
|
|
faces.appendAll(verts[tok[1]-1]);
|
|
|
|
|
faces.appendAll(verts[tok[2]-1]);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'g':
|
|
|
|
|
if (faces.length) {
|
|
|
|
|
objs.push(faces = []);
|
|
|
|
|
}
|
|
|
|
|
if (toks[0]) {
|
|
|
|
|
faces.name = toks.join(' ');
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return objs;
|
|
|
|
|
}
|
2025-07-06 23:44:33 -04:00
|
|
|
|
|
|
|
|
})();
|