0
|
1 function createFromXMLfile(gl,sgroot,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 function createFromXMLfile2(gl,url){
|
|
14 if(gl.obj == undefined) gl.obj = new Object();
|
|
15 var xmlChara = new Object();
|
|
16 xmlChara = parsePanel2(url);
|
|
17 for (var name in xmlChara)
|
|
18 {
|
|
19 gl.obj[name] = makeXmlObj(gl, xmlChara[name]);
|
|
20 gl.obj[name].texture = loadImageTexture(gl, xmlChara[name].image);
|
|
21 gl.obj[name].name = name;
|
|
22 }
|
|
23 }
|
|
24
|
|
25 function parsePanel(url) {
|
|
26 var http = new JKL.ParseXML(url);
|
|
27 var data = http.parse()["OBJECT-3D"];
|
|
28 var xmlObj = new Object();
|
|
29 if (data["surface"][0]) {
|
|
30 for (var i in data["surface"]) {
|
|
31 var obj = xmlObj[data["surface"][i]["name"]] = new Object();
|
|
32 obj.vertex = splitVector(data["surface"][i]["coordinate"]);
|
|
33 obj.normal = splitVector(data["surface"][i]["normal"]);
|
|
34 obj.texCoords = splitVector(data["surface"][i]["texture"]);
|
|
35 obj.model = splitVector(data["surface"][i]["model"]);
|
|
36 var xmlObjImage = data["surface"][i]["image"];
|
|
37 obj.image = 'data:image/png;base64,'+xmlObjImage["#text"];
|
|
38 }
|
|
39 } else {
|
|
40 var obj = xmlObj[data["surface"]["name"]] = new Object();
|
|
41 obj.vertex = splitVector(data["surface"]["coordinate"]);
|
|
42 obj.normal = splitVector(data["surface"]["normal"]);
|
|
43 obj.texCoords = splitVector(data["surface"]["texture"]);
|
|
44 obj.model = splitVector(data["surface"]["model"]);
|
|
45 var xmlObjImage = data["surface"]["image"];
|
|
46 obj.image = 'data:image/png;base64,'+xmlObjImage["#text"];
|
|
47 }
|
|
48 return xmlObj;
|
|
49 }
|
|
50
|
|
51 function parsePanel2(url) {
|
|
52 var http = new JKL.ParseXML(url);
|
|
53 var data = http.parse()["OBJECT-3D"];
|
|
54 var xmlObj = new Object();
|
|
55
|
|
56 if (data["surface"][0]) {
|
|
57 for (var i in data["surface"]) {
|
|
58 var obj = xmlObj[data["surface"][i]["name"]] = new Object();
|
|
59 obj.vertex = splitVector(data["surface"][i]["coordinate"]);
|
|
60 obj.normal = splitVector(data["surface"][i]["normal"]);
|
|
61 obj.texCoords = splitVector(data["surface"][i]["texture"]);
|
|
62 obj.model = splitVector(data["surface"][i]["model"]);
|
|
63 obj.image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVQokWP8/fs3AymAiSTVoxpGNQwpDQAwxQMRlevqcQAAAABJRU5ErkJggg==';
|
|
64 }
|
|
65 } else {
|
|
66 var obj = xmlObj[data["surface"]["name"]] = new Object();
|
|
67 obj.vertex = splitVector(data["surface"]["coordinate"]);
|
|
68 obj.normal = splitVector(data["surface"]["normal"]);
|
|
69 obj.texCoords = splitVector(data["surface"]["texture"]);
|
|
70 obj.model = splitVector(data["surface"]["model"]);
|
|
71 obj.image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVQokWP8/fs3AymAiSTVoxpGNQwpDQAwxQMRlevqcQAAAABJRU5ErkJggg==';
|
|
72 }
|
|
73 return xmlObj;
|
|
74 }
|
|
75
|
|
76
|
|
77 function parseName(url) {
|
|
78 var http = new JKL.ParseXML(url);
|
|
79 var data = http.parse()["OBJECT-3D"];
|
|
80 var names = new Array();
|
|
81 if (data["surface"][0]) {
|
|
82 for (var i in data["surface"]) {
|
|
83 names.push(data["surface"][i]["name"]);
|
|
84 }
|
|
85 } else {
|
|
86 names.push(data["surface"]["name"]);
|
|
87 }
|
|
88 return names;
|
|
89 }
|
|
90
|
|
91
|
|
92 function parseCoordinate(url ,name, map) {
|
|
93 var http = new JKL.ParseXML(url);
|
|
94 var data = http.parse()["OBJECT-3D"];
|
|
95 if (data["surface"][0]) {
|
|
96 for (var i in data["surface"]) {
|
|
97 if(data["surface"][i]["name"] == name){
|
|
98 map = map.concat(splitVector(data["surface"][i]["coordinate"]));
|
|
99 }
|
|
100 }
|
|
101 } else {
|
|
102 if(data["surface"]["name"] == name){
|
|
103 map = map.concat(splitVector(data["surface"]["coordinate"]));
|
|
104 }
|
|
105 }
|
|
106 return map;
|
|
107 }
|
|
108
|
|
109
|
|
110
|
|
111 function splitVector(str) {
|
|
112 // return str.replace(/^\s+/g, "").replace(/\s+/g, " ").split(" ");
|
|
113 return str.replace(/^\s+/g, "").replace(/\s+/g, " ").replace(/\s$/g, "").split(" ");
|
|
114 }
|
|
115
|
|
116 function makeXmlObj(ctx, xmlObj)
|
|
117 {
|
|
118
|
|
119 var model = new Object();
|
|
120 model.x = parseFloat(xmlObj.model[0]);
|
|
121 model.y = parseFloat(xmlObj.model[1]);
|
|
122 model.z = parseFloat(xmlObj.model[2]);
|
|
123
|
|
124 var geometryData = [ ];
|
|
125 var normalData = [ ];
|
|
126 var texCoordData = [ ];
|
|
127 var indexData = [ ];
|
|
128 var index = 0;
|
|
129 var xmax = 0;
|
|
130 var xmin = 0;
|
|
131 var ymax = 0;
|
|
132 var ymin = 0;
|
|
133
|
|
134
|
|
135 for(var i=0; xmlObj.vertex[i]; i+=3){
|
|
136 geometryData.push(parseFloat(xmlObj.vertex[i]) - model.x);
|
|
137 geometryData.push(parseFloat(xmlObj.vertex[i+1]) - model.y);
|
|
138 geometryData.push(parseFloat(xmlObj.vertex[i+2]) - model.z);
|
|
139 if ( (i % 3) == 0) {
|
|
140 indexData.push(index);
|
|
141 index++;
|
|
142 }
|
|
143 //オブジェクトの最大・最小のx,y座標を求める
|
|
144 if ( i == 0) {
|
|
145 xmax = geometryData[0];
|
|
146 xmin = geometryData[0];
|
|
147 ymax = geometryData[1];
|
|
148 ymin = geometryData[1];
|
|
149 }
|
|
150 if ( i > 0 ){
|
|
151 xmax = Math.max( xmax, geometryData[i]);
|
|
152 xmin = Math.min( xmin, geometryData[i]);
|
|
153 ymax = Math.max( ymax, geometryData[i+1]);
|
|
154 ymin = Math.min( ymin, geometryData[i+1]);
|
|
155 }
|
|
156
|
|
157 }
|
|
158 for(i=0; xmlObj.texCoords[i]; i++){
|
|
159 texCoordData.push(parseFloat(xmlObj.texCoords[i]));
|
|
160
|
|
161 }
|
|
162 for(i=0; xmlObj.normal[i]; i+=3){
|
|
163 normalData.push(parseFloat(xmlObj.normal[i]));
|
|
164 normalData.push(parseFloat(xmlObj.normal[i+1]));
|
|
165 normalData.push(parseFloat(xmlObj.normal[i+2]));
|
|
166 }
|
|
167
|
|
168 var retval = { };
|
|
169 //オブジェクトの横幅,縦幅を求める
|
|
170 retval.w = xmax - xmin;
|
|
171 retval.h = ymax - ymin;
|
|
172 retval.model_x = model.x;
|
|
173 retval.model_y = model.y;
|
|
174 retval.model_z = model.z;
|
|
175
|
|
176
|
|
177 retval.normalObject = ctx.createBuffer();
|
|
178 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject);
|
|
179 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW);
|
|
180
|
|
181 retval.texCoordObject = ctx.createBuffer();
|
|
182 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject);
|
|
183 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW);
|
|
184
|
|
185 retval.vertexObject = ctx.createBuffer();
|
|
186 ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject);
|
|
187 ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW);
|
|
188
|
|
189 retval.numIndices = indexData.length;
|
|
190 retval.indexObject = ctx.createBuffer();
|
|
191 ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject);
|
|
192 ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW);
|
|
193
|
|
194 return retval;
|
|
195 }
|
|
196
|