Mercurial > hg > Members > e085737 > sample
comparison paper_shooting/resources/render/Image_xml.js @ 25:158b846e3874
paper
author | <e085737> |
---|---|
date | Mon, 14 Feb 2011 16:37:16 +0900 |
parents | |
children | 6468848f4d22 |
comparison
equal
deleted
inserted
replaced
24:0a153ebaa905 | 25:158b846e3874 |
---|---|
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 parseName(url) { | |
42 var http = new JKL.ParseXML(url); | |
43 var data = http.parse()["OBJECT-3D"]; | |
44 var names = new Array(); | |
45 if (data["surface"][0]) { | |
46 for (var i in data["surface"]) { | |
47 names.push(data["surface"][i]["name"]); | |
48 } | |
49 } else { | |
50 names.push(data["surface"]["name"]); | |
51 } | |
52 return names; | |
53 } | |
54 | |
55 | |
56 function splitVector(str) { | |
57 // return str.replace(/^\s+/g, "").replace(/\s+/g, " ").split(" "); | |
58 return str.replace(/^\s+/g, "").replace(/\s+/g, " ").replace(/\s$/g, "").split(" "); | |
59 } | |
60 | |
61 function makeXmlObj(ctx, xmlObj) | |
62 { | |
63 | |
64 var model = new Object(); | |
65 model.x = parseFloat(xmlObj.model[0]); | |
66 model.y = parseFloat(xmlObj.model[1]); | |
67 model.z = parseFloat(xmlObj.model[2]); | |
68 | |
69 var geometryData = [ ]; | |
70 var normalData = [ ]; | |
71 var texCoordData = [ ]; | |
72 var indexData = [ ]; | |
73 var index = 0; | |
74 var xmax = 0; | |
75 var xmin = 0; | |
76 var ymax = 0; | |
77 var ymin = 0; | |
78 | |
79 | |
80 for(var i=0; xmlObj.vertex[i]; i+=3){ | |
81 geometryData.push(parseFloat(xmlObj.vertex[i]) - model.x); | |
82 geometryData.push(parseFloat(xmlObj.vertex[i+1]) - model.y); | |
83 geometryData.push(parseFloat(xmlObj.vertex[i+2]) - model.z); | |
84 if ( (i % 3) == 0) { | |
85 indexData.push(index); | |
86 index++; | |
87 } | |
88 //オブジェクトの最大・最小のx,y座標を求める | |
89 if ( i == 0) { | |
90 xmax = geometryData[0]; | |
91 xmin = geometryData[0]; | |
92 ymax = geometryData[1]; | |
93 ymin = geometryData[1]; | |
94 } | |
95 if ( i > 0 ){ | |
96 xmax = Math.max( xmax, geometryData[i]); | |
97 xmin = Math.min( xmin, geometryData[i]); | |
98 ymax = Math.max( ymax, geometryData[i+1]); | |
99 ymin = Math.min( ymin, geometryData[i+1]); | |
100 } | |
101 | |
102 } | |
103 for(i=0; xmlObj.texCoords[i]; i++){ | |
104 texCoordData.push(parseFloat(xmlObj.texCoords[i])); | |
105 | |
106 } | |
107 for(i=0; xmlObj.normal[i]; i+=3){ | |
108 normalData.push(parseFloat(xmlObj.normal[i])); | |
109 normalData.push(parseFloat(xmlObj.normal[i+1])); | |
110 normalData.push(parseFloat(xmlObj.normal[i+2])); | |
111 } | |
112 | |
113 var retval = { }; | |
114 //オブジェクトの横幅,縦幅を求める | |
115 retval.w = xmax - xmin; | |
116 retval.h = ymax - ymin; | |
117 retval.model_x = model.x | |
118 retval.model_y = model.y | |
119 retval.model_z = model.z | |
120 | |
121 | |
122 retval.normalObject = ctx.createBuffer(); | |
123 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject); | |
124 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW); | |
125 | |
126 retval.texCoordObject = ctx.createBuffer(); | |
127 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject); | |
128 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW); | |
129 | |
130 retval.vertexObject = ctx.createBuffer(); | |
131 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject); | |
132 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW); | |
133 | |
134 retval.numIndices = indexData.length; | |
135 retval.indexObject = ctx.createBuffer(); | |
136 ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject); | |
137 ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW); | |
138 | |
139 return retval; | |
140 } | |
141 |