webgl/public/gl/geometry/OBJ.js
2023-01-19 21:21:17 -05:00

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()
}