[x3d-public] X3D Java SAI. Declarative style
John Carlson
yottzumm at gmail.com
Thu Jan 19 08:32:48 PST 2017
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.
On Jan 19, 2017 9:19 AM, "Don Brutzman" <brutzman at nps.edu> wrote:
> I read a very interesting book on the flight to Korea. This cleared up
> several mysteries for me... highly recommended.
>
> *Functional Programming in Java: Harnessing the Power of Java 8 Lambda
> Expressions, Venkat Subramaniam, Pragmatic Bookshelf, Dallas Texas, 2014.
> https://pragprog.com/book/vsjava8/functional-programming-in-java
>
> John, here is a new style of coding that mostly eliminates the need for
> declaring each and every object.
>
> 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.
>
> 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.
>
> New code block in HelloWorldProgram.java:
> =============================================
>
> /** Test declarative style, prototype fields and scripting */
> private void addMaterialModulatorModulator ()
> {
> ProtoDeclareObject materialModulatorPrototype = new
> ProtoDeclareObject ("MaterialModulator");
> materialModulatorPrototype
> .setAppinfo("mimic a Material node and modulate
> fields as an animation effect")
> .setDocumentation("http://x3dg
> raphics.com/examples/X3dForWebAuthors/Chapter14-Prototypes/M
> aterialModulatorIndex.html")
> .setProtoInterface(
> new ProtoInterfaceObject()
> .addField(new fieldObject ()
> .setName("enabled")
>
> .setType(fieldObject.TYPE_SFBOOL)
> .setAccessType(
> fieldObject.ACCESSTYPE_INPUTOUTPUT)
>
> .setValue(SFBoolObject.TRUE))
> .addField(new fieldObject (
> "diffuseColor",
> fieldObject.TYPE_SFCOLOR,fieldObject.ACCESSTYPE_INPUTOUTPUT,
>
> (SFColorObject.toString(SFColorObject.DEFAULT_VALUE))))
> .addField(new fieldObject (
>
> "emissiveColor",fieldObject.TYPE_SFCOLOR,fieldObject.ACCESST
> YPE_INPUTOUTPUT,
>
> Integer.toString(0x000080)))
> //
> SFColorObject.toString(0x000080))) // TODO fix
> // TODO major side
> effect follows that affects all MaterialObject specularColor values, why?
> // design change
> needed to make things work? how to prevent user from provoking it?
> // (new
> SFColorObject(0.05f, 0.05f, 0.85f)).toString()))
> .addField(new fieldObject (
>
> "specularColor",fieldObject.TYPE_SFCOLOR,fieldObject.ACCESST
> YPE_INPUTOUTPUT,
>
> (SFColorObject.toString(SFColorObject.BLACK))))
> .addField(new fieldObject (
> "transparency",
> fieldObject.TYPE_SFFLOAT,fieldObject.ACCESSTYPE_INPUTOUTPUT,
> "0.0"))
> .addField(new fieldObject (
> "shininess",
> fieldObject.TYPE_SFFLOAT,fieldObject.ACCESSTYPE_INPUTOUTPUT,
>
> Float.toString(0.0f)))
> .addField(new fieldObject (
>
> "ambientIntensity",fieldObject.TYPE_SFFLOAT,fieldObject.
> ACCESSTYPE_INPUTOUTPUT,
>
> SFFloatObject.toString(0.0f)))
> //
> .setChildren((MaterialObject newMaterial = new MaterialObject
> ("MaterialNode"))))
> // TODO fix syntax or add
> utility methods
> );
> ProtoBodyObject materialModulatorProtoBody = new
> ProtoBodyObject();
> materialModulatorPrototype.set
> ProtoBody(materialModulatorProtoBody);
> materialModulatorProtoBody.addChildren(
> new MaterialObject("MaterialNode")
> .setIS(new ISObject()
> .addConnect(new
> connectObject().setNodeField("diffuseColor"
> ).setProtoField("diffuseColor"))
> .addConnect(new
> connectObject().setNodeField("emissiveColor"
> ).setProtoField("emissiveColor"))
> .addConnect(new
> connectObject().setNodeField("specularColor"
> ).setProtoField("specularColor"))
> .addConnect(new
> connectObject().setNodeField("transparency"
> ).setProtoField("transparency"))
> .addConnect(new
> connectObject().setNodeField("shininess"
> ).setProtoField("shininess"))
> .addConnect(new
> connectObject().setNodeField("ambientIntensity").setProtoFie
> ld("ambientIntensity"))
> ));
> materialModulatorProtoBody.addChildren(
> new CommentsBlock ("Only first node (the node
> type) is renderable, others are along for the ride"));
> materialModulatorProtoBody.addChildren(
> new ScriptObject ("MaterialModulatorScript")
> .addField(new
> fieldObject().setName("enabled").setType(fieldObject.TYPE_SFBOOL)
> .setAccessType(fieldObject.ACC
> ESSTYPE_INPUTOUTPUT))
> .addField(new
> fieldObject().setName("diffuseColor").setType(fieldObject.TYPE_SFCOLOR)
> .setAccessType(fieldObject.ACC
> ESSTYPE_INPUTOUTPUT))
> .addField(new
> fieldObject().setName("newColor").setType(fieldObject.TYPE_SFCOLOR)
> .setAccessType(fieldObject.ACC
> ESSTYPE_OUTPUTONLY))
> .addField(new
> fieldObject().setName("clockTrigger").setType(fieldObject.TYPE_SFTIME)
> .setAccessType(fieldObject.ACC
> ESSTYPE_INPUTONLY))
> .setIS(new ISObject()
> .addConnect(new
> connectObject().setNodeField("enabled" ).setProtoField("enabled"))
> .addConnect(new
> connectObject().setNodeField("diffuseColor").setProtoField("
> diffuseColor")))
> .setSourceCode(new String("ecmascript:\n" +
> "function initialize ()\n" +
> "{\n" +
> " newColor = diffuseColor; // start with correct color\n" +
> "}\n" +
> "function set_enabled (newValue)\n" +
> "{\n" +
> " enabled = newValue;\n" +
> "}\n" +
> "function clockTrigger (timeValue)\n" +
> "{\n" +
> " if (!enabled) return;\n" +
> " red = newColor.r;\n" +
> " green = newColor.g;\n" +
> " blue = newColor.b;\n" +
> " \n" +
> " // note different modulation rates for each color component, % is
> modulus operator\n" +
> " newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue +
> 0.04) % 1);\n" +
> " if (enabled)\n" +
> " {\n" +
> " Browser.print ('diffuseColor=(' + red +',' + green + ',' +
> blue + ') newColor=' + newColor.toString() + '\\n');\n" +
> " }\n" +
> "}")));
> scene.addChildren(materialModulatorPrototype);
> }
>
> =============================================
>
> 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.
>
> When ready I recommend you shift to declarative style to avoid need to
> generate individual objects with unique suffixes.
>
> all the best, Don
> --
> Don Brutzman Naval Postgraduate School, Code USW/Br
> brutzman at nps.edu
> Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA
> +1.831.656.2149
> X3D graphics, virtual worlds, navy robotics http://faculty.nps.edu/brutzma
> n
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20170119/83007d22/attachment-0001.html>
More information about the x3d-public
mailing list