comparison map/resources/render/Image_xml.js @ 20:d322eed6e1c7

add
author <e085737>
date Thu, 13 Jan 2011 21:37:23 +0900
parents
children
comparison
equal deleted inserted replaced
19:1f1d330aac98 20:d322eed6e1c7
1 function createFromXMLfile(gl,url){
2 if(gl.obj == undefined) gl.obj = new Object();
3 var xmlChara = new Object();
4 xmlChara = parsePanel(url);
5 for (var name in xmlChara)
6 {
7 gl.obj[name] = makeXmlObj(gl, xmlChara[name]);
8 gl.obj[name].texture = loadImageTexture(gl, xmlChara[name].image);
9 gl.obj[name].name = name;
10 }
11 }
12
13
14 function parsePanel(url) {
15 var http = new JKL.ParseXML(url);
16 var data = http.parse()["OBJECT-3D"];
17 var xmlObj = new Object();
18
19 if (data["surface"][0]) {
20 for (var i in data["surface"]) {
21 var obj = xmlObj[data["surface"][i]["name"]] = new Object();
22 obj.vertex = splitVector(data["surface"][i]["coordinate"]);
23 obj.normal = splitVector(data["surface"][i]["normal"]);
24 obj.texCoords = splitVector(data["surface"][i]["texture"]);
25 obj.model = splitVector(data["surface"][i]["model"]);
26 var xmlObjImage = data["surface"][i]["image"];
27 obj.image = 'data:image/png;base64,'+xmlObjImage["#text"];
28 }
29 } else {
30 var obj = xmlObj[data["surface"]["name"]] = new Object();
31 obj.vertex = splitVector(data["surface"]["coordinate"]);
32 obj.normal = splitVector(data["surface"]["normal"]);
33 obj.texCoords = splitVector(data["surface"]["texture"]);
34 obj.model = splitVector(data["surface"]["model"]);
35 var xmlObjImage = data["surface"]["image"];
36 obj.image = 'data:image/png;base64,'+xmlObjImage["#text"];
37 }
38 return xmlObj;
39 }
40
41 function splitVector(str) {
42 // return str.replace(/^\s+/g, "").replace(/\s+/g, " ").split(" ");
43 return str.replace(/^\s+/g, "").replace(/\s+/g, " ").replace(/\s$/g, "").split(" ");
44 }
45
46 function makeXmlObj(ctx, xmlObj)
47 {
48
49 var model = new Object();
50 model.x = parseFloat(xmlObj.model[0]);
51 model.y = parseFloat(xmlObj.model[1]);
52 model.z = parseFloat(xmlObj.model[2]);
53
54 var geometryData = [ ];
55 var normalData = [ ];
56 var texCoordData = [ ];
57 var indexData = [ ];
58 var index = 0;
59 var xmax = 0;
60 var xmin = 0;
61 var ymax = 0;
62 var ymin = 0;
63
64
65 for(var i=0; xmlObj.vertex[i]; i+=3){
66 geometryData.push(parseFloat(xmlObj.vertex[i]) - model.x);
67 geometryData.push(parseFloat(xmlObj.vertex[i+1]) - model.y);
68 geometryData.push(parseFloat(xmlObj.vertex[i+2]) - model.z);
69 if ( (i % 3) == 0) {
70 indexData.push(index);
71 index++;
72 }
73 //オブジェクトの最大・最小のx,y座標を求める
74 if ( i == 0) {
75 xmax = geometryData[0];
76 xmin = geometryData[0];
77 ymax = geometryData[1];
78 ymin = geometryData[1];
79 }
80 if ( i > 0 ){
81 xmax = Math.max( xmax, geometryData[i]);
82 xmin = Math.min( xmin, geometryData[i]);
83 ymax = Math.max( ymax, geometryData[i+1]);
84 ymin = Math.min( ymin, geometryData[i+1]);
85 }
86
87 }
88 for(i=0; xmlObj.texCoords[i]; i++){
89 texCoordData.push(parseFloat(xmlObj.texCoords[i]));
90
91 }
92 for(i=0; xmlObj.normal[i]; i+=3){
93 normalData.push(parseFloat(xmlObj.normal[i]));
94 normalData.push(parseFloat(xmlObj.normal[i+1]));
95 normalData.push(parseFloat(xmlObj.normal[i+2]));
96 }
97
98 var retval = { };
99 //オブジェクトの横幅,縦幅を求める
100 retval.w = xmax - xmin;
101 retval.h = ymax - ymin;
102 retval.model_x = model.x
103 retval.model_y = model.y
104 retval.model_z = model.z
105
106
107 retval.normalObject = ctx.createBuffer();
108 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject);
109 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW);
110
111 retval.texCoordObject = ctx.createBuffer();
112 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject);
113 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW);
114
115 retval.vertexObject = ctx.createBuffer();
116 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject);
117 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW);
118
119 retval.numIndices = indexData.length;
120 retval.indexObject = ctx.createBuffer();
121 ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject);
122 ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW);
123
124 return retval;
125 }
126