You can clone with HTTPS or Subversion.
Clone in Desktop Download ZIP![]()
Cannot 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> |