<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>So let's look at some of the products of X3DJSAIL and X3DJSONLD
(either through Java or Node.js). I backed out my change in the
XML back to 3.3 <br>
</p>
<p><br>
</p>
<p>~/X3DJSONLD/src/main/data$ egrep ImageTexture ball.x3d
ball.x3d.new ball.newPrettyPrint.intermediate.x3d ball.new.x3d <br>
</p>
<p>[ this is the original XML file. See the 6 different
containerFields ]<br>
</p>
<p>ball.x3d: <ImageTexture
url='"../resources/images/all_probes/stpeters_cross/stpeters_back.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png"</a>'
containerField="backTexture"/><br>
ball.x3d: <ImageTexture
url='"../resources/images/all_probes/stpeters_cross/stpeters_bottom.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png"</a>'
containerField="bottomTexture"/><br>
ball.x3d: <ImageTexture
url='"../resources/images/all_probes/stpeters_cross/stpeters_front.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png"</a>'
containerField="frontTexture"/><br>
ball.x3d: <ImageTexture
url='"../resources/images/all_probes/stpeters_cross/stpeters_left.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png"</a>'
containerField="leftTexture"/><br>
ball.x3d: <ImageTexture
url='"../resources/images/all_probes/stpeters_cross/stpeters_right.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png"</a>'
containerField="rightTexture"/><br>
ball.x3d: <ImageTexture
url='"../resources/images/all_probes/stpeters_cross/stpeters_top.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png"</a>'
containerField="topTexture"/></p>
<p><br>
</p>
<p><br>
</p>
<p>[ this is the XML after the JSON goes through X3DJSONLD.js.
Notice that containerField names are preserved. ]<br>
</p>
<p><br>
</p>
<p>ball.x3d.new:<ComposedCubeMapTexture containerField="texture"
DEF="texture"><ImageTexture containerField="backTexture"
url=""../resources/images/all_probes/stpeters_cross/stpeters_back.png"
"<a class="moz-txt-link-freetext" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png"">https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png"</a>;"></ImageTexture><br>
ball.x3d.new:<ImageTexture containerField="bottomTexture"
url=""../resources/images/all_probes/stpeters_cross/stpeters_bottom.png"
"<a class="moz-txt-link-freetext" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png"">https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png"</a>;"></ImageTexture><br>
ball.x3d.new:<ImageTexture containerField="frontTexture"
url=""../resources/images/all_probes/stpeters_cross/stpeters_front.png"
"<a class="moz-txt-link-freetext" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png"">https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png"</a>;"></ImageTexture><br>
ball.x3d.new:<ImageTexture containerField="leftTexture"
url=""../resources/images/all_probes/stpeters_cross/stpeters_left.png"
"<a class="moz-txt-link-freetext" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png"">https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png"</a>;"></ImageTexture><br>
ball.x3d.new:<ImageTexture containerField="rightTexture"
url=""../resources/images/all_probes/stpeters_cross/stpeters_right.png"
"<a class="moz-txt-link-freetext" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png"">https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png"</a>;"></ImageTexture><br>
ball.x3d.new:<ImageTexture containerField="topTexture"
url=""../resources/images/all_probes/stpeters_cross/stpeters_top.png"
"<a class="moz-txt-link-freetext" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png"">https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png"</a>;"></ImageTexture></p>
<p><br>
</p>
<p>[ this is the intermediate output from X3DJSAIL Note a single
containerField. ]<br>
</p>
<p>ball.newPrettyPrint.intermediate.x3d: <ImageTexture
containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_back.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png"</a>'/><br>
ball.newPrettyPrint.intermediate.x3d: <ImageTexture
containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_bottom.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png"</a>'/><br>
ball.newPrettyPrint.intermediate.x3d: <ImageTexture
containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_front.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png"</a>'/><br>
ball.newPrettyPrint.intermediate.x3d: <ImageTexture
containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_left.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png"</a>'/><br>
ball.newPrettyPrint.intermediate.x3d: <ImageTexture
containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_right.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png"</a>'/><br>
ball.newPrettyPrint.intermediate.x3d: <ImageTexture
containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_top.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png"</a>'/></p>
<p><br>
</p>
<p>[ This is the output from Node.js/X3DJSAIL, I believe. Note that
the containerField's echo the above intermediate form. ]<br>
</p>
<p>ball.new.x3d: <ImageTexture containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_back.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png"</a>'/><br>
ball.new.x3d: <ImageTexture containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_bottom.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png"</a>'/><br>
ball.new.x3d: <ImageTexture containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_front.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png"</a>'/><br>
ball.new.x3d: <ImageTexture containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_left.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png"</a>'/><br>
ball.new.x3d: <ImageTexture containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_right.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png"</a>'/><br>
ball.new.x3d: <ImageTexture containerField='back'
url='"../resources/images/all_probes/stpeters_cross/stpeters_top.png"
<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png"</a>'/></p>
<p><br>
</p>
<p>Note that if I call "setFront()" or "setFrontTexture()" I expect
the containerField to be set. So I wrote Java like this:</p>
<p><br>
</p>
<p>.addChild(new Transform()<br>
.addChild(new Shape()<br>
.setGeometry(new Sphere())<br>
.setAppearance(new Appearance()<br>
.setMaterial(new Material().setDiffuseColor(new
float[] {0.7f,0.7f,0.7f}).setSpecularColor(new float[]
{0.5f,0.5f,0.5f}))<br>
.setTexture(new
ComposedCubeMapTexture().setDEF("texture")<br>
.setBackTexture(new ImageTexture().setUrl(new
MFString6().getArray()))<br>
.setBottomTexture(new ImageTexture().setUrl(new
MFString7().getArray()))<br>
.setFrontTexture(new ImageTexture().setUrl(new
MFString8().getArray()))<br>
.setLeftTexture(new ImageTexture().setUrl(new
MFString9().getArray()))<br>
.setRightTexture(new ImageTexture().setUrl(new
MFString10().getArray()))<br>
.setTopTexture(new ImageTexture().setUrl(new
MFString11().getArray())))</p>
<p><br>
</p>
<p>And Node.js like this:</p>
<p><br>
</p>
<p> .addChild((new autoclass.Shape())<br>
.setGeometry((new autoclass.Sphere()))<br>
.setAppearance((new autoclass.Appearance())<br>
.setMaterial((new
autoclass.Material()).setDiffuseColor(java.newArray("float",
[java.newFloat(0.7), java.newFloat(0.7),
java.newFloat(0.7)])).setSpecularColor(java.newArray("float",
[java.newFloat(0.5), java.newFloat(0.5), java.newFloat(0.5)])))<br>
.setTexture((new
autoclass.ComposedCubeMapTexture()).setDEF("texture")<br>
.setBackTexture((new
autoclass.ImageTexture()).setUrl(java.newArray("java.lang.String",
["../resources/images/all_probes/stpeters_cross/stpeters_back.png",<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png"</a>])))<br>
.setBottomTexture((new
autoclass.ImageTexture()).setUrl(java.newArray("java.lang.String",
["../resources/images/all_probes/stpeters_cross/stpeters_bottom.png",<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png"</a>])))<br>
.setFrontTexture((new
autoclass.ImageTexture()).setUrl(java.newArray("java.lang.String",
["../resources/images/all_probes/stpeters_cross/stpeters_front.png",<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png"</a>])))<br>
.setLeftTexture((new
autoclass.ImageTexture()).setUrl(java.newArray("java.lang.String",
["../resources/images/all_probes/stpeters_cross/stpeters_left.png",<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png"</a>])))<br>
.setRightTexture((new
autoclass.ImageTexture()).setUrl(java.newArray("java.lang.String",
["../resources/images/all_probes/stpeters_cross/stpeters_right.png",<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png"</a>])))<br>
.setTopTexture((new
autoclass.ImageTexture()).setUrl(java.newArray("java.lang.String",
["../resources/images/all_probes/stpeters_cross/stpeters_top.png",<a class="moz-txt-link-rfc2396E" href="https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png">"https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png"</a>]))))</p>
<p><br>
</p>
<p>Here's what's normally done to get a backTexture. These look
fairly good, I haven't found a bug in these methods for the
containerFields.<br>
</p>
<p> public ComposedCubeMapTexture setBackTexture(
org.web3d.x3d.sai.Texturing.X3DTexture2DNode newValue)<br>
{<br>
// set-newValue-validity-checks #0<br>
backTexture = newValue;<br>
if (newValue != null)<br>
{<br>
((X3DConcreteElement)
backTexture).setParent(this); // parentTest15<br>
((X3DConcreteNode)backTexture).setContainerFieldOverride("backTexture");<br>
}<br>
if (backTextureProtoInstance != null)<br>
{<br>
backTextureProtoInstance.setParent(null);
// housekeeping, clear prior object<br>
backTextureProtoInstance = null;<br>
}<br>
return this;<br>
}</p>
<p><br>
</p>
<p>But I just found this. Looks not very good at all, and
potentially why we get 6 back containerFields or 6 backTexture
containerFields:</p>
<p>ComposedCubeMapTexture.java (from X3DJSAIL source, please code
review this, thanks):<br>
</p>
<p>private void handleFieldSynonyms()<br>
{<br>
String correctedContainerField;<br>
if (hasAncestorX3D() &&
findAncestorX3D().getVersion().startsWith("3"))<br>
correctedContainerField = "back";<br>
else correctedContainerField = "backTexture";<br>
<br>
if (getBackTexture() != null)<br>
((X3DConcreteNode)
getBackTexture()).setContainerFieldOverride(correctedContainerField);<br>
else if (getBackTextureProtoInstance() != null)<br>
((X3DConcreteNode)
getBackTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);<br>
<br>
if (getBottomTexture() != null)<br>
((X3DConcreteNode)
getBottomTexture()).setContainerFieldOverride(correctedContainerField);<br>
else if (getBottomTextureProtoInstance() != null)<br>
((X3DConcreteNode)
getBottomTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);<br>
<br>
if (getFrontTexture() != null)<br>
((X3DConcreteNode)
getFrontTexture()).setContainerFieldOverride(correctedContainerField);<br>
else if (getFrontTextureProtoInstance() != null)<br>
((X3DConcreteNode)
getFrontTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);<br>
<br>
if (getLeftTexture() != null)<br>
((X3DConcreteNode)
getLeftTexture()).setContainerFieldOverride(correctedContainerField);<br>
else if (getLeftTextureProtoInstance() != null)<br>
((X3DConcreteNode)
getLeftTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);<br>
<br>
if (getRightTexture() != null)<br>
((X3DConcreteNode)
getRightTexture()).setContainerFieldOverride(correctedContainerField);<br>
else if (getRightTextureProtoInstance() != null)<br>
((X3DConcreteNode)
getRightTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);<br>
<br>
if (getTopTexture() != null)<br>
((X3DConcreteNode)
getTopTexture()).setContainerFieldOverride(correctedContainerField);<br>
else if (getTopTextureProtoInstance() != null)<br>
((X3DConcreteNode)
getTopTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);<br>
}</p>
<p><br>
</p>
<p><br>
</p>
<p>If someone could at least confirm the bug, that would be cool.<br>
</p>
<p>John<br>
</p>
<p><br>
</p>
<p><br>
</p>
<div class="moz-cite-prefix">On 5/28/21 2:08 PM, John Carlson wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAGC3UEmjqdPb9fS8J-04ty7JHg=pvXn31CYwFG0tzpTXUMTF8g@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="auto">I haven’t seen any validation problems when I
changed the version of the JSON file to 4.0, JSON parser errors
started when I changed the XML to 4.0.</div>
<div dir="auto"><br>
</div>
<div dir="auto">Hopefully that is clear. My thinking is kind of
muggy right now.</div>
<div dir="auto"><br>
</div>
<div dir="auto">John</div>
<div dir="auto"><br>
</div>
<div dir="auto"><br>
</div>
<div><br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Fri, May 28, 2021 at
10:56 AM Don Brutzman <<a href="mailto:brutzman@nps.edu"
moz-do-not-send="true">brutzman@nps.edu</a>> wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">Thanks
John. Yes there are a few differences in field names from
X3D3 to X3D4, for improved object-model consistency.
Summarized at<br>
<br>
* X3D Scene Authoring Hints: Field name changes planned for
improved consistency<br>
<a
href="https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#fieldNameChanges"
rel="noreferrer" target="_blank" moz-do-not-send="true">https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#fieldNameChanges</a><br>
<br>
We should be able to confirm correctness of X3DUOM 3.3 next
week, am thinking that prior-version names/synonyms should
be something to include in X3DUOM 4.0 as well.<br>
<br>
<br>
On 5/27/2021 11:12 PM, John Carlson wrote:<br>
> Report (still on old version of X3DJSAIL):<br>
> <br>
> These files are the one's I'm trying to get
translations working for:<br>
> <br>
> /X3DJSONLD/src/main/data$ grep -l
ComposedCubeMapTexture *.x3d| grep -v new<br>
> <br>
> ball.x3d<br>
> bubbles.x3d<br>
> bub.x3d<br>
> flowerproto.x3d<br>
> flowers4.x3d<br>
> flowers7.x3d<br>
> flowers.x3d<br>
> geo.x3d<br>
> mirror2.x3d<br>
> mirror.x3d<br>
> <br>
> Here are the JSON files that don't parse:<br>
> <br>
> ~/X3DJSONLD/src/main/data$ for i in *.json; do jsonlint
$i 2> /dev/null 1> /dev/null|| echo $i; done<br>
> ball.new.json<br>
> bubbles.new.json<br>
> bub.new.json<br>
> flowerproto.new.json<br>
> flowers4.new.json<br>
> flowers7.new.json<br>
> flowers.new.json<br>
> geo.new.json<br>
> mirror2.new.json<br>
> mirror.new.json<br>
> SpatialAudioCameraAnimation.json<br>
> SplitChannels.json<br>
> text.new.json<br>
> <br>
> <br>
> The new.json files are created from my generated Java
code. So either my code is wrong, or there's something
wrong with X3DJSAIL.<br>
> <br>
> <br>
> My code looks like this:<br>
> <br>
> <br>
> .setTexture(new
ComposedCubeMapTexture().setDEF("texture")<br>
> .setBackTexture(new
ImageTexture().setUrl(new MFString6().getArray()))<br>
> .setBottomTexture(new
ImageTexture().setUrl(new MFString7().getArray()))<br>
> .setFrontTexture(new
ImageTexture().setUrl(new MFString8().getArray()))<br>
> .setLeftTexture(new
ImageTexture().setUrl(new MFString9().getArray()))<br>
> .setRightTexture(new
ImageTexture().setUrl(new MFString10().getArray()))<br>
> .setTopTexture(new
ImageTexture().setUrl(new MFString11().getArray())))<br>
> <br>
> <br>
> with setUSE below.<br>
> <br>
> <br>
> John<br>
> <br>
> On 5/27/21 10:52 PM, John Carlson wrote:<br>
>> A somewhat significant change to X3DUOM 3.3 causes
generated X3D JSON schema 3.3 to reject files.<br>
>><br>
>> That is, there is no longer a bottomTexture,
topTexture, frontTexture, etc. for ComposedCubeMapTexture.
Instead, "Texture" is left off of these fields.<br>
>><br>
>><br>
>> 4.0 has the Texture added.<br>
>><br>
>><br>
>> 2 suggestions:<br>
>><br>
>> Update your files to X3D4.<br>
>><br>
>> OR:<br>
>><br>
>> Add these fields to X3DUOM 3.3 or find some way to
get the old fields into X3D JSON schema 3.3 during schema
generation (help!).<br>
>><br>
>> I am not sure what the standard or the browsers do
at this point.<br>
>><br>
>> I'm upgrading my files to X3D4 and see if they work
in various browsers.<br>
>><br>
>> Help!<br>
>><br>
>> John<br>
>><br>
> <br>
> _______________________________________________<br>
> x3d-public mailing list<br>
> <a href="mailto:x3d-public@web3d.org" target="_blank"
moz-do-not-send="true">x3d-public@web3d.org</a><br>
> <a
href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org"
rel="noreferrer" target="_blank" moz-do-not-send="true">http://web3d.org/mailman/listinfo/x3d-public_web3d.org</a><br>
<br>
all the best, Don<br>
-- <br>
Don Brutzman Naval Postgraduate School, Code USW/Br <a
href="mailto:brutzman@nps.edu" target="_blank"
moz-do-not-send="true">brutzman@nps.edu</a><br>
Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA
+1.831.656.2149<br>
X3D graphics, virtual worlds, navy robotics <a
href="http://faculty.nps.edu/brutzman" rel="noreferrer"
target="_blank" moz-do-not-send="true">http://faculty.nps.edu/brutzman</a><br>
</blockquote>
</div>
</div>
</blockquote>
</body>
</html>