[x3d-public] SAI before X3DJSAIL and x3d.py

John Carlson yottzumm at gmail.com
Tue Aug 24 14:20:47 PDT 2021


Joe,  I’m pretty sure I’d have to keep/use my own DOM tree, which is
possible, but why is there SAI?

On Tue, Aug 24, 2021 at 3:51 PM Joseph D Williams <joedwil at earthlink.net>
wrote:

>
>
> John, here is a reference for an older version of SAI abstract. Note that
> you can output the user code as a string, but it is a browser feature that
> would enable you to output the processed data, Like if you had a transform
> for an item of geometry and you asked for the internal value of the scaled
> and translated points after the transform operation, you may not be able to
> get directly. You may have to determine the intended points by doing the
> math. Of course if you have the user code, this is fairly straightforward.
>
>
>
>    - Now I understand why no one wanted to touch VRML.
>
>
>
> Don’t burn your fingers using a real live scenegraph …
>
> Sometimes the printed spec will reveal some truth. Have you looked at the
> spec to see  what is actually available?
>
>
>
> Thanks,
>
> Joe
>
> 20070301 04/25 20080225 0721 1123 1213 (75-2)
>
> **View SAI Abstract Standard*
> <http://www.web3d.org/x3d/specifications/ISO-IEC-19775-2.2-X3D-SceneAccessInterface/index.html>
>
> The X3D Abstract standard, Part 2, describes the X3D Scene Access
> Interface (SAI) that provides 'internal' and 'external' program access to
> the X3D browser and to the current scene. Like 19975 Part 1, the interfaces
> are described in a form that is independent of the actual implementation
> language/platform. This is my quick reference for the abstract SAI.
>
>
>
>
>
> *TheFinalDetail = *
>
> *  SAIBrowserRef.SAIExecutionContext.SAINode.SAIField.SAIFieldValue;*
>
>
>
>
>
> *X3D browser 'external' events default = *
>
> ** external event becomes internal event as received; *
>
> *  each with new internal timestamp, thus new cascade *
>
> ** external events buffered between beginUpdate/endUpdate become internal events; *
>
> *  all have same internal timestamp, thus same cascade  *
>
>
>
> *X3D browser 'internal' events default = *
>
> ** initial output-capable field change event sets timestamp for resulting cascade *
>
> ** script output event(s) sent with initial timestamp when script completes*
>
> *  beginUpdate when script starts; endUpdate when script complete*
>
> ** script directOutput event(s) sent as set; *
>
> *  (separate from current cascade, directOutput does not initiate new cascade)*
>
>
>
>
>
> *SAINode.SAIField.SAIFieldValue lifecycle*
>
> *Field type*
>
> *Creation*
>
> *Setup*
>
> *Realized*
>
> *Disposed*
>
> initializeOnly
>
> None
>
> readable/writable
>
> None
>
> None
>
> inputOnly
>
> None
>
> None
>
> writable
>
> None
>
> outputOnly
>
> None
>
> None
>
> readable
>
> None
>
> inputOutput
>
> None
>
> readable/writable
>
> readable/writable
>
> None
>
>
>
>
>
>
>
> *          External Browser services*
>
>
>
> *createBrowser(SAIParameterList, SAIPropertyList);*
>
> *  create X3D browser instance  *
>
> *  return new SAIBrowserApp*
>
>
>
> *getBrowser(SAIParameterList); *
>
> *  return SAIBrowserRef *
>
>
>
> *updateControl(SAIBrowserRef, SAIAction); *
>
> * SAIAction = BeginUpdate|EndUpdate*
>
>
>
> *dispose(SAIBrowserRef); *
>
> * no further interest; X3D browser returns SAI_Browser_Shutdown event*
>
>
>
> *SAIBoolean = setBrowserOption(SAIBrowserRef, SAIString, SAIObject); *
>
> * set defined Browser options *
>
>
>
> *dispose(SAIExecutionContext); *
>
> * no further interest; X3D browser may reclaim resources consumed by this execution context.*
>
>
>
> *prepareEvents; *
>
> *  called every frame; evaluate directOutput(s), evaluate cascade(s) *
>
>
>
> *eventsProcessed(SAIBrowserRef); *
>
> *  current event cascade processing for this node is complete; please update scene graph *
>
>
>
> *shutdown; *
>
> *  user code is no longer functional or executed*
>
>
>
>
>
> *          Internal Browser services*
>
>
>
> *  The main containing scene, each proto instance, *
>
> *  and each inline instance is a distinct and independent *
>
> *  execution context in the current scene graph. *
>
>
>
> *SAIBrowserName = getName(SAIBrowserRef); name of X3D browser*
>
>
>
> *SAIBrowserVersion = getVersion(SAIBrowserRef); version of X3D browser*
>
>
>
> *SAINavSpeed = getCurrentSpeed(SAIBrowserRef, SAILayerID); navigation speed *
>
>
>
> *SAIFrameRate = getCurrentFrameRate(SAIBrowserRef); current frame display rate *
>
>
>
> *SAIProfileDeclaration[s] = getSupportedProfiles(SAIBrowserRef); list of supported profiles *
>
>
>
> *SAIProfileDeclaration = getProfile(SAIBrowserRef, SAIString); declaration of named profile*
>
>
>
> *SAIComponentDeclaration[s] = getSupportedComponents(SAIBrowserRef); list of supported components*
>
>
>
> *SAIComponentDeclaration = getComponent(SAIBrowserRef, SAIComponent); declaration of the named component*
>
>
>
> *SAIExecutionContext = getExecutionContext(SAIBrowserRef); current execution context*
>
>
>
> *SAIScene = createScene(SAIBrowserRef, [SAIProfileDeclaration], [SAIComponentDeclaration]s); creates new empty scene  *
>
>
>
> *replaceWorld(SAIBrowserRef, SAIScene); replace current scene with new scene*
>
>
>
> *SAIScene = importDocument(SAIBrowserRef, DOMNode); import W3C DOM string, return X3D syntax*
>
>
>
> *loadURL(SAIBrowserRef, SAIURL [SAIURL]s, SAIPropertyList); replace current scene with new X3D scene *
>
>
>
> *setDescription(SAIBrowserRef, SAIString); set new scene description title*
>
>
>
> *SAIScene = createX3DFromString(SAIBrowserRef, SAIString); process string, return X3D syntax *
>
>
>
> *SAIScene = createX3DFromStream(SAIBrowserRef, SAIStream); process stream, return X3D syntax*
>
>
>
> *SAIScene = createX3DFromURL(SAIBrowserRef, SAIURL [SAIURL]s); process url, return X3D syntax*
>
>
>
> *updateControl(SAIBrowserRef, SAIAction); *
>
> * SAIAction = BeginUpdate|EndUpdate*
>
>
>
> *registerBrowserInterest(SAIBrowserRef, SAIAction, SAIRequester);*
>
> * SAIAction = AddBrowserInterest|RemoveBrowserInterest*
>
>
>
> *SAIPropertyList = getRenderingProperties(SAIBrowserRef); *
>
> * String any|Flat|Gouraud|Phong|Wireframe = getShading();*
>
> * String maximum texture size WIDTHxHEIGHT = getMaxTextureSize();*
>
> * Integer multitexture texture units = getTextureUnits();*
>
> * Boolean if anti-aliased = getAntiAliased();*
>
> * Integer bits of screen colour depth = getColorDepth();*
>
> * Float memory in megabytes = getTextureMemory();*
>
>
>
> *SAIPropertyList = getBrowserProperties(SAIBrowserRef); *
>
> * Boolean if ABSTRACT_NODES *
>
> * Boolean if CONCRETE_NODES *
>
> * Boolean if EXTERNAL_INTERACTIONS *
>
> * Boolean if PROTOTYPE_CREATE *
>
> * Boolean if DOM_IMPORT *
>
> * Boolean if XML_ENCODING *
>
> * Boolean if CLASSIC_VRML_ENCODING *
>
> * Boolean if BINARY_ENCODING*
>
>
>
> *changeViewpoint(SAIBrowserRef, SAIAction, SAILayerID); select viewpoint*
>
> * SAIAction = Next|Previous|First|Last*
>
>
>
> *print(SAIBrowserRef, SAIString); print to X3D browser console*
>
>
>
> *dispose(SAIBrowserRef); exit browser; generate SAI_Browser_Shutdown event *
>
>
>
> *SAIBoolean = setBrowserOption(SAIBrowserRef, SAIString, SAIObject); set defined Browser options *
>
>
>
>
>
> *          Execution context services*
>
>
>
> *SAIString = getSpecificationVersion(SAIExecutionContext); specification version string*
>
>
>
> *SAIEncoding = getEncoding(SAIExecutionContext); encoding string*
>
> * SAIEncoding = Scripted|ASCII|VRML|XML|Binary|BIFS*
>
>
>
> *SAIProfileDeclaration = getProfile(SAIExecutionContext); profile string*
>
> * SAIProfileDeclaration = from profile list*
>
>
>
> *SAIComponentDeclaration[s] = getComponents(SAIExecutionContext); components list*
>
> * SAIComponentDeclaration[s] = from components list*
>
>
>
> *SAIURL = getWorldURL(SAIExecutionContext); world url string*
>
>
>
> *SAINode = getNode(SAIExecutionContext, SAIString, SAIAction); return named node *
>
> * SAIAction = DEFNode|IMPORTNode|EXPORTNode*
>
>
>
> *SAINode = createNode(SAIExecutionContext, SAIString); create X3D node*
>
> * SAIString = name of an X3D node type*
>
>
>
> *SAINode = createProto(SAIExecutionContext, SAIString); create proto instance *
>
> * SAIString = name of PROTO*
>
>
>
> *namedNodeHandling(SAIExecutionContext, SAIAction, SAIAction, SAIString, [SAINode | SAIString, [SAIString]]); action named node *
>
> * SAIAction = AddDEFNode|UpdateDEFNode|RemoveDEFNode|*
>
> *             AddIMPORTNode|UpdateIMPORTNode|RemoveIMPORTNode|*
>
> *             AddEXPORTNode|UpdateEXPORTNode|RemoveEXPORTNode*
>
>
>
> *SAIProtoDeclaration = getProtoDeclaration(SAIExecutionContext, SAIString); return proto declaration*
>
> * SAIString = named PROTO declaration *
>
>
>
> *protoDeclarationHandling(SAIExecutionContext, SAIString, SAINode, SAIAction); action extern proto declareation*
>
> * SAIAction = AddProto|UpdateProto|RemoveProto*
>
>
>
> *SAIProtoDeclaration = getExternProtoDeclaration(SAIExecutionContext, SAIString); return extern proto declaration*
>
>
>
> *externprotoDeclarationHandling(SAIExecutionContext, SAIString, SAINode, SAIAction); action extern proto declareation*
>
> * SAIAction = AddExternProto|UpdateExternProto|RemoveExternProto*
>
>
>
> *SAINodes = getRootNodes(SAIExecutionContext); listing of current root nodes *
>
>
>
> *SAIRoutes = getRoutes(SAIExecutionContext); return route list*
>
>
>
> *dynamicRouteHandling(SAIExecutionContext, SAINode, SAIField, SAINode, SAIField, SAIAction); action route*
>
> * SAIAction = AddRoute|DeleteRoute*
>
>
>
> *dispose(SAIExecutionContext); no further interest in context*
>
>
>
>
>
> *          Scene services*
>
>
>
> *SAIString = getMetadata(SAIScene, SAIString); return an item of metadata  *
>
>
>
> *setMetadata(SAIScene, SAIString, SAIString); inserts an item of metadata *
>
>
>
> *namedNodeHandling(SAIExecutionContext, SAIAction, SAIAction, SAIString, [SAINode | SAIString, [SAIString]]); *
>
> * action named node *
>
> * SAIAction = AddDEFNode|UpdateDEFNode|RemoveDEFNode|*
>
> *             AddIMPORTNode|UpdateIMPORTNode|RemoveIMPORTNode|*
>
> *             AddEXPORTNode|UpdateEXPORTNode|RemoveEXPORTNode*
>
>
>
> *rootNodeHandling(SAIScene, SAINode, SAIAction); *
>
> * action named root node*
>
> * SAIAction = AddRootNode|RemoveRootNode*
>
> *   If AddRootNode when the node or children is currently part of another scene, generate SAI_NODE_IN_USE*
>
>
>
> *          Node services*
>
>
>
> *SAIString = getTypeName(SAINode); *
>
>
>
> *SAINodeType = getType(SAINode);*
>
>
>
> *SAIField = getField(SAINode, SAIFieldName);*
>
>
>
> *SAIFieldsgetFieldDefinitions(SAINodeType);*
>
>
>
> *dispose(SAINode); no further interest*
>
>
>
>
>
> *          Field services*
>
>
>
> *SAIFieldAccess = getAccessType(SAINode, SAIField); *
>
>
>
> *SAIFieldType = getType(SAINode, SAIField);*
>
>
>
> *SAIFieldName = getName(SAINode, SAIField);*
>
>
>
> *SAIFieldValue = getValue(SAINode, SAIField);*
>
>
>
> *setValue(SAINode, SAIField, SAIFieldValue);*
>
>
>
> *registerFieldInterest(SAINode, SAIField, SAIAction, SAIRequester); action field interest*
>
> * SAIAction = AddInterest|RemoveINteres*
>
>
>
> *dispose(SAIField); no further interest*
>
>
>
>
>
> *          Route services *
>
>
>
> *SAINode = getSourceNode(SAIRoute); *
>
>
>
> *SAIString = getSourceField(SAIRoute); *
>
>
>
> *SAINode = getDestinationNode(SAIRoute);  *
>
>
>
> *SAIString = getDestinationField(SAIRoute);  *
>
>
>
> *dispose(SAIRoute); *
>
>
>
>
>
> *          Prototype services *
>
>
>
> *SAIBoolean = isExternproto(SAIProtoDeclaration);*
>
>
>
> *SAINode = createInstance(SAIProtoDeclaration);*
>
>
>
> *SAIField[s] = getFieldDefinitions(SAIProtoDeclaration); *
>
>
>
> *SAILoadState = checkLoadState(SAIProtoDeclaration); *
>
>
>
> *requestImmediateLoad(SAIProtoDeclaration);*
>
>
>
>  *          Configuration services *
>
>
>
> *SAIString = getComponentName(SAIComponentDeclaration); *
>
>
>
> *SAIString = getComponentLevel(SAIComponentDeclaration); *
>
>
>
> *SAIString = getProfileName(SAIProfileDeclaration); *
>
>
>
> *SAIComponentDeclaration[s] = getProfileComponents(SAIProfileDeclaration); *
>
>
>
> *SAIString = getProviderName(SAIProfileDeclaration)*
>
>
>
>  *          Script Services  *
>
>
>
> *setBrowser(SAIBrowserRef); *
>
>
>
> *setFields(SAINode, SAIField, [SAIField]s )*
>
>
>
> *initialize; *
>
> *  the user code is active *
>
>
>
> *prepareEvents; *
>
> *  called every frame; evaluate directOutput(s), evaluate cascade(s) *
>
>
>
> *eventsProcessed(SAIBrowserRef); *
>
> *  current event cascade processing for this node is complete; please update scene graph *
>
>
>
> *shutdown; *
>
> *  user code is longer functional or executed*
>
>
>
>  *          3x3 and 4x4 Matrix services *
>
>
>
> *set(SAIMatrix, SFVec3f, SFRotation, SFVec3f, SFRotation, SFVec3f);*
>
> *  for the matrix set*
>
> *  translation, rotation, scale, scaleOrientation, center *
>
>
>
> *get(SAIMatrix, SFVec3f, SFRotation, SFVec3f);*
>
> * from the matrix return *
>
> *   translation, rotation, scale*
>
>
>
> *inverse(SAIMatrix); *
>
> *  inverse this matrix in place*
>
>
>
> *transpose(SAIMatrix); *
>
> *  transpose this matrix in place*
>
>
>
> *multiply(SAIMatrix, SAIMatrix); *
>
> *  multiply first matrix by second matrix place result first matrix *
>
>
>
> *multiplyWithVector(SAIMatrix, SFVec3f);*
>
> *  both left and right *
>
>
>
>
>
> *          Data type definitions *
>
>
>
> *SAIAction *
>
> *SAIBoolean *
>
> *SAIBrowserApp *
>
> *SAIBrowserName *
>
> *SAIBrowserRef *
>
> *SAIBrowserVersion *
>
> *SAIComponentDeclaration *
>
> *SAIComponent *
>
> *SAIEncoding *
>
> *SAIExecutionContext *
>
> *SAIFieldAccess *
>
> *SAIFieldDeclaration *
>
> *SAIField *
>
> *SAIFieldName *
>
> *SAIFieldType *
>
> *SAIFieldValue *
>
> *SAIFrameRate *
>
> *SAILayerID **
>
> *SAILoadState *
>
> *SAIMatrix **
>
> *SAINavSpeed *
>
> *SAINode *
>
> *SAINodeType *
>
> *SAIParameterLIst *
>
> *SAIProfileDeclaration *
>
> *SAIPropertyList *
>
> *SAIProtoDeclaration *
>
> *SAIRequester *
>
> *SAIRoute *
>
> *SAIScene *
>
> *SAIScript *
>
> *SAIScriptImplementation *
>
> *SAIStream *
>
> *SAIString *
>
> *SAIURL *
>
> *NULL *
>
>
>
>
>
> *          Error types *
>
>
>
> *SAIError *
>
> *SAI_BROWSER_UNAVAILABLE *
>
> *SAI_CONNECTION_ERROR *
>
> *SAI_DISPOSED *
>
> *SAI_IMPORTED_NODE *
>
> *SAI_INSUFFICIENT_CAPABILITIES *
>
> *SAI_INVALID_ACCESS_TYPE *
>
> *SAI_INVALID_BROWSER *
>
> *SAI_IINVALID_DOCUMENT *
>
> *SAI_INVALID_EXECUTION_CONTEXT *
>
> *SAI_INVALID_FIELD *
>
> *SAI_INVALID_NAME *
>
> *SAI_INVALID_NODE *
>
> *SAI_INVALID_OPERATION_TIMING *
>
> *SAI_INVALID_URL *
>
> *SAI_INVALID_X3D *
>
> *SAI_NODE_IN_USE *
>
> *SAI_NODE_NOT_AVAILABLE *
>
> *SAI_NOT_SHARED *
>
> *SAI_NOT_SUPPORTED *
>
> *SAI_URL_UNAVAILABLE *
>
>
>
>
>
> *          Event types *
>
>
>
> *SAI_Browser_Event *
>
> *SAI_Browser_Initialized *
>
> *SAI_Browser_Shutdown *
>
> *SAI_Browser_Connection_Error *
>
> *SAI_Browser_URL_Error *
>
> *SAIFieldEvent *
>
>
>
>
>
>
>
> *From: *John Carlson <yottzumm at gmail.com>
> *Sent: *Monday, August 23, 2021 3:05 PM
> *To: *X3D Graphics public mailing list <x3d-public at web3d.org>
> *Subject: *[x3d-public] SAI before X3DJSAIL and x3d.py
>
>
>
> Can anyone describe how to export VRML and XML from SAI?   I do have a
> good reason and it’s not to steal anything.   Let’s say I need to apply a
> transform, then drop the transform.   This is for HAnim.   I want to output
> the modified model  to XML with transform and no transform attributes, they
> have been applied to the children.
>
>
>
> Now I understand why no one wanted to touch VRML.
>
>
>
> John
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20210824/7c4c2e83/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 5B63351678A24814B63F5EBDD8F9F395.png
Type: image/png
Size: 135 bytes
Desc: not available
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20210824/7c4c2e83/attachment-0001.png>


More information about the x3d-public mailing list