You can clone with HTTPS or Subversion.
Clone in Desktop Download ZIPCannot retrieve contributors at this time
<html> | |
<head> | |
<script type="text/javascript"> | |
/** | |
* This code was adapted from the Apple-developed WebGL demo at | |
* https://www.khronos.org/registry/webgl/sdk/demos/webkit/TeapotPerVertex.html | |
* Copyright as below. | |
*/ | |
/* | |
* Copyright (C) 2009 Apple Inc. All Rights Reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions | |
* are met: | |
* 1. Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in the | |
* documentation and/or other materials provided with the distribution. | |
* | |
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY | |
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR | |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
function loadObj(url) | |
{ | |
var req = new XMLHttpRequest(); | |
req.onreadystatechange = function () { processLoadObj(req) }; | |
req.open("GET", url, true); | |
req.send(null); | |
} | |
function processLoadObj(req) | |
{ | |
if (req.readyState == 4) { | |
doLoadObj(req.responseText); | |
} | |
} | |
function doLoadObj(text) | |
{ | |
vertexArray = [ ]; | |
normalArray = [ ]; | |
textureArray = [ ]; | |
indexArray = [ ]; | |
var vertex = [ ]; | |
var normal = [ ]; | |
var texture = [ ]; | |
var facemap = { }; | |
var index = 0; | |
var lines = text.split("\n"); | |
for (var lineIndex in lines) { | |
var line = lines[lineIndex].replace(/[ \t]+/g, " ").replace(/\s\s*$/, ""); | |
// ignore comments | |
if (line[0] == "#") | |
continue; | |
var array = line.split(" "); | |
if (array[0] == "v") { | |
// vertex | |
vertex.push(parseFloat(array[1])); | |
vertex.push(parseFloat(array[2])); | |
vertex.push(parseFloat(array[3])); | |
} | |
else if (array[0] == "vt") { | |
// normal | |
texture.push(parseFloat(array[1])); | |
texture.push(parseFloat(array[2])); | |
} | |
else if (array[0] == "vn") { | |
// normal | |
normal.push(parseFloat(array[1])); | |
normal.push(parseFloat(array[2])); | |
normal.push(parseFloat(array[3])); | |
} | |
else if (array[0] == "f") { | |
// face | |
if (array.length != 4) { | |
//obj.ctx.console.log("*** Error: face '"+line+"' not handled"); | |
continue; | |
} | |
for (var i = 1; i < 4; ++i) { | |
if (!(array[i] in facemap)) { | |
// add a new entry to the map and arrays | |
var f = array[i].split("/"); | |
var vtx, nor, tex; | |
if (f.length == 1) { | |
vtx = parseInt(f[0]) - 1; | |
nor = vtx; | |
tex = vtx; | |
} | |
else if (f.length = 3) { | |
vtx = parseInt(f[0]) - 1; | |
tex = parseInt(f[1]) - 1; | |
nor = parseInt(f[2]) - 1; | |
} | |
else { | |
//obj.ctx.console.log("*** Error: did not understand face '"+array[i]+"'"); | |
return null; | |
} | |
// do the vertices | |
var x = 0; | |
var y = 0; | |
var z = 0; | |
if (vtx * 3 + 2 < vertex.length) { | |
x = vertex[vtx*3]; | |
y = vertex[vtx*3+1]; | |
z = vertex[vtx*3+2]; | |
} | |
vertexArray.push(x); | |
vertexArray.push(y); | |
vertexArray.push(z); | |
// do the textures | |
x = 0; | |
y = 0; | |
if (tex * 2 + 1 < texture.length) { | |
x = texture[tex*2]; | |
y = texture[tex*2+1]; | |
} | |
textureArray.push(x); | |
textureArray.push(y); | |
// do the normals | |
x = 0; | |
y = 0; | |
z = 1; | |
if (nor * 3 + 2 < normal.length) { | |
x = normal[nor*3]; | |
y = normal[nor*3+1]; | |
z = normal[nor*3+2]; | |
} | |
normalArray.push(x); | |
normalArray.push(y); | |
normalArray.push(z); | |
facemap[array[i]] = index++; | |
} | |
indexArray.push(facemap[array[i]]); | |
} | |
} | |
} | |
result = {}; | |
result["vertexPositions"] = vertexArray; | |
result["vertexNormals"] = normalArray; | |
result["vertexTextureCoords"] = textureArray; | |
result["indices"] = indexArray;; | |
document.write(JSON.stringify(result)); | |
} | |
</script> | |
</head> | |
<body onload="loadObj('macbook.obj');"> | |
</body> | |
</html> |