[x3d-public] [x3dom-users] Cobweb_dom...Script Magic? Loading DOM subscenesafter parent in X3DOM and Cobweb. ALMOST complete, requires sequencing ofouter functions.

John Carlson yottzumm at gmail.com
Mon May 22 10:00:04 PDT 2017

I believe namespace conflicts like (1) can be avoided through the use of
X3D JSON -> XML with a script stripper that sends X3D Ecmascript in the
JSON to eval, after first processing the fields for ROUTEs.   This is done
in my Script.js file with supporting​ from loadScripts() in
loaderQuery.js.  The plan is to have your DOM and eat it too.

On May 22, 2017 11:01 AM, "Leonard Daly" <Leonard.Daly at realism.com> wrote:

On 5/22/2017 7:12 AM, John Carlson wrote:

The Script AND the Proto problem have ben solved in the HTML environment, I
believe, with Cobweb + Cobweb DOM, or close to it.  See Cobweb 3.2.


Script is very far from being solved, and (I believe) unsolvable with the
constraints of X3D and DOM. These are my reasons.
1) There is a name conflict so X3D Script cannot be in the same namespace
as HTML's Script. HTML only has one namespace
2) DOM allows scripts to modify themselves or be modified by other scripts.
This is not possible in Cobweb or Cobweb_DOM.

3) If you create a new node called (for example) X3dScript replacing the
current X3D's Script node you solve (1) and because it's not JavaScript in
the DOM, (2) is irrelevant. Now a scene has two different scripting
environments. Even though the code looks to be the same (written in the
same language), one cannot access fields, methods, properties, etc. of the
other. They have different calling mechanisms. The X3dScript node code
cannot respond to HTML events (mouseover, click, typing, etc in HTML
elements). The HTML/DOM Script code can only interact with X3D elements
through X3D's SAI. This design would produce an environment that has
minimal (even less than current X3D) adoption. It would be confusing to
developers with no obvious reason to the separate design.

Go bury your head in X3DOM or Aframe please, and let the X3D standards
folks deal with X3D.

So perhaps you are right and I can't drag this dinosaur onto a solid
foundation and prevent it from sinking into the swamp of irrelevance.

OTOH, I've been working on the VRML and X3D standards for 20 years. I have
been responsible for seeing all V3.x standards properly go through the
standardization process, and have co-authored a book on the X3D V3
standard; so perhaps I do know a bit about the standard and how to keep it
relevant in the modern environment.

Leonard Daly

Enough said.


Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for Windows

*From: *Leonard Daly <Leonard.Daly at realism.com>
*Sent: *Monday, May 22, 2017 10:06 AM
*To: *John Carlson <yottzumm at gmail.com>
*Cc: *X3D Graphics public mailing list <x3d-public at web3d.org>;
x3dom-users at lists.sourceforge.net; Andreas Plesch <andreasplesch at gmail.com>;
holger.seelig at yahoo.de
*Subject: *Re: [x3dom-users] Cobweb_dom...Script Magic? Loading DOM
subscenesafter parent in X3DOM and Cobweb. ALMOST complete, requires
sequencing ofouter functions.


I have not been convinced that Protos need to exist in an HTML environment.
Scripts are an integral piece of the Proto architecture so if you path is
to implement Protos on the way to implementing Scripts, you need to solve
the entire Script problem first. If Scripts are optional, then why have
Proto? I think something like a macro expansion can solve all of the use
cases where Proto would be used while being lighter weight and easier to
implement and possibly use.

Leonard Daly

Leonard, I believe Scripts should be implemented AFTER Protos.   Just my
opinion.  Once the Protos and the ROUTEs and the Scripts are expanded with
the new DEFs, then you apply the event model.   This makes things easier,
but takes more memory.   Then you optimize.   Beware premature


On May 21, 2017 12:16 AM, "Leonard Daly" <Leonard.Daly at realism.com> wrote:


I don't really like to answer this way, but why?

X3DOM does not have Proto/ExternProto feature. It does not have X3D Script
node. The integration with HTML is too close to allow an X3D Script node.
HTML JavaScript (via DOM and X3D node manipulation) is available and used
extensively. X3DOM does not handle VRML (meaning a text file with {}
syntax). There is an unofficial JSON loader. Perhaps you have one too. How
does it get the scene graph into DOM? Does it create DOM elements (or
perhaps an HTML text string which is then parsed)? Something else?

To the extent I understand your question, you are asking for help in
constructing a means of handling X3D Script node in X3DOM. Once that is
done, Proto/ExternProto would be next. This would all come into the browser
through an JSON encoded file. It seems to me that trying to handle X3D
Script code requires an entire infrastructure supporting the X3D event mode
and calling script code with X3D arguments. It also requires building full
support for SAI and supporting the 'directOutput' field. That is a major
effort with no obvious purpose that I see in V4.

You are asking for some serious time support (I think) into an application
that is neither fully X3D-compliant, nor DOM-compliant (but the closest to
both that is available). At least for me, I do not understand how this
effort would further an X3D integrated DOM system. I am quite willing to
listen to your reasons and help where I can, but I would like to see where
this is going first.

Leonard Daly

P.S.  Everything above is for client-side code. Server side code can
manipulate things as much as it wants to create something that runs in a
client-side browser.

P.P.S. I do think there is a need to JSON encoding in V4 subject to the
node definition for V4.

Yes, Leonard, for quite some time I have an X3D JSON PROTOtypeExpander.js
that works with X3D PROTOs and EXTERNPROTOs and displays in X3DOM.  I don’t
know how complete it is, and testers are welcome. My EXTERNPROTO expander
runs on the server, so is not included in the message, but it is included
in the link in the original message.  If someone can make the EXTERNPROTO
expander work client side that would be great.

