<div dir="auto">While I appreciate the style, I think it's harder to debug and edit from a human point of view. I am not compromising to make it easier for the java compiler. I like to make it easier for humans. What this style lacks is tag names, which are vital for debugging. That is, what type do I need to add this method to if the compiler fails. Since the SAI can support both styles, I suggest we keep yours as an optimization in some serializer somewhere. Let's discuss. In otherwords, having distinct variable names gives you a handle to work with debugging. If the was a programming language which supported both styles, it would be ideal.</div><div class="gmail_extra"><br><div class="gmail_quote">On Jan 19, 2017 9:19 AM, "Don Brutzman" <<a href="mailto:brutzman@nps.edu">brutzman@nps.edu</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I read a very interesting book on the flight to Korea. This cleared up several mysteries for me... highly recommended.<br>
<br>
*Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions, Venkat Subramaniam, Pragmatic Bookshelf, Dallas Texas, 2014.<br>
<a href="https://pragprog.com/book/vsjava8/functional-programming-in-java" rel="noreferrer" target="_blank">https://pragprog.com/book/vsja<wbr>va8/functional-programming-in-<wbr>java</a><br>
<br>
John, here is a new style of coding that mostly eliminates the need for declaring each and every object.<br>
<br>
Benefits include more concise, no side effects, no need to keep track of names for object instances, automatically parallelizable by compiler. Syntax looks a lot like node.js style.<br>
<br>
I picked a scene that shows ProtoDeclare, Script, fields, IS/connect and CDATA source code to get a good workout. The only object member is "scene", everything else is local.<br>
<br>
New code block in HelloWorldProgram.java:<br>
==============================<wbr>===============<br>
<br>
/** Test declarative style, prototype fields and scripting */<br>
private void addMaterialModulatorModulator ()<br>
{<br>
ProtoDeclareObject materialModulatorPrototype = new ProtoDeclareObject ("MaterialModulator");<br>
materialModulatorPrototype<br>
.setAppinfo("mimic a Material node and modulate fields as an animation effect")<br>
.setDocumentation("<a href="http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14-Prototypes/MaterialModulatorIndex.html" rel="noreferrer" target="_blank">http://x3dg<wbr>raphics.com/examples/X3dForWeb<wbr>Authors/Chapter14-Prototypes/M<wbr>aterialModulatorIndex.html</a>")<br>
.setProtoInterface(<br>
new ProtoInterfaceObject()<br>
.addField(new fieldObject ()<br>
.setName("enabled")<br>
.setType(fieldObject.TYPE_SFBO<wbr>OL)<br>
.setAccessType( fieldObject.ACCESSTYPE_INPUTOU<wbr>TPUT)<br>
.setValue(SFBoolObject.TRUE))<br>
.addField(new fieldObject (<br>
"diffuseColor", fieldObject.TYPE_SFCOLOR,field<wbr>Object.ACCESSTYPE_INPUTOUTPUT,<br>
(SFColorObject.toString(SFColo<wbr>rObject.DEFAULT_VALUE))))<br>
.addField(new fieldObject (<br>
"emissiveColor",fieldObject.TY<wbr>PE_SFCOLOR,fieldObject.ACCESST<wbr>YPE_INPUTOUTPUT,<br>
Integer.toString(0x000080)))<br>
// SFColorObject.toString(0x00008<wbr>0))) // TODO fix<br>
// TODO major side effect follows that affects all MaterialObject specularColor values, why?<br>
// design change needed to make things work? how to prevent user from provoking it?<br>
// (new SFColorObject(0.05f, 0.05f, 0.85f)).toString()))<br>
.addField(new fieldObject (<br>
"specularColor",fieldObject.TY<wbr>PE_SFCOLOR,fieldObject.ACCESST<wbr>YPE_INPUTOUTPUT,<br>
(SFColorObject.toString(SFColo<wbr>rObject.BLACK))))<br>
.addField(new fieldObject (<br>
"transparency", fieldObject.TYPE_SFFLOAT,field<wbr>Object.ACCESSTYPE_INPUTOUTPUT,<br>
"0.0"))<br>
.addField(new fieldObject (<br>
"shininess", fieldObject.TYPE_SFFLOAT,field<wbr>Object.ACCESSTYPE_INPUTOUTPUT,<br>
Float.toString(0.0f)))<br>
.addField(new fieldObject (<br>
"ambientIntensity",fieldObject<wbr>.TYPE_SFFLOAT,fieldObject.<wbr>ACCESSTYPE_INPUTOUTPUT,<br>
SFFloatObject.toString(0.0f)))<br>
// .setChildren((MaterialObject newMaterial = new MaterialObject ("MaterialNode"))))<br>
// TODO fix syntax or add utility methods<br>
);<br>
ProtoBodyObject materialModulatorProtoBody = new ProtoBodyObject();<br>
materialModulatorPrototype.set<wbr>ProtoBody(materialModulatorPro<wbr>toBody);<br>
materialModulatorProtoBody.add<wbr>Children(<br>
new MaterialObject("MaterialNode")<br>
.setIS(new ISObject()<br>
.addConnect(new connectObject().setNodeField("<wbr>diffuseColor" ).setProtoField("diffuseColor"<wbr>))<br>
.addConnect(new connectObject().setNodeField("<wbr>emissiveColor" ).setProtoField("emissiveColo<wbr>r"))<br>
.addConnect(new connectObject().setNodeField("<wbr>specularColor" ).setProtoField("specularColo<wbr>r"))<br>
.addConnect(new connectObject().setNodeField("<wbr>transparency" ).setProtoField("transparency"<wbr>))<br>
.addConnect(new connectObject().setNodeField("<wbr>shininess" ).setProtoField("shininess"))<br>
.addConnect(new connectObject().setNodeField("<wbr>ambientIntensity").setProtoFie<wbr>ld("ambientIntensity"))<br>
));<br>
materialModulatorProtoBody.add<wbr>Children(<br>
new CommentsBlock ("Only first node (the node type) is renderable, others are along for the ride"));<br>
materialModulatorProtoBody.add<wbr>Children(<br>
new ScriptObject ("MaterialModulatorScript")<br>
.addField(new fieldObject().setName("enabled<wbr>").setType(fieldObject.TYPE_<wbr>SFBOOL)<br>
.setAccessType(fieldObject.ACC<wbr>ESSTYPE_INPUTOUTPUT))<br>
.addField(new fieldObject().setName("diffuse<wbr>Color").setType(fieldObject.<wbr>TYPE_SFCOLOR)<br>
.setAccessType(fieldObject.ACC<wbr>ESSTYPE_INPUTOUTPUT))<br>
.addField(new fieldObject().setName("newColo<wbr>r").setType(fieldObject.TYPE_<wbr>SFCOLOR)<br>
.setAccessType(fieldObject.ACC<wbr>ESSTYPE_OUTPUTONLY))<br>
.addField(new fieldObject().setName("clockTr<wbr>igger").setType(fieldObject.<wbr>TYPE_SFTIME)<br>
.setAccessType(fieldObject.ACC<wbr>ESSTYPE_INPUTONLY))<br>
.setIS(new ISObject()<br>
.addConnect(new connectObject().setNodeField("<wbr>enabled" ).setProtoField("enabled"))<br>
.addConnect(new connectObject().setNodeField("<wbr>diffuseColor").setProtoField("<wbr>diffuseColor")))<br>
.setSourceCode(new String("ecmascript:\n" +<br>
"function initialize ()\n" +<br>
"{\n" +<br>
" newColor = diffuseColor; // start with correct color\n" +<br>
"}\n" +<br>
"function set_enabled (newValue)\n" +<br>
"{\n" +<br>
" enabled = newValue;\n" +<br>
"}\n" +<br>
"function clockTrigger (timeValue)\n" +<br>
"{\n" +<br>
" if (!enabled) return;\n" +<br>
" red = newColor.r;\n" +<br>
" green = newColor.g;\n" +<br>
" blue = newColor.b;\n" +<br>
" \n" +<br>
" // note different modulation rates for each color component, % is modulus operator\n" +<br>
" newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);\n" +<br>
" if (enabled)\n" +<br>
" {\n" +<br>
" Browser.print ('diffuseColor=(' + red +',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\\n');\n" +<br>
" }\n" +<br>
"}")));<br>
scene.addChildren(materialModu<wbr>latorPrototype);<br>
}<br>
<br>
==============================<wbr>===============<br>
<br>
Pretty darn cool. Some more work to follow on my part to tighten up need to repeat addChildren calls for every individual child and source text, but this is a big step.<br>
<br>
When ready I recommend you shift to declarative style to avoid need to generate individual objects with unique suffixes.<br>
<br>
all the best, Don<br>
-- <br>
Don Brutzman Naval Postgraduate School, Code USW/Br <a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a><br>
Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA <a href="tel:%2B1.831.656.2149" value="+18316562149" target="_blank">+1.831.656.2149</a><br>
X3D graphics, virtual worlds, navy robotics <a href="http://faculty.nps.edu/brutzman" rel="noreferrer" target="_blank">http://faculty.nps.edu/brutzma<wbr>n</a><br>
</blockquote></div></div>