47 lines
No EOL
1.6 KiB
JavaScript
47 lines
No EOL
1.6 KiB
JavaScript
import { Mesh } from '../core/Mesh.js'
|
|
|
|
export const OBJ = (obj) => {
|
|
|
|
var verticies = []
|
|
var indicies = []
|
|
var normals = []
|
|
var uvs = []
|
|
|
|
var indexedNormals = [];
|
|
var indexedUvs = [];
|
|
|
|
obj.split('\n').forEach((line) => {
|
|
const tokens = line.toLowerCase().trim().split(' ').filter((str) => str !== '')
|
|
if(tokens.length < 1) return;
|
|
if(tokens[0] === 'v') {
|
|
verticies.push(parseFloat(tokens[1]))
|
|
verticies.push(parseFloat(tokens[2]))
|
|
verticies.push(parseFloat(tokens[3]))
|
|
} else if(tokens[0] === 'vt') {
|
|
uvs.push(parseFloat(tokens[1]))
|
|
uvs.push(parseFloat(tokens[2]))
|
|
} else if(tokens[0] === 'vn') {
|
|
normals.push(parseFloat(tokens[1]))
|
|
normals.push(parseFloat(tokens[2]))
|
|
normals.push(parseFloat(tokens[3]))
|
|
} else if(tokens[0] === 'f') {
|
|
for (let i = 1; i < 4; i++) {
|
|
const index = tokens[i].split('/').filter((str) => str !== '').map((s) => parseInt(s) - 1)
|
|
indicies.push(index[0])
|
|
indexedUvs[index[0]*2] = uvs[index[1]*2]
|
|
indexedUvs[index[0]*2+1] = uvs[index[1]*2+1]
|
|
indexedNormals[index[0]*3] = normals[index[2]*3]
|
|
indexedNormals[index[0]*3+1] = normals[index[2]*3+1]
|
|
indexedNormals[index[0]*3+2] = normals[index[2]*3+2]
|
|
}
|
|
}
|
|
})
|
|
|
|
return new Mesh(indicies.length)
|
|
.indicies(indicies)
|
|
.store(verticies, 3)
|
|
.store(indexedNormals, 3)
|
|
.store(indexedUvs, 2)
|
|
.finish()
|
|
|
|
} |