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