The EXTERNPROTO expander is generally called like:

                json = externPrototypeExpander(outfile, json);

Where json is the parent json of the extern, and outfile is the parent X3D
file being loaded (I think “” will probably do in a pinch.  I am not
sure.).  The extern PROTOs will be included in the original JSON as a
ProtoDeclare object.  You may have to run the flattener afterwards, and it
is run as:

            json = flattener(json);

It removes empty objects from the JSON.

Yes, I would like someone to help me with VRMLScript for X3DOM, if someone
is available.  I have a very barebones and incorrect implementation here:


Please help.  I don’t know the X3D event model, and I’m not likely to learn
soon.  The X3D event model can be emulated in Browser-side JavaScript, but
there’s only Cobweb for proof.

I have another version of flipper.html here that works with X3DOM and
Cobweb adding the subscene later.  It works with Promises, but the
functions still aren’t separated…close, but no cigar.  Take a look:


Sorry, I tend to use the XML version of “Proto”, and not the VRML “PROTO”.

X3DJSONLD provides an infrastructure for X3D JSON Browser development,
including X3D XML -> X3D JSON conversion on the server, and X3D JSON to X3D
XML loading into X3DOM and Cobweb.  It also includes conversions from XML
DOM to Java and Nashorn JavaScript for X3DJSAIL app development.

There is definite potential for an XML PROTO expander, as I have written
this code, but not seriously tested:


So far, it’s still server-side.  If you’re going to modify it, split it
into server and client-side pieces, please.  Complete is probably a



Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for Windows

*From: *Leonard Daly <Leonard.Daly at realism.com>
*Sent: *Saturday, May 20, 2017 7:17 PM
*To: *John Carlson <yottzumm at gmail.com>; Andreas Plesch
<andreasplesch at gmail.com>; holger.seelig at yahoo.de
*Cc: *x3dom-users at lists.sourceforge.net; X3D Graphics public mailing list
<x3d-public at web3d.org>
*Subject: *Re: [x3dom-users] Cobweb_dom...Script Magic? Loading DOM
subscenesafter parent in X3DOM and Cobweb.


Cobweb_dom, X3DOM experts, I need some help adding a child DOM scenegraph
with prototypes to a parent DOM scenegraph after the

Not sure how any of this applies to X3DOM as it does not have PROTOs.
Assuming you mean X3D prototypes via PROTO or EXTERNPROTO. If you mean
something else, please elaborate.

Leonard Daly

primary scene has been  loaded, and not before. I have an example of
loading before the scene is loaded, and in a callback.  If you have an
example with Promises instead of callback nesting, that would be more
ideal, the second $.getJSON() (child scenegraph) might finish before the
first $.getJSON() (parent scenegraph) if I don’t use promises or callback
nesting. Also, Promises would allow me to separate the parent loading
somewhat from the child loading, and create separate functions.  Also,
X3DOM experts can provide an example with Promises as well.  Meanwhile, I
will be reading about Promises.

Here is my example so far:


Viewable here:


The white Box is the subscene of the dolphin scene.

The following related code is from https://github.com/

and references code from:


[ actually, I think the last two reference each other – naughty ]

Data is here:

[ child scenegraph ]


[ parent scenegraph ]


Cobweb doesn’t need the prototypeExpander or the flattener (well, it might
have with prototypes in cobweb_dom, but I think the last release fixed
that…haven’t checked—here is a good test for you!).  This is a dual
example, and I haven’t figured out how to conditionally run the
prototypeExpander on only X3DOM code.  Please test without the
PrototypeExpander.js and Flattener.js included, and remove X3DOM, since it
won’t work in that case.  X3DOM folks can include the two JavaScript files
which are here:



You may provide your own appendInline (below) which doesn’t call
loadSchema.  That may be too complex of a download.  That is, you probably
don’t want to do all that JSON schema validation in your example.  Try to
keep my code close to what it is otherwise.

And if you start supporting X3D JSON in your viewers, that would be even



·         Next is passed the element parameter

·         */

function appendInline(element, url, next) {

        $.getJSON(url, function(json) {

                if (typeof prototypeExpander === 'function') {

                        json = prototypeExpander(url, json, "");

                } else {

                        console.error("Perhaps you need to include the


                if (typeof flattener === 'function') {

                        json = flattener(json);

                } else {

                        console.error("Perhaps you need to include the


                // must validate here because we call an inner method.

                loadSchema(json, url, doValidate, function() {

                        ConvertToX3DOM(json["X3D"]["Scene"], "Scene",
element, url);


                }, function(e) {



        }).fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON
request failed! ' + textStatus + ' ' + errorThrown); });



·         Next is passed the selected element from selector

·         Selector is the CSS selector to append inline to.

·         */

function loadSubscene(selector, url, next) {

        appendInline(document.querySelector(selector), url, next);



Check out the vibrant tech community on one of the world's most

engaging tech sites, Slashdot.org! http://sdm.link/slashdot


X3dom-users mailing list

X3dom-users at lists.sourceforge.net


*Leonard Daly*
3D Systems & Cloud Consultant
President, Daly Realism - *Creating the Future*

*Leonard Daly*
3D Systems & Cloud Consultant
President, Daly Realism - *Creating the Future*

*Leonard Daly*
3D Systems & Cloud Consultant
President, Daly Realism - *Creating the Future*

*Leonard Daly*
3D Systems & Cloud Consultant
President, Daly Realism - *Creating the Future*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20170522/63329dc3/attachment-0001.html>

More information about the x3d-public mailing list