Mercurial > hg > Members > e085722 > map
diff resources/render/Image_xml.js @ 0:0b8d8ce99f46 default tip
commit
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 14 Feb 2011 17:06:56 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resources/render/Image_xml.js Mon Feb 14 17:06:56 2011 +0900 @@ -0,0 +1,196 @@ +function createFromXMLfile(gl,sgroot,url){ + if(gl.obj == undefined) gl.obj = new Object(); + var xmlChara = new Object(); + xmlChara = parsePanel(url); + for (var name in xmlChara) + { + gl.obj[name] = makeXmlObj(gl, xmlChara[name]); + gl.obj[name].texture = loadImageTexture(gl, xmlChara[name].image); + gl.obj[name].name = name; + } +} + +function createFromXMLfile2(gl,url){ + if(gl.obj == undefined) gl.obj = new Object(); + var xmlChara = new Object(); + xmlChara = parsePanel2(url); + for (var name in xmlChara) + { + gl.obj[name] = makeXmlObj(gl, xmlChara[name]); + gl.obj[name].texture = loadImageTexture(gl, xmlChara[name].image); + gl.obj[name].name = name; + } +} + +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 parsePanel2(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"]); + obj.image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVQokWP8/fs3AymAiSTVoxpGNQwpDQAwxQMRlevqcQAAAABJRU5ErkJggg=='; + } + } 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"]); + obj.image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVQokWP8/fs3AymAiSTVoxpGNQwpDQAwxQMRlevqcQAAAABJRU5ErkJggg=='; + } + return xmlObj; +} + + +function parseName(url) { + var http = new JKL.ParseXML(url); + var data = http.parse()["OBJECT-3D"]; + var names = new Array(); + if (data["surface"][0]) { + for (var i in data["surface"]) { + names.push(data["surface"][i]["name"]); + } + } else { + names.push(data["surface"]["name"]); + } + return names; +} + + +function parseCoordinate(url ,name, map) { + var http = new JKL.ParseXML(url); + var data = http.parse()["OBJECT-3D"]; + if (data["surface"][0]) { + for (var i in data["surface"]) { + if(data["surface"][i]["name"] == name){ + map = map.concat(splitVector(data["surface"][i]["coordinate"])); + } + } + } else { + if(data["surface"]["name"] == name){ + map = map.concat(splitVector(data["surface"]["coordinate"])); + } + } + return map; +} + + + +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])); + normalData.push(parseFloat(xmlObj.normal[i+1])); + normalData.push(parseFloat(xmlObj.normal[i+2])); + } + + var retval = { }; + //オブジェクトの横幅,縦幅を求める + retval.w = xmax - xmin; + retval.h = ymax - ymin; + retval.model_x = model.x; + retval.model_y = model.y; + retval.model_z = model.z; + + + 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; +} +