<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>I’m hoping you can evaluate usage of shaders, programs and children containerFields in java/examples?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I am still having problems analyzing this adequately</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John$ grep programs *x3d</p><p class=MsoNormal>HelloWorldProgramOutputTidy.x3d:<ShaderProgram DEF='TestShader2' containerField='programs'/></p><p class=MsoNormal>HelloWorldProgramOutputTidy_CommandLine.x3d:<ShaderProgram DEF='TestShader2' containerField='programs'/></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>There is no use of containerField shaders or containerField programs with ShaderProgram in other files.  Hmmm</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Maybe there’s an issue with X3dTidy?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I think I’m confused between ProgramShader and ShaderProgram.</p><p class=MsoNormal><br>I’m now getting:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>$ grep Appearance errs.txt</p><p class=MsoNormal>    Appearance168.addChild(ProtoInstance171)</p><p class=MsoNormal>AttributeError: 'org.web3d.x3d.jsail.Shape.AppearanceObject' object has no attribute 'addChild'</p><p class=MsoNormal>    Appearance168.addChild(ProtoInstance171)</p><p class=MsoNormal>AttributeError: 'org.web3d.x3d.jsail.Shape.AppearanceObject' object has no attribute 'addChild'</p><p class=MsoNormal>    Appearance168.addChild(ProtoInstance171)</p><p class=MsoNormal>AttributeError: 'org.web3d.x3d.jsail.Shape.AppearanceObject' object has no attribute 'addChild'</p><p class=MsoNormal>    Appearance168.addChild(ProtoInstance171)</p><p class=MsoNormal>AttributeError: 'org.web3d.x3d.jsail.Shape.AppearanceObject' object has no attribute 'addChild'</p><p class=MsoNormal>    Appearance163.addChild(ProtoInstance166)</p><p class=MsoNormal>AttributeError: 'org.web3d.x3d.jsail.Shape.AppearanceObject' object has no attribute 'addChild'</p><p class=MsoNormal>    Appearance168.addChild(ProgramShader169)</p><p class=MsoNormal>AttributeError: 'org.web3d.x3d.jsail.Shape.AppearanceObject' object has no attribute 'addChild'</p><p class=MsoNormal>    Appearance168.addChild(ProgramShader169)</p><p class=MsoNormal>AttributeError: 'org.web3d.x3d.jsail.Shape.AppearanceObject' object has no attribute 'addChild'</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>$ grep '<'ProtoInstance *.x3d|grep shaders</p><p class=MsoNormal>HelloWorldProgramOutput.x3d:        <ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/></p><p class=MsoNormal>HelloWorldProgramOutput_CommandLine.x3d:        <ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/></p><p class=MsoNormal>HelloWorldProgramOutput_CommandLineUnzipped.x3d:        <ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/></p><p class=MsoNormal>HelloWorldProgramOutput_ReloadedDOM.x3d:        <ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/></p><p class=MsoNormal>HelloWorldProgramOutputCanonical.x3d:        <ProtoInstance DEF='TestShader3' containerField='shaders' name='ShaderProto'/></p><p class=MsoNormal>HelloWorldProgramOutputTidy.x3d:<ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/></p><p class=MsoNormal>HelloWorldProgramOutputTidy_CommandLine.x3d:<ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>$ grep '<'ProgramShader *.x3d|grep container</p><p class=MsoNormal>HelloWorldProgramOutputTidy.x3d:<ProgramShader containerField='shaders'/></p><p class=MsoNormal>HelloWorldProgramOutputTidy.x3d:<ProgramShader DEF='TestShader1' containerField='shaders'></p><p class=MsoNormal>HelloWorldProgramOutputTidy_CommandLine.x3d:<ProgramShader containerField='shaders'/></p><p class=MsoNormal>HelloWorldProgramOutputTidy_CommandLine.x3d:<ProgramShader DEF='TestShader1' containerField='shaders'></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In these case, my code uses the containerField to choose an appropriate add method, currently addChild overrides addShaders.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                                       if (attr === "containerField") {</p><p class=MsoNormal>                                                method = attrsa.nodeValue.charAt(0).toUpperCase() + attrsa.nodeValue.slice(1);</p><p class=MsoNormal>                                                if (method === "Shaders") {</p><p class=MsoNormal>                                                        addpre = "add";</p><p class=MsoNormal>                                                        method = "Child";</p><p class=MsoNormal>                                                } else {</p><p class=MsoNormal>                                                        addpre = "set";</p><p class=MsoNormal>                                                }</p><p class=MsoNormal>                                        }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>My recommendation would be to implement the addShaders method, or stop using containerField? Or provide additional testing in serializers. What I would like most of all, is provide an understandable use of containerField to X3D programmers.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John</p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:brutzman@nps.edu">Brutzman, Donald (Don) (CIV)</a><br><b>Sent: </b>Saturday, June 29, 2019 8:05 PM<br><b>To: </b><a href="mailto:yottzumm@gmail.com">John Carlson</a><br><b>Cc: </b><a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a><br><b>Subject: </b>Re: Fatal X3DJSAIL error using JDK 8u202. Will try to download latestJava binary version.</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>1. I have rebuilt and redeployed X3DJSAIL using JDK 8u212.  No changes in code, all smoke tests pass.  Should be the same as 202 version.  You do not need JDK 8u212 to run the X3DJSAIL .jar since we should remain compatible with any JDK 1.8 version.  Can you please test that the binary .jar works with 202.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Not yet ready to add OpenJDK or Java 12 testing to the build process.  At some point later this year it will likely happen.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>2. Next, to your problem.  Inspection reveals that X3DJSAIL has multiple methods for ProtoBody to addChild or addChildren.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>[First entry shows return type; when type is void then it is likely a requirement of underlying SAI which cannot be overridden.]</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>X3DJSAIL Javadoc: ProtoBody</p><p class=MsoNormal>http://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/ProtoBodyObject.html#method.summary</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>------</p><p class=MsoNormal>ProtoBodyObject             addChild(X3DNode newValue)</p><p class=MsoNormal>                Utility method to add single child element to contained list of existing children nodes (if any).</p><p class=MsoNormal>ProtoBodyObject             addChildren(ProtoInstanceObject newValue)</p><p class=MsoNormal>                Add single ProtoInstanceObject (with appropriate node type and containerField value) to MFNode array for children field.</p><p class=MsoNormal>void       addChildren(X3DNode newValue)</p><p class=MsoNormal>                Add single node to existing array of children nodes (if any).</p><p class=MsoNormal>void       addChildren(X3DNode[] newValue)</p><p class=MsoNormal>                Add array of children nodes to array of existing nodes (if any).</p><p class=MsoNormal>------</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John we can sometimes add a utility method if there is a hole or something missing, but we can't add them for every node in X3D.  Can't overload methods/interfaces with overlapping types in Java.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>As before I recommend we get HelloWorld.py working first, since HelloWorld.x3d and HelloWorld.java and HelloWorld.json all work just fine.  There are several "abox" models scattered around so it is not possible for me to replicate your results with confidence.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>On 6/28/2019 12:17 AM, John Carlson wrote:</p><p class=MsoNormal>> ===========================================================================================================</p><p class=MsoNormal>> </p><p class=MsoNormal>> But work on my abox.future.py bug below, pretty please?  With or without wrappers, it doesn’t matter which to me.</p><p class=MsoNormal>> </p><p class=MsoNormal>> Here is the minimal code which fails.</p><p class=MsoNormal>> </p><p class=MsoNormal>> import x3dpsail</p><p class=MsoNormal>> </p><p class=MsoNormal>> (x3dpsail.ProtoBody()</p><p class=MsoNormal>> </p><p class=MsoNormal>>      .addChild(x3dpsail.Transform()</p><p class=MsoNormal>> </p><p class=MsoNormal>>          .setIS(x3dpsail.ISObject())</p><p class=MsoNormal>> </p><p class=MsoNormal>>      )</p><p class=MsoNormal>> </p><p class=MsoNormal>> )</p><p class=MsoNormal>> </p><p class=MsoNormal>> addChild takes an X3DNode.</p><p class=MsoNormal>> </p><p class=MsoNormal>> setIS returns a  TransformObject—an X3DConcreteNode</p><p class=MsoNormal>> </p><p class=MsoNormal>> Please add to ProtoBodyObject.java an</p><p class=MsoNormal>> </p><p class=MsoNormal>> addChild(TransformObject)</p><p class=MsoNormal>> </p><p class=MsoNormal>> and/or</p><p class=MsoNormal>> </p><p class=MsoNormal>> addChild(X3DConcreteNode)</p><p class=MsoNormal>> </p><p class=MsoNormal>> You can do it at the same time you are adding addShaders() – see below.</p><p class=MsoNormal>> </p><p class=MsoNormal>> Alternatively, you can make X3DConcreteNode inherit from X3DNode, I guess.   This seems best.  I’m not sure why it doesn’t already? How about TransformObject extend from X3DNode in the short term?   That’s not in the standard, right?  It looks like it already does.</p><p class=MsoNormal>> </p><p class=MsoNormal>> This appears to be a Java issue.  What does the same Java do? AHA!</p><p class=MsoNormal>> </p><p class=MsoNormal>> $ java -cp /c/x3d-code/www.web3d.org/x3d/stylesheets/java/jars/X3DJSAIL.3.3.full.jar";". net/coderextreme/data/abox</p><p class=MsoNormal>> </p><p class=MsoNormal>> java.lang.NoClassDefFoundError: org/web3d/x3d/sai/Rendering/X3DGeometryNode</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.lang.Class.getDeclaredMethods0(Native Method)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.lang.Class.privateGetDeclaredMethods(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.lang.Class.privateGetMethodRecursive(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.lang.Class.getMethod0(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.lang.Class.getMethod(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>> Caused by: java.lang.ClassNotFoundException: org.web3d.x3d.sai.Rendering.X3DGeometryNode</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.net.URLClassLoader.findClass(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.lang.ClassLoader.loadClass(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          at java.lang.ClassLoader.loadClass(Unknown Source)</p><p class=MsoNormal>> </p><p class=MsoNormal>>          ... 7 more</p><p class=MsoNormal>> </p><p class=MsoNormal>> Error: A JNI error has occurred, please check your installation and try again</p><p class=MsoNormal>> </p><p class=MsoNormal>> Exception in thread "main"</p><p class=MsoNormal>> </p><p class=MsoNormal>> Previous versions of the jar work:</p><p class=MsoNormal>> </p><p class=MsoNormal>> $ java -cp ../../../../pythonSAI/X3DJSAIL.3.3.full.jar";". net/coderextreme/data/abox</p><p class=MsoNormal>> </p><p class=MsoNormal>> Warning: toFileStylesheetConversion(X3dToJson.xslt) is overwriting prior file ../data/abox.new.json</p><p class=MsoNormal>> </p><p class=MsoNormal>> Time to back some changes out? Report bug to Oracle?</p><p class=MsoNormal>> </p><p class=MsoNormal>> $ java -version</p><p class=MsoNormal>> </p><p class=MsoNormal>> java version "1.8.0_202"</p><p class=MsoNormal>> </p><p class=MsoNormal>> Java(TM) SE Runtime Environment (build 1.8.0_202-b08)</p><p class=MsoNormal>> </p><p class=MsoNormal>> Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)</p><p class=MsoNormal>> </p><p class=MsoNormal>> Thanks,</p><p class=MsoNormal>> </p><p class=MsoNormal>> I don’t have the current version of Java on my system.  I don’t want to install the lastest JDK 8 under the new Oracle agreement.</p><p class=MsoNormal>> </p><p class=MsoNormal>> HELP!</p><p class=MsoNormal>> </p><p class=MsoNormal>> Please try on your own systems.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>all the best, Don</p><p class=MsoNormal>-- </p><p class=MsoNormal>Don Brutzman  Naval Postgraduate School, Code USW/Br       brutzman@nps.edu</p><p class=MsoNormal>Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   +1.831.656.2149</p><p class=MsoNormal>X3D graphics, virtual worlds, navy robotics http://faculty.nps.edu/brutzman</p><p class=MsoNormal><o:p> </o:p></p></div></body></html>