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

Joseph D Williams joedwil at earthlink.net
Tue Aug 24 19:02:57 PDT 2021


Hi John, 
To test sai, first find a browser maker that is implementing x3d sai then test and feedback stuff that doesn’t work. 
Will a browser that supports sai please tell us more. 
Joe


From: John Carlson
Sent: Tuesday, August 24, 2021 6:05 PM
To: Joseph D Williams
Cc: X3D Graphics public mailing list
Subject: Re: [x3d-public] SAI before X3DJSAIL and x3d.py

Joe,  all I know is that toXMLString was taken out of the C/C++/C# spec.   I am not really sure how to verify that the SAI actually works?  Spot checking?

John 

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
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
Sent: Monday, August 23, 2021 3:05 PM
To: X3D Graphics public mailing list
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/5d0c5ebd/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: C7956169C8004EC4929F4D35E23DF271.png
Type: image/png
Size: 141 bytes
Desc: not available
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20210824/5d0c5ebd/attachment.png>


More information about the x3d-public mailing list