1 package com.generalrobotix.ui.util;
3 import java.io.BufferedWriter;
5 import java.io.FileWriter;
6 import java.util.Vector;
7 import java.util.regex.*;
31 int idx = exportPath.lastIndexOf(File.separatorChar);
33 idx = exportPath.lastIndexOf(
'/');
34 String exportDir = exportPath.substring(0, idx);
36 BufferedWriter writer =
null;
38 writer =
new BufferedWriter(
new FileWriter(exportPath));
40 writer.write(
"#VRML V2.0 utf8\n");
42 writer.write(
"PROTO Joint [\n");
43 writer.write(
" exposedField SFVec3f center 0 0 0\n");
44 writer.write(
" exposedField MFNode children []\n");
45 writer.write(
" exposedField MFFloat llimit []\n");
46 writer.write(
" exposedField MFFloat lvlimit []\n");
47 writer.write(
" exposedField SFRotation limitOrientation 0 0 1 0\n");
48 writer.write(
" exposedField SFString name \"\"\n");
49 writer.write(
" exposedField SFRotation rotation 0 0 1 0\n");
50 writer.write(
" exposedField SFVec3f scale 1 1 1\n");
51 writer.write(
" exposedField SFRotation scaleOrientation 0 0 1 0\n");
52 writer.write(
" exposedField MFFloat stiffness [ 0 0 0 ]\n");
53 writer.write(
" exposedField SFVec3f translation 0 0 0\n");
54 writer.write(
" exposedField MFFloat ulimit []\n");
55 writer.write(
" exposedField MFFloat uvlimit []\n");
56 writer.write(
" exposedField SFString jointType \"\"\n");
57 writer.write(
" exposedField SFInt32 jointId -1\n");
58 writer.write(
" exposedField SFVec3f jointAxis 0 0 1\n");
60 writer.write(
" exposedField SFFloat gearRatio 1\n");
61 writer.write(
" exposedField SFFloat rotorInertia 0\n");
62 writer.write(
" exposedField SFFloat rotorResistor 0\n");
63 writer.write(
" exposedField SFFloat torqueConst 1\n");
64 writer.write(
" exposedField SFFloat encoderPulse 1\n");
67 writer.write(
" Transform {\n");
68 writer.write(
" center IS center\n");
69 writer.write(
" children IS children\n");
70 writer.write(
" rotation IS rotation\n");
71 writer.write(
" scale IS scale\n");
72 writer.write(
" scaleOrientation IS scaleOrientation\n");
73 writer.write(
" translation IS translation\n");
77 writer.write(
"PROTO Segment [\n");
78 writer.write(
" field SFVec3f bboxCenter 0 0 0\n");
79 writer.write(
" field SFVec3f bboxSize -1 -1 -1\n");
80 writer.write(
" exposedField SFVec3f centerOfMass 0 0 0\n");
81 writer.write(
" exposedField MFNode children [ ]\n");
82 writer.write(
" exposedField SFNode coord NULL\n");
83 writer.write(
" exposedField MFNode displacers [ ]\n");
84 writer.write(
" exposedField SFFloat mass 0 \n");
85 writer.write(
" exposedField MFFloat momentsOfInertia [ 0 0 0 0 0 0 0 0 0 ]\n");
86 writer.write(
" exposedField SFString name \"\"\n");
87 writer.write(
" eventIn MFNode addChildren\n");
88 writer.write(
" eventIn MFNode removeChildren\n");
91 writer.write(
" Group {\n");
92 writer.write(
" addChildren IS addChildren\n");
93 writer.write(
" bboxCenter IS bboxCenter\n");
94 writer.write(
" bboxSize IS bboxSize\n");
95 writer.write(
" children IS children\n");
96 writer.write(
" removeChildren IS removeChildren\n");
100 writer.write(
"PROTO Humanoid [\n");
101 writer.write(
" field SFVec3f bboxCenter 0 0 0\n");
102 writer.write(
" field SFVec3f bboxSize -1 -1 -1\n");
103 writer.write(
" exposedField SFVec3f center 0 0 0\n");
104 writer.write(
" exposedField MFNode humanoidBody [ ]\n");
105 writer.write(
" exposedField MFString info [ ]\n");
106 writer.write(
" exposedField MFNode joints [ ]\n");
107 writer.write(
" exposedField SFString name \"\"\n");
108 writer.write(
" exposedField SFRotation rotation 0 0 1 0\n");
109 writer.write(
" exposedField SFVec3f scale 1 1 1\n");
110 writer.write(
" exposedField SFRotation scaleOrientation 0 0 1 0\n");
111 writer.write(
" exposedField MFNode segments [ ]\n");
112 writer.write(
" exposedField MFNode sites [ ]\n");
113 writer.write(
" exposedField SFVec3f translation 0 0 0\n");
114 writer.write(
" exposedField SFString version \"1.1\"\n");
115 writer.write(
" exposedField MFNode viewpoints [ ]\n");
118 writer.write(
" Transform {\n");
119 writer.write(
" bboxCenter IS bboxCenter\n");
120 writer.write(
" bboxSize IS bboxSize\n");
121 writer.write(
" center IS center\n");
122 writer.write(
" rotation IS rotation\n");
123 writer.write(
" scale IS scale\n");
124 writer.write(
" scaleOrientation IS scaleOrientation\n");
125 writer.write(
" translation IS translation\n");
126 writer.write(
" children [\n");
127 writer.write(
" Group {\n");
128 writer.write(
" children IS viewpoints\n");
129 writer.write(
" }\n");
130 writer.write(
" Group {\n");
131 writer.write(
" children IS humanoidBody \n");
132 writer.write(
" }\n");
133 writer.write(
" ]\n");
134 writer.write(
" }\n");
137 writer.write(
"PROTO VisionSensor [\n");
138 writer.write(
" exposedField SFVec3f translation 0 0 0\n");
139 writer.write(
" exposedField SFRotation rotation 0 0 1 0\n");
140 writer.write(
" exposedField MFNode children [ ]\n");
141 writer.write(
" exposedField SFFloat fieldOfView 0.785398\n");
142 writer.write(
" exposedField SFString name \"\"\n");
143 writer.write(
" exposedField SFFloat frontClipDistance 0.01\n");
144 writer.write(
" exposedField SFFloat backClipDistance 10.0\n");
145 writer.write(
" exposedField SFString type \"NONE\"\n");
146 writer.write(
" exposedField SFInt32 sensorId -1\n");
147 writer.write(
" exposedField SFInt32 width 320\n");
148 writer.write(
" exposedField SFInt32 height 240\n");
149 writer.write(
" exposedField SFFloat frameRate 30\n");
152 writer.write(
" Transform {\n");
153 writer.write(
" rotation IS rotation\n");
154 writer.write(
" translation IS translation\n");
155 writer.write(
" children IS children\n");
156 writer.write(
" }\n");
160 writer.write(
"PROTO ForceSensor [ \n");
161 writer.write(
" exposedField SFVec3f maxForce -1 -1 -1\n");
162 writer.write(
" exposedField SFVec3f maxTorque -1 -1 -1\n");
163 writer.write(
" exposedField SFVec3f translation 0 0 0\n");
164 writer.write(
" exposedField SFRotation rotation 0 0 1 0\n");
165 writer.write(
" exposedField MFNode children [ ]\n");
166 writer.write(
" exposedField SFInt32 sensorId -1\n");
169 writer.write(
" Transform {\n");
170 writer.write(
" translation IS translation\n");
171 writer.write(
" rotation IS rotation\n");
172 writer.write(
" children IS children\n");
173 writer.write(
" }\n");
176 writer.write(
"PROTO Gyro [\n");
177 writer.write(
" exposedField SFVec3f maxAngularVelocity -1 -1 -1\n");
178 writer.write(
" exposedField SFVec3f translation 0 0 0\n");
179 writer.write(
" exposedField SFRotation rotation 0 0 1 0\n");
180 writer.write(
" exposedField MFNode children [ ]\n");
181 writer.write(
" exposedField SFInt32 sensorId -1\n");
184 writer.write(
" Transform {\n");
185 writer.write(
" translation IS translation\n");
186 writer.write(
" rotation IS rotation\n");
187 writer.write(
" children IS children\n");
188 writer.write(
" }\n");
191 writer.write(
"PROTO AccelerationSensor [\n");
192 writer.write(
" exposedField SFVec3f maxAcceleration -1 -1 -1\n");
193 writer.write(
" exposedField SFVec3f translation 0 0 0\n");
194 writer.write(
" exposedField SFRotation rotation 0 0 1 0\n");
195 writer.write(
" exposedField MFNode children [ ]\n");
196 writer.write(
" exposedField SFInt32 sensorId -1\n");
199 writer.write(
" Transform {\n");
200 writer.write(
" translation IS translation\n");
201 writer.write(
" rotation IS rotation\n");
202 writer.write(
" children IS children\n");
203 writer.write(
" }\n");
206 writer.write(
"PROTO RangeSensor [\n");
207 writer.write(
" exposedField SFVec3f translation 0 0 0\n");
208 writer.write(
" exposedField SFRotation rotation 0 0 1 0\n");
209 writer.write(
" exposedField MFNode children [ ]\n");
210 writer.write(
" exposedField SFInt32 sensorId -1\n");
211 writer.write(
" exposedField SFFloat scanAngle 3.14159 #[rad]\n");
212 writer.write(
" exposedField SFFloat scanStep 0.1 #[rad]\n");
213 writer.write(
" exposedField SFFloat scanRate 10 #[Hz]\n");
214 writer.write(
" exposedField SFFloat maxDistance 10\n");
217 writer.write(
" Transform {\n");
218 writer.write(
" translation IS translation\n");
219 writer.write(
" rotation IS rotation\n");
220 writer.write(
" children IS children\n");
221 writer.write(
" }\n");
224 writer.write(
"PROTO Plane [\n");
225 writer.write(
" exposedField SFVec3f size 10 10 0\n");
228 writer.write(
" Box {\n");
229 writer.write(
" size IS size\n");
230 writer.write(
" }\n");
233 writer.write(
"PROTO ExtraJoint [\n");
234 writer.write(
" exposedField SFString link1Name \"\"\n");
235 writer.write(
" exposedField SFString link2Name \"\"\n");
236 writer.write(
" exposedField SFVec3f link1LocalPos 0 0 0\n");
237 writer.write(
" exposedField SFVec3f link2LocalPos 0 0 0\n");
238 writer.write(
" exposedField SFString jointType \"xyz\"\n");
239 writer.write(
" exposedField SFVec3f jointAxis 1 0 0\n");
244 writer.write(
"NavigationInfo {\n");
245 writer.write(
" avatarSize 0.5\n");
246 writer.write(
" headlight TRUE\n");
247 writer.write(
" type [\"EXAMINE\", \"ANY\"]\n");
250 writer.write(
"Background {\n");
251 writer.write(
" skyColor 0.4 0.6 0.4\n");
254 writer.write(
"Viewpoint {\n");
255 writer.write(
" position 3 0 0.835\n");
256 writer.write(
" orientation 0.5770 0.5775 0.5775 2.0935\n");
263 writer.write(
"DEF "+model.
getName()+
" Humanoid{\n");
264 writer.write(
" humanoidBody [\n");
266 writer.write(
" ]\n");
267 writer.write(
" joints [\n");
268 for (
int i=0;
i<links.size();
i++){
269 writer.write(
" USE "+links.get(
i).getName()+
",\n");
271 writer.write(
" ]\n");
272 writer.write(
" segments [\n");
273 for (
int i=0;
i<links.size();
i++){
275 for (
int j=0; j<link.
children_.size(); j++){
277 writer.write(
" USE "+link.
children_.get(j).getName()+
",\n");
281 writer.write(
" ]\n");
284 }
catch (Exception e) {
288 if (writer !=
null) {
292 }
catch (Exception e) {
308 String exportDir, String mainPath){
309 Vector<GrxLinkItem> links =
new Vector<GrxLinkItem>();
312 writer.write(indent+
"DEF "+link.
getName()+
" Joint {\n");
313 writer.write(indent+
" jointType \""+link.
jointType_+
"\"\n");
314 if (link.
jointId_ != -1) writer.write(indent+
" jointId "+link.
jointId_+
"\n");
316 writer.write(indent+
" jointAxis "+link.getProperty(
"jointAxis")+
"\n");
318 if (!
valueEquals(link.getProperty(
"translation"),
"0.0 0.0 0.0 ")){
319 writer.write(indent+
" translation "+link.getProperty(
"translation")+
"\n");
321 if (!
isZero(link.getProperty(
"rotation"),3)){
322 writer.write(indent+
" rotation "+link.getProperty(
"rotation")+
"\n");
324 if (!link.getProperty(
"ulimit").
equals(
"")) writer.write(indent+
" ulimit ["+link.getProperty(
"ulimit")+
"]\n");
325 if (!link.getProperty(
"llimit").
equals(
"")) writer.write(indent+
" llimit ["+link.getProperty(
"llimit")+
"]\n");
326 if (!link.getProperty(
"uvlimit").
equals(
"")) writer.write(indent+
" uvlimit ["+link.getProperty(
"uvlimit")+
"]\n");
327 if (!link.getProperty(
"lvlimit").
equals(
"")) writer.write(indent+
" lvlimit ["+link.getProperty(
"lvlimit")+
"]\n");
333 writer.write(indent+
" children[\n");
347 indent+
" ", exportDir, mainPath);
348 links.addAll(childLinks);
351 writer.write(indent+
" ]\n");
352 writer.write(indent+
"}\n");
353 }
catch(Exception ex){
354 ex.printStackTrace();
361 String translation = segment.getProperty(
"translation");
362 String rotation = segment.getProperty(
"rotation");
363 boolean useTransform =
false;
366 writer.write(indent+
"Transform {\n");
367 writer.write(indent+
" translation "+translation+
"\n");
368 writer.write(indent+
" rotation "+rotation+
"\n");
369 writer.write(indent+
" children[\n");
372 writer.write(indent+
"DEF "+segment.
getName()+
" Segment{\n");
373 writer.write(indent+
" centerOfMass "+segment.getProperty(
"centerOfMass")+
"\n");
374 writer.write(indent+
" mass "+segment.getProperty(
"mass")+
"\n");
375 writer.write(indent+
" momentsOfInertia [ "+segment.getProperty(
"momentsOfInertia")+
"]\n");
376 writer.write(indent+
" children[\n");
380 exportShape(writer, shape, indent+
" ", exportDir, mainPath);
383 writer.write(indent+
" ]\n");
384 writer.write(indent+
"}\n");
386 writer.write(indent+
" ]\n");
387 writer.write(indent+
"}\n");
389 }
catch(Exception ex){
390 ex.printStackTrace();
404 String nodeType=
"unknown";
405 if (sensor.
type_.equals(
"Force")){
406 nodeType =
"ForceSensor";
407 }
else if(sensor.
type_.equals(
"RateGyro")){
409 }
else if(sensor.
type_.equals(
"Acceleration")){
410 nodeType =
"AccelerationSensor";
411 }
else if(sensor.
type_.equals(
"Vision")){
412 nodeType =
"VisionSensor";
413 }
else if(sensor.
type_.equals(
"Range")){
414 nodeType =
"RangeSensor";
416 writer.write(indent+
"DEF "+sensor.
getName()+
" "+nodeType+
" {\n");
417 writer.write(indent+
" sensorId "+sensor.
id_+
"\n");
418 if (!
valueEquals(sensor.getProperty(
"translation"),
"0.0 0.0 0.0 ")){
419 writer.write(indent+
" translation "+sensor.getProperty(
"translation")+
"\n");
421 if (!
isZero(sensor.getProperty(
"rotation"),3)){
422 writer.write(indent+
" rotation "+sensor.getProperty(
"rotation")+
"\n");
425 if (nodeType.equals(
"VisionSensor")){
426 if (!
valueEquals(sensor.getProperty(
"fieldOfView"),
"0.785398")){
427 writer.write(indent+
" fieldOfView "+sensor.getProperty(
"fieldOfView")+
"\n");
429 if (!
valueEquals(sensor.getProperty(
"frontClipDistance"),
"0.01")){
430 writer.write(indent+
" frontClipDistance "+sensor.getProperty(
"frontClipDistance")+
"\n");
432 if (!
valueEquals(sensor.getProperty(
"backClipDistance"),
"10.0")){
433 writer.write(indent+
" backClipDistance "+sensor.getProperty(
"backClipDistance")+
"\n");
435 if (!
valueEquals(sensor.getProperty(
"width"),
"320")){
436 writer.write(indent+
" width "+sensor.getProperty(
"width")+
"\n");
438 if (!
valueEquals(sensor.getProperty(
"height"),
"240")){
439 writer.write(indent+
" height "+sensor.getProperty(
"height")+
"\n");
441 if (!
valueEquals(sensor.getProperty(
"frameRate"),
"30.0")){
442 writer.write(indent+
" frameRate "+sensor.getProperty(
"frameRate")+
"\n");
444 if (!sensor.getProperty(
"cameraType").
equals(
"NONE")){
445 writer.write(indent+
" type \""+sensor.getProperty(
"cameraType")+
"\"\n");
447 if (!sensor.getProperty(
"name").
equals(
"")){
448 writer.write(indent+
" name \""+sensor.getProperty(
"name")+
"\"\n");
450 }
else if(nodeType.equals(
"ForceSensor")){
451 String maxf = sensor.getProperty(
"maxForce");
453 writer.write(indent+
" maxForce "+maxf+
"\n");
455 String maxt = sensor.getProperty(
"maxTorque");
457 writer.write(indent+
" maxTorque "+maxt+
"\n");
459 }
else if(nodeType.equals(
"Gyro")){
460 String
max = sensor.getProperty(
"maxAngularVelocity");
462 writer.write(indent+
" maxAngularVelocity "+
max+
"\n");
464 }
else if(nodeType.equals(
"AccelerationSensor")){
465 String
max = sensor.getProperty(
"maxAcceleration");
467 writer.write(indent+
" maxAcceleration "+
max+
"\n");
469 }
else if(nodeType.equals(
"RangeSensor")){
470 String angle = sensor.getProperty(
"scanAngle");
472 writer.write(indent+
" scanAngle "+angle+
"\n");
474 String step = sensor.getProperty(
"scanStep");
476 writer.write(indent+
" scanStep "+step+
"\n");
478 String rate = sensor.getProperty(
"scanRate");
480 writer.write(indent+
" scanRate "+rate+
"\n");
482 String distance = sensor.getProperty(
"maxDistance");
484 writer.write(indent+
" maxDistance "+distance+
"\n");
488 writer.write(indent+
" children[\n");
494 writer.write(indent+
" ]\n");
496 writer.write(indent+
"}\n");
497 }
catch(Exception ex){
498 ex.printStackTrace();
511 System.out.println(
"mainPath = "+ mainPath);
512 System.out.println(
"url of shape = "+shape.
getURL(
false));
518 writer.write(indent+
"Transform {\n");
519 if (!
valueEquals(shape.getProperty(
"translation"),
"0.0 0.0 0.0 ")){
520 writer.write(indent+
" translation "+shape.getProperty(
"translation")+
"\n");
522 if (!
isZero(shape.getProperty(
"rotation"),3)){
523 writer.write(indent+
" rotation "+shape.getProperty(
"rotation")+
"\n");
525 writer.write(indent+
" children[\n");
526 writer.write(indent+
" Shape{\n");
529 writer.write(indent+
" appearance Appearance{\n");
532 writer.write(indent+
" material Material{\n");
533 writer.write(indent+
" diffuseColor "
534 +mat.diffuseColor[0]+
" "+mat.diffuseColor[1]+
" "+mat.diffuseColor[2]+
"\n");
535 writer.write(indent+
" }\n");
539 writer.write(indent+
" texture ImageTexture {\n");
540 String url = tex.url;
541 url = url.replace(
'\\',
'/');
543 writer.write(indent+
" }\n");
545 writer.write(indent+
" }\n");
547 writer.write(indent+
" }\n");
548 writer.write(indent+
" ]\n");
549 writer.write(indent+
"}\n");
551 writer.write(indent+
"Transform {\n");
552 if (!
valueEquals(shape.getProperty(
"translation"),
"0.0 0.0 0.0 ")){
553 writer.write(indent+
" translation "+shape.getProperty(
"translation")+
"\n");
555 if (!
isZero(shape.getProperty(
"rotation"),3)){
556 writer.write(indent+
" rotation "+shape.getProperty(
"rotation")+
"\n");
558 writer.write(indent+
" children[\n");
560 writer.write(indent+
" ]\n");
561 writer.write(indent+
"}\n");
563 }
catch(Exception ex){
564 ex.printStackTrace();
570 writer.write(
"DEF "+extraJoint.
getName()+
" ExtraJoint{\n");
571 writer.write(
" link1Name \""+extraJoint.getProperty(
"link1Name")+
"\"\n");
572 writer.write(
" link2Name \""+extraJoint.getProperty(
"link2Name")+
"\"\n");
573 writer.write(
" link1LocalPos "+extraJoint.getProperty(
"link1LocalPos")+
"\n");
574 writer.write(
" link2LocalPos "+extraJoint.getProperty(
"link2LocalPos")+
"\n");
575 writer.write(
" jointType \""+extraJoint.getProperty(
"jointType")+
"\"\n");
576 writer.write(
" jointAxis "+extraJoint.getProperty(
"jointAxis")+
"\n");
578 }
catch(Exception ex){
579 ex.printStackTrace();
590 Pattern localPattern = Pattern.compile(
"\\\\");
592 Matcher localMatcher = localPattern.matcher(
"/");
593 String localStr = localMatcher.replaceAll(
"\\\\\\\\");
595 String [] dirs1 = absPath.split( localStr );
596 String [] dirs2 = baseDir.split( localStr );
600 if (System.getProperty(
"os.name").equals(
"Linux") || System.getProperty(
"os.name").equals(
"Mac OS X")) {
601 while (cnt < dirs1.length && cnt < dirs2.length && dirs1[cnt].equals(dirs2[cnt])) cnt++;
602 for (
int i=0;
i<dirs2.length-cnt;
i++) relPath +=
"../";
603 for (
int i=cnt;
i<dirs1.length;
i++){
605 if (
i != dirs1.length-1) relPath +=
"/";
608 if(dirs1[0].equals(dirs2[0])) {
609 while (cnt < dirs1.length && cnt < dirs2.length && dirs1[cnt].equals(dirs2[cnt])) cnt++;
610 for (
int i=0;
i<dirs2.length-cnt;
i++) relPath +=
"../";
612 for (
int i=cnt;
i<dirs1.length;
i++){
614 if (
i != dirs1.length-1) relPath +=
"/";
623 ShapePrimitiveType ptype =
info.primitiveType;
624 float [] pparams =
info.primitiveParameters;
626 if (ptype == ShapePrimitiveType.SP_MESH){
627 writer.write(indent+
"geometry IndexedFaceSet {\n");
628 writer.write(indent+
"ccw TRUE\n");
629 writer.write(indent+
"coord Coordinate {\n");
630 writer.write(indent+
"point [\n");
631 for(
int i=0;
i<
info.vertices.length;)
632 writer.write(indent+
info.vertices[
i++]+
" "+
info.vertices[
i++]+
" "+
info.vertices[
i++]+
",\n");
633 writer.write(indent+
"]\n");
634 writer.write(indent+
"}\n");
635 writer.write(indent+
"coordIndex [\n");
636 for(
int i=0;
i<
info.triangles.length;)
637 writer.write(indent+
info.triangles[
i++]+
" "+
info.triangles[
i++]+
" "+
info.triangles[
i++]+
" -1,\n");
638 writer.write(indent+
"]\n");
641 if(appinfo.normals.length != 0){
642 if(!appinfo.normalPerVertex)
643 writer.write(indent+
"normalPerVertex FALSE\n");
644 writer.write(indent+
"normal Normal {\n");
645 writer.write(indent+
"vector [\n");
646 for(
int i=0;
i<appinfo.normals.length;)
647 writer.write(indent+appinfo.normals[
i++]+
" "+appinfo.normals[
i++]+
" "+appinfo.normals[
i++]+
",\n");
648 writer.write(indent+
"]\n");
649 writer.write(indent+
"}\n");
651 if(appinfo.normalIndices.length != 0){
652 writer.write(indent+
"normalIndex [\n");
653 if(appinfo.normalPerVertex){
654 for(
int i=0;
i<appinfo.normalIndices.length;)
655 writer.write(indent+appinfo.normalIndices[
i++]+
" "+appinfo.normalIndices[
i++]+
" "+appinfo.normalIndices[
i++]+
" -1,\n");
657 for(
int i=0;
i<appinfo.normalIndices.length;
i++){
658 if(
i%3==0) writer.write(indent+
" ");
659 writer.write(appinfo.normalIndices[
i]+
" ");
660 if(
i%3==2) writer.write(
"\n");
663 writer.write(indent+
"]\n");
666 writer.write(indent+
"solid FALSE\n");
667 if (appinfo.creaseAngle != 0.0f)
668 writer.write(indent+
"creaseAngle "+ appinfo.creaseAngle+
"\n");
669 if(appinfo.colors.length != 0){
670 if(!appinfo.colorPerVertex)
671 writer.write(indent+
"colorPerVertex FALSE\n");
672 writer.write(indent+
"color Color {\n");
673 writer.write(indent+
"color [\n");
674 for(
int i=0;
i<appinfo.colors.length;)
675 writer.write(indent+appinfo.colors[
i++]+
" "+appinfo.colors[
i++]+
" "+appinfo.colors[
i++]+
",\n");
676 writer.write(indent+
"]\n");
677 writer.write(indent+
"}\n");
679 if(appinfo.colorIndices.length != 0){
680 writer.write(indent+
"colorIndex [\n");
681 if(appinfo.colorPerVertex){
682 for(
int i=0;
i<appinfo.colorIndices.length;)
683 writer.write(indent+appinfo.colorIndices[
i++]+
" "+appinfo.colorIndices[
i++]+
" "+appinfo.colorIndices[
i++]+
" -1,\n");
685 for(
int i=0;
i<appinfo.colorIndices.length;
i++){
686 if(
i%3==0) writer.write(indent+
" ");
687 writer.write(appinfo.colorIndices[
i]+
" ");
688 if(
i%3==2) writer.write(
"\n");
691 writer.write(indent+
"]\n");
693 TextureInfo texinfo = shape.
textures_[0];
695 writer.write(indent+
"texCoord TextureCoordinate {\n");
696 writer.write(indent+
"point [\n");
697 for(
int i=0;
i<appinfo.textureCoordinate.length;)
698 writer.write(indent+appinfo.textureCoordinate[
i++]+
" "+appinfo.textureCoordinate[
i++]+
",\n");
699 writer.write(indent+
"]\n");
700 writer.write(indent+
"}\n");
701 writer.write(indent+
"texCoordIndex [\n");
702 for(
int i=0;
i<appinfo.textureCoordIndices.length;)
703 writer.write(indent+appinfo.textureCoordIndices[
i++]+
" "+appinfo.textureCoordIndices[
i++]+
" "+appinfo.textureCoordIndices[
i++]+
" -1,\n");
704 writer.write(indent+
"]\n");
707 writer.write(indent+
"}\n");
708 }
else if (ptype == ShapePrimitiveType.SP_BOX){
709 writer.write(indent+
"geometry Box{\n");
710 writer.write(indent+
" size "
714 writer.write(indent+
"}\n");
715 }
else if (ptype == ShapePrimitiveType.SP_CYLINDER){
716 writer.write(indent+
"geometry Cylinder{\n");
717 writer.write(indent+
" radius "+pparams[0]+
"\n");
718 writer.write(indent+
" height "+pparams[1]+
"\n");
720 writer.write(indent+
" top FALSE\n");
723 writer.write(indent+
" bottom FALSE\n");
726 writer.write(indent+
" side FALSE\n");
728 writer.write(indent+
"}\n");
729 }
else if (ptype == ShapePrimitiveType.SP_CONE){
730 writer.write(indent+
"geometry Cone{\n");
731 writer.write(indent+
" bottomRadius "+pparams[0]+
"\n");
732 writer.write(indent+
" height "+pparams[1]+
"\n");
734 writer.write(indent+
" bottom FALSE\n");
737 writer.write(indent+
" side FALSE\n");
739 writer.write(indent+
"}\n");
740 }
else if (ptype == ShapePrimitiveType.SP_SPHERE){
741 writer.write(indent+
"geometry Sphere{\n");
742 writer.write(indent+
" radius "+pparams[0]+
"\n");
743 writer.write(indent+
"}\n");
744 }
else if (ptype == ShapePrimitiveType.SP_PLANE){
745 writer.write(indent+
"geometry Plane{\n");
746 writer.write(indent+
" size "+pparams[0]+
" "+pparams[1]+
" "+pparams[2]+
"\n");
747 writer.write(indent+
"}\n");
749 }
catch(Exception ex){
750 ex.printStackTrace();
755 final double EPS = 0.00000001;
756 String[] ss1 =
s1.split(
" ");
757 String[] ss2 =
s2.split(
" ");
761 for(
int i=0;
i<
n;
i++){
763 if( Math.abs(Double.parseDouble(ss1[
i]) - Double.parseDouble(ss2[
i])) >
EPS )
765 }
catch(Exception ex){
773 String[] ss1 =
s1.split(
" ");
776 if( Math.abs(Double.parseDouble(ss1[
i])) < 1e-10 )
780 }
catch(Exception ex){