view 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 source

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;
}