Mercurial > hg > Members > e085737 > sample
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 |