x_ite
Version:
X_ITE X3D Browser, view and manipulate X3D, VRML, glTF and other 3D sources in HTML.
1,378 lines (1,127 loc) • 3.44 MB
JavaScript
/* X_ITE v12.0.4 */
var __webpack_modules__ = ({
/***/ 121:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _Fields_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2152);
/* harmony import */ var _Base_X3DBaseNode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1552);
/* harmony import */ var _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8021);
/* harmony import */ var _Base_X3DField_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(988);
/* harmony import */ var _Fields_SFNodeCache_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4060);
/* harmony import */ var _Namespace_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(8282);
const _metaDataCallbacks = Symbol ();
function X3DNode (executionContext)
{
_Base_X3DBaseNode_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A .call (this, executionContext);
this .addType (_Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .X3DNode);
}
Object .assign (Object .setPrototypeOf (X3DNode .prototype, _Base_X3DBaseNode_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A .prototype),
{
getComponentInfo ()
{
return this .constructor .componentInfo;
},
getContainerField ()
{
return this .constructor .containerField;
},
getSpecificationRange ()
{
return this .constructor .specificationRange;
},
create (executionContext = this .getExecutionContext ())
{
return new (this .constructor) (executionContext);
},
copy (instance)
{
if (instance ?.getType () .includes (_Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .X3DExecutionContext) ?? true)
{
const copy = this .create (instance);
for (const field of this .getPredefinedFields ())
copy .getPredefinedFields () .get (field .getName ()) .assign (field);
if (this .canUserDefinedFields ())
{
for (const field of this .getUserDefinedFields ())
copy .addUserDefinedField (field .getAccessType (), field .getName (), field .copy ());
}
return copy;
}
else
{
const executionContext = instance .getBody ();
// First try to get a named node with the node's name.
if (this .getName () .length)
{
const namedNode = executionContext .getNamedNodes () .get (this .getName ());
if (namedNode)
return namedNode .getValue ();
}
// Create copy.
const copy = this .create (executionContext);
// Support editing of protos.
if (this .getNeedsName ())
this .getExecutionContext () .updateNamedNode (this .getExecutionContext () .getUniqueName (), this);
if (this .getName () .length)
executionContext .updateNamedNode (this .getName (), copy);
// Default fields
for (const sourceField of this .getPredefinedFields ())
{
try
{
const destinationField = copy .getPredefinedField (sourceField .getName ());
let initializableReferences = false;
for (const originalReference of sourceField .getReferences ())
initializableReferences ||= originalReference .isInitializable ();
if (sourceField .isInitializable () && !initializableReferences)
{
switch (sourceField .getType ())
{
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFNode:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFNode:
destinationField .assign (sourceField .copy (instance));
break;
default:
destinationField .assign (sourceField);
break;
}
}
if (sourceField .getReferences () .size)
{
// IS relationship
for (const originalReference of sourceField .getReferences ())
{
try
{
destinationField .addReference (instance .getField (originalReference .getName ()));
}
catch (error)
{
console .error (error);
}
}
}
destinationField .setModificationTime (sourceField .getModificationTime ());
}
catch (error)
{
console .error (error);
}
}
// User-defined fields
for (const sourceField of this .getUserDefinedFields ())
{
let initializableReferences = false;
for (const originalReference of sourceField .getReferences ())
initializableReferences ||= originalReference .isInitializable ();
const destinationField = initializableReferences
? sourceField .create ()
: sourceField .copy (instance);
copy .addUserDefinedField (sourceField .getAccessType (),
sourceField .getName (),
destinationField);
if (sourceField .getReferences () .size)
{
// IS relationship
for (const originalReference of sourceField .getReferences ())
{
try
{
destinationField .addReference (instance .getField (originalReference .getName ()));
}
catch (error)
{
console .error (`No reference '${originalReference .getName ()}' inside execution context ${instance .getTypeName ()} '${instance .getName ()}'.`);
}
}
}
destinationField .setModificationTime (sourceField .getModificationTime ());
}
return copy;
}
},
getDisplayName ()
{
return this .getName () .replace (/_\d+$/, "");
},
getNeedsName ()
{
if (this .getName () .length)
return false;
if (this .getCloneCount () > 1)
return true;
if (this .hasRoutes ())
return true;
const executionContext = this .getExecutionContext ()
for (const importedNode of executionContext .getImportedNodes ())
{
if (importedNode .getInlineNode () === this)
return true;
}
if (executionContext .isScene)
{
for (const exportedNode of executionContext .getExportedNodes ())
{
if (exportedNode .getLocalNode () === this)
return true;
}
}
return false;
},
hasRoutes ()
{
/// Returns true if there are any routes from or to fields of this node, otherwise false.
for (const field of this .getPredefinedFields ())
{
if (field .getInputRoutes () .size || field .getOutputRoutes () .size)
return true;
}
for (const field of this .getUserDefinedFields ())
{
if (field .getInputRoutes () .size || field .getOutputRoutes () .size)
return true;
}
for (const route of this .getExecutionContext () .getRoutes ())
{
if (route .getSourceNode () === this || route .getDestinationNode () === this)
return true;
}
return false;
},
getCloneCount ()
{
return _Base_X3DBaseNode_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A .prototype .collectCloneCount .call (this);
},
collectCloneCount ()
{
return 1;
},
getSourceText ()
{
return null;
},
traverse ()
{ },
hasMetaData (path)
{
const names = path .split ("/");
if (names .length < 2)
return false;
const
last = names .pop (),
metadataSet = this .getMetadataSet (names),
metadataObject = metadataSet ?.getValue () .getMetaValue (last);
return !!metadataObject;
},
getMetaData (path, field)
{
const names = path .split ("/");
if (names .length < 2)
return;
const
last = names .pop (),
metadataSet = this .getMetadataSet (names),
metadataObject = metadataSet ?.getValue () .getMetaValue (last);
if (field instanceof _Base_X3DField_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A)
{
if (!metadataObject)
return field;
switch (field .getType ())
{
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFBool:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFDouble:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFFloat:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFInt32:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFString:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFTime:
{
field .setValue (metadataObject .value [0]);
break;
}
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFColor:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFColorRGBA:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix4d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix4f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFRotation:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec2d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec2f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec4d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec4f:
{
const value = metadataObject .value;
let i = 0;
for (const key in field)
field [key] = value [i ++];
break;
}
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFImage:
{
const
value = metadataObject .value,
array = field .array;
field .width = value [0];
field .height = value [1];
field .comp = value [2];
const l = array .length;
for (let i = 0; i < l; ++ i)
array [i] = value [3 + i];
break;
}
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFNode:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFNode:
{
throw new Error ("SFNode and MFNode are not supported as metadata value.");
}
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFBool:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFDouble:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFFloat:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFInt32:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFString:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFTime:
{
field .length = 0;
for (const v of metadataObject .value)
field .push (v);
break;
}
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFColor:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFColorRGBA:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix4d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix4f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFRotation:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec2d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec2f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec4d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec4f:
{
const
value = metadataObject .value,
length = value .length;
field .length = 0;
for (let i = 0; i < length;)
{
const
l = field .length ++,
f = field [l];
for (const key in f)
f [key] = value [i ++];
}
break;
}
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFImage:
{
const
value = metadataObject .value,
length = value .length;
field .length = 0;
for (let i = 0; i < length;)
{
const
l = field .length ++,
f = field [l],
a = f .array;
f .width = value [i ++];
f .height = value [i ++];
f .comp = value [i ++];
const p = a .length;
for (let k = 0; k < p; ++ k)
a [k] = value [i ++];
}
break;
}
}
return field;
}
else if (field)
{
// Support for Numbers (Vector234, Color34, ...).
if (!metadataObject)
return field;
const value = metadataObject .value;
let i = 0;
for (const key in field)
field [key] = value [i ++];
return field;
}
return metadataObject ? Array .from (metadataObject .value) : [ ];
},
setMetaData (path, value)
{
const names = path .split ("/");
if (names .length < 2)
return;
const
last = names .pop (),
metadataSet = this .getMetadataSet (names, true);
if (value instanceof _Base_X3DField_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A)
{
const field = value;
switch (value .getType ())
{
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFBool:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFDouble:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFFloat:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFInt32:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFString:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFTime:
{
value = [field .valueOf ()];
break;
}
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFNode:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFNode:
throw new Error ("SFNode and MFNode are not supported as metadata value.");
default:
{
value = Array .from (field, f => f instanceof _Base_X3DField_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A ? Array .from (f) : f) .flat ();
break;
}
}
switch (field .getType ())
{
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFBool:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFBool:
value .type = "boolean";
break;
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFDouble:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix4d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFRotation:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFTime:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec2d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec4d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFDouble:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix4d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFRotation:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFTime:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec2d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec3d:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec4d:
value .type = "double";
break;
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFColor:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFColorRGBA:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFFloat:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFMatrix4f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec2f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFVec4f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFColor:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFColorRGBA:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFFloat:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFMatrix4f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec2f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec3f:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFVec4f:
value .type = "float";
break;
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFInt32:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFImage:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFInt32:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFImage:
value .type = "integer";
break;
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFString:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFString:
value .type = "string";
break;
}
}
else if (!Array .isArray (value) && value .valueOf () instanceof Object)
{
// Support for Numbers (Vector234, Color34, ...).
value = Array .from (value);
value .type = "double";
}
metadataSet .getValue () .setMetaValue (last, value);
this .processMetaDataCallback (path);
},
removeMetaData (path)
{
const names = path .split ("/");
if (names .length < 2)
return;
function removeMetaData (metadataSet, names)
{
if (!metadataSet)
return false;
const name = names .shift ();
if (!names .length || removeMetaData (metadataSet .getValue () .getMetadataObject ("MetadataSet", name), names))
{
metadataSet .getValue () .removeMetaValue (name);
}
return !metadataSet .value .length;
}
if (removeMetaData (this .getMetadataSet ([names .shift ()]), names))
this ._metadata = null;
},
getMetadataSet (names, create = false)
{
const name = names .shift ();
let metadataSet = this ._metadata .valueOf ();
if (metadataSet ?.getNodeTypeName () !== "MetadataSet" || metadataSet ?.name !== name)
{
if (!create)
return null;
this ._metadata = this .getExecutionContext () .createNode ("MetadataSet");
metadataSet = this ._metadata .valueOf ();
metadataSet .reference = this .getBrowser () .getBrowserOption ("MetadataReference");
metadataSet .name = name;
}
for (const name of names)
metadataSet = metadataSet .getValue () .getMetadataObject ("MetadataSet", name, create);
return metadataSet;
},
[_metaDataCallbacks]: new Map (),
addMetaDataCallback (key, path, callback)
{
if (!this .hasOwnProperty (_metaDataCallbacks))
this [_metaDataCallbacks] = new Map ();
let map = this [_metaDataCallbacks] .get (path);
if (!map)
this [_metaDataCallbacks] .set (path, map = new Map ());
map .set (key, callback);
},
removeMetaDataCallback (key, path)
{
const map = this [_metaDataCallbacks] .get (path);
if (!map)
return;
map .delete (key);
if (map .size === 0)
this [_metaDataCallbacks] .delete (path);
},
processMetaDataCallback (path)
{
const map = this [_metaDataCallbacks] .get (path);
if (!map)
return;
for (const callback of map .values ())
callback ();
},
toStream (generator)
{
generator .string += this .getTypeName () + " { }";
},
toVRMLStream (generator)
{
generator .EnterScope ();
if (!generator .string .match (/^$|[ \t\r\n,\[\]\{\}]$/))
generator .string += generator .Space ();
if (generator .outputNames)
{
const name = generator .Name (this);
if (name .length)
{
if (generator .ExistsNode (this))
{
generator .string += "USE";
generator .string += generator .Space ();
generator .string += name;
generator .LeaveScope ();
return;
}
}
if (name .length)
{
generator .AddNode (this);
generator .string += "DEF";
generator .string += generator .Space ();
generator .string += name;
generator .string += generator .Space ();
}
}
generator .string += this .getTypeName ();
generator .string += generator .TidySpace ();
generator .string += "{";
const
fields = this .getChangedFields (),
userDefinedFields = this .getUserDefinedFields ();
if (this .canUserDefinedFields ())
{
if (userDefinedFields .length)
{
let
fieldTypeLength = 0,
accessTypeLength = 0;
for (const field of userDefinedFields)
{
fieldTypeLength = Math .max (fieldTypeLength, field .getTypeName () .length);
accessTypeLength = Math .max (accessTypeLength, generator .AccessType (field .getAccessType ()) .length);
}
generator .string += generator .TidyBreak ();
generator .IncIndent ();
const last = userDefinedFields .at (-1);
for (const field of userDefinedFields)
{
this .toVRMLStreamUserDefinedField (generator, field, fieldTypeLength, accessTypeLength);
if (field === last)
generator .string += generator .TidyBreak ();
else
generator .string += generator .Break ();
}
generator .DecIndent ();
if (fields .length !== 0)
generator .string += generator .TidyBreak ();
}
}
if (fields .length === 0)
{
if (userDefinedFields .length)
generator .string += generator .Indent ();
else
generator .string += generator .TidySpace ();
}
else
{
const last = fields .at (-1);
if (userDefinedFields .length === 0)
generator .string += generator .TidyBreak ();
generator .IncIndent ();
for (const field of fields)
{
this .toVRMLStreamField (generator, field);
if (field === last)
generator .string += generator .TidyBreak ();
else
generator .string += generator .Break ();
}
generator .DecIndent ();
generator .string += generator .Indent ();
}
generator .string += "}";
generator .LeaveScope ();
},
toVRMLStreamUserDefinedField (generator, field, fieldTypeLength, accessTypeLength)
{
const sharedNode = generator .IsSharedNode (this);
if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode)
{
generator .string += generator .Indent ();
generator .string += generator .AccessType (field .getAccessType ()) .padEnd (accessTypeLength, generator .TidySpace ());
generator .string += generator .Space ();
generator .string += field .getTypeName () .padEnd (fieldTypeLength, generator .TidySpace ());
generator .string += generator .Space ();
generator .string += field .getName ();
if (field .isInitializable ())
{
generator .string += generator .Space ();
field .toVRMLStream (generator);
}
}
else
{
let
index = 0,
initializableReferences = false;
for (const reference of field .getReferences ())
{
initializableReferences ||= reference .isInitializable ();
// Output user defined reference field
generator .string += generator .Indent ();
generator .string += generator .AccessType (field .getAccessType ()) .padEnd (accessTypeLength, generator .TidySpace ());
generator .string += generator .Space ();
generator .string += field .getTypeName () .padEnd (fieldTypeLength, generator .TidySpace ());
generator .string += generator .Space ();
generator .string += field .getName ();
generator .string += generator .Space ();
generator .string += "IS";
generator .string += generator .Space ();
generator .string += reference .getName ();
++ index;
if (index !== field .getReferences () .size)
generator .string += generator .Break ();
}
if (field .getAccessType () === _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .inputOutput && !initializableReferences && !field .isDefaultValue ())
{
generator .string += generator .Break ();
generator .string += generator .Indent ();
generator .string += generator .AccessType (field .getAccessType ()) .padEnd (accessTypeLength, generator .TidySpace ());
generator .string += generator .Space ();
generator .string += field .getTypeName () .padEnd (fieldTypeLength, generator .TidySpace ());
generator .string += generator .Space ();
generator .string += field .getName ();
if (field .isInitializable ())
{
generator .string += generator .Space ();
field .toVRMLStream (generator);
}
}
}
},
toVRMLStreamField (generator, field)
{
const sharedNode = generator .IsSharedNode (this);
if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode)
{
if (field .isInitializable ())
{
generator .string += generator .Indent ();
generator .string += field .getName ();
generator .string += generator .Space ();
field .toVRMLStream (generator);
}
}
else
{
let
index = 0,
initializableReferences = false;
for (const reference of field .getReferences ())
{
initializableReferences ||= reference .isInitializable ();
// Output build in reference field
generator .string += generator .Indent ();
generator .string += field .getName ();
generator .string += generator .Space ();
generator .string += "IS";
generator .string += generator .Space ();
generator .string += reference .getName ();
++ index;
if (index !== field .getReferences () .size)
generator .string += generator .Break ();
}
if (field .getAccessType () === _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .inputOutput && !initializableReferences && !this .isDefaultValue (field))
{
// Output build in field
generator .string += generator .Break ();
generator .string += generator .Indent ();
generator .string += field .getName ();
generator .string += generator .Space ();
field .toVRMLStream (generator);
}
}
},
toXMLStream (generator)
{
const sharedNode = generator .IsSharedNode (this);
generator .EnterScope ();
const name = generator .Name (this);
if (name .length)
{
if (generator .ExistsNode (this))
{
generator .string += generator .Indent ();
generator .string += "<";
generator .string += this .getTypeName ();
if (generator .html && this .getTypeName () === "Script")
{
generator .string += generator .Space ();
generator .string += "type='model/x3d+xml'";
}
generator .string += generator .Space ();
generator .string += "USE='";
generator .string += generator .XMLEncode (name);
generator .string += "'";
const containerField = generator .ContainerField ();
if (containerField)
{
if (containerField .getName () !== this .getContainerField ())
{
generator .string += generator .Space ();
generator .string += "containerField='";
generator .string += generator .XMLEncode (containerField .getName ());
generator .string += "'";
}
}
if (generator .closingTags)
{
generator .string += "></";
generator .string += this .getTypeName ();
generator .string += ">";
}
else
{
generator .string += "/>";
}
generator .LeaveScope ();
return;
}
}
generator .string += generator .Indent ();
generator .string += "<";
generator .string += this .getTypeName ();
if (generator .html && this .getTypeName () === "Script")
{
generator .string += generator .Space ();
generator .string += "type='model/x3d+xml'";
}
if (name .length)
{
generator .AddNode (this);
generator .string += generator .Space ();
generator .string += "DEF='";
generator .string += generator .XMLEncode (name);
generator .string += "'";
}
const containerField = generator .ContainerField ();
if (containerField)
{
if (containerField .getName () !== this .getContainerField ())
{
generator .string += generator .Space ();
generator .string += "containerField='";
generator .string += generator .XMLEncode (containerField .getName ());
generator .string += "'";
}
}
const
fields = this .getChangedFields (),
userDefinedFields = this .getUserDefinedFields ();
const
references = [ ],
childNodes = [ ];
let cdata = this .getSourceText ();
if (cdata ?.length === 0 || (generator .html && this .getTypeName () !== "Script"))
cdata = null;
generator .IncIndent ();
generator .IncIndent ();
for (const field of fields)
{
// If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
// for this field.
let mustOutputValue = false;
if (generator .ExecutionContext ())
{
if (field .getAccessType () === _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .inputOutput && field .getReferences () .size !== 0)
{
if (!Array .from (field .getReferences ()) .some (reference => reference .isInitializable ()))
mustOutputValue = !this .isDefaultValue (field);
}
}
// If we have no execution context we are not in a proto and must not generate IS references the same is true
// if the node is a shared node as the node does not belong to the execution context.
if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode || mustOutputValue)
{
if (mustOutputValue)
references .push (field);
if (field .isInitializable ())
{
switch (field .getType ())
{
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFNode:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFNode:
{
childNodes .push (field);
break;
}
default:
{
if (field === cdata)
break;
generator .string += generator .AttribBreak ();
generator .string += generator .ListIndent ();
generator .string += field .getName ();
generator .string += "='";
field .toXMLStream (generator, field === this .getSourceText ());
generator .string += "'";
break;
}
}
}
}
else
{
references .push (field);
}
}
generator .DecIndent ();
generator .DecIndent ();
if ((!this .canUserDefinedFields () || !userDefinedFields .length) && (!references .length || sharedNode) && !childNodes .length && !cdata)
{
if (generator .closingTags)
{
generator .string += "></";
generator .string += this .getTypeName ();
generator .string += ">";
}
else
{
generator .string += "/>";
}
}
else
{
generator .string += ">";
generator .string += generator .TidyBreak ();
generator .IncIndent ();
if (this .canUserDefinedFields ())
{
for (const field of userDefinedFields)
{
generator .string += generator .Indent ();
generator .string += "<field";
generator .string += generator .Space ();
generator .string += "accessType='";
generator .string += generator .AccessType (field .getAccessType ());
generator .string += "'";
generator .string += generator .Space ();
generator .string += "type='";
generator .string += field .getTypeName ();
generator .string += "'";
generator .string += generator .Space ();
generator .string += "name='";
generator .string += generator .XMLEncode (field .getName ());
generator .string += "'";
// If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
// for this field.
let mustOutputValue = false;
if (generator .ExecutionContext ())
{
if (field .getAccessType () === _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .inputOutput && field .getReferences () .size !== 0)
{
if (!Array .from (field .getReferences ()) .some (reference => reference .isInitializable ()))
mustOutputValue = true;
}
}
if ((field .getReferences () .size === 0 || !generator .ExecutionContext ()) || sharedNode || mustOutputValue)
{
if (mustOutputValue && generator .ExecutionContext ())
references .push (field);
if (!field .isInitializable () || field .isDefaultValue ())
{
generator .XMLAppInfo (field);
generator .XMLDocumentation (field);
generator .string += generator .closingTags ? "></field>" : "/>";
generator .string += generator .TidyBreak ();
}
else
{
// Output value
switch (field .getType ())
{
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFNode:
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .MFNode:
{
generator .XMLAppInfo (field);
generator .XMLDocumentation (field);
generator .PushContainerField (null);
generator .string += ">";
generator .string += generator .TidyBreak ();
generator .IncIndent ();
field .toXMLStream (generator);
generator .string += generator .TidyBreak ();
generator .DecIndent ();
generator .string += generator .Indent ();
generator .string += "</field>";
generator .string += generator .TidyBreak ();
generator .PopContainerField ();
break;
}
default:
{
generator .string += generator .Space ();
generator .string += "value='";
field .toXMLStream (generator);
generator .string += "'";
generator .XMLAppInfo (field);
generator .XMLDocumentation (field);
generator .string += generator .closingTags ? "></field>" : "/>";
generator .string += generator .TidyBreak ();
break;
}
}
}
}
else
{
if (generator .ExecutionContext ())
references .push (field);
generator .XMLAppInfo (field);
generator .XMLDocumentation (field);
generator .string += generator .closingTags ? "></field>" : "/>";
generator .string += generator .TidyBreak ();
}
}
}
if (references .length && !sharedNode)
{
generator .string += generator .Indent ();
generator .string += "<IS>";
generator .string += generator .TidyBreak ();
generator .IncIndent ();
for (const field of references)
{
const protoFields = field .getReferences ();
for (const protoField of protoFields)
{
generator .string += generator .Indent ();
generator .string += "<connect";
generator .string += generator .Space ();
generator .string += "nodeField='";
generator .string += generator .XMLEncode (field .getName ());
generator .string += "'";
generator .string += generator .Space ();
generator .string += "protoField='";
generator .string += generator .XMLEncode (protoField .getName ());
generator .string += "'";
generator .string += generator .closingTags ? "></connect>" : "/>";
generator .string += generator .TidyBreak ();
}
}
generator .DecIndent ();
generator .string += generator .Indent ();
generator .string += "</IS>";
generator .string += generator .TidyBreak ();
}
for (const field of childNodes)
{
generator .PushContainerField (field);
field .toXMLStream (generator);
generator .string += generator .TidyBreak ();
generator .PopContainerField ();
}
if (cdata)
{
for (const value of cdata)
{
generator .string += "<![CDATA[";
generator .string += value;
generator .string += "]]>";
generator .string += generator .TidyBreak ();
}
}
generator .DecIndent ();
generator .string += generator .Indent ();
generator .string += "</";
generator .string += this .getTypeName ();
generator .string += ">";
}
generator .LeaveScope ();
},
toJSONStream (generator)
{
const sharedNode = generator .IsSharedNode (this);
generator .EnterScope ();
const name = generator .Name (this);
// USE name
if (name .length)
{
if (generator .ExistsNode (this))
{
generator .string += '{';
generator .string += generator .TidySpace ();
generator .string += '"';
generator .string += this .getTypeName ();
generator .string += '"';
generator .string += ':';
generator .string += generator .TidyBreak ();
generator .string += generator .IncIndent ();
generator .string += generator .Indent ();
generator .string += '{';
generator .string += generator .TidyBreak ();
generator .string += generator .IncIndent ();
generator .string += generator .Indent ();
generator .string += '"';
generator .string += "@USE";
generator .string += '"';
generator .string += ':';
generator .string += generator .TidySpace ();
generator .string += '"';
generator .string += generator .JSONEncode (name);
generator .string += '"';
generator .string += generator .TidyBreak ();
generator .string += generator .DecIndent ();
generator .string += generator .Indent ();
generator .string += '}';
generator .string += generator .TidyBreak ();
generator .string += generator .DecIndent ();
generator .string += generator .Indent ();
generator .string += '}';
generator .LeaveScope ();
return;
}
}
// Type name
generator .string += '{';
generator .string += generator .TidySpace ();
generator .string += '"';
generator .string += this .getTypeName ();
generator .string += '"';
generator .string += ':';
generator .string += generator .TidyBreak ();
generator .string += generator .IncIndent ();
generator .string += generator .Indent ();
generator .string += '{';
generator .string += generator .TidyBreak ();
generator .string += generator .IncIndent ();
// DEF name
if (name .length)
{
generator .AddNode (this);
generator .string += generator .Indent ();
generator .string += '"';
generator .string += "@DEF";
generator .string += '"';
generator .string += ':';
generator .string += generator .TidySpace ();
generator .string += '"';
generator .string += generator .JSONEncode (name);
generator .string += '"';
generator .string += ',';
generator .string += generator .TidyBreak ();
}
// Fields
const
fields = this .getChangedFields (),
userDefinedFields = this .getUserDefinedFields ();
const references = [ ];
let sourceText = this .getSourceText ();
// Source text
if (sourceText)
{
if (sourceText .length !== 1)
sourceText = null;
}
// Predefined fields
if (fields .length)
{
const outputFields = [ ];
for (const field of fields)
{
// If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
// for this field.
let mustOutputValue = false;
if (generator .ExecutionContext ())
{
if (field .getAccessType () === _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .inputOutput && field .getReferences () .size !== 0)
{
if (!Array .from (field .getReferences ()) .some (reference => reference .isInitializable ()))
mustOutputValue = !this .isDefaultValue (field);
}
}
// If we have no execution context we are not in a proto and must not generate IS references the same is true
// if the node is a shared node as the node does not belong to the execution context.
if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode || mustOutputValue)
{
if (mustOutputValue)
references .push (field);
if (field !== sourceText)
outputFields .push (field);
}
else
{
references .push (field);
}
}
for (const field of outputFields)
{
if (field .isInitializable ())
{
switch (field .getType ())
{
case _Base_X3DConstants_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A .SFNode: