function parsePanel( url ) { var http = new JKL.ParseXML( url ); var data = http.parse()["OBJECT-3D"]; var xmlObj = new Object(); if (data["surface"][0]) { for (var i in data["surface"]) { var obj = xmlObj[data["surface"][i]["name"]] = new Object(); obj.vertex = splitVector(data["surface"][i]["coordinate"]); obj.normal = splitVector(data["surface"][i]["normal"]); obj.texCoords = splitVector(data["surface"][i]["texture"]); obj.model = splitVector(data["surface"][i]["model"]); var xmlObjImage = data["surface"][i]["image"]; obj.image = 'data:image/png;base64,'+xmlObjImage["#text"]; } } else { var obj = xmlObj[data["surface"]["name"]] = new Object(); obj.vertex = splitVector(data["surface"]["coordinate"]); obj.normal = splitVector(data["surface"]["normal"]); obj.texCoords = splitVector(data["surface"]["texture"]); obj.model = splitVector(data["surface"]["model"]); var xmlObjImage = data["surface"]["image"]; obj.image = 'data:image/png;base64,'+xmlObjImage["#text"]; } return xmlObj; } function splitVector(str) { // return str.replace(/^\s+/g, "").replace(/\s+/g, " ").split(" "); return str.replace(/^\s+/g, "").replace(/\s+/g, " ").replace(/\s$/g, "").split(" "); } function makeXmlObj(ctx, xmlObj) { var model = new Object(); model.x = parseFloat(xmlObj.model[0]); model.y = parseFloat(xmlObj.model[1]); model.z = parseFloat(xmlObj.model[2]); var geometryData = [ ]; var normalData = [ ]; var texCoordData = [ ]; var indexData = [ ]; var index = 0; var xmax = 0; var xmin = 0; var ymax = 0; var ymin = 0; for(var i=0; xmlObj.vertex[i]; i+=3){ geometryData.push(parseFloat(xmlObj.vertex[i]) - model.x); geometryData.push(parseFloat(xmlObj.vertex[i+1]) - model.y); geometryData.push(parseFloat(xmlObj.vertex[i+2]) - model.z); if ( (i % 3) == 0) { indexData.push(index); index++; } //オブジェクトの最大・最小のx,y座標を求める if ( i == 0) { xmax = geometryData[0]; xmin = geometryData[0]; ymax = geometryData[1]; ymin = geometryData[1]; } if ( i > 0 ){ xmax = Math.max( xmax, geometryData[i]); xmin = Math.min( xmin, geometryData[i]); ymax = Math.max( ymax, geometryData[i+1]); ymin = Math.min( ymin, geometryData[i+1]); } } for(i=0; xmlObj.texCoords[i]; i++){ texCoordData.push(parseFloat(xmlObj.texCoords[i])); } for(i=0; xmlObj.normal[i]; i+=3){ normalData.push(parseFloat(xmlObj.normal[i]) - model.x); normalData.push(parseFloat(xmlObj.normal[i+1]) - model.y); normalData.push(parseFloat(xmlObj.normal[i+2]) - model.z); } var retval = { }; //オブジェクトの横幅,縦幅を求める retval.w = xmax - xmin; retval.h = ymax - ymin; retval.normalObject = ctx.createBuffer(); ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject); ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW); retval.texCoordObject = ctx.createBuffer(); ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject); ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW); retval.vertexObject = ctx.createBuffer(); ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject); ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW); retval.numIndices = indexData.length; retval.indexObject = ctx.createBuffer(); ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject); ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW); return retval; } function makeOrthoPara(left, right, bottom, top) { this.left = left; this.right = right; this.bottom = bottom; this.top = top; return this; }