From 4abb2c991eb44c182cabac21cf6d2e8e9d0aa986 Mon Sep 17 00:00:00 2001 From: Levi Pesin <35454228+LeviPesin@users.noreply.github.com> Date: Fri, 17 Feb 2023 19:35:57 +1030 Subject: [PATCH 01/15] Ray: Clean up --- src/math/Ray.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/math/Ray.js b/src/math/Ray.js index 4544c904ca6862..ac677ef5e3b4a1 100644 --- a/src/math/Ray.js +++ b/src/math/Ray.js @@ -228,14 +228,14 @@ class Ray { const thc = Math.sqrt( radius2 - d2 ); - // t0 = first intersect point - entrance on front of sphere - const t0 = tca - thc; - // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; // test to see if both t0 and t1 are behind the ray - if so, return null - if ( t0 < 0 && t1 < 0 ) return null; + if ( t1 < 0 ) return null; + + // t0 = first intersect point - entrance on front of sphere + const t0 = tca - thc; // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, From ca1401575a2047e82aa01f020d4cab83f3f013e5 Mon Sep 17 00:00:00 2001 From: Levi Pesin <35454228+LeviPesin@users.noreply.github.com> Date: Fri, 17 Feb 2023 19:53:49 +1030 Subject: [PATCH 02/15] Don't move t0 --- src/math/Ray.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/math/Ray.js b/src/math/Ray.js index ac677ef5e3b4a1..9e0de9a00effd0 100644 --- a/src/math/Ray.js +++ b/src/math/Ray.js @@ -228,15 +228,15 @@ class Ray { const thc = Math.sqrt( radius2 - d2 ); + // t0 = first intersect point - entrance on front of sphere + const t0 = tca - thc; + // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; // test to see if both t0 and t1 are behind the ray - if so, return null if ( t1 < 0 ) return null; - // t0 = first intersect point - entrance on front of sphere - const t0 = tca - thc; - // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, // in order to always return an intersect point that is in front of the ray. From c70a5673a373d72ce3625c59b6d1e256f99b5cc3 Mon Sep 17 00:00:00 2001 From: mrdoob Date: Wed, 22 Feb 2023 14:34:32 +0900 Subject: [PATCH 03/15] Update Ray.js --- src/math/Ray.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/math/Ray.js b/src/math/Ray.js index 9e0de9a00effd0..ad27113057fc62 100644 --- a/src/math/Ray.js +++ b/src/math/Ray.js @@ -234,7 +234,7 @@ class Ray { // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; - // test to see if both t0 and t1 are behind the ray - if so, return null + // test to see if t1 is behind the ray - if so, return null if ( t1 < 0 ) return null; // test to see if t0 is behind the ray: From 5724f7d16cf933729bb2c576d48debb0d8db02c2 Mon Sep 17 00:00:00 2001 From: Levi Pesin <35454228+LeviPesin@users.noreply.github.com> Date: Tue, 28 Feb 2023 14:49:02 +1030 Subject: [PATCH 04/15] Update NodeUtils.js --- examples/jsm/nodes/core/NodeUtils.js | 70 +++++++++++++++------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/examples/jsm/nodes/core/NodeUtils.js b/examples/jsm/nodes/core/NodeUtils.js index 528844190b55ef..03a330b38a21dc 100644 --- a/examples/jsm/nodes/core/NodeUtils.js +++ b/examples/jsm/nodes/core/NodeUtils.js @@ -1,72 +1,76 @@ import { Color, Matrix3, Matrix4, Vector2, Vector3, Vector4 } from 'three'; -export const getCacheKey = ( object ) => { +export function getCacheKey( object ) { let cacheKey = '{'; if ( object.isNode === true ) { - cacheKey += `uuid:"${ object.uuid }",`; + cacheKey += `uuid:"${ object.uuid }"`; } - for ( const property of getNodesKeys( object ) ) { - - const node = object[ property ]; + for ( const { prop, childNode } of getNodeChildren( object ) ) { // @TODO: Think about implement NodeArray and NodeObject. - if ( Array.isArray( node ) ) { + let childCacheKey = getCacheKey( childNode ); + if ( ! childCacheKey.includes( ',' ) ) childCacheKey = childCacheKey.slice( childCacheKey.indexOf( '"' ), childCacheKey.indexOf( '}' ) ); + cacheKey += `,${ prop }:${ childCacheKey }`; - for ( const subNode of node ) { + } - cacheKey += `${ property }:${ subNode.getCacheKey() },`; + cacheKey += '}'; - } + return cacheKey; - } else { +} - cacheKey += `${ property }:${ node.getCacheKey() },`; +export function* getNodeChildren( node ) { - } + for ( const property in node ) { - } + const object = node[ property ]; - cacheKey += '}'; + if ( Array.isArray( object ) === true ) { - return cacheKey; + for ( let i = 0; i < object.length; i++ ) { + + const child = object[ i ]; -}; + if ( child && child.isNode === true ) { -export const getNodesKeys = ( object ) => { + yield { prop: property + '/' + i, childNode: child }; - const props = []; + } - for ( const name in object ) { + } - const value = object[ name ]; + } else if ( object && object.isNode === true ) { - if ( Array.isArray( value ) ) { + yield { prop: property, childNode: object }; - if ( value[ 0 ] && value[ 0 ].isNode === true ) { + } else if ( typeof object === 'object' ) { - props.push( name ); + for ( const property2 in object ) { - } + const child = object[ property2 ]; - } else if ( value && value.isNode === true ) { + if ( child && child.isNode === true ) { - props.push( name ); + yield { prop: property + '/' + property2, childNode: child }; + + } + + } } } - return props; - -}; +} -export const getValueType = ( value ) => { +export function getValueType( value ) { if ( typeof value === 'number' ) { @@ -104,9 +108,9 @@ export const getValueType = ( value ) => { return null; -}; +} -export const getValueFromType = ( type, ...params ) => { +export function getValueFromType( type, ...params ) { const last4 = type ? type.slice( - 4 ) : undefined; @@ -146,4 +150,4 @@ export const getValueFromType = ( type, ...params ) => { return null; -}; +} From 72a3a744e8ca458cebd1ce3715b800ce4a9f8bc5 Mon Sep 17 00:00:00 2001 From: Levi Pesin <35454228+LeviPesin@users.noreply.github.com> Date: Tue, 28 Feb 2023 14:54:33 +1030 Subject: [PATCH 05/15] Update NodeMaterial.js --- examples/jsm/nodes/materials/NodeMaterial.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/jsm/nodes/materials/NodeMaterial.js b/examples/jsm/nodes/materials/NodeMaterial.js index 860f143deb0fa2..9032b69d8ea680 100644 --- a/examples/jsm/nodes/materials/NodeMaterial.js +++ b/examples/jsm/nodes/materials/NodeMaterial.js @@ -1,5 +1,5 @@ import { Material, ShaderMaterial, NoToneMapping } from 'three'; -import { getNodesKeys, getCacheKey } from '../core/NodeUtils.js'; +import { getNodeChildren, getCacheKey } from '../core/NodeUtils.js'; import { attribute } from '../core/AttributeNode.js'; import { diffuseColor } from '../core/PropertyNode.js'; import { materialNormal } from '../accessors/ExtendedMaterialNode.js'; @@ -322,13 +322,13 @@ class NodeMaterial extends ShaderMaterial { } const data = Material.prototype.toJSON.call( this, meta ); - const nodeKeys = getNodesKeys( this ); + const nodeChildren = getNodeChildren( this ); data.inputNodes = {}; - for ( const name of nodeKeys ) { + for ( const { prop, childNode } of nodeChildren ) { - data.inputNodes[ name ] = this[ name ].toJSON( meta ).uuid; + data.inputNodes[ prop ] = childNode.toJSON( meta ).uuid; } From 8ddc95c5cf6a2111980517e4a9a5d3d2211b589f Mon Sep 17 00:00:00 2001 From: Levi Pesin <35454228+LeviPesin@users.noreply.github.com> Date: Tue, 28 Feb 2023 15:02:49 +1030 Subject: [PATCH 06/15] Update Node.js --- examples/jsm/nodes/core/Node.js | 41 ++++++++------------------------- 1 file changed, 9 insertions(+), 32 deletions(-) diff --git a/examples/jsm/nodes/core/Node.js b/examples/jsm/nodes/core/Node.js index a32d67f0da8634..f9162cb9060c9c 100644 --- a/examples/jsm/nodes/core/Node.js +++ b/examples/jsm/nodes/core/Node.js @@ -1,5 +1,5 @@ import { NodeUpdateType } from './constants.js'; -import { getNodesKeys, getCacheKey } from './NodeUtils.js'; +import { getNodeChildren, getCacheKey } from './NodeUtils.js'; import { MathUtils } from 'three'; const NodeClasses = new Map(); @@ -36,42 +36,19 @@ class Node { * getChildren() { - for ( const property in this ) { + const self = this; - const object = this[ property ]; + for ( const { prop, childNode } of getNodeChildren( this ) ) { - if ( Array.isArray( object ) === true ) { + if ( prop.includes( '/' ) ) { - for ( let i = 0; i < object.length; i++ ) { + const prop1 = prop.slice( 0, prop.indexOf( '/' ) ); + const prop2 = prop.slice( prop.indexOf( '/' ) + 1 ); + yield { childNode, replaceNode( node ) { self[ prop1 ][ prop2 ] = node; } }; - const child = object[ i ]; - - if ( child && child.isNode === true ) { - - yield { childNode: child, replaceNode( node ) { object[ i ] = node; } }; - - } - - } - - } else if ( object && object.isNode === true ) { - - const self = this; - yield { childNode: object, replaceNode( node ) { self[ property ] = node; } }; - - } else if ( typeof object === 'object' ) { - - for ( const property in object ) { - - const child = object[ property ]; - - if ( child && child.isNode === true ) { - - yield { childNode: child, replaceNode( node ) { object[ property ] = node; } }; - - } + } else { - } + yield { childNode, replaceNode( node ) { self[ prop ] = node; } }; } From 08e1c556df94f60313784e40ab8d0f2aae0512aa Mon Sep 17 00:00:00 2001 From: sunag Date: Tue, 28 Feb 2023 21:37:20 -0300 Subject: [PATCH 07/15] Revert "Merge branch 'patch-2' of https://github.com/LeviPesin/three.js-1 into pr/25581" This reverts commit bcf3af839dad20b1484fd9582cbf37fed8b9db47, reversing changes made to c70a5673a373d72ce3625c59b6d1e256f99b5cc3. --- build/three.cjs | 805 +- build/three.js | 805 +- build/three.min.js | 2 +- build/three.module.js | 805 +- docs/api/en/math/Color.html | 7 - docs/api/it/math/Color.html | 7 - docs/api/zh/math/Color.html | 7 - editor/css/main.css | 4 +- editor/js/Config.js | 2 +- editor/js/Editor.js | 12 +- editor/js/Sidebar.Project.Renderer.js | 20 +- editor/js/Strings.js | 6 +- editor/js/Viewport.Camera.js | 16 +- editor/js/Viewport.Shading.js | 21 - editor/js/Viewport.js | 36 +- editor/js/libs/app.js | 2 +- editor/sw.js | 1 - examples/jsm/controls/OrbitControls.js | 26 +- examples/jsm/exporters/USDZExporter.js | 12 +- examples/jsm/geometries/ParametricGeometry.js | 10 - examples/jsm/loaders/EXRLoader.js | 14 +- examples/jsm/loaders/IFCLoader.js | 2430 + examples/jsm/loaders/PLYLoader.js | 4 +- examples/jsm/loaders/SVGLoader.js | 2 - examples/jsm/loaders/ifc/web-ifc-api.js | 47504 ++++++++++++++++ examples/jsm/loaders/ifc/web-ifc.wasm | Bin 0 -> 428259 bytes examples/jsm/node-editor/NodeEditor.js | 26 +- examples/jsm/node-editor/NodeEditorUtils.js | 12 - examples/jsm/node-editor/core/BaseNode.js | 34 +- .../materials/BasicMaterialEditor.js | 10 +- .../node-editor/materials/MaterialEditor.js | 17 - .../materials/PointsMaterialEditor.js | 10 +- .../materials/StandardMaterialEditor.js | 10 +- examples/jsm/nodes/Nodes.js | 501 +- examples/jsm/nodes/accessors/BitangentNode.js | 49 +- examples/jsm/nodes/accessors/BufferNode.js | 6 - examples/jsm/nodes/accessors/CameraNode.js | 10 - .../jsm/nodes/accessors/CubeTextureNode.js | 19 +- .../nodes/accessors/ExtendedMaterialNode.js | 18 +- examples/jsm/nodes/accessors/InstanceNode.js | 38 +- examples/jsm/nodes/accessors/MaterialNode.js | 58 +- .../nodes/accessors/MaterialReferenceNode.js | 6 - examples/jsm/nodes/accessors/ModelNode.js | 11 - .../accessors/ModelViewProjectionNode.js | 20 +- examples/jsm/nodes/accessors/NormalNode.js | 38 +- examples/jsm/nodes/accessors/Object3DNode.js | 19 +- examples/jsm/nodes/accessors/PointUVNode.js | 7 +- examples/jsm/nodes/accessors/PositionNode.js | 41 +- examples/jsm/nodes/accessors/ReferenceNode.js | 15 +- .../jsm/nodes/accessors/ReflectVectorNode.js | 13 +- examples/jsm/nodes/accessors/SkinningNode.js | 83 +- .../jsm/nodes/accessors/StorageBufferNode.js | 6 - examples/jsm/nodes/accessors/TangentNode.js | 38 +- examples/jsm/nodes/accessors/TextureNode.js | 13 +- examples/jsm/nodes/accessors/UVNode.js | 6 - examples/jsm/nodes/accessors/UserDataNode.js | 6 - examples/jsm/nodes/core/ArrayUniformNode.js | 3 - examples/jsm/nodes/core/AttributeNode.js | 11 +- examples/jsm/nodes/core/BypassNode.js | 9 +- examples/jsm/nodes/core/CacheNode.js | 9 +- examples/jsm/nodes/core/CodeNode.js | 7 +- examples/jsm/nodes/core/ConstNode.js | 3 - examples/jsm/nodes/core/ContextNode.js | 9 +- examples/jsm/nodes/core/ExpressionNode.js | 17 +- examples/jsm/nodes/core/FunctionCallNode.js | 14 - examples/jsm/nodes/core/FunctionNode.js | 15 +- examples/jsm/nodes/core/InputNode.js | 17 +- examples/jsm/nodes/core/InstanceIndexNode.js | 7 +- examples/jsm/nodes/core/LightingModel.js | 2 - examples/jsm/nodes/core/Node.js | 110 +- examples/jsm/nodes/core/NodeBuilder.js | 18 +- examples/jsm/nodes/core/NodeUtils.js | 64 +- examples/jsm/nodes/core/PropertyNode.js | 13 +- examples/jsm/nodes/core/StackNode.js | 17 +- examples/jsm/nodes/core/TempNode.js | 6 +- examples/jsm/nodes/core/UniformNode.js | 15 - examples/jsm/nodes/core/VarNode.js | 50 +- examples/jsm/nodes/core/VaryingNode.js | 9 +- examples/jsm/nodes/core/constants.js | 5 - examples/jsm/nodes/display/BlendModeNode.js | 26 +- .../jsm/nodes/display/ColorAdjustmentNode.js | 36 +- examples/jsm/nodes/display/ColorSpaceNode.js | 42 +- examples/jsm/nodes/display/FrontFacingNode.js | 8 +- examples/jsm/nodes/display/NormalMapNode.js | 49 +- examples/jsm/nodes/display/PosterizeNode.js | 13 +- examples/jsm/nodes/display/ToneMappingNode.js | 23 +- examples/jsm/nodes/display/ViewportNode.js | 25 +- examples/jsm/nodes/fog/FogExp2Node.js | 14 +- examples/jsm/nodes/fog/FogNode.js | 12 +- examples/jsm/nodes/fog/FogRangeNode.js | 13 +- .../nodes/functions/BSDF/BRDF_BlinnPhong.js | 15 +- examples/jsm/nodes/functions/BSDF/BRDF_GGX.js | 23 +- .../jsm/nodes/functions/BSDF/BRDF_Lambert.js | 4 +- .../jsm/nodes/functions/BSDF/DFGApprox.js | 10 +- examples/jsm/nodes/functions/BSDF/D_GGX.js | 8 +- .../jsm/nodes/functions/BSDF/F_Schlick.js | 4 +- .../functions/BSDF/V_GGX_SmithCorrelated.js | 12 +- .../jsm/nodes/functions/PhongLightingModel.js | 21 +- .../nodes/functions/PhysicalLightingModel.js | 60 +- .../functions/light/getDistanceAttenuation.js | 11 +- .../material/getGeometryRoughness.js | 7 +- .../nodes/functions/material/getRoughness.js | 8 +- examples/jsm/nodes/geometry/RangeNode.js | 15 +- examples/jsm/nodes/gpgpu/ComputeNode.js | 9 +- examples/jsm/nodes/lighting/AONode.js | 8 +- .../jsm/nodes/lighting/AmbientLightNode.js | 11 +- .../jsm/nodes/lighting/AnalyticLightNode.js | 5 +- .../nodes/lighting/DirectionalLightNode.js | 11 +- .../jsm/nodes/lighting/EnvironmentNode.js | 30 +- .../jsm/nodes/lighting/HemisphereLightNode.js | 25 +- .../jsm/nodes/lighting/IESSpotLightNode.js | 14 +- .../jsm/nodes/lighting/LightingContextNode.js | 11 +- examples/jsm/nodes/lighting/LightingNode.js | 4 +- examples/jsm/nodes/lighting/LightsNode.js | 26 +- examples/jsm/nodes/lighting/PointLightNode.js | 13 +- examples/jsm/nodes/lighting/SpotLightNode.js | 14 +- examples/jsm/nodes/loaders/NodeLoader.js | 9 +- .../jsm/nodes/loaders/NodeMaterialLoader.js | 24 +- .../nodes/materials/LineBasicNodeMaterial.js | 5 +- examples/jsm/nodes/materials/Materials.js | 72 +- .../nodes/materials/MeshBasicNodeMaterial.js | 5 +- .../nodes/materials/MeshNormalNodeMaterial.js | 11 +- .../nodes/materials/MeshPhongNodeMaterial.js | 16 +- .../materials/MeshPhysicalNodeMaterial.js | 7 +- .../materials/MeshStandardNodeMaterial.js | 17 +- examples/jsm/nodes/materials/NodeMaterial.js | 125 +- .../jsm/nodes/materials/PointsNodeMaterial.js | 5 +- .../jsm/nodes/materials/SpriteNodeMaterial.js | 39 +- .../jsm/nodes/materialx/MaterialXNodes.js | 53 +- examples/jsm/nodes/materialx/lib/mx_hsv.js | 2 +- examples/jsm/nodes/materialx/lib/mx_noise.js | 3 +- .../nodes/materialx/lib/mx_transform_color.js | 3 +- examples/jsm/nodes/math/CondNode.js | 21 +- examples/jsm/nodes/math/MathNode.js | 140 +- examples/jsm/nodes/math/OperatorNode.js | 46 +- examples/jsm/nodes/procedural/CheckerNode.js | 20 +- examples/jsm/nodes/shadernode/ShaderNode.js | 156 +- .../shadernode/ShaderNodeBaseElements.js | 321 + .../nodes/shadernode/ShaderNodeElements.js | 162 + examples/jsm/nodes/utils/ArrayElementNode.js | 6 +- examples/jsm/nodes/utils/ConvertNode.js | 4 +- examples/jsm/nodes/utils/DiscardNode.js | 12 +- examples/jsm/nodes/utils/EquirectUVNode.js | 14 +- examples/jsm/nodes/utils/JoinNode.js | 5 +- examples/jsm/nodes/utils/MatcapUVNode.js | 15 +- examples/jsm/nodes/utils/MaxMipLevelNode.js | 6 - examples/jsm/nodes/utils/OscNode.js | 23 +- examples/jsm/nodes/utils/PackingNode.js | 15 +- examples/jsm/nodes/utils/RemapNode.js | 18 +- examples/jsm/nodes/utils/RotateUVNode.js | 25 +- .../jsm/nodes/utils/SpecularMIPLevelNode.js | 15 +- examples/jsm/nodes/utils/SplitNode.js | 12 +- examples/jsm/nodes/utils/SpriteSheetUVNode.js | 45 +- examples/jsm/nodes/utils/TimerNode.js | 10 - .../jsm/nodes/utils/TriplanarTexturesNode.js | 31 +- .../renderers/webgl/nodes/WebGLNodeBuilder.js | 32 +- .../jsm/renderers/webgpu/WebGPUBackground.js | 5 - .../renderers/webgpu/WebGPURenderStates.js | 4 +- examples/models/svg/emptyPath.svg | 3 - .../webgl_loader_gltf_iridescence.jpg | Bin 34635 -> 34668 bytes .../webgl_loader_gltf_transmission.jpg | Bin 43848 -> 43673 bytes examples/screenshots/webgl_loader_ifc.jpg | Bin 27015 -> 27411 bytes .../webgl_nodes_loader_gltf_transmission.jpg | Bin 43848 -> 43837 bytes examples/screenshots/webxr_vr_sandbox.jpg | Bin 27066 -> 25548 bytes examples/webgl_loader_ifc.html | 63 +- examples/webgl_loader_svg.html | 1 - examples/webgl_materials_normalmap.html | 4 +- .../webgl_nodes_loader_gltf_iridescence.html | 7 +- examples/webgl_nodes_loader_gltf_sheen.html | 7 +- .../webgl_nodes_loader_gltf_transmission.html | 7 +- examples/webgl_nodes_loader_materialx.html | 2 +- ...ebgl_nodes_materials_instance_uniform.html | 8 +- ...gl_nodes_materials_physical_clearcoat.html | 16 +- examples/webgl_nodes_materials_standard.html | 20 +- examples/webgl_nodes_materialx_noise.html | 6 +- examples/webgl_nodes_playground.html | 10 +- examples/webgl_nodes_points.html | 32 +- examples/webgpu_audio_processing.html | 25 +- examples/webgpu_compute.html | 40 +- examples/webgpu_cubemap_adjustments.html | 20 +- examples/webgpu_cubemap_mix.html | 8 +- examples/webgpu_depth_texture.html | 12 +- examples/webgpu_equirectangular.html | 1 + examples/webgpu_instance_mesh.html | 3 +- examples/webgpu_instance_uniform.html | 8 +- examples/webgpu_lights_custom.html | 20 +- examples/webgpu_lights_phong.html | 20 +- examples/webgpu_lights_selective.html | 24 +- examples/webgpu_loader_gltf.html | 21 +- examples/webgpu_materials.html | 88 +- examples/webgpu_nodes_playground.html | 12 +- examples/webgpu_particles.html | 32 +- examples/webgpu_rtt.html | 14 +- examples/webgpu_sandbox.html | 55 +- examples/webgpu_skinning.html | 6 +- examples/webgpu_skinning_instancing.html | 8 +- examples/webgpu_skinning_points.html | 8 +- examples/webgpu_sprites.html | 10 +- examples/webxr_vr_sandbox.html | 6 +- package-lock.json | 1264 +- package.json | 14 +- src/constants.js | 2 +- src/core/BufferAttribute.js | 141 - src/core/BufferGeometry.js | 4 + src/extras/ImageUtils.js | 2 +- src/extras/PMREMGenerator.js | 4 +- src/extras/curves/LineCurve.js | 10 +- src/extras/curves/LineCurve3.js | 13 - src/geometries/BoxGeometry.js | 10 - src/geometries/CircleGeometry.js | 10 - src/geometries/CylinderGeometry.js | 10 - src/geometries/EdgesGeometry.js | 10 - src/geometries/ExtrudeGeometry.js | 12 +- src/geometries/LatheGeometry.js | 10 - src/geometries/PlaneGeometry.js | 10 - src/geometries/PolyhedronGeometry.js | 10 - src/geometries/RingGeometry.js | 10 - src/geometries/ShapeGeometry.js | 10 - src/geometries/SphereGeometry.js | 14 +- src/geometries/TorusGeometry.js | 10 - src/geometries/TorusKnotGeometry.js | 10 - src/geometries/TubeGeometry.js | 10 - src/geometries/WireframeGeometry.js | 10 - src/helpers/Box3Helper.js | 3 +- src/math/Box2.js | 5 +- src/math/Box3.js | 56 +- src/math/ColorManagement.js | 53 +- src/math/Plane.js | 4 +- src/math/Ray.js | 10 +- src/math/interpolants/CubicInterpolant.js | 3 +- src/renderers/WebGLRenderer.js | 60 +- .../shaders/ShaderChunk/common.glsl.js | 92 + .../shaders/ShaderChunk/packing.glsl.js | 16 +- .../transmission_pars_fragment.glsl.js | 92 - src/renderers/shaders/UniformsUtils.js | 11 +- src/renderers/webgl/WebGLMorphtargets.js | 2 +- src/textures/Texture.js | 2 +- .../src/animation/AnimationMixer.tests.js | 5 +- .../unit/src/animation/KeyframeTrack.tests.js | 29 +- .../src/animation/PropertyBinding.tests.js | 24 +- .../tracks/BooleanKeyframeTrack.tests.js | 19 +- .../tracks/ColorKeyframeTrack.tests.js | 19 +- .../tracks/NumberKeyframeTrack.tests.js | 19 +- .../tracks/QuaternionKeyframeTrack.tests.js | 19 +- .../tracks/StringKeyframeTrack.tests.js | 19 +- .../tracks/VectorKeyframeTrack.tests.js | 19 +- test/unit/src/audio/Audio.tests.js | 6 +- test/unit/src/audio/AudioListener.tests.js | 5 +- test/unit/src/audio/PositionalAudio.tests.js | 6 +- test/unit/src/cameras/ArrayCamera.tests.js | 5 +- test/unit/src/cameras/Camera.tests.js | 5 +- test/unit/src/cameras/CubeCamera.tests.js | 5 +- .../src/cameras/OrthographicCamera.tests.js | 5 +- .../src/cameras/PerspectiveCamera.tests.js | 5 +- test/unit/src/cameras/StereoCamera.tests.js | 5 +- test/unit/src/core/BufferAttribute.tests.js | 128 +- test/unit/src/core/BufferGeometry.tests.js | 61 +- test/unit/src/core/Clock.tests.js | 10 +- test/unit/src/core/EventDispatcher.tests.js | 5 +- test/unit/src/core/GLBufferAttribute.tests.js | 5 +- .../core/InstancedBufferAttribute.tests.js | 9 +- .../src/core/InstancedBufferGeometry.tests.js | 5 +- test/unit/src/core/InterleavedBuffer.tests.js | 5 +- .../core/InterleavedBufferAttribute.tests.js | 5 +- test/unit/src/core/Layers.tests.js | 5 +- test/unit/src/core/Object3D.tests.js | 5 +- test/unit/src/core/Raycaster.tests.js | 6 +- test/unit/src/core/UniformsGroup.tests.js | 12 +- test/unit/src/extras/core/Curve.tests.js | 5 +- test/unit/src/extras/core/CurvePath.tests.js | 5 +- test/unit/src/extras/core/Path.tests.js | 5 +- test/unit/src/extras/core/Shape.tests.js | 5 +- test/unit/src/extras/core/ShapePath.tests.js | 5 +- test/unit/src/extras/curves/ArcCurve.tests.js | 5 +- .../extras/curves/CatmullRomCurve3.tests.js | 5 +- .../extras/curves/CubicBezierCurve.tests.js | 5 +- .../extras/curves/CubicBezierCurve3.tests.js | 5 +- .../src/extras/curves/EllipseCurve.tests.js | 5 +- .../unit/src/extras/curves/LineCurve.tests.js | 12 +- .../src/extras/curves/LineCurve3.tests.js | 5 +- .../curves/QuadraticBezierCurve.tests.js | 5 +- .../curves/QuadraticBezierCurve3.tests.js | 5 +- .../src/extras/curves/SplineCurve.tests.js | 5 +- test/unit/src/geometries/BoxGeometry.tests.js | 5 +- .../src/geometries/CapsuleGeometry.tests.js | 5 +- .../src/geometries/CircleGeometry.tests.js | 5 +- .../unit/src/geometries/ConeGeometry.tests.js | 6 +- .../src/geometries/CylinderGeometry.tests.js | 5 +- .../geometries/DodecahedronGeometry.tests.js | 6 +- .../src/geometries/EdgesGeometry.tests.js | 5 +- .../src/geometries/ExtrudeGeometry.tests.js | 5 +- .../geometries/IcosahedronGeometry.tests.js | 5 +- .../src/geometries/LatheGeometry.tests.js | 5 +- .../geometries/OctahedronGeometry.tests.js | 5 +- .../src/geometries/PlaneGeometry.tests.js | 5 +- .../geometries/PolyhedronGeometry.tests.js | 5 +- .../unit/src/geometries/RingGeometry.tests.js | 5 +- .../src/geometries/ShapeGeometry.tests.js | 5 +- .../src/geometries/SphereGeometry.tests.js | 5 +- .../geometries/TetrahedronGeometry.tests.js | 5 +- .../src/geometries/TorusGeometry.tests.js | 5 +- .../src/geometries/TorusKnotGeometry.tests.js | 5 +- .../unit/src/geometries/TubeGeometry.tests.js | 5 +- .../src/geometries/WireframeGeometry.tests.js | 5 +- test/unit/src/helpers/ArrowHelper.tests.js | 12 +- test/unit/src/helpers/AxesHelper.tests.js | 12 +- test/unit/src/helpers/Box3Helper.tests.js | 12 +- test/unit/src/helpers/BoxHelper.tests.js | 12 +- test/unit/src/helpers/CameraHelper.tests.js | 14 +- .../helpers/DirectionalLightHelper.tests.js | 14 +- test/unit/src/helpers/GridHelper.tests.js | 12 +- .../helpers/HemisphereLightHelper.tests.js | 14 +- test/unit/src/helpers/PlaneHelper.tests.js | 12 +- .../src/helpers/PointLightHelper.tests.js | 14 +- .../unit/src/helpers/PolarGridHelper.tests.js | 12 +- test/unit/src/helpers/SkeletonHelper.tests.js | 14 +- .../unit/src/helpers/SpotLightHelper.tests.js | 14 +- test/unit/src/lights/AmbientLight.tests.js | 5 +- .../src/lights/AmbientLightProbe.tests.js | 5 +- .../unit/src/lights/DirectionalLight.tests.js | 15 +- .../lights/DirectionalLightShadow.tests.js | 5 +- test/unit/src/lights/HemisphereLight.tests.js | 5 +- .../src/lights/HemisphereLightProbe.tests.js | 5 +- test/unit/src/lights/Light.tests.js | 12 +- test/unit/src/lights/LightShadow.tests.js | 14 +- test/unit/src/lights/PointLight.tests.js | 13 +- .../unit/src/lights/PointLightShadow.tests.js | 5 +- test/unit/src/lights/RectAreaLight.tests.js | 5 +- test/unit/src/lights/SpotLight.tests.js | 13 +- test/unit/src/lights/SpotLightShadow.tests.js | 5 +- .../unit/src/loaders/AnimationLoader.tests.js | 5 +- test/unit/src/loaders/AudioLoader.tests.js | 5 +- .../src/loaders/BufferGeometryLoader.tests.js | 5 +- .../loaders/CompressedTextureLoader.tests.js | 5 +- .../src/loaders/CubeTextureLoader.tests.js | 5 +- .../src/loaders/DataTextureLoader.tests.js | 5 +- test/unit/src/loaders/FileLoader.tests.js | 5 +- .../src/loaders/ImageBitmapLoader.tests.js | 11 +- test/unit/src/loaders/ImageLoader.tests.js | 5 +- test/unit/src/loaders/Loader.tests.js | 5 +- test/unit/src/loaders/LoadingManager.tests.js | 9 +- test/unit/src/loaders/MaterialLoader.tests.js | 5 +- test/unit/src/loaders/ObjectLoader.tests.js | 5 +- test/unit/src/loaders/TextureLoader.tests.js | 5 +- .../src/materials/LineBasicMaterial.tests.js | 5 +- .../src/materials/LineDashedMaterial.tests.js | 5 +- test/unit/src/materials/Material.tests.js | 12 +- .../src/materials/MeshBasicMaterial.tests.js | 5 +- .../src/materials/MeshDepthMaterial.tests.js | 5 +- .../materials/MeshDistanceMaterial.tests.js | 5 +- .../materials/MeshLambertMaterial.tests.js | 5 +- .../src/materials/MeshMatcapMaterial.tests.js | 5 +- .../src/materials/MeshNormalMaterial.tests.js | 5 +- .../src/materials/MeshPhongMaterial.tests.js | 5 +- .../materials/MeshPhysicalMaterial.tests.js | 5 +- .../materials/MeshStandardMaterial.tests.js | 5 +- .../src/materials/MeshToonMaterial.tests.js | 5 +- .../src/materials/PointsMaterial.tests.js | 5 +- .../src/materials/RawShaderMaterial.tests.js | 5 +- .../src/materials/ShaderMaterial.tests.js | 5 +- .../src/materials/ShadowMaterial.tests.js | 5 +- .../src/materials/SpriteMaterial.tests.js | 5 +- test/unit/src/math/Box2.tests.js | 5 - .../src/math/SphericalHarmonics3.tests.js | 5 +- .../interpolants/CubicInterpolant.tests.js | 6 +- .../interpolants/DiscreteInterpolant.tests.js | 6 +- .../interpolants/LinearInterpolant.tests.js | 6 +- .../QuaternionLinearInterpolant.tests.js | 6 +- test/unit/src/objects/Bone.tests.js | 8 +- test/unit/src/objects/Group.tests.js | 8 +- test/unit/src/objects/InstancedMesh.tests.js | 12 +- test/unit/src/objects/Line.tests.js | 8 +- test/unit/src/objects/LineLoop.tests.js | 5 +- test/unit/src/objects/LineSegments.tests.js | 5 +- test/unit/src/objects/Mesh.tests.js | 5 +- test/unit/src/objects/Points.tests.js | 5 +- test/unit/src/objects/Skeleton.tests.js | 14 +- test/unit/src/objects/SkinnedMesh.tests.js | 5 +- test/unit/src/objects/Sprite.tests.js | 5 +- .../src/renderers/WebGLRenderTarget.tests.js | 12 +- .../unit/src/renderers/WebGLRenderer.tests.js | 7 +- .../renderers/shaders/UniformsUtils.tests.js | 112 +- test/unit/src/scenes/Scene.tests.js | 5 +- test/unit/src/textures/CanvasTexture.tests.js | 5 +- .../textures/CompressedArrayTexture.tests.js | 5 +- .../src/textures/CompressedTexture.tests.js | 5 +- test/unit/src/textures/CubeTexture.tests.js | 5 +- test/unit/src/textures/Data3DTexture.tests.js | 5 +- .../src/textures/DataArrayTexture.tests.js | 5 +- test/unit/src/textures/DataTexture.tests.js | 5 +- test/unit/src/textures/DepthTexture.tests.js | 5 +- .../src/textures/FramebufferTexture.tests.js | 5 +- test/unit/src/textures/Source.tests.js | 5 +- test/unit/src/textures/Texture.tests.js | 15 +- test/unit/src/textures/VideoTexture.tests.js | 8 +- 395 files changed, 54014 insertions(+), 6405 deletions(-) delete mode 100644 editor/js/Viewport.Shading.js create mode 100644 examples/jsm/loaders/IFCLoader.js create mode 100644 examples/jsm/loaders/ifc/web-ifc-api.js create mode 100644 examples/jsm/loaders/ifc/web-ifc.wasm delete mode 100644 examples/jsm/node-editor/NodeEditorUtils.js delete mode 100644 examples/jsm/node-editor/materials/MaterialEditor.js create mode 100644 examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js create mode 100644 examples/jsm/nodes/shadernode/ShaderNodeElements.js delete mode 100644 examples/models/svg/emptyPath.svg diff --git a/build/three.cjs b/build/three.cjs index d2d185559bae4f..450340bc1417bf 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -5,7 +5,7 @@ */ 'use strict'; -const REVISION = '151dev'; +const REVISION = '150dev'; const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }; const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }; const CullFaceNone = 0; @@ -2865,28 +2865,43 @@ function LinearToSRGB( c ) { /** - * Matrices converting P3 <-> Rec. 709 primaries, without gamut mapping - * or clipping. Based on W3C specifications for sRGB and Display P3, - * and ICC specifications for the D50 connection space. Values in/out - * are _linear_ sRGB and _linear_ Display P3. - * - * Note that both sRGB and Display P3 use the sRGB transfer functions. + * Matrices for sRGB and Display P3, based on the W3C specifications + * for sRGB and Display P3, and the ICC specification for the D50 + * connection space. * * Reference: * - http://www.russellcottrell.com/photo/matrixCalculator.htm */ -const LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = new Matrix3().fromArray( [ - 0.8224621, 0.0331941, 0.0170827, - 0.1775380, 0.9668058, 0.0723974, - - 0.0000001, 0.0000001, 0.9105199 -] ); +const SRGB_TO_DISPLAY_P3 = new Matrix3().multiplyMatrices( + // XYZ to Display P3 + new Matrix3().set( + 2.4039840, - 0.9899069, - 0.3976415, + - 0.8422229, 1.7988437, 0.0160354, + 0.0482059, - 0.0974068, 1.2740049, + ), + // sRGB to XYZ + new Matrix3().set( + 0.4360413, 0.3851129, 0.1430458, + 0.2224845, 0.7169051, 0.0606104, + 0.0139202, 0.0970672, 0.7139126, + ), +); -const LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = new Matrix3().fromArray( [ - 1.2249401, - 0.0420569, - 0.0196376, - - 0.2249404, 1.0420571, - 0.0786361, - 0.0000001, 0.0000000, 1.0982735 -] ); +const DISPLAY_P3_TO_SRGB = new Matrix3().multiplyMatrices( + // XYZ to sRGB + new Matrix3().set( + 3.1341864, - 1.6172090, - 0.4906941, + - 0.9787485, 1.9161301, 0.0334334, + 0.0719639, - 0.2289939, 1.4057537, + ), + // Display P3 to XYZ + new Matrix3().set( + 0.5151187, 0.2919778, 0.1571035, + 0.2411892, 0.6922441, 0.0665668, + - 0.0010505, 0.0418791, 0.7840713, + ), +); const _vector$c = new Vector3(); @@ -2894,7 +2909,7 @@ function DisplayP3ToLinearSRGB( color ) { color.convertSRGBToLinear(); - _vector$c.set( color.r, color.g, color.b ).applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ); + _vector$c.set( color.r, color.g, color.b ).applyMatrix3( DISPLAY_P3_TO_SRGB ); return color.setRGB( _vector$c.x, _vector$c.y, _vector$c.z ); @@ -2902,7 +2917,7 @@ function DisplayP3ToLinearSRGB( color ) { function LinearSRGBToDisplayP3( color ) { - _vector$c.set( color.r, color.g, color.b ).applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ); + _vector$c.set( color.r, color.g, color.b ).applyMatrix3( SRGB_TO_DISPLAY_P3 ); return color.setRGB( _vector$c.x, _vector$c.y, _vector$c.z ).convertLinearToSRGB(); @@ -3301,7 +3316,7 @@ class Texture extends EventDispatcher { } - set image( value = null ) { + set image( value ) { this.source.data = value; @@ -4837,7 +4852,9 @@ class Box3 { distanceToPoint( point ) { - return this.clampPoint( point, _vector$b ).distanceTo( point ); + const clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max ); + + return clampedPoint.sub( point ).length(); } @@ -5253,7 +5270,7 @@ class Ray { at( t, target ) { - return target.copy( this.origin ).addScaledVector( this.direction, t ); + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); } @@ -5285,7 +5302,7 @@ class Ray { } - return target.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); } @@ -5307,7 +5324,7 @@ class Ray { } - _vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + _vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); return _vector$a.distanceToSquared( point ); @@ -5418,13 +5435,13 @@ class Ray { if ( optionalPointOnRay ) { - optionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 ); + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); } if ( optionalPointOnSegment ) { - optionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 ); + optionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter ); } @@ -5449,8 +5466,8 @@ class Ray { // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; - // test to see if t1 is behind the ray - if so, return null - if ( t1 < 0 ) return null; + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, @@ -9352,175 +9369,6 @@ class MeshBasicMaterial extends Material { } -// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf - -const _tables = /*@__PURE__*/ _generateTables(); - -function _generateTables() { - - // float32 to float16 helpers - - const buffer = new ArrayBuffer( 4 ); - const floatView = new Float32Array( buffer ); - const uint32View = new Uint32Array( buffer ); - - const baseTable = new Uint32Array( 512 ); - const shiftTable = new Uint32Array( 512 ); - - for ( let i = 0; i < 256; ++ i ) { - - const e = i - 127; - - // very small number (0, -0) - - if ( e < - 27 ) { - - baseTable[ i ] = 0x0000; - baseTable[ i | 0x100 ] = 0x8000; - shiftTable[ i ] = 24; - shiftTable[ i | 0x100 ] = 24; - - // small number (denorm) - - } else if ( e < - 14 ) { - - baseTable[ i ] = 0x0400 >> ( - e - 14 ); - baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; - shiftTable[ i ] = - e - 1; - shiftTable[ i | 0x100 ] = - e - 1; - - // normal number - - } else if ( e <= 15 ) { - - baseTable[ i ] = ( e + 15 ) << 10; - baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; - shiftTable[ i ] = 13; - shiftTable[ i | 0x100 ] = 13; - - // large number (Infinity, -Infinity) - - } else if ( e < 128 ) { - - baseTable[ i ] = 0x7c00; - baseTable[ i | 0x100 ] = 0xfc00; - shiftTable[ i ] = 24; - shiftTable[ i | 0x100 ] = 24; - - // stay (NaN, Infinity, -Infinity) - - } else { - - baseTable[ i ] = 0x7c00; - baseTable[ i | 0x100 ] = 0xfc00; - shiftTable[ i ] = 13; - shiftTable[ i | 0x100 ] = 13; - - } - - } - - // float16 to float32 helpers - - const mantissaTable = new Uint32Array( 2048 ); - const exponentTable = new Uint32Array( 64 ); - const offsetTable = new Uint32Array( 64 ); - - for ( let i = 1; i < 1024; ++ i ) { - - let m = i << 13; // zero pad mantissa bits - let e = 0; // zero exponent - - // normalized - while ( ( m & 0x00800000 ) === 0 ) { - - m <<= 1; - e -= 0x00800000; // decrement exponent - - } - - m &= ~ 0x00800000; // clear leading 1 bit - e += 0x38800000; // adjust bias - - mantissaTable[ i ] = m | e; - - } - - for ( let i = 1024; i < 2048; ++ i ) { - - mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); - - } - - for ( let i = 1; i < 31; ++ i ) { - - exponentTable[ i ] = i << 23; - - } - - exponentTable[ 31 ] = 0x47800000; - exponentTable[ 32 ] = 0x80000000; - - for ( let i = 33; i < 63; ++ i ) { - - exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); - - } - - exponentTable[ 63 ] = 0xc7800000; - - for ( let i = 1; i < 64; ++ i ) { - - if ( i !== 32 ) { - - offsetTable[ i ] = 1024; - - } - - } - - return { - floatView: floatView, - uint32View: uint32View, - baseTable: baseTable, - shiftTable: shiftTable, - mantissaTable: mantissaTable, - exponentTable: exponentTable, - offsetTable: offsetTable - }; - -} - -// float32 to float16 - -function toHalfFloat( val ) { - - if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); - - val = clamp( val, - 65504, 65504 ); - - _tables.floatView[ 0 ] = val; - const f = _tables.uint32View[ 0 ]; - const e = ( f >> 23 ) & 0x1ff; - return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); - -} - -// float16 to float32 - -function fromHalfFloat( val ) { - - const m = val >> 10; - _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; - return _tables.floatView[ 0 ]; - -} - -const DataUtils = { - toHalfFloat: toHalfFloat, - fromHalfFloat: fromHalfFloat, -}; - const _vector$9 = /*@__PURE__*/ new Vector3(); const _vector2$1 = /*@__PURE__*/ new Vector2(); @@ -9971,146 +9819,6 @@ class Float16BufferAttribute extends BufferAttribute { } - getX( index ) { - - let x = fromHalfFloat( this.array[ index * this.itemSize ] ); - - if ( this.normalized ) x = denormalize( x, this.array ); - - return x; - - } - - setX( index, x ) { - - if ( this.normalized ) x = normalize( x, this.array ); - - this.array[ index * this.itemSize ] = toHalfFloat( x ); - - return this; - - } - - getY( index ) { - - let y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] ); - - if ( this.normalized ) y = denormalize( y, this.array ); - - return y; - - } - - setY( index, y ) { - - if ( this.normalized ) y = normalize( y, this.array ); - - this.array[ index * this.itemSize + 1 ] = toHalfFloat( y ); - - return this; - - } - - getZ( index ) { - - let z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] ); - - if ( this.normalized ) z = denormalize( z, this.array ); - - return z; - - } - - setZ( index, z ) { - - if ( this.normalized ) z = normalize( z, this.array ); - - this.array[ index * this.itemSize + 2 ] = toHalfFloat( z ); - - return this; - - } - - getW( index ) { - - let w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] ); - - if ( this.normalized ) w = denormalize( w, this.array ); - - return w; - - } - - setW( index, w ) { - - if ( this.normalized ) w = normalize( w, this.array ); - - this.array[ index * this.itemSize + 3 ] = toHalfFloat( w ); - - return this; - - } - - setXY( index, x, y ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - - return this; - - } - - setXYZ( index, x, y, z ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - z = normalize( z, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - this.array[ index + 2 ] = toHalfFloat( z ); - - return this; - - } - - setXYZW( index, x, y, z, w ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - z = normalize( z, this.array ); - w = normalize( w, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - this.array[ index + 2 ] = toHalfFloat( z ); - this.array[ index + 3 ] = toHalfFloat( w ); - - return this; - - } - } @@ -11197,6 +10905,10 @@ class BufferGeometry extends EventDispatcher { this.userData = source.userData; + // geometry generator parameters + + if ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters ); + return this; } @@ -11754,16 +11466,6 @@ class BoxGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); @@ -12703,7 +12405,7 @@ class Plane { projectPoint( point, target ) { - return target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) ); + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); } @@ -12735,7 +12437,7 @@ class Plane { } - return target.copy( line.start ).addScaledVector( direction, t ); + return target.copy( direction ).multiplyScalar( t ).add( line.start ); } @@ -13281,16 +12983,6 @@ class PlaneGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments ); @@ -13337,7 +13029,7 @@ var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\ var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif"; -var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}"; +var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nfloat w0( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n}\nfloat w1( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n}\nfloat w2( float a ){\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n}\nfloat w3( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n}\nfloat g0( float a ) {\n\treturn w0( a ) + w1( a );\n}\nfloat g1( float a ) {\n\treturn w2( a ) + w3( a );\n}\nfloat h0( float a ) {\n\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n}\nfloat h1( float a ) {\n return 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n}\nvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\tuv = uv * texelSize.zw + 0.5;\n\tvec2 iuv = floor( uv );\n vec2 fuv = fract( uv );\n float g0x = g0( fuv.x );\n float g1x = g1( fuv.x );\n float h0x = h0( fuv.x );\n float h1x = h1( fuv.x );\n float h0y = h0( fuv.y );\n float h1y = h1( fuv.y );\n vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n \n vec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n}\nvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\treturn mix( fSample, cSample, fract( lod ) );\n}"; var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_v0 0.339\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_v1 0.276\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_v4 0.046\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_v5 0.016\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_v6 0.0038\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif"; @@ -13495,7 +13187,7 @@ var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate( a ) clamp( var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n#endif"; -var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\t\n\t\tvec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif"; +var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif"; var uv_pars_fragment = "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif"; @@ -17140,7 +16832,7 @@ function WebGLMorphtargets( gl, capabilities, textures ) { } - function update( object, geometry, program ) { + function update( object, geometry, material, program ) { const objectInfluences = object.morphTargetInfluences; @@ -28564,7 +28256,7 @@ function WebGLRenderer( parameters = {} ) { if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera ); - if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ); + if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera ); if ( viewport ) state.viewport( _currentViewport.copy( viewport ) ); @@ -28582,11 +28274,11 @@ function WebGLRenderer( parameters = {} ) { } - function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) { + function renderTransmissionPass( opaqueObjects, scene, camera ) { - if ( _transmissionRenderTarget === null ) { + const isWebGL2 = capabilities.isWebGL2; - const isWebGL2 = capabilities.isWebGL2; + if ( _transmissionRenderTarget === null ) { _transmissionRenderTarget = new WebGLRenderTarget( 1024, 1024, { generateMipmaps: true, @@ -28595,16 +28287,6 @@ function WebGLRenderer( parameters = {} ) { samples: ( isWebGL2 && _antialias === true ) ? 4 : 0 } ); - // debug - - /* - const geometry = new PlaneGeometry(); - const material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } ); - - const mesh = new Mesh( geometry, material ); - scene.add( mesh ); - */ - } // @@ -28620,49 +28302,13 @@ function WebGLRenderer( parameters = {} ) { renderObjects( opaqueObjects, scene, camera ); + _this.toneMapping = currentToneMapping; + textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); textures.updateRenderTargetMipmap( _transmissionRenderTarget ); - let renderTargetNeedsUpdate = false; - - for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) { - - const renderItem = transmissiveObjects[ i ]; - - const object = renderItem.object; - const geometry = renderItem.geometry; - const material = renderItem.material; - const group = renderItem.group; - - if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) { - - const currentSide = material.side; - - material.side = BackSide; - material.needsUpdate = true; - - renderObject( object, scene, camera, geometry, material, group ); - - material.side = currentSide; - material.needsUpdate = true; - - renderTargetNeedsUpdate = true; - - } - - } - - if ( renderTargetNeedsUpdate === true ) { - - textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); - textures.updateRenderTargetMipmap( _transmissionRenderTarget ); - - } - _this.setRenderTarget( currentRenderTarget ); - _this.toneMapping = currentToneMapping; - } function renderObjects( renderList, scene, camera ) { @@ -29111,7 +28757,7 @@ function WebGLRenderer( parameters = {} ) { if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) { - morphtargets.update( object, geometry, program ); + morphtargets.update( object, geometry, material, program ); } @@ -33051,15 +32697,13 @@ class LineCurve extends Curve { } - getTangent( t, optionalTarget = new Vector2() ) { - - return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); + getTangent( t, optionalTarget ) { - } + const tangent = optionalTarget || new Vector2(); - getTangentAt( u, optionalTarget ) { + tangent.copy( this.v2 ).sub( this.v1 ).normalize(); - return this.getTangent( u, optionalTarget ); + return tangent; } @@ -33136,19 +32780,6 @@ class LineCurve3 extends Curve { return this.getPoint( u, optionalTarget ); } - - getTangent( t, optionalTarget = new Vector3() ) { - - return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); - - } - - getTangentAt( u, optionalTarget ) { - - return this.getTangent( u, optionalTarget ); - - } - copy( source ) { super.copy( source ); @@ -34023,16 +33654,6 @@ class LatheGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength ); @@ -34146,16 +33767,6 @@ class CircleGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength ); @@ -34425,16 +34036,6 @@ class CylinderGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); @@ -34766,16 +34367,6 @@ class PolyhedronGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details ); @@ -34979,16 +34570,6 @@ class EdgesGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - } class Shape extends Path { @@ -36129,7 +35710,7 @@ class ExtrudeGeometry extends BufferGeometry { if ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' ); - return pt.clone().addScaledVector( vec, size ); + return vec.clone().multiplyScalar( size ).add( pt ); } @@ -36636,16 +36217,6 @@ class ExtrudeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -36944,16 +36515,6 @@ class RingGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength ); @@ -37088,16 +36649,6 @@ class ShapeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -37264,16 +36815,6 @@ class SphereGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); @@ -37410,16 +36951,6 @@ class TorusGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc ); @@ -37572,16 +37103,6 @@ class TorusKnotGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q ); @@ -37749,16 +37270,6 @@ class TubeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -37895,16 +37406,6 @@ class WireframeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - } function isUniqueEdge( start, end, edges ) { @@ -48702,7 +48203,8 @@ class Box2 { distanceToPoint( point ) { - return this.clampPoint( point, _vector$4 ).distanceTo( point ); + const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); } @@ -48711,8 +48213,6 @@ class Box2 { this.min.max( box.min ); this.max.min( box.max ); - if ( this.isEmpty() ) this.makeEmpty(); - return this; } @@ -50356,6 +49856,175 @@ class ShapePath { } +// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + +const _tables = /*@__PURE__*/ _generateTables(); + +function _generateTables() { + + // float32 to float16 helpers + + const buffer = new ArrayBuffer( 4 ); + const floatView = new Float32Array( buffer ); + const uint32View = new Uint32Array( buffer ); + + const baseTable = new Uint32Array( 512 ); + const shiftTable = new Uint32Array( 512 ); + + for ( let i = 0; i < 256; ++ i ) { + + const e = i - 127; + + // very small number (0, -0) + + if ( e < - 27 ) { + + baseTable[ i ] = 0x0000; + baseTable[ i | 0x100 ] = 0x8000; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // small number (denorm) + + } else if ( e < - 14 ) { + + baseTable[ i ] = 0x0400 >> ( - e - 14 ); + baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; + shiftTable[ i ] = - e - 1; + shiftTable[ i | 0x100 ] = - e - 1; + + // normal number + + } else if ( e <= 15 ) { + + baseTable[ i ] = ( e + 15 ) << 10; + baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + // large number (Infinity, -Infinity) + + } else if ( e < 128 ) { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // stay (NaN, Infinity, -Infinity) + + } else { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + } + + } + + // float16 to float32 helpers + + const mantissaTable = new Uint32Array( 2048 ); + const exponentTable = new Uint32Array( 64 ); + const offsetTable = new Uint32Array( 64 ); + + for ( let i = 1; i < 1024; ++ i ) { + + let m = i << 13; // zero pad mantissa bits + let e = 0; // zero exponent + + // normalized + while ( ( m & 0x00800000 ) === 0 ) { + + m <<= 1; + e -= 0x00800000; // decrement exponent + + } + + m &= ~ 0x00800000; // clear leading 1 bit + e += 0x38800000; // adjust bias + + mantissaTable[ i ] = m | e; + + } + + for ( let i = 1024; i < 2048; ++ i ) { + + mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); + + } + + for ( let i = 1; i < 31; ++ i ) { + + exponentTable[ i ] = i << 23; + + } + + exponentTable[ 31 ] = 0x47800000; + exponentTable[ 32 ] = 0x80000000; + + for ( let i = 33; i < 63; ++ i ) { + + exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); + + } + + exponentTable[ 63 ] = 0xc7800000; + + for ( let i = 1; i < 64; ++ i ) { + + if ( i !== 32 ) { + + offsetTable[ i ] = 1024; + + } + + } + + return { + floatView: floatView, + uint32View: uint32View, + baseTable: baseTable, + shiftTable: shiftTable, + mantissaTable: mantissaTable, + exponentTable: exponentTable, + offsetTable: offsetTable + }; + +} + +// float32 to float16 + +function toHalfFloat( val ) { + + if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); + + val = clamp( val, - 65504, 65504 ); + + _tables.floatView[ 0 ] = val; + const f = _tables.uint32View[ 0 ]; + const e = ( f >> 23 ) & 0x1ff; + return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); + +} + +// float16 to float32 + +function fromHalfFloat( val ) { + + const m = val >> 10; + _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; + return _tables.floatView[ 0 ]; + +} + +const DataUtils = { + toHalfFloat: toHalfFloat, + fromHalfFloat: fromHalfFloat, +}; + // r144 class BoxBufferGeometry extends BoxGeometry { diff --git a/build/three.js b/build/three.js index ede9e0636950ad..febbbdf4100271 100644 --- a/build/three.js +++ b/build/three.js @@ -10,7 +10,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.THREE = {})); })(this, (function (exports) { 'use strict'; - const REVISION = '151dev'; + const REVISION = '150dev'; const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }; const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }; const CullFaceNone = 0; @@ -2870,28 +2870,43 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated /** - * Matrices converting P3 <-> Rec. 709 primaries, without gamut mapping - * or clipping. Based on W3C specifications for sRGB and Display P3, - * and ICC specifications for the D50 connection space. Values in/out - * are _linear_ sRGB and _linear_ Display P3. - * - * Note that both sRGB and Display P3 use the sRGB transfer functions. + * Matrices for sRGB and Display P3, based on the W3C specifications + * for sRGB and Display P3, and the ICC specification for the D50 + * connection space. * * Reference: * - http://www.russellcottrell.com/photo/matrixCalculator.htm */ - const LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = new Matrix3().fromArray( [ - 0.8224621, 0.0331941, 0.0170827, - 0.1775380, 0.9668058, 0.0723974, - - 0.0000001, 0.0000001, 0.9105199 - ] ); + const SRGB_TO_DISPLAY_P3 = new Matrix3().multiplyMatrices( + // XYZ to Display P3 + new Matrix3().set( + 2.4039840, - 0.9899069, - 0.3976415, + - 0.8422229, 1.7988437, 0.0160354, + 0.0482059, - 0.0974068, 1.2740049, + ), + // sRGB to XYZ + new Matrix3().set( + 0.4360413, 0.3851129, 0.1430458, + 0.2224845, 0.7169051, 0.0606104, + 0.0139202, 0.0970672, 0.7139126, + ), + ); - const LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = new Matrix3().fromArray( [ - 1.2249401, - 0.0420569, - 0.0196376, - - 0.2249404, 1.0420571, - 0.0786361, - 0.0000001, 0.0000000, 1.0982735 - ] ); + const DISPLAY_P3_TO_SRGB = new Matrix3().multiplyMatrices( + // XYZ to sRGB + new Matrix3().set( + 3.1341864, - 1.6172090, - 0.4906941, + - 0.9787485, 1.9161301, 0.0334334, + 0.0719639, - 0.2289939, 1.4057537, + ), + // Display P3 to XYZ + new Matrix3().set( + 0.5151187, 0.2919778, 0.1571035, + 0.2411892, 0.6922441, 0.0665668, + - 0.0010505, 0.0418791, 0.7840713, + ), + ); const _vector$c = new Vector3(); @@ -2899,7 +2914,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated color.convertSRGBToLinear(); - _vector$c.set( color.r, color.g, color.b ).applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ); + _vector$c.set( color.r, color.g, color.b ).applyMatrix3( DISPLAY_P3_TO_SRGB ); return color.setRGB( _vector$c.x, _vector$c.y, _vector$c.z ); @@ -2907,7 +2922,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated function LinearSRGBToDisplayP3( color ) { - _vector$c.set( color.r, color.g, color.b ).applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ); + _vector$c.set( color.r, color.g, color.b ).applyMatrix3( SRGB_TO_DISPLAY_P3 ); return color.setRGB( _vector$c.x, _vector$c.y, _vector$c.z ).convertLinearToSRGB(); @@ -3306,7 +3321,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - set image( value = null ) { + set image( value ) { this.source.data = value; @@ -4842,7 +4857,9 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated distanceToPoint( point ) { - return this.clampPoint( point, _vector$b ).distanceTo( point ); + const clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max ); + + return clampedPoint.sub( point ).length(); } @@ -5258,7 +5275,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated at( t, target ) { - return target.copy( this.origin ).addScaledVector( this.direction, t ); + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); } @@ -5290,7 +5307,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - return target.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); } @@ -5312,7 +5329,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - _vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + _vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); return _vector$a.distanceToSquared( point ); @@ -5423,13 +5440,13 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated if ( optionalPointOnRay ) { - optionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 ); + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); } if ( optionalPointOnSegment ) { - optionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 ); + optionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter ); } @@ -5454,8 +5471,8 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; - // test to see if t1 is behind the ray - if so, return null - if ( t1 < 0 ) return null; + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, @@ -9357,175 +9374,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - // Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf - - const _tables = /*@__PURE__*/ _generateTables(); - - function _generateTables() { - - // float32 to float16 helpers - - const buffer = new ArrayBuffer( 4 ); - const floatView = new Float32Array( buffer ); - const uint32View = new Uint32Array( buffer ); - - const baseTable = new Uint32Array( 512 ); - const shiftTable = new Uint32Array( 512 ); - - for ( let i = 0; i < 256; ++ i ) { - - const e = i - 127; - - // very small number (0, -0) - - if ( e < - 27 ) { - - baseTable[ i ] = 0x0000; - baseTable[ i | 0x100 ] = 0x8000; - shiftTable[ i ] = 24; - shiftTable[ i | 0x100 ] = 24; - - // small number (denorm) - - } else if ( e < - 14 ) { - - baseTable[ i ] = 0x0400 >> ( - e - 14 ); - baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; - shiftTable[ i ] = - e - 1; - shiftTable[ i | 0x100 ] = - e - 1; - - // normal number - - } else if ( e <= 15 ) { - - baseTable[ i ] = ( e + 15 ) << 10; - baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; - shiftTable[ i ] = 13; - shiftTable[ i | 0x100 ] = 13; - - // large number (Infinity, -Infinity) - - } else if ( e < 128 ) { - - baseTable[ i ] = 0x7c00; - baseTable[ i | 0x100 ] = 0xfc00; - shiftTable[ i ] = 24; - shiftTable[ i | 0x100 ] = 24; - - // stay (NaN, Infinity, -Infinity) - - } else { - - baseTable[ i ] = 0x7c00; - baseTable[ i | 0x100 ] = 0xfc00; - shiftTable[ i ] = 13; - shiftTable[ i | 0x100 ] = 13; - - } - - } - - // float16 to float32 helpers - - const mantissaTable = new Uint32Array( 2048 ); - const exponentTable = new Uint32Array( 64 ); - const offsetTable = new Uint32Array( 64 ); - - for ( let i = 1; i < 1024; ++ i ) { - - let m = i << 13; // zero pad mantissa bits - let e = 0; // zero exponent - - // normalized - while ( ( m & 0x00800000 ) === 0 ) { - - m <<= 1; - e -= 0x00800000; // decrement exponent - - } - - m &= ~ 0x00800000; // clear leading 1 bit - e += 0x38800000; // adjust bias - - mantissaTable[ i ] = m | e; - - } - - for ( let i = 1024; i < 2048; ++ i ) { - - mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); - - } - - for ( let i = 1; i < 31; ++ i ) { - - exponentTable[ i ] = i << 23; - - } - - exponentTable[ 31 ] = 0x47800000; - exponentTable[ 32 ] = 0x80000000; - - for ( let i = 33; i < 63; ++ i ) { - - exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); - - } - - exponentTable[ 63 ] = 0xc7800000; - - for ( let i = 1; i < 64; ++ i ) { - - if ( i !== 32 ) { - - offsetTable[ i ] = 1024; - - } - - } - - return { - floatView: floatView, - uint32View: uint32View, - baseTable: baseTable, - shiftTable: shiftTable, - mantissaTable: mantissaTable, - exponentTable: exponentTable, - offsetTable: offsetTable - }; - - } - - // float32 to float16 - - function toHalfFloat( val ) { - - if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); - - val = clamp( val, - 65504, 65504 ); - - _tables.floatView[ 0 ] = val; - const f = _tables.uint32View[ 0 ]; - const e = ( f >> 23 ) & 0x1ff; - return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); - - } - - // float16 to float32 - - function fromHalfFloat( val ) { - - const m = val >> 10; - _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; - return _tables.floatView[ 0 ]; - - } - - const DataUtils = { - toHalfFloat: toHalfFloat, - fromHalfFloat: fromHalfFloat, - }; - const _vector$9 = /*@__PURE__*/ new Vector3(); const _vector2$1 = /*@__PURE__*/ new Vector2(); @@ -9976,146 +9824,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - getX( index ) { - - let x = fromHalfFloat( this.array[ index * this.itemSize ] ); - - if ( this.normalized ) x = denormalize( x, this.array ); - - return x; - - } - - setX( index, x ) { - - if ( this.normalized ) x = normalize( x, this.array ); - - this.array[ index * this.itemSize ] = toHalfFloat( x ); - - return this; - - } - - getY( index ) { - - let y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] ); - - if ( this.normalized ) y = denormalize( y, this.array ); - - return y; - - } - - setY( index, y ) { - - if ( this.normalized ) y = normalize( y, this.array ); - - this.array[ index * this.itemSize + 1 ] = toHalfFloat( y ); - - return this; - - } - - getZ( index ) { - - let z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] ); - - if ( this.normalized ) z = denormalize( z, this.array ); - - return z; - - } - - setZ( index, z ) { - - if ( this.normalized ) z = normalize( z, this.array ); - - this.array[ index * this.itemSize + 2 ] = toHalfFloat( z ); - - return this; - - } - - getW( index ) { - - let w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] ); - - if ( this.normalized ) w = denormalize( w, this.array ); - - return w; - - } - - setW( index, w ) { - - if ( this.normalized ) w = normalize( w, this.array ); - - this.array[ index * this.itemSize + 3 ] = toHalfFloat( w ); - - return this; - - } - - setXY( index, x, y ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - - return this; - - } - - setXYZ( index, x, y, z ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - z = normalize( z, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - this.array[ index + 2 ] = toHalfFloat( z ); - - return this; - - } - - setXYZW( index, x, y, z, w ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - z = normalize( z, this.array ); - w = normalize( w, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - this.array[ index + 2 ] = toHalfFloat( z ); - this.array[ index + 3 ] = toHalfFloat( w ); - - return this; - - } - } @@ -11202,6 +10910,10 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated this.userData = source.userData; + // geometry generator parameters + + if ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters ); + return this; } @@ -11759,16 +11471,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); @@ -12708,7 +12410,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated projectPoint( point, target ) { - return target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) ); + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); } @@ -12740,7 +12442,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - return target.copy( line.start ).addScaledVector( direction, t ); + return target.copy( direction ).multiplyScalar( t ).add( line.start ); } @@ -13286,16 +12988,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments ); @@ -13342,7 +13034,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif"; - var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}"; + var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nfloat w0( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n}\nfloat w1( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n}\nfloat w2( float a ){\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n}\nfloat w3( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n}\nfloat g0( float a ) {\n\treturn w0( a ) + w1( a );\n}\nfloat g1( float a ) {\n\treturn w2( a ) + w3( a );\n}\nfloat h0( float a ) {\n\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n}\nfloat h1( float a ) {\n return 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n}\nvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\tuv = uv * texelSize.zw + 0.5;\n\tvec2 iuv = floor( uv );\n vec2 fuv = fract( uv );\n float g0x = g0( fuv.x );\n float g1x = g1( fuv.x );\n float h0x = h0( fuv.x );\n float h1x = h1( fuv.x );\n float h0y = h0( fuv.y );\n float h1y = h1( fuv.y );\n vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n \n vec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n}\nvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\treturn mix( fSample, cSample, fract( lod ) );\n}"; var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_v0 0.339\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_v1 0.276\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_v4 0.046\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_v5 0.016\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_v6 0.0038\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif"; @@ -13500,7 +13192,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n#endif"; - var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\t\n\t\tvec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif"; + var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif"; var uv_pars_fragment = "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif"; @@ -17145,7 +16837,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - function update( object, geometry, program ) { + function update( object, geometry, material, program ) { const objectInfluences = object.morphTargetInfluences; @@ -28569,7 +28261,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera ); - if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ); + if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera ); if ( viewport ) state.viewport( _currentViewport.copy( viewport ) ); @@ -28587,11 +28279,11 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) { + function renderTransmissionPass( opaqueObjects, scene, camera ) { - if ( _transmissionRenderTarget === null ) { + const isWebGL2 = capabilities.isWebGL2; - const isWebGL2 = capabilities.isWebGL2; + if ( _transmissionRenderTarget === null ) { _transmissionRenderTarget = new WebGLRenderTarget( 1024, 1024, { generateMipmaps: true, @@ -28600,16 +28292,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated samples: ( isWebGL2 && _antialias === true ) ? 4 : 0 } ); - // debug - - /* - const geometry = new PlaneGeometry(); - const material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } ); - - const mesh = new Mesh( geometry, material ); - scene.add( mesh ); - */ - } // @@ -28625,49 +28307,13 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated renderObjects( opaqueObjects, scene, camera ); + _this.toneMapping = currentToneMapping; + textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); textures.updateRenderTargetMipmap( _transmissionRenderTarget ); - let renderTargetNeedsUpdate = false; - - for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) { - - const renderItem = transmissiveObjects[ i ]; - - const object = renderItem.object; - const geometry = renderItem.geometry; - const material = renderItem.material; - const group = renderItem.group; - - if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) { - - const currentSide = material.side; - - material.side = BackSide; - material.needsUpdate = true; - - renderObject( object, scene, camera, geometry, material, group ); - - material.side = currentSide; - material.needsUpdate = true; - - renderTargetNeedsUpdate = true; - - } - - } - - if ( renderTargetNeedsUpdate === true ) { - - textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); - textures.updateRenderTargetMipmap( _transmissionRenderTarget ); - - } - _this.setRenderTarget( currentRenderTarget ); - _this.toneMapping = currentToneMapping; - } function renderObjects( renderList, scene, camera ) { @@ -29116,7 +28762,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) { - morphtargets.update( object, geometry, program ); + morphtargets.update( object, geometry, material, program ); } @@ -33056,15 +32702,13 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - getTangent( t, optionalTarget = new Vector2() ) { - - return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); + getTangent( t, optionalTarget ) { - } + const tangent = optionalTarget || new Vector2(); - getTangentAt( u, optionalTarget ) { + tangent.copy( this.v2 ).sub( this.v1 ).normalize(); - return this.getTangent( u, optionalTarget ); + return tangent; } @@ -33141,19 +32785,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated return this.getPoint( u, optionalTarget ); } - - getTangent( t, optionalTarget = new Vector3() ) { - - return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); - - } - - getTangentAt( u, optionalTarget ) { - - return this.getTangent( u, optionalTarget ); - - } - copy( source ) { super.copy( source ); @@ -34028,16 +33659,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength ); @@ -34151,16 +33772,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength ); @@ -34430,16 +34041,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); @@ -34771,16 +34372,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details ); @@ -34984,16 +34575,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - } class Shape extends Path { @@ -36134,7 +35715,7 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated if ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' ); - return pt.clone().addScaledVector( vec, size ); + return vec.clone().multiplyScalar( size ).add( pt ); } @@ -36641,16 +36222,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -36949,16 +36520,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength ); @@ -37093,16 +36654,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -37269,16 +36820,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); @@ -37415,16 +36956,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc ); @@ -37577,16 +37108,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q ); @@ -37754,16 +37275,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -37900,16 +37411,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - } function isUniqueEdge( start, end, edges ) { @@ -48707,7 +48208,8 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated distanceToPoint( point ) { - return this.clampPoint( point, _vector$4 ).distanceTo( point ); + const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); } @@ -48716,8 +48218,6 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated this.min.max( box.min ); this.max.min( box.max ); - if ( this.isEmpty() ) this.makeEmpty(); - return this; } @@ -50361,6 +49861,175 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated } + // Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + + const _tables = /*@__PURE__*/ _generateTables(); + + function _generateTables() { + + // float32 to float16 helpers + + const buffer = new ArrayBuffer( 4 ); + const floatView = new Float32Array( buffer ); + const uint32View = new Uint32Array( buffer ); + + const baseTable = new Uint32Array( 512 ); + const shiftTable = new Uint32Array( 512 ); + + for ( let i = 0; i < 256; ++ i ) { + + const e = i - 127; + + // very small number (0, -0) + + if ( e < - 27 ) { + + baseTable[ i ] = 0x0000; + baseTable[ i | 0x100 ] = 0x8000; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // small number (denorm) + + } else if ( e < - 14 ) { + + baseTable[ i ] = 0x0400 >> ( - e - 14 ); + baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; + shiftTable[ i ] = - e - 1; + shiftTable[ i | 0x100 ] = - e - 1; + + // normal number + + } else if ( e <= 15 ) { + + baseTable[ i ] = ( e + 15 ) << 10; + baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + // large number (Infinity, -Infinity) + + } else if ( e < 128 ) { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // stay (NaN, Infinity, -Infinity) + + } else { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + } + + } + + // float16 to float32 helpers + + const mantissaTable = new Uint32Array( 2048 ); + const exponentTable = new Uint32Array( 64 ); + const offsetTable = new Uint32Array( 64 ); + + for ( let i = 1; i < 1024; ++ i ) { + + let m = i << 13; // zero pad mantissa bits + let e = 0; // zero exponent + + // normalized + while ( ( m & 0x00800000 ) === 0 ) { + + m <<= 1; + e -= 0x00800000; // decrement exponent + + } + + m &= ~ 0x00800000; // clear leading 1 bit + e += 0x38800000; // adjust bias + + mantissaTable[ i ] = m | e; + + } + + for ( let i = 1024; i < 2048; ++ i ) { + + mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); + + } + + for ( let i = 1; i < 31; ++ i ) { + + exponentTable[ i ] = i << 23; + + } + + exponentTable[ 31 ] = 0x47800000; + exponentTable[ 32 ] = 0x80000000; + + for ( let i = 33; i < 63; ++ i ) { + + exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); + + } + + exponentTable[ 63 ] = 0xc7800000; + + for ( let i = 1; i < 64; ++ i ) { + + if ( i !== 32 ) { + + offsetTable[ i ] = 1024; + + } + + } + + return { + floatView: floatView, + uint32View: uint32View, + baseTable: baseTable, + shiftTable: shiftTable, + mantissaTable: mantissaTable, + exponentTable: exponentTable, + offsetTable: offsetTable + }; + + } + + // float32 to float16 + + function toHalfFloat( val ) { + + if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); + + val = clamp( val, - 65504, 65504 ); + + _tables.floatView[ 0 ] = val; + const f = _tables.uint32View[ 0 ]; + const e = ( f >> 23 ) & 0x1ff; + return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); + + } + + // float16 to float32 + + function fromHalfFloat( val ) { + + const m = val >> 10; + _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; + return _tables.floatView[ 0 ]; + + } + + const DataUtils = { + toHalfFloat: toHalfFloat, + fromHalfFloat: fromHalfFloat, + }; + // r144 class BoxBufferGeometry extends BoxGeometry { diff --git a/build/three.min.js b/build/three.min.js index 757c389049545f..6d65c9a99fca69 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -4,4 +4,4 @@ console.warn( 'Scripts "build/three.js" and "build/three.min.js" are deprecated * Copyright 2010-2023 Three.js Authors * SPDX-License-Identifier: MIT */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";const e="151dev",i=0,n=1,r=2,s=1,a=2,o=3,l=0,c=1,h=2,u=0,d=1,p=2,m=3,f=4,g=5,v=100,x=101,_=102,y=103,M=104,b=200,S=201,w=202,T=203,A=204,E=205,C=206,L=207,R=208,P=209,I=210,D=0,N=1,z=2,O=3,U=4,B=5,F=6,k=7,G=0,V=1,H=2,W=0,j=1,q=2,X=3,Y=4,Z=5,J=300,K=301,$=302,Q=303,tt=304,et=306,it=1e3,nt=1001,rt=1002,st=1003,at=1004,ot=1005,lt=1006,ct=1007,ht=1008,ut=1009,dt=1010,pt=1011,mt=1012,ft=1013,gt=1014,vt=1015,xt=1016,_t=1017,yt=1018,Mt=1020,bt=1021,St=1023,wt=1024,Tt=1025,At=1026,Et=1027,Ct=1028,Lt=1029,Rt=1030,Pt=1031,It=1033,Dt=33776,Nt=33777,zt=33778,Ot=33779,Ut=35840,Bt=35841,Ft=35842,kt=35843,Gt=36196,Vt=37492,Ht=37496,Wt=37808,jt=37809,qt=37810,Xt=37811,Yt=37812,Zt=37813,Jt=37814,Kt=37815,$t=37816,Qt=37817,te=37818,ee=37819,ie=37820,ne=37821,re=36492,se=36283,ae=36284,oe=36285,le=36286,ce=2300,he=2301,ue=2302,de=2400,pe=2401,me=2402,fe=2500,ge=2501,ve=3e3,xe=3001,_e=3201,ye=0,Me=1,be="srgb",Se="srgb-linear",we="display-p3",Te=7680,Ae=35044,Ee="300 es",Ce=1035;class Le{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[t]&&-1!==i[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const i=this._listeners[t];if(void 0!==i){const t=i.indexOf(e);-1!==t&&i.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const i=e.slice(0);for(let e=0,n=i.length;e>8&255]+Re[t>>16&255]+Re[t>>24&255]+"-"+Re[255&e]+Re[e>>8&255]+"-"+Re[e>>16&15|64]+Re[e>>24&255]+"-"+Re[63&i|128]+Re[i>>8&255]+"-"+Re[i>>16&255]+Re[i>>24&255]+Re[255&n]+Re[n>>8&255]+Re[n>>16&255]+Re[n>>24&255]).toLowerCase()}function ze(t,e,i){return Math.max(e,Math.min(i,t))}function Oe(t,e){return(t%e+e)%e}function Ue(t,e,i){return(1-i)*t+i*e}function Be(t){return 0==(t&t-1)&&0!==t}function Fe(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ke(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function Ge(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Ve(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const He={DEG2RAD:Ie,RAD2DEG:De,generateUUID:Ne,clamp:ze,euclideanModulo:Oe,mapLinear:function(t,e,i,n,r){return n+(t-e)*(r-n)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:Ue,damp:function(t,e,i,n){return Ue(t,e,1-Math.exp(-i*n))},pingpong:function(t,e=1){return e-Math.abs(Oe(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(Pe=t);let e=Pe+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*Ie},radToDeg:function(t){return t*De},isPowerOfTwo:Be,ceilPowerOfTwo:Fe,floorPowerOfTwo:ke,setQuaternionFromProperEuler:function(t,e,i,n,r){const s=Math.cos,a=Math.sin,o=s(i/2),l=a(i/2),c=s((e+n)/2),h=a((e+n)/2),u=s((e-n)/2),d=a((e-n)/2),p=s((n-e)/2),m=a((n-e)/2);switch(r){case"XYX":t.set(o*h,l*u,l*d,o*c);break;case"YZY":t.set(l*d,o*h,l*u,o*c);break;case"ZXZ":t.set(l*u,l*d,o*h,o*c);break;case"XZX":t.set(o*h,l*m,l*p,o*c);break;case"YXY":t.set(l*p,o*h,l*m,o*c);break;case"ZYZ":t.set(l*m,l*p,o*h,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Ve,denormalize:Ge};class We{constructor(t=0,e=0){We.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),n=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*i-s*n+t.x,this.y=r*n+s*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class je{constructor(){je.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1]}set(t,e,i,n,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=n,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],c=i[4],h=i[7],u=i[2],d=i[5],p=i[8],m=n[0],f=n[3],g=n[6],v=n[1],x=n[4],_=n[7],y=n[2],M=n[5],b=n[8];return r[0]=s*m+a*v+o*y,r[3]=s*f+a*x+o*M,r[6]=s*g+a*_+o*b,r[1]=l*m+c*v+h*y,r[4]=l*f+c*x+h*M,r[7]=l*g+c*_+h*b,r[2]=u*m+d*v+p*y,r[5]=u*f+d*x+p*M,r[8]=u*g+d*_+p*b,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-i*r*c+i*a*o+n*r*l-n*s*o}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=h*m,t[1]=(n*l-c*i)*m,t[2]=(a*i-n*s)*m,t[3]=u*m,t[4]=(c*e-n*o)*m,t[5]=(n*r-a*e)*m,t[6]=d*m,t[7]=(i*o-l*e)*m,t[8]=(s*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,n,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(i*o,i*l,-i*(o*s+l*a)+s+t,-n*l,n*o,-n*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(qe.makeScale(t,e)),this}rotate(t){return this.premultiply(qe.makeRotation(-t)),this}translate(t,e){return this.premultiply(qe.makeTranslation(t,e)),this}makeTranslation(t,e){return this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const qe=new je;function Xe(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Ye={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Ze(t,e){return new Ye[t](e)}function Je(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}class Ke{constructor(t=0,e=0,i=0,n=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=n}static slerpFlat(t,e,i,n,r,s,a){let o=i[n+0],l=i[n+1],c=i[n+2],h=i[n+3];const u=r[s+0],d=r[s+1],p=r[s+2],m=r[s+3];if(0===a)return t[e+0]=o,t[e+1]=l,t[e+2]=c,void(t[e+3]=h);if(1===a)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=m);if(h!==m||o!==u||l!==d||c!==p){let t=1-a;const e=o*u+l*d+c*p+h*m,i=e>=0?1:-1,n=1-e*e;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,e*i);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,i,n,r,s){const a=i[n],o=i[n+1],l=i[n+2],c=i[n+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){const i=t._x,n=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(i/2),c=a(n/2),h=a(r/2),u=o(i/2),d=o(n/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,n=Math.sin(i);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],n=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=i+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-n)*t}else if(i>a&&i>h){const t=2*Math.sqrt(1+i-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(n+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-i-h);this._w=(r-l)/t,this._x=(n+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-i-a);this._w=(s-n)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ze(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const n=Math.min(1,e/i);return this.slerp(t,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,n=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=i*c+s*a+n*l-r*o,this._y=n*c+s*o+r*a-i*l,this._z=r*c+s*l+i*o-n*a,this._w=s*c-i*a-n*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*t._w+i*t._x+n*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*i+e*this._x,this._y=t*n+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=i*h+this._x*u,this._y=n*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=Math.random(),e=Math.sqrt(1-t),i=Math.sqrt(t),n=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(e*Math.cos(n),i*Math.sin(r),i*Math.cos(r),e*Math.sin(n))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class $e{constructor(t=0,e=0,i=0){$e.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(ti.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ti.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*n,this.y=r[1]*e+r[4]*i+r[7]*n,this.z=r[2]*e+r[5]*i+r[8]*n,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=t.elements,s=1/(r[3]*e+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*e+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*e+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*n-a*i,c=o*i+a*e-r*n,h=o*n+r*i-s*e,u=-r*e-s*i-a*n;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*n,this.y=r[1]*e+r[5]*i+r[9]*n,this.z=r[2]*e+r[6]*i+r[10]*n,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,n=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return Qe.copy(this).projectOnVector(t),this.sub(Qe)}reflect(t){return this.sub(Qe.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ze(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const n=Math.sin(e)*t;return this.x=n*Math.sin(i),this.y=Math.cos(e)*t,this.z=n*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=n,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=2*(Math.random()-.5),e=Math.random()*Math.PI*2,i=Math.sqrt(1-t**2);return this.x=i*Math.cos(e),this.y=i*Math.sin(e),this.z=t,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Qe=new $e,ti=new Ke;function ei(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function ii(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}const ni=(new je).fromArray([.8224621,.0331941,.0170827,.177538,.9668058,.0723974,-1e-7,1e-7,.9105199]),ri=(new je).fromArray([1.2249401,-.0420569,-.0196376,-.2249404,1.0420571,-.0786361,1e-7,0,1.0982735]),si=new $e;const ai={[Se]:t=>t,[be]:t=>t.convertSRGBToLinear(),[we]:function(t){return t.convertSRGBToLinear(),si.set(t.r,t.g,t.b).applyMatrix3(ri),t.setRGB(si.x,si.y,si.z)}},oi={[Se]:t=>t,[be]:t=>t.convertLinearToSRGB(),[we]:function(t){return si.set(t.r,t.g,t.b).applyMatrix3(ni),t.setRGB(si.x,si.y,si.z).convertLinearToSRGB()}},li={enabled:!1,get legacyMode(){return console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),!this.enabled},set legacyMode(t){console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),this.enabled=!t},get workingColorSpace(){return Se},set workingColorSpace(t){console.warn("THREE.ColorManagement: .workingColorSpace is readonly.")},convert:function(t,e,i){if(!1===this.enabled||e===i||!e||!i)return t;const n=ai[e],r=oi[i];if(void 0===n||void 0===r)throw new Error(`Unsupported color space conversion, "${e}" to "${i}".`);return r(n(t))},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)}};let ci;class hi{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===ci&&(ci=Je("canvas")),ci.width=t.width,ci.height=t.height;const i=ci.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=ci}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Je("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const n=i.getImageData(0,0,t.width,t.height),r=n.data;for(let t=0;t0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==J)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case it:t.x=t.x-Math.floor(t.x);break;case nt:t.x=t.x<0?0:1;break;case rt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case it:t.y=t.y-Math.floor(t.y);break;case nt:t.y=t.y<0?0:1;break;case rt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}}mi.DEFAULT_IMAGE=null,mi.DEFAULT_MAPPING=J,mi.DEFAULT_ANISOTROPY=1;class fi{constructor(t=0,e=0,i=0,n=1){fi.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=n}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,n){return this.x=t,this.y=e,this.z=i,this.w=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,n,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)o&&t>v?tv?or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,i=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Mi),Mi.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Li),Ri.subVectors(this.max,Li),Si.subVectors(t.a,Li),wi.subVectors(t.b,Li),Ti.subVectors(t.c,Li),Ai.subVectors(wi,Si),Ei.subVectors(Ti,wi),Ci.subVectors(Si,Ti);let e=[0,-Ai.z,Ai.y,0,-Ei.z,Ei.y,0,-Ci.z,Ci.y,Ai.z,0,-Ai.x,Ei.z,0,-Ei.x,Ci.z,0,-Ci.x,-Ai.y,Ai.x,0,-Ei.y,Ei.x,0,-Ci.y,Ci.x,0];return!!Di(e,Si,wi,Ti,Ri)&&(e=[1,0,0,0,1,0,0,0,1],!!Di(e,Si,wi,Ti,Ri)&&(Pi.crossVectors(Ai,Ei),e=[Pi.x,Pi.y,Pi.z],Di(e,Si,wi,Ti,Ri)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Mi).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Mi).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(yi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),yi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),yi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),yi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),yi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),yi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),yi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),yi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(yi)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const yi=[new $e,new $e,new $e,new $e,new $e,new $e,new $e,new $e],Mi=new $e,bi=new _i,Si=new $e,wi=new $e,Ti=new $e,Ai=new $e,Ei=new $e,Ci=new $e,Li=new $e,Ri=new $e,Pi=new $e,Ii=new $e;function Di(t,e,i,n,r){for(let s=0,a=t.length-3;s<=a;s+=3){Ii.fromArray(t,s);const a=r.x*Math.abs(Ii.x)+r.y*Math.abs(Ii.y)+r.z*Math.abs(Ii.z),o=e.dot(Ii),l=i.dot(Ii),c=n.dot(Ii);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const Ni=new _i,zi=new $e,Oi=new $e;class Ui{constructor(t=new $e,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):Ni.setFromPoints(t).getCenter(i);let n=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;zi.subVectors(t,this.center);const e=zi.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(zi,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Oi.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(zi.copy(t.center).add(Oi)),this.expandByPoint(zi.copy(t.center).sub(Oi))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Bi=new $e,Fi=new $e,ki=new $e,Gi=new $e,Vi=new $e,Hi=new $e,Wi=new $e;class ji{constructor(t=new $e,e=new $e(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Bi)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Bi.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Bi.copy(this.origin).addScaledVector(this.direction,e),Bi.distanceToSquared(t))}distanceSqToSegment(t,e,i,n){Fi.copy(t).add(e).multiplyScalar(.5),ki.copy(e).sub(t).normalize(),Gi.copy(this.origin).sub(Fi);const r=.5*t.distanceTo(e),s=-this.direction.dot(ki),a=Gi.dot(this.direction),o=-Gi.dot(ki),l=Gi.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return i&&i.copy(this.origin).addScaledVector(this.direction,h),n&&n.copy(Fi).addScaledVector(ki,u),d}intersectSphere(t,e){Bi.subVectors(t.center,this.origin);const i=Bi.dot(this.direction),n=Bi.dot(Bi)-i*i,r=t.radius*t.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,n,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(i=(t.min.x-u.x)*l,n=(t.max.x-u.x)*l):(i=(t.max.x-u.x)*l,n=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),i>s||r>n?null:((r>i||isNaN(i))&&(i=r),(s=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o=0?i:n,e)))}intersectsBox(t){return null!==this.intersectBox(t,Bi)}intersectTriangle(t,e,i,n,r){Vi.subVectors(e,t),Hi.subVectors(i,t),Wi.crossVectors(Vi,Hi);let s,a=this.direction.dot(Wi);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}Gi.subVectors(this.origin,t);const o=s*this.direction.dot(Hi.crossVectors(Gi,Hi));if(o<0)return null;const l=s*this.direction.dot(Vi.cross(Gi));if(l<0)return null;if(o+l>a)return null;const c=-s*Gi.dot(Wi);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class qi{constructor(){qi.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}set(t,e,i,n,r,s,a,o,l,c,h,u,d,p,m,f){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new qi).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,n=1/Xi.setFromMatrixColumn(t,0).length(),r=1/Xi.setFromMatrixColumn(t,1).length(),s=1/Xi.setFromMatrixColumn(t,2).length();return e[0]=i[0]*n,e[1]=i[1]*n,e[2]=i[2]*n,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*s,e[9]=i[9]*s,e[10]=i[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,n=t.y,r=t.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),l=Math.sin(n),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=i+n*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=n+i*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t+r*a,e[4]=n*a-i,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=i*a-n,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=n+i*a,e[1]=i+n*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=n*l-i,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=i*l-n,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=n*h+i,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=i*h+n,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=i*h-n,e[2]=n*h-i,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Zi,t,Ji)}lookAt(t,e,i){const n=this.elements;return Qi.subVectors(t,e),0===Qi.lengthSq()&&(Qi.z=1),Qi.normalize(),Ki.crossVectors(i,Qi),0===Ki.lengthSq()&&(1===Math.abs(i.z)?Qi.x+=1e-4:Qi.z+=1e-4,Qi.normalize(),Ki.crossVectors(i,Qi)),Ki.normalize(),$i.crossVectors(Qi,Ki),n[0]=Ki.x,n[4]=$i.x,n[8]=Qi.x,n[1]=Ki.y,n[5]=$i.y,n[9]=Qi.y,n[2]=Ki.z,n[6]=$i.z,n[10]=Qi.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[4],o=i[8],l=i[12],c=i[1],h=i[5],u=i[9],d=i[13],p=i[2],m=i[6],f=i[10],g=i[14],v=i[3],x=i[7],_=i[11],y=i[15],M=n[0],b=n[4],S=n[8],w=n[12],T=n[1],A=n[5],E=n[9],C=n[13],L=n[2],R=n[6],P=n[10],I=n[14],D=n[3],N=n[7],z=n[11],O=n[15];return r[0]=s*M+a*T+o*L+l*D,r[4]=s*b+a*A+o*R+l*N,r[8]=s*S+a*E+o*P+l*z,r[12]=s*w+a*C+o*I+l*O,r[1]=c*M+h*T+u*L+d*D,r[5]=c*b+h*A+u*R+d*N,r[9]=c*S+h*E+u*P+d*z,r[13]=c*w+h*C+u*I+d*O,r[2]=p*M+m*T+f*L+g*D,r[6]=p*b+m*A+f*R+g*N,r[10]=p*S+m*E+f*P+g*z,r[14]=p*w+m*C+f*I+g*O,r[3]=v*M+x*T+_*L+y*D,r[7]=v*b+x*A+_*R+y*N,r[11]=v*S+x*E+_*P+y*z,r[15]=v*w+x*C+_*I+y*O,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],n=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-n*l*h-r*a*u+i*l*u+n*a*d-i*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-n*s*d+n*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+i*s*d+r*a*c-i*l*c)+t[15]*(-n*a*c-e*o*h+e*a*u+n*s*h-i*s*u+i*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const n=this.elements;return t.isVector3?(n[12]=t.x,n[13]=t.y,n[14]=t.z):(n[12]=t,n[13]=e,n[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],m=t[13],f=t[14],g=t[15],v=h*f*l-m*u*l+m*o*d-a*f*d-h*o*g+a*u*g,x=p*u*l-c*f*l-p*o*d+s*f*d+c*o*g-s*u*g,_=c*m*l-p*h*l+p*a*d-s*m*d-c*a*g+s*h*g,y=p*h*o-c*m*o-p*a*u+s*m*u+c*a*f-s*h*f,M=e*v+i*x+n*_+r*y;if(0===M)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/M;return t[0]=v*b,t[1]=(m*u*r-h*f*r-m*n*d+i*f*d+h*n*g-i*u*g)*b,t[2]=(a*f*r-m*o*r+m*n*l-i*f*l-a*n*g+i*o*g)*b,t[3]=(h*o*r-a*u*r-h*n*l+i*u*l+a*n*d-i*o*d)*b,t[4]=x*b,t[5]=(c*f*r-p*u*r+p*n*d-e*f*d-c*n*g+e*u*g)*b,t[6]=(p*o*r-s*f*r-p*n*l+e*f*l+s*n*g-e*o*g)*b,t[7]=(s*u*r-c*o*r+c*n*l-e*u*l-s*n*d+e*o*d)*b,t[8]=_*b,t[9]=(p*h*r-c*m*r-p*i*d+e*m*d+c*i*g-e*h*g)*b,t[10]=(s*m*r-p*a*r+p*i*l-e*m*l-s*i*g+e*a*g)*b,t[11]=(c*a*r-s*h*r-c*i*l+e*h*l+s*i*d-e*a*d)*b,t[12]=y*b,t[13]=(c*m*n-p*h*n+p*i*u-e*m*u-c*i*f+e*h*f)*b,t[14]=(p*a*n-s*m*n-p*i*o+e*m*o+s*i*f-e*a*f)*b,t[15]=(s*h*n-c*a*n+c*i*o-e*h*o-s*i*u+e*a*u)*b,this}scale(t){const e=this.elements,i=t.x,n=t.y,r=t.z;return e[0]*=i,e[4]*=n,e[8]*=r,e[1]*=i,e[5]*=n,e[9]*=r,e[2]*=i,e[6]*=n,e[10]*=r,e[3]*=i,e[7]*=n,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],n=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,n))}makeTranslation(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+i,l*a-n*o,l*o+n*a,0,l*a+n*o,c*a+i,c*o-n*s,0,l*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,n,r,s){return this.set(1,i,r,0,t,1,s,0,e,n,1,0,0,0,0,1),this}compose(t,e,i){const n=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,m=s*c,f=s*h,g=a*h,v=o*l,x=o*c,_=o*h,y=i.x,M=i.y,b=i.z;return n[0]=(1-(m+g))*y,n[1]=(d+_)*y,n[2]=(p-x)*y,n[3]=0,n[4]=(d-_)*M,n[5]=(1-(u+g))*M,n[6]=(f+v)*M,n[7]=0,n[8]=(p+x)*b,n[9]=(f-v)*b,n[10]=(1-(u+m))*b,n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,this}decompose(t,e,i){const n=this.elements;let r=Xi.set(n[0],n[1],n[2]).length();const s=Xi.set(n[4],n[5],n[6]).length(),a=Xi.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),t.x=n[12],t.y=n[13],t.z=n[14],Yi.copy(this);const o=1/r,l=1/s,c=1/a;return Yi.elements[0]*=o,Yi.elements[1]*=o,Yi.elements[2]*=o,Yi.elements[4]*=l,Yi.elements[5]*=l,Yi.elements[6]*=l,Yi.elements[8]*=c,Yi.elements[9]*=c,Yi.elements[10]*=c,e.setFromRotationMatrix(Yi),i.x=r,i.y=s,i.z=a,this}makePerspective(t,e,i,n,r,s){const a=this.elements,o=2*r/(e-t),l=2*r/(i-n),c=(e+t)/(e-t),h=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,n,r,s){const a=this.elements,o=1/(e-t),l=1/(i-n),c=1/(s-r),h=(e+t)*o,u=(i+n)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Xi=new $e,Yi=new qi,Zi=new $e(0,0,0),Ji=new $e(1,1,1),Ki=new $e,$i=new $e,Qi=new $e,tn=new qi,en=new Ke;class nn{constructor(t=0,e=0,i=0,n=nn.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=n}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,n=this._order){return this._x=t,this._y=e,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const n=t.elements,r=n[0],s=n[4],a=n[8],o=n[1],l=n[5],c=n[9],h=n[2],u=n[6],d=n[10];switch(e){case"XYZ":this._y=Math.asin(ze(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-ze(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(ze(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ze(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(ze(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ze(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return tn.makeRotationFromQuaternion(t),this.setFromRotationMatrix(tn,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return en.setFromEuler(this),this.setFromQuaternion(en,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}nn.DEFAULT_ORDER="XYZ";class rn{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(i=i.concat(r))}return i}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(hn,t,un),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(hn,dn,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);const e=this.children;for(let i=0,n=e.length;i0&&(n.userData=this.userData),n.layers=this.layers.mask,n.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(n.matrixAutoUpdate=!1),this.isInstancedMesh&&(n.type="InstancedMesh",n.count=this.count,n.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(n.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?n.background=this.background.toJSON():this.background.isTexture&&(n.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(n.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){n.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,n=i.length;e0){n.children=[];for(let e=0;e0){n.animations=[];for(let e=0;e0&&(i.geometries=e),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),l.length>0&&(i.skeletons=l),c.length>0&&(i.animations=c),h.length>0&&(i.nodes=h)}return i.object=n,i;function s(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(t,e,i,n,r){_n.subVectors(n,e),yn.subVectors(i,e),Mn.subVectors(t,e);const s=_n.dot(_n),a=_n.dot(yn),o=_n.dot(Mn),l=yn.dot(yn),c=yn.dot(Mn),h=s*l-a*a;if(0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,n){return this.getBarycoord(t,e,i,n,bn),bn.x>=0&&bn.y>=0&&bn.x+bn.y<=1}static getUV(t,e,i,n,r,s,a,o){return this.getBarycoord(t,e,i,n,bn),o.set(0,0),o.addScaledVector(r,bn.x),o.addScaledVector(s,bn.y),o.addScaledVector(a,bn.z),o}static isFrontFacing(t,e,i,n){return _n.subVectors(i,e),yn.subVectors(t,e),_n.cross(yn).dot(n)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,n){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[n]),this}setFromAttributeAndIndices(t,e,i,n){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,n),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return _n.subVectors(this.c,this.b),yn.subVectors(this.a,this.b),.5*_n.cross(yn).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Ln.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Ln.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,i,n,r){return Ln.getUV(t,this.a,this.b,this.c,e,i,n,r)}containsPoint(t){return Ln.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Ln.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,n=this.b,r=this.c;let s,a;Sn.subVectors(n,i),wn.subVectors(r,i),An.subVectors(t,i);const o=Sn.dot(An),l=wn.dot(An);if(o<=0&&l<=0)return e.copy(i);En.subVectors(t,n);const c=Sn.dot(En),h=wn.dot(En);if(c>=0&&h<=c)return e.copy(n);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(i).addScaledVector(Sn,s);Cn.subVectors(t,r);const d=Sn.dot(Cn),p=wn.dot(Cn);if(p>=0&&d<=p)return e.copy(r);const m=d*l-o*p;if(m<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(i).addScaledVector(wn,a);const f=c*p-d*h;if(f<=0&&h-c>=0&&d-p>=0)return Tn.subVectors(r,n),a=(h-c)/(h-c+(d-p)),e.copy(n).addScaledVector(Tn,a);const g=1/(f+m+u);return s=m*g,a=u*g,e.copy(i).addScaledVector(Sn,s).addScaledVector(wn,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let Rn=0;class Pn extends Le{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:Rn++}),this.uuid=Ne(),this.name="",this.type="Material",this.blending=d,this.side=l,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=A,this.blendDst=E,this.blendEquation=v,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=O,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Te,this.stencilZFail=Te,this.stencilZPass=Te,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}const n=this[e];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[e]=i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),this.blending!==d&&(i.blending=this.blending),this.side!==l&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.colorWrite=this.colorWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(i.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.forceSinglePass&&(i.forceSinglePass=this.forceSinglePass),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=this.flatShading),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=n(t.textures),r=n(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let n=0;n!==t;++n)i[n]=e[n].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}const In={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Dn={h:0,s:0,l:0},Nn={h:0,s:0,l:0};function zn(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class On{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=be){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,li.toWorkingColorSpace(this,e),this}setRGB(t,e,i,n=li.workingColorSpace){return this.r=t,this.g=e,this.b=i,li.toWorkingColorSpace(this,n),this}setHSL(t,e,i,n=li.workingColorSpace){if(t=Oe(t,1),e=ze(e,0,1),i=ze(i,0,1),0===e)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+e):i+e-i*e,r=2*i-n;this.r=zn(r,n,t+1/3),this.g=zn(r,n,t),this.b=zn(r,n,t-1/3)}return li.toWorkingColorSpace(this,n),this}setStyle(t,e=be){function i(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let n;if(n=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const s=n[1],a=n[2];switch(s){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,li.toWorkingColorSpace(this,e),i(r[4]),this;if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,li.toWorkingColorSpace(this,e),i(r[4]),this;break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a)){const t=parseFloat(r[1])/360,n=parseFloat(r[2])/100,s=parseFloat(r[3])/100;return i(r[4]),this.setHSL(t,n,s,e)}break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=n[1],r=i.length;if(3===r)return this.r=parseInt(i.charAt(0)+i.charAt(0),16)/255,this.g=parseInt(i.charAt(1)+i.charAt(1),16)/255,this.b=parseInt(i.charAt(2)+i.charAt(2),16)/255,li.toWorkingColorSpace(this,e),this;if(6===r)return this.r=parseInt(i.charAt(0)+i.charAt(1),16)/255,this.g=parseInt(i.charAt(2)+i.charAt(3),16)/255,this.b=parseInt(i.charAt(4)+i.charAt(5),16)/255,li.toWorkingColorSpace(this,e),this;console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=be){const i=In[t.toLowerCase()];return void 0!==i?this.setHex(i,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ei(t.r),this.g=ei(t.g),this.b=ei(t.b),this}copyLinearToSRGB(t){return this.r=ii(t.r),this.g=ii(t.g),this.b=ii(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=be){return li.fromWorkingColorSpace(Un.copy(this),t),ze(255*Un.r,0,255)<<16^ze(255*Un.g,0,255)<<8^ze(255*Un.b,0,255)<<0}getHexString(t=be){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=li.workingColorSpace){li.fromWorkingColorSpace(Un.copy(this),e);const i=Un.r,n=Un.g,r=Un.b,s=Math.max(i,n,r),a=Math.min(i,n,r);let o,l;const c=(a+s)/2;if(a===s)o=0,l=0;else{const t=s-a;switch(l=c<=.5?t/(s+a):t/(2-s-a),s){case i:o=(n-r)/t+(n>-e-14,n[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(n[t]=e+15<<10,n[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(n[t]=31744,n[256|t]=64512,r[t]=24,r[256|t]=24):(n[t]=31744,n[256|t]=64512,r[t]=13,r[256|t]=13)}const s=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;0==(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,s[t]=e|i}for(let t=1024;t<2048;++t)s[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:n,shiftTable:r,mantissaTable:s,exponentTable:a,offsetTable:o}}function Gn(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=ze(t,-65504,65504),Fn.floatView[0]=t;const e=Fn.uint32View[0],i=e>>23&511;return Fn.baseTable[i]+((8388607&e)>>Fn.shiftTable[i])}function Vn(t){const e=t>>10;return Fn.uint32View[0]=Fn.mantissaTable[Fn.offsetTable[e]+(1023&t)]+Fn.exponentTable[e],Fn.floatView[0]}const Hn={toHalfFloat:Gn,fromHalfFloat:Vn},Wn=new $e,jn=new We;class qn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=Ae,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let n=0,r=this.itemSize;n0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const n=i[e];t.data.attributes[e]=n.toJSON(t.data)}const n={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],s=[];for(let e=0,n=i.length;e0&&(n[e]=s,r=!0)}r&&(t.data.morphAttributes=n,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const n=t.attributes;for(const t in n){const i=n[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],n=r[t];for(let t=0,r=n.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}if(rr.copy(r).invert(),sr.copy(t.ray).applyMatrix4(rr),null!==i.boundingBox&&!1===sr.intersectsBox(i.boundingBox))return;let s;const a=i.index,o=i.attributes.position,l=i.attributes.uv,c=i.attributes.uv2,h=i.groups,u=i.drawRange;if(null!==a)if(Array.isArray(n))for(let i=0,r=h.length;ii.far?null:{distance:u,point:vr.clone(),object:t}}(t,e,i,n,lr,cr,hr,gr);if(u){r&&(pr.fromBufferAttribute(r,a),mr.fromBufferAttribute(r,o),fr.fromBufferAttribute(r,h),u.uv=Ln.getUV(gr,lr,cr,hr,pr,mr,fr,new We)),s&&(pr.fromBufferAttribute(s,a),mr.fromBufferAttribute(s,o),fr.fromBufferAttribute(s,h),u.uv2=Ln.getUV(gr,lr,cr,hr,pr,mr,fr,new We));const t={a:a,b:o,c:h,normal:new $e,materialIndex:0};Ln.getNormal(lr,cr,hr,t.normal),u.face=t}return u}class yr extends nr{constructor(t=1,e=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,i,n,r,s,p,m,f,g,v){const x=s/f,_=p/g,y=s/2,M=p/2,b=m/2,S=f+1,w=g+1;let T=0,A=0;const E=new $e;for(let s=0;s0?1:-1,c.push(E.x,E.y,E.z),h.push(o/f),h.push(1-s/g),T+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Ar extends xn{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new qi,this.projectionMatrix=new qi,this.projectionMatrixInverse=new qi}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}class Er extends Ar{constructor(t=50,e=1,i=.1,n=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*De*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*Ie*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*De*Math.atan(Math.tan(.5*Ie*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,i,n,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*Ie*this.fov)/this.zoom,i=2*e,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/t,e-=s.offsetY*i/a,n*=s.width/t,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,e,e-i,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const Cr=-90;class Lr extends xn{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i;const n=new Er(Cr,1,t,e);n.layers=this.layers,n.up.set(0,1,0),n.lookAt(1,0,0),this.add(n);const r=new Er(Cr,1,t,e);r.layers=this.layers,r.up.set(0,1,0),r.lookAt(-1,0,0),this.add(r);const s=new Er(Cr,1,t,e);s.layers=this.layers,s.up.set(0,0,-1),s.lookAt(0,1,0),this.add(s);const a=new Er(Cr,1,t,e);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(0,-1,0),this.add(a);const o=new Er(Cr,1,t,e);o.layers=this.layers,o.up.set(0,1,0),o.lookAt(0,0,1),this.add(o);const l=new Er(Cr,1,t,e);l.layers=this.layers,l.up.set(0,1,0),l.lookAt(0,0,-1),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const i=this.renderTarget,[n,r,s,a,o,l]=this.children,c=t.getRenderTarget(),h=t.toneMapping,u=t.xr.enabled;t.toneMapping=W,t.xr.enabled=!1;const d=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0),t.render(e,n),t.setRenderTarget(i,1),t.render(e,r),t.setRenderTarget(i,2),t.render(e,s),t.setRenderTarget(i,3),t.render(e,a),t.setRenderTarget(i,4),t.render(e,o),i.texture.generateMipmaps=d,t.setRenderTarget(i,5),t.render(e,l),t.setRenderTarget(c),t.toneMapping=h,t.xr.enabled=u,i.texture.needsPMREMUpdate=!0}}class Rr extends mi{constructor(t,e,i,n,r,s,a,o,l,c){super(t=void 0!==t?t:[],e=void 0!==e?e:K,i,n,r,s,a,o,l,c),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class Pr extends gi{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},n=[i,i,i,i,i,i];this.texture=new Rr(n,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:lt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},n=new yr(5,5,5),r=new Tr({name:"CubemapFromEquirect",uniforms:Mr(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:c,blending:u});r.uniforms.tEquirect.value=e;const s=new xr(n,r),a=e.minFilter;e.minFilter===ht&&(e.minFilter=lt);return new Lr(1,10,this).update(t,s),e.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,i,n){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,n);t.setRenderTarget(r)}}const Ir=new $e,Dr=new $e,Nr=new je;class zr{constructor(t=new $e(1,0,0),e=0){this.isPlane=!0,this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,i){const n=Ir.subVectors(i,e).cross(Dr.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(t).addScaledVector(this.normal,-this.distanceToPoint(t))}intersectLine(t,e){const i=t.delta(Ir),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||Nr.getNormalMatrix(t),n=this.coplanarPoint(Ir).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const Or=new Ui,Ur=new $e;class Br{constructor(t=new zr,e=new zr,i=new zr,n=new zr,r=new zr,s=new zr){this.planes=[t,e,i,n,r,s]}set(t,e,i,n,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t){const e=this.planes,i=t.elements,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7],u=i[8],d=i[9],p=i[10],m=i[11],f=i[12],g=i[13],v=i[14],x=i[15];return e[0].setComponents(a-n,h-o,m-u,x-f).normalize(),e[1].setComponents(a+n,h+o,m+u,x+f).normalize(),e[2].setComponents(a+r,h+l,m+d,x+g).normalize(),e[3].setComponents(a-r,h-l,m-d,x-g).normalize(),e[4].setComponents(a-s,h-c,m-p,x-v).normalize(),e[5].setComponents(a+s,h+c,m+p,x+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),Or.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(Or)}intersectsSprite(t){return Or.center.set(0,0,0),Or.radius=.7071067811865476,Or.applyMatrix4(t.matrixWorld),this.intersectsSphere(Or)}intersectsSphere(t){const e=this.planes,i=t.center,n=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,Ur.y=n.normal.y>0?t.max.y:t.min.y,Ur.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(Ur)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function Fr(){let t=null,e=!1,i=null,n=null;function r(e,s){i(e,s),n=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==i&&(n=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(t){i=t},setContext:function(e){t=e}}}function kr(t,e){const i=e.isWebGL2,n=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),n.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const i=n.get(e);i&&(t.deleteBuffer(i.buffer),n.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=n.get(e);return void((!t||t.version 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif",iridescence_fragment:"#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660, 0.0556434,\n\t\t-1.5371385, 1.8760108, -0.2040259,\n\t\t-0.4985314, 0.0415560, 1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\t return vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat R21 = R12;\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos.xyz );\n\t\tvec3 vSigmaY = dFdy( surf_pos.xyz );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_v0 0.339\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_v1 0.276\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_v4 0.046\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_v5 0.016\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_v6 0.0038\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"vec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( LEGACY_LIGHTS )\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#else\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX_Iridescence( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness );\n\t#else\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometry.viewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform ivec2 morphTargetsTextureSize;\n\t\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec2 packDepthToRG( in highp float v ) {\n\treturn packDepthToRGBA( v ).yx;\n}\nfloat unpackRGToDepth( const in highp vec2 v ) {\n\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tuniform int boneTextureSize;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tfloat j = i * 4.0;\n\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\ty = dy * ( y + 0.5 );\n\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\treturn bone;\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\t\n\t\tvec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Hr={common:{diffuse:{value:new On(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new je},uv2Transform:{value:new je},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new We(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new On(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new On(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new je}},sprite:{diffuse:{value:new On(16777215)},opacity:{value:1},center:{value:new We(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new je}}},Wr={basic:{uniforms:br([Hr.common,Hr.specularmap,Hr.envmap,Hr.aomap,Hr.lightmap,Hr.fog]),vertexShader:Vr.meshbasic_vert,fragmentShader:Vr.meshbasic_frag},lambert:{uniforms:br([Hr.common,Hr.specularmap,Hr.envmap,Hr.aomap,Hr.lightmap,Hr.emissivemap,Hr.bumpmap,Hr.normalmap,Hr.displacementmap,Hr.fog,Hr.lights,{emissive:{value:new On(0)}}]),vertexShader:Vr.meshlambert_vert,fragmentShader:Vr.meshlambert_frag},phong:{uniforms:br([Hr.common,Hr.specularmap,Hr.envmap,Hr.aomap,Hr.lightmap,Hr.emissivemap,Hr.bumpmap,Hr.normalmap,Hr.displacementmap,Hr.fog,Hr.lights,{emissive:{value:new On(0)},specular:{value:new On(1118481)},shininess:{value:30}}]),vertexShader:Vr.meshphong_vert,fragmentShader:Vr.meshphong_frag},standard:{uniforms:br([Hr.common,Hr.envmap,Hr.aomap,Hr.lightmap,Hr.emissivemap,Hr.bumpmap,Hr.normalmap,Hr.displacementmap,Hr.roughnessmap,Hr.metalnessmap,Hr.fog,Hr.lights,{emissive:{value:new On(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Vr.meshphysical_vert,fragmentShader:Vr.meshphysical_frag},toon:{uniforms:br([Hr.common,Hr.aomap,Hr.lightmap,Hr.emissivemap,Hr.bumpmap,Hr.normalmap,Hr.displacementmap,Hr.gradientmap,Hr.fog,Hr.lights,{emissive:{value:new On(0)}}]),vertexShader:Vr.meshtoon_vert,fragmentShader:Vr.meshtoon_frag},matcap:{uniforms:br([Hr.common,Hr.bumpmap,Hr.normalmap,Hr.displacementmap,Hr.fog,{matcap:{value:null}}]),vertexShader:Vr.meshmatcap_vert,fragmentShader:Vr.meshmatcap_frag},points:{uniforms:br([Hr.points,Hr.fog]),vertexShader:Vr.points_vert,fragmentShader:Vr.points_frag},dashed:{uniforms:br([Hr.common,Hr.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Vr.linedashed_vert,fragmentShader:Vr.linedashed_frag},depth:{uniforms:br([Hr.common,Hr.displacementmap]),vertexShader:Vr.depth_vert,fragmentShader:Vr.depth_frag},normal:{uniforms:br([Hr.common,Hr.bumpmap,Hr.normalmap,Hr.displacementmap,{opacity:{value:1}}]),vertexShader:Vr.meshnormal_vert,fragmentShader:Vr.meshnormal_frag},sprite:{uniforms:br([Hr.sprite,Hr.fog]),vertexShader:Vr.sprite_vert,fragmentShader:Vr.sprite_frag},background:{uniforms:{uvTransform:{value:new je},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Vr.background_vert,fragmentShader:Vr.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:Vr.backgroundCube_vert,fragmentShader:Vr.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Vr.cube_vert,fragmentShader:Vr.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Vr.equirect_vert,fragmentShader:Vr.equirect_frag},distanceRGBA:{uniforms:br([Hr.common,Hr.displacementmap,{referencePosition:{value:new $e},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Vr.distanceRGBA_vert,fragmentShader:Vr.distanceRGBA_frag},shadow:{uniforms:br([Hr.lights,Hr.fog,{color:{value:new On(0)},opacity:{value:1}}]),vertexShader:Vr.shadow_vert,fragmentShader:Vr.shadow_frag}};Wr.physical={uniforms:br([Wr.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new We(1,1)},clearcoatNormalMap:{value:null},iridescence:{value:0},iridescenceMap:{value:null},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},sheen:{value:0},sheenColor:{value:new On(0)},sheenColorMap:{value:null},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new We},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new On(0)},specularIntensity:{value:1},specularIntensityMap:{value:null},specularColor:{value:new On(1,1,1)},specularColorMap:{value:null}}]),vertexShader:Vr.meshphysical_vert,fragmentShader:Vr.meshphysical_frag};const jr={r:0,b:0,g:0};function qr(t,e,i,n,r,s,a){const o=new On(0);let h,u,d=!0===s?0:1,p=null,m=0,f=null;function g(e,i){e.getRGB(jr,Sr(t)),n.buffers.color.setClear(jr.r,jr.g,jr.b,i,a)}return{getClearColor:function(){return o},setClearColor:function(t,e=1){o.set(t),d=e,g(o,d)},getClearAlpha:function(){return d},setClearAlpha:function(t){d=t,g(o,d)},render:function(n,s){let a=!1,v=!0===s.isScene?s.background:null;if(v&&v.isTexture){v=(s.backgroundBlurriness>0?i:e).get(v)}const x=t.xr,_=x.getSession&&x.getSession();_&&"additive"===_.environmentBlendMode&&(v=null),null===v?g(o,d):v&&v.isColor&&(g(v,1),a=!0),(t.autoClear||a)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),v&&(v.isCubeTexture||v.mapping===et)?(void 0===u&&(u=new xr(new yr(1,1,1),new Tr({name:"BackgroundCubeMaterial",uniforms:Mr(Wr.backgroundCube.uniforms),vertexShader:Wr.backgroundCube.vertexShader,fragmentShader:Wr.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1})),u.geometry.deleteAttribute("normal"),u.geometry.deleteAttribute("uv"),u.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(u.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(u)),u.material.uniforms.envMap.value=v,u.material.uniforms.flipEnvMap.value=v.isCubeTexture&&!1===v.isRenderTargetTexture?-1:1,u.material.uniforms.backgroundBlurriness.value=s.backgroundBlurriness,u.material.uniforms.backgroundIntensity.value=s.backgroundIntensity,u.material.toneMapped=v.encoding!==xe,p===v&&m===v.version&&f===t.toneMapping||(u.material.needsUpdate=!0,p=v,m=v.version,f=t.toneMapping),u.layers.enableAll(),n.unshift(u,u.geometry,u.material,0,0,null)):v&&v.isTexture&&(void 0===h&&(h=new xr(new Gr(2,2),new Tr({name:"BackgroundMaterial",uniforms:Mr(Wr.background.uniforms),vertexShader:Wr.background.vertexShader,fragmentShader:Wr.background.fragmentShader,side:l,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),Object.defineProperty(h.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(h)),h.material.uniforms.t2D.value=v,h.material.uniforms.backgroundIntensity.value=s.backgroundIntensity,h.material.toneMapped=v.encoding!==xe,!0===v.matrixAutoUpdate&&v.updateMatrix(),h.material.uniforms.uvTransform.value.copy(v.matrix),p===v&&m===v.version&&f===t.toneMapping||(h.material.needsUpdate=!0,p=v,m=v.version,f=t.toneMapping),h.layers.enableAll(),n.unshift(h,h.geometry,h.material,0,0,null))}}}function Xr(t,e,i,n){const r=t.getParameter(34921),s=n.isWebGL2?null:e.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},l=p(null);let c=l,h=!1;function u(e){return n.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function d(e){return n.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function p(t){const e=[],i=[],n=[];for(let t=0;t=0){const i=r[e];let n=s[e];if(void 0===n&&("instanceMatrix"===e&&t.instanceMatrix&&(n=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(n=t.instanceColor)),void 0===i)return!0;if(i.attribute!==n)return!0;if(n&&i.data!==n.data)return!0;a++}}return c.attributesNum!==a||c.index!==n}(r,_,d,y),M&&function(t,e,i,n){const r={},s=e.attributes;let a=0;const o=i.getAttributes();for(const e in o){if(o[e].location>=0){let i=s[e];void 0===i&&("instanceMatrix"===e&&t.instanceMatrix&&(i=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(i=t.instanceColor));const n={};n.attribute=i,i&&i.data&&(n.data=i.data),r[e]=n,a++}}c.attributes=r,c.attributesNum=a,c.index=n}(r,_,d,y)}else{const t=!0===l.wireframe;c.geometry===_.id&&c.program===d.id&&c.wireframe===t||(c.geometry=_.id,c.program=d.id,c.wireframe=t,M=!0)}null!==y&&i.update(y,34963),(M||h)&&(h=!1,function(r,s,a,o){if(!1===n.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===e.get("ANGLE_instanced_arrays"))return;m();const l=o.attributes,c=a.getAttributes(),h=s.defaultAttributeValues;for(const e in c){const n=c[e];if(n.location>=0){let s=l[e];if(void 0===s&&("instanceMatrix"===e&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===e&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const e=s.normalized,a=s.itemSize,l=i.get(s);if(void 0===l)continue;const c=l.buffer,h=l.type,u=l.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,l=i.stride,d=s.offset;if(i.isInstancedInterleavedBuffer){for(let t=0;t0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,h=t.getParameter(34930),u=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),m=t.getParameter(34921),f=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),x=u>0,_=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===e.has("EXT_texture_filter_anisotropic")){const i=e.get("EXT_texture_filter_anisotropic");n=t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:f,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:x,floatFragmentTextures:_,floatVertexTextures:x&&_,maxSamples:s?t.getParameter(36183):0}}function Jr(t){const e=this;let i=null,n=0,r=!1,s=!1;const a=new zr,o=new je,l={value:null,needsUpdate:!1};function c(t,i,n,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0);e.numPlanes=n,e.numIntersection=0}();else{const t=s?0:n,e=4*t;let r=m.clippingState||null;l.value=r,r=c(u,o,e,h);for(let t=0;t!==e;++t)r[t]=i[t];m.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=t}}}function Kr(t){let e=new WeakMap;function i(t,e){return e===Q?t.mapping=K:e===tt&&(t.mapping=$),t}function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping;if(s===Q||s===tt){if(e.has(r)){return i(e.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=new Pr(s.height/2);return a.fromEquirectangularTexture(t,r),e.set(r,a),r.addEventListener("dispose",n),i(a.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}class $r extends Ar{constructor(t=-1,e=1,i=1,n=-1,r=.1,s=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-t,s=i+t,a=n+e,o=n-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,a-=e*this.view.offsetY,o=a-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}const Qr=4,ts=[.125,.215,.35,.446,.526,.582],es=20,is=new $r,ns=new On;let rs=null;const ss=(1+Math.sqrt(5))/2,as=1/ss,os=[new $e(1,1,1),new $e(-1,1,1),new $e(1,1,-1),new $e(-1,1,-1),new $e(0,ss,as),new $e(0,ss,-as),new $e(as,0,ss),new $e(-as,0,ss),new $e(ss,as,0),new $e(-ss,as,0)];class ls{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,i=.1,n=100){rs=this._renderer.getRenderTarget(),this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,i,n,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=ds(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=us(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let t=0;tt-Qr?o=ts[a-t+Qr-1]:0===a&&(o=0),n.push(o);const l=1/(s-2),c=-l,h=1+l,u=[c,c,h,c,h,h,c,c,h,h,c,h],d=6,p=6,m=3,f=2,g=1,v=new Float32Array(m*p*d),x=new Float32Array(f*p*d),_=new Float32Array(g*p*d);for(let t=0;t2?0:-1,n=[e,i,0,e+2/3,i,0,e+2/3,i+1,0,e,i,0,e+2/3,i+1,0,e,i+1,0];v.set(n,m*p*t),x.set(u,f*p*t);const r=[t,t,t,t,t,t];_.set(r,g*p*t)}const y=new nr;y.setAttribute("position",new qn(v,m)),y.setAttribute("uv",new qn(x,f)),y.setAttribute("faceIndex",new qn(_,g)),e.push(y),r>Qr&&r--}return{lodPlanes:e,sizeLods:i,sigmas:n}}(n)),this._blurMaterial=function(t,e,i){const n=new Float32Array(es),r=new $e(0,1,0),s=new Tr({name:"SphericalGaussianBlur",defines:{n:es,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r}},vertexShader:ps(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:u,depthTest:!1,depthWrite:!1});return s}(n,t,e)}return n}_compileMaterial(t){const e=new xr(this._lodPlanes[0],t);this._renderer.compile(e,is)}_sceneToCubeUV(t,e,i,n){const r=new Er(90,1,e,i),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,l=o.autoClear,h=o.toneMapping;o.getClearColor(ns),o.toneMapping=W,o.autoClear=!1;const u=new Bn({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),d=new xr(new yr,u);let p=!1;const m=t.background;m?m.isColor&&(u.color.copy(m),t.background=null,p=!0):(u.color.copy(ns),p=!0);for(let e=0;e<6;e++){const i=e%3;0===i?(r.up.set(0,s[e],0),r.lookAt(a[e],0,0)):1===i?(r.up.set(0,0,s[e]),r.lookAt(0,a[e],0)):(r.up.set(0,s[e],0),r.lookAt(0,0,a[e]));const l=this._cubeSize;hs(n,i*l,e>2?l:0,l,l),o.setRenderTarget(n),p&&o.render(d,r),o.render(t,r)}d.geometry.dispose(),d.material.dispose(),o.toneMapping=h,o.autoClear=l,t.background=m}_textureToCubeUV(t,e){const i=this._renderer,n=t.mapping===K||t.mapping===$;n?(null===this._cubemapMaterial&&(this._cubemapMaterial=ds()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===t.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=us());const r=n?this._cubemapMaterial:this._equirectMaterial,s=new xr(this._lodPlanes[0],r);r.uniforms.envMap.value=t;const a=this._cubeSize;hs(e,0,0,3*a,2*a),i.setRenderTarget(e),i.render(s,is)}_applyPMREM(t){const e=this._renderer,i=e.autoClear;e.autoClear=!1;for(let e=1;ees&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${es}`);const f=[];let g=0;for(let t=0;tv-Qr?n-v+Qr:0),4*(this._cubeSize-x),3*x,2*x),o.setRenderTarget(e),o.render(c,is)}}function cs(t,e,i){const n=new gi(t,e,i);return n.texture.mapping=et,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function hs(t,e,i,n,r){t.viewport.set(e,i,n,r),t.scissor.set(e,i,n,r)}function us(){return new Tr({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ps(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:u,depthTest:!1,depthWrite:!1})}function ds(){return new Tr({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ps(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:u,depthTest:!1,depthWrite:!1})}function ps(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function ms(t){let e=new WeakMap,i=null;function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping,a=s===Q||s===tt,o=s===K||s===$;if(a||o){if(r.isRenderTargetTexture&&!0===r.needsPMREMUpdate){r.needsPMREMUpdate=!1;let n=e.get(r);return null===i&&(i=new ls(t)),n=a?i.fromEquirectangular(r,n):i.fromCubemap(r,n),e.set(r,n),n.texture}if(e.has(r))return e.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(t){let e=0;const i=6;for(let n=0;ne.maxTextureSize&&(T=Math.ceil(w/e.maxTextureSize),w=e.maxTextureSize);const A=new Float32Array(w*T*4*p),E=new vi(A,w,T,p);E.type=vt,E.needsUpdate=!0;const C=4*S;for(let R=0;R0)return t;const r=e*i;let s=Es[r];if(void 0===s&&(s=new Float32Array(r),Es[r]=s),0!==e){n.toArray(s,0);for(let n=1,r=0;n!==e;++n)r+=i,t[n].toArray(s,r)}return s}function Ds(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i":" "} ${r}: ${i[t]}`)}return n.join("\n")}(t.getShaderSource(e),n)}return r}function Ra(t,e){const i=function(t){switch(t){case ve:return["Linear","( value )"];case xe:return["sRGB","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+i[0]+i[1]+"; }"}function Pa(t,e){let i;switch(e){case j:i="Linear";break;case q:i="Reinhard";break;case X:i="OptimizedCineon";break;case Y:i="ACESFilmic";break;case Z:i="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),i="Linear"}return"vec3 "+t+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function Ia(t){return""!==t}function Da(t,e){const i=e.numSpotLightShadows+e.numSpotLightMaps-e.numSpotLightShadowsWithMaps;return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,e.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,i).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,e.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function Na(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}const za=/^[ \t]*#include +<([\w\d./]+)>/gm;function Oa(t){return t.replace(za,Ua)}function Ua(t,e){const i=Vr[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return Oa(i)}const Ba=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Fa(t){return t.replace(Ba,ka)}function ka(t,e,i,n){let r="";for(let t=parseInt(e);t0&&(_+="\n"),y=[g,v].filter(Ia).join("\n"),y.length>0&&(y+="\n")):(_=[Ga(i),"#define SHADER_NAME "+i.shaderName,v,i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"",i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+p:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.morphColors&&i.isWebGL2?"#define USE_MORPHCOLORS":"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+i.morphTextureStride:"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_COUNT "+i.morphTargetsCount:"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Ia).join("\n"),y=[g,Ga(i),"#define SHADER_NAME "+i.shaderName,v,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+d:"",i.envMap?"#define "+p:"",i.envMap?"#define "+m:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescence?"#define USE_IRIDESCENCE":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.sheen?"#define USE_SHEEN":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.useLegacyLights?"#define LEGACY_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",i.toneMapping!==W?"#define TONE_MAPPING":"",i.toneMapping!==W?Vr.tonemapping_pars_fragment:"",i.toneMapping!==W?Pa("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.opaque?"#define OPAQUE":"",Vr.encodings_pars_fragment,Ra("linearToOutputTexel",i.outputEncoding),i.useDepthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(Ia).join("\n")),c=Oa(c),c=Da(c,i),c=Na(c,i),h=Oa(h),h=Da(h,i),h=Na(h,i),c=Fa(c),h=Fa(h),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(M="#version 300 es\n",_=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,y=["#define varying in",i.glslVersion===Ee?"":"layout(location = 0) out highp vec4 pc_fragColor;",i.glslVersion===Ee?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+y);const b=M+y+h,S=Ea(r,35633,M+_+c),w=Ea(r,35632,b);if(r.attachShader(x,S),r.attachShader(x,w),void 0!==i.index0AttributeName?r.bindAttribLocation(x,0,i.index0AttributeName):!0===i.morphTargets&&r.bindAttribLocation(x,0,"position"),r.linkProgram(x),t.debug.checkShaderErrors){const t=r.getProgramInfoLog(x).trim(),e=r.getShaderInfoLog(S).trim(),i=r.getShaderInfoLog(w).trim();let n=!0,s=!0;if(!1===r.getProgramParameter(x,35714)){n=!1;const e=La(r,S,"vertex"),i=La(r,w,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(x,35715)+"\n\nProgram Info Log: "+t+"\n"+e+"\n"+i)}else""!==t?console.warn("THREE.WebGLProgram: Program Info Log:",t):""!==e&&""!==i||(s=!1);s&&(this.diagnostics={runnable:n,programLog:t,vertexShader:{log:e,prefix:_},fragmentShader:{log:i,prefix:y}})}let T,A;return r.deleteShader(S),r.deleteShader(w),this.getUniforms=function(){return void 0===T&&(T=new Aa(r,x)),T},this.getAttributes=function(){return void 0===A&&(A=function(t,e){const i={},n=t.getProgramParameter(e,35721);for(let r=0;r0,z=s.clearcoat>0,O=s.iridescence>0;return{isWebGL2:p,shaderID:T,shaderName:s.type,vertexShader:C,fragmentShader:L,defines:s.defines,customVertexShaderID:R,customFragmentShaderID:P,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:g,instancing:!0===_.isInstancedMesh,instancingColor:!0===_.isInstancedMesh&&null!==_.instanceColor,supportsVertexTextures:f,outputEncoding:null===D?t.outputEncoding:!0===D.isXRRenderTarget?D.texture.encoding:ve,map:!!s.map,matcap:!!s.matcap,envMap:!!S,envMapMode:S&&S.mapping,envMapCubeUVHeight:w,lightMap:!!s.lightMap,aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:s.normalMapType===Me,tangentSpaceNormalMap:s.normalMapType===ye,decodeVideoTexture:!!s.map&&!0===s.map.isVideoTexture&&s.map.encoding===xe,clearcoat:z,clearcoatMap:z&&!!s.clearcoatMap,clearcoatRoughnessMap:z&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:z&&!!s.clearcoatNormalMap,iridescence:O,iridescenceMap:O&&!!s.iridescenceMap,iridescenceThicknessMap:O&&!!s.iridescenceThicknessMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularColorMap:!!s.specularColorMap,opaque:!1===s.transparent&&s.blending===d,alphaMap:!!s.alphaMap,alphaTest:N,gradientMap:!!s.gradientMap,sheen:s.sheen>0,sheenColorMap:!!s.sheenColorMap,sheenRoughnessMap:!!s.sheenRoughnessMap,transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!M.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!M.attributes.color&&4===M.attributes.color.itemSize,vertexUvs:!!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatMap||s.clearcoatRoughnessMap||s.clearcoatNormalMap||s.iridescenceMap||s.iridescenceThicknessMap||s.displacementMap||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheenColorMap||s.sheenRoughnessMap),uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.iridescenceMap||s.iridescenceThicknessMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheen>0||s.sheenColorMap||s.sheenRoughnessMap||!s.displacementMap),fog:!!y,useFog:!0===s.fog,fogExp2:y&&y.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:m,skinning:!0===_.isSkinnedMesh,morphTargets:void 0!==M.morphAttributes.position,morphNormals:void 0!==M.morphAttributes.normal,morphColors:void 0!==M.morphAttributes.color,morphTargetsCount:E,morphTextureStride:I,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numSpotLightMaps:o.spotLightMap.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numSpotLightShadowsWithMaps:o.numSpotLightShadowsWithMaps,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:s.dithering,shadowMapEnabled:t.shadowMap.enabled&&u.length>0,shadowMapType:t.shadowMap.type,toneMapping:s.toneMapped?t.toneMapping:W,useLegacyLights:t.useLegacyLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:s.side===h,flipSided:s.side===c,useDepthPacking:!!s.depthPacking,depthPacking:s.depthPacking||0,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:p||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:p||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:p||n.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(e){const i=[];if(e.shaderID?i.push(e.shaderID):(i.push(e.customVertexShaderID),i.push(e.customFragmentShaderID)),void 0!==e.defines)for(const t in e.defines)i.push(t),i.push(e.defines[t]);return!1===e.isRawShaderMaterial&&(!function(t,e){t.push(e.precision),t.push(e.outputEncoding),t.push(e.envMapMode),t.push(e.envMapCubeUVHeight),t.push(e.combine),t.push(e.vertexUvs),t.push(e.fogExp2),t.push(e.sizeAttenuation),t.push(e.morphTargetsCount),t.push(e.morphAttributeCount),t.push(e.numDirLights),t.push(e.numPointLights),t.push(e.numSpotLights),t.push(e.numSpotLightMaps),t.push(e.numHemiLights),t.push(e.numRectAreaLights),t.push(e.numDirLightShadows),t.push(e.numPointLightShadows),t.push(e.numSpotLightShadows),t.push(e.numSpotLightShadowsWithMaps),t.push(e.shadowMapType),t.push(e.toneMapping),t.push(e.numClippingPlanes),t.push(e.numClipIntersection),t.push(e.depthPacking)}(i,e),function(t,e){o.disableAll(),e.isWebGL2&&o.enable(0);e.supportsVertexTextures&&o.enable(1);e.instancing&&o.enable(2);e.instancingColor&&o.enable(3);e.map&&o.enable(4);e.matcap&&o.enable(5);e.envMap&&o.enable(6);e.lightMap&&o.enable(7);e.aoMap&&o.enable(8);e.emissiveMap&&o.enable(9);e.bumpMap&&o.enable(10);e.normalMap&&o.enable(11);e.objectSpaceNormalMap&&o.enable(12);e.tangentSpaceNormalMap&&o.enable(13);e.clearcoat&&o.enable(14);e.clearcoatMap&&o.enable(15);e.clearcoatRoughnessMap&&o.enable(16);e.clearcoatNormalMap&&o.enable(17);e.iridescence&&o.enable(18);e.iridescenceMap&&o.enable(19);e.iridescenceThicknessMap&&o.enable(20);e.displacementMap&&o.enable(21);e.specularMap&&o.enable(22);e.roughnessMap&&o.enable(23);e.metalnessMap&&o.enable(24);e.gradientMap&&o.enable(25);e.alphaMap&&o.enable(26);e.alphaTest&&o.enable(27);e.vertexColors&&o.enable(28);e.vertexAlphas&&o.enable(29);e.vertexUvs&&o.enable(30);e.vertexTangents&&o.enable(31);e.uvsVertexOnly&&o.enable(32);t.push(o.mask),o.disableAll(),e.fog&&o.enable(0);e.useFog&&o.enable(1);e.flatShading&&o.enable(2);e.logarithmicDepthBuffer&&o.enable(3);e.skinning&&o.enable(4);e.morphTargets&&o.enable(5);e.morphNormals&&o.enable(6);e.morphColors&&o.enable(7);e.premultipliedAlpha&&o.enable(8);e.shadowMapEnabled&&o.enable(9);e.useLegacyLights&&o.enable(10);e.doubleSided&&o.enable(11);e.flipSided&&o.enable(12);e.useDepthPacking&&o.enable(13);e.dithering&&o.enable(14);e.specularIntensityMap&&o.enable(15);e.specularColorMap&&o.enable(16);e.transmission&&o.enable(17);e.transmissionMap&&o.enable(18);e.thicknessMap&&o.enable(19);e.sheen&&o.enable(20);e.sheenColorMap&&o.enable(21);e.sheenRoughnessMap&&o.enable(22);e.decodeVideoTexture&&o.enable(23);e.opaque&&o.enable(24);t.push(o.mask)}(i,e),i.push(t.outputEncoding)),i.push(e.customProgramCacheKey),i.join()},getUniforms:function(t){const e=v[t.type];let i;if(e){const t=Wr[e];i=wr.clone(t.uniforms)}else i=t.uniforms;return i},acquireProgram:function(e,i){let n;for(let t=0,e=u.length;t0?n.push(h):!0===a.transparent?r.push(h):i.push(h)},unshift:function(t,e,a,o,l,c){const h=s(t,e,a,o,l,c);a.transmission>0?n.unshift(h):!0===a.transparent?r.unshift(h):i.unshift(h)},finish:function(){for(let i=e,n=t.length;i1&&i.sort(t||Ya),n.length>1&&n.sort(e||Za),r.length>1&&r.sort(e||Za)}}}function Ka(){let t=new WeakMap;return{get:function(e,i){const n=t.get(e);let r;return void 0===n?(r=new Ja,t.set(e,[r])):i>=n.length?(r=new Ja,n.push(r)):r=n[i],r},dispose:function(){t=new WeakMap}}}function $a(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new $e,color:new On};break;case"SpotLight":i={position:new $e,direction:new $e,color:new On,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new $e,color:new On,distance:0,decay:0};break;case"HemisphereLight":i={direction:new $e,skyColor:new On,groundColor:new On};break;case"RectAreaLight":i={color:new On,position:new $e,halfWidth:new $e,halfHeight:new $e}}return t[e.id]=i,i}}}let Qa=0;function to(t,e){return(e.castShadow?2:0)-(t.castShadow?2:0)+(e.map?1:0)-(t.map?1:0)}function eo(t,e){const i=new $a,n=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new We};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new We,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0};for(let t=0;t<9;t++)r.probe.push(new $e);const s=new $e,a=new qi,o=new qi;return{setup:function(s,a){let o=0,l=0,c=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let h=0,u=0,d=0,p=0,m=0,f=0,g=0,v=0,x=0,_=0;s.sort(to);const y=!0===a?Math.PI:1;for(let t=0,e=s.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=Hr.LTC_FLOAT_1,r.rectAreaLTC2=Hr.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Hr.LTC_HALF_1,r.rectAreaLTC2=Hr.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=l,r.ambient[2]=c;const M=r.hash;M.directionalLength===h&&M.pointLength===u&&M.spotLength===d&&M.rectAreaLength===p&&M.hemiLength===m&&M.numDirectionalShadows===f&&M.numPointShadows===g&&M.numSpotShadows===v&&M.numSpotMaps===x||(r.directional.length=h,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=m,r.directionalShadow.length=f,r.directionalShadowMap.length=f,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=v,r.spotShadowMap.length=v,r.directionalShadowMatrix.length=f,r.pointShadowMatrix.length=g,r.spotLightMatrix.length=v+x-_,r.spotLightMap.length=x,r.numSpotLightShadowsWithMaps=_,M.directionalLength=h,M.pointLength=u,M.spotLength=d,M.rectAreaLength=p,M.hemiLength=m,M.numDirectionalShadows=f,M.numPointShadows=g,M.numSpotShadows=v,M.numSpotMaps=x,r.version=Qa++)},setupView:function(t,e){let i=0,n=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e=s.length?(a=new io(t,e),s.push(a)):a=s[r],a},dispose:function(){i=new WeakMap}}}class ro extends Pn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class so extends Pn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.referencePosition=new $e,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}const ao="void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",oo="uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}";function lo(t,e,i){let n=new Br;const r=new We,a=new We,d=new fi,p=new ro({depthPacking:_e}),m=new so,f={},g=i.maxTextureSize,v={[l]:c,[c]:l,[h]:h},x=new Tr({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new We},radius:{value:4}},vertexShader:ao,fragmentShader:oo}),_=x.clone();_.defines.HORIZONTAL_PASS=1;const y=new nr;y.setAttribute("position",new qn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const M=new xr(y,x),b=this;function S(i,n){const s=e.update(M);x.defines.VSM_SAMPLES!==i.blurSamples&&(x.defines.VSM_SAMPLES=i.blurSamples,_.defines.VSM_SAMPLES=i.blurSamples,x.needsUpdate=!0,_.needsUpdate=!0),null===i.mapPass&&(i.mapPass=new gi(r.x,r.y)),x.uniforms.shadow_pass.value=i.map.texture,x.uniforms.resolution.value=i.mapSize,x.uniforms.radius.value=i.radius,t.setRenderTarget(i.mapPass),t.clear(),t.renderBufferDirect(n,null,s,x,M,null),_.uniforms.shadow_pass.value=i.mapPass.texture,_.uniforms.resolution.value=i.mapSize,_.uniforms.radius.value=i.radius,t.setRenderTarget(i.map),t.clear(),t.renderBufferDirect(n,null,s,_,M,null)}function w(e,i,n,r,s,a){let l=null;const c=!0===n.isPointLight?e.customDistanceMaterial:e.customDepthMaterial;if(void 0!==c)l=c;else if(l=!0===n.isPointLight?m:p,t.localClippingEnabled&&!0===i.clipShadows&&Array.isArray(i.clippingPlanes)&&0!==i.clippingPlanes.length||i.displacementMap&&0!==i.displacementScale||i.alphaMap&&i.alphaTest>0||i.map&&i.alphaTest>0){const t=l.uuid,e=i.uuid;let n=f[t];void 0===n&&(n={},f[t]=n);let r=n[e];void 0===r&&(r=l.clone(),n[e]=r),l=r}return l.visible=i.visible,l.wireframe=i.wireframe,l.side=a===o?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:v[i.side],l.alphaMap=i.alphaMap,l.alphaTest=i.alphaTest,l.map=i.map,l.clipShadows=i.clipShadows,l.clippingPlanes=i.clippingPlanes,l.clipIntersection=i.clipIntersection,l.displacementMap=i.displacementMap,l.displacementScale=i.displacementScale,l.displacementBias=i.displacementBias,l.wireframeLinewidth=i.wireframeLinewidth,l.linewidth=i.linewidth,!0===n.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(n.matrixWorld),l.nearDistance=r,l.farDistance=s),l}function T(i,r,s,a,l){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&l===o)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=e.update(i),r=i.material;if(Array.isArray(r)){const e=n.groups;for(let o=0,c=e.length;og||r.y>g)&&(r.x>g&&(a.x=Math.floor(g/u.x),r.x=a.x*u.x,h.mapSize.x=a.x),r.y>g&&(a.y=Math.floor(g/u.y),r.y=a.y*u.y,h.mapSize.y=a.y)),null===h.map){const t=this.type!==o?{minFilter:st,magFilter:st}:{};h.map=new gi(r.x,r.y,t),h.map.texture.name=c.name+".shadowMap",h.camera.updateProjectionMatrix()}t.setRenderTarget(h.map),t.clear();const m=h.getViewportCount();for(let t=0;t=1):-1!==dt.indexOf("OpenGL ES")&&(ut=parseFloat(/^OpenGL ES (\d)/.exec(dt)[1]),ht=ut>=2);let pt=null,mt={};const ft=t.getParameter(3088),gt=t.getParameter(2978),vt=(new fi).fromArray(ft),xt=(new fi).fromArray(gt);function _t(e,i,n){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;en||t.height>n)&&(r=n/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const n=e?ke:Math.floor,s=n(r*t.width),a=n(r*t.height);void 0===f&&(f=x(s,a));const o=i?x(s,a):f;o.width=s,o.height=a;return o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function y(t){return Be(t.width)&&Be(t.height)}function M(t,e){return t.generateMipmaps&&e&&t.minFilter!==st&&t.minFilter!==lt}function b(e){t.generateMipmap(e)}function S(i,n,r,s,a=!1){if(!1===o)return n;if(null!==i){if(void 0!==t[i])return t[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let l=n;return 6403===n&&(5126===r&&(l=33326),5131===r&&(l=33325),5121===r&&(l=33321)),33319===n&&(5126===r&&(l=33328),5131===r&&(l=33327),5121===r&&(l=33323)),6408===n&&(5126===r&&(l=34836),5131===r&&(l=34842),5121===r&&(l=s===xe&&!1===a?35907:32856),32819===r&&(l=32854),32820===r&&(l=32855)),33325!==l&&33326!==l&&33327!==l&&33328!==l&&34842!==l&&34836!==l||e.get("EXT_color_buffer_float"),l}function w(t,e,i){return!0===M(t,i)||t.isFramebufferTexture&&t.minFilter!==st&&t.minFilter!==lt?Math.log2(Math.max(e.width,e.height))+1:void 0!==t.mipmaps&&t.mipmaps.length>0?t.mipmaps.length:t.isCompressedTexture&&Array.isArray(t.image)?e.mipmaps.length:1}function T(t){return t===st||t===at||t===ot?9728:9729}function A(t){const e=t.target;e.removeEventListener("dispose",A),function(t){const e=n.get(t);if(void 0===e.__webglInit)return;const i=t.source,r=g.get(i);if(r){const n=r[e.__cacheKey];n.usedTimes--,0===n.usedTimes&&C(t),0===Object.keys(r).length&&g.delete(i)}n.remove(t)}(e),e.isVideoTexture&&m.delete(e)}function E(e){const i=e.target;i.removeEventListener("dispose",E),function(e){const i=e.texture,r=n.get(e),s=n.get(i);void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else{if(t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer)for(let e=0;e0&&r.__version!==t.version){const i=t.image;if(null===i)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==i.complete)return void z(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.bindTexture(3553,r.__webglTexture,33984+e)}const P={[it]:10497,[nt]:33071,[rt]:33648},I={[st]:9728,[at]:9984,[ot]:9986,[lt]:9729,[ct]:9985,[ht]:9987};function D(i,s,a){if(a?(t.texParameteri(i,10242,P[s.wrapS]),t.texParameteri(i,10243,P[s.wrapT]),32879!==i&&35866!==i||t.texParameteri(i,32882,P[s.wrapR]),t.texParameteri(i,10240,I[s.magFilter]),t.texParameteri(i,10241,I[s.minFilter])):(t.texParameteri(i,10242,33071),t.texParameteri(i,10243,33071),32879!==i&&35866!==i||t.texParameteri(i,32882,33071),s.wrapS===nt&&s.wrapT===nt||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(i,10240,T(s.magFilter)),t.texParameteri(i,10241,T(s.minFilter)),s.minFilter!==st&&s.minFilter!==lt&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===e.has("EXT_texture_filter_anisotropic")){const a=e.get("EXT_texture_filter_anisotropic");if(s.magFilter===st)return;if(s.minFilter!==ot&&s.minFilter!==ht)return;if(s.type===vt&&!1===e.has("OES_texture_float_linear"))return;if(!1===o&&s.type===xt&&!1===e.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(t.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function N(e,i){let n=!1;void 0===e.__webglInit&&(e.__webglInit=!0,i.addEventListener("dispose",A));const r=i.source;let s=g.get(r);void 0===s&&(s={},g.set(r,s));const o=function(t){const e=[];return e.push(t.wrapS),e.push(t.wrapT),e.push(t.wrapR||0),e.push(t.magFilter),e.push(t.minFilter),e.push(t.anisotropy),e.push(t.internalFormat),e.push(t.format),e.push(t.type),e.push(t.generateMipmaps),e.push(t.premultiplyAlpha),e.push(t.flipY),e.push(t.unpackAlignment),e.push(t.encoding),e.join()}(i);if(o!==e.__cacheKey){void 0===s[o]&&(s[o]={texture:t.createTexture(),usedTimes:0},a.memory.textures++,n=!0),s[o].usedTimes++;const r=s[e.__cacheKey];void 0!==r&&(s[e.__cacheKey].usedTimes--,0===r.usedTimes&&C(i)),e.__cacheKey=o,e.__webglTexture=s[o].texture}return n}function z(e,r,a){let l=3553;(r.isDataArrayTexture||r.isCompressedArrayTexture)&&(l=35866),r.isData3DTexture&&(l=32879);const c=N(e,r),u=r.source;i.bindTexture(l,e.__webglTexture,33984+a);const d=n.get(u);if(u.version!==d.__version||!0===c){i.activeTexture(33984+a),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=function(t){return!o&&(t.wrapS!==nt||t.wrapT!==nt||t.minFilter!==st&&t.minFilter!==lt)}(r)&&!1===y(r.image);let n=_(r.image,e,!1,h);n=G(r,n);const p=y(n)||o,m=s.convert(r.format,r.encoding);let f,g=s.convert(r.type),v=S(r.internalFormat,m,g,r.encoding,r.isVideoTexture);D(l,r,p);const x=r.mipmaps,T=o&&!0!==r.isVideoTexture,A=void 0===d.__version||!0===c,E=w(r,n,p);if(r.isDepthTexture)v=6402,o?v=r.type===vt?36012:r.type===gt?33190:r.type===Mt?35056:33189:r.type===vt&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),r.format===At&&6402===v&&r.type!==mt&&r.type!==gt&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=gt,g=s.convert(r.type)),r.format===Et&&6402===v&&(v=34041,r.type!==Mt&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=Mt,g=s.convert(r.type))),A&&(T?i.texStorage2D(3553,1,v,n.width,n.height):i.texImage2D(3553,0,v,n.width,n.height,0,m,g,null));else if(r.isDataTexture)if(x.length>0&&p){T&&A&&i.texStorage2D(3553,E,v,x[0].width,x[0].height);for(let t=0,e=x.length;t>=1,e>>=1}}else if(x.length>0&&p){T&&A&&i.texStorage2D(3553,E,v,x[0].width,x[0].height);for(let t=0,e=x.length;t=34069&&l<=34074)&&t.framebufferTexture2D(36160,o,l,n.get(a).__webglTexture,0),i.bindFramebuffer(36160,null)}function U(e,i,n){if(t.bindRenderbuffer(36161,e),i.depthBuffer&&!i.stencilBuffer){let r=33189;if(n||k(i)){const e=i.depthTexture;e&&e.isDepthTexture&&(e.type===vt?r=36012:e.type===gt&&(r=33190));const n=F(i);k(i)?d.renderbufferStorageMultisampleEXT(36161,n,r,i.width,i.height):t.renderbufferStorageMultisample(36161,n,r,i.width,i.height)}else t.renderbufferStorage(36161,r,i.width,i.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(i.depthBuffer&&i.stencilBuffer){const r=F(i);n&&!1===k(i)?t.renderbufferStorageMultisample(36161,r,35056,i.width,i.height):k(i)?d.renderbufferStorageMultisampleEXT(36161,r,35056,i.width,i.height):t.renderbufferStorage(36161,34041,i.width,i.height),t.framebufferRenderbuffer(36160,33306,36161,e)}else{const e=!0===i.isWebGLMultipleRenderTargets?i.texture:[i.texture];for(let r=0;r0&&!0===e.has("WEBGL_multisampled_render_to_texture")&&!1!==i.__useRenderToTexture}function G(t,i){const n=t.encoding,r=t.format,s=t.type;return!0===t.isCompressedTexture||!0===t.isVideoTexture||t.format===Ce||n!==ve&&(n===xe?!1===o?!0===e.has("EXT_sRGB")&&r===St?(t.format=Ce,t.minFilter=lt,t.generateMipmaps=!1):i=hi.sRGBToLinear(i):r===St&&s===ut||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",n)),i}this.allocateTextureUnit=function(){const t=L;return t>=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),L+=1,t},this.resetTextureUnits=function(){L=0},this.setTexture2D=R,this.setTexture2DArray=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?z(r,t,e):i.bindTexture(35866,r.__webglTexture,33984+e)},this.setTexture3D=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?z(r,t,e):i.bindTexture(32879,r.__webglTexture,33984+e)},this.setTextureCube=function(e,r){const a=n.get(e);e.version>0&&a.__version!==e.version?function(e,r,a){if(6!==r.image.length)return;const l=N(e,r),h=r.source;i.bindTexture(34067,e.__webglTexture,33984+a);const u=n.get(h);if(h.version!==u.__version||!0===l){i.activeTexture(33984+a),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=r.isCompressedTexture||r.image[0].isCompressedTexture,n=r.image[0]&&r.image[0].isDataTexture,d=[];for(let t=0;t<6;t++)d[t]=e||n?n?r.image[t].image:r.image[t]:_(r.image[t],!1,!0,c),d[t]=G(r,d[t]);const p=d[0],m=y(p)||o,f=s.convert(r.format,r.encoding),g=s.convert(r.type),v=S(r.internalFormat,f,g,r.encoding),x=o&&!0!==r.isVideoTexture,T=void 0===u.__version||!0===l;let A,E=w(r,p,m);if(D(34067,r,m),e){x&&T&&i.texStorage2D(34067,E,v,p.width,p.height);for(let t=0;t<6;t++){A=d[t].mipmaps;for(let e=0;e0&&E++,i.texStorage2D(34067,E,v,d[0].width,d[0].height));for(let t=0;t<6;t++)if(n){x?i.texSubImage2D(34069+t,0,0,0,d[t].width,d[t].height,f,g,d[t].data):i.texImage2D(34069+t,0,v,d[t].width,d[t].height,0,f,g,d[t].data);for(let e=0;e0&&!1===k(e)){const n=d?l:[l];c.__webglMultisampledFramebuffer=t.createFramebuffer(),c.__webglColorRenderbuffer=[],i.bindFramebuffer(36160,c.__webglMultisampledFramebuffer);for(let i=0;i0&&!1===k(e)){const r=e.isWebGLMultipleRenderTargets?e.texture:[e.texture],s=e.width,a=e.height;let o=16384;const l=[],c=e.stencilBuffer?33306:36096,h=n.get(e),u=!0===e.isWebGLMultipleRenderTargets;if(u)for(let e=0;eo+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(n=e.getPose(t.targetRaySpace,i),null===n&&null!==r&&(n=r),null!==n&&(a.matrix.fromArray(n.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),n.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(n.linearVelocity)):a.hasLinearVelocity=!1,n.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(n.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(fo)))}return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new mo;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class vo extends mi{constructor(t,e,i,n,r,s,a,o,l,c){if((c=void 0!==c?c:At)!==At&&c!==Et)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===At&&(i=gt),void 0===i&&c===Et&&(i=Mt),super(null,n,r,s,a,o,c,i,l),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==a?a:st,this.minFilter=void 0!==o?o:st,this.flipY=!1,this.generateMipmaps=!1}}class xo extends Le{constructor(t,e){super();const i=this;let n=null,r=1,s=null,a="local-floor",o=1,l=null,c=null,h=null,u=null,d=null,p=null;const m=e.getContextAttributes();let f=null,g=null;const v=[],x=[],_=new Set,y=new Map,M=new Er;M.layers.enable(1),M.viewport=new fi;const b=new Er;b.layers.enable(2),b.viewport=new fi;const S=[M,b],w=new po;w.layers.enable(1),w.layers.enable(2);let T=null,A=null;function E(t){const e=x.indexOf(t.inputSource);if(-1===e)return;const i=v[e];void 0!==i&&i.dispatchEvent({type:t.type,data:t.inputSource})}function C(){n.removeEventListener("select",E),n.removeEventListener("selectstart",E),n.removeEventListener("selectend",E),n.removeEventListener("squeeze",E),n.removeEventListener("squeezestart",E),n.removeEventListener("squeezeend",E),n.removeEventListener("end",C),n.removeEventListener("inputsourceschange",L);for(let t=0;t=0&&(x[n]=null,v[n].disconnect(i))}for(let e=0;e=x.length){x.push(i),n=t;break}if(null===x[t]){x[t]=i,n=t;break}}if(-1===n)break}const r=v[n];r&&r.connect(i)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=v[t];return void 0===e&&(e=new go,v[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=v[t];return void 0===e&&(e=new go,v[t]=e),e.getGripSpace()},this.getHand=function(t){let e=v[t];return void 0===e&&(e=new go,v[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){r=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){a=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return l||s},this.setReferenceSpace=function(t){l=t},this.getBaseLayer=function(){return null!==u?u:d},this.getBinding=function(){return h},this.getFrame=function(){return p},this.getSession=function(){return n},this.setSession=async function(c){if(n=c,null!==n){if(f=t.getRenderTarget(),n.addEventListener("select",E),n.addEventListener("selectstart",E),n.addEventListener("selectend",E),n.addEventListener("squeeze",E),n.addEventListener("squeezestart",E),n.addEventListener("squeezeend",E),n.addEventListener("end",C),n.addEventListener("inputsourceschange",L),!0!==m.xrCompatible&&await e.makeXRCompatible(),void 0===n.renderState.layers||!1===t.capabilities.isWebGL2){const i={antialias:void 0!==n.renderState.layers||m.antialias,alpha:m.alpha,depth:m.depth,stencil:m.stencil,framebufferScaleFactor:r};d=new XRWebGLLayer(n,e,i),n.updateRenderState({baseLayer:d}),g=new gi(d.framebufferWidth,d.framebufferHeight,{format:St,type:ut,encoding:t.outputEncoding,stencilBuffer:m.stencil})}else{let i=null,s=null,a=null;m.depth&&(a=m.stencil?35056:33190,i=m.stencil?Et:At,s=m.stencil?Mt:gt);const o={colorFormat:32856,depthFormat:a,scaleFactor:r};h=new XRWebGLBinding(n,e),u=h.createProjectionLayer(o),n.updateRenderState({layers:[u]}),g=new gi(u.textureWidth,u.textureHeight,{format:St,type:ut,depthTexture:new vo(u.textureWidth,u.textureHeight,s,void 0,void 0,void 0,void 0,void 0,void 0,i),stencilBuffer:m.stencil,encoding:t.outputEncoding,samples:m.antialias?4:0});t.properties.get(g).__ignoreDepthValues=u.ignoreDepthValues}g.isXRRenderTarget=!0,this.setFoveation(o),l=null,s=await n.requestReferenceSpace(a),N.setContext(n),N.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}};const R=new $e,P=new $e;function I(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.updateCamera=function(t){if(null===n)return;w.near=b.near=M.near=t.near,w.far=b.far=M.far=t.far,T===w.near&&A===w.far||(n.updateRenderState({depthNear:w.near,depthFar:w.far}),T=w.near,A=w.far);const e=t.parent,i=w.cameras;I(w,e);for(let t=0;te&&(y.set(t,t.lastChangedTime),i.dispatchEvent({type:"planechanged",data:t}))}else _.add(t),y.set(t,n.lastChangedTime),i.dispatchEvent({type:"planeadded",data:t})}p=null})),this.setAnimationLoop=function(t){D=t},this.dispose=function(){}}}function _o(t,e){function i(i,n){i.opacity.value=n.opacity,n.color&&i.diffuse.value.copy(n.color),n.emissive&&i.emissive.value.copy(n.emissive).multiplyScalar(n.emissiveIntensity),n.map&&(i.map.value=n.map),n.alphaMap&&(i.alphaMap.value=n.alphaMap),n.bumpMap&&(i.bumpMap.value=n.bumpMap,i.bumpScale.value=n.bumpScale,n.side===c&&(i.bumpScale.value*=-1)),n.displacementMap&&(i.displacementMap.value=n.displacementMap,i.displacementScale.value=n.displacementScale,i.displacementBias.value=n.displacementBias),n.emissiveMap&&(i.emissiveMap.value=n.emissiveMap),n.normalMap&&(i.normalMap.value=n.normalMap,i.normalScale.value.copy(n.normalScale),n.side===c&&i.normalScale.value.negate()),n.specularMap&&(i.specularMap.value=n.specularMap),n.alphaTest>0&&(i.alphaTest.value=n.alphaTest);const r=e.get(n).envMap;if(r&&(i.envMap.value=r,i.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,i.reflectivity.value=n.reflectivity,i.ior.value=n.ior,i.refractionRatio.value=n.refractionRatio),n.lightMap){i.lightMap.value=n.lightMap;const e=!0===t.useLegacyLights?Math.PI:1;i.lightMapIntensity.value=n.lightMapIntensity*e}let s,a;n.aoMap&&(i.aoMap.value=n.aoMap,i.aoMapIntensity.value=n.aoMapIntensity),n.map?s=n.map:n.specularMap?s=n.specularMap:n.displacementMap?s=n.displacementMap:n.normalMap?s=n.normalMap:n.bumpMap?s=n.bumpMap:n.roughnessMap?s=n.roughnessMap:n.metalnessMap?s=n.metalnessMap:n.alphaMap?s=n.alphaMap:n.emissiveMap?s=n.emissiveMap:n.clearcoatMap?s=n.clearcoatMap:n.clearcoatNormalMap?s=n.clearcoatNormalMap:n.clearcoatRoughnessMap?s=n.clearcoatRoughnessMap:n.iridescenceMap?s=n.iridescenceMap:n.iridescenceThicknessMap?s=n.iridescenceThicknessMap:n.specularIntensityMap?s=n.specularIntensityMap:n.specularColorMap?s=n.specularColorMap:n.transmissionMap?s=n.transmissionMap:n.thicknessMap?s=n.thicknessMap:n.sheenColorMap?s=n.sheenColorMap:n.sheenRoughnessMap&&(s=n.sheenRoughnessMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),i.uvTransform.value.copy(s.matrix)),n.aoMap?a=n.aoMap:n.lightMap&&(a=n.lightMap),void 0!==a&&(a.isWebGLRenderTarget&&(a=a.texture),!0===a.matrixAutoUpdate&&a.updateMatrix(),i.uv2Transform.value.copy(a.matrix))}return{refreshFogUniforms:function(e,i){i.color.getRGB(e.fogColor.value,Sr(t)),i.isFog?(e.fogNear.value=i.near,e.fogFar.value=i.far):i.isFogExp2&&(e.fogDensity.value=i.density)},refreshMaterialUniforms:function(t,n,r,s,a){n.isMeshBasicMaterial||n.isMeshLambertMaterial?i(t,n):n.isMeshToonMaterial?(i(t,n),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap)}(t,n)):n.isMeshPhongMaterial?(i(t,n),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4)}(t,n)):n.isMeshStandardMaterial?(i(t,n),function(t,i){t.roughness.value=i.roughness,t.metalness.value=i.metalness,i.roughnessMap&&(t.roughnessMap.value=i.roughnessMap);i.metalnessMap&&(t.metalnessMap.value=i.metalnessMap);const n=e.get(i).envMap;n&&(t.envMapIntensity.value=i.envMapIntensity)}(t,n),n.isMeshPhysicalMaterial&&function(t,e,i){t.ior.value=e.ior,e.sheen>0&&(t.sheenColor.value.copy(e.sheenColor).multiplyScalar(e.sheen),t.sheenRoughness.value=e.sheenRoughness,e.sheenColorMap&&(t.sheenColorMap.value=e.sheenColorMap),e.sheenRoughnessMap&&(t.sheenRoughnessMap.value=e.sheenRoughnessMap));e.clearcoat>0&&(t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap),e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,e.side===c&&t.clearcoatNormalScale.value.negate()));e.iridescence>0&&(t.iridescence.value=e.iridescence,t.iridescenceIOR.value=e.iridescenceIOR,t.iridescenceThicknessMinimum.value=e.iridescenceThicknessRange[0],t.iridescenceThicknessMaximum.value=e.iridescenceThicknessRange[1],e.iridescenceMap&&(t.iridescenceMap.value=e.iridescenceMap),e.iridescenceThicknessMap&&(t.iridescenceThicknessMap.value=e.iridescenceThicknessMap));e.transmission>0&&(t.transmission.value=e.transmission,t.transmissionSamplerMap.value=i.texture,t.transmissionSamplerSize.value.set(i.width,i.height),e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap),t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap),t.attenuationDistance.value=e.attenuationDistance,t.attenuationColor.value.copy(e.attenuationColor));t.specularIntensity.value=e.specularIntensity,t.specularColor.value.copy(e.specularColor),e.specularIntensityMap&&(t.specularIntensityMap.value=e.specularIntensityMap);e.specularColorMap&&(t.specularColorMap.value=e.specularColorMap)}(t,n,a)):n.isMeshMatcapMaterial?(i(t,n),function(t,e){e.matcap&&(t.matcap.value=e.matcap)}(t,n)):n.isMeshDepthMaterial?i(t,n):n.isMeshDistanceMaterial?(i(t,n),function(t,e){t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,n)):n.isMeshNormalMaterial?i(t,n):n.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,n),n.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,n)):n.isPointsMaterial?function(t,e,i,n){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*i,t.scale.value=.5*n,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,n,r,s):n.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let i;e.map?i=e.map:e.alphaMap&&(i=e.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(t,n):n.isShadowMaterial?(t.color.value.copy(n.color),t.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function yo(t,e,i,n){let r={},s={},a=[];const o=i.isWebGL2?t.getParameter(35375):0;function l(t,e,i){const n=t.value;if(void 0===i[e]){if("number"==typeof n)i[e]=n;else{const t=Array.isArray(n)?n:[n],r=[];for(let e=0;e0){r=i%n;0!==r&&n-r-a.boundary<0&&(i+=n-r,s.__offset=i)}i+=a.storage}r=i%n,r>0&&(i+=n-r);t.__size=i,t.__cache={}}(i),d=function(e){const i=function(){for(let t=0;t0&&function(t,e,i,n){if(null===k){const t=X.isWebGL2;k=new gi(1024,1024,{generateMipmaps:!0,type:q.has("EXT_color_buffer_half_float")?xt:ut,minFilter:ht,samples:t&&!0===a?4:0})}const r=_.getRenderTarget();_.setRenderTarget(k),_.clear();const s=_.toneMapping;_.toneMapping=W,zt(t,i,n),K.updateMultisampleRenderTarget(k),K.updateRenderTargetMipmap(k);let o=!1;for(let t=0,r=e.length;t0&&zt(r,e,i),s.length>0&&zt(s,e,i),o.length>0&&zt(o,e,i),Y.buffers.depth.setTest(!0),Y.buffers.depth.setMask(!0),Y.buffers.color.setMask(!0),Y.setPolygonOffset(!1)}function zt(t,e,i){const n=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r0?x[x.length-1]:null,v.pop(),f=v.length>0?v[v.length-1]:null},this.getActiveCubeFace=function(){return M},this.getActiveMipmapLevel=function(){return b},this.getRenderTarget=function(){return S},this.setRenderTargetTextures=function(t,e,i){J.get(t.texture).__webglTexture=e,J.get(t.depthTexture).__webglTexture=i;const n=J.get(t);n.__hasExternalTextures=!0,n.__hasExternalTextures&&(n.__autoAllocateDepthBuffer=void 0===i,n.__autoAllocateDepthBuffer||!0===q.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),n.__useRenderToTexture=!1))},this.setRenderTargetFramebuffer=function(t,e){const i=J.get(t);i.__webglFramebuffer=e,i.__useDefaultFramebuffer=void 0===e},this.setRenderTarget=function(t,e=0,i=0){S=t,M=e,b=i;let n=!0,r=null,s=!1,a=!1;if(t){const i=J.get(t);void 0!==i.__useDefaultFramebuffer?(Y.bindFramebuffer(36160,null),n=!1):void 0===i.__webglFramebuffer?K.setupRenderTarget(t):i.__hasExternalTextures&&K.rebindTextures(t,J.get(t.texture).__webglTexture,J.get(t.depthTexture).__webglTexture);const o=t.texture;(o.isData3DTexture||o.isDataArrayTexture||o.isCompressedArrayTexture)&&(a=!0);const l=J.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(r=l[e],s=!0):r=X.isWebGL2&&t.samples>0&&!1===K.useMultisampledRTT(t)?J.get(t).__webglMultisampledFramebuffer:l,A.copy(t.viewport),E.copy(t.scissor),C=t.scissorTest}else A.copy(N).multiplyScalar(P).floor(),E.copy(z).multiplyScalar(P).floor(),C=O;if(Y.bindFramebuffer(36160,r)&&X.drawBuffers&&n&&Y.drawBuffers(t,r),Y.viewport(A),Y.scissor(E),Y.setScissorTest(C),s){const n=J.get(t.texture);yt.framebufferTexture2D(36160,36064,34069+e,n.__webglTexture,i)}else if(a){const n=J.get(t.texture),r=e||0;yt.framebufferTextureLayer(36160,36064,n.__webglTexture,i||0,r)}w=-1},this.readRenderTargetPixels=function(t,e,i,n,r,s,a){if(!t||!t.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=J.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){Y.bindFramebuffer(36160,o);try{const a=t.texture,o=a.format,l=a.type;if(o!==St&&ft.convert(o)!==yt.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=l===xt&&(q.has("EXT_color_buffer_half_float")||X.isWebGL2&&q.has("EXT_color_buffer_float"));if(!(l===ut||ft.convert(l)===yt.getParameter(35738)||l===vt&&(X.isWebGL2||q.has("OES_texture_float")||q.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");e>=0&&e<=t.width-n&&i>=0&&i<=t.height-r&&yt.readPixels(e,i,n,r,ft.convert(o),ft.convert(l),s)}finally{const t=null!==S?J.get(S).__webglFramebuffer:null;Y.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,i=0){const n=Math.pow(2,-i),r=Math.floor(e.image.width*n),s=Math.floor(e.image.height*n);K.setTexture2D(e,0),yt.copyTexSubImage2D(3553,i,0,0,t.x,t.y,r,s),Y.unbindTexture()},this.copyTextureToTexture=function(t,e,i,n=0){const r=e.image.width,s=e.image.height,a=ft.convert(i.format),o=ft.convert(i.type);K.setTexture2D(i,0),yt.pixelStorei(37440,i.flipY),yt.pixelStorei(37441,i.premultiplyAlpha),yt.pixelStorei(3317,i.unpackAlignment),e.isDataTexture?yt.texSubImage2D(3553,n,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?yt.compressedTexSubImage2D(3553,n,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):yt.texSubImage2D(3553,n,t.x,t.y,a,o,e.image),0===n&&i.generateMipmaps&&yt.generateMipmap(3553),Y.unbindTexture()},this.copyTextureToTexture3D=function(t,e,i,n,r=0){if(_.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=t.max.x-t.min.x+1,a=t.max.y-t.min.y+1,o=t.max.z-t.min.z+1,l=ft.convert(n.format),c=ft.convert(n.type);let h;if(n.isData3DTexture)K.setTexture3D(n,0),h=32879;else{if(!n.isDataArrayTexture)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");K.setTexture2DArray(n,0),h=35866}yt.pixelStorei(37440,n.flipY),yt.pixelStorei(37441,n.premultiplyAlpha),yt.pixelStorei(3317,n.unpackAlignment);const u=yt.getParameter(3314),d=yt.getParameter(32878),p=yt.getParameter(3316),m=yt.getParameter(3315),f=yt.getParameter(32877),g=i.isCompressedTexture?i.mipmaps[0]:i.image;yt.pixelStorei(3314,g.width),yt.pixelStorei(32878,g.height),yt.pixelStorei(3316,t.min.x),yt.pixelStorei(3315,t.min.y),yt.pixelStorei(32877,t.min.z),i.isDataTexture||i.isData3DTexture?yt.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,g.data):i.isCompressedArrayTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),yt.compressedTexSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,g.data)):yt.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,g),yt.pixelStorei(3314,u),yt.pixelStorei(32878,d),yt.pixelStorei(3316,p),yt.pixelStorei(3315,m),yt.pixelStorei(32877,f),0===r&&n.generateMipmaps&&yt.generateMipmap(h),Y.unbindTexture()},this.initTexture=function(t){t.isCubeTexture?K.setTextureCube(t,0):t.isData3DTexture?K.setTexture3D(t,0):t.isDataArrayTexture||t.isCompressedArrayTexture?K.setTexture2DArray(t,0):K.setTexture2D(t,0),Y.unbindTexture()},this.resetState=function(){M=0,b=0,S=null,Y.reset(),gt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}Object.defineProperties(Mo.prototype,{physicallyCorrectLights:{get:function(){return console.warn("THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),!this.useLegacyLights},set:function(t){console.warn("THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),this.useLegacyLights=!t}}});class bo extends Mo{}bo.prototype.isWebGL1Renderer=!0;class So{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new On(t),this.density=e}clone(){return new So(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}class wo{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new On(t),this.near=e,this.far=i}clone(){return new wo(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}class To extends xn{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e}get autoUpdate(){return console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate}set autoUpdate(t){console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate=t}}class Ao{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=Ae,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=Ne()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let n=0,r=this.stride;nt.far||e.push({distance:o,point:Po.clone(),uv:Ln.getUV(Po,Uo,Bo,Fo,ko,Go,Vo,new We),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Wo(t,e,i,n,r,s){No.subVectors(t,i).addScalar(.5).multiply(n),void 0!==r?(zo.x=s*No.x-r*No.y,zo.y=r*No.x+s*No.y):zo.copy(No),t.copy(e),t.x+=zo.x,t.y+=zo.y,t.applyMatrix4(Oo)}const jo=new $e,qo=new $e;class Xo extends xn{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,n;for(i=1,n=e.length;i0){jo.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(jo);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){jo.setFromMatrixPosition(t.matrixWorld),qo.setFromMatrixPosition(this.matrixWorld);const i=jo.distanceTo(qo)/t.zoom;let n,r;for(e[0].object.visible=!0,n=1,r=e.length;n=t))break;e[n-1].object.visible=!1,e[n].object.visible=!0}for(this._currentLevel=n-1;no)continue;u.applyMatrix4(this.matrixWorld);const s=t.ray.origin.distanceTo(u);st.far||e.push({distance:s,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else{for(let i=Math.max(0,s.start),n=Math.min(m.count,s.start+s.count)-1;io)continue;u.applyMatrix4(this.matrixWorld);const n=t.ray.origin.distanceTo(u);nt.far||e.push({distance:n,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,object:a})}}class Rl extends mi{constructor(t,e,i,n,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,n,r,h,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Pl{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,n=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)i=this.getPoint(s/t),r+=i.distanceTo(n),e.push(r),n=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const i=this.getLengths();let n=0;const r=i.length;let s;s=e||t*i[r-1];let a,o=0,l=r-1;for(;o<=l;)if(n=Math.floor(o+(l-o)/2),a=i[n]-s,a<0)o=n+1;else{if(!(a>0)){l=n;break}l=n-1}if(n=l,i[n]===s)return n/(r-1);const c=i[n];return(n+(s-c)/(i[n+1]-c))/(r-1)}getTangent(t,e){const i=1e-4;let n=t-i,r=t+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),a=this.getPoint(r),o=e||(s.isVector2?new We:new $e);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e){const i=new $e,n=[],r=[],s=[],a=new $e,o=new qi;for(let e=0;e<=t;e++){const i=e/t;n[e]=this.getTangentAt(i,new $e)}r[0]=new $e,s[0]=new $e;let l=Number.MAX_VALUE;const c=Math.abs(n[0].x),h=Math.abs(n[0].y),u=Math.abs(n[0].z);c<=l&&(l=c,i.set(1,0,0)),h<=l&&(l=h,i.set(0,1,0)),u<=l&&i.set(0,0,1),a.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],a),s[0].crossVectors(n[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(n[e-1],n[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ze(n[e-1].dot(n[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(n[e],r[e])}if(!0===e){let e=Math.acos(ze(r[0].dot(r[t]),-1,1));e/=t,n[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(n[i],e*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Il extends Pl{constructor(t=0,e=0,i=1,n=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=n,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const i=e||new We,n=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)n;)r-=n;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=n[(l-1)%r]:(zl.subVectors(n[0],n[1]).add(n[0]),a=zl);const h=n[l%r],u=n[(l+1)%r];if(this.closed||l+2n.length-2?n.length-1:s+1],h=n[s>n.length-3?n.length-1:s+2];return i.set(kl(a,o.x,l.x,c.x,h.x),kl(a,o.y,l.y,c.y,h.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=n[r]-i,s=this.curves[r],a=s.getLength(),o=0===a?0:1-t/a;return s.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,n=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Ql extends nr{constructor(t=[new We(0,-.5),new We(.5,0),new We(0,.5)],e=12,i=0,n=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:n},e=Math.floor(e),n=ze(n,0,2*Math.PI);const r=[],s=[],a=[],o=[],l=[],c=1/e,h=new $e,u=new We,d=new $e,p=new $e,m=new $e;let f=0,g=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:f=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-f,d.z=0*g,m.copy(d),d.normalize(),o.push(d.x,d.y,d.z);break;case t.length-1:o.push(m.x,m.y,m.z);break;default:f=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-f,d.z=0*g,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),o.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=i+r*c*n,p=Math.sin(d),m=Math.cos(d);for(let i=0;i<=t.length-1;i++){h.x=t[i].x*p,h.y=t[i].y,h.z=t[i].x*m,s.push(h.x,h.y,h.z),u.x=r/e,u.y=i/(t.length-1),a.push(u.x,u.y);const n=o[3*i+0]*p,c=o[3*i+1],d=o[3*i+0]*m;l.push(n,c,d)}}for(let i=0;i0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new Zn(h,3)),this.setAttribute("normal",new Zn(u,3)),this.setAttribute("uv",new Zn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new ic(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class nc extends ic{constructor(t=1,e=1,i=32,n=1,r=!1,s=0,a=2*Math.PI){super(0,t,e,i,n,r,s,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:n,openEnded:r,thetaStart:s,thetaLength:a}}static fromJSON(t){return new nc(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class rc extends nr{constructor(t=[],e=[],i=1,n=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:n};const r=[],s=[];function a(t,e,i,n){const r=n+1,s=[];for(let n=0;n<=r;n++){s[n]=[];const a=t.clone().lerp(i,n/r),o=e.clone().lerp(i,n/r),l=r-n;for(let t=0;t<=l;t++)s[n][t]=0===t&&n===r?a:a.clone().lerp(o,t/l)}for(let t=0;t.9&&a<.1&&(e<.2&&(s[t+0]+=1),i<.2&&(s[t+2]+=1),n<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new Zn(r,3)),this.setAttribute("normal",new Zn(r.slice(),3)),this.setAttribute("uv",new Zn(s,2)),0===n?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new rc(t.vertices,t.indices,t.radius,t.details)}}class sc extends rc{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,n=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-n,-i,0,-n,i,0,n,-i,0,n,i,-n,-i,0,-n,i,0,n,-i,0,n,i,0,-i,0,-n,i,0,-n,-i,0,n,i,0,n],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new sc(t.radius,t.detail)}}const ac=new $e,oc=new $e,lc=new $e,cc=new Ln;class hc extends nr{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,n=Math.pow(10,i),r=Math.cos(Ie*e),s=t.getIndex(),a=t.getAttribute("position"),o=s?s.count:a.count,l=[0,0,0],c=["a","b","c"],h=new Array(3),u={},d=[];for(let t=0;t80*i){o=c=t[0],l=h=t[1];for(let e=i;ec&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?32767/p:0}return fc(s,a,i,o,l,p,0),a};function pc(t,e,i,n,r){let s,a;if(r===function(t,e,i,n){let r=0;for(let s=e,a=i-n;s0)for(s=e;s=e;s-=n)a=Nc(s,t[s],t[s+1],a);return a&&Cc(a,a.next)&&(zc(a),a=a.next),a}function mc(t,e){if(!t)return t;e||(e=t);let i,n=t;do{if(i=!1,n.steiner||!Cc(n,n.next)&&0!==Ec(n.prev,n,n.next))n=n.next;else{if(zc(n),n=e=n.prev,n===n.next)break;i=!0}}while(i||n!==e);return e}function fc(t,e,i,n,r,s,a){if(!t)return;!a&&s&&function(t,e,i,n){let r=t;do{0===r.z&&(r.z=Sc(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,n,r,s,a,o,l,c=1;do{for(i=t,t=null,s=null,a=0;i;){for(a++,n=i,o=0,e=0;e0||l>0&&n;)0!==o&&(0===l||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(t,n,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?vc(t,n,r,s):gc(t))e.push(o.i/i|0),e.push(t.i/i|0),e.push(l.i/i|0),zc(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?fc(t=xc(mc(t),e,i),e,i,n,r,s,2):2===a&&_c(t,e,i,n,r,s):fc(mc(t),e,i,n,r,s,1);break}}function gc(t){const e=t.prev,i=t,n=t.next;if(Ec(e,i,n)>=0)return!1;const r=e.x,s=i.x,a=n.x,o=e.y,l=i.y,c=n.y,h=rs?r>a?r:a:s>a?s:a,p=o>l?o>c?o:c:l>c?l:c;let m=n.next;for(;m!==e;){if(m.x>=h&&m.x<=d&&m.y>=u&&m.y<=p&&Tc(r,o,s,l,a,c,m.x,m.y)&&Ec(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function vc(t,e,i,n){const r=t.prev,s=t,a=t.next;if(Ec(r,s,a)>=0)return!1;const o=r.x,l=s.x,c=a.x,h=r.y,u=s.y,d=a.y,p=ol?o>c?o:c:l>c?l:c,g=h>u?h>d?h:d:u>d?u:d,v=Sc(p,m,e,i,n),x=Sc(f,g,e,i,n);let _=t.prevZ,y=t.nextZ;for(;_&&_.z>=v&&y&&y.z<=x;){if(_.x>=p&&_.x<=f&&_.y>=m&&_.y<=g&&_!==r&&_!==a&&Tc(o,h,l,u,c,d,_.x,_.y)&&Ec(_.prev,_,_.next)>=0)return!1;if(_=_.prevZ,y.x>=p&&y.x<=f&&y.y>=m&&y.y<=g&&y!==r&&y!==a&&Tc(o,h,l,u,c,d,y.x,y.y)&&Ec(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(;_&&_.z>=v;){if(_.x>=p&&_.x<=f&&_.y>=m&&_.y<=g&&_!==r&&_!==a&&Tc(o,h,l,u,c,d,_.x,_.y)&&Ec(_.prev,_,_.next)>=0)return!1;_=_.prevZ}for(;y&&y.z<=x;){if(y.x>=p&&y.x<=f&&y.y>=m&&y.y<=g&&y!==r&&y!==a&&Tc(o,h,l,u,c,d,y.x,y.y)&&Ec(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function xc(t,e,i){let n=t;do{const r=n.prev,s=n.next.next;!Cc(r,s)&&Lc(r,n,n.next,s)&&Ic(r,s)&&Ic(s,r)&&(e.push(r.i/i|0),e.push(n.i/i|0),e.push(s.i/i|0),zc(n),zc(n.next),n=t=s),n=n.next}while(n!==t);return mc(n)}function _c(t,e,i,n,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Ac(a,t)){let o=Dc(a,t);return a=mc(a,a.next),o=mc(o,o.next),fc(a,e,i,n,r,s,0),void fc(o,e,i,n,r,s,0)}t=t.next}a=a.next}while(a!==t)}function yc(t,e){return t.x-e.x}function Mc(t,e){const i=function(t,e){let i,n=e,r=-1/0;const s=t.x,a=t.y;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){const t=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(t<=s&&t>r&&(r=t,i=n.x=n.x&&n.x>=l&&s!==n.x&&Tc(ai.x||n.x===i.x&&bc(i,n)))&&(i=n,u=h)),n=n.next}while(n!==o);return i}(t,e);if(!i)return e;const n=Dc(i,t);return mc(n,n.next),mc(i,i.next)}function bc(t,e){return Ec(t.prev,t,e.prev)<0&&Ec(e.next,t,t.next)<0}function Sc(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function wc(t){let e=t,i=t;do{(e.x=(t-a)*(s-o)&&(t-a)*(n-o)>=(i-a)*(e-o)&&(i-a)*(s-o)>=(r-a)*(n-o)}function Ac(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&Lc(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(Ic(t,e)&&Ic(e,t)&&function(t,e){let i=t,n=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(Ec(t.prev,t,e.prev)||Ec(t,e.prev,e))||Cc(t,e)&&Ec(t.prev,t,t.next)>0&&Ec(e.prev,e,e.next)>0)}function Ec(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Cc(t,e){return t.x===e.x&&t.y===e.y}function Lc(t,e,i,n){const r=Pc(Ec(t,e,i)),s=Pc(Ec(t,e,n)),a=Pc(Ec(i,n,t)),o=Pc(Ec(i,n,e));return r!==s&&a!==o||(!(0!==r||!Rc(t,i,e))||(!(0!==s||!Rc(t,n,e))||(!(0!==a||!Rc(i,t,n))||!(0!==o||!Rc(i,e,n)))))}function Rc(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Pc(t){return t>0?1:t<0?-1:0}function Ic(t,e){return Ec(t.prev,t,t.next)<0?Ec(t,e,t.next)>=0&&Ec(t,t.prev,e)>=0:Ec(t,e,t.prev)<0||Ec(t,t.next,e)<0}function Dc(t,e){const i=new Oc(t.i,t.x,t.y),n=new Oc(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Nc(t,e,i,n){const r=new Oc(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function zc(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Oc(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class Uc{static area(t){const e=t.length;let i=0;for(let n=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Fc(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,m=e.y+a/u,f=((i.x-c/d-p)*c-(i.y+l/d-m)*l)/(a*c-o*l);n=p+a*f-t.x,r=m+o*f-t.y;const g=n*n+r*r;if(g<=2)return new We(n,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(n=-o,r=a,s=Math.sqrt(h)):(n=a,r=o,s=Math.sqrt(h/2))}return new We(n/s,r/s)}const P=[];for(let t=0,e=A.length,i=e-1,n=t+1;t=0;t--){const e=t/p,i=h*Math.cos(e*Math.PI/2),n=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=A.length;t=0;){const n=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,l),(t!==i-1||o0!=t>0&&this.version++,this._sheen=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class rh extends Pn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new On(16777215),this.specular=new On(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new On(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=G,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class sh extends Pn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new On(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new On(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class ah extends Pn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class oh extends Pn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new On(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new On(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=G,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class lh extends Pn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new On(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class ch extends dl{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function hh(t,e,i){return dh(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)}function uh(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)}function dh(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function ph(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i}function mh(t,e,i){const n=t.length,r=new t.constructor(n);for(let s=0,a=0;a!==n;++s){const n=i[s]*e;for(let i=0;i!==e;++i)r[a++]=t[n+i]}return r}function fh(t,e,i,n){let r=1,s=t[0];for(;void 0!==s&&void 0===s[n];)s=t[r++];if(void 0===s)return;let a=s[n];if(void 0!==a)if(Array.isArray(a))do{a=s[n],void 0!==a&&(e.push(s.time),i.push.apply(i,a)),s=t[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[n],void 0!==a&&(e.push(s.time),a.toArray(i,i.length)),s=t[r++]}while(void 0!==s);else do{a=s[n],void 0!==a&&(e.push(s.time),i.push(a)),s=t[r++]}while(void 0!==s)}const gh={arraySlice:hh,convertArray:uh,isTypedArray:dh,getKeyframeOrder:ph,sortedArray:mh,flattenJSON:fh,subclip:function(t,e,i,n,r=30){const s=t.clone();s.name=e;const a=[];for(let t=0;t=n)){l.push(e.times[t]);for(let i=0;is.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t=n.times[u]){const t=u*l+o,e=t+l-o;d=hh(n.values,t,e)}else{const t=n.createInterpolant(),e=o,i=l-o;t.evaluate(s),d=hh(t.resultBuffer,e,i)}if("quaternion"===r){(new Ke).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}s=i,i=0}}for(;i>>1;te;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=hh(i,r,s),this.values=hh(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const n=i[e];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,n),t=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,n,s),t=!1;break}s=n}if(void 0!==n&&dh(n))for(let e=0,i=n.length;e!==i;++e){const i=n[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=hh(this.times),e=hh(this.values),i=this.getValueSize(),n=this.getInterpolation()===ue,r=t.length-1;let s=1;for(let a=1;a0){t[s]=t[r];for(let t=r*i,n=s*i,a=0;a!==i;++a)e[n+a]=e[t+a];++s}return s!==t.length?(this.times=hh(t,0,s),this.values=hh(e,0,s*i)):(this.times=t,this.values=e),this}clone(){const t=hh(this.times,0),e=hh(this.values,0),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}Mh.prototype.TimeBufferType=Float32Array,Mh.prototype.ValueBufferType=Float32Array,Mh.prototype.DefaultInterpolation=he;class bh extends Mh{}bh.prototype.ValueTypeName="bool",bh.prototype.ValueBufferType=Array,bh.prototype.DefaultInterpolation=ce,bh.prototype.InterpolantFactoryMethodLinear=void 0,bh.prototype.InterpolantFactoryMethodSmooth=void 0;class Sh extends Mh{}Sh.prototype.ValueTypeName="color";class wh extends Mh{}wh.prototype.ValueTypeName="number";class Th extends vh{constructor(t,e,i,n){super(t,e,i,n)}interpolate_(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(i-e)/(n-e);let l=t*a;for(let t=l+a;l!==t;l+=4)Ke.slerpFlat(r,0,s,l-a,s,l,o);return r}}class Ah extends Mh{InterpolantFactoryMethodLinear(t){return new Th(this.times,this.values,this.getValueSize(),t)}}Ah.prototype.ValueTypeName="quaternion",Ah.prototype.DefaultInterpolation=he,Ah.prototype.InterpolantFactoryMethodSmooth=void 0;class Eh extends Mh{}Eh.prototype.ValueTypeName="string",Eh.prototype.ValueBufferType=Array,Eh.prototype.DefaultInterpolation=ce,Eh.prototype.InterpolantFactoryMethodLinear=void 0,Eh.prototype.InterpolantFactoryMethodSmooth=void 0;class Ch extends Mh{}Ch.prototype.ValueTypeName="vector";class Lh{constructor(t,e=-1,i,n=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=n,this.uuid=Ne(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,n=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(Rh(i[t]).scale(n));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,n=i.length;t!==n;++t)e.push(Mh.toJSON(i[t]));return n}static CreateFromMorphTargetSequence(t,e,i,n){const r=e.length,s=[];for(let t=0;t1){const t=s[1];let e=n[t];e||(n[t]=e=[]),e.push(i)}}const s=[];for(const t in n)s.push(this.CreateFromMorphTargetSequence(t,n[t],e,i));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,n,r){if(0!==i.length){const s=[],a=[];fh(i,s,a,n),0!==s.length&&r.push(new t(e,s,a))}},n=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==zh[t])return void zh[t].push({onLoad:e,onProgress:i,onError:n});zh[t]=[],zh[t].push({onLoad:e,onProgress:i,onError:n});const s=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,o=this.responseType;fetch(s).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=zh[t],n=e.body.getReader(),r=e.headers.get("Content-Length")||e.headers.get("X-File-Size"),s=r?parseInt(r):0,a=0!==s;let o=0;const l=new ReadableStream({start(t){!function e(){n.read().then((({done:n,value:r})=>{if(n)t.close();else{o+=r.byteLength;const n=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:s});for(let t=0,e=i.length;t{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,a)));case"json":return t.json();default:if(void 0===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,n=new TextDecoder(i);return t.arrayBuffer().then((t=>n.decode(t)))}}})).then((e=>{Ph.add(t,e);const i=zh[t];delete zh[t];for(let t=0,n=i.length;t{const i=zh[t];if(void 0===i)throw this.manager.itemError(t),e;delete zh[t];for(let t=0,n=i.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class Bh extends Nh{constructor(t){super(t)}load(t,e,i,n){void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=Ph.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const a=Je("img");function o(){c(),Ph.add(t,this),e&&e(this),r.manager.itemEnd(t)}function l(e){c(),n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)}function c(){a.removeEventListener("load",o,!1),a.removeEventListener("error",l,!1)}return a.addEventListener("load",o,!1),a.addEventListener("error",l,!1),"data:"!==t.slice(0,5)&&void 0!==this.crossOrigin&&(a.crossOrigin=this.crossOrigin),r.manager.itemStart(t),a.src=t,a}}class Fh extends xn{constructor(t,e=1){super(),this.isLight=!0,this.type="Light",this.color=new On(t),this.intensity=e}dispose(){}copy(t,e){return super.copy(t,e),this.color.copy(t.color),this.intensity=t.intensity,this}toJSON(t){const e=super.toJSON(t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}class kh extends Fh{constructor(t,e,i){super(t,i),this.isHemisphereLight=!0,this.type="HemisphereLight",this.position.copy(xn.DEFAULT_UP),this.updateMatrix(),this.groundColor=new On(e)}copy(t,e){return super.copy(t,e),this.groundColor.copy(t.groundColor),this}}const Gh=new qi,Vh=new $e,Hh=new $e;class Wh{constructor(t){this.camera=t,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new We(512,512),this.map=null,this.mapPass=null,this.matrix=new qi,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new Br,this._frameExtents=new We(1,1),this._viewportCount=1,this._viewports=[new fi(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(t){const e=this.camera,i=this.matrix;Vh.setFromMatrixPosition(t.matrixWorld),e.position.copy(Vh),Hh.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(Hh),e.updateMatrixWorld(),Gh.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Gh),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(Gh)}getViewport(t){return this._viewports[t]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(t){return this.camera=t.camera.clone(),this.bias=t.bias,this.radius=t.radius,this.mapSize.copy(t.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const t={};return 0!==this.bias&&(t.bias=this.bias),0!==this.normalBias&&(t.normalBias=this.normalBias),1!==this.radius&&(t.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}class jh extends Wh{constructor(){super(new Er(50,1,.5,500)),this.isSpotLightShadow=!0,this.focus=1}updateMatrices(t){const e=this.camera,i=2*De*t.angle*this.focus,n=this.mapSize.width/this.mapSize.height,r=t.distance||e.far;i===e.fov&&n===e.aspect&&r===e.far||(e.fov=i,e.aspect=n,e.far=r,e.updateProjectionMatrix()),super.updateMatrices(t)}copy(t){return super.copy(t),this.focus=t.focus,this}}class qh extends Fh{constructor(t,e,i=0,n=Math.PI/3,r=0,s=2){super(t,e),this.isSpotLight=!0,this.type="SpotLight",this.position.copy(xn.DEFAULT_UP),this.updateMatrix(),this.target=new xn,this.distance=i,this.angle=n,this.penumbra=r,this.decay=s,this.map=null,this.shadow=new jh}get power(){return this.intensity*Math.PI}set power(t){this.intensity=t/Math.PI}dispose(){this.shadow.dispose()}copy(t,e){return super.copy(t,e),this.distance=t.distance,this.angle=t.angle,this.penumbra=t.penumbra,this.decay=t.decay,this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}const Xh=new qi,Yh=new $e,Zh=new $e;class Jh extends Wh{constructor(){super(new Er(90,1,.5,500)),this.isPointLightShadow=!0,this._frameExtents=new We(4,2),this._viewportCount=6,this._viewports=[new fi(2,1,1,1),new fi(0,1,1,1),new fi(3,1,1,1),new fi(1,1,1,1),new fi(3,0,1,1),new fi(1,0,1,1)],this._cubeDirections=[new $e(1,0,0),new $e(-1,0,0),new $e(0,0,1),new $e(0,0,-1),new $e(0,1,0),new $e(0,-1,0)],this._cubeUps=[new $e(0,1,0),new $e(0,1,0),new $e(0,1,0),new $e(0,1,0),new $e(0,0,1),new $e(0,0,-1)]}updateMatrices(t,e=0){const i=this.camera,n=this.matrix,r=t.distance||i.far;r!==i.far&&(i.far=r,i.updateProjectionMatrix()),Yh.setFromMatrixPosition(t.matrixWorld),i.position.copy(Yh),Zh.copy(i.position),Zh.add(this._cubeDirections[e]),i.up.copy(this._cubeUps[e]),i.lookAt(Zh),i.updateMatrixWorld(),n.makeTranslation(-Yh.x,-Yh.y,-Yh.z),Xh.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Xh)}}class Kh extends Fh{constructor(t,e,i=0,n=2){super(t,e),this.isPointLight=!0,this.type="PointLight",this.distance=i,this.decay=n,this.shadow=new Jh}get power(){return 4*this.intensity*Math.PI}set power(t){this.intensity=t/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(t,e){return super.copy(t,e),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}class $h extends Wh{constructor(){super(new $r(-5,5,5,-5,.5,500)),this.isDirectionalLightShadow=!0}}class Qh extends Fh{constructor(t,e){super(t,e),this.isDirectionalLight=!0,this.type="DirectionalLight",this.position.copy(xn.DEFAULT_UP),this.updateMatrix(),this.target=new xn,this.shadow=new $h}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}class tu extends Fh{constructor(t,e){super(t,e),this.isAmbientLight=!0,this.type="AmbientLight"}}class eu extends Fh{constructor(t,e,i=10,n=10){super(t,e),this.isRectAreaLight=!0,this.type="RectAreaLight",this.width=i,this.height=n}get power(){return this.intensity*this.width*this.height*Math.PI}set power(t){this.intensity=t/(this.width*this.height*Math.PI)}copy(t){return super.copy(t),this.width=t.width,this.height=t.height,this}toJSON(t){const e=super.toJSON(t);return e.object.width=this.width,e.object.height=this.height,e}}class iu{constructor(){this.isSphericalHarmonics3=!0,this.coefficients=[];for(let t=0;t<9;t++)this.coefficients.push(new $e)}set(t){for(let e=0;e<9;e++)this.coefficients[e].copy(t[e]);return this}zero(){for(let t=0;t<9;t++)this.coefficients[t].set(0,0,0);return this}getAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.282095),e.addScaledVector(s[1],.488603*n),e.addScaledVector(s[2],.488603*r),e.addScaledVector(s[3],.488603*i),e.addScaledVector(s[4],i*n*1.092548),e.addScaledVector(s[5],n*r*1.092548),e.addScaledVector(s[6],.315392*(3*r*r-1)),e.addScaledVector(s[7],i*r*1.092548),e.addScaledVector(s[8],.546274*(i*i-n*n)),e}getIrradianceAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.886227),e.addScaledVector(s[1],1.023328*n),e.addScaledVector(s[2],1.023328*r),e.addScaledVector(s[3],1.023328*i),e.addScaledVector(s[4],.858086*i*n),e.addScaledVector(s[5],.858086*n*r),e.addScaledVector(s[6],.743125*r*r-.247708),e.addScaledVector(s[7],.858086*i*r),e.addScaledVector(s[8],.429043*(i*i-n*n)),e}add(t){for(let e=0;e<9;e++)this.coefficients[e].add(t.coefficients[e]);return this}addScaledSH(t,e){for(let i=0;i<9;i++)this.coefficients[i].addScaledVector(t.coefficients[i],e);return this}scale(t){for(let e=0;e<9;e++)this.coefficients[e].multiplyScalar(t);return this}lerp(t,e){for(let i=0;i<9;i++)this.coefficients[i].lerp(t.coefficients[i],e);return this}equals(t){for(let e=0;e<9;e++)if(!this.coefficients[e].equals(t.coefficients[e]))return!1;return!0}copy(t){return this.set(t.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(t,e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].fromArray(t,e+3*n);return this}toArray(t=[],e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].toArray(t,e+3*n);return t}static getBasisAt(t,e){const i=t.x,n=t.y,r=t.z;e[0]=.282095,e[1]=.488603*n,e[2]=.488603*r,e[3]=.488603*i,e[4]=1.092548*i*n,e[5]=1.092548*n*r,e[6]=.315392*(3*r*r-1),e[7]=1.092548*i*r,e[8]=.546274*(i*i-n*n)}}class nu extends Fh{constructor(t=new iu,e=1){super(void 0,e),this.isLightProbe=!0,this.sh=t}copy(t){return super.copy(t),this.sh.copy(t.sh),this}fromJSON(t){return this.intensity=t.intensity,this.sh.fromArray(t.sh),this}toJSON(t){const e=super.toJSON(t);return e.object.sh=this.sh.toArray(),e}}class ru extends Nh{constructor(t){super(t),this.textures={}}load(t,e,i,n){const r=this,s=new Uh(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)}parse(t){const e=this.textures;function i(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}const n=ru.createMaterialFromType(t.type);if(void 0!==t.uuid&&(n.uuid=t.uuid),void 0!==t.name&&(n.name=t.name),void 0!==t.color&&void 0!==n.color&&n.color.setHex(t.color),void 0!==t.roughness&&(n.roughness=t.roughness),void 0!==t.metalness&&(n.metalness=t.metalness),void 0!==t.sheen&&(n.sheen=t.sheen),void 0!==t.sheenColor&&(n.sheenColor=(new On).setHex(t.sheenColor)),void 0!==t.sheenRoughness&&(n.sheenRoughness=t.sheenRoughness),void 0!==t.emissive&&void 0!==n.emissive&&n.emissive.setHex(t.emissive),void 0!==t.specular&&void 0!==n.specular&&n.specular.setHex(t.specular),void 0!==t.specularIntensity&&(n.specularIntensity=t.specularIntensity),void 0!==t.specularColor&&void 0!==n.specularColor&&n.specularColor.setHex(t.specularColor),void 0!==t.shininess&&(n.shininess=t.shininess),void 0!==t.clearcoat&&(n.clearcoat=t.clearcoat),void 0!==t.clearcoatRoughness&&(n.clearcoatRoughness=t.clearcoatRoughness),void 0!==t.iridescence&&(n.iridescence=t.iridescence),void 0!==t.iridescenceIOR&&(n.iridescenceIOR=t.iridescenceIOR),void 0!==t.iridescenceThicknessRange&&(n.iridescenceThicknessRange=t.iridescenceThicknessRange),void 0!==t.transmission&&(n.transmission=t.transmission),void 0!==t.thickness&&(n.thickness=t.thickness),void 0!==t.attenuationDistance&&(n.attenuationDistance=t.attenuationDistance),void 0!==t.attenuationColor&&void 0!==n.attenuationColor&&n.attenuationColor.setHex(t.attenuationColor),void 0!==t.fog&&(n.fog=t.fog),void 0!==t.flatShading&&(n.flatShading=t.flatShading),void 0!==t.blending&&(n.blending=t.blending),void 0!==t.combine&&(n.combine=t.combine),void 0!==t.side&&(n.side=t.side),void 0!==t.shadowSide&&(n.shadowSide=t.shadowSide),void 0!==t.opacity&&(n.opacity=t.opacity),void 0!==t.transparent&&(n.transparent=t.transparent),void 0!==t.alphaTest&&(n.alphaTest=t.alphaTest),void 0!==t.depthTest&&(n.depthTest=t.depthTest),void 0!==t.depthWrite&&(n.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(n.colorWrite=t.colorWrite),void 0!==t.stencilWrite&&(n.stencilWrite=t.stencilWrite),void 0!==t.stencilWriteMask&&(n.stencilWriteMask=t.stencilWriteMask),void 0!==t.stencilFunc&&(n.stencilFunc=t.stencilFunc),void 0!==t.stencilRef&&(n.stencilRef=t.stencilRef),void 0!==t.stencilFuncMask&&(n.stencilFuncMask=t.stencilFuncMask),void 0!==t.stencilFail&&(n.stencilFail=t.stencilFail),void 0!==t.stencilZFail&&(n.stencilZFail=t.stencilZFail),void 0!==t.stencilZPass&&(n.stencilZPass=t.stencilZPass),void 0!==t.wireframe&&(n.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(n.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(n.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(n.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(n.rotation=t.rotation),1!==t.linewidth&&(n.linewidth=t.linewidth),void 0!==t.dashSize&&(n.dashSize=t.dashSize),void 0!==t.gapSize&&(n.gapSize=t.gapSize),void 0!==t.scale&&(n.scale=t.scale),void 0!==t.polygonOffset&&(n.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(n.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(n.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.dithering&&(n.dithering=t.dithering),void 0!==t.alphaToCoverage&&(n.alphaToCoverage=t.alphaToCoverage),void 0!==t.premultipliedAlpha&&(n.premultipliedAlpha=t.premultipliedAlpha),void 0!==t.forceSinglePass&&(n.forceSinglePass=t.forceSinglePass),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.toneMapped&&(n.toneMapped=t.toneMapped),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.vertexColors&&("number"==typeof t.vertexColors?n.vertexColors=t.vertexColors>0:n.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(n.uniforms[e]={},r.type){case"t":n.uniforms[e].value=i(r.value);break;case"c":n.uniforms[e].value=(new On).setHex(r.value);break;case"v2":n.uniforms[e].value=(new We).fromArray(r.value);break;case"v3":n.uniforms[e].value=(new $e).fromArray(r.value);break;case"v4":n.uniforms[e].value=(new fi).fromArray(r.value);break;case"m3":n.uniforms[e].value=(new je).fromArray(r.value);break;case"m4":n.uniforms[e].value=(new qi).fromArray(r.value);break;default:n.uniforms[e].value=r.value}}if(void 0!==t.defines&&(n.defines=t.defines),void 0!==t.vertexShader&&(n.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(n.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(n.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)n.extensions[e]=t.extensions[e];if(void 0!==t.size&&(n.size=t.size),void 0!==t.sizeAttenuation&&(n.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(n.map=i(t.map)),void 0!==t.matcap&&(n.matcap=i(t.matcap)),void 0!==t.alphaMap&&(n.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(n.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(n.bumpScale=t.bumpScale),void 0!==t.normalMap&&(n.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(n.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),n.normalScale=(new We).fromArray(e)}return void 0!==t.displacementMap&&(n.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(n.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(n.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(n.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(n.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(n.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(n.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(n.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(n.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(n.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(n.envMap=i(t.envMap)),void 0!==t.envMapIntensity&&(n.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(n.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(n.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(n.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(n.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(n.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(n.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(n.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(n.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(n.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(n.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(n.clearcoatNormalScale=(new We).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(n.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(n.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(n.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(n.thicknessMap=i(t.thicknessMap)),void 0!==t.sheenColorMap&&(n.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(n.sheenRoughnessMap=i(t.sheenRoughnessMap)),n}setTextures(t){return this.textures=t,this}static createMaterialFromType(t){return new{ShadowMaterial:th,SpriteMaterial:Lo,RawShaderMaterial:eh,ShaderMaterial:Tr,PointsMaterial:Sl,MeshPhysicalMaterial:nh,MeshStandardMaterial:ih,MeshPhongMaterial:rh,MeshToonMaterial:sh,MeshNormalMaterial:ah,MeshLambertMaterial:oh,MeshDepthMaterial:ro,MeshDistanceMaterial:so,MeshBasicMaterial:Bn,MeshMatcapMaterial:lh,LineDashedMaterial:ch,LineBasicMaterial:dl,Material:Pn}[t]}}class su{static decodeText(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let i=0,n=t.length;i0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,n,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,n);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,n=i*this._origIndex;t.getValue(e,n);for(let t=i,r=n;t!==r;++t)e[t]=e[n+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let n=0;n!==r;++n)t[e+n]=t[i+n]}_slerp(t,e,i,n){Ke.slerpFlat(t,e,t,e,t,i,n)}_slerpAdditive(t,e,i,n,r){const s=this._workIndex*r;Ke.multiplyQuaternionsFlat(t,s,t,e,t,i),Ke.slerpFlat(t,e,t,e,t,s,n)}_lerp(t,e,i,n,r){const s=1-n;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[i+a]*n}}_lerpAdditive(t,e,i,n,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[i+s]*n}}}const Cu="\\[\\]\\.:\\/",Lu=new RegExp("["+Cu+"]","g"),Ru="[^"+Cu+"]",Pu="[^"+Cu.replace("\\.","")+"]",Iu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Ru)+/(WCOD+)?/.source.replace("WCOD",Pu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Ru)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Ru)+"$"),Du=["material","materials","bones","map"];class Nu{constructor(t,e,i){this.path=e,this.parsedPath=i||Nu.parseTrackName(e),this.node=Nu.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Nu.Composite(t,e,i):new Nu(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(Lu,"")}static parseTrackName(t){const e=Iu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const t=i.nodeName.substring(n+1);-1!==Du.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let n=0;n0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===ge)for(let i=0,n=t.length;i!==n;++i)t[i].evaluate(s),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(s),e[i].accumulate(n,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(t)[0];e*=n,t>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let n=this.time+t,r=this._loopCount;const s=2202===i;if(0===t)return-1===r?n:s&&1==(1&r)?e-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(n>=e)n=e;else{if(!(n<0)){this.time=n;break t}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=e||n<0){const i=Math.floor(n/e);n-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=t>0?e:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=n;if(s&&1==(1&r))return e-n}return n}_setEndings(t,e,i){const n=this._interpolantSettings;i?(n.endingStart=pe,n.endingEnd=pe):(n.endingStart=t?this.zeroSlopeAtStart?pe:de:me,n.endingEnd=e?this.zeroSlopeAtEnd?pe:de:me)}_scheduleFading(t,e,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const Ou=new Float32Array(1);class Uu{constructor(t){this.value=t}clone(){return new Uu(void 0===this.value.clone?this.value:this.value.clone())}}let Bu=0;function Fu(t,e){return t.distance-e.distance}function ku(t,e,i,n){if(t.layers.test(e.layers)&&t.raycast(e,i),!0===n){const n=t.children;for(let t=0,r=n.length;t=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,n=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(n,t,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;t=r){const s=r++,c=t[s];e[c.uuid]=l,t[l]=c,e[o]=s,t[s]=a;for(let t=0,e=n;t!==e;++t){const e=i[t],n=e[s],r=e[l];e[l]=n,e[s]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,n=i.length;let r=this.nCachedObjects_,s=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,l=e[o];if(void 0!==l)if(delete e[o],l0&&(e[a.uuid]=l),t[l]=a,t.pop();for(let t=0,e=n;t!==e;++t){const e=i[t];e[l]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let n=i[t];const r=this._bindings;if(void 0!==n)return r[n];const s=this._paths,a=this._parsedPaths,o=this._objects,l=o.length,c=this.nCachedObjects_,h=new Array(l);n=r.length,i[t]=n,s.push(t),a.push(e),r.push(h);for(let i=c,n=o.length;i!==n;++i){const n=o[i];h[i]=new Nu(n,t,e)}return h}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const n=this._paths,r=this._parsedPaths,s=this._bindings,a=s.length-1,o=s[a];e[t[a]]=i,s[i]=o,s.pop(),r[i]=r[a],r.pop(),n[i]=n[a],n.pop()}}},t.AnimationUtils=gh,t.ArcCurve=Dl,t.ArrayCamera=po,t.ArrowHelper=class extends xn{constructor(t=new $e(0,0,1),e=new $e(0,0,0),i=1,n=16776960,r=.2*i,s=.2*r){super(),this.type="ArrowHelper",void 0===ad&&(ad=new nr,ad.setAttribute("position",new Zn([0,0,0,0,1,0],3)),od=new ic(0,.5,1,5,1),od.translate(0,-.5,0)),this.position.copy(e),this.line=new xl(ad,new dl({color:n,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new xr(od,new Bn({color:n,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(t),this.setLength(i,r,s)}setDirection(t){if(t.y>.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{sd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(sd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}},t.Audio=bu,t.AudioAnalyser=class{constructor(t,e=2048){this.analyser=t.context.createAnalyser(),this.analyser.fftSize=e,this.data=new Uint8Array(this.analyser.frequencyBinCount),t.getOutput().connect(this.analyser)}getFrequencyData(){return this.analyser.getByteFrequencyData(this.data),this.data}getAverageFrequency(){let t=0;const e=this.getFrequencyData();for(let i=0;ithis.max.x||t.ythis.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Gu).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}},t.Box3=_i,t.Box3Helper=class extends Ml{constructor(t,e=16776960){const i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new nr;n.setIndex(new qn(i,1)),n.setAttribute("position",new Zn([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(n,new dl({color:e,toneMapped:!1})),this.box=t,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(t){const e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(t))}dispose(){this.geometry.dispose(),this.material.dispose()}},t.BoxBufferGeometry=class extends yr{constructor(t,e,i,n,r,s){console.warn("THREE.BoxBufferGeometry has been renamed to THREE.BoxGeometry."),super(t,e,i,n,r,s)}},t.BoxGeometry=yr,t.BoxHelper=class extends Ml{constructor(t,e=16776960){const i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new Float32Array(24),r=new nr;r.setIndex(new qn(i,1)),r.setAttribute("position",new qn(n,3)),super(r,new dl({color:e,toneMapped:!1})),this.object=t,this.type="BoxHelper",this.matrixAutoUpdate=!1,this.update()}update(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&rd.setFromObject(this.object),rd.isEmpty())return;const e=rd.min,i=rd.max,n=this.geometry.attributes.position,r=n.array;r[0]=i.x,r[1]=i.y,r[2]=i.z,r[3]=e.x,r[4]=i.y,r[5]=i.z,r[6]=e.x,r[7]=e.y,r[8]=i.z,r[9]=i.x,r[10]=e.y,r[11]=i.z,r[12]=i.x,r[13]=i.y,r[14]=e.z,r[15]=e.x,r[16]=i.y,r[17]=e.z,r[18]=e.x,r[19]=e.y,r[20]=e.z,r[21]=i.x,r[22]=e.y,r[23]=e.z,n.needsUpdate=!0,this.geometry.computeBoundingSphere()}setFromObject(t){return this.object=t,this.update(),this}copy(t,e){return super.copy(t,e),this.object=t.object,this}dispose(){this.geometry.dispose(),this.material.dispose()}},t.BufferAttribute=qn,t.BufferGeometry=nr,t.BufferGeometryLoader=ou,t.ByteType=dt,t.Cache=Ph,t.Camera=Ar,t.CameraHelper=class extends Ml{constructor(t){const e=new nr,i=new dl({color:16777215,vertexColors:!0,toneMapped:!1}),n=[],r=[],s={};function a(t,e){o(t),o(e)}function o(t){n.push(0,0,0),r.push(0,0,0),void 0===s[t]&&(s[t]=[]),s[t].push(n.length/3-1)}a("n1","n2"),a("n2","n4"),a("n4","n3"),a("n3","n1"),a("f1","f2"),a("f2","f4"),a("f4","f3"),a("f3","f1"),a("n1","f1"),a("n2","f2"),a("n3","f3"),a("n4","f4"),a("p","n1"),a("p","n2"),a("p","n3"),a("p","n4"),a("u1","u2"),a("u2","u3"),a("u3","u1"),a("c","t"),a("p","c"),a("cn1","cn2"),a("cn3","cn4"),a("cf1","cf2"),a("cf3","cf4"),e.setAttribute("position",new Zn(n,3)),e.setAttribute("color",new Zn(r,3)),super(e,i),this.type="CameraHelper",this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update();const l=new On(16755200),c=new On(16711680),h=new On(43775),u=new On(16777215),d=new On(3355443);this.setColors(l,c,h,u,d)}setColors(t,e,i,n,r){const s=this.geometry.getAttribute("color");s.setXYZ(0,t.r,t.g,t.b),s.setXYZ(1,t.r,t.g,t.b),s.setXYZ(2,t.r,t.g,t.b),s.setXYZ(3,t.r,t.g,t.b),s.setXYZ(4,t.r,t.g,t.b),s.setXYZ(5,t.r,t.g,t.b),s.setXYZ(6,t.r,t.g,t.b),s.setXYZ(7,t.r,t.g,t.b),s.setXYZ(8,t.r,t.g,t.b),s.setXYZ(9,t.r,t.g,t.b),s.setXYZ(10,t.r,t.g,t.b),s.setXYZ(11,t.r,t.g,t.b),s.setXYZ(12,t.r,t.g,t.b),s.setXYZ(13,t.r,t.g,t.b),s.setXYZ(14,t.r,t.g,t.b),s.setXYZ(15,t.r,t.g,t.b),s.setXYZ(16,t.r,t.g,t.b),s.setXYZ(17,t.r,t.g,t.b),s.setXYZ(18,t.r,t.g,t.b),s.setXYZ(19,t.r,t.g,t.b),s.setXYZ(20,t.r,t.g,t.b),s.setXYZ(21,t.r,t.g,t.b),s.setXYZ(22,t.r,t.g,t.b),s.setXYZ(23,t.r,t.g,t.b),s.setXYZ(24,e.r,e.g,e.b),s.setXYZ(25,e.r,e.g,e.b),s.setXYZ(26,e.r,e.g,e.b),s.setXYZ(27,e.r,e.g,e.b),s.setXYZ(28,e.r,e.g,e.b),s.setXYZ(29,e.r,e.g,e.b),s.setXYZ(30,e.r,e.g,e.b),s.setXYZ(31,e.r,e.g,e.b),s.setXYZ(32,i.r,i.g,i.b),s.setXYZ(33,i.r,i.g,i.b),s.setXYZ(34,i.r,i.g,i.b),s.setXYZ(35,i.r,i.g,i.b),s.setXYZ(36,i.r,i.g,i.b),s.setXYZ(37,i.r,i.g,i.b),s.setXYZ(38,n.r,n.g,n.b),s.setXYZ(39,n.r,n.g,n.b),s.setXYZ(40,r.r,r.g,r.b),s.setXYZ(41,r.r,r.g,r.b),s.setXYZ(42,r.r,r.g,r.b),s.setXYZ(43,r.r,r.g,r.b),s.setXYZ(44,r.r,r.g,r.b),s.setXYZ(45,r.r,r.g,r.b),s.setXYZ(46,r.r,r.g,r.b),s.setXYZ(47,r.r,r.g,r.b),s.setXYZ(48,r.r,r.g,r.b),s.setXYZ(49,r.r,r.g,r.b),s.needsUpdate=!0}update(){const t=this.geometry,e=this.pointMap;id.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),nd("c",e,t,id,0,0,-1),nd("t",e,t,id,0,0,1),nd("n1",e,t,id,-1,-1,-1),nd("n2",e,t,id,1,-1,-1),nd("n3",e,t,id,-1,1,-1),nd("n4",e,t,id,1,1,-1),nd("f1",e,t,id,-1,-1,1),nd("f2",e,t,id,1,-1,1),nd("f3",e,t,id,-1,1,1),nd("f4",e,t,id,1,1,1),nd("u1",e,t,id,.7,1.1,-1),nd("u2",e,t,id,-.7,1.1,-1),nd("u3",e,t,id,0,2,-1),nd("cf1",e,t,id,-1,0,1),nd("cf2",e,t,id,1,0,1),nd("cf3",e,t,id,0,-1,1),nd("cf4",e,t,id,0,1,1),nd("cn1",e,t,id,-1,0,-1),nd("cn2",e,t,id,1,0,-1),nd("cn3",e,t,id,0,-1,-1),nd("cn4",e,t,id,0,1,-1),t.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}},t.CanvasTexture=class extends mi{constructor(t,e,i,n,r,s,a,o,l){super(t,e,i,n,r,s,a,o,l),this.isCanvasTexture=!0,this.needsUpdate=!0}},t.CapsuleBufferGeometry=class extends tc{constructor(t,e,i,n){console.warn("THREE.CapsuleBufferGeometry has been renamed to THREE.CapsuleGeometry."),super(t,e,i,n)}},t.CapsuleGeometry=tc,t.CatmullRomCurve3=Fl,t.CineonToneMapping=X,t.CircleBufferGeometry=class extends ec{constructor(t,e,i,n){console.warn("THREE.CircleBufferGeometry has been renamed to THREE.CircleGeometry."),super(t,e,i,n)}},t.CircleGeometry=ec,t.ClampToEdgeWrapping=nt,t.Clock=gu,t.Color=On,t.ColorKeyframeTrack=Sh,t.ColorManagement=li,t.CompressedArrayTexture=class extends Rl{constructor(t,e,i,n,r,s){super(t,e,i,r,s),this.isCompressedArrayTexture=!0,this.image.depth=n,this.wrapR=nt}},t.CompressedTexture=Rl,t.CompressedTextureLoader=class extends Nh{constructor(t){super(t)}load(t,e,i,n){const r=this,s=[],a=new Rl,o=new Uh(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(r.withCredentials);let l=0;function c(c){o.load(t[c],(function(t){const i=r.parse(t,!0);s[c]={width:i.width,height:i.height,format:i.format,mipmaps:i.mipmaps},l+=1,6===l&&(1===i.mipmapCount&&(a.minFilter=lt),a.image=s,a.format=i.format,a.needsUpdate=!0,e&&e(a))}),i,n)}if(Array.isArray(t))for(let e=0,i=t.length;e0){const i=new Ih(e);r=new Bh(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){n=new Bh(this.manager),n.setCrossOrigin(this.crossOrigin);for(let e=0,n=t.length;e1)for(let i=0;iNumber.EPSILON){if(l<0&&(i=e[s],o=-o,a=e[r],l=-l),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=l*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;n=!n}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return n}const i=Uc.isClockWise,n=this.subPaths;if(0===n.length)return[];let r,s,a;const o=[];if(1===n.length)return s=n[0],a=new uc,a.curves=s.curves,o.push(a),o;let l=!i(n[0].getPoints());l=t?!l:l;const c=[],h=[];let u,d,p=[],m=0;h[m]=void 0,p[m]=[];for(let e=0,a=n.length;e1){let t=!1,i=0;for(let t=0,e=h.length;t0&&!1===t&&(p=c)}for(let t=0,e=h.length;t=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}},t.WebGL1Renderer=bo,t.WebGL3DRenderTarget=class extends gi{constructor(t=1,e=1,i=1){super(t,e),this.isWebGL3DRenderTarget=!0,this.depth=i,this.texture=new xi(null,t,e,i),this.texture.isRenderTargetTexture=!0}},t.WebGLArrayRenderTarget=class extends gi{constructor(t=1,e=1,i=1){super(t,e),this.isWebGLArrayRenderTarget=!0,this.depth=i,this.texture=new vi(null,t,e,i),this.texture.isRenderTargetTexture=!0}},t.WebGLCubeRenderTarget=Pr,t.WebGLMultipleRenderTargets=class extends gi{constructor(t=1,e=1,i=1,n={}){super(t,e,n),this.isWebGLMultipleRenderTargets=!0;const r=this.texture;this.texture=[];for(let t=0;t>8&255]+Re[t>>16&255]+Re[t>>24&255]+"-"+Re[255&e]+Re[e>>8&255]+"-"+Re[e>>16&15|64]+Re[e>>24&255]+"-"+Re[63&i|128]+Re[i>>8&255]+"-"+Re[i>>16&255]+Re[i>>24&255]+Re[255&n]+Re[n>>8&255]+Re[n>>16&255]+Re[n>>24&255]).toLowerCase()}function Oe(t,e,i){return Math.max(e,Math.min(i,t))}function ze(t,e){return(t%e+e)%e}function Ue(t,e,i){return(1-i)*t+i*e}function Be(t){return 0==(t&t-1)&&0!==t}function Fe(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ke(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function Ge(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Ve(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const He={DEG2RAD:Ie,RAD2DEG:De,generateUUID:Ne,clamp:Oe,euclideanModulo:ze,mapLinear:function(t,e,i,n,r){return n+(t-e)*(r-n)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:Ue,damp:function(t,e,i,n){return Ue(t,e,1-Math.exp(-i*n))},pingpong:function(t,e=1){return e-Math.abs(ze(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(Pe=t);let e=Pe+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*Ie},radToDeg:function(t){return t*De},isPowerOfTwo:Be,ceilPowerOfTwo:Fe,floorPowerOfTwo:ke,setQuaternionFromProperEuler:function(t,e,i,n,r){const s=Math.cos,a=Math.sin,o=s(i/2),l=a(i/2),c=s((e+n)/2),h=a((e+n)/2),u=s((e-n)/2),d=a((e-n)/2),p=s((n-e)/2),m=a((n-e)/2);switch(r){case"XYX":t.set(o*h,l*u,l*d,o*c);break;case"YZY":t.set(l*d,o*h,l*u,o*c);break;case"ZXZ":t.set(l*u,l*d,o*h,o*c);break;case"XZX":t.set(o*h,l*m,l*p,o*c);break;case"YXY":t.set(l*p,o*h,l*m,o*c);break;case"ZYZ":t.set(l*m,l*p,o*h,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Ve,denormalize:Ge};class We{constructor(t=0,e=0){We.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),n=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*i-s*n+t.x,this.y=r*n+s*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class je{constructor(){je.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1]}set(t,e,i,n,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=n,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],c=i[4],h=i[7],u=i[2],d=i[5],p=i[8],m=n[0],f=n[3],g=n[6],v=n[1],x=n[4],_=n[7],y=n[2],M=n[5],b=n[8];return r[0]=s*m+a*v+o*y,r[3]=s*f+a*x+o*M,r[6]=s*g+a*_+o*b,r[1]=l*m+c*v+h*y,r[4]=l*f+c*x+h*M,r[7]=l*g+c*_+h*b,r[2]=u*m+d*v+p*y,r[5]=u*f+d*x+p*M,r[8]=u*g+d*_+p*b,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-i*r*c+i*a*o+n*r*l-n*s*o}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=h*m,t[1]=(n*l-c*i)*m,t[2]=(a*i-n*s)*m,t[3]=u*m,t[4]=(c*e-n*o)*m,t[5]=(n*r-a*e)*m,t[6]=d*m,t[7]=(i*o-l*e)*m,t[8]=(s*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,n,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(i*o,i*l,-i*(o*s+l*a)+s+t,-n*l,n*o,-n*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(qe.makeScale(t,e)),this}rotate(t){return this.premultiply(qe.makeRotation(-t)),this}translate(t,e){return this.premultiply(qe.makeTranslation(t,e)),this}makeTranslation(t,e){return this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const qe=new je;function Xe(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Ye={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Ze(t,e){return new Ye[t](e)}function Je(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}class Ke{constructor(t=0,e=0,i=0,n=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=n}static slerpFlat(t,e,i,n,r,s,a){let o=i[n+0],l=i[n+1],c=i[n+2],h=i[n+3];const u=r[s+0],d=r[s+1],p=r[s+2],m=r[s+3];if(0===a)return t[e+0]=o,t[e+1]=l,t[e+2]=c,void(t[e+3]=h);if(1===a)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=m);if(h!==m||o!==u||l!==d||c!==p){let t=1-a;const e=o*u+l*d+c*p+h*m,i=e>=0?1:-1,n=1-e*e;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,e*i);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,i,n,r,s){const a=i[n],o=i[n+1],l=i[n+2],c=i[n+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){const i=t._x,n=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(i/2),c=a(n/2),h=a(r/2),u=o(i/2),d=o(n/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,n=Math.sin(i);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],n=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=i+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-n)*t}else if(i>a&&i>h){const t=2*Math.sqrt(1+i-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(n+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-i-h);this._w=(r-l)/t,this._x=(n+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-i-a);this._w=(s-n)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Oe(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const n=Math.min(1,e/i);return this.slerp(t,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,n=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=i*c+s*a+n*l-r*o,this._y=n*c+s*o+r*a-i*l,this._z=r*c+s*l+i*o-n*a,this._w=s*c-i*a-n*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*t._w+i*t._x+n*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*i+e*this._x,this._y=t*n+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=i*h+this._x*u,this._y=n*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=Math.random(),e=Math.sqrt(1-t),i=Math.sqrt(t),n=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(e*Math.cos(n),i*Math.sin(r),i*Math.cos(r),e*Math.sin(n))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class $e{constructor(t=0,e=0,i=0){$e.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(ti.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ti.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*n,this.y=r[1]*e+r[4]*i+r[7]*n,this.z=r[2]*e+r[5]*i+r[8]*n,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=t.elements,s=1/(r[3]*e+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*e+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*e+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*n-a*i,c=o*i+a*e-r*n,h=o*n+r*i-s*e,u=-r*e-s*i-a*n;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*n,this.y=r[1]*e+r[5]*i+r[9]*n,this.z=r[2]*e+r[6]*i+r[10]*n,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,n=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return Qe.copy(this).projectOnVector(t),this.sub(Qe)}reflect(t){return this.sub(Qe.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Oe(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const n=Math.sin(e)*t;return this.x=n*Math.sin(i),this.y=Math.cos(e)*t,this.z=n*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=n,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=2*(Math.random()-.5),e=Math.random()*Math.PI*2,i=Math.sqrt(1-t**2);return this.x=i*Math.cos(e),this.y=i*Math.sin(e),this.z=t,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Qe=new $e,ti=new Ke;function ei(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function ii(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}const ni=(new je).multiplyMatrices((new je).set(2.403984,-.9899069,-.3976415,-.8422229,1.7988437,.0160354,.0482059,-.0974068,1.2740049),(new je).set(.4360413,.3851129,.1430458,.2224845,.7169051,.0606104,.0139202,.0970672,.7139126)),ri=(new je).multiplyMatrices((new je).set(3.1341864,-1.617209,-.4906941,-.9787485,1.9161301,.0334334,.0719639,-.2289939,1.4057537),(new je).set(.5151187,.2919778,.1571035,.2411892,.6922441,.0665668,-.0010505,.0418791,.7840713)),si=new $e;const ai={[Se]:t=>t,[be]:t=>t.convertSRGBToLinear(),[we]:function(t){return t.convertSRGBToLinear(),si.set(t.r,t.g,t.b).applyMatrix3(ri),t.setRGB(si.x,si.y,si.z)}},oi={[Se]:t=>t,[be]:t=>t.convertLinearToSRGB(),[we]:function(t){return si.set(t.r,t.g,t.b).applyMatrix3(ni),t.setRGB(si.x,si.y,si.z).convertLinearToSRGB()}},li={enabled:!1,get legacyMode(){return console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),!this.enabled},set legacyMode(t){console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),this.enabled=!t},get workingColorSpace(){return Se},set workingColorSpace(t){console.warn("THREE.ColorManagement: .workingColorSpace is readonly.")},convert:function(t,e,i){if(!1===this.enabled||e===i||!e||!i)return t;const n=ai[e],r=oi[i];if(void 0===n||void 0===r)throw new Error(`Unsupported color space conversion, "${e}" to "${i}".`);return r(n(t))},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)}};let ci;class hi{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===ci&&(ci=Je("canvas")),ci.width=t.width,ci.height=t.height;const i=ci.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=ci}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Je("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const n=i.getImageData(0,0,t.width,t.height),r=n.data;for(let t=0;t0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==J)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case it:t.x=t.x-Math.floor(t.x);break;case nt:t.x=t.x<0?0:1;break;case rt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case it:t.y=t.y-Math.floor(t.y);break;case nt:t.y=t.y<0?0:1;break;case rt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}}mi.DEFAULT_IMAGE=null,mi.DEFAULT_MAPPING=J,mi.DEFAULT_ANISOTROPY=1;class fi{constructor(t=0,e=0,i=0,n=1){fi.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=n}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,n){return this.x=t,this.y=e,this.z=i,this.w=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,n,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)o&&t>v?tv?or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,i=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Mi),Mi.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Li),Ri.subVectors(this.max,Li),Si.subVectors(t.a,Li),wi.subVectors(t.b,Li),Ti.subVectors(t.c,Li),Ai.subVectors(wi,Si),Ei.subVectors(Ti,wi),Ci.subVectors(Si,Ti);let e=[0,-Ai.z,Ai.y,0,-Ei.z,Ei.y,0,-Ci.z,Ci.y,Ai.z,0,-Ai.x,Ei.z,0,-Ei.x,Ci.z,0,-Ci.x,-Ai.y,Ai.x,0,-Ei.y,Ei.x,0,-Ci.y,Ci.x,0];return!!Di(e,Si,wi,Ti,Ri)&&(e=[1,0,0,0,1,0,0,0,1],!!Di(e,Si,wi,Ti,Ri)&&(Pi.crossVectors(Ai,Ei),e=[Pi.x,Pi.y,Pi.z],Di(e,Si,wi,Ti,Ri)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return Mi.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Mi).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(yi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),yi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),yi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),yi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),yi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),yi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),yi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),yi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(yi)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const yi=[new $e,new $e,new $e,new $e,new $e,new $e,new $e,new $e],Mi=new $e,bi=new _i,Si=new $e,wi=new $e,Ti=new $e,Ai=new $e,Ei=new $e,Ci=new $e,Li=new $e,Ri=new $e,Pi=new $e,Ii=new $e;function Di(t,e,i,n,r){for(let s=0,a=t.length-3;s<=a;s+=3){Ii.fromArray(t,s);const a=r.x*Math.abs(Ii.x)+r.y*Math.abs(Ii.y)+r.z*Math.abs(Ii.z),o=e.dot(Ii),l=i.dot(Ii),c=n.dot(Ii);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const Ni=new _i,Oi=new $e,zi=new $e;class Ui{constructor(t=new $e,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):Ni.setFromPoints(t).getCenter(i);let n=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Oi.subVectors(t,this.center);const e=Oi.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Oi,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(zi.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Oi.copy(t.center).add(zi)),this.expandByPoint(Oi.copy(t.center).sub(zi))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Bi=new $e,Fi=new $e,ki=new $e,Gi=new $e,Vi=new $e,Hi=new $e,Wi=new $e;class ji{constructor(t=new $e,e=new $e(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Bi)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(i).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Bi.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Bi.copy(this.direction).multiplyScalar(e).add(this.origin),Bi.distanceToSquared(t))}distanceSqToSegment(t,e,i,n){Fi.copy(t).add(e).multiplyScalar(.5),ki.copy(e).sub(t).normalize(),Gi.copy(this.origin).sub(Fi);const r=.5*t.distanceTo(e),s=-this.direction.dot(ki),a=Gi.dot(this.direction),o=-Gi.dot(ki),l=Gi.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return i&&i.copy(this.direction).multiplyScalar(h).add(this.origin),n&&n.copy(ki).multiplyScalar(u).add(Fi),d}intersectSphere(t,e){Bi.subVectors(t.center,this.origin);const i=Bi.dot(this.direction),n=Bi.dot(Bi)-i*i,r=t.radius*t.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,n,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(i=(t.min.x-u.x)*l,n=(t.max.x-u.x)*l):(i=(t.max.x-u.x)*l,n=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),i>s||r>n?null:((r>i||isNaN(i))&&(i=r),(s=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o=0?i:n,e)))}intersectsBox(t){return null!==this.intersectBox(t,Bi)}intersectTriangle(t,e,i,n,r){Vi.subVectors(e,t),Hi.subVectors(i,t),Wi.crossVectors(Vi,Hi);let s,a=this.direction.dot(Wi);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}Gi.subVectors(this.origin,t);const o=s*this.direction.dot(Hi.crossVectors(Gi,Hi));if(o<0)return null;const l=s*this.direction.dot(Vi.cross(Gi));if(l<0)return null;if(o+l>a)return null;const c=-s*Gi.dot(Wi);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class qi{constructor(){qi.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}set(t,e,i,n,r,s,a,o,l,c,h,u,d,p,m,f){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new qi).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,n=1/Xi.setFromMatrixColumn(t,0).length(),r=1/Xi.setFromMatrixColumn(t,1).length(),s=1/Xi.setFromMatrixColumn(t,2).length();return e[0]=i[0]*n,e[1]=i[1]*n,e[2]=i[2]*n,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*s,e[9]=i[9]*s,e[10]=i[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,n=t.y,r=t.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),l=Math.sin(n),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=i+n*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=n+i*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t+r*a,e[4]=n*a-i,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=i*a-n,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=n+i*a,e[1]=i+n*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=n*l-i,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=i*l-n,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=n*h+i,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=i*h+n,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=i*h-n,e[2]=n*h-i,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Zi,t,Ji)}lookAt(t,e,i){const n=this.elements;return Qi.subVectors(t,e),0===Qi.lengthSq()&&(Qi.z=1),Qi.normalize(),Ki.crossVectors(i,Qi),0===Ki.lengthSq()&&(1===Math.abs(i.z)?Qi.x+=1e-4:Qi.z+=1e-4,Qi.normalize(),Ki.crossVectors(i,Qi)),Ki.normalize(),$i.crossVectors(Qi,Ki),n[0]=Ki.x,n[4]=$i.x,n[8]=Qi.x,n[1]=Ki.y,n[5]=$i.y,n[9]=Qi.y,n[2]=Ki.z,n[6]=$i.z,n[10]=Qi.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[4],o=i[8],l=i[12],c=i[1],h=i[5],u=i[9],d=i[13],p=i[2],m=i[6],f=i[10],g=i[14],v=i[3],x=i[7],_=i[11],y=i[15],M=n[0],b=n[4],S=n[8],w=n[12],T=n[1],A=n[5],E=n[9],C=n[13],L=n[2],R=n[6],P=n[10],I=n[14],D=n[3],N=n[7],O=n[11],z=n[15];return r[0]=s*M+a*T+o*L+l*D,r[4]=s*b+a*A+o*R+l*N,r[8]=s*S+a*E+o*P+l*O,r[12]=s*w+a*C+o*I+l*z,r[1]=c*M+h*T+u*L+d*D,r[5]=c*b+h*A+u*R+d*N,r[9]=c*S+h*E+u*P+d*O,r[13]=c*w+h*C+u*I+d*z,r[2]=p*M+m*T+f*L+g*D,r[6]=p*b+m*A+f*R+g*N,r[10]=p*S+m*E+f*P+g*O,r[14]=p*w+m*C+f*I+g*z,r[3]=v*M+x*T+_*L+y*D,r[7]=v*b+x*A+_*R+y*N,r[11]=v*S+x*E+_*P+y*O,r[15]=v*w+x*C+_*I+y*z,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],n=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-n*l*h-r*a*u+i*l*u+n*a*d-i*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-n*s*d+n*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+i*s*d+r*a*c-i*l*c)+t[15]*(-n*a*c-e*o*h+e*a*u+n*s*h-i*s*u+i*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const n=this.elements;return t.isVector3?(n[12]=t.x,n[13]=t.y,n[14]=t.z):(n[12]=t,n[13]=e,n[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],m=t[13],f=t[14],g=t[15],v=h*f*l-m*u*l+m*o*d-a*f*d-h*o*g+a*u*g,x=p*u*l-c*f*l-p*o*d+s*f*d+c*o*g-s*u*g,_=c*m*l-p*h*l+p*a*d-s*m*d-c*a*g+s*h*g,y=p*h*o-c*m*o-p*a*u+s*m*u+c*a*f-s*h*f,M=e*v+i*x+n*_+r*y;if(0===M)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/M;return t[0]=v*b,t[1]=(m*u*r-h*f*r-m*n*d+i*f*d+h*n*g-i*u*g)*b,t[2]=(a*f*r-m*o*r+m*n*l-i*f*l-a*n*g+i*o*g)*b,t[3]=(h*o*r-a*u*r-h*n*l+i*u*l+a*n*d-i*o*d)*b,t[4]=x*b,t[5]=(c*f*r-p*u*r+p*n*d-e*f*d-c*n*g+e*u*g)*b,t[6]=(p*o*r-s*f*r-p*n*l+e*f*l+s*n*g-e*o*g)*b,t[7]=(s*u*r-c*o*r+c*n*l-e*u*l-s*n*d+e*o*d)*b,t[8]=_*b,t[9]=(p*h*r-c*m*r-p*i*d+e*m*d+c*i*g-e*h*g)*b,t[10]=(s*m*r-p*a*r+p*i*l-e*m*l-s*i*g+e*a*g)*b,t[11]=(c*a*r-s*h*r-c*i*l+e*h*l+s*i*d-e*a*d)*b,t[12]=y*b,t[13]=(c*m*n-p*h*n+p*i*u-e*m*u-c*i*f+e*h*f)*b,t[14]=(p*a*n-s*m*n-p*i*o+e*m*o+s*i*f-e*a*f)*b,t[15]=(s*h*n-c*a*n+c*i*o-e*h*o-s*i*u+e*a*u)*b,this}scale(t){const e=this.elements,i=t.x,n=t.y,r=t.z;return e[0]*=i,e[4]*=n,e[8]*=r,e[1]*=i,e[5]*=n,e[9]*=r,e[2]*=i,e[6]*=n,e[10]*=r,e[3]*=i,e[7]*=n,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],n=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,n))}makeTranslation(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+i,l*a-n*o,l*o+n*a,0,l*a+n*o,c*a+i,c*o-n*s,0,l*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,n,r,s){return this.set(1,i,r,0,t,1,s,0,e,n,1,0,0,0,0,1),this}compose(t,e,i){const n=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,m=s*c,f=s*h,g=a*h,v=o*l,x=o*c,_=o*h,y=i.x,M=i.y,b=i.z;return n[0]=(1-(m+g))*y,n[1]=(d+_)*y,n[2]=(p-x)*y,n[3]=0,n[4]=(d-_)*M,n[5]=(1-(u+g))*M,n[6]=(f+v)*M,n[7]=0,n[8]=(p+x)*b,n[9]=(f-v)*b,n[10]=(1-(u+m))*b,n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,this}decompose(t,e,i){const n=this.elements;let r=Xi.set(n[0],n[1],n[2]).length();const s=Xi.set(n[4],n[5],n[6]).length(),a=Xi.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),t.x=n[12],t.y=n[13],t.z=n[14],Yi.copy(this);const o=1/r,l=1/s,c=1/a;return Yi.elements[0]*=o,Yi.elements[1]*=o,Yi.elements[2]*=o,Yi.elements[4]*=l,Yi.elements[5]*=l,Yi.elements[6]*=l,Yi.elements[8]*=c,Yi.elements[9]*=c,Yi.elements[10]*=c,e.setFromRotationMatrix(Yi),i.x=r,i.y=s,i.z=a,this}makePerspective(t,e,i,n,r,s){const a=this.elements,o=2*r/(e-t),l=2*r/(i-n),c=(e+t)/(e-t),h=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,n,r,s){const a=this.elements,o=1/(e-t),l=1/(i-n),c=1/(s-r),h=(e+t)*o,u=(i+n)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Xi=new $e,Yi=new qi,Zi=new $e(0,0,0),Ji=new $e(1,1,1),Ki=new $e,$i=new $e,Qi=new $e,tn=new qi,en=new Ke;class nn{constructor(t=0,e=0,i=0,n=nn.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=n}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,n=this._order){return this._x=t,this._y=e,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const n=t.elements,r=n[0],s=n[4],a=n[8],o=n[1],l=n[5],c=n[9],h=n[2],u=n[6],d=n[10];switch(e){case"XYZ":this._y=Math.asin(Oe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-Oe(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(Oe(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Oe(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(Oe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Oe(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return tn.makeRotationFromQuaternion(t),this.setFromRotationMatrix(tn,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return en.setFromEuler(this),this.setFromQuaternion(en,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}nn.DEFAULT_ORDER="XYZ";class rn{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(i=i.concat(r))}return i}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(hn,t,un),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(hn,dn,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);const e=this.children;for(let i=0,n=e.length;i0&&(n.userData=this.userData),n.layers=this.layers.mask,n.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(n.matrixAutoUpdate=!1),this.isInstancedMesh&&(n.type="InstancedMesh",n.count=this.count,n.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(n.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?n.background=this.background.toJSON():this.background.isTexture&&(n.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(n.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){n.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,n=i.length;e0){n.children=[];for(let e=0;e0){n.animations=[];for(let e=0;e0&&(i.geometries=e),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),l.length>0&&(i.skeletons=l),c.length>0&&(i.animations=c),h.length>0&&(i.nodes=h)}return i.object=n,i;function s(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(t,e,i,n,r){_n.subVectors(n,e),yn.subVectors(i,e),Mn.subVectors(t,e);const s=_n.dot(_n),a=_n.dot(yn),o=_n.dot(Mn),l=yn.dot(yn),c=yn.dot(Mn),h=s*l-a*a;if(0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,n){return this.getBarycoord(t,e,i,n,bn),bn.x>=0&&bn.y>=0&&bn.x+bn.y<=1}static getUV(t,e,i,n,r,s,a,o){return this.getBarycoord(t,e,i,n,bn),o.set(0,0),o.addScaledVector(r,bn.x),o.addScaledVector(s,bn.y),o.addScaledVector(a,bn.z),o}static isFrontFacing(t,e,i,n){return _n.subVectors(i,e),yn.subVectors(t,e),_n.cross(yn).dot(n)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,n){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[n]),this}setFromAttributeAndIndices(t,e,i,n){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,n),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return _n.subVectors(this.c,this.b),yn.subVectors(this.a,this.b),.5*_n.cross(yn).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Ln.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Ln.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,i,n,r){return Ln.getUV(t,this.a,this.b,this.c,e,i,n,r)}containsPoint(t){return Ln.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Ln.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,n=this.b,r=this.c;let s,a;Sn.subVectors(n,i),wn.subVectors(r,i),An.subVectors(t,i);const o=Sn.dot(An),l=wn.dot(An);if(o<=0&&l<=0)return e.copy(i);En.subVectors(t,n);const c=Sn.dot(En),h=wn.dot(En);if(c>=0&&h<=c)return e.copy(n);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(i).addScaledVector(Sn,s);Cn.subVectors(t,r);const d=Sn.dot(Cn),p=wn.dot(Cn);if(p>=0&&d<=p)return e.copy(r);const m=d*l-o*p;if(m<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(i).addScaledVector(wn,a);const f=c*p-d*h;if(f<=0&&h-c>=0&&d-p>=0)return Tn.subVectors(r,n),a=(h-c)/(h-c+(d-p)),e.copy(n).addScaledVector(Tn,a);const g=1/(f+m+u);return s=m*g,a=u*g,e.copy(i).addScaledVector(Sn,s).addScaledVector(wn,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let Rn=0;class Pn extends Le{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:Rn++}),this.uuid=Ne(),this.name="",this.type="Material",this.blending=d,this.side=l,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=A,this.blendDst=E,this.blendEquation=v,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=z,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Te,this.stencilZFail=Te,this.stencilZPass=Te,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}const n=this[e];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[e]=i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),this.blending!==d&&(i.blending=this.blending),this.side!==l&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.colorWrite=this.colorWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(i.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.forceSinglePass&&(i.forceSinglePass=this.forceSinglePass),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=this.flatShading),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=n(t.textures),r=n(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let n=0;n!==t;++n)i[n]=e[n].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}const In={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Dn={h:0,s:0,l:0},Nn={h:0,s:0,l:0};function On(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class zn{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=be){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,li.toWorkingColorSpace(this,e),this}setRGB(t,e,i,n=li.workingColorSpace){return this.r=t,this.g=e,this.b=i,li.toWorkingColorSpace(this,n),this}setHSL(t,e,i,n=li.workingColorSpace){if(t=ze(t,1),e=Oe(e,0,1),i=Oe(i,0,1),0===e)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+e):i+e-i*e,r=2*i-n;this.r=On(r,n,t+1/3),this.g=On(r,n,t),this.b=On(r,n,t-1/3)}return li.toWorkingColorSpace(this,n),this}setStyle(t,e=be){function i(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let n;if(n=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const s=n[1],a=n[2];switch(s){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,li.toWorkingColorSpace(this,e),i(r[4]),this;if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,li.toWorkingColorSpace(this,e),i(r[4]),this;break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a)){const t=parseFloat(r[1])/360,n=parseFloat(r[2])/100,s=parseFloat(r[3])/100;return i(r[4]),this.setHSL(t,n,s,e)}break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=n[1],r=i.length;if(3===r)return this.r=parseInt(i.charAt(0)+i.charAt(0),16)/255,this.g=parseInt(i.charAt(1)+i.charAt(1),16)/255,this.b=parseInt(i.charAt(2)+i.charAt(2),16)/255,li.toWorkingColorSpace(this,e),this;if(6===r)return this.r=parseInt(i.charAt(0)+i.charAt(1),16)/255,this.g=parseInt(i.charAt(2)+i.charAt(3),16)/255,this.b=parseInt(i.charAt(4)+i.charAt(5),16)/255,li.toWorkingColorSpace(this,e),this;console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=be){const i=In[t.toLowerCase()];return void 0!==i?this.setHex(i,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ei(t.r),this.g=ei(t.g),this.b=ei(t.b),this}copyLinearToSRGB(t){return this.r=ii(t.r),this.g=ii(t.g),this.b=ii(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=be){return li.fromWorkingColorSpace(Un.copy(this),t),Oe(255*Un.r,0,255)<<16^Oe(255*Un.g,0,255)<<8^Oe(255*Un.b,0,255)<<0}getHexString(t=be){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=li.workingColorSpace){li.fromWorkingColorSpace(Un.copy(this),e);const i=Un.r,n=Un.g,r=Un.b,s=Math.max(i,n,r),a=Math.min(i,n,r);let o,l;const c=(a+s)/2;if(a===s)o=0,l=0;else{const t=s-a;switch(l=c<=.5?t/(s+a):t/(2-s-a),s){case i:o=(n-r)/t+(n0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const n=i[e];t.data.attributes[e]=n.toJSON(t.data)}const n={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],s=[];for(let e=0,n=i.length;e0&&(n[e]=s,r=!0)}r&&(t.data.morphAttributes=n,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const n=t.attributes;for(const t in n){const i=n[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],n=r[t];for(let t=0,r=n.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}if(Qn.copy(r).invert(),tr.copy(t.ray).applyMatrix4(Qn),null!==i.boundingBox&&!1===tr.intersectsBox(i.boundingBox))return;let s;const a=i.index,o=i.attributes.position,l=i.attributes.uv,c=i.attributes.uv2,h=i.groups,u=i.drawRange;if(null!==a)if(Array.isArray(n))for(let i=0,r=h.length;ii.far?null:{distance:u,point:dr.clone(),object:t}}(t,e,i,n,nr,rr,sr,ur);if(u){r&&(lr.fromBufferAttribute(r,a),cr.fromBufferAttribute(r,o),hr.fromBufferAttribute(r,h),u.uv=Ln.getUV(ur,nr,rr,sr,lr,cr,hr,new We)),s&&(lr.fromBufferAttribute(s,a),cr.fromBufferAttribute(s,o),hr.fromBufferAttribute(s,h),u.uv2=Ln.getUV(ur,nr,rr,sr,lr,cr,hr,new We));const t={a:a,b:o,c:h,normal:new $e,materialIndex:0};Ln.getNormal(nr,rr,sr,t.normal),u.face=t}return u}class fr extends $n{constructor(t=1,e=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,i,n,r,s,p,m,f,g,v){const x=s/f,_=p/g,y=s/2,M=p/2,b=m/2,S=f+1,w=g+1;let T=0,A=0;const E=new $e;for(let s=0;s0?1:-1,c.push(E.x,E.y,E.z),h.push(o/f),h.push(1-s/g),T+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Mr extends xn{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new qi,this.projectionMatrix=new qi,this.projectionMatrixInverse=new qi}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}class br extends Mr{constructor(t=50,e=1,i=.1,n=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*De*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*Ie*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*De*Math.atan(Math.tan(.5*Ie*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,i,n,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*Ie*this.fov)/this.zoom,i=2*e,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/t,e-=s.offsetY*i/a,n*=s.width/t,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,e,e-i,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const Sr=-90;class wr extends xn{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i;const n=new br(Sr,1,t,e);n.layers=this.layers,n.up.set(0,1,0),n.lookAt(1,0,0),this.add(n);const r=new br(Sr,1,t,e);r.layers=this.layers,r.up.set(0,1,0),r.lookAt(-1,0,0),this.add(r);const s=new br(Sr,1,t,e);s.layers=this.layers,s.up.set(0,0,-1),s.lookAt(0,1,0),this.add(s);const a=new br(Sr,1,t,e);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(0,-1,0),this.add(a);const o=new br(Sr,1,t,e);o.layers=this.layers,o.up.set(0,1,0),o.lookAt(0,0,1),this.add(o);const l=new br(Sr,1,t,e);l.layers=this.layers,l.up.set(0,1,0),l.lookAt(0,0,-1),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const i=this.renderTarget,[n,r,s,a,o,l]=this.children,c=t.getRenderTarget(),h=t.toneMapping,u=t.xr.enabled;t.toneMapping=W,t.xr.enabled=!1;const d=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0),t.render(e,n),t.setRenderTarget(i,1),t.render(e,r),t.setRenderTarget(i,2),t.render(e,s),t.setRenderTarget(i,3),t.render(e,a),t.setRenderTarget(i,4),t.render(e,o),i.texture.generateMipmaps=d,t.setRenderTarget(i,5),t.render(e,l),t.setRenderTarget(c),t.toneMapping=h,t.xr.enabled=u,i.texture.needsPMREMUpdate=!0}}class Tr extends mi{constructor(t,e,i,n,r,s,a,o,l,c){super(t=void 0!==t?t:[],e=void 0!==e?e:K,i,n,r,s,a,o,l,c),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class Ar extends gi{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},n=[i,i,i,i,i,i];this.texture=new Tr(n,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:lt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},n=new fr(5,5,5),r=new yr({name:"CubemapFromEquirect",uniforms:gr(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:c,blending:u});r.uniforms.tEquirect.value=e;const s=new pr(n,r),a=e.minFilter;e.minFilter===ht&&(e.minFilter=lt);return new wr(1,10,this).update(t,s),e.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,i,n){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,n);t.setRenderTarget(r)}}const Er=new $e,Cr=new $e,Lr=new je;class Rr{constructor(t=new $e(1,0,0),e=0){this.isPlane=!0,this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,i){const n=Er.subVectors(i,e).cross(Cr.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){const i=t.delta(Er),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:e.copy(i).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||Lr.getNormalMatrix(t),n=this.coplanarPoint(Er).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const Pr=new Ui,Ir=new $e;class Dr{constructor(t=new Rr,e=new Rr,i=new Rr,n=new Rr,r=new Rr,s=new Rr){this.planes=[t,e,i,n,r,s]}set(t,e,i,n,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t){const e=this.planes,i=t.elements,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7],u=i[8],d=i[9],p=i[10],m=i[11],f=i[12],g=i[13],v=i[14],x=i[15];return e[0].setComponents(a-n,h-o,m-u,x-f).normalize(),e[1].setComponents(a+n,h+o,m+u,x+f).normalize(),e[2].setComponents(a+r,h+l,m+d,x+g).normalize(),e[3].setComponents(a-r,h-l,m-d,x-g).normalize(),e[4].setComponents(a-s,h-c,m-p,x-v).normalize(),e[5].setComponents(a+s,h+c,m+p,x+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),Pr.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(Pr)}intersectsSprite(t){return Pr.center.set(0,0,0),Pr.radius=.7071067811865476,Pr.applyMatrix4(t.matrixWorld),this.intersectsSphere(Pr)}intersectsSphere(t){const e=this.planes,i=t.center,n=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,Ir.y=n.normal.y>0?t.max.y:t.min.y,Ir.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(Ir)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function Nr(){let t=null,e=!1,i=null,n=null;function r(e,s){i(e,s),n=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==i&&(n=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(t){i=t},setContext:function(e){t=e}}}function Or(t,e){const i=e.isWebGL2,n=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),n.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const i=n.get(e);i&&(t.deleteBuffer(i.buffer),n.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=n.get(e);return void((!t||t.version 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif",iridescence_fragment:"#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660, 0.0556434,\n\t\t-1.5371385, 1.8760108, -0.2040259,\n\t\t-0.4985314, 0.0415560, 1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\t return vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat R21 = R12;\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos.xyz );\n\t\tvec3 vSigmaY = dFdy( surf_pos.xyz );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nfloat w0( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n}\nfloat w1( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n}\nfloat w2( float a ){\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n}\nfloat w3( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n}\nfloat g0( float a ) {\n\treturn w0( a ) + w1( a );\n}\nfloat g1( float a ) {\n\treturn w2( a ) + w3( a );\n}\nfloat h0( float a ) {\n\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n}\nfloat h1( float a ) {\n return 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n}\nvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\tuv = uv * texelSize.zw + 0.5;\n\tvec2 iuv = floor( uv );\n vec2 fuv = fract( uv );\n float g0x = g0( fuv.x );\n float g1x = g1( fuv.x );\n float h0x = h0( fuv.x );\n float h1x = h1( fuv.x );\n float h0y = h0( fuv.y );\n float h1y = h1( fuv.y );\n vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n \n vec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n}\nvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\treturn mix( fSample, cSample, fract( lod ) );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_v0 0.339\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_v1 0.276\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_v4 0.046\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_v5 0.016\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_v6 0.0038\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"vec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( LEGACY_LIGHTS )\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#else\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX_Iridescence( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness );\n\t#else\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometry.viewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform ivec2 morphTargetsTextureSize;\n\t\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec2 packDepthToRG( in highp float v ) {\n\treturn packDepthToRGBA( v ).yx;\n}\nfloat unpackRGToDepth( const in highp vec2 v ) {\n\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tuniform int boneTextureSize;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tfloat j = i * 4.0;\n\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\ty = dy * ( y + 0.5 );\n\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\treturn bone;\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Br={common:{diffuse:{value:new zn(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new je},uv2Transform:{value:new je},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new We(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new zn(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new zn(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new je}},sprite:{diffuse:{value:new zn(16777215)},opacity:{value:1},center:{value:new We(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new je}}},Fr={basic:{uniforms:vr([Br.common,Br.specularmap,Br.envmap,Br.aomap,Br.lightmap,Br.fog]),vertexShader:Ur.meshbasic_vert,fragmentShader:Ur.meshbasic_frag},lambert:{uniforms:vr([Br.common,Br.specularmap,Br.envmap,Br.aomap,Br.lightmap,Br.emissivemap,Br.bumpmap,Br.normalmap,Br.displacementmap,Br.fog,Br.lights,{emissive:{value:new zn(0)}}]),vertexShader:Ur.meshlambert_vert,fragmentShader:Ur.meshlambert_frag},phong:{uniforms:vr([Br.common,Br.specularmap,Br.envmap,Br.aomap,Br.lightmap,Br.emissivemap,Br.bumpmap,Br.normalmap,Br.displacementmap,Br.fog,Br.lights,{emissive:{value:new zn(0)},specular:{value:new zn(1118481)},shininess:{value:30}}]),vertexShader:Ur.meshphong_vert,fragmentShader:Ur.meshphong_frag},standard:{uniforms:vr([Br.common,Br.envmap,Br.aomap,Br.lightmap,Br.emissivemap,Br.bumpmap,Br.normalmap,Br.displacementmap,Br.roughnessmap,Br.metalnessmap,Br.fog,Br.lights,{emissive:{value:new zn(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Ur.meshphysical_vert,fragmentShader:Ur.meshphysical_frag},toon:{uniforms:vr([Br.common,Br.aomap,Br.lightmap,Br.emissivemap,Br.bumpmap,Br.normalmap,Br.displacementmap,Br.gradientmap,Br.fog,Br.lights,{emissive:{value:new zn(0)}}]),vertexShader:Ur.meshtoon_vert,fragmentShader:Ur.meshtoon_frag},matcap:{uniforms:vr([Br.common,Br.bumpmap,Br.normalmap,Br.displacementmap,Br.fog,{matcap:{value:null}}]),vertexShader:Ur.meshmatcap_vert,fragmentShader:Ur.meshmatcap_frag},points:{uniforms:vr([Br.points,Br.fog]),vertexShader:Ur.points_vert,fragmentShader:Ur.points_frag},dashed:{uniforms:vr([Br.common,Br.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Ur.linedashed_vert,fragmentShader:Ur.linedashed_frag},depth:{uniforms:vr([Br.common,Br.displacementmap]),vertexShader:Ur.depth_vert,fragmentShader:Ur.depth_frag},normal:{uniforms:vr([Br.common,Br.bumpmap,Br.normalmap,Br.displacementmap,{opacity:{value:1}}]),vertexShader:Ur.meshnormal_vert,fragmentShader:Ur.meshnormal_frag},sprite:{uniforms:vr([Br.sprite,Br.fog]),vertexShader:Ur.sprite_vert,fragmentShader:Ur.sprite_frag},background:{uniforms:{uvTransform:{value:new je},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Ur.background_vert,fragmentShader:Ur.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:Ur.backgroundCube_vert,fragmentShader:Ur.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Ur.cube_vert,fragmentShader:Ur.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Ur.equirect_vert,fragmentShader:Ur.equirect_frag},distanceRGBA:{uniforms:vr([Br.common,Br.displacementmap,{referencePosition:{value:new $e},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Ur.distanceRGBA_vert,fragmentShader:Ur.distanceRGBA_frag},shadow:{uniforms:vr([Br.lights,Br.fog,{color:{value:new zn(0)},opacity:{value:1}}]),vertexShader:Ur.shadow_vert,fragmentShader:Ur.shadow_frag}};Fr.physical={uniforms:vr([Fr.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new We(1,1)},clearcoatNormalMap:{value:null},iridescence:{value:0},iridescenceMap:{value:null},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},sheen:{value:0},sheenColor:{value:new zn(0)},sheenColorMap:{value:null},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new We},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new zn(0)},specularIntensity:{value:1},specularIntensityMap:{value:null},specularColor:{value:new zn(1,1,1)},specularColorMap:{value:null}}]),vertexShader:Ur.meshphysical_vert,fragmentShader:Ur.meshphysical_frag};const kr={r:0,b:0,g:0};function Gr(t,e,i,n,r,s,a){const o=new zn(0);let h,u,d=!0===s?0:1,p=null,m=0,f=null;function g(e,i){e.getRGB(kr,xr(t)),n.buffers.color.setClear(kr.r,kr.g,kr.b,i,a)}return{getClearColor:function(){return o},setClearColor:function(t,e=1){o.set(t),d=e,g(o,d)},getClearAlpha:function(){return d},setClearAlpha:function(t){d=t,g(o,d)},render:function(n,s){let a=!1,v=!0===s.isScene?s.background:null;if(v&&v.isTexture){v=(s.backgroundBlurriness>0?i:e).get(v)}const x=t.xr,_=x.getSession&&x.getSession();_&&"additive"===_.environmentBlendMode&&(v=null),null===v?g(o,d):v&&v.isColor&&(g(v,1),a=!0),(t.autoClear||a)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),v&&(v.isCubeTexture||v.mapping===et)?(void 0===u&&(u=new pr(new fr(1,1,1),new yr({name:"BackgroundCubeMaterial",uniforms:gr(Fr.backgroundCube.uniforms),vertexShader:Fr.backgroundCube.vertexShader,fragmentShader:Fr.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1})),u.geometry.deleteAttribute("normal"),u.geometry.deleteAttribute("uv"),u.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(u.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(u)),u.material.uniforms.envMap.value=v,u.material.uniforms.flipEnvMap.value=v.isCubeTexture&&!1===v.isRenderTargetTexture?-1:1,u.material.uniforms.backgroundBlurriness.value=s.backgroundBlurriness,u.material.uniforms.backgroundIntensity.value=s.backgroundIntensity,u.material.toneMapped=v.encoding!==xe,p===v&&m===v.version&&f===t.toneMapping||(u.material.needsUpdate=!0,p=v,m=v.version,f=t.toneMapping),u.layers.enableAll(),n.unshift(u,u.geometry,u.material,0,0,null)):v&&v.isTexture&&(void 0===h&&(h=new pr(new zr(2,2),new yr({name:"BackgroundMaterial",uniforms:gr(Fr.background.uniforms),vertexShader:Fr.background.vertexShader,fragmentShader:Fr.background.fragmentShader,side:l,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),Object.defineProperty(h.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(h)),h.material.uniforms.t2D.value=v,h.material.uniforms.backgroundIntensity.value=s.backgroundIntensity,h.material.toneMapped=v.encoding!==xe,!0===v.matrixAutoUpdate&&v.updateMatrix(),h.material.uniforms.uvTransform.value.copy(v.matrix),p===v&&m===v.version&&f===t.toneMapping||(h.material.needsUpdate=!0,p=v,m=v.version,f=t.toneMapping),h.layers.enableAll(),n.unshift(h,h.geometry,h.material,0,0,null))}}}function Vr(t,e,i,n){const r=t.getParameter(34921),s=n.isWebGL2?null:e.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},l=p(null);let c=l,h=!1;function u(e){return n.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function d(e){return n.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function p(t){const e=[],i=[],n=[];for(let t=0;t=0){const i=r[e];let n=s[e];if(void 0===n&&("instanceMatrix"===e&&t.instanceMatrix&&(n=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(n=t.instanceColor)),void 0===i)return!0;if(i.attribute!==n)return!0;if(n&&i.data!==n.data)return!0;a++}}return c.attributesNum!==a||c.index!==n}(r,_,d,y),M&&function(t,e,i,n){const r={},s=e.attributes;let a=0;const o=i.getAttributes();for(const e in o){if(o[e].location>=0){let i=s[e];void 0===i&&("instanceMatrix"===e&&t.instanceMatrix&&(i=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(i=t.instanceColor));const n={};n.attribute=i,i&&i.data&&(n.data=i.data),r[e]=n,a++}}c.attributes=r,c.attributesNum=a,c.index=n}(r,_,d,y)}else{const t=!0===l.wireframe;c.geometry===_.id&&c.program===d.id&&c.wireframe===t||(c.geometry=_.id,c.program=d.id,c.wireframe=t,M=!0)}null!==y&&i.update(y,34963),(M||h)&&(h=!1,function(r,s,a,o){if(!1===n.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===e.get("ANGLE_instanced_arrays"))return;m();const l=o.attributes,c=a.getAttributes(),h=s.defaultAttributeValues;for(const e in c){const n=c[e];if(n.location>=0){let s=l[e];if(void 0===s&&("instanceMatrix"===e&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===e&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const e=s.normalized,a=s.itemSize,l=i.get(s);if(void 0===l)continue;const c=l.buffer,h=l.type,u=l.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,l=i.stride,d=s.offset;if(i.isInstancedInterleavedBuffer){for(let t=0;t0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,h=t.getParameter(34930),u=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),m=t.getParameter(34921),f=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),x=u>0,_=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===e.has("EXT_texture_filter_anisotropic")){const i=e.get("EXT_texture_filter_anisotropic");n=t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:f,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:x,floatFragmentTextures:_,floatVertexTextures:x&&_,maxSamples:s?t.getParameter(36183):0}}function jr(t){const e=this;let i=null,n=0,r=!1,s=!1;const a=new Rr,o=new je,l={value:null,needsUpdate:!1};function c(t,i,n,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0);e.numPlanes=n,e.numIntersection=0}();else{const t=s?0:n,e=4*t;let r=m.clippingState||null;l.value=r,r=c(u,o,e,h);for(let t=0;t!==e;++t)r[t]=i[t];m.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=t}}}function qr(t){let e=new WeakMap;function i(t,e){return e===Q?t.mapping=K:e===tt&&(t.mapping=$),t}function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping;if(s===Q||s===tt){if(e.has(r)){return i(e.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=new Ar(s.height/2);return a.fromEquirectangularTexture(t,r),e.set(r,a),r.addEventListener("dispose",n),i(a.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}class Xr extends Mr{constructor(t=-1,e=1,i=1,n=-1,r=.1,s=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-t,s=i+t,a=n+e,o=n-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,a-=e*this.view.offsetY,o=a-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}const Yr=4,Zr=[.125,.215,.35,.446,.526,.582],Jr=20,Kr=new Xr,$r=new zn;let Qr=null;const ts=(1+Math.sqrt(5))/2,es=1/ts,is=[new $e(1,1,1),new $e(-1,1,1),new $e(1,1,-1),new $e(-1,1,-1),new $e(0,ts,es),new $e(0,ts,-es),new $e(es,0,ts),new $e(-es,0,ts),new $e(ts,es,0),new $e(-ts,es,0)];class ns{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,i=.1,n=100){Qr=this._renderer.getRenderTarget(),this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,i,n,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=os(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=as(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let t=0;tt-Yr?o=Zr[a-t+Yr-1]:0===a&&(o=0),n.push(o);const l=1/(s-2),c=-l,h=1+l,u=[c,c,h,c,h,h,c,c,h,h,c,h],d=6,p=6,m=3,f=2,g=1,v=new Float32Array(m*p*d),x=new Float32Array(f*p*d),_=new Float32Array(g*p*d);for(let t=0;t2?0:-1,n=[e,i,0,e+2/3,i,0,e+2/3,i+1,0,e,i,0,e+2/3,i+1,0,e,i+1,0];v.set(n,m*p*t),x.set(u,f*p*t);const r=[t,t,t,t,t,t];_.set(r,g*p*t)}const y=new $n;y.setAttribute("position",new Gn(v,m)),y.setAttribute("uv",new Gn(x,f)),y.setAttribute("faceIndex",new Gn(_,g)),e.push(y),r>Yr&&r--}return{lodPlanes:e,sizeLods:i,sigmas:n}}(n)),this._blurMaterial=function(t,e,i){const n=new Float32Array(Jr),r=new $e(0,1,0),s=new yr({name:"SphericalGaussianBlur",defines:{n:Jr,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r}},vertexShader:ls(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:u,depthTest:!1,depthWrite:!1});return s}(n,t,e)}return n}_compileMaterial(t){const e=new pr(this._lodPlanes[0],t);this._renderer.compile(e,Kr)}_sceneToCubeUV(t,e,i,n){const r=new br(90,1,e,i),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,l=o.autoClear,h=o.toneMapping;o.getClearColor($r),o.toneMapping=W,o.autoClear=!1;const u=new Bn({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),d=new pr(new fr,u);let p=!1;const m=t.background;m?m.isColor&&(u.color.copy(m),t.background=null,p=!0):(u.color.copy($r),p=!0);for(let e=0;e<6;e++){const i=e%3;0===i?(r.up.set(0,s[e],0),r.lookAt(a[e],0,0)):1===i?(r.up.set(0,0,s[e]),r.lookAt(0,a[e],0)):(r.up.set(0,s[e],0),r.lookAt(0,0,a[e]));const l=this._cubeSize;ss(n,i*l,e>2?l:0,l,l),o.setRenderTarget(n),p&&o.render(d,r),o.render(t,r)}d.geometry.dispose(),d.material.dispose(),o.toneMapping=h,o.autoClear=l,t.background=m}_textureToCubeUV(t,e){const i=this._renderer,n=t.mapping===K||t.mapping===$;n?(null===this._cubemapMaterial&&(this._cubemapMaterial=os()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===t.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=as());const r=n?this._cubemapMaterial:this._equirectMaterial,s=new pr(this._lodPlanes[0],r);r.uniforms.envMap.value=t;const a=this._cubeSize;ss(e,0,0,3*a,2*a),i.setRenderTarget(e),i.render(s,Kr)}_applyPMREM(t){const e=this._renderer,i=e.autoClear;e.autoClear=!1;for(let e=1;eJr&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${Jr}`);const f=[];let g=0;for(let t=0;tv-Yr?n-v+Yr:0),4*(this._cubeSize-x),3*x,2*x),o.setRenderTarget(e),o.render(c,Kr)}}function rs(t,e,i){const n=new gi(t,e,i);return n.texture.mapping=et,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function ss(t,e,i,n,r){t.viewport.set(e,i,n,r),t.scissor.set(e,i,n,r)}function as(){return new yr({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ls(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:u,depthTest:!1,depthWrite:!1})}function os(){return new yr({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ls(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:u,depthTest:!1,depthWrite:!1})}function ls(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function cs(t){let e=new WeakMap,i=null;function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping,a=s===Q||s===tt,o=s===K||s===$;if(a||o){if(r.isRenderTargetTexture&&!0===r.needsPMREMUpdate){r.needsPMREMUpdate=!1;let n=e.get(r);return null===i&&(i=new ns(t)),n=a?i.fromEquirectangular(r,n):i.fromCubemap(r,n),e.set(r,n),n.texture}if(e.has(r))return e.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(t){let e=0;const i=6;for(let n=0;ne.maxTextureSize&&(A=Math.ceil(T/e.maxTextureSize),T=e.maxTextureSize);const E=new Float32Array(T*A*4*m),C=new vi(E,T,A,m);C.type=vt,C.needsUpdate=!0;const L=4*w;for(let P=0;P0)return t;const r=e*i;let s=bs[r];if(void 0===s&&(s=new Float32Array(r),bs[r]=s),0!==e){n.toArray(s,0);for(let n=1,r=0;n!==e;++n)r+=i,t[n].toArray(s,r)}return s}function Cs(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i":" "} ${r}: ${i[t]}`)}return n.join("\n")}(t.getShaderSource(e),n)}return r}function Ta(t,e){const i=function(t){switch(t){case ve:return["Linear","( value )"];case xe:return["sRGB","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+i[0]+i[1]+"; }"}function Aa(t,e){let i;switch(e){case j:i="Linear";break;case q:i="Reinhard";break;case X:i="OptimizedCineon";break;case Y:i="ACESFilmic";break;case Z:i="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),i="Linear"}return"vec3 "+t+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function Ea(t){return""!==t}function Ca(t,e){const i=e.numSpotLightShadows+e.numSpotLightMaps-e.numSpotLightShadowsWithMaps;return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,e.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,i).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,e.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function La(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}const Ra=/^[ \t]*#include +<([\w\d./]+)>/gm;function Pa(t){return t.replace(Ra,Ia)}function Ia(t,e){const i=Ur[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return Pa(i)}const Da=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Na(t){return t.replace(Da,Oa)}function Oa(t,e,i,n){let r="";for(let t=parseInt(e);t0&&(_+="\n"),y=[g,v].filter(Ea).join("\n"),y.length>0&&(y+="\n")):(_=[za(i),"#define SHADER_NAME "+i.shaderName,v,i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"",i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+p:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.morphColors&&i.isWebGL2?"#define USE_MORPHCOLORS":"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+i.morphTextureStride:"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_COUNT "+i.morphTargetsCount:"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Ea).join("\n"),y=[g,za(i),"#define SHADER_NAME "+i.shaderName,v,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+d:"",i.envMap?"#define "+p:"",i.envMap?"#define "+m:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescence?"#define USE_IRIDESCENCE":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.sheen?"#define USE_SHEEN":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.useLegacyLights?"#define LEGACY_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",i.toneMapping!==W?"#define TONE_MAPPING":"",i.toneMapping!==W?Ur.tonemapping_pars_fragment:"",i.toneMapping!==W?Aa("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.opaque?"#define OPAQUE":"",Ur.encodings_pars_fragment,Ta("linearToOutputTexel",i.outputEncoding),i.useDepthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(Ea).join("\n")),c=Pa(c),c=Ca(c,i),c=La(c,i),h=Pa(h),h=Ca(h,i),h=La(h,i),c=Na(c),h=Na(h),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(M="#version 300 es\n",_=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,y=["#define varying in",i.glslVersion===Ee?"":"layout(location = 0) out highp vec4 pc_fragColor;",i.glslVersion===Ee?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+y);const b=M+y+h,S=ba(r,35633,M+_+c),w=ba(r,35632,b);if(r.attachShader(x,S),r.attachShader(x,w),void 0!==i.index0AttributeName?r.bindAttribLocation(x,0,i.index0AttributeName):!0===i.morphTargets&&r.bindAttribLocation(x,0,"position"),r.linkProgram(x),t.debug.checkShaderErrors){const t=r.getProgramInfoLog(x).trim(),e=r.getShaderInfoLog(S).trim(),i=r.getShaderInfoLog(w).trim();let n=!0,s=!0;if(!1===r.getProgramParameter(x,35714)){n=!1;const e=wa(r,S,"vertex"),i=wa(r,w,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(x,35715)+"\n\nProgram Info Log: "+t+"\n"+e+"\n"+i)}else""!==t?console.warn("THREE.WebGLProgram: Program Info Log:",t):""!==e&&""!==i||(s=!1);s&&(this.diagnostics={runnable:n,programLog:t,vertexShader:{log:e,prefix:_},fragmentShader:{log:i,prefix:y}})}let T,A;return r.deleteShader(S),r.deleteShader(w),this.getUniforms=function(){return void 0===T&&(T=new Ma(r,x)),T},this.getAttributes=function(){return void 0===A&&(A=function(t,e){const i={},n=t.getProgramParameter(e,35721);for(let r=0;r0,O=s.clearcoat>0,z=s.iridescence>0;return{isWebGL2:p,shaderID:T,shaderName:s.type,vertexShader:C,fragmentShader:L,defines:s.defines,customVertexShaderID:R,customFragmentShaderID:P,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:g,instancing:!0===_.isInstancedMesh,instancingColor:!0===_.isInstancedMesh&&null!==_.instanceColor,supportsVertexTextures:f,outputEncoding:null===D?t.outputEncoding:!0===D.isXRRenderTarget?D.texture.encoding:ve,map:!!s.map,matcap:!!s.matcap,envMap:!!S,envMapMode:S&&S.mapping,envMapCubeUVHeight:w,lightMap:!!s.lightMap,aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:s.normalMapType===Me,tangentSpaceNormalMap:s.normalMapType===ye,decodeVideoTexture:!!s.map&&!0===s.map.isVideoTexture&&s.map.encoding===xe,clearcoat:O,clearcoatMap:O&&!!s.clearcoatMap,clearcoatRoughnessMap:O&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:O&&!!s.clearcoatNormalMap,iridescence:z,iridescenceMap:z&&!!s.iridescenceMap,iridescenceThicknessMap:z&&!!s.iridescenceThicknessMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularColorMap:!!s.specularColorMap,opaque:!1===s.transparent&&s.blending===d,alphaMap:!!s.alphaMap,alphaTest:N,gradientMap:!!s.gradientMap,sheen:s.sheen>0,sheenColorMap:!!s.sheenColorMap,sheenRoughnessMap:!!s.sheenRoughnessMap,transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!M.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!M.attributes.color&&4===M.attributes.color.itemSize,vertexUvs:!!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatMap||s.clearcoatRoughnessMap||s.clearcoatNormalMap||s.iridescenceMap||s.iridescenceThicknessMap||s.displacementMap||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheenColorMap||s.sheenRoughnessMap),uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.iridescenceMap||s.iridescenceThicknessMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheen>0||s.sheenColorMap||s.sheenRoughnessMap||!s.displacementMap),fog:!!y,useFog:!0===s.fog,fogExp2:y&&y.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:m,skinning:!0===_.isSkinnedMesh,morphTargets:void 0!==M.morphAttributes.position,morphNormals:void 0!==M.morphAttributes.normal,morphColors:void 0!==M.morphAttributes.color,morphTargetsCount:E,morphTextureStride:I,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numSpotLightMaps:o.spotLightMap.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numSpotLightShadowsWithMaps:o.numSpotLightShadowsWithMaps,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:s.dithering,shadowMapEnabled:t.shadowMap.enabled&&u.length>0,shadowMapType:t.shadowMap.type,toneMapping:s.toneMapped?t.toneMapping:W,useLegacyLights:t.useLegacyLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:s.side===h,flipSided:s.side===c,useDepthPacking:!!s.depthPacking,depthPacking:s.depthPacking||0,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:p||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:p||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:p||n.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(e){const i=[];if(e.shaderID?i.push(e.shaderID):(i.push(e.customVertexShaderID),i.push(e.customFragmentShaderID)),void 0!==e.defines)for(const t in e.defines)i.push(t),i.push(e.defines[t]);return!1===e.isRawShaderMaterial&&(!function(t,e){t.push(e.precision),t.push(e.outputEncoding),t.push(e.envMapMode),t.push(e.envMapCubeUVHeight),t.push(e.combine),t.push(e.vertexUvs),t.push(e.fogExp2),t.push(e.sizeAttenuation),t.push(e.morphTargetsCount),t.push(e.morphAttributeCount),t.push(e.numDirLights),t.push(e.numPointLights),t.push(e.numSpotLights),t.push(e.numSpotLightMaps),t.push(e.numHemiLights),t.push(e.numRectAreaLights),t.push(e.numDirLightShadows),t.push(e.numPointLightShadows),t.push(e.numSpotLightShadows),t.push(e.numSpotLightShadowsWithMaps),t.push(e.shadowMapType),t.push(e.toneMapping),t.push(e.numClippingPlanes),t.push(e.numClipIntersection),t.push(e.depthPacking)}(i,e),function(t,e){o.disableAll(),e.isWebGL2&&o.enable(0);e.supportsVertexTextures&&o.enable(1);e.instancing&&o.enable(2);e.instancingColor&&o.enable(3);e.map&&o.enable(4);e.matcap&&o.enable(5);e.envMap&&o.enable(6);e.lightMap&&o.enable(7);e.aoMap&&o.enable(8);e.emissiveMap&&o.enable(9);e.bumpMap&&o.enable(10);e.normalMap&&o.enable(11);e.objectSpaceNormalMap&&o.enable(12);e.tangentSpaceNormalMap&&o.enable(13);e.clearcoat&&o.enable(14);e.clearcoatMap&&o.enable(15);e.clearcoatRoughnessMap&&o.enable(16);e.clearcoatNormalMap&&o.enable(17);e.iridescence&&o.enable(18);e.iridescenceMap&&o.enable(19);e.iridescenceThicknessMap&&o.enable(20);e.displacementMap&&o.enable(21);e.specularMap&&o.enable(22);e.roughnessMap&&o.enable(23);e.metalnessMap&&o.enable(24);e.gradientMap&&o.enable(25);e.alphaMap&&o.enable(26);e.alphaTest&&o.enable(27);e.vertexColors&&o.enable(28);e.vertexAlphas&&o.enable(29);e.vertexUvs&&o.enable(30);e.vertexTangents&&o.enable(31);e.uvsVertexOnly&&o.enable(32);t.push(o.mask),o.disableAll(),e.fog&&o.enable(0);e.useFog&&o.enable(1);e.flatShading&&o.enable(2);e.logarithmicDepthBuffer&&o.enable(3);e.skinning&&o.enable(4);e.morphTargets&&o.enable(5);e.morphNormals&&o.enable(6);e.morphColors&&o.enable(7);e.premultipliedAlpha&&o.enable(8);e.shadowMapEnabled&&o.enable(9);e.useLegacyLights&&o.enable(10);e.doubleSided&&o.enable(11);e.flipSided&&o.enable(12);e.useDepthPacking&&o.enable(13);e.dithering&&o.enable(14);e.specularIntensityMap&&o.enable(15);e.specularColorMap&&o.enable(16);e.transmission&&o.enable(17);e.transmissionMap&&o.enable(18);e.thicknessMap&&o.enable(19);e.sheen&&o.enable(20);e.sheenColorMap&&o.enable(21);e.sheenRoughnessMap&&o.enable(22);e.decodeVideoTexture&&o.enable(23);e.opaque&&o.enable(24);t.push(o.mask)}(i,e),i.push(t.outputEncoding)),i.push(e.customProgramCacheKey),i.join()},getUniforms:function(t){const e=v[t.type];let i;if(e){const t=Fr[e];i=_r.clone(t.uniforms)}else i=t.uniforms;return i},acquireProgram:function(e,i){let n;for(let t=0,e=u.length;t0?n.push(h):!0===a.transparent?r.push(h):i.push(h)},unshift:function(t,e,a,o,l,c){const h=s(t,e,a,o,l,c);a.transmission>0?n.unshift(h):!0===a.transparent?r.unshift(h):i.unshift(h)},finish:function(){for(let i=e,n=t.length;i1&&i.sort(t||Ha),n.length>1&&n.sort(e||Wa),r.length>1&&r.sort(e||Wa)}}}function qa(){let t=new WeakMap;return{get:function(e,i){const n=t.get(e);let r;return void 0===n?(r=new ja,t.set(e,[r])):i>=n.length?(r=new ja,n.push(r)):r=n[i],r},dispose:function(){t=new WeakMap}}}function Xa(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new $e,color:new zn};break;case"SpotLight":i={position:new $e,direction:new $e,color:new zn,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new $e,color:new zn,distance:0,decay:0};break;case"HemisphereLight":i={direction:new $e,skyColor:new zn,groundColor:new zn};break;case"RectAreaLight":i={color:new zn,position:new $e,halfWidth:new $e,halfHeight:new $e}}return t[e.id]=i,i}}}let Ya=0;function Za(t,e){return(e.castShadow?2:0)-(t.castShadow?2:0)+(e.map?1:0)-(t.map?1:0)}function Ja(t,e){const i=new Xa,n=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new We};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new We,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0};for(let t=0;t<9;t++)r.probe.push(new $e);const s=new $e,a=new qi,o=new qi;return{setup:function(s,a){let o=0,l=0,c=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let h=0,u=0,d=0,p=0,m=0,f=0,g=0,v=0,x=0,_=0;s.sort(Za);const y=!0===a?Math.PI:1;for(let t=0,e=s.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=Br.LTC_FLOAT_1,r.rectAreaLTC2=Br.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Br.LTC_HALF_1,r.rectAreaLTC2=Br.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=l,r.ambient[2]=c;const M=r.hash;M.directionalLength===h&&M.pointLength===u&&M.spotLength===d&&M.rectAreaLength===p&&M.hemiLength===m&&M.numDirectionalShadows===f&&M.numPointShadows===g&&M.numSpotShadows===v&&M.numSpotMaps===x||(r.directional.length=h,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=m,r.directionalShadow.length=f,r.directionalShadowMap.length=f,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=v,r.spotShadowMap.length=v,r.directionalShadowMatrix.length=f,r.pointShadowMatrix.length=g,r.spotLightMatrix.length=v+x-_,r.spotLightMap.length=x,r.numSpotLightShadowsWithMaps=_,M.directionalLength=h,M.pointLength=u,M.spotLength=d,M.rectAreaLength=p,M.hemiLength=m,M.numDirectionalShadows=f,M.numPointShadows=g,M.numSpotShadows=v,M.numSpotMaps=x,r.version=Ya++)},setupView:function(t,e){let i=0,n=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e=s.length?(a=new Ka(t,e),s.push(a)):a=s[r],a},dispose:function(){i=new WeakMap}}}class Qa extends Pn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class to extends Pn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.referencePosition=new $e,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}const eo="void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",io="uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}";function no(t,e,i){let n=new Dr;const r=new We,a=new We,d=new fi,p=new Qa({depthPacking:_e}),m=new to,f={},g=i.maxTextureSize,v={[l]:c,[c]:l,[h]:h},x=new yr({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new We},radius:{value:4}},vertexShader:eo,fragmentShader:io}),_=x.clone();_.defines.HORIZONTAL_PASS=1;const y=new $n;y.setAttribute("position",new Gn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const M=new pr(y,x),b=this;function S(i,n){const s=e.update(M);x.defines.VSM_SAMPLES!==i.blurSamples&&(x.defines.VSM_SAMPLES=i.blurSamples,_.defines.VSM_SAMPLES=i.blurSamples,x.needsUpdate=!0,_.needsUpdate=!0),null===i.mapPass&&(i.mapPass=new gi(r.x,r.y)),x.uniforms.shadow_pass.value=i.map.texture,x.uniforms.resolution.value=i.mapSize,x.uniforms.radius.value=i.radius,t.setRenderTarget(i.mapPass),t.clear(),t.renderBufferDirect(n,null,s,x,M,null),_.uniforms.shadow_pass.value=i.mapPass.texture,_.uniforms.resolution.value=i.mapSize,_.uniforms.radius.value=i.radius,t.setRenderTarget(i.map),t.clear(),t.renderBufferDirect(n,null,s,_,M,null)}function w(e,i,n,r,s,a){let l=null;const c=!0===n.isPointLight?e.customDistanceMaterial:e.customDepthMaterial;if(void 0!==c)l=c;else if(l=!0===n.isPointLight?m:p,t.localClippingEnabled&&!0===i.clipShadows&&Array.isArray(i.clippingPlanes)&&0!==i.clippingPlanes.length||i.displacementMap&&0!==i.displacementScale||i.alphaMap&&i.alphaTest>0||i.map&&i.alphaTest>0){const t=l.uuid,e=i.uuid;let n=f[t];void 0===n&&(n={},f[t]=n);let r=n[e];void 0===r&&(r=l.clone(),n[e]=r),l=r}return l.visible=i.visible,l.wireframe=i.wireframe,l.side=a===o?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:v[i.side],l.alphaMap=i.alphaMap,l.alphaTest=i.alphaTest,l.map=i.map,l.clipShadows=i.clipShadows,l.clippingPlanes=i.clippingPlanes,l.clipIntersection=i.clipIntersection,l.displacementMap=i.displacementMap,l.displacementScale=i.displacementScale,l.displacementBias=i.displacementBias,l.wireframeLinewidth=i.wireframeLinewidth,l.linewidth=i.linewidth,!0===n.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(n.matrixWorld),l.nearDistance=r,l.farDistance=s),l}function T(i,r,s,a,l){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&l===o)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=e.update(i),r=i.material;if(Array.isArray(r)){const e=n.groups;for(let o=0,c=e.length;og||r.y>g)&&(r.x>g&&(a.x=Math.floor(g/u.x),r.x=a.x*u.x,h.mapSize.x=a.x),r.y>g&&(a.y=Math.floor(g/u.y),r.y=a.y*u.y,h.mapSize.y=a.y)),null===h.map){const t=this.type!==o?{minFilter:st,magFilter:st}:{};h.map=new gi(r.x,r.y,t),h.map.texture.name=c.name+".shadowMap",h.camera.updateProjectionMatrix()}t.setRenderTarget(h.map),t.clear();const m=h.getViewportCount();for(let t=0;t=1):-1!==dt.indexOf("OpenGL ES")&&(ut=parseFloat(/^OpenGL ES (\d)/.exec(dt)[1]),ht=ut>=2);let pt=null,mt={};const ft=t.getParameter(3088),gt=t.getParameter(2978),vt=(new fi).fromArray(ft),xt=(new fi).fromArray(gt);function _t(e,i,n){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;en||t.height>n)&&(r=n/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const n=e?ke:Math.floor,s=n(r*t.width),a=n(r*t.height);void 0===f&&(f=x(s,a));const o=i?x(s,a):f;o.width=s,o.height=a;return o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function y(t){return Be(t.width)&&Be(t.height)}function M(t,e){return t.generateMipmaps&&e&&t.minFilter!==st&&t.minFilter!==lt}function b(e){t.generateMipmap(e)}function S(i,n,r,s,a=!1){if(!1===o)return n;if(null!==i){if(void 0!==t[i])return t[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let l=n;return 6403===n&&(5126===r&&(l=33326),5131===r&&(l=33325),5121===r&&(l=33321)),33319===n&&(5126===r&&(l=33328),5131===r&&(l=33327),5121===r&&(l=33323)),6408===n&&(5126===r&&(l=34836),5131===r&&(l=34842),5121===r&&(l=s===xe&&!1===a?35907:32856),32819===r&&(l=32854),32820===r&&(l=32855)),33325!==l&&33326!==l&&33327!==l&&33328!==l&&34842!==l&&34836!==l||e.get("EXT_color_buffer_float"),l}function w(t,e,i){return!0===M(t,i)||t.isFramebufferTexture&&t.minFilter!==st&&t.minFilter!==lt?Math.log2(Math.max(e.width,e.height))+1:void 0!==t.mipmaps&&t.mipmaps.length>0?t.mipmaps.length:t.isCompressedTexture&&Array.isArray(t.image)?e.mipmaps.length:1}function T(t){return t===st||t===at||t===ot?9728:9729}function A(t){const e=t.target;e.removeEventListener("dispose",A),function(t){const e=n.get(t);if(void 0===e.__webglInit)return;const i=t.source,r=g.get(i);if(r){const n=r[e.__cacheKey];n.usedTimes--,0===n.usedTimes&&C(t),0===Object.keys(r).length&&g.delete(i)}n.remove(t)}(e),e.isVideoTexture&&m.delete(e)}function E(e){const i=e.target;i.removeEventListener("dispose",E),function(e){const i=e.texture,r=n.get(e),s=n.get(i);void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else{if(t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer)for(let e=0;e0&&r.__version!==t.version){const i=t.image;if(null===i)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==i.complete)return void O(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.bindTexture(3553,r.__webglTexture,33984+e)}const P={[it]:10497,[nt]:33071,[rt]:33648},I={[st]:9728,[at]:9984,[ot]:9986,[lt]:9729,[ct]:9985,[ht]:9987};function D(i,s,a){if(a?(t.texParameteri(i,10242,P[s.wrapS]),t.texParameteri(i,10243,P[s.wrapT]),32879!==i&&35866!==i||t.texParameteri(i,32882,P[s.wrapR]),t.texParameteri(i,10240,I[s.magFilter]),t.texParameteri(i,10241,I[s.minFilter])):(t.texParameteri(i,10242,33071),t.texParameteri(i,10243,33071),32879!==i&&35866!==i||t.texParameteri(i,32882,33071),s.wrapS===nt&&s.wrapT===nt||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(i,10240,T(s.magFilter)),t.texParameteri(i,10241,T(s.minFilter)),s.minFilter!==st&&s.minFilter!==lt&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===e.has("EXT_texture_filter_anisotropic")){const a=e.get("EXT_texture_filter_anisotropic");if(s.magFilter===st)return;if(s.minFilter!==ot&&s.minFilter!==ht)return;if(s.type===vt&&!1===e.has("OES_texture_float_linear"))return;if(!1===o&&s.type===xt&&!1===e.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(t.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function N(e,i){let n=!1;void 0===e.__webglInit&&(e.__webglInit=!0,i.addEventListener("dispose",A));const r=i.source;let s=g.get(r);void 0===s&&(s={},g.set(r,s));const o=function(t){const e=[];return e.push(t.wrapS),e.push(t.wrapT),e.push(t.wrapR||0),e.push(t.magFilter),e.push(t.minFilter),e.push(t.anisotropy),e.push(t.internalFormat),e.push(t.format),e.push(t.type),e.push(t.generateMipmaps),e.push(t.premultiplyAlpha),e.push(t.flipY),e.push(t.unpackAlignment),e.push(t.encoding),e.join()}(i);if(o!==e.__cacheKey){void 0===s[o]&&(s[o]={texture:t.createTexture(),usedTimes:0},a.memory.textures++,n=!0),s[o].usedTimes++;const r=s[e.__cacheKey];void 0!==r&&(s[e.__cacheKey].usedTimes--,0===r.usedTimes&&C(i)),e.__cacheKey=o,e.__webglTexture=s[o].texture}return n}function O(e,r,a){let l=3553;(r.isDataArrayTexture||r.isCompressedArrayTexture)&&(l=35866),r.isData3DTexture&&(l=32879);const c=N(e,r),u=r.source;i.bindTexture(l,e.__webglTexture,33984+a);const d=n.get(u);if(u.version!==d.__version||!0===c){i.activeTexture(33984+a),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=function(t){return!o&&(t.wrapS!==nt||t.wrapT!==nt||t.minFilter!==st&&t.minFilter!==lt)}(r)&&!1===y(r.image);let n=_(r.image,e,!1,h);n=G(r,n);const p=y(n)||o,m=s.convert(r.format,r.encoding);let f,g=s.convert(r.type),v=S(r.internalFormat,m,g,r.encoding,r.isVideoTexture);D(l,r,p);const x=r.mipmaps,T=o&&!0!==r.isVideoTexture,A=void 0===d.__version||!0===c,E=w(r,n,p);if(r.isDepthTexture)v=6402,o?v=r.type===vt?36012:r.type===gt?33190:r.type===Mt?35056:33189:r.type===vt&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),r.format===At&&6402===v&&r.type!==mt&&r.type!==gt&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=gt,g=s.convert(r.type)),r.format===Et&&6402===v&&(v=34041,r.type!==Mt&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=Mt,g=s.convert(r.type))),A&&(T?i.texStorage2D(3553,1,v,n.width,n.height):i.texImage2D(3553,0,v,n.width,n.height,0,m,g,null));else if(r.isDataTexture)if(x.length>0&&p){T&&A&&i.texStorage2D(3553,E,v,x[0].width,x[0].height);for(let t=0,e=x.length;t>=1,e>>=1}}else if(x.length>0&&p){T&&A&&i.texStorage2D(3553,E,v,x[0].width,x[0].height);for(let t=0,e=x.length;t=34069&&l<=34074)&&t.framebufferTexture2D(36160,o,l,n.get(a).__webglTexture,0),i.bindFramebuffer(36160,null)}function U(e,i,n){if(t.bindRenderbuffer(36161,e),i.depthBuffer&&!i.stencilBuffer){let r=33189;if(n||k(i)){const e=i.depthTexture;e&&e.isDepthTexture&&(e.type===vt?r=36012:e.type===gt&&(r=33190));const n=F(i);k(i)?d.renderbufferStorageMultisampleEXT(36161,n,r,i.width,i.height):t.renderbufferStorageMultisample(36161,n,r,i.width,i.height)}else t.renderbufferStorage(36161,r,i.width,i.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(i.depthBuffer&&i.stencilBuffer){const r=F(i);n&&!1===k(i)?t.renderbufferStorageMultisample(36161,r,35056,i.width,i.height):k(i)?d.renderbufferStorageMultisampleEXT(36161,r,35056,i.width,i.height):t.renderbufferStorage(36161,34041,i.width,i.height),t.framebufferRenderbuffer(36160,33306,36161,e)}else{const e=!0===i.isWebGLMultipleRenderTargets?i.texture:[i.texture];for(let r=0;r0&&!0===e.has("WEBGL_multisampled_render_to_texture")&&!1!==i.__useRenderToTexture}function G(t,i){const n=t.encoding,r=t.format,s=t.type;return!0===t.isCompressedTexture||!0===t.isVideoTexture||t.format===Ce||n!==ve&&(n===xe?!1===o?!0===e.has("EXT_sRGB")&&r===St?(t.format=Ce,t.minFilter=lt,t.generateMipmaps=!1):i=hi.sRGBToLinear(i):r===St&&s===ut||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",n)),i}this.allocateTextureUnit=function(){const t=L;return t>=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),L+=1,t},this.resetTextureUnits=function(){L=0},this.setTexture2D=R,this.setTexture2DArray=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?O(r,t,e):i.bindTexture(35866,r.__webglTexture,33984+e)},this.setTexture3D=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?O(r,t,e):i.bindTexture(32879,r.__webglTexture,33984+e)},this.setTextureCube=function(e,r){const a=n.get(e);e.version>0&&a.__version!==e.version?function(e,r,a){if(6!==r.image.length)return;const l=N(e,r),h=r.source;i.bindTexture(34067,e.__webglTexture,33984+a);const u=n.get(h);if(h.version!==u.__version||!0===l){i.activeTexture(33984+a),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=r.isCompressedTexture||r.image[0].isCompressedTexture,n=r.image[0]&&r.image[0].isDataTexture,d=[];for(let t=0;t<6;t++)d[t]=e||n?n?r.image[t].image:r.image[t]:_(r.image[t],!1,!0,c),d[t]=G(r,d[t]);const p=d[0],m=y(p)||o,f=s.convert(r.format,r.encoding),g=s.convert(r.type),v=S(r.internalFormat,f,g,r.encoding),x=o&&!0!==r.isVideoTexture,T=void 0===u.__version||!0===l;let A,E=w(r,p,m);if(D(34067,r,m),e){x&&T&&i.texStorage2D(34067,E,v,p.width,p.height);for(let t=0;t<6;t++){A=d[t].mipmaps;for(let e=0;e0&&E++,i.texStorage2D(34067,E,v,d[0].width,d[0].height));for(let t=0;t<6;t++)if(n){x?i.texSubImage2D(34069+t,0,0,0,d[t].width,d[t].height,f,g,d[t].data):i.texImage2D(34069+t,0,v,d[t].width,d[t].height,0,f,g,d[t].data);for(let e=0;e0&&!1===k(e)){const n=d?l:[l];c.__webglMultisampledFramebuffer=t.createFramebuffer(),c.__webglColorRenderbuffer=[],i.bindFramebuffer(36160,c.__webglMultisampledFramebuffer);for(let i=0;i0&&!1===k(e)){const r=e.isWebGLMultipleRenderTargets?e.texture:[e.texture],s=e.width,a=e.height;let o=16384;const l=[],c=e.stencilBuffer?33306:36096,h=n.get(e),u=!0===e.isWebGLMultipleRenderTargets;if(u)for(let e=0;eo+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(n=e.getPose(t.targetRaySpace,i),null===n&&null!==r&&(n=r),null!==n&&(a.matrix.fromArray(n.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),n.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(n.linearVelocity)):a.hasLinearVelocity=!1,n.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(n.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(co)))}return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new lo;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class uo extends mi{constructor(t,e,i,n,r,s,a,o,l,c){if((c=void 0!==c?c:At)!==At&&c!==Et)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===At&&(i=gt),void 0===i&&c===Et&&(i=Mt),super(null,n,r,s,a,o,c,i,l),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==a?a:st,this.minFilter=void 0!==o?o:st,this.flipY=!1,this.generateMipmaps=!1}}class po extends Le{constructor(t,e){super();const i=this;let n=null,r=1,s=null,a="local-floor",o=1,l=null,c=null,h=null,u=null,d=null,p=null;const m=e.getContextAttributes();let f=null,g=null;const v=[],x=[],_=new Set,y=new Map,M=new br;M.layers.enable(1),M.viewport=new fi;const b=new br;b.layers.enable(2),b.viewport=new fi;const S=[M,b],w=new oo;w.layers.enable(1),w.layers.enable(2);let T=null,A=null;function E(t){const e=x.indexOf(t.inputSource);if(-1===e)return;const i=v[e];void 0!==i&&i.dispatchEvent({type:t.type,data:t.inputSource})}function C(){n.removeEventListener("select",E),n.removeEventListener("selectstart",E),n.removeEventListener("selectend",E),n.removeEventListener("squeeze",E),n.removeEventListener("squeezestart",E),n.removeEventListener("squeezeend",E),n.removeEventListener("end",C),n.removeEventListener("inputsourceschange",L);for(let t=0;t=0&&(x[n]=null,v[n].disconnect(i))}for(let e=0;e=x.length){x.push(i),n=t;break}if(null===x[t]){x[t]=i,n=t;break}}if(-1===n)break}const r=v[n];r&&r.connect(i)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=v[t];return void 0===e&&(e=new ho,v[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=v[t];return void 0===e&&(e=new ho,v[t]=e),e.getGripSpace()},this.getHand=function(t){let e=v[t];return void 0===e&&(e=new ho,v[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){r=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){a=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return l||s},this.setReferenceSpace=function(t){l=t},this.getBaseLayer=function(){return null!==u?u:d},this.getBinding=function(){return h},this.getFrame=function(){return p},this.getSession=function(){return n},this.setSession=async function(c){if(n=c,null!==n){if(f=t.getRenderTarget(),n.addEventListener("select",E),n.addEventListener("selectstart",E),n.addEventListener("selectend",E),n.addEventListener("squeeze",E),n.addEventListener("squeezestart",E),n.addEventListener("squeezeend",E),n.addEventListener("end",C),n.addEventListener("inputsourceschange",L),!0!==m.xrCompatible&&await e.makeXRCompatible(),void 0===n.renderState.layers||!1===t.capabilities.isWebGL2){const i={antialias:void 0!==n.renderState.layers||m.antialias,alpha:m.alpha,depth:m.depth,stencil:m.stencil,framebufferScaleFactor:r};d=new XRWebGLLayer(n,e,i),n.updateRenderState({baseLayer:d}),g=new gi(d.framebufferWidth,d.framebufferHeight,{format:St,type:ut,encoding:t.outputEncoding,stencilBuffer:m.stencil})}else{let i=null,s=null,a=null;m.depth&&(a=m.stencil?35056:33190,i=m.stencil?Et:At,s=m.stencil?Mt:gt);const o={colorFormat:32856,depthFormat:a,scaleFactor:r};h=new XRWebGLBinding(n,e),u=h.createProjectionLayer(o),n.updateRenderState({layers:[u]}),g=new gi(u.textureWidth,u.textureHeight,{format:St,type:ut,depthTexture:new uo(u.textureWidth,u.textureHeight,s,void 0,void 0,void 0,void 0,void 0,void 0,i),stencilBuffer:m.stencil,encoding:t.outputEncoding,samples:m.antialias?4:0});t.properties.get(g).__ignoreDepthValues=u.ignoreDepthValues}g.isXRRenderTarget=!0,this.setFoveation(o),l=null,s=await n.requestReferenceSpace(a),N.setContext(n),N.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}};const R=new $e,P=new $e;function I(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.updateCamera=function(t){if(null===n)return;w.near=b.near=M.near=t.near,w.far=b.far=M.far=t.far,T===w.near&&A===w.far||(n.updateRenderState({depthNear:w.near,depthFar:w.far}),T=w.near,A=w.far);const e=t.parent,i=w.cameras;I(w,e);for(let t=0;te&&(y.set(t,t.lastChangedTime),i.dispatchEvent({type:"planechanged",data:t}))}else _.add(t),y.set(t,n.lastChangedTime),i.dispatchEvent({type:"planeadded",data:t})}p=null})),this.setAnimationLoop=function(t){D=t},this.dispose=function(){}}}function mo(t,e){function i(i,n){i.opacity.value=n.opacity,n.color&&i.diffuse.value.copy(n.color),n.emissive&&i.emissive.value.copy(n.emissive).multiplyScalar(n.emissiveIntensity),n.map&&(i.map.value=n.map),n.alphaMap&&(i.alphaMap.value=n.alphaMap),n.bumpMap&&(i.bumpMap.value=n.bumpMap,i.bumpScale.value=n.bumpScale,n.side===c&&(i.bumpScale.value*=-1)),n.displacementMap&&(i.displacementMap.value=n.displacementMap,i.displacementScale.value=n.displacementScale,i.displacementBias.value=n.displacementBias),n.emissiveMap&&(i.emissiveMap.value=n.emissiveMap),n.normalMap&&(i.normalMap.value=n.normalMap,i.normalScale.value.copy(n.normalScale),n.side===c&&i.normalScale.value.negate()),n.specularMap&&(i.specularMap.value=n.specularMap),n.alphaTest>0&&(i.alphaTest.value=n.alphaTest);const r=e.get(n).envMap;if(r&&(i.envMap.value=r,i.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,i.reflectivity.value=n.reflectivity,i.ior.value=n.ior,i.refractionRatio.value=n.refractionRatio),n.lightMap){i.lightMap.value=n.lightMap;const e=!0===t.useLegacyLights?Math.PI:1;i.lightMapIntensity.value=n.lightMapIntensity*e}let s,a;n.aoMap&&(i.aoMap.value=n.aoMap,i.aoMapIntensity.value=n.aoMapIntensity),n.map?s=n.map:n.specularMap?s=n.specularMap:n.displacementMap?s=n.displacementMap:n.normalMap?s=n.normalMap:n.bumpMap?s=n.bumpMap:n.roughnessMap?s=n.roughnessMap:n.metalnessMap?s=n.metalnessMap:n.alphaMap?s=n.alphaMap:n.emissiveMap?s=n.emissiveMap:n.clearcoatMap?s=n.clearcoatMap:n.clearcoatNormalMap?s=n.clearcoatNormalMap:n.clearcoatRoughnessMap?s=n.clearcoatRoughnessMap:n.iridescenceMap?s=n.iridescenceMap:n.iridescenceThicknessMap?s=n.iridescenceThicknessMap:n.specularIntensityMap?s=n.specularIntensityMap:n.specularColorMap?s=n.specularColorMap:n.transmissionMap?s=n.transmissionMap:n.thicknessMap?s=n.thicknessMap:n.sheenColorMap?s=n.sheenColorMap:n.sheenRoughnessMap&&(s=n.sheenRoughnessMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),i.uvTransform.value.copy(s.matrix)),n.aoMap?a=n.aoMap:n.lightMap&&(a=n.lightMap),void 0!==a&&(a.isWebGLRenderTarget&&(a=a.texture),!0===a.matrixAutoUpdate&&a.updateMatrix(),i.uv2Transform.value.copy(a.matrix))}return{refreshFogUniforms:function(e,i){i.color.getRGB(e.fogColor.value,xr(t)),i.isFog?(e.fogNear.value=i.near,e.fogFar.value=i.far):i.isFogExp2&&(e.fogDensity.value=i.density)},refreshMaterialUniforms:function(t,n,r,s,a){n.isMeshBasicMaterial||n.isMeshLambertMaterial?i(t,n):n.isMeshToonMaterial?(i(t,n),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap)}(t,n)):n.isMeshPhongMaterial?(i(t,n),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4)}(t,n)):n.isMeshStandardMaterial?(i(t,n),function(t,i){t.roughness.value=i.roughness,t.metalness.value=i.metalness,i.roughnessMap&&(t.roughnessMap.value=i.roughnessMap);i.metalnessMap&&(t.metalnessMap.value=i.metalnessMap);const n=e.get(i).envMap;n&&(t.envMapIntensity.value=i.envMapIntensity)}(t,n),n.isMeshPhysicalMaterial&&function(t,e,i){t.ior.value=e.ior,e.sheen>0&&(t.sheenColor.value.copy(e.sheenColor).multiplyScalar(e.sheen),t.sheenRoughness.value=e.sheenRoughness,e.sheenColorMap&&(t.sheenColorMap.value=e.sheenColorMap),e.sheenRoughnessMap&&(t.sheenRoughnessMap.value=e.sheenRoughnessMap));e.clearcoat>0&&(t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap),e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,e.side===c&&t.clearcoatNormalScale.value.negate()));e.iridescence>0&&(t.iridescence.value=e.iridescence,t.iridescenceIOR.value=e.iridescenceIOR,t.iridescenceThicknessMinimum.value=e.iridescenceThicknessRange[0],t.iridescenceThicknessMaximum.value=e.iridescenceThicknessRange[1],e.iridescenceMap&&(t.iridescenceMap.value=e.iridescenceMap),e.iridescenceThicknessMap&&(t.iridescenceThicknessMap.value=e.iridescenceThicknessMap));e.transmission>0&&(t.transmission.value=e.transmission,t.transmissionSamplerMap.value=i.texture,t.transmissionSamplerSize.value.set(i.width,i.height),e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap),t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap),t.attenuationDistance.value=e.attenuationDistance,t.attenuationColor.value.copy(e.attenuationColor));t.specularIntensity.value=e.specularIntensity,t.specularColor.value.copy(e.specularColor),e.specularIntensityMap&&(t.specularIntensityMap.value=e.specularIntensityMap);e.specularColorMap&&(t.specularColorMap.value=e.specularColorMap)}(t,n,a)):n.isMeshMatcapMaterial?(i(t,n),function(t,e){e.matcap&&(t.matcap.value=e.matcap)}(t,n)):n.isMeshDepthMaterial?i(t,n):n.isMeshDistanceMaterial?(i(t,n),function(t,e){t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,n)):n.isMeshNormalMaterial?i(t,n):n.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,n),n.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,n)):n.isPointsMaterial?function(t,e,i,n){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*i,t.scale.value=.5*n,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,n,r,s):n.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let i;e.map?i=e.map:e.alphaMap&&(i=e.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(t,n):n.isShadowMaterial?(t.color.value.copy(n.color),t.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function fo(t,e,i,n){let r={},s={},a=[];const o=i.isWebGL2?t.getParameter(35375):0;function l(t,e,i){const n=t.value;if(void 0===i[e]){if("number"==typeof n)i[e]=n;else{const t=Array.isArray(n)?n:[n],r=[];for(let e=0;e0){r=i%n;0!==r&&n-r-a.boundary<0&&(i+=n-r,s.__offset=i)}i+=a.storage}r=i%n,r>0&&(i+=n-r);t.__size=i,t.__cache={}}(i),d=function(e){const i=function(){for(let t=0;t0&&function(t,e,i){const n=X.isWebGL2;null===k&&(k=new gi(1024,1024,{generateMipmaps:!0,type:q.has("EXT_color_buffer_half_float")?xt:ut,minFilter:ht,samples:n&&!0===a?4:0}));const r=_.getRenderTarget();_.setRenderTarget(k),_.clear();const s=_.toneMapping;_.toneMapping=W,Ot(t,e,i),_.toneMapping=s,K.updateMultisampleRenderTarget(k),K.updateRenderTargetMipmap(k),_.setRenderTarget(r)}(r,e,i),n&&Y.viewport(A.copy(n)),r.length>0&&Ot(r,e,i),s.length>0&&Ot(s,e,i),o.length>0&&Ot(o,e,i),Y.buffers.depth.setTest(!0),Y.buffers.depth.setMask(!0),Y.buffers.color.setMask(!0),Y.setPolygonOffset(!1)}function Ot(t,e,i){const n=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r0?x[x.length-1]:null,v.pop(),f=v.length>0?v[v.length-1]:null},this.getActiveCubeFace=function(){return M},this.getActiveMipmapLevel=function(){return b},this.getRenderTarget=function(){return S},this.setRenderTargetTextures=function(t,e,i){J.get(t.texture).__webglTexture=e,J.get(t.depthTexture).__webglTexture=i;const n=J.get(t);n.__hasExternalTextures=!0,n.__hasExternalTextures&&(n.__autoAllocateDepthBuffer=void 0===i,n.__autoAllocateDepthBuffer||!0===q.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),n.__useRenderToTexture=!1))},this.setRenderTargetFramebuffer=function(t,e){const i=J.get(t);i.__webglFramebuffer=e,i.__useDefaultFramebuffer=void 0===e},this.setRenderTarget=function(t,e=0,i=0){S=t,M=e,b=i;let n=!0,r=null,s=!1,a=!1;if(t){const i=J.get(t);void 0!==i.__useDefaultFramebuffer?(Y.bindFramebuffer(36160,null),n=!1):void 0===i.__webglFramebuffer?K.setupRenderTarget(t):i.__hasExternalTextures&&K.rebindTextures(t,J.get(t.texture).__webglTexture,J.get(t.depthTexture).__webglTexture);const o=t.texture;(o.isData3DTexture||o.isDataArrayTexture||o.isCompressedArrayTexture)&&(a=!0);const l=J.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(r=l[e],s=!0):r=X.isWebGL2&&t.samples>0&&!1===K.useMultisampledRTT(t)?J.get(t).__webglMultisampledFramebuffer:l,A.copy(t.viewport),E.copy(t.scissor),C=t.scissorTest}else A.copy(N).multiplyScalar(P).floor(),E.copy(O).multiplyScalar(P).floor(),C=z;if(Y.bindFramebuffer(36160,r)&&X.drawBuffers&&n&&Y.drawBuffers(t,r),Y.viewport(A),Y.scissor(E),Y.setScissorTest(C),s){const n=J.get(t.texture);yt.framebufferTexture2D(36160,36064,34069+e,n.__webglTexture,i)}else if(a){const n=J.get(t.texture),r=e||0;yt.framebufferTextureLayer(36160,36064,n.__webglTexture,i||0,r)}w=-1},this.readRenderTargetPixels=function(t,e,i,n,r,s,a){if(!t||!t.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=J.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){Y.bindFramebuffer(36160,o);try{const a=t.texture,o=a.format,l=a.type;if(o!==St&&ft.convert(o)!==yt.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=l===xt&&(q.has("EXT_color_buffer_half_float")||X.isWebGL2&&q.has("EXT_color_buffer_float"));if(!(l===ut||ft.convert(l)===yt.getParameter(35738)||l===vt&&(X.isWebGL2||q.has("OES_texture_float")||q.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");e>=0&&e<=t.width-n&&i>=0&&i<=t.height-r&&yt.readPixels(e,i,n,r,ft.convert(o),ft.convert(l),s)}finally{const t=null!==S?J.get(S).__webglFramebuffer:null;Y.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,i=0){const n=Math.pow(2,-i),r=Math.floor(e.image.width*n),s=Math.floor(e.image.height*n);K.setTexture2D(e,0),yt.copyTexSubImage2D(3553,i,0,0,t.x,t.y,r,s),Y.unbindTexture()},this.copyTextureToTexture=function(t,e,i,n=0){const r=e.image.width,s=e.image.height,a=ft.convert(i.format),o=ft.convert(i.type);K.setTexture2D(i,0),yt.pixelStorei(37440,i.flipY),yt.pixelStorei(37441,i.premultiplyAlpha),yt.pixelStorei(3317,i.unpackAlignment),e.isDataTexture?yt.texSubImage2D(3553,n,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?yt.compressedTexSubImage2D(3553,n,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):yt.texSubImage2D(3553,n,t.x,t.y,a,o,e.image),0===n&&i.generateMipmaps&&yt.generateMipmap(3553),Y.unbindTexture()},this.copyTextureToTexture3D=function(t,e,i,n,r=0){if(_.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=t.max.x-t.min.x+1,a=t.max.y-t.min.y+1,o=t.max.z-t.min.z+1,l=ft.convert(n.format),c=ft.convert(n.type);let h;if(n.isData3DTexture)K.setTexture3D(n,0),h=32879;else{if(!n.isDataArrayTexture)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");K.setTexture2DArray(n,0),h=35866}yt.pixelStorei(37440,n.flipY),yt.pixelStorei(37441,n.premultiplyAlpha),yt.pixelStorei(3317,n.unpackAlignment);const u=yt.getParameter(3314),d=yt.getParameter(32878),p=yt.getParameter(3316),m=yt.getParameter(3315),f=yt.getParameter(32877),g=i.isCompressedTexture?i.mipmaps[0]:i.image;yt.pixelStorei(3314,g.width),yt.pixelStorei(32878,g.height),yt.pixelStorei(3316,t.min.x),yt.pixelStorei(3315,t.min.y),yt.pixelStorei(32877,t.min.z),i.isDataTexture||i.isData3DTexture?yt.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,g.data):i.isCompressedArrayTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),yt.compressedTexSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,g.data)):yt.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,g),yt.pixelStorei(3314,u),yt.pixelStorei(32878,d),yt.pixelStorei(3316,p),yt.pixelStorei(3315,m),yt.pixelStorei(32877,f),0===r&&n.generateMipmaps&&yt.generateMipmap(h),Y.unbindTexture()},this.initTexture=function(t){t.isCubeTexture?K.setTextureCube(t,0):t.isData3DTexture?K.setTexture3D(t,0):t.isDataArrayTexture||t.isCompressedArrayTexture?K.setTexture2DArray(t,0):K.setTexture2D(t,0),Y.unbindTexture()},this.resetState=function(){M=0,b=0,S=null,Y.reset(),gt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}Object.defineProperties(go.prototype,{physicallyCorrectLights:{get:function(){return console.warn("THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),!this.useLegacyLights},set:function(t){console.warn("THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),this.useLegacyLights=!t}}});class vo extends go{}vo.prototype.isWebGL1Renderer=!0;class xo{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new zn(t),this.density=e}clone(){return new xo(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}class _o{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new zn(t),this.near=e,this.far=i}clone(){return new _o(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}class yo extends xn{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e}get autoUpdate(){return console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate}set autoUpdate(t){console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate=t}}class Mo{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=Ae,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=Ne()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let n=0,r=this.stride;nt.far||e.push({distance:o,point:Ao.clone(),uv:Ln.getUV(Ao,Io,Do,No,Oo,zo,Uo,new We),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Fo(t,e,i,n,r,s){Lo.subVectors(t,i).addScalar(.5).multiply(n),void 0!==r?(Ro.x=s*Lo.x-r*Lo.y,Ro.y=r*Lo.x+s*Lo.y):Ro.copy(Lo),t.copy(e),t.x+=Ro.x,t.y+=Ro.y,t.applyMatrix4(Po)}const ko=new $e,Go=new $e;class Vo extends xn{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,n;for(i=1,n=e.length;i0){ko.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(ko);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){ko.setFromMatrixPosition(t.matrixWorld),Go.setFromMatrixPosition(this.matrixWorld);const i=ko.distanceTo(Go)/t.zoom;let n,r;for(e[0].object.visible=!0,n=1,r=e.length;n=t))break;e[n-1].object.visible=!1,e[n].object.visible=!0}for(this._currentLevel=n-1;no)continue;u.applyMatrix4(this.matrixWorld);const s=t.ray.origin.distanceTo(u);st.far||e.push({distance:s,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else{for(let i=Math.max(0,s.start),n=Math.min(m.count,s.start+s.count)-1;io)continue;u.applyMatrix4(this.matrixWorld);const n=t.ray.origin.distanceTo(u);nt.far||e.push({distance:n,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,object:a})}}class Tl extends mi{constructor(t,e,i,n,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,n,r,h,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Al{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,n=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)i=this.getPoint(s/t),r+=i.distanceTo(n),e.push(r),n=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const i=this.getLengths();let n=0;const r=i.length;let s;s=e||t*i[r-1];let a,o=0,l=r-1;for(;o<=l;)if(n=Math.floor(o+(l-o)/2),a=i[n]-s,a<0)o=n+1;else{if(!(a>0)){l=n;break}l=n-1}if(n=l,i[n]===s)return n/(r-1);const c=i[n];return(n+(s-c)/(i[n+1]-c))/(r-1)}getTangent(t,e){const i=1e-4;let n=t-i,r=t+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),a=this.getPoint(r),o=e||(s.isVector2?new We:new $e);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e){const i=new $e,n=[],r=[],s=[],a=new $e,o=new qi;for(let e=0;e<=t;e++){const i=e/t;n[e]=this.getTangentAt(i,new $e)}r[0]=new $e,s[0]=new $e;let l=Number.MAX_VALUE;const c=Math.abs(n[0].x),h=Math.abs(n[0].y),u=Math.abs(n[0].z);c<=l&&(l=c,i.set(1,0,0)),h<=l&&(l=h,i.set(0,1,0)),u<=l&&i.set(0,0,1),a.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],a),s[0].crossVectors(n[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(n[e-1],n[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(Oe(n[e-1].dot(n[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(n[e],r[e])}if(!0===e){let e=Math.acos(Oe(r[0].dot(r[t]),-1,1));e/=t,n[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(n[i],e*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class El extends Al{constructor(t=0,e=0,i=1,n=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=n,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const i=e||new We,n=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)n;)r-=n;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=n[(l-1)%r]:(Rl.subVectors(n[0],n[1]).add(n[0]),a=Rl);const h=n[l%r],u=n[(l+1)%r];if(this.closed||l+2n.length-2?n.length-1:s+1],h=n[s>n.length-3?n.length-1:s+2];return i.set(Ol(a,o.x,l.x,c.x,h.x),Ol(a,o.y,l.y,c.y,h.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=n[r]-i,s=this.curves[r],a=s.getLength(),o=0===a?0:1-t/a;return s.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,n=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Yl extends $n{constructor(t=[new We(0,-.5),new We(.5,0),new We(0,.5)],e=12,i=0,n=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:n},e=Math.floor(e),n=Oe(n,0,2*Math.PI);const r=[],s=[],a=[],o=[],l=[],c=1/e,h=new $e,u=new We,d=new $e,p=new $e,m=new $e;let f=0,g=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:f=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-f,d.z=0*g,m.copy(d),d.normalize(),o.push(d.x,d.y,d.z);break;case t.length-1:o.push(m.x,m.y,m.z);break;default:f=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-f,d.z=0*g,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),o.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=i+r*c*n,p=Math.sin(d),m=Math.cos(d);for(let i=0;i<=t.length-1;i++){h.x=t[i].x*p,h.y=t[i].y,h.z=t[i].x*m,s.push(h.x,h.y,h.z),u.x=r/e,u.y=i/(t.length-1),a.push(u.x,u.y);const n=o[3*i+0]*p,c=o[3*i+1],d=o[3*i+0]*m;l.push(n,c,d)}}for(let i=0;i0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new Wn(h,3)),this.setAttribute("normal",new Wn(u,3)),this.setAttribute("uv",new Wn(d,2))}static fromJSON(t){return new Kl(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class $l extends Kl{constructor(t=1,e=1,i=32,n=1,r=!1,s=0,a=2*Math.PI){super(0,t,e,i,n,r,s,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:n,openEnded:r,thetaStart:s,thetaLength:a}}static fromJSON(t){return new $l(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ql extends $n{constructor(t=[],e=[],i=1,n=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:n};const r=[],s=[];function a(t,e,i,n){const r=n+1,s=[];for(let n=0;n<=r;n++){s[n]=[];const a=t.clone().lerp(i,n/r),o=e.clone().lerp(i,n/r),l=r-n;for(let t=0;t<=l;t++)s[n][t]=0===t&&n===r?a:a.clone().lerp(o,t/l)}for(let t=0;t.9&&a<.1&&(e<.2&&(s[t+0]+=1),i<.2&&(s[t+2]+=1),n<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new Wn(r,3)),this.setAttribute("normal",new Wn(r.slice(),3)),this.setAttribute("uv",new Wn(s,2)),0===n?this.computeVertexNormals():this.normalizeNormals()}static fromJSON(t){return new Ql(t.vertices,t.indices,t.radius,t.details)}}class tc extends Ql{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,n=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-n,-i,0,-n,i,0,n,-i,0,n,i,-n,-i,0,-n,i,0,n,-i,0,n,i,0,-i,0,-n,i,0,-n,-i,0,n,i,0,n],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new tc(t.radius,t.detail)}}const ec=new $e,ic=new $e,nc=new $e,rc=new Ln;class sc extends $n{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,n=Math.pow(10,i),r=Math.cos(Ie*e),s=t.getIndex(),a=t.getAttribute("position"),o=s?s.count:a.count,l=[0,0,0],c=["a","b","c"],h=new Array(3),u={},d=[];for(let t=0;t80*i){o=c=t[0],l=h=t[1];for(let e=i;ec&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?32767/p:0}return hc(s,a,i,o,l,p,0),a};function lc(t,e,i,n,r){let s,a;if(r===function(t,e,i,n){let r=0;for(let s=e,a=i-n;s0)for(s=e;s=e;s-=n)a=Lc(s,t[s],t[s+1],a);return a&&Sc(a,a.next)&&(Rc(a),a=a.next),a}function cc(t,e){if(!t)return t;e||(e=t);let i,n=t;do{if(i=!1,n.steiner||!Sc(n,n.next)&&0!==bc(n.prev,n,n.next))n=n.next;else{if(Rc(n),n=e=n.prev,n===n.next)break;i=!0}}while(i||n!==e);return e}function hc(t,e,i,n,r,s,a){if(!t)return;!a&&s&&function(t,e,i,n){let r=t;do{0===r.z&&(r.z=xc(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,n,r,s,a,o,l,c=1;do{for(i=t,t=null,s=null,a=0;i;){for(a++,n=i,o=0,e=0;e0||l>0&&n;)0!==o&&(0===l||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(t,n,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?dc(t,n,r,s):uc(t))e.push(o.i/i|0),e.push(t.i/i|0),e.push(l.i/i|0),Rc(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?hc(t=pc(cc(t),e,i),e,i,n,r,s,2):2===a&&mc(t,e,i,n,r,s):hc(cc(t),e,i,n,r,s,1);break}}function uc(t){const e=t.prev,i=t,n=t.next;if(bc(e,i,n)>=0)return!1;const r=e.x,s=i.x,a=n.x,o=e.y,l=i.y,c=n.y,h=rs?r>a?r:a:s>a?s:a,p=o>l?o>c?o:c:l>c?l:c;let m=n.next;for(;m!==e;){if(m.x>=h&&m.x<=d&&m.y>=u&&m.y<=p&&yc(r,o,s,l,a,c,m.x,m.y)&&bc(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function dc(t,e,i,n){const r=t.prev,s=t,a=t.next;if(bc(r,s,a)>=0)return!1;const o=r.x,l=s.x,c=a.x,h=r.y,u=s.y,d=a.y,p=ol?o>c?o:c:l>c?l:c,g=h>u?h>d?h:d:u>d?u:d,v=xc(p,m,e,i,n),x=xc(f,g,e,i,n);let _=t.prevZ,y=t.nextZ;for(;_&&_.z>=v&&y&&y.z<=x;){if(_.x>=p&&_.x<=f&&_.y>=m&&_.y<=g&&_!==r&&_!==a&&yc(o,h,l,u,c,d,_.x,_.y)&&bc(_.prev,_,_.next)>=0)return!1;if(_=_.prevZ,y.x>=p&&y.x<=f&&y.y>=m&&y.y<=g&&y!==r&&y!==a&&yc(o,h,l,u,c,d,y.x,y.y)&&bc(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(;_&&_.z>=v;){if(_.x>=p&&_.x<=f&&_.y>=m&&_.y<=g&&_!==r&&_!==a&&yc(o,h,l,u,c,d,_.x,_.y)&&bc(_.prev,_,_.next)>=0)return!1;_=_.prevZ}for(;y&&y.z<=x;){if(y.x>=p&&y.x<=f&&y.y>=m&&y.y<=g&&y!==r&&y!==a&&yc(o,h,l,u,c,d,y.x,y.y)&&bc(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function pc(t,e,i){let n=t;do{const r=n.prev,s=n.next.next;!Sc(r,s)&&wc(r,n,n.next,s)&&Ec(r,s)&&Ec(s,r)&&(e.push(r.i/i|0),e.push(n.i/i|0),e.push(s.i/i|0),Rc(n),Rc(n.next),n=t=s),n=n.next}while(n!==t);return cc(n)}function mc(t,e,i,n,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Mc(a,t)){let o=Cc(a,t);return a=cc(a,a.next),o=cc(o,o.next),hc(a,e,i,n,r,s,0),void hc(o,e,i,n,r,s,0)}t=t.next}a=a.next}while(a!==t)}function fc(t,e){return t.x-e.x}function gc(t,e){const i=function(t,e){let i,n=e,r=-1/0;const s=t.x,a=t.y;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){const t=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(t<=s&&t>r&&(r=t,i=n.x=n.x&&n.x>=l&&s!==n.x&&yc(ai.x||n.x===i.x&&vc(i,n)))&&(i=n,u=h)),n=n.next}while(n!==o);return i}(t,e);if(!i)return e;const n=Cc(i,t);return cc(n,n.next),cc(i,i.next)}function vc(t,e){return bc(t.prev,t,e.prev)<0&&bc(e.next,t,t.next)<0}function xc(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function _c(t){let e=t,i=t;do{(e.x=(t-a)*(s-o)&&(t-a)*(n-o)>=(i-a)*(e-o)&&(i-a)*(s-o)>=(r-a)*(n-o)}function Mc(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&wc(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(Ec(t,e)&&Ec(e,t)&&function(t,e){let i=t,n=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(bc(t.prev,t,e.prev)||bc(t,e.prev,e))||Sc(t,e)&&bc(t.prev,t,t.next)>0&&bc(e.prev,e,e.next)>0)}function bc(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Sc(t,e){return t.x===e.x&&t.y===e.y}function wc(t,e,i,n){const r=Ac(bc(t,e,i)),s=Ac(bc(t,e,n)),a=Ac(bc(i,n,t)),o=Ac(bc(i,n,e));return r!==s&&a!==o||(!(0!==r||!Tc(t,i,e))||(!(0!==s||!Tc(t,n,e))||(!(0!==a||!Tc(i,t,n))||!(0!==o||!Tc(i,e,n)))))}function Tc(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Ac(t){return t>0?1:t<0?-1:0}function Ec(t,e){return bc(t.prev,t,t.next)<0?bc(t,e,t.next)>=0&&bc(t,t.prev,e)>=0:bc(t,e,t.prev)<0||bc(t,t.next,e)<0}function Cc(t,e){const i=new Pc(t.i,t.x,t.y),n=new Pc(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Lc(t,e,i,n){const r=new Pc(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Rc(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Pc(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class Ic{static area(t){const e=t.length;let i=0;for(let n=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Nc(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,m=e.y+a/u,f=((i.x-c/d-p)*c-(i.y+l/d-m)*l)/(a*c-o*l);n=p+a*f-t.x,r=m+o*f-t.y;const g=n*n+r*r;if(g<=2)return new We(n,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(n=-o,r=a,s=Math.sqrt(h)):(n=a,r=o,s=Math.sqrt(h/2))}return new We(n/s,r/s)}const P=[];for(let t=0,e=A.length,i=e-1,n=t+1;t=0;t--){const e=t/p,i=h*Math.cos(e*Math.PI/2),n=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=A.length;t=0;){const n=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,l),(t!==i-1||o0!=t>0&&this.version++,this._sheen=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class Qc extends Pn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new zn(16777215),this.specular=new zn(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new zn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=G,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class th extends Pn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new zn(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new zn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class eh extends Pn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class ih extends Pn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new zn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new zn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=G,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class nh extends Pn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new zn(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ye,this.normalScale=new We(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class rh extends ol{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function sh(t,e,i){return oh(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)}function ah(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)}function oh(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function lh(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i}function ch(t,e,i){const n=t.length,r=new t.constructor(n);for(let s=0,a=0;a!==n;++s){const n=i[s]*e;for(let i=0;i!==e;++i)r[a++]=t[n+i]}return r}function hh(t,e,i,n){let r=1,s=t[0];for(;void 0!==s&&void 0===s[n];)s=t[r++];if(void 0===s)return;let a=s[n];if(void 0!==a)if(Array.isArray(a))do{a=s[n],void 0!==a&&(e.push(s.time),i.push.apply(i,a)),s=t[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[n],void 0!==a&&(e.push(s.time),a.toArray(i,i.length)),s=t[r++]}while(void 0!==s);else do{a=s[n],void 0!==a&&(e.push(s.time),i.push(a)),s=t[r++]}while(void 0!==s)}const uh={arraySlice:sh,convertArray:ah,isTypedArray:oh,getKeyframeOrder:lh,sortedArray:ch,flattenJSON:hh,subclip:function(t,e,i,n,r=30){const s=t.clone();s.name=e;const a=[];for(let t=0;t=n)){l.push(e.times[t]);for(let i=0;is.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t=n.times[u]){const t=u*l+o,e=t+l-o;d=sh(n.values,t,e)}else{const t=n.createInterpolant(),e=o,i=l-o;t.evaluate(s),d=sh(t.resultBuffer,e,i)}if("quaternion"===r){(new Ke).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}s=i,i=0}}for(;i>>1;te;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=sh(i,r,s),this.values=sh(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const n=i[e];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,n),t=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,n,s),t=!1;break}s=n}if(void 0!==n&&oh(n))for(let e=0,i=n.length;e!==i;++e){const i=n[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=sh(this.times),e=sh(this.values),i=this.getValueSize(),n=this.getInterpolation()===ue,r=t.length-1;let s=1;for(let a=1;a0){t[s]=t[r];for(let t=r*i,n=s*i,a=0;a!==i;++a)e[n+a]=e[t+a];++s}return s!==t.length?(this.times=sh(t,0,s),this.values=sh(e,0,s*i)):(this.times=t,this.values=e),this}clone(){const t=sh(this.times,0),e=sh(this.values,0),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}gh.prototype.TimeBufferType=Float32Array,gh.prototype.ValueBufferType=Float32Array,gh.prototype.DefaultInterpolation=he;class vh extends gh{}vh.prototype.ValueTypeName="bool",vh.prototype.ValueBufferType=Array,vh.prototype.DefaultInterpolation=ce,vh.prototype.InterpolantFactoryMethodLinear=void 0,vh.prototype.InterpolantFactoryMethodSmooth=void 0;class xh extends gh{}xh.prototype.ValueTypeName="color";class _h extends gh{}_h.prototype.ValueTypeName="number";class yh extends dh{constructor(t,e,i,n){super(t,e,i,n)}interpolate_(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(i-e)/(n-e);let l=t*a;for(let t=l+a;l!==t;l+=4)Ke.slerpFlat(r,0,s,l-a,s,l,o);return r}}class Mh extends gh{InterpolantFactoryMethodLinear(t){return new yh(this.times,this.values,this.getValueSize(),t)}}Mh.prototype.ValueTypeName="quaternion",Mh.prototype.DefaultInterpolation=he,Mh.prototype.InterpolantFactoryMethodSmooth=void 0;class bh extends gh{}bh.prototype.ValueTypeName="string",bh.prototype.ValueBufferType=Array,bh.prototype.DefaultInterpolation=ce,bh.prototype.InterpolantFactoryMethodLinear=void 0,bh.prototype.InterpolantFactoryMethodSmooth=void 0;class Sh extends gh{}Sh.prototype.ValueTypeName="vector";class wh{constructor(t,e=-1,i,n=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=n,this.uuid=Ne(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,n=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(Th(i[t]).scale(n));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,n=i.length;t!==n;++t)e.push(gh.toJSON(i[t]));return n}static CreateFromMorphTargetSequence(t,e,i,n){const r=e.length,s=[];for(let t=0;t1){const t=s[1];let e=n[t];e||(n[t]=e=[]),e.push(i)}}const s=[];for(const t in n)s.push(this.CreateFromMorphTargetSequence(t,n[t],e,i));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,n,r){if(0!==i.length){const s=[],a=[];hh(i,s,a,n),0!==s.length&&r.push(new t(e,s,a))}},n=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==Rh[t])return void Rh[t].push({onLoad:e,onProgress:i,onError:n});Rh[t]=[],Rh[t].push({onLoad:e,onProgress:i,onError:n});const s=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,o=this.responseType;fetch(s).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=Rh[t],n=e.body.getReader(),r=e.headers.get("Content-Length")||e.headers.get("X-File-Size"),s=r?parseInt(r):0,a=0!==s;let o=0;const l=new ReadableStream({start(t){!function e(){n.read().then((({done:n,value:r})=>{if(n)t.close();else{o+=r.byteLength;const n=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:s});for(let t=0,e=i.length;t{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,a)));case"json":return t.json();default:if(void 0===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,n=new TextDecoder(i);return t.arrayBuffer().then((t=>n.decode(t)))}}})).then((e=>{Ah.add(t,e);const i=Rh[t];delete Rh[t];for(let t=0,n=i.length;t{const i=Rh[t];if(void 0===i)throw this.manager.itemError(t),e;delete Rh[t];for(let t=0,n=i.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class Dh extends Lh{constructor(t){super(t)}load(t,e,i,n){void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=Ah.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const a=Je("img");function o(){c(),Ah.add(t,this),e&&e(this),r.manager.itemEnd(t)}function l(e){c(),n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)}function c(){a.removeEventListener("load",o,!1),a.removeEventListener("error",l,!1)}return a.addEventListener("load",o,!1),a.addEventListener("error",l,!1),"data:"!==t.slice(0,5)&&void 0!==this.crossOrigin&&(a.crossOrigin=this.crossOrigin),r.manager.itemStart(t),a.src=t,a}}class Nh extends xn{constructor(t,e=1){super(),this.isLight=!0,this.type="Light",this.color=new zn(t),this.intensity=e}dispose(){}copy(t,e){return super.copy(t,e),this.color.copy(t.color),this.intensity=t.intensity,this}toJSON(t){const e=super.toJSON(t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}class Oh extends Nh{constructor(t,e,i){super(t,i),this.isHemisphereLight=!0,this.type="HemisphereLight",this.position.copy(xn.DEFAULT_UP),this.updateMatrix(),this.groundColor=new zn(e)}copy(t,e){return super.copy(t,e),this.groundColor.copy(t.groundColor),this}}const zh=new qi,Uh=new $e,Bh=new $e;class Fh{constructor(t){this.camera=t,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new We(512,512),this.map=null,this.mapPass=null,this.matrix=new qi,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new Dr,this._frameExtents=new We(1,1),this._viewportCount=1,this._viewports=[new fi(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(t){const e=this.camera,i=this.matrix;Uh.setFromMatrixPosition(t.matrixWorld),e.position.copy(Uh),Bh.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(Bh),e.updateMatrixWorld(),zh.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(zh),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(zh)}getViewport(t){return this._viewports[t]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(t){return this.camera=t.camera.clone(),this.bias=t.bias,this.radius=t.radius,this.mapSize.copy(t.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const t={};return 0!==this.bias&&(t.bias=this.bias),0!==this.normalBias&&(t.normalBias=this.normalBias),1!==this.radius&&(t.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}class kh extends Fh{constructor(){super(new br(50,1,.5,500)),this.isSpotLightShadow=!0,this.focus=1}updateMatrices(t){const e=this.camera,i=2*De*t.angle*this.focus,n=this.mapSize.width/this.mapSize.height,r=t.distance||e.far;i===e.fov&&n===e.aspect&&r===e.far||(e.fov=i,e.aspect=n,e.far=r,e.updateProjectionMatrix()),super.updateMatrices(t)}copy(t){return super.copy(t),this.focus=t.focus,this}}class Gh extends Nh{constructor(t,e,i=0,n=Math.PI/3,r=0,s=2){super(t,e),this.isSpotLight=!0,this.type="SpotLight",this.position.copy(xn.DEFAULT_UP),this.updateMatrix(),this.target=new xn,this.distance=i,this.angle=n,this.penumbra=r,this.decay=s,this.map=null,this.shadow=new kh}get power(){return this.intensity*Math.PI}set power(t){this.intensity=t/Math.PI}dispose(){this.shadow.dispose()}copy(t,e){return super.copy(t,e),this.distance=t.distance,this.angle=t.angle,this.penumbra=t.penumbra,this.decay=t.decay,this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}const Vh=new qi,Hh=new $e,Wh=new $e;class jh extends Fh{constructor(){super(new br(90,1,.5,500)),this.isPointLightShadow=!0,this._frameExtents=new We(4,2),this._viewportCount=6,this._viewports=[new fi(2,1,1,1),new fi(0,1,1,1),new fi(3,1,1,1),new fi(1,1,1,1),new fi(3,0,1,1),new fi(1,0,1,1)],this._cubeDirections=[new $e(1,0,0),new $e(-1,0,0),new $e(0,0,1),new $e(0,0,-1),new $e(0,1,0),new $e(0,-1,0)],this._cubeUps=[new $e(0,1,0),new $e(0,1,0),new $e(0,1,0),new $e(0,1,0),new $e(0,0,1),new $e(0,0,-1)]}updateMatrices(t,e=0){const i=this.camera,n=this.matrix,r=t.distance||i.far;r!==i.far&&(i.far=r,i.updateProjectionMatrix()),Hh.setFromMatrixPosition(t.matrixWorld),i.position.copy(Hh),Wh.copy(i.position),Wh.add(this._cubeDirections[e]),i.up.copy(this._cubeUps[e]),i.lookAt(Wh),i.updateMatrixWorld(),n.makeTranslation(-Hh.x,-Hh.y,-Hh.z),Vh.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Vh)}}class qh extends Nh{constructor(t,e,i=0,n=2){super(t,e),this.isPointLight=!0,this.type="PointLight",this.distance=i,this.decay=n,this.shadow=new jh}get power(){return 4*this.intensity*Math.PI}set power(t){this.intensity=t/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(t,e){return super.copy(t,e),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}class Xh extends Fh{constructor(){super(new Xr(-5,5,5,-5,.5,500)),this.isDirectionalLightShadow=!0}}class Yh extends Nh{constructor(t,e){super(t,e),this.isDirectionalLight=!0,this.type="DirectionalLight",this.position.copy(xn.DEFAULT_UP),this.updateMatrix(),this.target=new xn,this.shadow=new Xh}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}class Zh extends Nh{constructor(t,e){super(t,e),this.isAmbientLight=!0,this.type="AmbientLight"}}class Jh extends Nh{constructor(t,e,i=10,n=10){super(t,e),this.isRectAreaLight=!0,this.type="RectAreaLight",this.width=i,this.height=n}get power(){return this.intensity*this.width*this.height*Math.PI}set power(t){this.intensity=t/(this.width*this.height*Math.PI)}copy(t){return super.copy(t),this.width=t.width,this.height=t.height,this}toJSON(t){const e=super.toJSON(t);return e.object.width=this.width,e.object.height=this.height,e}}class Kh{constructor(){this.isSphericalHarmonics3=!0,this.coefficients=[];for(let t=0;t<9;t++)this.coefficients.push(new $e)}set(t){for(let e=0;e<9;e++)this.coefficients[e].copy(t[e]);return this}zero(){for(let t=0;t<9;t++)this.coefficients[t].set(0,0,0);return this}getAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.282095),e.addScaledVector(s[1],.488603*n),e.addScaledVector(s[2],.488603*r),e.addScaledVector(s[3],.488603*i),e.addScaledVector(s[4],i*n*1.092548),e.addScaledVector(s[5],n*r*1.092548),e.addScaledVector(s[6],.315392*(3*r*r-1)),e.addScaledVector(s[7],i*r*1.092548),e.addScaledVector(s[8],.546274*(i*i-n*n)),e}getIrradianceAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.886227),e.addScaledVector(s[1],1.023328*n),e.addScaledVector(s[2],1.023328*r),e.addScaledVector(s[3],1.023328*i),e.addScaledVector(s[4],.858086*i*n),e.addScaledVector(s[5],.858086*n*r),e.addScaledVector(s[6],.743125*r*r-.247708),e.addScaledVector(s[7],.858086*i*r),e.addScaledVector(s[8],.429043*(i*i-n*n)),e}add(t){for(let e=0;e<9;e++)this.coefficients[e].add(t.coefficients[e]);return this}addScaledSH(t,e){for(let i=0;i<9;i++)this.coefficients[i].addScaledVector(t.coefficients[i],e);return this}scale(t){for(let e=0;e<9;e++)this.coefficients[e].multiplyScalar(t);return this}lerp(t,e){for(let i=0;i<9;i++)this.coefficients[i].lerp(t.coefficients[i],e);return this}equals(t){for(let e=0;e<9;e++)if(!this.coefficients[e].equals(t.coefficients[e]))return!1;return!0}copy(t){return this.set(t.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(t,e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].fromArray(t,e+3*n);return this}toArray(t=[],e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].toArray(t,e+3*n);return t}static getBasisAt(t,e){const i=t.x,n=t.y,r=t.z;e[0]=.282095,e[1]=.488603*n,e[2]=.488603*r,e[3]=.488603*i,e[4]=1.092548*i*n,e[5]=1.092548*n*r,e[6]=.315392*(3*r*r-1),e[7]=1.092548*i*r,e[8]=.546274*(i*i-n*n)}}class $h extends Nh{constructor(t=new Kh,e=1){super(void 0,e),this.isLightProbe=!0,this.sh=t}copy(t){return super.copy(t),this.sh.copy(t.sh),this}fromJSON(t){return this.intensity=t.intensity,this.sh.fromArray(t.sh),this}toJSON(t){const e=super.toJSON(t);return e.object.sh=this.sh.toArray(),e}}class Qh extends Lh{constructor(t){super(t),this.textures={}}load(t,e,i,n){const r=this,s=new Ih(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)}parse(t){const e=this.textures;function i(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}const n=Qh.createMaterialFromType(t.type);if(void 0!==t.uuid&&(n.uuid=t.uuid),void 0!==t.name&&(n.name=t.name),void 0!==t.color&&void 0!==n.color&&n.color.setHex(t.color),void 0!==t.roughness&&(n.roughness=t.roughness),void 0!==t.metalness&&(n.metalness=t.metalness),void 0!==t.sheen&&(n.sheen=t.sheen),void 0!==t.sheenColor&&(n.sheenColor=(new zn).setHex(t.sheenColor)),void 0!==t.sheenRoughness&&(n.sheenRoughness=t.sheenRoughness),void 0!==t.emissive&&void 0!==n.emissive&&n.emissive.setHex(t.emissive),void 0!==t.specular&&void 0!==n.specular&&n.specular.setHex(t.specular),void 0!==t.specularIntensity&&(n.specularIntensity=t.specularIntensity),void 0!==t.specularColor&&void 0!==n.specularColor&&n.specularColor.setHex(t.specularColor),void 0!==t.shininess&&(n.shininess=t.shininess),void 0!==t.clearcoat&&(n.clearcoat=t.clearcoat),void 0!==t.clearcoatRoughness&&(n.clearcoatRoughness=t.clearcoatRoughness),void 0!==t.iridescence&&(n.iridescence=t.iridescence),void 0!==t.iridescenceIOR&&(n.iridescenceIOR=t.iridescenceIOR),void 0!==t.iridescenceThicknessRange&&(n.iridescenceThicknessRange=t.iridescenceThicknessRange),void 0!==t.transmission&&(n.transmission=t.transmission),void 0!==t.thickness&&(n.thickness=t.thickness),void 0!==t.attenuationDistance&&(n.attenuationDistance=t.attenuationDistance),void 0!==t.attenuationColor&&void 0!==n.attenuationColor&&n.attenuationColor.setHex(t.attenuationColor),void 0!==t.fog&&(n.fog=t.fog),void 0!==t.flatShading&&(n.flatShading=t.flatShading),void 0!==t.blending&&(n.blending=t.blending),void 0!==t.combine&&(n.combine=t.combine),void 0!==t.side&&(n.side=t.side),void 0!==t.shadowSide&&(n.shadowSide=t.shadowSide),void 0!==t.opacity&&(n.opacity=t.opacity),void 0!==t.transparent&&(n.transparent=t.transparent),void 0!==t.alphaTest&&(n.alphaTest=t.alphaTest),void 0!==t.depthTest&&(n.depthTest=t.depthTest),void 0!==t.depthWrite&&(n.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(n.colorWrite=t.colorWrite),void 0!==t.stencilWrite&&(n.stencilWrite=t.stencilWrite),void 0!==t.stencilWriteMask&&(n.stencilWriteMask=t.stencilWriteMask),void 0!==t.stencilFunc&&(n.stencilFunc=t.stencilFunc),void 0!==t.stencilRef&&(n.stencilRef=t.stencilRef),void 0!==t.stencilFuncMask&&(n.stencilFuncMask=t.stencilFuncMask),void 0!==t.stencilFail&&(n.stencilFail=t.stencilFail),void 0!==t.stencilZFail&&(n.stencilZFail=t.stencilZFail),void 0!==t.stencilZPass&&(n.stencilZPass=t.stencilZPass),void 0!==t.wireframe&&(n.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(n.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(n.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(n.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(n.rotation=t.rotation),1!==t.linewidth&&(n.linewidth=t.linewidth),void 0!==t.dashSize&&(n.dashSize=t.dashSize),void 0!==t.gapSize&&(n.gapSize=t.gapSize),void 0!==t.scale&&(n.scale=t.scale),void 0!==t.polygonOffset&&(n.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(n.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(n.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.dithering&&(n.dithering=t.dithering),void 0!==t.alphaToCoverage&&(n.alphaToCoverage=t.alphaToCoverage),void 0!==t.premultipliedAlpha&&(n.premultipliedAlpha=t.premultipliedAlpha),void 0!==t.forceSinglePass&&(n.forceSinglePass=t.forceSinglePass),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.toneMapped&&(n.toneMapped=t.toneMapped),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.vertexColors&&("number"==typeof t.vertexColors?n.vertexColors=t.vertexColors>0:n.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(n.uniforms[e]={},r.type){case"t":n.uniforms[e].value=i(r.value);break;case"c":n.uniforms[e].value=(new zn).setHex(r.value);break;case"v2":n.uniforms[e].value=(new We).fromArray(r.value);break;case"v3":n.uniforms[e].value=(new $e).fromArray(r.value);break;case"v4":n.uniforms[e].value=(new fi).fromArray(r.value);break;case"m3":n.uniforms[e].value=(new je).fromArray(r.value);break;case"m4":n.uniforms[e].value=(new qi).fromArray(r.value);break;default:n.uniforms[e].value=r.value}}if(void 0!==t.defines&&(n.defines=t.defines),void 0!==t.vertexShader&&(n.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(n.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(n.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)n.extensions[e]=t.extensions[e];if(void 0!==t.size&&(n.size=t.size),void 0!==t.sizeAttenuation&&(n.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(n.map=i(t.map)),void 0!==t.matcap&&(n.matcap=i(t.matcap)),void 0!==t.alphaMap&&(n.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(n.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(n.bumpScale=t.bumpScale),void 0!==t.normalMap&&(n.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(n.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),n.normalScale=(new We).fromArray(e)}return void 0!==t.displacementMap&&(n.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(n.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(n.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(n.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(n.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(n.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(n.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(n.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(n.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(n.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(n.envMap=i(t.envMap)),void 0!==t.envMapIntensity&&(n.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(n.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(n.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(n.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(n.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(n.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(n.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(n.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(n.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(n.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(n.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(n.clearcoatNormalScale=(new We).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(n.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(n.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(n.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(n.thicknessMap=i(t.thicknessMap)),void 0!==t.sheenColorMap&&(n.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(n.sheenRoughnessMap=i(t.sheenRoughnessMap)),n}setTextures(t){return this.textures=t,this}static createMaterialFromType(t){return new{ShadowMaterial:Zc,SpriteMaterial:wo,RawShaderMaterial:Jc,ShaderMaterial:yr,PointsMaterial:xl,MeshPhysicalMaterial:$c,MeshStandardMaterial:Kc,MeshPhongMaterial:Qc,MeshToonMaterial:th,MeshNormalMaterial:eh,MeshLambertMaterial:ih,MeshDepthMaterial:Qa,MeshDistanceMaterial:to,MeshBasicMaterial:Bn,MeshMatcapMaterial:nh,LineDashedMaterial:rh,LineBasicMaterial:ol,Material:Pn}[t]}}class tu{static decodeText(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let i=0,n=t.length;i0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,n,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,n);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,n=i*this._origIndex;t.getValue(e,n);for(let t=i,r=n;t!==r;++t)e[t]=e[n+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let n=0;n!==r;++n)t[e+n]=t[i+n]}_slerp(t,e,i,n){Ke.slerpFlat(t,e,t,e,t,i,n)}_slerpAdditive(t,e,i,n,r){const s=this._workIndex*r;Ke.multiplyQuaternionsFlat(t,s,t,e,t,i),Ke.slerpFlat(t,e,t,e,t,s,n)}_lerp(t,e,i,n,r){const s=1-n;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[i+a]*n}}_lerpAdditive(t,e,i,n,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[i+s]*n}}}const Su="\\[\\]\\.:\\/",wu=new RegExp("["+Su+"]","g"),Tu="[^"+Su+"]",Au="[^"+Su.replace("\\.","")+"]",Eu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Tu)+/(WCOD+)?/.source.replace("WCOD",Au)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Tu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Tu)+"$"),Cu=["material","materials","bones","map"];class Lu{constructor(t,e,i){this.path=e,this.parsedPath=i||Lu.parseTrackName(e),this.node=Lu.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Lu.Composite(t,e,i):new Lu(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(wu,"")}static parseTrackName(t){const e=Eu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const t=i.nodeName.substring(n+1);-1!==Cu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let n=0;n0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===ge)for(let i=0,n=t.length;i!==n;++i)t[i].evaluate(s),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(s),e[i].accumulate(n,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(t)[0];e*=n,t>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let n=this.time+t,r=this._loopCount;const s=2202===i;if(0===t)return-1===r?n:s&&1==(1&r)?e-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(n>=e)n=e;else{if(!(n<0)){this.time=n;break t}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=e||n<0){const i=Math.floor(n/e);n-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=t>0?e:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=n;if(s&&1==(1&r))return e-n}return n}_setEndings(t,e,i){const n=this._interpolantSettings;i?(n.endingStart=pe,n.endingEnd=pe):(n.endingStart=t?this.zeroSlopeAtStart?pe:de:me,n.endingEnd=e?this.zeroSlopeAtEnd?pe:de:me)}_scheduleFading(t,e,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const Pu=new Float32Array(1);class Iu{constructor(t){this.value=t}clone(){return new Iu(void 0===this.value.clone?this.value:this.value.clone())}}let Du=0;function Nu(t,e){return t.distance-e.distance}function Ou(t,e,i,n){if(t.layers.test(e.layers)&&t.raycast(e,i),!0===n){const n=t.children;for(let t=0,r=n.length;t>-e-14,n[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(n[t]=e+15<<10,n[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(n[t]=31744,n[256|t]=64512,r[t]=24,r[256|t]=24):(n[t]=31744,n[256|t]=64512,r[t]=13,r[256|t]=13)}const s=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;0==(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,s[t]=e|i}for(let t=1024;t<2048;++t)s[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:n,shiftTable:r,mantissaTable:s,exponentTable:a,offsetTable:o}}const sd={toHalfFloat:function(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Oe(t,-65504,65504),nd.floatView[0]=t;const e=nd.uint32View[0],i=e>>23&511;return nd.baseTable[i]+((8388607&e)>>nd.shiftTable[i])},fromHalfFloat:function(t){const e=t>>10;return nd.uint32View[0]=nd.mantissaTable[nd.offsetTable[e]+(1023&t)]+nd.exponentTable[e],nd.floatView[0]}};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:e}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=e),t.ACESFilmicToneMapping=Y,t.AddEquation=v,t.AddOperation=H,t.AdditiveAnimationBlendMode=ge,t.AdditiveBlending=p,t.AlphaFormat=bt,t.AlwaysDepth=N,t.AlwaysStencilFunc=519,t.AmbientLight=Zh,t.AmbientLightProbe=class extends $h{constructor(t,e=1){super(void 0,e),this.isAmbientLightProbe=!0;const i=(new zn).set(t);this.sh.coefficients[0].set(i.r,i.g,i.b).multiplyScalar(2*Math.sqrt(Math.PI))}},t.AnimationClip=wh,t.AnimationLoader=class extends Lh{constructor(t){super(t)}load(t,e,i,n){const r=this,s=new Ih(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)}parse(t){const e=[];for(let i=0;i=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,n=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(n,t,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;t=r){const s=r++,c=t[s];e[c.uuid]=l,t[l]=c,e[o]=s,t[s]=a;for(let t=0,e=n;t!==e;++t){const e=i[t],n=e[s],r=e[l];e[l]=n,e[s]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,n=i.length;let r=this.nCachedObjects_,s=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,l=e[o];if(void 0!==l)if(delete e[o],l0&&(e[a.uuid]=l),t[l]=a,t.pop();for(let t=0,e=n;t!==e;++t){const e=i[t];e[l]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let n=i[t];const r=this._bindings;if(void 0!==n)return r[n];const s=this._paths,a=this._parsedPaths,o=this._objects,l=o.length,c=this.nCachedObjects_,h=new Array(l);n=r.length,i[t]=n,s.push(t),a.push(e),r.push(h);for(let i=c,n=o.length;i!==n;++i){const n=o[i];h[i]=new Lu(n,t,e)}return h}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const n=this._paths,r=this._parsedPaths,s=this._bindings,a=s.length-1,o=s[a];e[t[a]]=i,s[i]=o,s.pop(),r[i]=r[a],r.pop(),n[i]=n[a],n.pop()}}},t.AnimationUtils=uh,t.ArcCurve=Cl,t.ArrayCamera=oo,t.ArrowHelper=class extends xn{constructor(t=new $e(0,0,1),e=new $e(0,0,0),i=1,n=16776960,r=.2*i,s=.2*r){super(),this.type="ArrowHelper",void 0===ed&&(ed=new $n,ed.setAttribute("position",new Wn([0,0,0,0,1,0],3)),id=new Kl(0,.5,1,5,1),id.translate(0,-.5,0)),this.position.copy(e),this.line=new pl(ed,new ol({color:n,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new pr(id,new Bn({color:n,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(t),this.setLength(i,r,s)}setDirection(t){if(t.y>.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{td.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(td,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}},t.Audio=vu,t.AudioAnalyser=class{constructor(t,e=2048){this.analyser=t.context.createAnalyser(),this.analyser.fftSize=e,this.data=new Uint8Array(this.analyser.frequencyBinCount),t.getOutput().connect(this.analyser)}getFrequencyData(){return this.analyser.getByteFrequencyData(this.data),this.data}getAverageFrequency(){let t=0;const e=this.getFrequencyData();for(let i=0;ithis.max.x||t.ythis.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return zu.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}},t.Box3=_i,t.Box3Helper=class extends gl{constructor(t,e=16776960){const i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new $n;n.setIndex(new Gn(i,1)),n.setAttribute("position",new Wn([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(n,new ol({color:e,toneMapped:!1})),this.box=t,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(t){const e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(t))}dispose(){this.geometry.dispose(),this.material.dispose()}},t.BoxBufferGeometry=class extends fr{constructor(t,e,i,n,r,s){console.warn("THREE.BoxBufferGeometry has been renamed to THREE.BoxGeometry."),super(t,e,i,n,r,s)}},t.BoxGeometry=fr,t.BoxHelper=class extends gl{constructor(t,e=16776960){const i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new Float32Array(24),r=new $n;r.setIndex(new Gn(i,1)),r.setAttribute("position",new Gn(n,3)),super(r,new ol({color:e,toneMapped:!1})),this.object=t,this.type="BoxHelper",this.matrixAutoUpdate=!1,this.update()}update(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&Qu.setFromObject(this.object),Qu.isEmpty())return;const e=Qu.min,i=Qu.max,n=this.geometry.attributes.position,r=n.array;r[0]=i.x,r[1]=i.y,r[2]=i.z,r[3]=e.x,r[4]=i.y,r[5]=i.z,r[6]=e.x,r[7]=e.y,r[8]=i.z,r[9]=i.x,r[10]=e.y,r[11]=i.z,r[12]=i.x,r[13]=i.y,r[14]=e.z,r[15]=e.x,r[16]=i.y,r[17]=e.z,r[18]=e.x,r[19]=e.y,r[20]=e.z,r[21]=i.x,r[22]=e.y,r[23]=e.z,n.needsUpdate=!0,this.geometry.computeBoundingSphere()}setFromObject(t){return this.object=t,this.update(),this}copy(t,e){return super.copy(t,e),this.object=t.object,this}dispose(){this.geometry.dispose(),this.material.dispose()}},t.BufferAttribute=Gn,t.BufferGeometry=$n,t.BufferGeometryLoader=iu,t.ByteType=dt,t.Cache=Ah,t.Camera=Mr,t.CameraHelper=class extends gl{constructor(t){const e=new $n,i=new ol({color:16777215,vertexColors:!0,toneMapped:!1}),n=[],r=[],s={};function a(t,e){o(t),o(e)}function o(t){n.push(0,0,0),r.push(0,0,0),void 0===s[t]&&(s[t]=[]),s[t].push(n.length/3-1)}a("n1","n2"),a("n2","n4"),a("n4","n3"),a("n3","n1"),a("f1","f2"),a("f2","f4"),a("f4","f3"),a("f3","f1"),a("n1","f1"),a("n2","f2"),a("n3","f3"),a("n4","f4"),a("p","n1"),a("p","n2"),a("p","n3"),a("p","n4"),a("u1","u2"),a("u2","u3"),a("u3","u1"),a("c","t"),a("p","c"),a("cn1","cn2"),a("cn3","cn4"),a("cf1","cf2"),a("cf3","cf4"),e.setAttribute("position",new Wn(n,3)),e.setAttribute("color",new Wn(r,3)),super(e,i),this.type="CameraHelper",this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update();const l=new zn(16755200),c=new zn(16711680),h=new zn(43775),u=new zn(16777215),d=new zn(3355443);this.setColors(l,c,h,u,d)}setColors(t,e,i,n,r){const s=this.geometry.getAttribute("color");s.setXYZ(0,t.r,t.g,t.b),s.setXYZ(1,t.r,t.g,t.b),s.setXYZ(2,t.r,t.g,t.b),s.setXYZ(3,t.r,t.g,t.b),s.setXYZ(4,t.r,t.g,t.b),s.setXYZ(5,t.r,t.g,t.b),s.setXYZ(6,t.r,t.g,t.b),s.setXYZ(7,t.r,t.g,t.b),s.setXYZ(8,t.r,t.g,t.b),s.setXYZ(9,t.r,t.g,t.b),s.setXYZ(10,t.r,t.g,t.b),s.setXYZ(11,t.r,t.g,t.b),s.setXYZ(12,t.r,t.g,t.b),s.setXYZ(13,t.r,t.g,t.b),s.setXYZ(14,t.r,t.g,t.b),s.setXYZ(15,t.r,t.g,t.b),s.setXYZ(16,t.r,t.g,t.b),s.setXYZ(17,t.r,t.g,t.b),s.setXYZ(18,t.r,t.g,t.b),s.setXYZ(19,t.r,t.g,t.b),s.setXYZ(20,t.r,t.g,t.b),s.setXYZ(21,t.r,t.g,t.b),s.setXYZ(22,t.r,t.g,t.b),s.setXYZ(23,t.r,t.g,t.b),s.setXYZ(24,e.r,e.g,e.b),s.setXYZ(25,e.r,e.g,e.b),s.setXYZ(26,e.r,e.g,e.b),s.setXYZ(27,e.r,e.g,e.b),s.setXYZ(28,e.r,e.g,e.b),s.setXYZ(29,e.r,e.g,e.b),s.setXYZ(30,e.r,e.g,e.b),s.setXYZ(31,e.r,e.g,e.b),s.setXYZ(32,i.r,i.g,i.b),s.setXYZ(33,i.r,i.g,i.b),s.setXYZ(34,i.r,i.g,i.b),s.setXYZ(35,i.r,i.g,i.b),s.setXYZ(36,i.r,i.g,i.b),s.setXYZ(37,i.r,i.g,i.b),s.setXYZ(38,n.r,n.g,n.b),s.setXYZ(39,n.r,n.g,n.b),s.setXYZ(40,r.r,r.g,r.b),s.setXYZ(41,r.r,r.g,r.b),s.setXYZ(42,r.r,r.g,r.b),s.setXYZ(43,r.r,r.g,r.b),s.setXYZ(44,r.r,r.g,r.b),s.setXYZ(45,r.r,r.g,r.b),s.setXYZ(46,r.r,r.g,r.b),s.setXYZ(47,r.r,r.g,r.b),s.setXYZ(48,r.r,r.g,r.b),s.setXYZ(49,r.r,r.g,r.b),s.needsUpdate=!0}update(){const t=this.geometry,e=this.pointMap;Ku.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),$u("c",e,t,Ku,0,0,-1),$u("t",e,t,Ku,0,0,1),$u("n1",e,t,Ku,-1,-1,-1),$u("n2",e,t,Ku,1,-1,-1),$u("n3",e,t,Ku,-1,1,-1),$u("n4",e,t,Ku,1,1,-1),$u("f1",e,t,Ku,-1,-1,1),$u("f2",e,t,Ku,1,-1,1),$u("f3",e,t,Ku,-1,1,1),$u("f4",e,t,Ku,1,1,1),$u("u1",e,t,Ku,.7,1.1,-1),$u("u2",e,t,Ku,-.7,1.1,-1),$u("u3",e,t,Ku,0,2,-1),$u("cf1",e,t,Ku,-1,0,1),$u("cf2",e,t,Ku,1,0,1),$u("cf3",e,t,Ku,0,-1,1),$u("cf4",e,t,Ku,0,1,1),$u("cn1",e,t,Ku,-1,0,-1),$u("cn2",e,t,Ku,1,0,-1),$u("cn3",e,t,Ku,0,-1,-1),$u("cn4",e,t,Ku,0,1,-1),t.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}},t.CanvasTexture=class extends mi{constructor(t,e,i,n,r,s,a,o,l){super(t,e,i,n,r,s,a,o,l),this.isCanvasTexture=!0,this.needsUpdate=!0}},t.CapsuleBufferGeometry=class extends Zl{constructor(t,e,i,n){console.warn("THREE.CapsuleBufferGeometry has been renamed to THREE.CapsuleGeometry."),super(t,e,i,n)}},t.CapsuleGeometry=Zl,t.CatmullRomCurve3=Nl,t.CineonToneMapping=X,t.CircleBufferGeometry=class extends Jl{constructor(t,e,i,n){console.warn("THREE.CircleBufferGeometry has been renamed to THREE.CircleGeometry."),super(t,e,i,n)}},t.CircleGeometry=Jl,t.ClampToEdgeWrapping=nt,t.Clock=uu,t.Color=zn,t.ColorKeyframeTrack=xh,t.ColorManagement=li,t.CompressedArrayTexture=class extends Tl{constructor(t,e,i,n,r,s){super(t,e,i,r,s),this.isCompressedArrayTexture=!0,this.image.depth=n,this.wrapR=nt}},t.CompressedTexture=Tl,t.CompressedTextureLoader=class extends Lh{constructor(t){super(t)}load(t,e,i,n){const r=this,s=[],a=new Tl,o=new Ih(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(r.withCredentials);let l=0;function c(c){o.load(t[c],(function(t){const i=r.parse(t,!0);s[c]={width:i.width,height:i.height,format:i.format,mipmaps:i.mipmaps},l+=1,6===l&&(1===i.mipmapCount&&(a.minFilter=lt),a.image=s,a.format=i.format,a.needsUpdate=!0,e&&e(a))}),i,n)}if(Array.isArray(t))for(let e=0,i=t.length;e0){const i=new Eh(e);r=new Dh(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){n=new Dh(this.manager),n.setCrossOrigin(this.crossOrigin);for(let e=0,n=t.length;e1)for(let i=0;iNumber.EPSILON){if(l<0&&(i=e[s],o=-o,a=e[r],l=-l),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=l*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;n=!n}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return n}const i=Ic.isClockWise,n=this.subPaths;if(0===n.length)return[];let r,s,a;const o=[];if(1===n.length)return s=n[0],a=new ac,a.curves=s.curves,o.push(a),o;let l=!i(n[0].getPoints());l=t?!l:l;const c=[],h=[];let u,d,p=[],m=0;h[m]=void 0,p[m]=[];for(let e=0,a=n.length;e1){let t=!1,i=0;for(let t=0,e=h.length;t0&&!1===t&&(p=c)}for(let t=0,e=h.length;t=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}},t.WebGL1Renderer=vo,t.WebGL3DRenderTarget=class extends gi{constructor(t=1,e=1,i=1){super(t,e),this.isWebGL3DRenderTarget=!0,this.depth=i,this.texture=new xi(null,t,e,i),this.texture.isRenderTargetTexture=!0}},t.WebGLArrayRenderTarget=class extends gi{constructor(t=1,e=1,i=1){super(t,e),this.isWebGLArrayRenderTarget=!0,this.depth=i,this.texture=new vi(null,t,e,i),this.texture.isRenderTargetTexture=!0}},t.WebGLCubeRenderTarget=Ar,t.WebGLMultipleRenderTargets=class extends gi{constructor(t=1,e=1,i=1,n={}){super(t,e,n),this.isWebGLMultipleRenderTargets=!0;const r=this.texture;this.texture=[];for(let t=0;t Rec. 709 primaries, without gamut mapping - * or clipping. Based on W3C specifications for sRGB and Display P3, - * and ICC specifications for the D50 connection space. Values in/out - * are _linear_ sRGB and _linear_ Display P3. - * - * Note that both sRGB and Display P3 use the sRGB transfer functions. + * Matrices for sRGB and Display P3, based on the W3C specifications + * for sRGB and Display P3, and the ICC specification for the D50 + * connection space. * * Reference: * - http://www.russellcottrell.com/photo/matrixCalculator.htm */ -const LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = new Matrix3().fromArray( [ - 0.8224621, 0.0331941, 0.0170827, - 0.1775380, 0.9668058, 0.0723974, - - 0.0000001, 0.0000001, 0.9105199 -] ); +const SRGB_TO_DISPLAY_P3 = new Matrix3().multiplyMatrices( + // XYZ to Display P3 + new Matrix3().set( + 2.4039840, - 0.9899069, - 0.3976415, + - 0.8422229, 1.7988437, 0.0160354, + 0.0482059, - 0.0974068, 1.2740049, + ), + // sRGB to XYZ + new Matrix3().set( + 0.4360413, 0.3851129, 0.1430458, + 0.2224845, 0.7169051, 0.0606104, + 0.0139202, 0.0970672, 0.7139126, + ), +); -const LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = new Matrix3().fromArray( [ - 1.2249401, - 0.0420569, - 0.0196376, - - 0.2249404, 1.0420571, - 0.0786361, - 0.0000001, 0.0000000, 1.0982735 -] ); +const DISPLAY_P3_TO_SRGB = new Matrix3().multiplyMatrices( + // XYZ to sRGB + new Matrix3().set( + 3.1341864, - 1.6172090, - 0.4906941, + - 0.9787485, 1.9161301, 0.0334334, + 0.0719639, - 0.2289939, 1.4057537, + ), + // Display P3 to XYZ + new Matrix3().set( + 0.5151187, 0.2919778, 0.1571035, + 0.2411892, 0.6922441, 0.0665668, + - 0.0010505, 0.0418791, 0.7840713, + ), +); const _vector$c = new Vector3(); @@ -2892,7 +2907,7 @@ function DisplayP3ToLinearSRGB( color ) { color.convertSRGBToLinear(); - _vector$c.set( color.r, color.g, color.b ).applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ); + _vector$c.set( color.r, color.g, color.b ).applyMatrix3( DISPLAY_P3_TO_SRGB ); return color.setRGB( _vector$c.x, _vector$c.y, _vector$c.z ); @@ -2900,7 +2915,7 @@ function DisplayP3ToLinearSRGB( color ) { function LinearSRGBToDisplayP3( color ) { - _vector$c.set( color.r, color.g, color.b ).applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ); + _vector$c.set( color.r, color.g, color.b ).applyMatrix3( SRGB_TO_DISPLAY_P3 ); return color.setRGB( _vector$c.x, _vector$c.y, _vector$c.z ).convertLinearToSRGB(); @@ -3299,7 +3314,7 @@ class Texture extends EventDispatcher { } - set image( value = null ) { + set image( value ) { this.source.data = value; @@ -4835,7 +4850,9 @@ class Box3 { distanceToPoint( point ) { - return this.clampPoint( point, _vector$b ).distanceTo( point ); + const clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max ); + + return clampedPoint.sub( point ).length(); } @@ -5251,7 +5268,7 @@ class Ray { at( t, target ) { - return target.copy( this.origin ).addScaledVector( this.direction, t ); + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); } @@ -5283,7 +5300,7 @@ class Ray { } - return target.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); } @@ -5305,7 +5322,7 @@ class Ray { } - _vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + _vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); return _vector$a.distanceToSquared( point ); @@ -5416,13 +5433,13 @@ class Ray { if ( optionalPointOnRay ) { - optionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 ); + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); } if ( optionalPointOnSegment ) { - optionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 ); + optionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter ); } @@ -5447,8 +5464,8 @@ class Ray { // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; - // test to see if t1 is behind the ray - if so, return null - if ( t1 < 0 ) return null; + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, @@ -9350,175 +9367,6 @@ class MeshBasicMaterial extends Material { } -// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf - -const _tables = /*@__PURE__*/ _generateTables(); - -function _generateTables() { - - // float32 to float16 helpers - - const buffer = new ArrayBuffer( 4 ); - const floatView = new Float32Array( buffer ); - const uint32View = new Uint32Array( buffer ); - - const baseTable = new Uint32Array( 512 ); - const shiftTable = new Uint32Array( 512 ); - - for ( let i = 0; i < 256; ++ i ) { - - const e = i - 127; - - // very small number (0, -0) - - if ( e < - 27 ) { - - baseTable[ i ] = 0x0000; - baseTable[ i | 0x100 ] = 0x8000; - shiftTable[ i ] = 24; - shiftTable[ i | 0x100 ] = 24; - - // small number (denorm) - - } else if ( e < - 14 ) { - - baseTable[ i ] = 0x0400 >> ( - e - 14 ); - baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; - shiftTable[ i ] = - e - 1; - shiftTable[ i | 0x100 ] = - e - 1; - - // normal number - - } else if ( e <= 15 ) { - - baseTable[ i ] = ( e + 15 ) << 10; - baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; - shiftTable[ i ] = 13; - shiftTable[ i | 0x100 ] = 13; - - // large number (Infinity, -Infinity) - - } else if ( e < 128 ) { - - baseTable[ i ] = 0x7c00; - baseTable[ i | 0x100 ] = 0xfc00; - shiftTable[ i ] = 24; - shiftTable[ i | 0x100 ] = 24; - - // stay (NaN, Infinity, -Infinity) - - } else { - - baseTable[ i ] = 0x7c00; - baseTable[ i | 0x100 ] = 0xfc00; - shiftTable[ i ] = 13; - shiftTable[ i | 0x100 ] = 13; - - } - - } - - // float16 to float32 helpers - - const mantissaTable = new Uint32Array( 2048 ); - const exponentTable = new Uint32Array( 64 ); - const offsetTable = new Uint32Array( 64 ); - - for ( let i = 1; i < 1024; ++ i ) { - - let m = i << 13; // zero pad mantissa bits - let e = 0; // zero exponent - - // normalized - while ( ( m & 0x00800000 ) === 0 ) { - - m <<= 1; - e -= 0x00800000; // decrement exponent - - } - - m &= ~ 0x00800000; // clear leading 1 bit - e += 0x38800000; // adjust bias - - mantissaTable[ i ] = m | e; - - } - - for ( let i = 1024; i < 2048; ++ i ) { - - mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); - - } - - for ( let i = 1; i < 31; ++ i ) { - - exponentTable[ i ] = i << 23; - - } - - exponentTable[ 31 ] = 0x47800000; - exponentTable[ 32 ] = 0x80000000; - - for ( let i = 33; i < 63; ++ i ) { - - exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); - - } - - exponentTable[ 63 ] = 0xc7800000; - - for ( let i = 1; i < 64; ++ i ) { - - if ( i !== 32 ) { - - offsetTable[ i ] = 1024; - - } - - } - - return { - floatView: floatView, - uint32View: uint32View, - baseTable: baseTable, - shiftTable: shiftTable, - mantissaTable: mantissaTable, - exponentTable: exponentTable, - offsetTable: offsetTable - }; - -} - -// float32 to float16 - -function toHalfFloat( val ) { - - if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); - - val = clamp( val, - 65504, 65504 ); - - _tables.floatView[ 0 ] = val; - const f = _tables.uint32View[ 0 ]; - const e = ( f >> 23 ) & 0x1ff; - return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); - -} - -// float16 to float32 - -function fromHalfFloat( val ) { - - const m = val >> 10; - _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; - return _tables.floatView[ 0 ]; - -} - -const DataUtils = { - toHalfFloat: toHalfFloat, - fromHalfFloat: fromHalfFloat, -}; - const _vector$9 = /*@__PURE__*/ new Vector3(); const _vector2$1 = /*@__PURE__*/ new Vector2(); @@ -9969,146 +9817,6 @@ class Float16BufferAttribute extends BufferAttribute { } - getX( index ) { - - let x = fromHalfFloat( this.array[ index * this.itemSize ] ); - - if ( this.normalized ) x = denormalize( x, this.array ); - - return x; - - } - - setX( index, x ) { - - if ( this.normalized ) x = normalize( x, this.array ); - - this.array[ index * this.itemSize ] = toHalfFloat( x ); - - return this; - - } - - getY( index ) { - - let y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] ); - - if ( this.normalized ) y = denormalize( y, this.array ); - - return y; - - } - - setY( index, y ) { - - if ( this.normalized ) y = normalize( y, this.array ); - - this.array[ index * this.itemSize + 1 ] = toHalfFloat( y ); - - return this; - - } - - getZ( index ) { - - let z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] ); - - if ( this.normalized ) z = denormalize( z, this.array ); - - return z; - - } - - setZ( index, z ) { - - if ( this.normalized ) z = normalize( z, this.array ); - - this.array[ index * this.itemSize + 2 ] = toHalfFloat( z ); - - return this; - - } - - getW( index ) { - - let w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] ); - - if ( this.normalized ) w = denormalize( w, this.array ); - - return w; - - } - - setW( index, w ) { - - if ( this.normalized ) w = normalize( w, this.array ); - - this.array[ index * this.itemSize + 3 ] = toHalfFloat( w ); - - return this; - - } - - setXY( index, x, y ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - - return this; - - } - - setXYZ( index, x, y, z ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - z = normalize( z, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - this.array[ index + 2 ] = toHalfFloat( z ); - - return this; - - } - - setXYZW( index, x, y, z, w ) { - - index *= this.itemSize; - - if ( this.normalized ) { - - x = normalize( x, this.array ); - y = normalize( y, this.array ); - z = normalize( z, this.array ); - w = normalize( w, this.array ); - - } - - this.array[ index + 0 ] = toHalfFloat( x ); - this.array[ index + 1 ] = toHalfFloat( y ); - this.array[ index + 2 ] = toHalfFloat( z ); - this.array[ index + 3 ] = toHalfFloat( w ); - - return this; - - } - } @@ -11195,6 +10903,10 @@ class BufferGeometry extends EventDispatcher { this.userData = source.userData; + // geometry generator parameters + + if ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters ); + return this; } @@ -11752,16 +11464,6 @@ class BoxGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); @@ -12701,7 +12403,7 @@ class Plane { projectPoint( point, target ) { - return target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) ); + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); } @@ -12733,7 +12435,7 @@ class Plane { } - return target.copy( line.start ).addScaledVector( direction, t ); + return target.copy( direction ).multiplyScalar( t ).add( line.start ); } @@ -13279,16 +12981,6 @@ class PlaneGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments ); @@ -13335,7 +13027,7 @@ var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\ var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif"; -var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}"; +var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nfloat w0( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n}\nfloat w1( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n}\nfloat w2( float a ){\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n}\nfloat w3( float a ) {\n\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n}\nfloat g0( float a ) {\n\treturn w0( a ) + w1( a );\n}\nfloat g1( float a ) {\n\treturn w2( a ) + w3( a );\n}\nfloat h0( float a ) {\n\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n}\nfloat h1( float a ) {\n return 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n}\nvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\tuv = uv * texelSize.zw + 0.5;\n\tvec2 iuv = floor( uv );\n vec2 fuv = fract( uv );\n float g0x = g0( fuv.x );\n float g1x = g1( fuv.x );\n float h0x = h0( fuv.x );\n float h1x = h1( fuv.x );\n float h0y = h0( fuv.y );\n float h1y = h1( fuv.y );\n vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n \n vec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n}\nvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\treturn mix( fSample, cSample, fract( lod ) );\n}"; var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_v0 0.339\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_v1 0.276\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_v4 0.046\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_v5 0.016\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_v6 0.0038\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif"; @@ -13493,7 +13185,7 @@ var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate( a ) clamp( var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n#endif"; -var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\t\n\t\tvec2 lodFudge = pow( 1.95, lod ) / fullSize;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec2 fullSize = vec2( textureSize( sampler, 0 ) );\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif"; +var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif"; var uv_pars_fragment = "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif"; @@ -17138,7 +16830,7 @@ function WebGLMorphtargets( gl, capabilities, textures ) { } - function update( object, geometry, program ) { + function update( object, geometry, material, program ) { const objectInfluences = object.morphTargetInfluences; @@ -28562,7 +28254,7 @@ function WebGLRenderer( parameters = {} ) { if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera ); - if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ); + if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera ); if ( viewport ) state.viewport( _currentViewport.copy( viewport ) ); @@ -28580,11 +28272,11 @@ function WebGLRenderer( parameters = {} ) { } - function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) { + function renderTransmissionPass( opaqueObjects, scene, camera ) { - if ( _transmissionRenderTarget === null ) { + const isWebGL2 = capabilities.isWebGL2; - const isWebGL2 = capabilities.isWebGL2; + if ( _transmissionRenderTarget === null ) { _transmissionRenderTarget = new WebGLRenderTarget( 1024, 1024, { generateMipmaps: true, @@ -28593,16 +28285,6 @@ function WebGLRenderer( parameters = {} ) { samples: ( isWebGL2 && _antialias === true ) ? 4 : 0 } ); - // debug - - /* - const geometry = new PlaneGeometry(); - const material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } ); - - const mesh = new Mesh( geometry, material ); - scene.add( mesh ); - */ - } // @@ -28618,49 +28300,13 @@ function WebGLRenderer( parameters = {} ) { renderObjects( opaqueObjects, scene, camera ); + _this.toneMapping = currentToneMapping; + textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); textures.updateRenderTargetMipmap( _transmissionRenderTarget ); - let renderTargetNeedsUpdate = false; - - for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) { - - const renderItem = transmissiveObjects[ i ]; - - const object = renderItem.object; - const geometry = renderItem.geometry; - const material = renderItem.material; - const group = renderItem.group; - - if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) { - - const currentSide = material.side; - - material.side = BackSide; - material.needsUpdate = true; - - renderObject( object, scene, camera, geometry, material, group ); - - material.side = currentSide; - material.needsUpdate = true; - - renderTargetNeedsUpdate = true; - - } - - } - - if ( renderTargetNeedsUpdate === true ) { - - textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); - textures.updateRenderTargetMipmap( _transmissionRenderTarget ); - - } - _this.setRenderTarget( currentRenderTarget ); - _this.toneMapping = currentToneMapping; - } function renderObjects( renderList, scene, camera ) { @@ -29109,7 +28755,7 @@ function WebGLRenderer( parameters = {} ) { if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) { - morphtargets.update( object, geometry, program ); + morphtargets.update( object, geometry, material, program ); } @@ -33049,15 +32695,13 @@ class LineCurve extends Curve { } - getTangent( t, optionalTarget = new Vector2() ) { - - return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); + getTangent( t, optionalTarget ) { - } + const tangent = optionalTarget || new Vector2(); - getTangentAt( u, optionalTarget ) { + tangent.copy( this.v2 ).sub( this.v1 ).normalize(); - return this.getTangent( u, optionalTarget ); + return tangent; } @@ -33134,19 +32778,6 @@ class LineCurve3 extends Curve { return this.getPoint( u, optionalTarget ); } - - getTangent( t, optionalTarget = new Vector3() ) { - - return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); - - } - - getTangentAt( u, optionalTarget ) { - - return this.getTangent( u, optionalTarget ); - - } - copy( source ) { super.copy( source ); @@ -34021,16 +33652,6 @@ class LatheGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength ); @@ -34144,16 +33765,6 @@ class CircleGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength ); @@ -34423,16 +34034,6 @@ class CylinderGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); @@ -34764,16 +34365,6 @@ class PolyhedronGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details ); @@ -34977,16 +34568,6 @@ class EdgesGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - } class Shape extends Path { @@ -36127,7 +35708,7 @@ class ExtrudeGeometry extends BufferGeometry { if ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' ); - return pt.clone().addScaledVector( vec, size ); + return vec.clone().multiplyScalar( size ).add( pt ); } @@ -36634,16 +36215,6 @@ class ExtrudeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -36942,16 +36513,6 @@ class RingGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength ); @@ -37086,16 +36647,6 @@ class ShapeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -37262,16 +36813,6 @@ class SphereGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); @@ -37408,16 +36949,6 @@ class TorusGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc ); @@ -37570,16 +37101,6 @@ class TorusKnotGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - static fromJSON( data ) { return new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q ); @@ -37747,16 +37268,6 @@ class TubeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - toJSON() { const data = super.toJSON(); @@ -37893,16 +37404,6 @@ class WireframeGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - } function isUniqueEdge( start, end, edges ) { @@ -48700,7 +48201,8 @@ class Box2 { distanceToPoint( point ) { - return this.clampPoint( point, _vector$4 ).distanceTo( point ); + const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); } @@ -48709,8 +48211,6 @@ class Box2 { this.min.max( box.min ); this.max.min( box.max ); - if ( this.isEmpty() ) this.makeEmpty(); - return this; } @@ -50354,6 +49854,175 @@ class ShapePath { } +// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + +const _tables = /*@__PURE__*/ _generateTables(); + +function _generateTables() { + + // float32 to float16 helpers + + const buffer = new ArrayBuffer( 4 ); + const floatView = new Float32Array( buffer ); + const uint32View = new Uint32Array( buffer ); + + const baseTable = new Uint32Array( 512 ); + const shiftTable = new Uint32Array( 512 ); + + for ( let i = 0; i < 256; ++ i ) { + + const e = i - 127; + + // very small number (0, -0) + + if ( e < - 27 ) { + + baseTable[ i ] = 0x0000; + baseTable[ i | 0x100 ] = 0x8000; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // small number (denorm) + + } else if ( e < - 14 ) { + + baseTable[ i ] = 0x0400 >> ( - e - 14 ); + baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; + shiftTable[ i ] = - e - 1; + shiftTable[ i | 0x100 ] = - e - 1; + + // normal number + + } else if ( e <= 15 ) { + + baseTable[ i ] = ( e + 15 ) << 10; + baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + // large number (Infinity, -Infinity) + + } else if ( e < 128 ) { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // stay (NaN, Infinity, -Infinity) + + } else { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + } + + } + + // float16 to float32 helpers + + const mantissaTable = new Uint32Array( 2048 ); + const exponentTable = new Uint32Array( 64 ); + const offsetTable = new Uint32Array( 64 ); + + for ( let i = 1; i < 1024; ++ i ) { + + let m = i << 13; // zero pad mantissa bits + let e = 0; // zero exponent + + // normalized + while ( ( m & 0x00800000 ) === 0 ) { + + m <<= 1; + e -= 0x00800000; // decrement exponent + + } + + m &= ~ 0x00800000; // clear leading 1 bit + e += 0x38800000; // adjust bias + + mantissaTable[ i ] = m | e; + + } + + for ( let i = 1024; i < 2048; ++ i ) { + + mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); + + } + + for ( let i = 1; i < 31; ++ i ) { + + exponentTable[ i ] = i << 23; + + } + + exponentTable[ 31 ] = 0x47800000; + exponentTable[ 32 ] = 0x80000000; + + for ( let i = 33; i < 63; ++ i ) { + + exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); + + } + + exponentTable[ 63 ] = 0xc7800000; + + for ( let i = 1; i < 64; ++ i ) { + + if ( i !== 32 ) { + + offsetTable[ i ] = 1024; + + } + + } + + return { + floatView: floatView, + uint32View: uint32View, + baseTable: baseTable, + shiftTable: shiftTable, + mantissaTable: mantissaTable, + exponentTable: exponentTable, + offsetTable: offsetTable + }; + +} + +// float32 to float16 + +function toHalfFloat( val ) { + + if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); + + val = clamp( val, - 65504, 65504 ); + + _tables.floatView[ 0 ] = val; + const f = _tables.uint32View[ 0 ]; + const e = ( f >> 23 ) & 0x1ff; + return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); + +} + +// float16 to float32 + +function fromHalfFloat( val ) { + + const m = val >> 10; + _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; + return _tables.floatView[ 0 ]; + +} + +const DataUtils = { + toHalfFloat: toHalfFloat, + fromHalfFloat: fromHalfFloat, +}; + // r144 class BoxBufferGeometry extends BoxGeometry { diff --git a/docs/api/en/math/Color.html b/docs/api/en/math/Color.html index d9152876210942..6ef47bdc838111 100644 --- a/docs/api/en/math/Color.html +++ b/docs/api/en/math/Color.html @@ -184,13 +184,6 @@

[method:Object getHSL]( [param:Object target], [param:string colorSpace] = L

-

[method:Color getRGB]( [param:Color target], [param:string colorSpace] = SRGBColorSpace )

-

- [page:Color target] — the result will be copied into this object.

- - Returns the RGB values of this color as an instance of [page:Color]. -

-

[method:String getStyle]( [param:string colorSpace] = SRGBColorSpace )

Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.

diff --git a/docs/api/it/math/Color.html b/docs/api/it/math/Color.html index f161b275b4a15f..1ed186632686b2 100644 --- a/docs/api/it/math/Color.html +++ b/docs/api/it/math/Color.html @@ -181,13 +181,6 @@

[method:Object getHSL]( [param:Object target], [param:string colorSpace] = L

-

[method:Color getRGB]( [param:Color target], [param:string colorSpace] = SRGBColorSpace )

-

- [page:Color target] - questo risultato sarà copiato in questo oggetto.

- - Returns the RGB values of this color as an instance of [page:Color]. -

-

[method:String getStyle]( [param:string colorSpace] = SRGBColorSpace )

Restituisce il valore di questo colore come una stringa CSS style. Esempio: `rgb(255,0,0)`.

diff --git a/docs/api/zh/math/Color.html b/docs/api/zh/math/Color.html index 9eebe30aa7b723..98087d993c231f 100644 --- a/docs/api/zh/math/Color.html +++ b/docs/api/zh/math/Color.html @@ -182,13 +182,6 @@

[method:Object getHSL]( [param:Object target], [param:string colorSpace] = L

-

[method:Color getRGB]( [param:Color target], [param:string colorSpace] = SRGBColorSpace )

-

- [page:Color target] - 结果将复制到这个对象中.

- - Returns the RGB values of this color as an instance of [page:Color]. -

-

[method:String getStyle]( [param:string colorSpace] = SRGBColorSpace )

以CSS样式字符串的形式返回该颜色的值。例如:“rgb(255,0,0)”。

diff --git a/editor/css/main.css b/editor/css/main.css index b3cf3649a88268..7f21f39a06e9a8 100644 --- a/editor/css/main.css +++ b/editor/css/main.css @@ -67,13 +67,13 @@ textarea, input { outline: none; } /* osx */ position: relative; display: block; width: 100%; - min-width: 260px; } .TabbedPanel .Tabs { position: relative; display: block; width: 100%; + min-width: 300px; } .TabbedPanel .Tabs .Tab { @@ -85,6 +85,8 @@ textarea, input { outline: none; } /* osx */ position: relative; display: block; width: 100%; + height: 100%; + min-width: 300px; } /* Listbox */ diff --git a/editor/js/Config.js b/editor/js/Config.js index fcb80c66e34ca5..c586fe86fb74d7 100644 --- a/editor/js/Config.js +++ b/editor/js/Config.js @@ -14,7 +14,7 @@ function Config() { 'project/renderer/antialias': true, 'project/renderer/shadows': true, 'project/renderer/shadowType': 1, // PCF - 'project/renderer/useLegacyLights': false, + 'project/renderer/physicallyCorrectLights': false, 'project/renderer/toneMapping': 0, // NoToneMapping 'project/renderer/toneMappingExposure': 1, diff --git a/editor/js/Editor.js b/editor/js/Editor.js index 6243ea5919e650..3c75817e285d39 100644 --- a/editor/js/Editor.js +++ b/editor/js/Editor.js @@ -88,7 +88,6 @@ function Editor() { historyChanged: new Signal(), viewportCameraChanged: new Signal(), - viewportShadingChanged: new Signal(), intersectionsDetected: new Signal(), @@ -123,9 +122,7 @@ function Editor() { this.helpers = {}; this.cameras = {}; - this.viewportCamera = this.camera; - this.viewportShading = 'default'; this.addCamera( this.camera ); @@ -542,13 +539,6 @@ Editor.prototype = { }, - setViewportShading: function( value ) { - - this.viewportShading = value; - this.signals.viewportShadingChanged.dispatch(); - - }, - // select: function ( object ) { @@ -691,7 +681,7 @@ Editor.prototype = { shadows: this.config.getKey( 'project/renderer/shadows' ), shadowType: this.config.getKey( 'project/renderer/shadowType' ), vr: this.config.getKey( 'project/vr' ), - useLegacyLights: this.config.getKey( 'project/renderer/useLegacyLights' ), + physicallyCorrectLights: this.config.getKey( 'project/renderer/physicallyCorrectLights' ), toneMapping: this.config.getKey( 'project/renderer/toneMapping' ), toneMappingExposure: this.config.getKey( 'project/renderer/toneMappingExposure' ) }, diff --git a/editor/js/Sidebar.Project.Renderer.js b/editor/js/Sidebar.Project.Renderer.js index 84ee7748a7da9c..00e7995a87a002 100644 --- a/editor/js/Sidebar.Project.Renderer.js +++ b/editor/js/Sidebar.Project.Renderer.js @@ -29,18 +29,18 @@ function SidebarProjectRenderer( editor ) { // Physically Correct lights - const useLegacyLightsRow = new UIRow(); - container.add( useLegacyLightsRow ); + const physicallyCorrectLightsRow = new UIRow(); + container.add( physicallyCorrectLightsRow ); - useLegacyLightsRow.add( new UIText( strings.getKey( 'sidebar/project/useLegacyLights' ) ).setWidth( '90px' ) ); + physicallyCorrectLightsRow.add( new UIText( strings.getKey( 'sidebar/project/physicallyCorrectLights' ) ).setWidth( '90px' ) ); - const useLegacyLightsBoolean = new UIBoolean( config.getKey( 'project/renderer/useLegacyLights' ) ).onChange( function () { + const physicallyCorrectLightsBoolean = new UIBoolean( config.getKey( 'project/renderer/physicallyCorrectLights' ) ).onChange( function () { - currentRenderer.useLegacyLights = this.getValue(); + currentRenderer.physicallyCorrectLights = this.getValue(); signals.rendererUpdated.dispatch(); } ); - useLegacyLightsRow.add( useLegacyLightsBoolean ); + physicallyCorrectLightsRow.add( physicallyCorrectLightsBoolean ); // Shadows @@ -110,7 +110,7 @@ function SidebarProjectRenderer( editor ) { currentRenderer = new THREE.WebGLRenderer( { antialias: antialiasBoolean.getValue() } ); currentRenderer.outputEncoding = THREE.sRGBEncoding; - currentRenderer.useLegacyLights = useLegacyLightsBoolean.getValue(); + currentRenderer.physicallyCorrectLights = physicallyCorrectLightsBoolean.getValue(); currentRenderer.shadowMap.enabled = shadowsBoolean.getValue(); currentRenderer.shadowMap.type = parseFloat( shadowTypeSelect.getValue() ); currentRenderer.toneMapping = parseFloat( toneMappingSelect.getValue() ); @@ -128,13 +128,13 @@ function SidebarProjectRenderer( editor ) { signals.editorCleared.add( function () { - currentRenderer.useLegacyLights = false; + currentRenderer.physicallyCorrectLights = false; currentRenderer.shadowMap.enabled = true; currentRenderer.shadowMap.type = THREE.PCFShadowMap; currentRenderer.toneMapping = THREE.NoToneMapping; currentRenderer.toneMappingExposure = 1; - useLegacyLightsBoolean.setValue( currentRenderer.useLegacyLights ); + physicallyCorrectLightsBoolean.setValue( currentRenderer.physicallyCorrectLights ); shadowsBoolean.setValue( currentRenderer.shadowMap.enabled ); shadowTypeSelect.setValue( currentRenderer.shadowMap.type ); toneMappingSelect.setValue( currentRenderer.toneMapping ); @@ -149,7 +149,7 @@ function SidebarProjectRenderer( editor ) { config.setKey( 'project/renderer/antialias', antialiasBoolean.getValue(), - 'project/renderer/useLegacyLights', useLegacyLightsBoolean.getValue(), + 'project/renderer/physicallyCorrectLights', physicallyCorrectLightsBoolean.getValue(), 'project/renderer/shadows', shadowsBoolean.getValue(), 'project/renderer/shadowType', parseFloat( shadowTypeSelect.getValue() ), 'project/renderer/toneMapping', parseFloat( toneMappingSelect.getValue() ), diff --git a/editor/js/Strings.js b/editor/js/Strings.js index a58a26773ece37..7f93fa5bf1e229 100644 --- a/editor/js/Strings.js +++ b/editor/js/Strings.js @@ -317,7 +317,7 @@ function Strings( config ) { 'sidebar/project/renderer': 'Renderer', 'sidebar/project/antialias': 'Antialias', 'sidebar/project/shadows': 'Shadows', - 'sidebar/project/useLegacyLights': 'Use legacy lights', + 'sidebar/project/physicallyCorrectLights': 'Physical lights', 'sidebar/project/toneMapping': 'Tone mapping', 'sidebar/project/materials': 'Materials', 'sidebar/project/Assign': 'Assign', @@ -669,7 +669,7 @@ function Strings( config ) { 'sidebar/project/renderer': 'Rendus', 'sidebar/project/antialias': 'Anticrénelage', 'sidebar/project/shadows': 'Ombres', - 'sidebar/project/useLegacyLights': 'Use legacy lights', + 'sidebar/project/physicallyCorrectLights': 'Physical lights', 'sidebar/project/toneMapping': 'Mappage des nuances', 'sidebar/project/materials': 'Matériaux', 'sidebar/project/Assign': 'Attribuer', @@ -1021,7 +1021,7 @@ function Strings( config ) { 'sidebar/project/renderer': '渲染器', 'sidebar/project/antialias': '抗锯齿', 'sidebar/project/shadows': '阴影', - 'sidebar/project/useLegacyLights': '传统灯', + 'sidebar/project/physicallyCorrectLights': '物理灯', 'sidebar/project/toneMapping': '色调映射', 'sidebar/project/materials': '材质', 'sidebar/project/Assign': '应用', diff --git a/editor/js/Viewport.Camera.js b/editor/js/Viewport.Camera.js index c72bfac3a5d42d..3e6954ce5ced77 100644 --- a/editor/js/Viewport.Camera.js +++ b/editor/js/Viewport.Camera.js @@ -6,11 +6,11 @@ function ViewportCamera( editor ) { // - const select = new UISelect(); - select.setPosition( 'absolute' ); - select.setRight( '120px' ); - select.setTop( '10px' ); - select.onChange( function () { + const cameraSelect = new UISelect(); + cameraSelect.setPosition( 'absolute' ); + cameraSelect.setRight( '10px' ); + cameraSelect.setTop( '10px' ); + cameraSelect.onChange( function () { editor.setViewportCamera( this.getValue() ); @@ -36,12 +36,12 @@ function ViewportCamera( editor ) { } - select.setOptions( options ); - select.setValue( editor.viewportCamera.uuid ); + cameraSelect.setOptions( options ); + cameraSelect.setValue( editor.viewportCamera.uuid ); } - return select; + return cameraSelect; } diff --git a/editor/js/Viewport.Shading.js b/editor/js/Viewport.Shading.js deleted file mode 100644 index bca9fb82c1ce49..00000000000000 --- a/editor/js/Viewport.Shading.js +++ /dev/null @@ -1,21 +0,0 @@ -import { UISelect } from './libs/ui.js'; - -function ViewportShading( editor ) { - - const select = new UISelect(); - select.setPosition( 'absolute' ); - select.setRight( '10px' ); - select.setTop( '10px' ); - select.setOptions( { 'default': 'default', 'normals': 'normals', 'wireframe': 'wireframe' } ); - select.setValue( 'default' ); - select.onChange( function () { - - editor.setViewportShading( this.getValue() ); - - } ); - - return select; - -} - -export { ViewportShading }; diff --git a/editor/js/Viewport.js b/editor/js/Viewport.js index 67b51b4c945847..1ebc729c3d39a1 100644 --- a/editor/js/Viewport.js +++ b/editor/js/Viewport.js @@ -7,9 +7,7 @@ import { UIPanel } from './libs/ui.js'; import { EditorControls } from './EditorControls.js'; import { ViewportCamera } from './Viewport.Camera.js'; -import { ViewportShading } from './Viewport.Shading.js'; import { ViewportInfo } from './Viewport.Info.js'; - import { ViewHelper } from './Viewport.ViewHelper.js'; import { VR } from './Viewport.VR.js'; @@ -28,7 +26,6 @@ function Viewport( editor ) { container.setPosition( 'absolute' ); container.add( new ViewportCamera( editor ) ); - container.add( new ViewportShading( editor ) ); container.add( new ViewportInfo( editor ) ); // @@ -44,7 +41,6 @@ function Viewport( editor ) { // helpers const grid = new THREE.Group(); - sceneHelpers.add( grid ); const grid1 = new THREE.GridHelper( 30, 30, 0x888888 ); grid1.material.color.setHex( 0x888888 ); @@ -53,6 +49,7 @@ function Viewport( editor ) { const grid2 = new THREE.GridHelper( 30, 6, 0x222222 ); grid2.material.color.setHex( 0x222222 ); + grid2.material.depthFunc = THREE.AlwaysDepth; grid2.material.vertexColors = false; grid.add( grid2 ); @@ -222,8 +219,6 @@ function Viewport( editor ) { // event.preventDefault(); - if ( event.target !== renderer.domElement ) return; - const array = getMousePosition( container.dom, event.clientX, event.clientY ); onDownPosition.fromArray( array ); @@ -633,30 +628,6 @@ function Viewport( editor ) { } ); - signals.viewportShadingChanged.add( function () { - - const viewportShading = editor.viewportShading; - - switch ( viewportShading ) { - - case 'default': - scene.overrideMaterial = null; - break; - - case 'normals': - scene.overrideMaterial = new THREE.MeshNormalMaterial(); - break; - - case 'wireframe': - scene.overrideMaterial = new THREE.MeshBasicMaterial( { color: 0x000000, wireframe: true } ); - break; - - } - - render(); - - } ); - signals.exitedVR.add( render ); // @@ -743,8 +714,13 @@ function Viewport( editor ) { startTime = performance.now(); + // Adding/removing grid to scene so materials with depthWrite false + // don't render under the grid. + + scene.add( grid ); renderer.setViewport( 0, 0, container.dom.offsetWidth, container.dom.offsetHeight ); renderer.render( scene, editor.viewportCamera ); + scene.remove( grid ); if ( camera === editor.viewportCamera ) { diff --git a/editor/js/libs/app.js b/editor/js/libs/app.js index deca545e379f18..885f76818d3a4c 100644 --- a/editor/js/libs/app.js +++ b/editor/js/libs/app.js @@ -30,7 +30,7 @@ var APP = { if ( project.shadowType !== undefined ) renderer.shadowMap.type = project.shadowType; if ( project.toneMapping !== undefined ) renderer.toneMapping = project.toneMapping; if ( project.toneMappingExposure !== undefined ) renderer.toneMappingExposure = project.toneMappingExposure; - if ( project.useLegacyLights !== undefined ) renderer.useLegacyLights = project.useLegacyLights; + if ( project.physicallyCorrectLights !== undefined ) renderer.physicallyCorrectLights = project.physicallyCorrectLights; this.setScene( loader.parse( json.scene ) ); this.setCamera( loader.parse( json.camera ) ); diff --git a/editor/sw.js b/editor/sw.js index 4f38866da7ac72..602e6c45e30b70 100644 --- a/editor/sw.js +++ b/editor/sw.js @@ -190,7 +190,6 @@ const assets = [ './js/Toolbar.js', './js/Viewport.js', './js/Viewport.Camera.js', - './js/Viewport.Shading.js', './js/Viewport.Info.js', './js/Viewport.Selector.js', './js/Viewport.ViewHelper.js', diff --git a/examples/jsm/controls/OrbitControls.js b/examples/jsm/controls/OrbitControls.js index b42e81e5d8022b..16169dcc8b750d 100644 --- a/examples/jsm/controls/OrbitControls.js +++ b/examples/jsm/controls/OrbitControls.js @@ -301,7 +301,7 @@ class OrbitControls extends EventDispatcher { scope.domElement.removeEventListener( 'contextmenu', onContextMenu ); scope.domElement.removeEventListener( 'pointerdown', onPointerDown ); - scope.domElement.removeEventListener( 'pointercancel', onPointerUp ); + scope.domElement.removeEventListener( 'pointercancel', onPointerCancel ); scope.domElement.removeEventListener( 'wheel', onMouseWheel ); scope.domElement.removeEventListener( 'pointermove', onPointerMove ); @@ -883,20 +883,26 @@ class OrbitControls extends EventDispatcher { function onPointerUp( event ) { - removePointer( event ); + removePointer( event ); - if ( pointers.length === 0 ) { + if ( pointers.length === 0 ) { - scope.domElement.releasePointerCapture( event.pointerId ); + scope.domElement.releasePointerCapture( event.pointerId ); - scope.domElement.removeEventListener( 'pointermove', onPointerMove ); - scope.domElement.removeEventListener( 'pointerup', onPointerUp ); + scope.domElement.removeEventListener( 'pointermove', onPointerMove ); + scope.domElement.removeEventListener( 'pointerup', onPointerUp ); - } + } - scope.dispatchEvent( _endEvent ); + scope.dispatchEvent( _endEvent ); - state = STATE.NONE; + state = STATE.NONE; + + } + + function onPointerCancel( event ) { + + removePointer( event ); } @@ -1248,7 +1254,7 @@ class OrbitControls extends EventDispatcher { scope.domElement.addEventListener( 'contextmenu', onContextMenu ); scope.domElement.addEventListener( 'pointerdown', onPointerDown ); - scope.domElement.addEventListener( 'pointercancel', onPointerUp ); + scope.domElement.addEventListener( 'pointercancel', onPointerCancel ); scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } ); // force an update at start diff --git a/examples/jsm/exporters/USDZExporter.js b/examples/jsm/exporters/USDZExporter.js index 1e0fab011b412b..a8fe3d8d993732 100644 --- a/examples/jsm/exporters/USDZExporter.js +++ b/examples/jsm/exporters/USDZExporter.js @@ -82,7 +82,7 @@ class USDZExporter { const color = id.split( '_' )[ 1 ]; const isRGBA = texture.format === 1023; - const canvas = imageToCanvas( texture.image, color, texture.flipY ); + const canvas = imageToCanvas( texture.image, color ); const blob = await new Promise( resolve => canvas.toBlob( resolve, isRGBA ? 'image/png' : 'image/jpeg', 1 ) ); files[ `textures/Texture_${ id }.${ isRGBA ? 'png' : 'jpg' }` ] = new Uint8Array( await blob.arrayBuffer() ); @@ -122,7 +122,7 @@ class USDZExporter { } -function imageToCanvas( image, color, flipY ) { +function imageToCanvas( image, color ) { if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || @@ -136,14 +136,6 @@ function imageToCanvas( image, color, flipY ) { canvas.height = image.height * Math.min( 1, scale ); const context = canvas.getContext( '2d' ); - - if ( flipY === true ) { - - context.translate( 0, canvas.height ); - context.scale( 1, - 1 ); - - } - context.drawImage( image, 0, 0, canvas.width, canvas.height ); if ( color !== undefined ) { diff --git a/examples/jsm/geometries/ParametricGeometry.js b/examples/jsm/geometries/ParametricGeometry.js index 8f726b24704358..33ec014efa5fec 100644 --- a/examples/jsm/geometries/ParametricGeometry.js +++ b/examples/jsm/geometries/ParametricGeometry.js @@ -124,16 +124,6 @@ class ParametricGeometry extends BufferGeometry { } - copy( source ) { - - super.copy( source ); - - this.parameters = Object.assign( {}, source.parameters ); - - return this; - - } - } export { ParametricGeometry }; diff --git a/examples/jsm/loaders/EXRLoader.js b/examples/jsm/loaders/EXRLoader.js index 734e0bfbb9632e..0ddc91c42315fb 100644 --- a/examples/jsm/loaders/EXRLoader.js +++ b/examples/jsm/loaders/EXRLoader.js @@ -1749,21 +1749,11 @@ class EXRLoader extends DataTextureLoader { const parseInt64 = function ( dataView, offset ) { - let int; - - if ( 'getBigInt64' in DataView.prototype ) { - - int = Number( dataView.getBigInt64( offset.value, true ) ); - - } else { - - int = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 ); - - } + const Int64 = Number( dataView.getBigInt64( offset.value, true ) ); offset.value += ULONG_SIZE; - return int; + return Int64; }; diff --git a/examples/jsm/loaders/IFCLoader.js b/examples/jsm/loaders/IFCLoader.js new file mode 100644 index 00000000000000..a172b39450f3d9 --- /dev/null +++ b/examples/jsm/loaders/IFCLoader.js @@ -0,0 +1,2430 @@ +import { + IFCRELAGGREGATES, + IFCRELCONTAINEDINSPATIALSTRUCTURE, + IFCRELDEFINESBYPROPERTIES, + IFCRELASSOCIATESMATERIAL, + IFCRELDEFINESBYTYPE, + IFCPROJECT, + IfcAPI +} from './ifc/web-ifc-api.js'; +import { + BufferAttribute, + Mesh, + Matrix4, + BufferGeometry, + Color, + MeshLambertMaterial, + DoubleSide, + Loader, + FileLoader +} from 'three'; +import { mergeBufferGeometries } from '../utils/BufferGeometryUtils.js'; + +const IdAttrName = 'expressID'; +const merge = ( geoms, createGroups = false ) => { + + return mergeBufferGeometries( geoms, createGroups ); + +}; + +const newFloatAttr = ( data, size ) => { + + return new BufferAttribute( new Float32Array( data ), size ); + +}; + +const newIntAttr = ( data, size ) => { + + return new BufferAttribute( new Uint32Array( data ), size ); + +}; + +const DEFAULT = 'default'; +const PropsNames = { + aggregates: { + name: IFCRELAGGREGATES, + relating: 'RelatingObject', + related: 'RelatedObjects', + key: 'children' + }, + spatial: { + name: IFCRELCONTAINEDINSPATIALSTRUCTURE, + relating: 'RelatingStructure', + related: 'RelatedElements', + key: 'children' + }, + psets: { + name: IFCRELDEFINESBYPROPERTIES, + relating: 'RelatingPropertyDefinition', + related: 'RelatedObjects', + key: 'hasPsets' + }, + materials: { + name: IFCRELASSOCIATESMATERIAL, + relating: 'RelatingMaterial', + related: 'RelatedObjects', + key: 'hasMaterial' + }, + type: { + name: IFCRELDEFINESBYTYPE, + relating: 'RelatingType', + related: 'RelatedObjects', + key: 'hasType' + } +}; + +class IFCParser { + + constructor( state, BVH ) { + + this.state = state; + this.BVH = BVH; + this.loadedModels = 0; + this.currentWebIfcID = - 1; + this.currentModelID = - 1; + + } + + async parse( buffer ) { + + if ( this.state.api.wasmModule === undefined ) + await this.state.api.Init(); + this.newIfcModel( buffer ); + this.loadedModels ++; + return this.loadAllGeometry(); + + } + + newIfcModel( buffer ) { + + const data = new Uint8Array( buffer ); + this.currentWebIfcID = this.state.api.OpenModel( data, this.state.webIfcSettings ); + this.currentModelID = this.state.useJSON ? this.loadedModels : this.currentWebIfcID; + this.state.models[ this.currentModelID ] = { + modelID: this.currentModelID, + mesh: {}, + items: {}, + types: {}, + jsonData: {} + }; + + } + + loadAllGeometry() { + + this.saveAllPlacedGeometriesByMaterial(); + return this.generateAllGeometriesByMaterial(); + + } + + generateAllGeometriesByMaterial() { + + const { geometry, materials } = this.getGeometryAndMaterials(); + this.BVH.applyThreeMeshBVH( geometry ); + const mesh = new Mesh( geometry, materials ); + mesh.modelID = this.currentModelID; + this.state.models[ this.currentModelID ].mesh = mesh; + return mesh; + + } + + getGeometryAndMaterials() { + + const items = this.state.models[ this.currentModelID ].items; + const mergedByMaterial = []; + const materials = []; + for ( const materialID in items ) { + + materials.push( items[ materialID ].material ); + const geometries = Object.values( items[ materialID ].geometries ); + mergedByMaterial.push( merge( geometries ) ); + + } + + const geometry = merge( mergedByMaterial, true ); + return { + geometry, + materials + }; + + } + + saveAllPlacedGeometriesByMaterial() { + + const flatMeshes = this.state.api.LoadAllGeometry( this.currentWebIfcID ); + for ( let i = 0; i < flatMeshes.size(); i ++ ) { + + const flatMesh = flatMeshes.get( i ); + const placedGeom = flatMesh.geometries; + for ( let j = 0; j < placedGeom.size(); j ++ ) { + + this.savePlacedGeometry( placedGeom.get( j ), flatMesh.expressID ); + + } + + } + + } + + savePlacedGeometry( placedGeometry, id ) { + + const geometry = this.getBufferGeometry( placedGeometry ); + geometry.computeVertexNormals(); + const matrix = this.getMeshMatrix( placedGeometry.flatTransformation ); + geometry.applyMatrix4( matrix ); + this.saveGeometryByMaterial( geometry, placedGeometry, id ); + + } + + getBufferGeometry( placed ) { + + const geometry = this.state.api.GetGeometry( this.currentWebIfcID, placed.geometryExpressID ); + const vertexData = this.getVertices( geometry ); + const indices = this.getIndices( geometry ); + const { vertices, normals } = this.extractVertexData( vertexData ); + return this.ifcGeomToBufferGeom( vertices, normals, indices ); + + } + + getVertices( geometry ) { + + const vData = geometry.GetVertexData(); + const vDataSize = geometry.GetVertexDataSize(); + return this.state.api.GetVertexArray( vData, vDataSize ); + + } + + getIndices( geometry ) { + + const iData = geometry.GetIndexData(); + const iDataSize = geometry.GetIndexDataSize(); + return this.state.api.GetIndexArray( iData, iDataSize ); + + } + + getMeshMatrix( matrix ) { + + const mat = new Matrix4(); + mat.fromArray( matrix ); + return mat; + + } + + ifcGeomToBufferGeom( vertices, normals, indexData ) { + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', newFloatAttr( vertices, 3 ) ); + geometry.setAttribute( 'normal', newFloatAttr( normals, 3 ) ); + geometry.setIndex( new BufferAttribute( indexData, 1 ) ); + return geometry; + + } + + extractVertexData( vertexData ) { + + const vertices = []; + const normals = []; + let isNormalData = false; + for ( let i = 0; i < vertexData.length; i ++ ) { + + isNormalData ? normals.push( vertexData[ i ] ) : vertices.push( vertexData[ i ] ); + if ( ( i + 1 ) % 3 == 0 ) + isNormalData = ! isNormalData; + + } + + return { + vertices, + normals + }; + + } + + saveGeometryByMaterial( geom, placedGeom, id ) { + + const color = placedGeom.color; + const colorID = `${color.x}${color.y}${color.z}${color.w}`; + this.storeGeometryAttribute( id, geom ); + this.createMaterial( colorID, color ); + const item = this.state.models[ this.currentModelID ].items[ colorID ]; + const currentGeom = item.geometries[ id ]; + if ( ! currentGeom ) + return ( item.geometries[ id ] = geom ); + const merged = merge( [ currentGeom, geom ] ); + item.geometries[ id ] = merged; + + } + + storeGeometryAttribute( id, geometry ) { + + const size = geometry.attributes.position.count; + const idAttribute = new Array( size ).fill( id ); + geometry.setAttribute( IdAttrName, newIntAttr( idAttribute, 1 ) ); + + } + + createMaterial( colorID, color ) { + + const items = this.state.models[ this.currentModelID ].items; + if ( items[ colorID ] ) + return; + const col = new Color( color.x, color.y, color.z ); + const newMaterial = new MeshLambertMaterial( { + color: col, + side: DoubleSide + } ); + newMaterial.transparent = color.w !== 1; + if ( newMaterial.transparent ) + newMaterial.opacity = color.w; + items[ colorID ] = { + material: newMaterial, + geometries: {} + }; + + } + +} + +class SubsetManager { + + constructor( state, BVH ) { + + this.selected = {}; + this.state = state; + this.BVH = BVH; + + } + + getSubset( modelID, material ) { + + const currentMat = this.matIDNoConfig( modelID, material ); + if ( ! this.selected[ currentMat ] ) + return null; + return this.selected[ currentMat ].mesh; + + } + + removeSubset( modelID, parent, material ) { + + const currentMat = this.matIDNoConfig( modelID, material ); + if ( ! this.selected[ currentMat ] ) + return; + if ( parent ) + parent.remove( this.selected[ currentMat ].mesh ); + delete this.selected[ currentMat ]; + + } + + createSubset( config ) { + + if ( ! this.isConfigValid( config ) ) + return; + if ( this.isPreviousSelection( config ) ) + return; + if ( this.isEasySelection( config ) ) + return this.addToPreviousSelection( config ); + this.updatePreviousSelection( config.scene, config ); + return this.createSelectionInScene( config ); + + } + + createSelectionInScene( config ) { + + const filtered = this.filter( config ); + const { geomsByMaterial, materials } = this.getGeomAndMat( filtered ); + const isDefMaterial = this.isDefaultMat( config ); + const geometry = this.getMergedGeometry( geomsByMaterial, isDefMaterial ); + const mats = isDefMaterial ? materials : config.material; + this.BVH.applyThreeMeshBVH( geometry ); + const mesh = new Mesh( geometry, mats ); + this.selected[ this.matID( config ) ].mesh = mesh; + mesh.modelID = config.modelID; + config.scene.add( mesh ); + return mesh; + + } + + getMergedGeometry( geomsByMaterial, hasDefaultMaterial ) { + + return geomsByMaterial.length > 0 + ? merge( geomsByMaterial, hasDefaultMaterial ) + : new BufferGeometry(); + + } + + isConfigValid( config ) { + + return ( this.isValid( config.scene ) && + this.isValid( config.modelID ) && + this.isValid( config.ids ) && + this.isValid( config.removePrevious ) ); + + } + + isValid( item ) { + + return item !== undefined && item !== null; + + } + + getGeomAndMat( filtered ) { + + const geomsByMaterial = []; + const materials = []; + for ( const matID in filtered ) { + + const geoms = Object.values( filtered[ matID ].geometries ); + if ( ! geoms.length ) + continue; + materials.push( filtered[ matID ].material ); + if ( geoms.length > 1 ) + geomsByMaterial.push( merge( geoms ) ); + else + geomsByMaterial.push( ...geoms ); + + } + + return { + geomsByMaterial, + materials + }; + + } + + updatePreviousSelection( parent, config ) { + + const previous = this.selected[ this.matID( config ) ]; + if ( ! previous ) + return this.newSelectionGroup( config ); + parent.remove( previous.mesh ); + config.removePrevious + ? ( previous.ids = new Set( config.ids ) ) + : config.ids.forEach( ( id ) => previous.ids.add( id ) ); + + } + + newSelectionGroup( config ) { + + this.selected[ this.matID( config ) ] = { + ids: new Set( config.ids ), + mesh: {} + }; + + } + + isPreviousSelection( config ) { + + if ( ! this.selected[ this.matID( config ) ] ) + return false; + if ( this.containsIds( config ) ) + return true; + const previousIds = this.selected[ this.matID( config ) ].ids; + return JSON.stringify( config.ids ) === JSON.stringify( previousIds ); + + } + + containsIds( config ) { + + const newIds = config.ids; + const previous = Array.from( this.selected[ this.matID( config ) ].ids ); + return newIds.every( ( i => v => ( i = previous.indexOf( v, i ) + 1 ) )( 0 ) ); + + } + + addToPreviousSelection( config ) { + + const previous = this.selected[ this.matID( config ) ]; + const filtered = this.filter( config ); + const geometries = Object.values( filtered ).map( ( i ) => Object.values( i.geometries ) ).flat(); + const previousGeom = previous.mesh.geometry; + previous.mesh.geometry = merge( [ previousGeom, ...geometries ] ); + config.ids.forEach( ( id ) => previous.ids.add( id ) ); + + } + + filter( config ) { + + const ids = this.selected[ this.matID( config ) ].ids; + const items = this.state.models[ config.modelID ].items; + const filtered = {}; + for ( const matID in items ) { + + filtered[ matID ] = { + material: items[ matID ].material, + geometries: this.filterGeometries( ids, items[ matID ].geometries ) + }; + + } + + return filtered; + + } + + filterGeometries( selectedIDs, geometries ) { + + const ids = Array.from( selectedIDs ); + return Object.keys( geometries ) + .filter( ( key ) => ids.includes( parseInt( key, 10 ) ) ) + .reduce( ( obj, key ) => { + + return { + ...obj, + [ key ]: geometries[ key ] + }; + + }, {} ); + + } + + isEasySelection( config ) { + + const matID = this.matID( config ); + if ( ! config.removePrevious && ! this.isDefaultMat( config ) && this.selected[ matID ] ) + return true; + + } + + isDefaultMat( config ) { + + return this.matIDNoConfig( config.modelID ) === this.matID( config ); + + } + + matID( config ) { + + let name; + if ( ! config.material ) + name = DEFAULT; + else + name = config.material.uuid || DEFAULT; + return name.concat( ' - ' ).concat( config.modelID.toString() ); + + } + + matIDNoConfig( modelID, material ) { + + let name = DEFAULT; + if ( material ) + name = material.uuid; + return name.concat( ' - ' ).concat( modelID.toString() ); + + } + +} + +const IfcElements = { + 103090709: 'IFCPROJECT', + 4097777520: 'IFCSITE', + 4031249490: 'IFCBUILDING', + 3124254112: 'IFCBUILDINGSTOREY', + 3856911033: 'IFCSPACE', + 1674181508: 'IFCANNOTATION', + 25142252: 'IFCCONTROLLER', + 32344328: 'IFCBOILER', + 76236018: 'IFCLAMP', + 90941305: 'IFCPUMP', + 177149247: 'IFCAIRTERMINALBOX', + 182646315: 'IFCFLOWINSTRUMENT', + 263784265: 'IFCFURNISHINGELEMENT', + 264262732: 'IFCELECTRICGENERATOR', + 277319702: 'IFCAUDIOVISUALAPPLIANCE', + 310824031: 'IFCPIPEFITTING', + 331165859: 'IFCSTAIR', + 342316401: 'IFCDUCTFITTING', + 377706215: 'IFCMECHANICALFASTENER', + 395920057: 'IFCDOOR', + 402227799: 'IFCELECTRICMOTOR', + 413509423: 'IFCSYSTEMFURNITUREELEMENT', + 484807127: 'IFCEVAPORATOR', + 486154966: 'IFCWINDOWSTANDARDCASE', + 629592764: 'IFCLIGHTFIXTURE', + 630975310: 'IFCUNITARYCONTROLELEMENT', + 635142910: 'IFCCABLECARRIERFITTING', + 639361253: 'IFCCOIL', + 647756555: 'IFCFASTENER', + 707683696: 'IFCFLOWSTORAGEDEVICE', + 738039164: 'IFCPROTECTIVEDEVICE', + 753842376: 'IFCBEAM', + 812556717: 'IFCTANK', + 819412036: 'IFCFILTER', + 843113511: 'IFCCOLUMN', + 862014818: 'IFCELECTRICDISTRIBUTIONBOARD', + 900683007: 'IFCFOOTING', + 905975707: 'IFCCOLUMNSTANDARDCASE', + 926996030: 'IFCVOIDINGFEATURE', + 979691226: 'IFCREINFORCINGBAR', + 987401354: 'IFCFLOWSEGMENT', + 1003880860: 'IFCELECTRICTIMECONTROL', + 1051757585: 'IFCCABLEFITTING', + 1052013943: 'IFCDISTRIBUTIONCHAMBERELEMENT', + 1062813311: 'IFCDISTRIBUTIONCONTROLELEMENT', + 1073191201: 'IFCMEMBER', + 1095909175: 'IFCBUILDINGELEMENTPROXY', + 1156407060: 'IFCPLATESTANDARDCASE', + 1162798199: 'IFCSWITCHINGDEVICE', + 1329646415: 'IFCSHADINGDEVICE', + 1335981549: 'IFCDISCRETEACCESSORY', + 1360408905: 'IFCDUCTSILENCER', + 1404847402: 'IFCSTACKTERMINAL', + 1426591983: 'IFCFIRESUPPRESSIONTERMINAL', + 1437502449: 'IFCMEDICALDEVICE', + 1509553395: 'IFCFURNITURE', + 1529196076: 'IFCSLAB', + 1620046519: 'IFCTRANSPORTELEMENT', + 1634111441: 'IFCAIRTERMINAL', + 1658829314: 'IFCENERGYCONVERSIONDEVICE', + 1677625105: 'IFCCIVILELEMENT', + 1687234759: 'IFCPILE', + 1904799276: 'IFCELECTRICAPPLIANCE', + 1911478936: 'IFCMEMBERSTANDARDCASE', + 1945004755: 'IFCDISTRIBUTIONELEMENT', + 1973544240: 'IFCCOVERING', + 1999602285: 'IFCSPACEHEATER', + 2016517767: 'IFCROOF', + 2056796094: 'IFCAIRTOAIRHEATRECOVERY', + 2058353004: 'IFCFLOWCONTROLLER', + 2068733104: 'IFCHUMIDIFIER', + 2176052936: 'IFCJUNCTIONBOX', + 2188021234: 'IFCFLOWMETER', + 2223149337: 'IFCFLOWTERMINAL', + 2262370178: 'IFCRAILING', + 2272882330: 'IFCCONDENSER', + 2295281155: 'IFCPROTECTIVEDEVICETRIPPINGUNIT', + 2320036040: 'IFCREINFORCINGMESH', + 2347447852: 'IFCTENDONANCHOR', + 2391383451: 'IFCVIBRATIONISOLATOR', + 2391406946: 'IFCWALL', + 2474470126: 'IFCMOTORCONNECTION', + 2769231204: 'IFCVIRTUALELEMENT', + 2814081492: 'IFCENGINE', + 2906023776: 'IFCBEAMSTANDARDCASE', + 2938176219: 'IFCBURNER', + 2979338954: 'IFCBUILDINGELEMENTPART', + 3024970846: 'IFCRAMP', + 3026737570: 'IFCTUBEBUNDLE', + 3027962421: 'IFCSLABSTANDARDCASE', + 3040386961: 'IFCDISTRIBUTIONFLOWELEMENT', + 3053780830: 'IFCSANITARYTERMINAL', + 3079942009: 'IFCOPENINGSTANDARDCASE', + 3087945054: 'IFCALARM', + 3101698114: 'IFCSURFACEFEATURE', + 3127900445: 'IFCSLABELEMENTEDCASE', + 3132237377: 'IFCFLOWMOVINGDEVICE', + 3171933400: 'IFCPLATE', + 3221913625: 'IFCCOMMUNICATIONSAPPLIANCE', + 3242481149: 'IFCDOORSTANDARDCASE', + 3283111854: 'IFCRAMPFLIGHT', + 3296154744: 'IFCCHIMNEY', + 3304561284: 'IFCWINDOW', + 3310460725: 'IFCELECTRICFLOWSTORAGEDEVICE', + 3319311131: 'IFCHEATEXCHANGER', + 3415622556: 'IFCFAN', + 3420628829: 'IFCSOLARDEVICE', + 3493046030: 'IFCGEOGRAPHICELEMENT', + 3495092785: 'IFCCURTAINWALL', + 3508470533: 'IFCFLOWTREATMENTDEVICE', + 3512223829: 'IFCWALLSTANDARDCASE', + 3518393246: 'IFCDUCTSEGMENT', + 3571504051: 'IFCCOMPRESSOR', + 3588315303: 'IFCOPENINGELEMENT', + 3612865200: 'IFCPIPESEGMENT', + 3640358203: 'IFCCOOLINGTOWER', + 3651124850: 'IFCPROJECTIONELEMENT', + 3694346114: 'IFCOUTLET', + 3747195512: 'IFCEVAPORATIVECOOLER', + 3758799889: 'IFCCABLECARRIERSEGMENT', + 3824725483: 'IFCTENDON', + 3825984169: 'IFCTRANSFORMER', + 3902619387: 'IFCCHILLER', + 4074379575: 'IFCDAMPER', + 4086658281: 'IFCSENSOR', + 4123344466: 'IFCELEMENTASSEMBLY', + 4136498852: 'IFCCOOLEDBEAM', + 4156078855: 'IFCWALLELEMENTEDCASE', + 4175244083: 'IFCINTERCEPTOR', + 4207607924: 'IFCVALVE', + 4217484030: 'IFCCABLESEGMENT', + 4237592921: 'IFCWASTETERMINAL', + 4252922144: 'IFCSTAIRFLIGHT', + 4278956645: 'IFCFLOWFITTING', + 4288193352: 'IFCACTUATOR', + 4292641817: 'IFCUNITARYEQUIPMENT', + 3009204131: 'IFCGRID' +}; + +const IfcTypesMap = { + 3821786052: 'IFCACTIONREQUEST', + 2296667514: 'IFCACTOR', + 3630933823: 'IFCACTORROLE', + 4288193352: 'IFCACTUATOR', + 2874132201: 'IFCACTUATORTYPE', + 618182010: 'IFCADDRESS', + 1635779807: 'IFCADVANCEDBREP', + 2603310189: 'IFCADVANCEDBREPWITHVOIDS', + 3406155212: 'IFCADVANCEDFACE', + 1634111441: 'IFCAIRTERMINAL', + 177149247: 'IFCAIRTERMINALBOX', + 1411407467: 'IFCAIRTERMINALBOXTYPE', + 3352864051: 'IFCAIRTERMINALTYPE', + 2056796094: 'IFCAIRTOAIRHEATRECOVERY', + 1871374353: 'IFCAIRTOAIRHEATRECOVERYTYPE', + 3087945054: 'IFCALARM', + 3001207471: 'IFCALARMTYPE', + 325726236: 'IFCALIGNMENT', + 749761778: 'IFCALIGNMENT2DHORIZONTAL', + 3199563722: 'IFCALIGNMENT2DHORIZONTALSEGMENT', + 2483840362: 'IFCALIGNMENT2DSEGMENT', + 3379348081: 'IFCALIGNMENT2DVERSEGCIRCULARARC', + 3239324667: 'IFCALIGNMENT2DVERSEGLINE', + 4263986512: 'IFCALIGNMENT2DVERSEGPARABOLICARC', + 53199957: 'IFCALIGNMENT2DVERTICAL', + 2029264950: 'IFCALIGNMENT2DVERTICALSEGMENT', + 3512275521: 'IFCALIGNMENTCURVE', + 1674181508: 'IFCANNOTATION', + 669184980: 'IFCANNOTATIONFILLAREA', + 639542469: 'IFCAPPLICATION', + 411424972: 'IFCAPPLIEDVALUE', + 130549933: 'IFCAPPROVAL', + 3869604511: 'IFCAPPROVALRELATIONSHIP', + 3798115385: 'IFCARBITRARYCLOSEDPROFILEDEF', + 1310608509: 'IFCARBITRARYOPENPROFILEDEF', + 2705031697: 'IFCARBITRARYPROFILEDEFWITHVOIDS', + 3460190687: 'IFCASSET', + 3207858831: 'IFCASYMMETRICISHAPEPROFILEDEF', + 277319702: 'IFCAUDIOVISUALAPPLIANCE', + 1532957894: 'IFCAUDIOVISUALAPPLIANCETYPE', + 4261334040: 'IFCAXIS1PLACEMENT', + 3125803723: 'IFCAXIS2PLACEMENT2D', + 2740243338: 'IFCAXIS2PLACEMENT3D', + 1967976161: 'IFCBSPLINECURVE', + 2461110595: 'IFCBSPLINECURVEWITHKNOTS', + 2887950389: 'IFCBSPLINESURFACE', + 167062518: 'IFCBSPLINESURFACEWITHKNOTS', + 753842376: 'IFCBEAM', + 2906023776: 'IFCBEAMSTANDARDCASE', + 819618141: 'IFCBEAMTYPE', + 4196446775: 'IFCBEARING', + 3649138523: 'IFCBEARINGTYPE', + 616511568: 'IFCBLOBTEXTURE', + 1334484129: 'IFCBLOCK', + 32344328: 'IFCBOILER', + 231477066: 'IFCBOILERTYPE', + 3649129432: 'IFCBOOLEANCLIPPINGRESULT', + 2736907675: 'IFCBOOLEANRESULT', + 4037036970: 'IFCBOUNDARYCONDITION', + 1136057603: 'IFCBOUNDARYCURVE', + 1560379544: 'IFCBOUNDARYEDGECONDITION', + 3367102660: 'IFCBOUNDARYFACECONDITION', + 1387855156: 'IFCBOUNDARYNODECONDITION', + 2069777674: 'IFCBOUNDARYNODECONDITIONWARPING', + 1260505505: 'IFCBOUNDEDCURVE', + 4182860854: 'IFCBOUNDEDSURFACE', + 2581212453: 'IFCBOUNDINGBOX', + 2713105998: 'IFCBOXEDHALFSPACE', + 644574406: 'IFCBRIDGE', + 963979645: 'IFCBRIDGEPART', + 4031249490: 'IFCBUILDING', + 3299480353: 'IFCBUILDINGELEMENT', + 2979338954: 'IFCBUILDINGELEMENTPART', + 39481116: 'IFCBUILDINGELEMENTPARTTYPE', + 1095909175: 'IFCBUILDINGELEMENTPROXY', + 1909888760: 'IFCBUILDINGELEMENTPROXYTYPE', + 1950629157: 'IFCBUILDINGELEMENTTYPE', + 3124254112: 'IFCBUILDINGSTOREY', + 1177604601: 'IFCBUILDINGSYSTEM', + 2938176219: 'IFCBURNER', + 2188180465: 'IFCBURNERTYPE', + 2898889636: 'IFCCSHAPEPROFILEDEF', + 635142910: 'IFCCABLECARRIERFITTING', + 395041908: 'IFCCABLECARRIERFITTINGTYPE', + 3758799889: 'IFCCABLECARRIERSEGMENT', + 3293546465: 'IFCCABLECARRIERSEGMENTTYPE', + 1051757585: 'IFCCABLEFITTING', + 2674252688: 'IFCCABLEFITTINGTYPE', + 4217484030: 'IFCCABLESEGMENT', + 1285652485: 'IFCCABLESEGMENTTYPE', + 3999819293: 'IFCCAISSONFOUNDATION', + 3203706013: 'IFCCAISSONFOUNDATIONTYPE', + 1123145078: 'IFCCARTESIANPOINT', + 574549367: 'IFCCARTESIANPOINTLIST', + 1675464909: 'IFCCARTESIANPOINTLIST2D', + 2059837836: 'IFCCARTESIANPOINTLIST3D', + 59481748: 'IFCCARTESIANTRANSFORMATIONOPERATOR', + 3749851601: 'IFCCARTESIANTRANSFORMATIONOPERATOR2D', + 3486308946: 'IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM', + 3331915920: 'IFCCARTESIANTRANSFORMATIONOPERATOR3D', + 1416205885: 'IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM', + 3150382593: 'IFCCENTERLINEPROFILEDEF', + 3902619387: 'IFCCHILLER', + 2951183804: 'IFCCHILLERTYPE', + 3296154744: 'IFCCHIMNEY', + 2197970202: 'IFCCHIMNEYTYPE', + 2611217952: 'IFCCIRCLE', + 2937912522: 'IFCCIRCLEHOLLOWPROFILEDEF', + 1383045692: 'IFCCIRCLEPROFILEDEF', + 1062206242: 'IFCCIRCULARARCSEGMENT2D', + 1677625105: 'IFCCIVILELEMENT', + 3893394355: 'IFCCIVILELEMENTTYPE', + 747523909: 'IFCCLASSIFICATION', + 647927063: 'IFCCLASSIFICATIONREFERENCE', + 2205249479: 'IFCCLOSEDSHELL', + 639361253: 'IFCCOIL', + 2301859152: 'IFCCOILTYPE', + 776857604: 'IFCCOLOURRGB', + 3285139300: 'IFCCOLOURRGBLIST', + 3264961684: 'IFCCOLOURSPECIFICATION', + 843113511: 'IFCCOLUMN', + 905975707: 'IFCCOLUMNSTANDARDCASE', + 300633059: 'IFCCOLUMNTYPE', + 3221913625: 'IFCCOMMUNICATIONSAPPLIANCE', + 400855858: 'IFCCOMMUNICATIONSAPPLIANCETYPE', + 2542286263: 'IFCCOMPLEXPROPERTY', + 3875453745: 'IFCCOMPLEXPROPERTYTEMPLATE', + 3732776249: 'IFCCOMPOSITECURVE', + 15328376: 'IFCCOMPOSITECURVEONSURFACE', + 2485617015: 'IFCCOMPOSITECURVESEGMENT', + 1485152156: 'IFCCOMPOSITEPROFILEDEF', + 3571504051: 'IFCCOMPRESSOR', + 3850581409: 'IFCCOMPRESSORTYPE', + 2272882330: 'IFCCONDENSER', + 2816379211: 'IFCCONDENSERTYPE', + 2510884976: 'IFCCONIC', + 370225590: 'IFCCONNECTEDFACESET', + 1981873012: 'IFCCONNECTIONCURVEGEOMETRY', + 2859738748: 'IFCCONNECTIONGEOMETRY', + 45288368: 'IFCCONNECTIONPOINTECCENTRICITY', + 2614616156: 'IFCCONNECTIONPOINTGEOMETRY', + 2732653382: 'IFCCONNECTIONSURFACEGEOMETRY', + 775493141: 'IFCCONNECTIONVOLUMEGEOMETRY', + 1959218052: 'IFCCONSTRAINT', + 3898045240: 'IFCCONSTRUCTIONEQUIPMENTRESOURCE', + 2185764099: 'IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE', + 1060000209: 'IFCCONSTRUCTIONMATERIALRESOURCE', + 4105962743: 'IFCCONSTRUCTIONMATERIALRESOURCETYPE', + 488727124: 'IFCCONSTRUCTIONPRODUCTRESOURCE', + 1525564444: 'IFCCONSTRUCTIONPRODUCTRESOURCETYPE', + 2559216714: 'IFCCONSTRUCTIONRESOURCE', + 2574617495: 'IFCCONSTRUCTIONRESOURCETYPE', + 3419103109: 'IFCCONTEXT', + 3050246964: 'IFCCONTEXTDEPENDENTUNIT', + 3293443760: 'IFCCONTROL', + 25142252: 'IFCCONTROLLER', + 578613899: 'IFCCONTROLLERTYPE', + 2889183280: 'IFCCONVERSIONBASEDUNIT', + 2713554722: 'IFCCONVERSIONBASEDUNITWITHOFFSET', + 4136498852: 'IFCCOOLEDBEAM', + 335055490: 'IFCCOOLEDBEAMTYPE', + 3640358203: 'IFCCOOLINGTOWER', + 2954562838: 'IFCCOOLINGTOWERTYPE', + 1785450214: 'IFCCOORDINATEOPERATION', + 1466758467: 'IFCCOORDINATEREFERENCESYSTEM', + 3895139033: 'IFCCOSTITEM', + 1419761937: 'IFCCOSTSCHEDULE', + 602808272: 'IFCCOSTVALUE', + 1973544240: 'IFCCOVERING', + 1916426348: 'IFCCOVERINGTYPE', + 3295246426: 'IFCCREWRESOURCE', + 1815067380: 'IFCCREWRESOURCETYPE', + 2506170314: 'IFCCSGPRIMITIVE3D', + 2147822146: 'IFCCSGSOLID', + 539742890: 'IFCCURRENCYRELATIONSHIP', + 3495092785: 'IFCCURTAINWALL', + 1457835157: 'IFCCURTAINWALLTYPE', + 2601014836: 'IFCCURVE', + 2827736869: 'IFCCURVEBOUNDEDPLANE', + 2629017746: 'IFCCURVEBOUNDEDSURFACE', + 1186437898: 'IFCCURVESEGMENT2D', + 3800577675: 'IFCCURVESTYLE', + 1105321065: 'IFCCURVESTYLEFONT', + 2367409068: 'IFCCURVESTYLEFONTANDSCALING', + 3510044353: 'IFCCURVESTYLEFONTPATTERN', + 1213902940: 'IFCCYLINDRICALSURFACE', + 4074379575: 'IFCDAMPER', + 3961806047: 'IFCDAMPERTYPE', + 3426335179: 'IFCDEEPFOUNDATION', + 1306400036: 'IFCDEEPFOUNDATIONTYPE', + 3632507154: 'IFCDERIVEDPROFILEDEF', + 1765591967: 'IFCDERIVEDUNIT', + 1045800335: 'IFCDERIVEDUNITELEMENT', + 2949456006: 'IFCDIMENSIONALEXPONENTS', + 32440307: 'IFCDIRECTION', + 1335981549: 'IFCDISCRETEACCESSORY', + 2635815018: 'IFCDISCRETEACCESSORYTYPE', + 1945343521: 'IFCDISTANCEEXPRESSION', + 1052013943: 'IFCDISTRIBUTIONCHAMBERELEMENT', + 1599208980: 'IFCDISTRIBUTIONCHAMBERELEMENTTYPE', + 562808652: 'IFCDISTRIBUTIONCIRCUIT', + 1062813311: 'IFCDISTRIBUTIONCONTROLELEMENT', + 2063403501: 'IFCDISTRIBUTIONCONTROLELEMENTTYPE', + 1945004755: 'IFCDISTRIBUTIONELEMENT', + 3256556792: 'IFCDISTRIBUTIONELEMENTTYPE', + 3040386961: 'IFCDISTRIBUTIONFLOWELEMENT', + 3849074793: 'IFCDISTRIBUTIONFLOWELEMENTTYPE', + 3041715199: 'IFCDISTRIBUTIONPORT', + 3205830791: 'IFCDISTRIBUTIONSYSTEM', + 1154170062: 'IFCDOCUMENTINFORMATION', + 770865208: 'IFCDOCUMENTINFORMATIONRELATIONSHIP', + 3732053477: 'IFCDOCUMENTREFERENCE', + 395920057: 'IFCDOOR', + 2963535650: 'IFCDOORLININGPROPERTIES', + 1714330368: 'IFCDOORPANELPROPERTIES', + 3242481149: 'IFCDOORSTANDARDCASE', + 526551008: 'IFCDOORSTYLE', + 2323601079: 'IFCDOORTYPE', + 445594917: 'IFCDRAUGHTINGPREDEFINEDCOLOUR', + 4006246654: 'IFCDRAUGHTINGPREDEFINEDCURVEFONT', + 342316401: 'IFCDUCTFITTING', + 869906466: 'IFCDUCTFITTINGTYPE', + 3518393246: 'IFCDUCTSEGMENT', + 3760055223: 'IFCDUCTSEGMENTTYPE', + 1360408905: 'IFCDUCTSILENCER', + 2030761528: 'IFCDUCTSILENCERTYPE', + 3900360178: 'IFCEDGE', + 476780140: 'IFCEDGECURVE', + 1472233963: 'IFCEDGELOOP', + 1904799276: 'IFCELECTRICAPPLIANCE', + 663422040: 'IFCELECTRICAPPLIANCETYPE', + 862014818: 'IFCELECTRICDISTRIBUTIONBOARD', + 2417008758: 'IFCELECTRICDISTRIBUTIONBOARDTYPE', + 3310460725: 'IFCELECTRICFLOWSTORAGEDEVICE', + 3277789161: 'IFCELECTRICFLOWSTORAGEDEVICETYPE', + 264262732: 'IFCELECTRICGENERATOR', + 1534661035: 'IFCELECTRICGENERATORTYPE', + 402227799: 'IFCELECTRICMOTOR', + 1217240411: 'IFCELECTRICMOTORTYPE', + 1003880860: 'IFCELECTRICTIMECONTROL', + 712377611: 'IFCELECTRICTIMECONTROLTYPE', + 1758889154: 'IFCELEMENT', + 4123344466: 'IFCELEMENTASSEMBLY', + 2397081782: 'IFCELEMENTASSEMBLYTYPE', + 1623761950: 'IFCELEMENTCOMPONENT', + 2590856083: 'IFCELEMENTCOMPONENTTYPE', + 1883228015: 'IFCELEMENTQUANTITY', + 339256511: 'IFCELEMENTTYPE', + 2777663545: 'IFCELEMENTARYSURFACE', + 1704287377: 'IFCELLIPSE', + 2835456948: 'IFCELLIPSEPROFILEDEF', + 1658829314: 'IFCENERGYCONVERSIONDEVICE', + 2107101300: 'IFCENERGYCONVERSIONDEVICETYPE', + 2814081492: 'IFCENGINE', + 132023988: 'IFCENGINETYPE', + 3747195512: 'IFCEVAPORATIVECOOLER', + 3174744832: 'IFCEVAPORATIVECOOLERTYPE', + 484807127: 'IFCEVAPORATOR', + 3390157468: 'IFCEVAPORATORTYPE', + 4148101412: 'IFCEVENT', + 211053100: 'IFCEVENTTIME', + 4024345920: 'IFCEVENTTYPE', + 297599258: 'IFCEXTENDEDPROPERTIES', + 4294318154: 'IFCEXTERNALINFORMATION', + 3200245327: 'IFCEXTERNALREFERENCE', + 1437805879: 'IFCEXTERNALREFERENCERELATIONSHIP', + 1209101575: 'IFCEXTERNALSPATIALELEMENT', + 2853485674: 'IFCEXTERNALSPATIALSTRUCTUREELEMENT', + 2242383968: 'IFCEXTERNALLYDEFINEDHATCHSTYLE', + 1040185647: 'IFCEXTERNALLYDEFINEDSURFACESTYLE', + 3548104201: 'IFCEXTERNALLYDEFINEDTEXTFONT', + 477187591: 'IFCEXTRUDEDAREASOLID', + 2804161546: 'IFCEXTRUDEDAREASOLIDTAPERED', + 2556980723: 'IFCFACE', + 2047409740: 'IFCFACEBASEDSURFACEMODEL', + 1809719519: 'IFCFACEBOUND', + 803316827: 'IFCFACEOUTERBOUND', + 3008276851: 'IFCFACESURFACE', + 807026263: 'IFCFACETEDBREP', + 3737207727: 'IFCFACETEDBREPWITHVOIDS', + 24185140: 'IFCFACILITY', + 1310830890: 'IFCFACILITYPART', + 4219587988: 'IFCFAILURECONNECTIONCONDITION', + 3415622556: 'IFCFAN', + 346874300: 'IFCFANTYPE', + 647756555: 'IFCFASTENER', + 2489546625: 'IFCFASTENERTYPE', + 2827207264: 'IFCFEATUREELEMENT', + 2143335405: 'IFCFEATUREELEMENTADDITION', + 1287392070: 'IFCFEATUREELEMENTSUBTRACTION', + 738692330: 'IFCFILLAREASTYLE', + 374418227: 'IFCFILLAREASTYLEHATCHING', + 315944413: 'IFCFILLAREASTYLETILES', + 819412036: 'IFCFILTER', + 1810631287: 'IFCFILTERTYPE', + 1426591983: 'IFCFIRESUPPRESSIONTERMINAL', + 4222183408: 'IFCFIRESUPPRESSIONTERMINALTYPE', + 2652556860: 'IFCFIXEDREFERENCESWEPTAREASOLID', + 2058353004: 'IFCFLOWCONTROLLER', + 3907093117: 'IFCFLOWCONTROLLERTYPE', + 4278956645: 'IFCFLOWFITTING', + 3198132628: 'IFCFLOWFITTINGTYPE', + 182646315: 'IFCFLOWINSTRUMENT', + 4037862832: 'IFCFLOWINSTRUMENTTYPE', + 2188021234: 'IFCFLOWMETER', + 3815607619: 'IFCFLOWMETERTYPE', + 3132237377: 'IFCFLOWMOVINGDEVICE', + 1482959167: 'IFCFLOWMOVINGDEVICETYPE', + 987401354: 'IFCFLOWSEGMENT', + 1834744321: 'IFCFLOWSEGMENTTYPE', + 707683696: 'IFCFLOWSTORAGEDEVICE', + 1339347760: 'IFCFLOWSTORAGEDEVICETYPE', + 2223149337: 'IFCFLOWTERMINAL', + 2297155007: 'IFCFLOWTERMINALTYPE', + 3508470533: 'IFCFLOWTREATMENTDEVICE', + 3009222698: 'IFCFLOWTREATMENTDEVICETYPE', + 900683007: 'IFCFOOTING', + 1893162501: 'IFCFOOTINGTYPE', + 263784265: 'IFCFURNISHINGELEMENT', + 4238390223: 'IFCFURNISHINGELEMENTTYPE', + 1509553395: 'IFCFURNITURE', + 1268542332: 'IFCFURNITURETYPE', + 3493046030: 'IFCGEOGRAPHICELEMENT', + 4095422895: 'IFCGEOGRAPHICELEMENTTYPE', + 987898635: 'IFCGEOMETRICCURVESET', + 3448662350: 'IFCGEOMETRICREPRESENTATIONCONTEXT', + 2453401579: 'IFCGEOMETRICREPRESENTATIONITEM', + 4142052618: 'IFCGEOMETRICREPRESENTATIONSUBCONTEXT', + 3590301190: 'IFCGEOMETRICSET', + 3009204131: 'IFCGRID', + 852622518: 'IFCGRIDAXIS', + 178086475: 'IFCGRIDPLACEMENT', + 2706460486: 'IFCGROUP', + 812098782: 'IFCHALFSPACESOLID', + 3319311131: 'IFCHEATEXCHANGER', + 1251058090: 'IFCHEATEXCHANGERTYPE', + 2068733104: 'IFCHUMIDIFIER', + 1806887404: 'IFCHUMIDIFIERTYPE', + 1484403080: 'IFCISHAPEPROFILEDEF', + 3905492369: 'IFCIMAGETEXTURE', + 3570813810: 'IFCINDEXEDCOLOURMAP', + 2571569899: 'IFCINDEXEDPOLYCURVE', + 178912537: 'IFCINDEXEDPOLYGONALFACE', + 2294589976: 'IFCINDEXEDPOLYGONALFACEWITHVOIDS', + 1437953363: 'IFCINDEXEDTEXTUREMAP', + 2133299955: 'IFCINDEXEDTRIANGLETEXTUREMAP', + 4175244083: 'IFCINTERCEPTOR', + 3946677679: 'IFCINTERCEPTORTYPE', + 3113134337: 'IFCINTERSECTIONCURVE', + 2391368822: 'IFCINVENTORY', + 3741457305: 'IFCIRREGULARTIMESERIES', + 3020489413: 'IFCIRREGULARTIMESERIESVALUE', + 2176052936: 'IFCJUNCTIONBOX', + 4288270099: 'IFCJUNCTIONBOXTYPE', + 572779678: 'IFCLSHAPEPROFILEDEF', + 3827777499: 'IFCLABORRESOURCE', + 428585644: 'IFCLABORRESOURCETYPE', + 1585845231: 'IFCLAGTIME', + 76236018: 'IFCLAMP', + 1051575348: 'IFCLAMPTYPE', + 2655187982: 'IFCLIBRARYINFORMATION', + 3452421091: 'IFCLIBRARYREFERENCE', + 4162380809: 'IFCLIGHTDISTRIBUTIONDATA', + 629592764: 'IFCLIGHTFIXTURE', + 1161773419: 'IFCLIGHTFIXTURETYPE', + 1566485204: 'IFCLIGHTINTENSITYDISTRIBUTION', + 1402838566: 'IFCLIGHTSOURCE', + 125510826: 'IFCLIGHTSOURCEAMBIENT', + 2604431987: 'IFCLIGHTSOURCEDIRECTIONAL', + 4266656042: 'IFCLIGHTSOURCEGONIOMETRIC', + 1520743889: 'IFCLIGHTSOURCEPOSITIONAL', + 3422422726: 'IFCLIGHTSOURCESPOT', + 1281925730: 'IFCLINE', + 3092502836: 'IFCLINESEGMENT2D', + 388784114: 'IFCLINEARPLACEMENT', + 1154579445: 'IFCLINEARPOSITIONINGELEMENT', + 2624227202: 'IFCLOCALPLACEMENT', + 1008929658: 'IFCLOOP', + 1425443689: 'IFCMANIFOLDSOLIDBREP', + 3057273783: 'IFCMAPCONVERSION', + 2347385850: 'IFCMAPPEDITEM', + 1838606355: 'IFCMATERIAL', + 1847130766: 'IFCMATERIALCLASSIFICATIONRELATIONSHIP', + 3708119000: 'IFCMATERIALCONSTITUENT', + 2852063980: 'IFCMATERIALCONSTITUENTSET', + 760658860: 'IFCMATERIALDEFINITION', + 2022407955: 'IFCMATERIALDEFINITIONREPRESENTATION', + 248100487: 'IFCMATERIALLAYER', + 3303938423: 'IFCMATERIALLAYERSET', + 1303795690: 'IFCMATERIALLAYERSETUSAGE', + 1847252529: 'IFCMATERIALLAYERWITHOFFSETS', + 2199411900: 'IFCMATERIALLIST', + 2235152071: 'IFCMATERIALPROFILE', + 164193824: 'IFCMATERIALPROFILESET', + 3079605661: 'IFCMATERIALPROFILESETUSAGE', + 3404854881: 'IFCMATERIALPROFILESETUSAGETAPERING', + 552965576: 'IFCMATERIALPROFILEWITHOFFSETS', + 3265635763: 'IFCMATERIALPROPERTIES', + 853536259: 'IFCMATERIALRELATIONSHIP', + 1507914824: 'IFCMATERIALUSAGEDEFINITION', + 2597039031: 'IFCMEASUREWITHUNIT', + 377706215: 'IFCMECHANICALFASTENER', + 2108223431: 'IFCMECHANICALFASTENERTYPE', + 1437502449: 'IFCMEDICALDEVICE', + 1114901282: 'IFCMEDICALDEVICETYPE', + 1073191201: 'IFCMEMBER', + 1911478936: 'IFCMEMBERSTANDARDCASE', + 3181161470: 'IFCMEMBERTYPE', + 3368373690: 'IFCMETRIC', + 2998442950: 'IFCMIRROREDPROFILEDEF', + 2706619895: 'IFCMONETARYUNIT', + 2474470126: 'IFCMOTORCONNECTION', + 977012517: 'IFCMOTORCONNECTIONTYPE', + 1918398963: 'IFCNAMEDUNIT', + 3888040117: 'IFCOBJECT', + 219451334: 'IFCOBJECTDEFINITION', + 3701648758: 'IFCOBJECTPLACEMENT', + 2251480897: 'IFCOBJECTIVE', + 4143007308: 'IFCOCCUPANT', + 590820931: 'IFCOFFSETCURVE', + 3388369263: 'IFCOFFSETCURVE2D', + 3505215534: 'IFCOFFSETCURVE3D', + 2485787929: 'IFCOFFSETCURVEBYDISTANCES', + 2665983363: 'IFCOPENSHELL', + 3588315303: 'IFCOPENINGELEMENT', + 3079942009: 'IFCOPENINGSTANDARDCASE', + 4251960020: 'IFCORGANIZATION', + 1411181986: 'IFCORGANIZATIONRELATIONSHIP', + 643959842: 'IFCORIENTATIONEXPRESSION', + 1029017970: 'IFCORIENTEDEDGE', + 144952367: 'IFCOUTERBOUNDARYCURVE', + 3694346114: 'IFCOUTLET', + 2837617999: 'IFCOUTLETTYPE', + 1207048766: 'IFCOWNERHISTORY', + 2529465313: 'IFCPARAMETERIZEDPROFILEDEF', + 2519244187: 'IFCPATH', + 1682466193: 'IFCPCURVE', + 2382730787: 'IFCPERFORMANCEHISTORY', + 3566463478: 'IFCPERMEABLECOVERINGPROPERTIES', + 3327091369: 'IFCPERMIT', + 2077209135: 'IFCPERSON', + 101040310: 'IFCPERSONANDORGANIZATION', + 3021840470: 'IFCPHYSICALCOMPLEXQUANTITY', + 2483315170: 'IFCPHYSICALQUANTITY', + 2226359599: 'IFCPHYSICALSIMPLEQUANTITY', + 1687234759: 'IFCPILE', + 1158309216: 'IFCPILETYPE', + 310824031: 'IFCPIPEFITTING', + 804291784: 'IFCPIPEFITTINGTYPE', + 3612865200: 'IFCPIPESEGMENT', + 4231323485: 'IFCPIPESEGMENTTYPE', + 597895409: 'IFCPIXELTEXTURE', + 2004835150: 'IFCPLACEMENT', + 603570806: 'IFCPLANARBOX', + 1663979128: 'IFCPLANAREXTENT', + 220341763: 'IFCPLANE', + 3171933400: 'IFCPLATE', + 1156407060: 'IFCPLATESTANDARDCASE', + 4017108033: 'IFCPLATETYPE', + 2067069095: 'IFCPOINT', + 4022376103: 'IFCPOINTONCURVE', + 1423911732: 'IFCPOINTONSURFACE', + 2924175390: 'IFCPOLYLOOP', + 2775532180: 'IFCPOLYGONALBOUNDEDHALFSPACE', + 2839578677: 'IFCPOLYGONALFACESET', + 3724593414: 'IFCPOLYLINE', + 3740093272: 'IFCPORT', + 1946335990: 'IFCPOSITIONINGELEMENT', + 3355820592: 'IFCPOSTALADDRESS', + 759155922: 'IFCPREDEFINEDCOLOUR', + 2559016684: 'IFCPREDEFINEDCURVEFONT', + 3727388367: 'IFCPREDEFINEDITEM', + 3778827333: 'IFCPREDEFINEDPROPERTIES', + 3967405729: 'IFCPREDEFINEDPROPERTYSET', + 1775413392: 'IFCPREDEFINEDTEXTFONT', + 677532197: 'IFCPRESENTATIONITEM', + 2022622350: 'IFCPRESENTATIONLAYERASSIGNMENT', + 1304840413: 'IFCPRESENTATIONLAYERWITHSTYLE', + 3119450353: 'IFCPRESENTATIONSTYLE', + 2417041796: 'IFCPRESENTATIONSTYLEASSIGNMENT', + 2744685151: 'IFCPROCEDURE', + 569719735: 'IFCPROCEDURETYPE', + 2945172077: 'IFCPROCESS', + 4208778838: 'IFCPRODUCT', + 673634403: 'IFCPRODUCTDEFINITIONSHAPE', + 2095639259: 'IFCPRODUCTREPRESENTATION', + 3958567839: 'IFCPROFILEDEF', + 2802850158: 'IFCPROFILEPROPERTIES', + 103090709: 'IFCPROJECT', + 653396225: 'IFCPROJECTLIBRARY', + 2904328755: 'IFCPROJECTORDER', + 3843373140: 'IFCPROJECTEDCRS', + 3651124850: 'IFCPROJECTIONELEMENT', + 2598011224: 'IFCPROPERTY', + 986844984: 'IFCPROPERTYABSTRACTION', + 871118103: 'IFCPROPERTYBOUNDEDVALUE', + 1680319473: 'IFCPROPERTYDEFINITION', + 148025276: 'IFCPROPERTYDEPENDENCYRELATIONSHIP', + 4166981789: 'IFCPROPERTYENUMERATEDVALUE', + 3710013099: 'IFCPROPERTYENUMERATION', + 2752243245: 'IFCPROPERTYLISTVALUE', + 941946838: 'IFCPROPERTYREFERENCEVALUE', + 1451395588: 'IFCPROPERTYSET', + 3357820518: 'IFCPROPERTYSETDEFINITION', + 492091185: 'IFCPROPERTYSETTEMPLATE', + 3650150729: 'IFCPROPERTYSINGLEVALUE', + 110355661: 'IFCPROPERTYTABLEVALUE', + 3521284610: 'IFCPROPERTYTEMPLATE', + 1482703590: 'IFCPROPERTYTEMPLATEDEFINITION', + 738039164: 'IFCPROTECTIVEDEVICE', + 2295281155: 'IFCPROTECTIVEDEVICETRIPPINGUNIT', + 655969474: 'IFCPROTECTIVEDEVICETRIPPINGUNITTYPE', + 1842657554: 'IFCPROTECTIVEDEVICETYPE', + 3219374653: 'IFCPROXY', + 90941305: 'IFCPUMP', + 2250791053: 'IFCPUMPTYPE', + 2044713172: 'IFCQUANTITYAREA', + 2093928680: 'IFCQUANTITYCOUNT', + 931644368: 'IFCQUANTITYLENGTH', + 2090586900: 'IFCQUANTITYSET', + 3252649465: 'IFCQUANTITYTIME', + 2405470396: 'IFCQUANTITYVOLUME', + 825690147: 'IFCQUANTITYWEIGHT', + 2262370178: 'IFCRAILING', + 2893384427: 'IFCRAILINGTYPE', + 3024970846: 'IFCRAMP', + 3283111854: 'IFCRAMPFLIGHT', + 2324767716: 'IFCRAMPFLIGHTTYPE', + 1469900589: 'IFCRAMPTYPE', + 1232101972: 'IFCRATIONALBSPLINECURVEWITHKNOTS', + 683857671: 'IFCRATIONALBSPLINESURFACEWITHKNOTS', + 2770003689: 'IFCRECTANGLEHOLLOWPROFILEDEF', + 3615266464: 'IFCRECTANGLEPROFILEDEF', + 2798486643: 'IFCRECTANGULARPYRAMID', + 3454111270: 'IFCRECTANGULARTRIMMEDSURFACE', + 3915482550: 'IFCRECURRENCEPATTERN', + 2433181523: 'IFCREFERENCE', + 4021432810: 'IFCREFERENT', + 3413951693: 'IFCREGULARTIMESERIES', + 1580146022: 'IFCREINFORCEMENTBARPROPERTIES', + 3765753017: 'IFCREINFORCEMENTDEFINITIONPROPERTIES', + 979691226: 'IFCREINFORCINGBAR', + 2572171363: 'IFCREINFORCINGBARTYPE', + 3027567501: 'IFCREINFORCINGELEMENT', + 964333572: 'IFCREINFORCINGELEMENTTYPE', + 2320036040: 'IFCREINFORCINGMESH', + 2310774935: 'IFCREINFORCINGMESHTYPE', + 160246688: 'IFCRELAGGREGATES', + 3939117080: 'IFCRELASSIGNS', + 1683148259: 'IFCRELASSIGNSTOACTOR', + 2495723537: 'IFCRELASSIGNSTOCONTROL', + 1307041759: 'IFCRELASSIGNSTOGROUP', + 1027710054: 'IFCRELASSIGNSTOGROUPBYFACTOR', + 4278684876: 'IFCRELASSIGNSTOPROCESS', + 2857406711: 'IFCRELASSIGNSTOPRODUCT', + 205026976: 'IFCRELASSIGNSTORESOURCE', + 1865459582: 'IFCRELASSOCIATES', + 4095574036: 'IFCRELASSOCIATESAPPROVAL', + 919958153: 'IFCRELASSOCIATESCLASSIFICATION', + 2728634034: 'IFCRELASSOCIATESCONSTRAINT', + 982818633: 'IFCRELASSOCIATESDOCUMENT', + 3840914261: 'IFCRELASSOCIATESLIBRARY', + 2655215786: 'IFCRELASSOCIATESMATERIAL', + 826625072: 'IFCRELCONNECTS', + 1204542856: 'IFCRELCONNECTSELEMENTS', + 3945020480: 'IFCRELCONNECTSPATHELEMENTS', + 4201705270: 'IFCRELCONNECTSPORTTOELEMENT', + 3190031847: 'IFCRELCONNECTSPORTS', + 2127690289: 'IFCRELCONNECTSSTRUCTURALACTIVITY', + 1638771189: 'IFCRELCONNECTSSTRUCTURALMEMBER', + 504942748: 'IFCRELCONNECTSWITHECCENTRICITY', + 3678494232: 'IFCRELCONNECTSWITHREALIZINGELEMENTS', + 3242617779: 'IFCRELCONTAINEDINSPATIALSTRUCTURE', + 886880790: 'IFCRELCOVERSBLDGELEMENTS', + 2802773753: 'IFCRELCOVERSSPACES', + 2565941209: 'IFCRELDECLARES', + 2551354335: 'IFCRELDECOMPOSES', + 693640335: 'IFCRELDEFINES', + 1462361463: 'IFCRELDEFINESBYOBJECT', + 4186316022: 'IFCRELDEFINESBYPROPERTIES', + 307848117: 'IFCRELDEFINESBYTEMPLATE', + 781010003: 'IFCRELDEFINESBYTYPE', + 3940055652: 'IFCRELFILLSELEMENT', + 279856033: 'IFCRELFLOWCONTROLELEMENTS', + 427948657: 'IFCRELINTERFERESELEMENTS', + 3268803585: 'IFCRELNESTS', + 1441486842: 'IFCRELPOSITIONS', + 750771296: 'IFCRELPROJECTSELEMENT', + 1245217292: 'IFCRELREFERENCEDINSPATIALSTRUCTURE', + 4122056220: 'IFCRELSEQUENCE', + 366585022: 'IFCRELSERVICESBUILDINGS', + 3451746338: 'IFCRELSPACEBOUNDARY', + 3523091289: 'IFCRELSPACEBOUNDARY1STLEVEL', + 1521410863: 'IFCRELSPACEBOUNDARY2NDLEVEL', + 1401173127: 'IFCRELVOIDSELEMENT', + 478536968: 'IFCRELATIONSHIP', + 816062949: 'IFCREPARAMETRISEDCOMPOSITECURVESEGMENT', + 1076942058: 'IFCREPRESENTATION', + 3377609919: 'IFCREPRESENTATIONCONTEXT', + 3008791417: 'IFCREPRESENTATIONITEM', + 1660063152: 'IFCREPRESENTATIONMAP', + 2914609552: 'IFCRESOURCE', + 2943643501: 'IFCRESOURCEAPPROVALRELATIONSHIP', + 1608871552: 'IFCRESOURCECONSTRAINTRELATIONSHIP', + 2439245199: 'IFCRESOURCELEVELRELATIONSHIP', + 1042787934: 'IFCRESOURCETIME', + 1856042241: 'IFCREVOLVEDAREASOLID', + 3243963512: 'IFCREVOLVEDAREASOLIDTAPERED', + 4158566097: 'IFCRIGHTCIRCULARCONE', + 3626867408: 'IFCRIGHTCIRCULARCYLINDER', + 2016517767: 'IFCROOF', + 2781568857: 'IFCROOFTYPE', + 2341007311: 'IFCROOT', + 2778083089: 'IFCROUNDEDRECTANGLEPROFILEDEF', + 448429030: 'IFCSIUNIT', + 3053780830: 'IFCSANITARYTERMINAL', + 1768891740: 'IFCSANITARYTERMINALTYPE', + 1054537805: 'IFCSCHEDULINGTIME', + 2157484638: 'IFCSEAMCURVE', + 2042790032: 'IFCSECTIONPROPERTIES', + 4165799628: 'IFCSECTIONREINFORCEMENTPROPERTIES', + 1862484736: 'IFCSECTIONEDSOLID', + 1290935644: 'IFCSECTIONEDSOLIDHORIZONTAL', + 1509187699: 'IFCSECTIONEDSPINE', + 4086658281: 'IFCSENSOR', + 1783015770: 'IFCSENSORTYPE', + 1329646415: 'IFCSHADINGDEVICE', + 4074543187: 'IFCSHADINGDEVICETYPE', + 867548509: 'IFCSHAPEASPECT', + 3982875396: 'IFCSHAPEMODEL', + 4240577450: 'IFCSHAPEREPRESENTATION', + 4124623270: 'IFCSHELLBASEDSURFACEMODEL', + 3692461612: 'IFCSIMPLEPROPERTY', + 3663146110: 'IFCSIMPLEPROPERTYTEMPLATE', + 4097777520: 'IFCSITE', + 1529196076: 'IFCSLAB', + 3127900445: 'IFCSLABELEMENTEDCASE', + 3027962421: 'IFCSLABSTANDARDCASE', + 2533589738: 'IFCSLABTYPE', + 2609359061: 'IFCSLIPPAGECONNECTIONCONDITION', + 3420628829: 'IFCSOLARDEVICE', + 1072016465: 'IFCSOLARDEVICETYPE', + 723233188: 'IFCSOLIDMODEL', + 3856911033: 'IFCSPACE', + 1999602285: 'IFCSPACEHEATER', + 1305183839: 'IFCSPACEHEATERTYPE', + 3812236995: 'IFCSPACETYPE', + 1412071761: 'IFCSPATIALELEMENT', + 710998568: 'IFCSPATIALELEMENTTYPE', + 2706606064: 'IFCSPATIALSTRUCTUREELEMENT', + 3893378262: 'IFCSPATIALSTRUCTUREELEMENTTYPE', + 463610769: 'IFCSPATIALZONE', + 2481509218: 'IFCSPATIALZONETYPE', + 451544542: 'IFCSPHERE', + 4015995234: 'IFCSPHERICALSURFACE', + 1404847402: 'IFCSTACKTERMINAL', + 3112655638: 'IFCSTACKTERMINALTYPE', + 331165859: 'IFCSTAIR', + 4252922144: 'IFCSTAIRFLIGHT', + 1039846685: 'IFCSTAIRFLIGHTTYPE', + 338393293: 'IFCSTAIRTYPE', + 682877961: 'IFCSTRUCTURALACTION', + 3544373492: 'IFCSTRUCTURALACTIVITY', + 2515109513: 'IFCSTRUCTURALANALYSISMODEL', + 1179482911: 'IFCSTRUCTURALCONNECTION', + 2273995522: 'IFCSTRUCTURALCONNECTIONCONDITION', + 1004757350: 'IFCSTRUCTURALCURVEACTION', + 4243806635: 'IFCSTRUCTURALCURVECONNECTION', + 214636428: 'IFCSTRUCTURALCURVEMEMBER', + 2445595289: 'IFCSTRUCTURALCURVEMEMBERVARYING', + 2757150158: 'IFCSTRUCTURALCURVEREACTION', + 3136571912: 'IFCSTRUCTURALITEM', + 1807405624: 'IFCSTRUCTURALLINEARACTION', + 2162789131: 'IFCSTRUCTURALLOAD', + 385403989: 'IFCSTRUCTURALLOADCASE', + 3478079324: 'IFCSTRUCTURALLOADCONFIGURATION', + 1252848954: 'IFCSTRUCTURALLOADGROUP', + 1595516126: 'IFCSTRUCTURALLOADLINEARFORCE', + 609421318: 'IFCSTRUCTURALLOADORRESULT', + 2668620305: 'IFCSTRUCTURALLOADPLANARFORCE', + 2473145415: 'IFCSTRUCTURALLOADSINGLEDISPLACEMENT', + 1973038258: 'IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION', + 1597423693: 'IFCSTRUCTURALLOADSINGLEFORCE', + 1190533807: 'IFCSTRUCTURALLOADSINGLEFORCEWARPING', + 2525727697: 'IFCSTRUCTURALLOADSTATIC', + 3408363356: 'IFCSTRUCTURALLOADTEMPERATURE', + 530289379: 'IFCSTRUCTURALMEMBER', + 1621171031: 'IFCSTRUCTURALPLANARACTION', + 2082059205: 'IFCSTRUCTURALPOINTACTION', + 734778138: 'IFCSTRUCTURALPOINTCONNECTION', + 1235345126: 'IFCSTRUCTURALPOINTREACTION', + 3689010777: 'IFCSTRUCTURALREACTION', + 2986769608: 'IFCSTRUCTURALRESULTGROUP', + 3657597509: 'IFCSTRUCTURALSURFACEACTION', + 1975003073: 'IFCSTRUCTURALSURFACECONNECTION', + 3979015343: 'IFCSTRUCTURALSURFACEMEMBER', + 2218152070: 'IFCSTRUCTURALSURFACEMEMBERVARYING', + 603775116: 'IFCSTRUCTURALSURFACEREACTION', + 2830218821: 'IFCSTYLEMODEL', + 3958052878: 'IFCSTYLEDITEM', + 3049322572: 'IFCSTYLEDREPRESENTATION', + 148013059: 'IFCSUBCONTRACTRESOURCE', + 4095615324: 'IFCSUBCONTRACTRESOURCETYPE', + 2233826070: 'IFCSUBEDGE', + 2513912981: 'IFCSURFACE', + 699246055: 'IFCSURFACECURVE', + 2028607225: 'IFCSURFACECURVESWEPTAREASOLID', + 3101698114: 'IFCSURFACEFEATURE', + 2809605785: 'IFCSURFACEOFLINEAREXTRUSION', + 4124788165: 'IFCSURFACEOFREVOLUTION', + 2934153892: 'IFCSURFACEREINFORCEMENTAREA', + 1300840506: 'IFCSURFACESTYLE', + 3303107099: 'IFCSURFACESTYLELIGHTING', + 1607154358: 'IFCSURFACESTYLEREFRACTION', + 1878645084: 'IFCSURFACESTYLERENDERING', + 846575682: 'IFCSURFACESTYLESHADING', + 1351298697: 'IFCSURFACESTYLEWITHTEXTURES', + 626085974: 'IFCSURFACETEXTURE', + 2247615214: 'IFCSWEPTAREASOLID', + 1260650574: 'IFCSWEPTDISKSOLID', + 1096409881: 'IFCSWEPTDISKSOLIDPOLYGONAL', + 230924584: 'IFCSWEPTSURFACE', + 1162798199: 'IFCSWITCHINGDEVICE', + 2315554128: 'IFCSWITCHINGDEVICETYPE', + 2254336722: 'IFCSYSTEM', + 413509423: 'IFCSYSTEMFURNITUREELEMENT', + 1580310250: 'IFCSYSTEMFURNITUREELEMENTTYPE', + 3071757647: 'IFCTSHAPEPROFILEDEF', + 985171141: 'IFCTABLE', + 2043862942: 'IFCTABLECOLUMN', + 531007025: 'IFCTABLEROW', + 812556717: 'IFCTANK', + 5716631: 'IFCTANKTYPE', + 3473067441: 'IFCTASK', + 1549132990: 'IFCTASKTIME', + 2771591690: 'IFCTASKTIMERECURRING', + 3206491090: 'IFCTASKTYPE', + 912023232: 'IFCTELECOMADDRESS', + 3824725483: 'IFCTENDON', + 2347447852: 'IFCTENDONANCHOR', + 3081323446: 'IFCTENDONANCHORTYPE', + 3663046924: 'IFCTENDONCONDUIT', + 2281632017: 'IFCTENDONCONDUITTYPE', + 2415094496: 'IFCTENDONTYPE', + 2387106220: 'IFCTESSELLATEDFACESET', + 901063453: 'IFCTESSELLATEDITEM', + 4282788508: 'IFCTEXTLITERAL', + 3124975700: 'IFCTEXTLITERALWITHEXTENT', + 1447204868: 'IFCTEXTSTYLE', + 1983826977: 'IFCTEXTSTYLEFONTMODEL', + 2636378356: 'IFCTEXTSTYLEFORDEFINEDFONT', + 1640371178: 'IFCTEXTSTYLETEXTMODEL', + 280115917: 'IFCTEXTURECOORDINATE', + 1742049831: 'IFCTEXTURECOORDINATEGENERATOR', + 2552916305: 'IFCTEXTUREMAP', + 1210645708: 'IFCTEXTUREVERTEX', + 3611470254: 'IFCTEXTUREVERTEXLIST', + 1199560280: 'IFCTIMEPERIOD', + 3101149627: 'IFCTIMESERIES', + 581633288: 'IFCTIMESERIESVALUE', + 1377556343: 'IFCTOPOLOGICALREPRESENTATIONITEM', + 1735638870: 'IFCTOPOLOGYREPRESENTATION', + 1935646853: 'IFCTOROIDALSURFACE', + 3825984169: 'IFCTRANSFORMER', + 1692211062: 'IFCTRANSFORMERTYPE', + 2595432518: 'IFCTRANSITIONCURVESEGMENT2D', + 1620046519: 'IFCTRANSPORTELEMENT', + 2097647324: 'IFCTRANSPORTELEMENTTYPE', + 2715220739: 'IFCTRAPEZIUMPROFILEDEF', + 2916149573: 'IFCTRIANGULATEDFACESET', + 1229763772: 'IFCTRIANGULATEDIRREGULARNETWORK', + 3593883385: 'IFCTRIMMEDCURVE', + 3026737570: 'IFCTUBEBUNDLE', + 1600972822: 'IFCTUBEBUNDLETYPE', + 1628702193: 'IFCTYPEOBJECT', + 3736923433: 'IFCTYPEPROCESS', + 2347495698: 'IFCTYPEPRODUCT', + 3698973494: 'IFCTYPERESOURCE', + 427810014: 'IFCUSHAPEPROFILEDEF', + 180925521: 'IFCUNITASSIGNMENT', + 630975310: 'IFCUNITARYCONTROLELEMENT', + 3179687236: 'IFCUNITARYCONTROLELEMENTTYPE', + 4292641817: 'IFCUNITARYEQUIPMENT', + 1911125066: 'IFCUNITARYEQUIPMENTTYPE', + 4207607924: 'IFCVALVE', + 728799441: 'IFCVALVETYPE', + 1417489154: 'IFCVECTOR', + 2799835756: 'IFCVERTEX', + 2759199220: 'IFCVERTEXLOOP', + 1907098498: 'IFCVERTEXPOINT', + 1530820697: 'IFCVIBRATIONDAMPER', + 3956297820: 'IFCVIBRATIONDAMPERTYPE', + 2391383451: 'IFCVIBRATIONISOLATOR', + 3313531582: 'IFCVIBRATIONISOLATORTYPE', + 2769231204: 'IFCVIRTUALELEMENT', + 891718957: 'IFCVIRTUALGRIDINTERSECTION', + 926996030: 'IFCVOIDINGFEATURE', + 2391406946: 'IFCWALL', + 4156078855: 'IFCWALLELEMENTEDCASE', + 3512223829: 'IFCWALLSTANDARDCASE', + 1898987631: 'IFCWALLTYPE', + 4237592921: 'IFCWASTETERMINAL', + 1133259667: 'IFCWASTETERMINALTYPE', + 3304561284: 'IFCWINDOW', + 336235671: 'IFCWINDOWLININGPROPERTIES', + 512836454: 'IFCWINDOWPANELPROPERTIES', + 486154966: 'IFCWINDOWSTANDARDCASE', + 1299126871: 'IFCWINDOWSTYLE', + 4009809668: 'IFCWINDOWTYPE', + 4088093105: 'IFCWORKCALENDAR', + 1028945134: 'IFCWORKCONTROL', + 4218914973: 'IFCWORKPLAN', + 3342526732: 'IFCWORKSCHEDULE', + 1236880293: 'IFCWORKTIME', + 2543172580: 'IFCZSHAPEPROFILEDEF', + 1033361043: 'IFCZONE', +}; + +class PropertyManager { + + constructor( state ) { + + this.state = state; + + } + + getExpressId( geometry, faceIndex ) { + + if ( ! geometry.index ) + return; + const geoIndex = geometry.index.array; + return geometry.attributes[ IdAttrName ].getX( geoIndex[ 3 * faceIndex ] ); + + } + + getItemProperties( modelID, id, recursive = false ) { + + return this.state.useJSON ? + { + ...this.state.models[ modelID ].jsonData[ id ] + } : + this.state.api.GetLine( modelID, id, recursive ); + + } + + getAllItemsOfType( modelID, type, verbose ) { + + return this.state.useJSON ? + this.getAllItemsOfTypeJSON( modelID, type, verbose ) : + this.getAllItemsOfTypeWebIfcAPI( modelID, type, verbose ); + + } + + getPropertySets( modelID, elementID, recursive = false ) { + + return this.state.useJSON ? + this.getPropertyJSON( modelID, elementID, recursive, PropsNames.psets ) : + this.getPropertyWebIfcAPI( modelID, elementID, recursive, PropsNames.psets ); + + } + + getTypeProperties( modelID, elementID, recursive = false ) { + + return this.state.useJSON ? + this.getPropertyJSON( modelID, elementID, recursive, PropsNames.type ) : + this.getPropertyWebIfcAPI( modelID, elementID, recursive, PropsNames.type ); + + } + + getMaterialsProperties( modelID, elementID, recursive = false ) { + + return this.state.useJSON ? + this.getPropertyJSON( modelID, elementID, recursive, PropsNames.materials ) : + this.getPropertyWebIfcAPI( modelID, elementID, recursive, PropsNames.materials ); + + } + + getSpatialStructure( modelID ) { + + return this.state.useJSON ? + this.getSpatialStructureJSON( modelID ) : + this.getSpatialStructureWebIfcAPI( modelID ); + + } + + getSpatialStructureJSON( modelID ) { + + const chunks = this.getSpatialTreeChunks( modelID ); + const projectID = this.getAllItemsOfTypeJSON( modelID, IFCPROJECT, false )[ 0 ]; + const project = this.newIfcProject( projectID ); + this.getSpatialNode( modelID, project, chunks ); + return { + ...project + }; + + } + + getSpatialStructureWebIfcAPI( modelID ) { + + const chunks = this.getSpatialTreeChunks( modelID ); + const projectID = this.state.api.GetLineIDsWithType( modelID, IFCPROJECT ).get( 0 ); + const project = this.newIfcProject( projectID ); + this.getSpatialNode( modelID, project, chunks ); + return project; + + } + + getAllItemsOfTypeJSON( modelID, type, verbose ) { + + const data = this.state.models[ modelID ].jsonData; + const typeName = IfcTypesMap[ type ]; + if ( ! typeName ) { + + throw new Error( `Type not found: ${type}` ); + + } + + return this.filterJSONItemsByType( data, typeName, verbose ); + + } + + filterJSONItemsByType( data, typeName, verbose ) { + + const result = []; + Object.keys( data ).forEach( key => { + + const numKey = parseInt( key ); + if ( data[ numKey ].type.toUpperCase() === typeName ) { + + result.push( verbose ? { + ...data[ numKey ] + } : numKey ); + + } + + } ); + return result; + + } + + getItemsByIDJSON( modelID, ids ) { + + const data = this.state.models[ modelID ].jsonData; + const result = []; + ids.forEach( id => result.push( { + ...data[ id ] + } ) ); + return result; + + } + + getPropertyJSON( modelID, elementID, recursive = false, propName ) { + + const resultIDs = this.getAllRelatedItemsOfTypeJSON( modelID, elementID, propName ); + const result = this.getItemsByIDJSON( modelID, resultIDs ); + if ( recursive ) { + + result.forEach( result => this.getJSONReferencesRecursively( modelID, result ) ); + + } + + return result; + + } + + getJSONReferencesRecursively( modelID, jsonObject ) { + + if ( jsonObject == undefined ) + return; + const keys = Object.keys( jsonObject ); + for ( let i = 0; i < keys.length; i ++ ) { + + const key = keys[ i ]; + this.getJSONItem( modelID, jsonObject, key ); + + } + + } + + getJSONItem( modelID, jsonObject, key ) { + + if ( Array.isArray( jsonObject[ key ] ) ) { + + return this.getMultipleJSONItems( modelID, jsonObject, key ); + + } + + if ( jsonObject[ key ] && jsonObject[ key ].type === 5 ) { + + jsonObject[ key ] = this.getItemsByIDJSON( modelID, [ jsonObject[ key ].value ] )[ 0 ]; + this.getJSONReferencesRecursively( modelID, jsonObject[ key ] ); + + } + + } + + getMultipleJSONItems( modelID, jsonObject, key ) { + + jsonObject[ key ] = jsonObject[ key ].map( ( item ) => { + + if ( item.type === 5 ) { + + item = this.getItemsByIDJSON( modelID, [ item.value ] )[ 0 ]; + this.getJSONReferencesRecursively( modelID, item ); + + } + + return item; + + } ); + + } + + getPropertyWebIfcAPI( modelID, elementID, recursive = false, propName ) { + + const propSetIds = this.getAllRelatedItemsOfTypeWebIfcAPI( modelID, elementID, propName ); + return propSetIds.map( ( id ) => this.state.api.GetLine( modelID, id, recursive ) ); + + } + + getAllItemsOfTypeWebIfcAPI( modelID, type, verbose ) { + + const items = []; + const lines = this.state.api.GetLineIDsWithType( modelID, type ); + for ( let i = 0; i < lines.size(); i ++ ) + items.push( lines.get( i ) ); + if ( verbose ) + return items.map( ( id ) => this.state.api.GetLine( modelID, id ) ); + return items; + + } + + newIfcProject( id ) { + + return { + expressID: id, + type: 'IFCPROJECT', + children: [] + }; + + } + + getSpatialTreeChunks( modelID ) { + + const treeChunks = {}; + const json = this.state.useJSON; + if ( json ) { + + this.getChunksJSON( modelID, treeChunks, PropsNames.aggregates ); + this.getChunksJSON( modelID, treeChunks, PropsNames.spatial ); + + } else { + + this.getChunksWebIfcAPI( modelID, treeChunks, PropsNames.aggregates ); + this.getChunksWebIfcAPI( modelID, treeChunks, PropsNames.spatial ); + + } + + return treeChunks; + + } + + getChunksJSON( modelID, chunks, propNames ) { + + const relation = this.getAllItemsOfTypeJSON( modelID, propNames.name, true ); + relation.forEach( rel => { + + this.saveChunk( chunks, propNames, rel ); + + } ); + + } + + getChunksWebIfcAPI( modelID, chunks, propNames ) { + + const relation = this.state.api.GetLineIDsWithType( modelID, propNames.name ); + for ( let i = 0; i < relation.size(); i ++ ) { + + const rel = this.state.api.GetLine( modelID, relation.get( i ), false ); + this.saveChunk( chunks, propNames, rel ); + + } + + } + + saveChunk( chunks, propNames, rel ) { + + const relating = rel[ propNames.relating ].value; + const related = rel[ propNames.related ].map( ( r ) => r.value ); + if ( chunks[ relating ] == undefined ) { + + chunks[ relating ] = related; + + } else { + + chunks[ relating ] = chunks[ relating ].concat( related ); + + } + + } + + getSpatialNode( modelID, node, treeChunks ) { + + this.getChildren( modelID, node, treeChunks, PropsNames.aggregates ); + this.getChildren( modelID, node, treeChunks, PropsNames.spatial ); + + } + + getChildren( modelID, node, treeChunks, propNames ) { + + const children = treeChunks[ node.expressID ]; + if ( children == undefined ) + return; + const prop = propNames.key; + node[ prop ] = children.map( ( child ) => { + + const node = this.newNode( modelID, child ); + this.getSpatialNode( modelID, node, treeChunks ); + return node; + + } ); + + } + + newNode( modelID, id ) { + + const typeName = this.getNodeType( modelID, id ); + return { + expressID: id, + type: typeName, + children: [] + }; + + } + + getNodeType( modelID, id ) { + + if ( this.state.useJSON ) + return this.state.models[ modelID ].jsonData[ id ].type; + const typeID = this.state.models[ modelID ].types[ id ]; + return IfcElements[ typeID ]; + + } + + getAllRelatedItemsOfTypeJSON( modelID, id, propNames ) { + + const lines = this.getAllItemsOfTypeJSON( modelID, propNames.name, true ); + const IDs = []; + lines.forEach( line => { + + const isRelated = this.isRelated( id, line, propNames ); + if ( isRelated ) + this.getRelated( line, propNames, IDs ); + + } ); + return IDs; + + } + + getAllRelatedItemsOfTypeWebIfcAPI( modelID, id, propNames ) { + + const lines = this.state.api.GetLineIDsWithType( modelID, propNames.name ); + const IDs = []; + for ( let i = 0; i < lines.size(); i ++ ) { + + const rel = this.state.api.GetLine( modelID, lines.get( i ) ); + const isRelated = this.isRelated( id, rel, propNames ); + if ( isRelated ) + this.getRelated( rel, propNames, IDs ); + + } + + return IDs; + + } + + getRelated( rel, propNames, IDs ) { + + const element = rel[ propNames.relating ]; + if ( ! Array.isArray( element ) ) + IDs.push( element.value ); + else + element.forEach( ( ele ) => IDs.push( ele.value ) ); + + } + + isRelated( id, rel, propNames ) { + + const relatedItems = rel[ propNames.related ]; + if ( Array.isArray( relatedItems ) ) { + + const values = relatedItems.map( ( item ) => item.value ); + return values.includes( id ); + + } + + return relatedItems.value === id; + + } + +} + +class TypeManager { + + constructor( state ) { + + this.state = state; + + } + + getAllTypes() { + + for ( const modelID in this.state.models ) { + + const types = this.state.models[ modelID ].types; + if ( Object.keys( types ).length == 0 ) + this.getAllTypesOfModel( parseInt( modelID ) ); + + } + + } + + getAllTypesOfModel( modelID ) { + + const elements = Object.keys( IfcElements ).map( ( e ) => parseInt( e ) ); + const types = this.state.models[ modelID ].types; + elements.forEach( ( type ) => { + + const lines = this.state.api.GetLineIDsWithType( modelID, type ); + for ( let i = 0; i < lines.size(); i ++ ) + types[ lines.get( i ) ] = type; + + } ); + + } + +} + +let modelIdCounter = 0; +const nullIfcManagerErrorMessage = 'IfcManager is null!'; + +class IFCModel extends Mesh { + + constructor() { + + super( ...arguments ); + this.modelID = modelIdCounter ++; + this.ifcManager = null; + this.mesh = this; + + } + + setIFCManager( manager ) { + + this.ifcManager = manager; + + } + + setWasmPath( path ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + this.ifcManager.setWasmPath( path ); + + } + + close( scene ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + this.ifcManager.close( this.modelID, scene ); + + } + + getExpressId( geometry, faceIndex ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getExpressId( geometry, faceIndex ); + + } + + getAllItemsOfType( type, verbose ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getAllItemsOfType( this.modelID, type, verbose ); + + } + + getItemProperties( id, recursive = false ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getItemProperties( this.modelID, id, recursive ); + + } + + getPropertySets( id, recursive = false ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getPropertySets( this.modelID, id, recursive ); + + } + + getTypeProperties( id, recursive = false ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getTypeProperties( this.modelID, id, recursive ); + + } + + getIfcType( id ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getIfcType( this.modelID, id ); + + } + + getSpatialStructure() { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getSpatialStructure( this.modelID ); + + } + + getSubset( material ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + return this.ifcManager.getSubset( this.modelID, material ); + + } + + removeSubset( parent, material ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + this.ifcManager.removeSubset( this.modelID, parent, material ); + + } + + createSubset( config ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + const modelConfig = { + ...config, + modelID: this.modelID + }; + return this.ifcManager.createSubset( modelConfig ); + + } + + hideItems( ids ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + this.ifcManager.hideItems( this.modelID, ids ); + + } + + hideAllItems() { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + this.ifcManager.hideAllItems( this.modelID ); + + } + + showItems( ids ) { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + this.ifcManager.showItems( this.modelID, ids ); + + } + + showAllItems() { + + if ( this.ifcManager === null ) + throw new Error( nullIfcManagerErrorMessage ); + this.ifcManager.showAllItems( this.modelID ); + + } + +} + +class BvhManager { + + initializeMeshBVH( computeBoundsTree, disposeBoundsTree, acceleratedRaycast ) { + + this.computeBoundsTree = computeBoundsTree; + this.disposeBoundsTree = disposeBoundsTree; + this.acceleratedRaycast = acceleratedRaycast; + this.setupThreeMeshBVH(); + + } + + applyThreeMeshBVH( geometry ) { + + if ( this.computeBoundsTree ) + geometry.computeBoundsTree(); + + } + + setupThreeMeshBVH() { + + if ( ! this.computeBoundsTree || ! this.disposeBoundsTree || ! this.acceleratedRaycast ) + return; + BufferGeometry.prototype.computeBoundsTree = this.computeBoundsTree; + BufferGeometry.prototype.disposeBoundsTree = this.disposeBoundsTree; + Mesh.prototype.raycast = this.acceleratedRaycast; + + } + +} + +class ItemsHider { + + constructor( state ) { + + this.modelCoordinates = {}; + this.expressIDCoordinatesMap = {}; + this.state = state; + + } + + + + processCoordinates( modelID ) { + + const attributes = this.getAttributes( modelID ); + const ids = Array.from( attributes.expressID.array ); + this.expressIDCoordinatesMap[ modelID ] = {}; + for ( let i = 0; i < ids.length; i ++ ) { + + if ( ! this.expressIDCoordinatesMap[ modelID ][ ids[ i ] ] ) { + + this.expressIDCoordinatesMap[ modelID ][ ids[ i ] ] = []; + + } + + const current = this.expressIDCoordinatesMap[ modelID ]; + current[ ids[ i ] ].push( 3 * i ); + + } + + this.initializeCoordinates( modelID ); + + } + + hideItems( modelID, ids ) { + + this.editCoordinates( modelID, ids, true ); + + } + + showItems( modelID, ids ) { + + this.editCoordinates( modelID, ids, false ); + + } + + editCoordinates( modelID, ids, hide ) { + + const current = this.expressIDCoordinatesMap[ modelID ]; + const indices = []; + ids.forEach( ( id ) => { + + if ( current[ id ] ) + indices.push( ...current[ id ] ); + + } ); + const coords = this.getCoordinates( modelID ); + const initial = this.modelCoordinates[ modelID ]; + if ( hide ) + indices.forEach( i => coords.set( [ 0, 0, 0 ], i ) ); + else + indices.forEach( i => coords.set( [ initial[ i ], initial[ i + 1 ], initial[ i + 2 ] ], i ) ); + this.getAttributes( modelID ).position.needsUpdate = true; + + } + + showAllItems( modelID ) { + + if ( this.modelCoordinates[ modelID ] ) { + + this.resetCoordinates( modelID ); + this.getAttributes( modelID ).position.needsUpdate = true; + + } + + } + + hideAllItems( modelID ) { + + this.getCoordinates( modelID ).fill( 0 ); + this.getAttributes( modelID ).position.needsUpdate = true; + + } + + initializeCoordinates( modelID ) { + + const coordinates = this.getCoordinates( modelID ); + if ( ! this.modelCoordinates[ modelID ] ) { + + this.modelCoordinates[ modelID ] = new Float32Array( coordinates ); + + } + + } + + resetCoordinates( modelID ) { + + const initial = this.modelCoordinates[ modelID ]; + this.getCoordinates( modelID ).set( initial ); + + } + + getCoordinates( modelID ) { + + return this.getAttributes( modelID ).position.array; + + } + + getAttributes( modelID ) { + + return this.state.models[ modelID ].mesh.geometry.attributes; + + } + +} + +class IFCManager { + + constructor() { + + this.state = { + models: [], + api: new IfcAPI(), + useJSON: false + }; + this.BVH = new BvhManager(); + this.parser = new IFCParser( this.state, this.BVH ); + this.subsets = new SubsetManager( this.state, this.BVH ); + this.properties = new PropertyManager( this.state ); + this.types = new TypeManager( this.state ); + this.hider = new ItemsHider( this.state ); + + } + + async parse( buffer ) { + + const mesh = await this.parser.parse( buffer ); + this.state.useJSON ? this.disposeMemory() : this.types.getAllTypes(); + this.hider.processCoordinates( mesh.modelID ); + const model = new IFCModel( mesh.geometry, mesh.material ); + model.setIFCManager( this ); + return model; + + } + + setWasmPath( path ) { + + this.state.api.SetWasmPath( path ); + + } + + applyWebIfcConfig( settings ) { + + this.state.webIfcSettings = settings; + + } + + useJSONData( useJSON = true ) { + + this.state.useJSON = useJSON; + this.disposeMemory(); + + } + + addModelJSONData( modelID, data ) { + + const model = this.state.models[ modelID ]; + if ( model ) { + + model.jsonData = data; + + } + + } + + disposeMemory() { + + this.state.api = null; + this.state.api = new IfcAPI(); + + } + + setupThreeMeshBVH( computeBoundsTree, disposeBoundsTree, acceleratedRaycast ) { + + this.BVH.initializeMeshBVH( computeBoundsTree, disposeBoundsTree, acceleratedRaycast ); + + } + + close( modelID, scene ) { + + this.state.api.CloseModel( modelID ); + if ( scene ) { + + scene.remove( this.state.models[ modelID ].mesh ); + + } + + delete this.state.models[ modelID ]; + + } + + getExpressId( geometry, faceIndex ) { + + return this.properties.getExpressId( geometry, faceIndex ); + + } + + getAllItemsOfType( modelID, type, verbose ) { + + return this.properties.getAllItemsOfType( modelID, type, verbose ); + + } + + getItemProperties( modelID, id, recursive = false ) { + + return this.properties.getItemProperties( modelID, id, recursive ); + + } + + getPropertySets( modelID, id, recursive = false ) { + + return this.properties.getPropertySets( modelID, id, recursive ); + + } + + getTypeProperties( modelID, id, recursive = false ) { + + return this.properties.getTypeProperties( modelID, id, recursive ); + + } + + getMaterialsProperties( modelID, id, recursive = false ) { + + return this.properties.getMaterialsProperties( modelID, id, recursive ); + + } + + getIfcType( modelID, id ) { + + const typeID = this.state.models[ modelID ].types[ id ]; + return IfcElements[ typeID ]; + + } + + getSpatialStructure( modelID ) { + + return this.properties.getSpatialStructure( modelID ); + + } + + getSubset( modelID, material ) { + + return this.subsets.getSubset( modelID, material ); + + } + + removeSubset( modelID, parent, material ) { + + this.subsets.removeSubset( modelID, parent, material ); + + } + + createSubset( config ) { + + return this.subsets.createSubset( config ); + + } + + hideItems( modelID, ids ) { + + this.hider.hideItems( modelID, ids ); + + } + + hideAllItems( modelID ) { + + this.hider.hideAllItems( modelID ); + + } + + showItems( modelID, ids ) { + + this.hider.showItems( modelID, ids ); + + } + + showAllItems( modelID ) { + + this.hider.showAllItems( modelID ); + + } + +} + +class IFCLoader extends Loader { + + constructor( manager ) { + + super( manager ); + this.ifcManager = new IFCManager(); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, async function ( buffer ) { + + try { + + if ( typeof buffer == 'string' ) { + + throw new Error( 'IFC files must be given as a buffer!' ); + + } + + onLoad( await scope.parse( buffer ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( buffer ) { + + return this.ifcManager.parse( buffer ); + + } + +} + +export { IFCLoader }; +//# sourceMappingURL=IFCLoader.js.map diff --git a/examples/jsm/loaders/PLYLoader.js b/examples/jsm/loaders/PLYLoader.js index 55bc46e1aea2a8..b8c36b25719b5f 100644 --- a/examples/jsm/loaders/PLYLoader.js +++ b/examples/jsm/loaders/PLYLoader.js @@ -31,12 +31,12 @@ import { * } ); * * Custom properties outside of the defaults for position, uv, normal - * and color attributes can be added using the setCustomPropertyNameMapping method. + * and color attributes can be added using the setCustomPropertyMapping method. * For example, the following maps the element properties “custom_property_a” * and “custom_property_b” to an attribute “customAttribute” with an item size of 2. * Attribute item sizes are set from the number of element properties in the property array. * - * loader.setCustomPropertyNameMapping( { + * loader.setCustomPropertyMapping( { * customAttribute: ['custom_property_a', 'custom_property_b'], * } ); * diff --git a/examples/jsm/loaders/SVGLoader.js b/examples/jsm/loaders/SVGLoader.js index c49129da081ea3..885bc0cab6b758 100644 --- a/examples/jsm/loaders/SVGLoader.js +++ b/examples/jsm/loaders/SVGLoader.js @@ -218,8 +218,6 @@ class SVGLoader extends Loader { const d = node.getAttribute( 'd' ); - if ( d === '' || d === 'none' ) return null; - // console.log( d ); const commands = d.match( /[a-df-z][^a-df-z]*/ig ); diff --git a/examples/jsm/loaders/ifc/web-ifc-api.js b/examples/jsm/loaders/ifc/web-ifc-api.js new file mode 100644 index 00000000000000..fc9f279565421a --- /dev/null +++ b/examples/jsm/loaders/ifc/web-ifc-api.js @@ -0,0 +1,47504 @@ +var __defProp = Object.defineProperty; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __require = (x) => { + if (typeof require !== "undefined") + return require(x); + throw new Error('Dynamic require of "' + x + '" is not supported'); +}; +var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; + +// (disabled):crypto +var require_crypto = __commonJS({ + "(disabled):crypto"() { + } +}); + +// dist/web-ifc.js +var require_web_ifc = __commonJS({ + "dist/web-ifc.js"(exports, module) { + var WebIFCWasm2 = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WebIFCWasm3) { + WebIFCWasm3 = WebIFCWasm3 || {}; + var Module = typeof WebIFCWasm3 !== "undefined" ? WebIFCWasm3 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = __require("path").dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = __require("fs"); + if (!nodePath) + nodePath = __require("path"); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data = read(f, "binary"); + assert(typeof data === "object"); + return data; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.slice(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function shell_read(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function readBinary2(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function readAsync2(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function xhr_onload() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var STACK_ALIGN = 16; + function alignMemory(size, factor) { + if (!factor) + factor = STACK_ALIGN; + return Math.ceil(size / factor) * factor; + } + var tempRet0 = 0; + var setTempRet0 = function(value) { + tempRet0 = value; + }; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime; + if (Module["noExitRuntime"]) + noExitRuntime = Module["noExitRuntime"]; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS = 0; + function assert(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + idx >>>= 0; + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr >>> 0] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx >>> 0, endPtr >>> 0)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++ >>> 0]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++ >>> 0] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++ >>> 0] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++ >>> 0] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + ptr >>>= 0; + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + outIdx >>>= 0; + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++ >>> 0] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++ >>> 0] = 192 | u >> 6; + heap[outIdx++ >>> 0] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++ >>> 0] = 224 | u >> 12; + heap[outIdx++ >>> 0] = 128 | u >> 6 & 63; + heap[outIdx++ >>> 0] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++ >>> 0] = 240 | u >> 18; + heap[outIdx++ >>> 0] = 128 | u >> 12 & 63; + heap[outIdx++ >>> 0] = 128 | u >> 6 & 63; + heap[outIdx++ >>> 0] = 128 | u & 63; + } + } + heap[outIdx >>> 0] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : void 0; + function UTF16ToString(ptr, maxBytesToRead) { + var endPtr = ptr; + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + while (!(idx >= maxIdx) && HEAPU16[idx >>> 0]) + ++idx; + endPtr = idx << 1; + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr >>> 0, endPtr >>> 0)); + } else { + var str = ""; + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = HEAP16[ptr + i * 2 >>> 1]; + if (codeUnit == 0) + break; + str += String.fromCharCode(codeUnit); + } + return str; + } + } + function stringToUTF16(str, outPtr, maxBytesToWrite) { + if (maxBytesToWrite === void 0) { + maxBytesToWrite = 2147483647; + } + if (maxBytesToWrite < 2) + return 0; + maxBytesToWrite -= 2; + var startPtr = outPtr; + var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + var codeUnit = str.charCodeAt(i); + HEAP16[outPtr >>> 1] = codeUnit; + outPtr += 2; + } + HEAP16[outPtr >>> 1] = 0; + return outPtr - startPtr; + } + function lengthBytesUTF16(str) { + return str.length * 2; + } + function UTF32ToString(ptr, maxBytesToRead) { + var i = 0; + var str = ""; + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[ptr + i * 4 >>> 2]; + if (utf32 == 0) + break; + ++i; + if (utf32 >= 65536) { + var ch = utf32 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } else { + str += String.fromCharCode(utf32); + } + } + return str; + } + function stringToUTF32(str, outPtr, maxBytesToWrite) { + outPtr >>>= 0; + if (maxBytesToWrite === void 0) { + maxBytesToWrite = 2147483647; + } + if (maxBytesToWrite < 4) + return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 55296 && codeUnit <= 57343) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 65536 + ((codeUnit & 1023) << 10) | trailSurrogate & 1023; + } + HEAP32[outPtr >>> 2] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) + break; + } + HEAP32[outPtr >>> 2] = 0; + return outPtr - startPtr; + } + function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 55296 && codeUnit <= 57343) + ++i; + len += 4; + } + return len; + } + function writeArrayToMemory(array, buffer2) { + HEAP8.set(array, buffer2 >>> 0); + } + function writeAsciiToMemory(str, buffer2, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer2++ >>> 0] = str.charCodeAt(i); + } + if (!dontAddNull) + HEAP8[buffer2 >>> 0] = 0; + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({ "initial": INITIAL_MEMORY / 65536, "maximum": 4294967296 / 65536 }); + } + if (wasmMemory) { + buffer = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer.byteLength; + updateGlobalBufferAndViews(buffer); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + if (!Module["noFSInit"] && !FS.init.initialized) + FS.init(); + TTY.init(); + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + FS.ignorePermissions = false; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + runtimeExited = true; + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function getUniqueRunDependency(id) { + return id; + } + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = WasmPath + "web-ifc.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary() { + try { + if (wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(wasmBinaryFile); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(); + }); + } + return Promise.resolve().then(getBinary); + } + function createWasm() { + var info = { "a": asmLibraryArg }; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["X"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var tempDouble; + var tempI64; + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func = callback.func; + if (typeof func === "number") { + if (callback.arg === void 0) { + wasmTable.get(func)(); + } else { + wasmTable.get(func)(callback.arg); + } + } else { + func(callback.arg === void 0 ? null : callback.arg); + } + } + } + function dynCallLegacy(sig, ptr, args) { + if (args && args.length) { + return Module["dynCall_" + sig].apply(null, [ptr].concat(args)); + } + return Module["dynCall_" + sig].call(null, ptr); + } + function dynCall(sig, ptr, args) { + if (sig.indexOf("j") != -1) { + return dynCallLegacy(sig, ptr, args); + } + return wasmTable.get(ptr).apply(null, args); + } + function ___assert_fail(condition, filename, line, func) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function"]); + } + function setErrNo(value) { + HEAP32[___errno_location() >>> 2] = value; + return value; + } + var PATH = { splitPath: function(filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, normalizeArray: function(parts, allowAboveRoot) { + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === ".") { + parts.splice(i, 1); + } else if (last === "..") { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift(".."); + } + } + return parts; + }, normalize: function(path) { + var isAbsolute = path.charAt(0) === "/", trailingSlash = path.slice(-1) === "/"; + path = PATH.normalizeArray(path.split("/").filter(function(p) { + return !!p; + }), !isAbsolute).join("/"); + if (!path && !isAbsolute) { + path = "."; + } + if (path && trailingSlash) { + path += "/"; + } + return (isAbsolute ? "/" : "") + path; + }, dirname: function(path) { + var result = PATH.splitPath(path), root = result[0], dir = result[1]; + if (!root && !dir) { + return "."; + } + if (dir) { + dir = dir.slice(0, dir.length - 1); + } + return root + dir; + }, basename: function(path) { + if (path === "/") + return "/"; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf("/"); + if (lastSlash === -1) + return path; + return path.slice(lastSlash + 1); + }, extname: function(path) { + return PATH.splitPath(path)[3]; + }, join: function() { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join("/")); + }, join2: function(l, r) { + return PATH.normalize(l + "/" + r); + } }; + function getRandomDevice() { + if (typeof crypto === "object" && typeof crypto["getRandomValues"] === "function") { + var randomBuffer = new Uint8Array(1); + return function() { + crypto.getRandomValues(randomBuffer); + return randomBuffer[0]; + }; + } else if (ENVIRONMENT_IS_NODE) { + try { + var crypto_module = require_crypto(); + return function() { + return crypto_module["randomBytes"](1)[0]; + }; + } catch (e) { + } + } + return function() { + abort("randomDevice"); + }; + } + var PATH_FS = { resolve: function() { + var resolvedPath = "", resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = i >= 0 ? arguments[i] : FS.cwd(); + if (typeof path !== "string") { + throw new TypeError("Arguments to path.resolve must be strings"); + } else if (!path) { + return ""; + } + resolvedPath = path + "/" + resolvedPath; + resolvedAbsolute = path.charAt(0) === "/"; + } + resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter(function(p) { + return !!p; + }), !resolvedAbsolute).join("/"); + return (resolvedAbsolute ? "/" : "") + resolvedPath || "."; + }, relative: function(from, to) { + from = PATH_FS.resolve(from).slice(1); + to = PATH_FS.resolve(to).slice(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== "") + break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== "") + break; + } + if (start > end) + return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split("/")); + var toParts = trim(to.split("/")); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push(".."); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join("/"); + } }; + var TTY = { ttys: [], init: function() { + }, shutdown: function() { + }, register: function(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops }; + FS.registerDevice(dev, TTY.stream_ops); + }, stream_ops: { open: function(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + }, close: function(stream) { + stream.tty.ops.flush(stream.tty); + }, flush: function(stream) { + stream.tty.ops.flush(stream.tty); + }, read: function(stream, buffer2, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === void 0 && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === void 0) + break; + bytesRead++; + buffer2[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, write: function(stream, buffer2, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer2[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } }, default_tty_ops: { get_char: function(tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + var BUFSIZE = 256; + var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE); + var bytesRead = 0; + try { + bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null); + } catch (e) { + if (e.toString().indexOf("EOF") != -1) + bytesRead = 0; + else + throw e; + } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString("utf-8"); + } else { + result = null; + } + } else if (typeof window != "undefined" && typeof window.prompt == "function") { + result = window.prompt("Input: "); + if (result !== null) { + result += "\n"; + } + } else if (typeof readline == "function") { + result = readline(); + if (result !== null) { + result += "\n"; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + }, put_char: function(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) + tty.output.push(val); + } + }, flush: function(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + } }, default_tty1_ops: { put_char: function(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) + tty.output.push(val); + } + }, flush: function(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + } } }; + function mmapAlloc(size) { + var alignedSize = alignMemory(size, 16384); + var ptr = _malloc(alignedSize); + while (size < alignedSize) + HEAP8[ptr + size++ >>> 0] = 0; + return ptr; + } + var MEMFS = { ops_table: null, mount: function(mount) { + return MEMFS.createNode(null, "/", 16384 | 511, 0); + }, createNode: function(parent, name2, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { dir: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink }, stream: { llseek: MEMFS.stream_ops.llseek } }, file: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: { llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, allocate: MEMFS.stream_ops.allocate, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync } }, link: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink }, stream: {} }, chrdev: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: FS.chrdev_stream_ops } }; + } + var node = FS.createNode(parent, name2, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + if (parent) { + parent.contents[name2] = node; + } + return node; + }, getFileDataAsRegularArray: function(node) { + if (node.contents && node.contents.subarray) { + var arr = []; + for (var i = 0; i < node.usedBytes; ++i) + arr.push(node.contents[i]); + return arr; + } + return node.contents; + }, getFileDataAsTypedArray: function(node) { + if (!node.contents) + return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, expandFileStorage: function(node, newCapacity) { + newCapacity >>>= 0; + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) + return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0); + if (prevCapacity != 0) + newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + return; + }, resizeFileStorage: function(node, newSize) { + newSize >>>= 0; + if (node.usedBytes == newSize) + return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + return; + } + if (!node.contents || node.contents.subarray) { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); + } + node.usedBytes = newSize; + return; + } + if (!node.contents) + node.contents = []; + if (node.contents.length > newSize) + node.contents.length = newSize; + else + while (node.contents.length < newSize) + node.contents.push(0); + node.usedBytes = newSize; + }, node_ops: { getattr: function(node) { + var attr = {}; + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, setattr: function(node, attr) { + if (attr.mode !== void 0) { + node.mode = attr.mode; + } + if (attr.timestamp !== void 0) { + node.timestamp = attr.timestamp; + } + if (attr.size !== void 0) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, lookup: function(parent, name2) { + throw FS.genericErrors[44]; + }, mknod: function(parent, name2, mode, dev) { + return MEMFS.createNode(parent, name2, mode, dev); + }, rename: function(old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + old_node.parent = new_dir; + }, unlink: function(parent, name2) { + delete parent.contents[name2]; + }, rmdir: function(parent, name2) { + var node = FS.lookupNode(parent, name2); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name2]; + }, readdir: function(node) { + var entries = [".", ".."]; + for (var key2 in node.contents) { + if (!node.contents.hasOwnProperty(key2)) { + continue; + } + entries.push(key2); + } + return entries; + }, symlink: function(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 | 40960, 0); + node.link = oldpath; + return node; + }, readlink: function(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + } }, stream_ops: { read: function(stream, buffer2, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) + return 0; + var size = Math.min(stream.node.usedBytes - position, length); + if (size > 8 && contents.subarray) { + buffer2.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) + buffer2[offset + i] = contents[position + i]; + } + return size; + }, write: function(stream, buffer2, offset, length, position, canOwn) { + if (buffer2.buffer === HEAP8.buffer) { + canOwn = false; + } + if (!length) + return 0; + var node = stream.node; + node.timestamp = Date.now(); + if (buffer2.subarray && (!node.contents || node.contents.subarray)) { + if (canOwn) { + node.contents = buffer2.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer2.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + node.contents.set(buffer2.subarray(offset, offset + length), position); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer2.subarray) { + node.contents.set(buffer2.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer2[offset + i]; + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + }, llseek: function(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + }, allocate: function(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + }, mmap: function(stream, address, length, position, prot, flags) { + assert(address === 0); + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + if (!(flags & 2) && contents.buffer === buffer) { + allocated = false; + ptr = contents.byteOffset; + } else { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + ptr >>>= 0; + HEAP8.set(contents, ptr >>> 0); + } + return { ptr, allocated }; + }, msync: function(stream, buffer2, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (mmapFlags & 2) { + return 0; + } + var bytesWritten = MEMFS.stream_ops.write(stream, buffer2, 0, length, offset, false); + return 0; + } } }; + var FS = { root: null, mounts: [], devices: {}, streams: [], nextInode: 1, nameTable: null, currentPath: "/", initialized: false, ignorePermissions: true, trackingDelegate: {}, tracking: { openFlags: { READ: 1, WRITE: 2 } }, ErrnoError: null, genericErrors: {}, filesystems: null, syncFSRequests: 0, lookupPath: function(path, opts) { + path = PATH_FS.resolve(FS.cwd(), path); + opts = opts || {}; + if (!path) + return { path: "", node: null }; + var defaults = { follow_mount: true, recurse_count: 0 }; + for (var key2 in defaults) { + if (opts[key2] === void 0) { + opts[key2] = defaults[key2]; + } + } + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = PATH.normalizeArray(path.split("/").filter(function(p) { + return !!p; + }), false); + var current = FS.root; + var current_path = "/"; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || islast && opts.follow_mount) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { path: current_path, node: current }; + }, getPath: function(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) + return mount; + return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path; + } + path = path ? node.name + "/" + path : node.name; + node = node.parent; + } + }, hashName: function(parentid, name2) { + var hash = 0; + for (var i = 0; i < name2.length; i++) { + hash = (hash << 5) - hash + name2.charCodeAt(i) | 0; + } + return (parentid + hash >>> 0) % FS.nameTable.length; + }, hashAddNode: function(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, hashRemoveNode: function(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, lookupNode: function(parent, name2) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name2); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name2) { + return node; + } + } + return FS.lookup(parent, name2); + }, createNode: function(parent, name2, mode, rdev) { + var node = new FS.FSNode(parent, name2, mode, rdev); + FS.hashAddNode(node); + return node; + }, destroyNode: function(node) { + FS.hashRemoveNode(node); + }, isRoot: function(node) { + return node === node.parent; + }, isMountpoint: function(node) { + return !!node.mounted; + }, isFile: function(mode) { + return (mode & 61440) === 32768; + }, isDir: function(mode) { + return (mode & 61440) === 16384; + }, isLink: function(mode) { + return (mode & 61440) === 40960; + }, isChrdev: function(mode) { + return (mode & 61440) === 8192; + }, isBlkdev: function(mode) { + return (mode & 61440) === 24576; + }, isFIFO: function(mode) { + return (mode & 61440) === 4096; + }, isSocket: function(mode) { + return (mode & 49152) === 49152; + }, flagModes: { "r": 0, "r+": 2, "w": 577, "w+": 578, "a": 1089, "a+": 1090 }, modeStringToFlags: function(str) { + var flags = FS.flagModes[str]; + if (typeof flags === "undefined") { + throw new Error("Unknown file open mode: " + str); + } + return flags; + }, flagsToPermissionString: function(flag) { + var perms = ["r", "w", "rw"][flag & 3]; + if (flag & 512) { + perms += "w"; + } + return perms; + }, nodePermissions: function(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + if (perms.indexOf("r") !== -1 && !(node.mode & 292)) { + return 2; + } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) { + return 2; + } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) { + return 2; + } + return 0; + }, mayLookup: function(dir) { + var errCode = FS.nodePermissions(dir, "x"); + if (errCode) + return errCode; + if (!dir.node_ops.lookup) + return 2; + return 0; + }, mayCreate: function(dir, name2) { + try { + var node = FS.lookupNode(dir, name2); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, "wx"); + }, mayDelete: function(dir, name2, isdir) { + var node; + try { + node = FS.lookupNode(dir, name2); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, "wx"); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + }, mayOpen: function(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, MAX_OPEN_FDS: 4096, nextfd: function(fd_start, fd_end) { + fd_start = fd_start || 0; + fd_end = fd_end || FS.MAX_OPEN_FDS; + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, getStream: function(fd) { + return FS.streams[fd]; + }, createStream: function(stream, fd_start, fd_end) { + if (!FS.FSStream) { + FS.FSStream = function() { + }; + FS.FSStream.prototype = { object: { get: function() { + return this.node; + }, set: function(val) { + this.node = val; + } }, isRead: { get: function() { + return (this.flags & 2097155) !== 1; + } }, isWrite: { get: function() { + return (this.flags & 2097155) !== 0; + } }, isAppend: { get: function() { + return this.flags & 1024; + } } }; + } + var newStream = new FS.FSStream(); + for (var p in stream) { + newStream[p] = stream[p]; + } + stream = newStream; + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, closeStream: function(fd) { + FS.streams[fd] = null; + }, chrdev_stream_ops: { open: function(stream) { + var device = FS.getDevice(stream.node.rdev); + stream.stream_ops = device.stream_ops; + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + }, llseek: function() { + throw new FS.ErrnoError(70); + } }, major: function(dev) { + return dev >> 8; + }, minor: function(dev) { + return dev & 255; + }, makedev: function(ma, mi) { + return ma << 8 | mi; + }, registerDevice: function(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + }, getDevice: function(dev) { + return FS.devices[dev]; + }, getMounts: function(mount) { + var mounts = []; + var check = [mount]; + while (check.length) { + var m = check.pop(); + mounts.push(m); + check.push.apply(check, m.mounts); + } + return mounts; + }, syncfs: function(populate, callback) { + if (typeof populate === "function") { + callback = populate; + populate = false; + } + FS.syncFSRequests++; + if (FS.syncFSRequests > 1) { + err("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work"); + } + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + function doCallback(errCode) { + FS.syncFSRequests--; + return callback(errCode); + } + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + } + mounts.forEach(function(mount) { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, mount: function(type, opts, mountpoint) { + var root = mountpoint === "/"; + var pseudo = !mountpoint; + var node; + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + mountpoint = lookup.path; + node = lookup.node; + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + var mount = { type, opts, mountpoint, mounts: [] }; + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + if (root) { + FS.root = mountRoot; + } else if (node) { + node.mounted = mount; + if (node.mount) { + node.mount.mounts.push(mount); + } + } + return mountRoot; + }, unmount: function(mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + Object.keys(FS.nameTable).forEach(function(hash) { + var current = FS.nameTable[hash]; + while (current) { + var next = current.name_next; + if (mounts.indexOf(current.mount) !== -1) { + FS.destroyNode(current); + } + current = next; + } + }); + node.mounted = null; + var idx = node.mount.mounts.indexOf(mount); + node.mount.mounts.splice(idx, 1); + }, lookup: function(parent, name2) { + return parent.node_ops.lookup(parent, name2); + }, mknod: function(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name2 = PATH.basename(path); + if (!name2 || name2 === "." || name2 === "..") { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name2); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name2, mode, dev); + }, create: function(path, mode) { + mode = mode !== void 0 ? mode : 438; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, mkdir: function(path, mode) { + mode = mode !== void 0 ? mode : 511; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, mkdirTree: function(path, mode) { + var dirs = path.split("/"); + var d = ""; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) + continue; + d += "/" + dirs[i]; + try { + FS.mkdir(d, mode); + } catch (e) { + if (e.errno != 20) + throw e; + } + } + }, mkdev: function(path, mode, dev) { + if (typeof dev === "undefined") { + dev = mode; + mode = 438; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + }, symlink: function(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, rename: function(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + var lookup, old_dir, new_dir; + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + if (!old_dir || !new_dir) + throw new FS.ErrnoError(44); + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + var old_node = FS.lookupNode(old_dir, old_name); + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== ".") { + throw new FS.ErrnoError(28); + } + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== ".") { + throw new FS.ErrnoError(55); + } + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (old_node === new_node) { + return; + } + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) { + throw new FS.ErrnoError(10); + } + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, "w"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + try { + if (FS.trackingDelegate["willMovePath"]) { + FS.trackingDelegate["willMovePath"](old_path, new_path); + } + } catch (e) { + err("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message); + } + FS.hashRemoveNode(old_node); + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + FS.hashAddNode(old_node); + } + try { + if (FS.trackingDelegate["onMovePath"]) + FS.trackingDelegate["onMovePath"](old_path, new_path); + } catch (e) { + err("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message); + } + }, rmdir: function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name2 = PATH.basename(path); + var node = FS.lookupNode(parent, name2); + var errCode = FS.mayDelete(parent, name2, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate["willDeletePath"]) { + FS.trackingDelegate["willDeletePath"](path); + } + } catch (e) { + err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message); + } + parent.node_ops.rmdir(parent, name2); + FS.destroyNode(node); + try { + if (FS.trackingDelegate["onDeletePath"]) + FS.trackingDelegate["onDeletePath"](path); + } catch (e) { + err("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message); + } + }, readdir: function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + }, unlink: function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name2 = PATH.basename(path); + var node = FS.lookupNode(parent, name2); + var errCode = FS.mayDelete(parent, name2, false); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate["willDeletePath"]) { + FS.trackingDelegate["willDeletePath"](path); + } + } catch (e) { + err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message); + } + parent.node_ops.unlink(parent, name2); + FS.destroyNode(node); + try { + if (FS.trackingDelegate["onDeletePath"]) + FS.trackingDelegate["onDeletePath"](path); + } catch (e) { + err("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message); + } + }, readlink: function(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + }, stat: function(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, lstat: function(path) { + return FS.stat(path, true); + }, chmod: function(path, mode, dontFollow) { + var node; + if (typeof path === "string") { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { mode: mode & 4095 | node.mode & ~4095, timestamp: Date.now() }); + }, lchmod: function(path, mode) { + FS.chmod(path, mode, true); + }, fchmod: function(fd, mode) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + }, chown: function(path, uid, gid, dontFollow) { + var node; + if (typeof path === "string") { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { timestamp: Date.now() }); + }, lchown: function(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, fchown: function(fd, uid, gid) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + }, truncate: function(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path === "string") { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, "w"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { size: len, timestamp: Date.now() }); + }, ftruncate: function(fd, len) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, utime: function(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) }); + }, open: function(path, flags, mode, fd_start, fd_end) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode === "undefined" ? 438 : mode; + if (flags & 64) { + mode = mode & 4095 | 32768; + } else { + mode = 0; + } + var node; + if (typeof path === "object") { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { follow: !(flags & 131072) }); + node = lookup.node; + } catch (e) { + } + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } else { + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + if (flags & 65536 && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + if (flags & 512) { + FS.truncate(node, 0); + } + flags &= ~(128 | 512 | 131072); + var stream = FS.createStream({ node, path: FS.getPath(node), flags, seekable: true, position: 0, stream_ops: node.stream_ops, ungotten: [], error: false }, fd_start, fd_end); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module["logReadFiles"] && !(flags & 1)) { + if (!FS.readFiles) + FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + err("FS.trackingDelegate error on read file: " + path); + } + } + try { + if (FS.trackingDelegate["onOpenFile"]) { + var trackingFlags = 0; + if ((flags & 2097155) !== 1) { + trackingFlags |= FS.tracking.openFlags.READ; + } + if ((flags & 2097155) !== 0) { + trackingFlags |= FS.tracking.openFlags.WRITE; + } + FS.trackingDelegate["onOpenFile"](path, trackingFlags); + } + } catch (e) { + err("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message); + } + return stream; + }, close: function(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) + stream.getdents = null; + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + }, isClosed: function(stream) { + return stream.fd === null; + }, llseek: function(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, read: function(stream, buffer2, offset, length, position) { + offset >>>= 0; + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position !== "undefined"; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer2, offset, length, position); + if (!seeking) + stream.position += bytesRead; + return bytesRead; + }, write: function(stream, buffer2, offset, length, position, canOwn) { + offset >>>= 0; + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + FS.llseek(stream, 0, 2); + } + var seeking = typeof position !== "undefined"; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer2, offset, length, position, canOwn); + if (!seeking) + stream.position += bytesWritten; + try { + if (stream.path && FS.trackingDelegate["onWriteToFile"]) + FS.trackingDelegate["onWriteToFile"](stream.path); + } catch (e) { + err("FS.trackingDelegate['onWriteToFile']('" + stream.path + "') threw an exception: " + e.message); + } + return bytesWritten; + }, allocate: function(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, mmap: function(stream, address, length, position, prot, flags) { + address >>>= 0; + if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, address, length, position, prot, flags); + }, msync: function(stream, buffer2, offset, length, mmapFlags) { + offset >>>= 0; + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer2, offset, length, mmapFlags); + }, munmap: function(stream) { + return 0; + }, ioctl: function(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, readFile: function(path, opts) { + opts = opts || {}; + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || "binary"; + if (opts.encoding !== "utf8" && opts.encoding !== "binary") { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === "utf8") { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === "binary") { + ret = buf; + } + FS.close(stream); + return ret; + }, writeFile: function(path, data, opts) { + opts = opts || {}; + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data === "string") { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, void 0, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, void 0, opts.canOwn); + } else { + throw new Error("Unsupported data type"); + } + FS.close(stream); + }, cwd: function() { + return FS.currentPath; + }, chdir: function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, "x"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, createDefaultDirectories: function() { + FS.mkdir("/tmp"); + FS.mkdir("/home"); + FS.mkdir("/home/web_user"); + }, createDefaultDevices: function() { + FS.mkdir("/dev"); + FS.registerDevice(FS.makedev(1, 3), { read: function() { + return 0; + }, write: function(stream, buffer2, offset, length, pos) { + return length; + } }); + FS.mkdev("/dev/null", FS.makedev(1, 3)); + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev("/dev/tty", FS.makedev(5, 0)); + FS.mkdev("/dev/tty1", FS.makedev(6, 0)); + var random_device = getRandomDevice(); + FS.createDevice("/dev", "random", random_device); + FS.createDevice("/dev", "urandom", random_device); + FS.mkdir("/dev/shm"); + FS.mkdir("/dev/shm/tmp"); + }, createSpecialDirectories: function() { + FS.mkdir("/proc"); + FS.mkdir("/proc/self"); + FS.mkdir("/proc/self/fd"); + FS.mount({ mount: function() { + var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73); + node.node_ops = { lookup: function(parent, name2) { + var fd = +name2; + var stream = FS.getStream(fd); + if (!stream) + throw new FS.ErrnoError(8); + var ret = { parent: null, mount: { mountpoint: "fake" }, node_ops: { readlink: function() { + return stream.path; + } } }; + ret.parent = ret; + return ret; + } }; + return node; + } }, {}, "/proc/self/fd"); + }, createStandardStreams: function() { + if (Module["stdin"]) { + FS.createDevice("/dev", "stdin", Module["stdin"]); + } else { + FS.symlink("/dev/tty", "/dev/stdin"); + } + if (Module["stdout"]) { + FS.createDevice("/dev", "stdout", null, Module["stdout"]); + } else { + FS.symlink("/dev/tty", "/dev/stdout"); + } + if (Module["stderr"]) { + FS.createDevice("/dev", "stderr", null, Module["stderr"]); + } else { + FS.symlink("/dev/tty1", "/dev/stderr"); + } + var stdin = FS.open("/dev/stdin", 0); + var stdout = FS.open("/dev/stdout", 1); + var stderr = FS.open("/dev/stderr", 1); + }, ensureErrnoError: function() { + if (FS.ErrnoError) + return; + FS.ErrnoError = function ErrnoError(errno, node) { + this.node = node; + this.setErrno = function(errno2) { + this.errno = errno2; + }; + this.setErrno(errno); + this.message = "FS error"; + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + [44].forEach(function(code) { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ""; + }); + }, staticInit: function() { + FS.ensureErrnoError(); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, "/"); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { "MEMFS": MEMFS }; + }, init: function(input, output, error) { + FS.init.initialized = true; + FS.ensureErrnoError(); + Module["stdin"] = input || Module["stdin"]; + Module["stdout"] = output || Module["stdout"]; + Module["stderr"] = error || Module["stderr"]; + FS.createStandardStreams(); + }, quit: function() { + FS.init.initialized = false; + var fflush = Module["_fflush"]; + if (fflush) + fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + }, getMode: function(canRead, canWrite) { + var mode = 0; + if (canRead) + mode |= 292 | 73; + if (canWrite) + mode |= 146; + return mode; + }, findObject: function(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + return null; + } + }, analyzePath: function(path, dontResolveLastLink) { + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === "/"; + } catch (e) { + ret.error = e.errno; + } + return ret; + }, createPath: function(parent, path, canRead, canWrite) { + parent = typeof parent === "string" ? parent : FS.getPath(parent); + var parts = path.split("/").reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) + continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + } + parent = current; + } + return current; + }, createFile: function(parent, name2, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name2); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + }, createDataFile: function(parent, name2, data, canRead, canWrite, canOwn) { + var path = name2 ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name2) : parent; + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data === "string") { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + }, createDevice: function(parent, name2, input, output) { + var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name2); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) + FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + FS.registerDevice(dev, { open: function(stream) { + stream.seekable = false; + }, close: function(stream) { + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, read: function(stream, buffer2, offset, length, pos) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === void 0 && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === void 0) + break; + bytesRead++; + buffer2[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, write: function(stream, buffer2, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer2[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } }); + return FS.mkdev(path, mode, dev); + }, forceLoadFile: function(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest !== "undefined") { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error("Cannot load without read() or XMLHttpRequest."); + } + }, createLazyFile: function(parent, name2, url, canRead, canWrite) { + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; + } + LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { + if (idx > this.length - 1 || idx < 0) { + return void 0; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = idx / this.chunkSize | 0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + var xhr = new XMLHttpRequest(); + xhr.open("HEAD", url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) + throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + var chunkSize = 1024 * 1024; + if (!hasByteServing) + chunkSize = datalength; + var doXHR = function(from, to) { + if (from > to) + throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength - 1) + throw new Error("only " + datalength + " bytes available! programmer error!"); + var xhr2 = new XMLHttpRequest(); + xhr2.open("GET", url, false); + if (datalength !== chunkSize) + xhr2.setRequestHeader("Range", "bytes=" + from + "-" + to); + if (typeof Uint8Array != "undefined") + xhr2.responseType = "arraybuffer"; + if (xhr2.overrideMimeType) { + xhr2.overrideMimeType("text/plain; charset=x-user-defined"); + } + xhr2.send(null); + if (!(xhr2.status >= 200 && xhr2.status < 300 || xhr2.status === 304)) + throw new Error("Couldn't load " + url + ". Status: " + xhr2.status); + if (xhr2.response !== void 0) { + return new Uint8Array(xhr2.response || []); + } else { + return intArrayFromString(xhr2.responseText || "", true); + } + }; + var lazyArray2 = this; + lazyArray2.setDataGetter(function(chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum + 1) * chunkSize - 1; + end = Math.min(end, datalength - 1); + if (typeof lazyArray2.chunks[chunkNum] === "undefined") { + lazyArray2.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray2.chunks[chunkNum] === "undefined") + throw new Error("doXHR failed!"); + return lazyArray2.chunks[chunkNum]; + }); + if (usesGzip || !datalength) { + chunkSize = datalength = 1; + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest !== "undefined") { + if (!ENVIRONMENT_IS_WORKER) + throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { length: { get: function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } }, chunkSize: { get: function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } } }); + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url }; + } + var node = FS.createFile(parent, name2, properties, canRead, canWrite); + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + Object.defineProperties(node, { usedBytes: { get: function() { + return this.contents.length; + } } }); + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(function(key2) { + var fn = node.stream_ops[key2]; + stream_ops[key2] = function forceLoadLazyFile() { + FS.forceLoadFile(node); + return fn.apply(null, arguments); + }; + }); + stream_ops.read = function stream_ops_read(stream, buffer2, offset, length, position) { + FS.forceLoadFile(node); + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + if (contents.slice) { + for (var i = 0; i < size; i++) { + buffer2[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + buffer2[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + }, createPreloadedFile: function(parent, name2, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + Browser.init(); + var fullname = name2 ? PATH_FS.resolve(PATH.join2(parent, name2)) : parent; + var dep = getUniqueRunDependency("cp " + fullname); + function processData(byteArray) { + function finish(byteArray2) { + if (preFinish) + preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name2, byteArray2, canRead, canWrite, canOwn); + } + if (onload) + onload(); + removeRunDependency(dep); + } + var handled = false; + Module["preloadPlugins"].forEach(function(plugin) { + if (handled) + return; + if (plugin["canHandle"](fullname)) { + plugin["handle"](byteArray, fullname, finish, function() { + if (onerror) + onerror(); + removeRunDependency(dep); + }); + handled = true; + } + }); + if (!handled) + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == "string") { + Browser.asyncLoad(url, function(byteArray) { + processData(byteArray); + }, onerror); + } else { + processData(url); + } + }, indexedDB: function() { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + }, DB_NAME: function() { + return "EM_FS_" + window.location.pathname; + }, DB_VERSION: 20, DB_STORE_NAME: "FILE_DATA", saveFilesToDB: function(paths, onload, onerror) { + onload = onload || function() { + }; + onerror = onerror || function() { + }; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { + out("creating db"); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite"); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) + onload(); + else + onerror(); + } + paths.forEach(function(path) { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = function putRequest_onsuccess() { + ok++; + if (ok + fail == total) + finish(); + }; + putRequest.onerror = function putRequest_onerror() { + fail++; + if (ok + fail == total) + finish(); + }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }, loadFilesFromDB: function(paths, onload, onerror) { + onload = onload || function() { + }; + onerror = onerror || function() { + }; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], "readonly"); + } catch (e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) + onload(); + else + onerror(); + } + paths.forEach(function(path) { + var getRequest = files.get(path); + getRequest.onsuccess = function getRequest_onsuccess() { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) + finish(); + }; + getRequest.onerror = function getRequest_onerror() { + fail++; + if (ok + fail == total) + finish(); + }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + } }; + var SYSCALLS = { mappings: {}, DEFAULT_POLLMASK: 5, umask: 511, calculateAt: function(dirfd, path) { + if (path[0] !== "/") { + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) + throw new FS.ErrnoError(8); + dir = dirstream.path; + } + path = PATH.join2(dir, path); + } + return path; + }, doStat: function(func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + return -54; + } + throw e; + } + HEAP32[buf >>> 2] = stat.dev; + HEAP32[buf + 4 >>> 2] = 0; + HEAP32[buf + 8 >>> 2] = stat.ino; + HEAP32[buf + 12 >>> 2] = stat.mode; + HEAP32[buf + 16 >>> 2] = stat.nlink; + HEAP32[buf + 20 >>> 2] = stat.uid; + HEAP32[buf + 24 >>> 2] = stat.gid; + HEAP32[buf + 28 >>> 2] = stat.rdev; + HEAP32[buf + 32 >>> 2] = 0; + tempI64 = [stat.size >>> 0, (tempDouble = stat.size, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 40 >>> 2] = tempI64[0], HEAP32[buf + 44 >>> 2] = tempI64[1]; + HEAP32[buf + 48 >>> 2] = 4096; + HEAP32[buf + 52 >>> 2] = stat.blocks; + HEAP32[buf + 56 >>> 2] = stat.atime.getTime() / 1e3 | 0; + HEAP32[buf + 60 >>> 2] = 0; + HEAP32[buf + 64 >>> 2] = stat.mtime.getTime() / 1e3 | 0; + HEAP32[buf + 68 >>> 2] = 0; + HEAP32[buf + 72 >>> 2] = stat.ctime.getTime() / 1e3 | 0; + HEAP32[buf + 76 >>> 2] = 0; + tempI64 = [stat.ino >>> 0, (tempDouble = stat.ino, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 80 >>> 2] = tempI64[0], HEAP32[buf + 84 >>> 2] = tempI64[1]; + return 0; + }, doMsync: function(addr, stream, len, flags, offset) { + var buffer2 = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer2, offset, len, flags); + }, doMkdir: function(path, mode) { + path = PATH.normalize(path); + if (path[path.length - 1] === "/") + path = path.slice(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + }, doMknod: function(path, mode, dev) { + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: + return -28; + } + FS.mknod(path, mode, dev); + return 0; + }, doReadlink: function(path, buf, bufsize) { + if (bufsize <= 0) + return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf + len >>> 0]; + stringToUTF8(ret, buf, bufsize + 1); + HEAP8[buf + len >>> 0] = endChar; + return len; + }, doAccess: function(path, amode) { + if (amode & ~7) { + return -28; + } + var node; + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + if (!node) { + return -44; + } + var perms = ""; + if (amode & 4) + perms += "r"; + if (amode & 2) + perms += "w"; + if (amode & 1) + perms += "x"; + if (perms && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + }, doDup: function(path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) + FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + }, doReadv: function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >>> 2]; + var len = HEAP32[iov + (i * 8 + 4) >>> 2]; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) + return -1; + ret += curr; + if (curr < len) + break; + } + return ret; + }, doWritev: function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >>> 2]; + var len = HEAP32[iov + (i * 8 + 4) >>> 2]; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) + return -1; + ret += curr; + } + return ret; + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >>> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, getStreamFromFD: function(fd) { + var stream = FS.getStream(fd); + if (!stream) + throw new FS.ErrnoError(8); + return stream; + }, get64: function(low, high) { + return low; + } }; + function ___sys_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: { + var arg = SYSCALLS.get(); + var offset = 0; + HEAP16[arg + offset >>> 1] = 2; + return 0; + } + case 13: + case 14: + return 0; + case 16: + case 8: + return -28; + case 9: + setErrNo(28); + return -1; + default: { + return -28; + } + } + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } + } + function ___sys_ioctl(fd, op, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) + return -59; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) + return -59; + return 0; + } + case 21519: { + if (!stream.tty) + return -59; + var argp = SYSCALLS.get(); + HEAP32[argp >>> 2] = 0; + return 0; + } + case 21520: { + if (!stream.tty) + return -59; + return -28; + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + if (!stream.tty) + return -59; + return 0; + } + case 21524: { + if (!stream.tty) + return -59; + return 0; + } + default: + abort("bad ioctl syscall " + op); + } + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } + } + function ___sys_open(path, flags, varargs) { + SYSCALLS.varargs = varargs; + try { + var pathname = SYSCALLS.getStr(path); + var mode = SYSCALLS.get(); + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } + } + var tupleRegistrations = {}; + function runDestructors(destructors) { + while (destructors.length) { + var ptr = destructors.pop(); + var del = destructors.pop(); + del(ptr); + } + } + function simpleReadValueFromPointer(pointer) { + return this["fromWireType"](HEAPU32[pointer >>> 2]); + } + var awaitingDependencies = {}; + var registeredTypes = {}; + var typeDependencies = {}; + var char_0 = 48; + var char_9 = 57; + function makeLegalFunctionName(name2) { + if (name2 === void 0) { + return "_unknown"; + } + name2 = name2.replace(/[^a-zA-Z0-9_]/g, "$"); + var f = name2.charCodeAt(0); + if (f >= char_0 && f <= char_9) { + return "_" + name2; + } else { + return name2; + } + } + function createNamedFunction(name2, body) { + name2 = makeLegalFunctionName(name2); + return new Function("body", "return function " + name2 + '() {\n "use strict"; return body.apply(this, arguments);\n};\n')(body); + } + function extendError(baseErrorType, errorName) { + var errorClass = createNamedFunction(errorName, function(message) { + this.name = errorName; + this.message = message; + var stack = new Error(message).stack; + if (stack !== void 0) { + this.stack = this.toString() + "\n" + stack.replace(/^Error(:[^\n]*)?\n/, ""); + } + }); + errorClass.prototype = Object.create(baseErrorType.prototype); + errorClass.prototype.constructor = errorClass; + errorClass.prototype.toString = function() { + if (this.message === void 0) { + return this.name; + } else { + return this.name + ": " + this.message; + } + }; + return errorClass; + } + var InternalError = void 0; + function throwInternalError(message) { + throw new InternalError(message); + } + function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) { + myTypes.forEach(function(type) { + typeDependencies[type] = dependentTypes; + }); + function onComplete(typeConverters2) { + var myTypeConverters = getTypeConverters(typeConverters2); + if (myTypeConverters.length !== myTypes.length) { + throwInternalError("Mismatched type converter count"); + } + for (var i = 0; i < myTypes.length; ++i) { + registerType(myTypes[i], myTypeConverters[i]); + } + } + var typeConverters = new Array(dependentTypes.length); + var unregisteredTypes = []; + var registered = 0; + dependentTypes.forEach(function(dt, i) { + if (registeredTypes.hasOwnProperty(dt)) { + typeConverters[i] = registeredTypes[dt]; + } else { + unregisteredTypes.push(dt); + if (!awaitingDependencies.hasOwnProperty(dt)) { + awaitingDependencies[dt] = []; + } + awaitingDependencies[dt].push(function() { + typeConverters[i] = registeredTypes[dt]; + ++registered; + if (registered === unregisteredTypes.length) { + onComplete(typeConverters); + } + }); + } + }); + if (unregisteredTypes.length === 0) { + onComplete(typeConverters); + } + } + function __embind_finalize_value_array(rawTupleType) { + var reg = tupleRegistrations[rawTupleType]; + delete tupleRegistrations[rawTupleType]; + var elements = reg.elements; + var elementsLength = elements.length; + var elementTypes = elements.map(function(elt) { + return elt.getterReturnType; + }).concat(elements.map(function(elt) { + return elt.setterArgumentType; + })); + var rawConstructor = reg.rawConstructor; + var rawDestructor = reg.rawDestructor; + whenDependentTypesAreResolved([rawTupleType], elementTypes, function(elementTypes2) { + elements.forEach(function(elt, i) { + var getterReturnType = elementTypes2[i]; + var getter = elt.getter; + var getterContext = elt.getterContext; + var setterArgumentType = elementTypes2[i + elementsLength]; + var setter = elt.setter; + var setterContext = elt.setterContext; + elt.read = function(ptr) { + return getterReturnType["fromWireType"](getter(getterContext, ptr)); + }; + elt.write = function(ptr, o) { + var destructors = []; + setter(setterContext, ptr, setterArgumentType["toWireType"](destructors, o)); + runDestructors(destructors); + }; + }); + return [{ name: reg.name, "fromWireType": function(ptr) { + var rv = new Array(elementsLength); + for (var i = 0; i < elementsLength; ++i) { + rv[i] = elements[i].read(ptr); + } + rawDestructor(ptr); + return rv; + }, "toWireType": function(destructors, o) { + if (elementsLength !== o.length) { + throw new TypeError("Incorrect number of tuple elements for " + reg.name + ": expected=" + elementsLength + ", actual=" + o.length); + } + var ptr = rawConstructor(); + for (var i = 0; i < elementsLength; ++i) { + elements[i].write(ptr, o[i]); + } + if (destructors !== null) { + destructors.push(rawDestructor, ptr); + } + return ptr; + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: rawDestructor }]; + }); + } + var structRegistrations = {}; + function __embind_finalize_value_object(structType) { + var reg = structRegistrations[structType]; + delete structRegistrations[structType]; + var rawConstructor = reg.rawConstructor; + var rawDestructor = reg.rawDestructor; + var fieldRecords = reg.fields; + var fieldTypes = fieldRecords.map(function(field) { + return field.getterReturnType; + }).concat(fieldRecords.map(function(field) { + return field.setterArgumentType; + })); + whenDependentTypesAreResolved([structType], fieldTypes, function(fieldTypes2) { + var fields = {}; + fieldRecords.forEach(function(field, i) { + var fieldName = field.fieldName; + var getterReturnType = fieldTypes2[i]; + var getter = field.getter; + var getterContext = field.getterContext; + var setterArgumentType = fieldTypes2[i + fieldRecords.length]; + var setter = field.setter; + var setterContext = field.setterContext; + fields[fieldName] = { read: function(ptr) { + return getterReturnType["fromWireType"](getter(getterContext, ptr)); + }, write: function(ptr, o) { + var destructors = []; + setter(setterContext, ptr, setterArgumentType["toWireType"](destructors, o)); + runDestructors(destructors); + } }; + }); + return [{ name: reg.name, "fromWireType": function(ptr) { + var rv = {}; + for (var i in fields) { + rv[i] = fields[i].read(ptr); + } + rawDestructor(ptr); + return rv; + }, "toWireType": function(destructors, o) { + for (var fieldName in fields) { + if (!(fieldName in o)) { + throw new TypeError('Missing field: "' + fieldName + '"'); + } + } + var ptr = rawConstructor(); + for (fieldName in fields) { + fields[fieldName].write(ptr, o[fieldName]); + } + if (destructors !== null) { + destructors.push(rawDestructor, ptr); + } + return ptr; + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: rawDestructor }]; + }); + } + function getShiftFromSize(size) { + switch (size) { + case 1: + return 0; + case 2: + return 1; + case 4: + return 2; + case 8: + return 3; + default: + throw new TypeError("Unknown type size: " + size); + } + } + function embind_init_charCodes() { + var codes = new Array(256); + for (var i = 0; i < 256; ++i) { + codes[i] = String.fromCharCode(i); + } + embind_charCodes = codes; + } + var embind_charCodes = void 0; + function readLatin1String(ptr) { + var ret = ""; + var c = ptr; + while (HEAPU8[c >>> 0]) { + ret += embind_charCodes[HEAPU8[c++ >>> 0]]; + } + return ret; + } + var BindingError = void 0; + function throwBindingError(message) { + throw new BindingError(message); + } + function registerType(rawType, registeredInstance, options) { + options = options || {}; + if (!("argPackAdvance" in registeredInstance)) { + throw new TypeError("registerType registeredInstance requires argPackAdvance"); + } + var name2 = registeredInstance.name; + if (!rawType) { + throwBindingError('type "' + name2 + '" must have a positive integer typeid pointer'); + } + if (registeredTypes.hasOwnProperty(rawType)) { + if (options.ignoreDuplicateRegistrations) { + return; + } else { + throwBindingError("Cannot register type '" + name2 + "' twice"); + } + } + registeredTypes[rawType] = registeredInstance; + delete typeDependencies[rawType]; + if (awaitingDependencies.hasOwnProperty(rawType)) { + var callbacks = awaitingDependencies[rawType]; + delete awaitingDependencies[rawType]; + callbacks.forEach(function(cb) { + cb(); + }); + } + } + function __embind_register_bool(rawType, name2, size, trueValue, falseValue) { + var shift = getShiftFromSize(size); + name2 = readLatin1String(name2); + registerType(rawType, { name: name2, "fromWireType": function(wt) { + return !!wt; + }, "toWireType": function(destructors, o) { + return o ? trueValue : falseValue; + }, "argPackAdvance": 8, "readValueFromPointer": function(pointer) { + var heap; + if (size === 1) { + heap = HEAP8; + } else if (size === 2) { + heap = HEAP16; + } else if (size === 4) { + heap = HEAP32; + } else { + throw new TypeError("Unknown boolean type size: " + name2); + } + return this["fromWireType"](heap[pointer >>> shift]); + }, destructorFunction: null }); + } + function ClassHandle_isAliasOf(other) { + if (!(this instanceof ClassHandle)) { + return false; + } + if (!(other instanceof ClassHandle)) { + return false; + } + var leftClass = this.$$.ptrType.registeredClass; + var left = this.$$.ptr; + var rightClass = other.$$.ptrType.registeredClass; + var right = other.$$.ptr; + while (leftClass.baseClass) { + left = leftClass.upcast(left); + leftClass = leftClass.baseClass; + } + while (rightClass.baseClass) { + right = rightClass.upcast(right); + rightClass = rightClass.baseClass; + } + return leftClass === rightClass && left === right; + } + function shallowCopyInternalPointer(o) { + return { count: o.count, deleteScheduled: o.deleteScheduled, preservePointerOnDelete: o.preservePointerOnDelete, ptr: o.ptr, ptrType: o.ptrType, smartPtr: o.smartPtr, smartPtrType: o.smartPtrType }; + } + function throwInstanceAlreadyDeleted(obj) { + function getInstanceTypeName(handle) { + return handle.$$.ptrType.registeredClass.name; + } + throwBindingError(getInstanceTypeName(obj) + " instance already deleted"); + } + var finalizationGroup = false; + function detachFinalizer(handle) { + } + function runDestructor($$) { + if ($$.smartPtr) { + $$.smartPtrType.rawDestructor($$.smartPtr); + } else { + $$.ptrType.registeredClass.rawDestructor($$.ptr); + } + } + function releaseClassHandle($$) { + $$.count.value -= 1; + var toDelete = $$.count.value === 0; + if (toDelete) { + runDestructor($$); + } + } + function attachFinalizer(handle) { + if (typeof FinalizationGroup === "undefined") { + attachFinalizer = function(handle2) { + return handle2; + }; + return handle; + } + finalizationGroup = new FinalizationGroup(function(iter) { + for (var result = iter.next(); !result.done; result = iter.next()) { + var $$ = result.value; + if (!$$.ptr) { + console.warn("object already deleted: " + $$.ptr); + } else { + releaseClassHandle($$); + } + } + }); + attachFinalizer = function(handle2) { + finalizationGroup.register(handle2, handle2.$$, handle2.$$); + return handle2; + }; + detachFinalizer = function(handle2) { + finalizationGroup.unregister(handle2.$$); + }; + return attachFinalizer(handle); + } + function ClassHandle_clone() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.preservePointerOnDelete) { + this.$$.count.value += 1; + return this; + } else { + var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { $$: { value: shallowCopyInternalPointer(this.$$) } })); + clone.$$.count.value += 1; + clone.$$.deleteScheduled = false; + return clone; + } + } + function ClassHandle_delete() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError("Object already scheduled for deletion"); + } + detachFinalizer(this); + releaseClassHandle(this.$$); + if (!this.$$.preservePointerOnDelete) { + this.$$.smartPtr = void 0; + this.$$.ptr = void 0; + } + } + function ClassHandle_isDeleted() { + return !this.$$.ptr; + } + var delayFunction = void 0; + var deletionQueue = []; + function flushPendingDeletes() { + while (deletionQueue.length) { + var obj = deletionQueue.pop(); + obj.$$.deleteScheduled = false; + obj["delete"](); + } + } + function ClassHandle_deleteLater() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError("Object already scheduled for deletion"); + } + deletionQueue.push(this); + if (deletionQueue.length === 1 && delayFunction) { + delayFunction(flushPendingDeletes); + } + this.$$.deleteScheduled = true; + return this; + } + function init_ClassHandle() { + ClassHandle.prototype["isAliasOf"] = ClassHandle_isAliasOf; + ClassHandle.prototype["clone"] = ClassHandle_clone; + ClassHandle.prototype["delete"] = ClassHandle_delete; + ClassHandle.prototype["isDeleted"] = ClassHandle_isDeleted; + ClassHandle.prototype["deleteLater"] = ClassHandle_deleteLater; + } + function ClassHandle() { + } + var registeredPointers = {}; + function ensureOverloadTable(proto, methodName, humanName) { + if (proto[methodName].overloadTable === void 0) { + var prevFunc = proto[methodName]; + proto[methodName] = function() { + if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) { + throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!"); + } + return proto[methodName].overloadTable[arguments.length].apply(this, arguments); + }; + proto[methodName].overloadTable = []; + proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; + } + } + function exposePublicSymbol(name2, value, numArguments) { + if (Module.hasOwnProperty(name2)) { + if (numArguments === void 0 || Module[name2].overloadTable !== void 0 && Module[name2].overloadTable[numArguments] !== void 0) { + throwBindingError("Cannot register public name '" + name2 + "' twice"); + } + ensureOverloadTable(Module, name2, name2); + if (Module.hasOwnProperty(numArguments)) { + throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!"); + } + Module[name2].overloadTable[numArguments] = value; + } else { + Module[name2] = value; + if (numArguments !== void 0) { + Module[name2].numArguments = numArguments; + } + } + } + function RegisteredClass(name2, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) { + this.name = name2; + this.constructor = constructor; + this.instancePrototype = instancePrototype; + this.rawDestructor = rawDestructor; + this.baseClass = baseClass; + this.getActualType = getActualType; + this.upcast = upcast; + this.downcast = downcast; + this.pureVirtualFunctions = []; + } + function upcastPointer(ptr, ptrClass, desiredClass) { + while (ptrClass !== desiredClass) { + if (!ptrClass.upcast) { + throwBindingError("Expected null or instance of " + desiredClass.name + ", got an instance of " + ptrClass.name); + } + ptr = ptrClass.upcast(ptr); + ptrClass = ptrClass.baseClass; + } + return ptr; + } + function constNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + return 0; + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; + } + function genericPointerToWireType(destructors, handle) { + var ptr; + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + if (this.isSmartPointer) { + ptr = this.rawConstructor(); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + return ptr; + } else { + return 0; + } + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + if (!this.isConst && handle.$$.ptrType.isConst) { + throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + if (this.isSmartPointer) { + if (handle.$$.smartPtr === void 0) { + throwBindingError("Passing raw pointer to smart pointer is illegal"); + } + switch (this.sharingPolicy) { + case 0: + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } else { + throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name); + } + break; + case 1: + ptr = handle.$$.smartPtr; + break; + case 2: + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } else { + var clonedHandle = handle["clone"](); + ptr = this.rawShare(ptr, __emval_register(function() { + clonedHandle["delete"](); + })); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + } + break; + default: + throwBindingError("Unsupporting sharing policy"); + } + } + return ptr; + } + function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + return 0; + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + if (handle.$$.ptrType.isConst) { + throwBindingError("Cannot convert argument of type " + handle.$$.ptrType.name + " to parameter type " + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; + } + function RegisteredPointer_getPointee(ptr) { + if (this.rawGetPointee) { + ptr = this.rawGetPointee(ptr); + } + return ptr; + } + function RegisteredPointer_destructor(ptr) { + if (this.rawDestructor) { + this.rawDestructor(ptr); + } + } + function RegisteredPointer_deleteObject(handle) { + if (handle !== null) { + handle["delete"](); + } + } + function downcastPointer(ptr, ptrClass, desiredClass) { + if (ptrClass === desiredClass) { + return ptr; + } + if (desiredClass.baseClass === void 0) { + return null; + } + var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass); + if (rv === null) { + return null; + } + return desiredClass.downcast(rv); + } + function getInheritedInstanceCount() { + return Object.keys(registeredInstances).length; + } + function getLiveInheritedInstances() { + var rv = []; + for (var k in registeredInstances) { + if (registeredInstances.hasOwnProperty(k)) { + rv.push(registeredInstances[k]); + } + } + return rv; + } + function setDelayFunction(fn) { + delayFunction = fn; + if (deletionQueue.length && delayFunction) { + delayFunction(flushPendingDeletes); + } + } + function init_embind() { + Module["getInheritedInstanceCount"] = getInheritedInstanceCount; + Module["getLiveInheritedInstances"] = getLiveInheritedInstances; + Module["flushPendingDeletes"] = flushPendingDeletes; + Module["setDelayFunction"] = setDelayFunction; + } + var registeredInstances = {}; + function getBasestPointer(class_, ptr) { + if (ptr === void 0) { + throwBindingError("ptr should not be undefined"); + } + while (class_.baseClass) { + ptr = class_.upcast(ptr); + class_ = class_.baseClass; + } + return ptr; + } + function getInheritedInstance(class_, ptr) { + ptr = getBasestPointer(class_, ptr); + return registeredInstances[ptr]; + } + function makeClassHandle(prototype, record) { + if (!record.ptrType || !record.ptr) { + throwInternalError("makeClassHandle requires ptr and ptrType"); + } + var hasSmartPtrType = !!record.smartPtrType; + var hasSmartPtr = !!record.smartPtr; + if (hasSmartPtrType !== hasSmartPtr) { + throwInternalError("Both smartPtrType and smartPtr must be specified"); + } + record.count = { value: 1 }; + return attachFinalizer(Object.create(prototype, { $$: { value: record } })); + } + function RegisteredPointer_fromWireType(ptr) { + var rawPointer = this.getPointee(ptr); + if (!rawPointer) { + this.destructor(ptr); + return null; + } + var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer); + if (registeredInstance !== void 0) { + if (registeredInstance.$$.count.value === 0) { + registeredInstance.$$.ptr = rawPointer; + registeredInstance.$$.smartPtr = ptr; + return registeredInstance["clone"](); + } else { + var rv = registeredInstance["clone"](); + this.destructor(ptr); + return rv; + } + } + function makeDefaultHandle() { + if (this.isSmartPointer) { + return makeClassHandle(this.registeredClass.instancePrototype, { ptrType: this.pointeeType, ptr: rawPointer, smartPtrType: this, smartPtr: ptr }); + } else { + return makeClassHandle(this.registeredClass.instancePrototype, { ptrType: this, ptr }); + } + } + var actualType = this.registeredClass.getActualType(rawPointer); + var registeredPointerRecord = registeredPointers[actualType]; + if (!registeredPointerRecord) { + return makeDefaultHandle.call(this); + } + var toType; + if (this.isConst) { + toType = registeredPointerRecord.constPointerType; + } else { + toType = registeredPointerRecord.pointerType; + } + var dp = downcastPointer(rawPointer, this.registeredClass, toType.registeredClass); + if (dp === null) { + return makeDefaultHandle.call(this); + } + if (this.isSmartPointer) { + return makeClassHandle(toType.registeredClass.instancePrototype, { ptrType: toType, ptr: dp, smartPtrType: this, smartPtr: ptr }); + } else { + return makeClassHandle(toType.registeredClass.instancePrototype, { ptrType: toType, ptr: dp }); + } + } + function init_RegisteredPointer() { + RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee; + RegisteredPointer.prototype.destructor = RegisteredPointer_destructor; + RegisteredPointer.prototype["argPackAdvance"] = 8; + RegisteredPointer.prototype["readValueFromPointer"] = simpleReadValueFromPointer; + RegisteredPointer.prototype["deleteObject"] = RegisteredPointer_deleteObject; + RegisteredPointer.prototype["fromWireType"] = RegisteredPointer_fromWireType; + } + function RegisteredPointer(name2, registeredClass, isReference, isConst, isSmartPointer, pointeeType, sharingPolicy, rawGetPointee, rawConstructor, rawShare, rawDestructor) { + this.name = name2; + this.registeredClass = registeredClass; + this.isReference = isReference; + this.isConst = isConst; + this.isSmartPointer = isSmartPointer; + this.pointeeType = pointeeType; + this.sharingPolicy = sharingPolicy; + this.rawGetPointee = rawGetPointee; + this.rawConstructor = rawConstructor; + this.rawShare = rawShare; + this.rawDestructor = rawDestructor; + if (!isSmartPointer && registeredClass.baseClass === void 0) { + if (isConst) { + this["toWireType"] = constNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } else { + this["toWireType"] = nonConstNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } + } else { + this["toWireType"] = genericPointerToWireType; + } + } + function replacePublicSymbol(name2, value, numArguments) { + if (!Module.hasOwnProperty(name2)) { + throwInternalError("Replacing nonexistant public symbol"); + } + if (Module[name2].overloadTable !== void 0 && numArguments !== void 0) { + Module[name2].overloadTable[numArguments] = value; + } else { + Module[name2] = value; + Module[name2].argCount = numArguments; + } + } + function getDynCaller(sig, ptr) { + assert(sig.indexOf("j") >= 0, "getDynCaller should only be called with i64 sigs"); + var argCache = []; + return function() { + argCache.length = arguments.length; + for (var i = 0; i < arguments.length; i++) { + argCache[i] = arguments[i]; + } + return dynCall(sig, ptr, argCache); + }; + } + function embind__requireFunction(signature, rawFunction) { + signature = readLatin1String(signature); + function makeDynCaller() { + if (signature.indexOf("j") != -1) { + return getDynCaller(signature, rawFunction); + } + return wasmTable.get(rawFunction); + } + var fp = makeDynCaller(); + if (typeof fp !== "function") { + throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); + } + return fp; + } + var UnboundTypeError = void 0; + function getTypeName(type) { + var ptr = ___getTypeName(type); + var rv = readLatin1String(ptr); + _free(ptr); + return rv; + } + function throwUnboundTypeError(message, types) { + var unboundTypes = []; + var seen = {}; + function visit(type) { + if (seen[type]) { + return; + } + if (registeredTypes[type]) { + return; + } + if (typeDependencies[type]) { + typeDependencies[type].forEach(visit); + return; + } + unboundTypes.push(type); + seen[type] = true; + } + types.forEach(visit); + throw new UnboundTypeError(message + ": " + unboundTypes.map(getTypeName).join([", "])); + } + function __embind_register_class(rawType, rawPointerType, rawConstPointerType, baseClassRawType, getActualTypeSignature, getActualType, upcastSignature, upcast, downcastSignature, downcast, name2, destructorSignature, rawDestructor) { + name2 = readLatin1String(name2); + getActualType = embind__requireFunction(getActualTypeSignature, getActualType); + if (upcast) { + upcast = embind__requireFunction(upcastSignature, upcast); + } + if (downcast) { + downcast = embind__requireFunction(downcastSignature, downcast); + } + rawDestructor = embind__requireFunction(destructorSignature, rawDestructor); + var legalFunctionName = makeLegalFunctionName(name2); + exposePublicSymbol(legalFunctionName, function() { + throwUnboundTypeError("Cannot construct " + name2 + " due to unbound types", [baseClassRawType]); + }); + whenDependentTypesAreResolved([rawType, rawPointerType, rawConstPointerType], baseClassRawType ? [baseClassRawType] : [], function(base) { + base = base[0]; + var baseClass; + var basePrototype; + if (baseClassRawType) { + baseClass = base.registeredClass; + basePrototype = baseClass.instancePrototype; + } else { + basePrototype = ClassHandle.prototype; + } + var constructor = createNamedFunction(legalFunctionName, function() { + if (Object.getPrototypeOf(this) !== instancePrototype) { + throw new BindingError("Use 'new' to construct " + name2); + } + if (registeredClass.constructor_body === void 0) { + throw new BindingError(name2 + " has no accessible constructor"); + } + var body = registeredClass.constructor_body[arguments.length]; + if (body === void 0) { + throw new BindingError("Tried to invoke ctor of " + name2 + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!"); + } + return body.apply(this, arguments); + }); + var instancePrototype = Object.create(basePrototype, { constructor: { value: constructor } }); + constructor.prototype = instancePrototype; + var registeredClass = new RegisteredClass(name2, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast); + var referenceConverter = new RegisteredPointer(name2, registeredClass, true, false, false); + var pointerConverter = new RegisteredPointer(name2 + "*", registeredClass, false, false, false); + var constPointerConverter = new RegisteredPointer(name2 + " const*", registeredClass, false, true, false); + registeredPointers[rawType] = { pointerType: pointerConverter, constPointerType: constPointerConverter }; + replacePublicSymbol(legalFunctionName, constructor); + return [referenceConverter, pointerConverter, constPointerConverter]; + }); + } + function heap32VectorToArray(count, firstElement) { + var array = []; + for (var i = 0; i < count; i++) { + array.push(HEAP32[(firstElement >> 2) + i >>> 0]); + } + return array; + } + function __embind_register_class_constructor(rawClassType, argCount, rawArgTypesAddr, invokerSignature, invoker, rawConstructor) { + assert(argCount > 0); + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + invoker = embind__requireFunction(invokerSignature, invoker); + var args = [rawConstructor]; + var destructors = []; + whenDependentTypesAreResolved([], [rawClassType], function(classType) { + classType = classType[0]; + var humanName = "constructor " + classType.name; + if (classType.registeredClass.constructor_body === void 0) { + classType.registeredClass.constructor_body = []; + } + if (classType.registeredClass.constructor_body[argCount - 1] !== void 0) { + throw new BindingError("Cannot register multiple constructors with identical number of parameters (" + (argCount - 1) + ") for class '" + classType.name + "'! Overload resolution is currently only performed using the parameter count, not actual type info!"); + } + classType.registeredClass.constructor_body[argCount - 1] = function unboundTypeHandler() { + throwUnboundTypeError("Cannot construct " + classType.name + " due to unbound types", rawArgTypes); + }; + whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { + classType.registeredClass.constructor_body[argCount - 1] = function constructor_body() { + if (arguments.length !== argCount - 1) { + throwBindingError(humanName + " called with " + arguments.length + " arguments, expected " + (argCount - 1)); + } + destructors.length = 0; + args.length = argCount; + for (var i = 1; i < argCount; ++i) { + args[i] = argTypes[i]["toWireType"](destructors, arguments[i - 1]); + } + var ptr = invoker.apply(null, args); + runDestructors(destructors); + return argTypes[0]["fromWireType"](ptr); + }; + return []; + }); + return []; + }); + } + function new_(constructor, argumentList) { + if (!(constructor instanceof Function)) { + throw new TypeError("new_ called with constructor type " + typeof constructor + " which is not a function"); + } + var dummy = createNamedFunction(constructor.name || "unknownFunctionName", function() { + }); + dummy.prototype = constructor.prototype; + var obj = new dummy(); + var r = constructor.apply(obj, argumentList); + return r instanceof Object ? r : obj; + } + function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) { + var argCount = argTypes.length; + if (argCount < 2) { + throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); + } + var isClassMethodFunc = argTypes[1] !== null && classType !== null; + var needsDestructorStack = false; + for (var i = 1; i < argTypes.length; ++i) { + if (argTypes[i] !== null && argTypes[i].destructorFunction === void 0) { + needsDestructorStack = true; + break; + } + } + var returns = argTypes[0].name !== "void"; + var argsList = ""; + var argsListWired = ""; + for (var i = 0; i < argCount - 2; ++i) { + argsList += (i !== 0 ? ", " : "") + "arg" + i; + argsListWired += (i !== 0 ? ", " : "") + "arg" + i + "Wired"; + } + var invokerFnBody = "return function " + makeLegalFunctionName(humanName) + "(" + argsList + ") {\nif (arguments.length !== " + (argCount - 2) + ") {\nthrowBindingError('function " + humanName + " called with ' + arguments.length + ' arguments, expected " + (argCount - 2) + " args!');\n}\n"; + if (needsDestructorStack) { + invokerFnBody += "var destructors = [];\n"; + } + var dtorStack = needsDestructorStack ? "destructors" : "null"; + var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"]; + var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]]; + if (isClassMethodFunc) { + invokerFnBody += "var thisWired = classParam.toWireType(" + dtorStack + ", this);\n"; + } + for (var i = 0; i < argCount - 2; ++i) { + invokerFnBody += "var arg" + i + "Wired = argType" + i + ".toWireType(" + dtorStack + ", arg" + i + "); // " + argTypes[i + 2].name + "\n"; + args1.push("argType" + i); + args2.push(argTypes[i + 2]); + } + if (isClassMethodFunc) { + argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired; + } + invokerFnBody += (returns ? "var rv = " : "") + "invoker(fn" + (argsListWired.length > 0 ? ", " : "") + argsListWired + ");\n"; + if (needsDestructorStack) { + invokerFnBody += "runDestructors(destructors);\n"; + } else { + for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) { + var paramName = i === 1 ? "thisWired" : "arg" + (i - 2) + "Wired"; + if (argTypes[i].destructorFunction !== null) { + invokerFnBody += paramName + "_dtor(" + paramName + "); // " + argTypes[i].name + "\n"; + args1.push(paramName + "_dtor"); + args2.push(argTypes[i].destructorFunction); + } + } + } + if (returns) { + invokerFnBody += "var ret = retType.fromWireType(rv);\nreturn ret;\n"; + } else { + } + invokerFnBody += "}\n"; + args1.push(invokerFnBody); + var invokerFunction = new_(Function, args1).apply(null, args2); + return invokerFunction; + } + function __embind_register_class_function(rawClassType, methodName, argCount, rawArgTypesAddr, invokerSignature, rawInvoker, context, isPureVirtual) { + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + methodName = readLatin1String(methodName); + rawInvoker = embind__requireFunction(invokerSignature, rawInvoker); + whenDependentTypesAreResolved([], [rawClassType], function(classType) { + classType = classType[0]; + var humanName = classType.name + "." + methodName; + if (isPureVirtual) { + classType.registeredClass.pureVirtualFunctions.push(methodName); + } + function unboundTypesHandler() { + throwUnboundTypeError("Cannot call " + humanName + " due to unbound types", rawArgTypes); + } + var proto = classType.registeredClass.instancePrototype; + var method = proto[methodName]; + if (method === void 0 || method.overloadTable === void 0 && method.className !== classType.name && method.argCount === argCount - 2) { + unboundTypesHandler.argCount = argCount - 2; + unboundTypesHandler.className = classType.name; + proto[methodName] = unboundTypesHandler; + } else { + ensureOverloadTable(proto, methodName, humanName); + proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler; + } + whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { + var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context); + if (proto[methodName].overloadTable === void 0) { + memberFunction.argCount = argCount - 2; + proto[methodName] = memberFunction; + } else { + proto[methodName].overloadTable[argCount - 2] = memberFunction; + } + return []; + }); + return []; + }); + } + var emval_free_list = []; + var emval_handle_array = [{}, { value: void 0 }, { value: null }, { value: true }, { value: false }]; + function __emval_decref(handle) { + if (handle > 4 && --emval_handle_array[handle].refcount === 0) { + emval_handle_array[handle] = void 0; + emval_free_list.push(handle); + } + } + function count_emval_handles() { + var count = 0; + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== void 0) { + ++count; + } + } + return count; + } + function get_first_emval() { + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== void 0) { + return emval_handle_array[i]; + } + } + return null; + } + function init_emval() { + Module["count_emval_handles"] = count_emval_handles; + Module["get_first_emval"] = get_first_emval; + } + function __emval_register(value) { + switch (value) { + case void 0: { + return 1; + } + case null: { + return 2; + } + case true: { + return 3; + } + case false: { + return 4; + } + default: { + var handle = emval_free_list.length ? emval_free_list.pop() : emval_handle_array.length; + emval_handle_array[handle] = { refcount: 1, value }; + return handle; + } + } + } + function __embind_register_emval(rawType, name2) { + name2 = readLatin1String(name2); + registerType(rawType, { name: name2, "fromWireType": function(handle) { + var rv = emval_handle_array[handle].value; + __emval_decref(handle); + return rv; + }, "toWireType": function(destructors, value) { + return __emval_register(value); + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: null }); + } + function _embind_repr(v) { + if (v === null) { + return "null"; + } + var t = typeof v; + if (t === "object" || t === "array" || t === "function") { + return v.toString(); + } else { + return "" + v; + } + } + function floatReadValueFromPointer(name2, shift) { + switch (shift) { + case 2: + return function(pointer) { + return this["fromWireType"](HEAPF32[pointer >>> 2]); + }; + case 3: + return function(pointer) { + return this["fromWireType"](HEAPF64[pointer >>> 3]); + }; + default: + throw new TypeError("Unknown float type: " + name2); + } + } + function __embind_register_float(rawType, name2, size) { + var shift = getShiftFromSize(size); + name2 = readLatin1String(name2); + registerType(rawType, { name: name2, "fromWireType": function(value) { + return value; + }, "toWireType": function(destructors, value) { + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + return value; + }, "argPackAdvance": 8, "readValueFromPointer": floatReadValueFromPointer(name2, shift), destructorFunction: null }); + } + function __embind_register_function(name2, argCount, rawArgTypesAddr, signature, rawInvoker, fn) { + var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + name2 = readLatin1String(name2); + rawInvoker = embind__requireFunction(signature, rawInvoker); + exposePublicSymbol(name2, function() { + throwUnboundTypeError("Cannot call " + name2 + " due to unbound types", argTypes); + }, argCount - 1); + whenDependentTypesAreResolved([], argTypes, function(argTypes2) { + var invokerArgsArray = [argTypes2[0], null].concat(argTypes2.slice(1)); + replacePublicSymbol(name2, craftInvokerFunction(name2, invokerArgsArray, null, rawInvoker, fn), argCount - 1); + return []; + }); + } + function integerReadValueFromPointer(name2, shift, signed) { + switch (shift) { + case 0: + return signed ? function readS8FromPointer(pointer) { + return HEAP8[pointer >>> 0]; + } : function readU8FromPointer(pointer) { + return HEAPU8[pointer >>> 0]; + }; + case 1: + return signed ? function readS16FromPointer(pointer) { + return HEAP16[pointer >>> 1]; + } : function readU16FromPointer(pointer) { + return HEAPU16[pointer >>> 1]; + }; + case 2: + return signed ? function readS32FromPointer(pointer) { + return HEAP32[pointer >>> 2]; + } : function readU32FromPointer(pointer) { + return HEAPU32[pointer >>> 2]; + }; + default: + throw new TypeError("Unknown integer type: " + name2); + } + } + function __embind_register_integer(primitiveType, name2, size, minRange, maxRange) { + name2 = readLatin1String(name2); + if (maxRange === -1) { + maxRange = 4294967295; + } + var shift = getShiftFromSize(size); + var fromWireType = function(value) { + return value; + }; + if (minRange === 0) { + var bitshift = 32 - 8 * size; + fromWireType = function(value) { + return value << bitshift >>> bitshift; + }; + } + var isUnsignedType = name2.indexOf("unsigned") != -1; + registerType(primitiveType, { name: name2, "fromWireType": fromWireType, "toWireType": function(destructors, value) { + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + if (value < minRange || value > maxRange) { + throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name2 + '", which is outside the valid range [' + minRange + ", " + maxRange + "]!"); + } + return isUnsignedType ? value >>> 0 : value | 0; + }, "argPackAdvance": 8, "readValueFromPointer": integerReadValueFromPointer(name2, shift, minRange !== 0), destructorFunction: null }); + } + function __embind_register_memory_view(rawType, dataTypeIndex, name2) { + var typeMapping = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array]; + var TA = typeMapping[dataTypeIndex]; + function decodeMemoryView(handle) { + handle = handle >> 2; + var heap = HEAPU32; + var size = heap[handle >>> 0]; + var data = heap[handle + 1 >>> 0]; + return new TA(buffer, data, size); + } + name2 = readLatin1String(name2); + registerType(rawType, { name: name2, "fromWireType": decodeMemoryView, "argPackAdvance": 8, "readValueFromPointer": decodeMemoryView }, { ignoreDuplicateRegistrations: true }); + } + function __embind_register_std_string(rawType, name2) { + name2 = readLatin1String(name2); + var stdStringIsUTF8 = name2 === "std::string"; + registerType(rawType, { name: name2, "fromWireType": function(value) { + var length = HEAPU32[value >>> 2]; + var str; + if (stdStringIsUTF8) { + var decodeStartPtr = value + 4; + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i; + if (i == length || HEAPU8[currentBytePtr >>> 0] == 0) { + var maxRead = currentBytePtr - decodeStartPtr; + var stringSegment = UTF8ToString(decodeStartPtr, maxRead); + if (str === void 0) { + str = stringSegment; + } else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + 1; + } + } + } else { + var a = new Array(length); + for (var i = 0; i < length; ++i) { + a[i] = String.fromCharCode(HEAPU8[value + 4 + i >>> 0]); + } + str = a.join(""); + } + _free(value); + return str; + }, "toWireType": function(destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } + var getLength; + var valueIsOfTypeString = typeof value === "string"; + if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) { + throwBindingError("Cannot pass non-string to std::string"); + } + if (stdStringIsUTF8 && valueIsOfTypeString) { + getLength = function() { + return lengthBytesUTF8(value); + }; + } else { + getLength = function() { + return value.length; + }; + } + var length = getLength(); + var ptr = _malloc(4 + length + 1); + ptr >>>= 0; + HEAPU32[ptr >>> 2] = length; + if (stdStringIsUTF8 && valueIsOfTypeString) { + stringToUTF8(value, ptr + 4, length + 1); + } else { + if (valueIsOfTypeString) { + for (var i = 0; i < length; ++i) { + var charCode = value.charCodeAt(i); + if (charCode > 255) { + _free(ptr); + throwBindingError("String has UTF-16 code units that do not fit in 8 bits"); + } + HEAPU8[ptr + 4 + i >>> 0] = charCode; + } + } else { + for (var i = 0; i < length; ++i) { + HEAPU8[ptr + 4 + i >>> 0] = value[i]; + } + } + } + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: function(ptr) { + _free(ptr); + } }); + } + function __embind_register_std_wstring(rawType, charSize, name2) { + name2 = readLatin1String(name2); + var decodeString, encodeString, getHeap, lengthBytesUTF, shift; + if (charSize === 2) { + decodeString = UTF16ToString; + encodeString = stringToUTF16; + lengthBytesUTF = lengthBytesUTF16; + getHeap = function() { + return HEAPU16; + }; + shift = 1; + } else if (charSize === 4) { + decodeString = UTF32ToString; + encodeString = stringToUTF32; + lengthBytesUTF = lengthBytesUTF32; + getHeap = function() { + return HEAPU32; + }; + shift = 2; + } + registerType(rawType, { name: name2, "fromWireType": function(value) { + var length = HEAPU32[value >>> 2]; + var HEAP = getHeap(); + var str; + var decodeStartPtr = value + 4; + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i * charSize; + if (i == length || HEAP[currentBytePtr >>> shift] == 0) { + var maxReadBytes = currentBytePtr - decodeStartPtr; + var stringSegment = decodeString(decodeStartPtr, maxReadBytes); + if (str === void 0) { + str = stringSegment; + } else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + charSize; + } + } + _free(value); + return str; + }, "toWireType": function(destructors, value) { + if (!(typeof value === "string")) { + throwBindingError("Cannot pass non-string to C++ string type " + name2); + } + var length = lengthBytesUTF(value); + var ptr = _malloc(4 + length + charSize); + ptr >>>= 0; + HEAPU32[ptr >>> 2] = length >> shift; + encodeString(value, ptr + 4, length + charSize); + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, "argPackAdvance": 8, "readValueFromPointer": simpleReadValueFromPointer, destructorFunction: function(ptr) { + _free(ptr); + } }); + } + function __embind_register_value_array(rawType, name2, constructorSignature, rawConstructor, destructorSignature, rawDestructor) { + tupleRegistrations[rawType] = { name: readLatin1String(name2), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), elements: [] }; + } + function __embind_register_value_array_element(rawTupleType, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) { + tupleRegistrations[rawTupleType].elements.push({ getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext }); + } + function __embind_register_value_object(rawType, name2, constructorSignature, rawConstructor, destructorSignature, rawDestructor) { + structRegistrations[rawType] = { name: readLatin1String(name2), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), fields: [] }; + } + function __embind_register_value_object_field(structType, fieldName, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) { + structRegistrations[structType].fields.push({ fieldName: readLatin1String(fieldName), getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext }); + } + function __embind_register_void(rawType, name2) { + name2 = readLatin1String(name2); + registerType(rawType, { isVoid: true, name: name2, "argPackAdvance": 0, "fromWireType": function() { + return void 0; + }, "toWireType": function(destructors, o) { + return void 0; + } }); + } + function requireHandle(handle) { + if (!handle) { + throwBindingError("Cannot use deleted val. handle = " + handle); + } + return emval_handle_array[handle].value; + } + function requireRegisteredType(rawType, humanName) { + var impl = registeredTypes[rawType]; + if (impl === void 0) { + throwBindingError(humanName + " has unknown type " + getTypeName(rawType)); + } + return impl; + } + function __emval_as(handle, returnType, destructorsRef) { + handle = requireHandle(handle); + returnType = requireRegisteredType(returnType, "emval::as"); + var destructors = []; + var rd = __emval_register(destructors); + HEAP32[destructorsRef >>> 2] = rd; + return returnType["toWireType"](destructors, handle); + } + function __emval_lookupTypes(argCount, argTypes) { + var a = new Array(argCount); + for (var i = 0; i < argCount; ++i) { + a[i] = requireRegisteredType(HEAP32[(argTypes >> 2) + i >>> 0], "parameter " + i); + } + return a; + } + function __emval_call(handle, argCount, argTypes, argv) { + handle = requireHandle(handle); + var types = __emval_lookupTypes(argCount, argTypes); + var args = new Array(argCount); + for (var i = 0; i < argCount; ++i) { + var type = types[i]; + args[i] = type["readValueFromPointer"](argv); + argv += type["argPackAdvance"]; + } + var rv = handle.apply(void 0, args); + return __emval_register(rv); + } + var emval_symbols = {}; + function getStringOrSymbol(address) { + var symbol = emval_symbols[address]; + if (symbol === void 0) { + return readLatin1String(address); + } else { + return symbol; + } + } + function emval_get_global() { + if (typeof globalThis === "object") { + return globalThis; + } + return function() { + return Function; + }()("return this")(); + } + function __emval_get_global(name2) { + if (name2 === 0) { + return __emval_register(emval_get_global()); + } else { + name2 = getStringOrSymbol(name2); + return __emval_register(emval_get_global()[name2]); + } + } + function __emval_get_property(handle, key2) { + handle = requireHandle(handle); + key2 = requireHandle(key2); + return __emval_register(handle[key2]); + } + function __emval_incref(handle) { + if (handle > 4) { + emval_handle_array[handle].refcount += 1; + } + } + function __emval_instanceof(object, constructor) { + object = requireHandle(object); + constructor = requireHandle(constructor); + return object instanceof constructor; + } + function __emval_is_number(handle) { + handle = requireHandle(handle); + return typeof handle === "number"; + } + function __emval_new_array() { + return __emval_register([]); + } + function __emval_new_cstring(v) { + return __emval_register(getStringOrSymbol(v)); + } + function __emval_new_object() { + return __emval_register({}); + } + function __emval_run_destructors(handle) { + var destructors = emval_handle_array[handle].value; + runDestructors(destructors); + __emval_decref(handle); + } + function __emval_set_property(handle, key2, value) { + handle = requireHandle(handle); + key2 = requireHandle(key2); + value = requireHandle(value); + handle[key2] = value; + } + function __emval_take_value(type, argv) { + type = requireRegisteredType(type, "_emval_take_value"); + var v = type["readValueFromPointer"](argv); + return __emval_register(v); + } + function _abort() { + abort(); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + var _emscripten_get_now_is_monotonic = true; + function _clock_gettime(clk_id, tp) { + var now; + if (clk_id === 0) { + now = Date.now(); + } else if ((clk_id === 1 || clk_id === 4) && _emscripten_get_now_is_monotonic) { + now = _emscripten_get_now(); + } else { + setErrNo(28); + return -1; + } + HEAP32[tp >>> 2] = now / 1e3 | 0; + HEAP32[tp + 4 >>> 2] = now % 1e3 * 1e3 * 1e3 | 0; + return 0; + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest >>> 0, src >>> 0, src + num >>> 0); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + requestedSize = requestedSize >>> 0; + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 4294967296; + if (requestedSize > maxHeapSize) { + return false; + } + var minHeapSize = 16777216; + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var ENV = {}; + function getExecutableName() { + return thisProgram || "./this.program"; + } + function getEnvStrings() { + if (!getEnvStrings.strings) { + var lang = (typeof navigator === "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8"; + var env = { "USER": "web_user", "LOGNAME": "web_user", "PATH": "/", "PWD": "/", "HOME": "/home/web_user", "LANG": lang, "_": getExecutableName() }; + for (var x in ENV) { + env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(x + "=" + env[x]); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + } + function _environ_get(__environ, environ_buf) { + try { + var bufSize = 0; + getEnvStrings().forEach(function(string, i) { + var ptr = environ_buf + bufSize; + HEAP32[__environ + i * 4 >>> 2] = ptr; + writeAsciiToMemory(string, ptr); + bufSize += string.length + 1; + }); + return 0; + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } + } + function _environ_sizes_get(penviron_count, penviron_buf_size) { + try { + var strings = getEnvStrings(); + HEAP32[penviron_count >>> 2] = strings.length; + var bufSize = 0; + strings.forEach(function(string) { + bufSize += string.length + 1; + }); + HEAP32[penviron_buf_size >>> 2] = bufSize; + return 0; + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } + } + function _fd_close(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } + } + function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doReadv(stream, iov, iovcnt); + HEAP32[pnum >>> 2] = num; + return 0; + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var HIGH_OFFSET = 4294967296; + var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); + var DOUBLE_LIMIT = 9007199254740992; + if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { + return -61; + } + FS.llseek(stream, offset, whence); + tempI64 = [stream.position >>> 0, (tempDouble = stream.position, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[newOffset >>> 2] = tempI64[0], HEAP32[newOffset + 4 >>> 2] = tempI64[1]; + if (stream.getdents && offset === 0 && whence === 0) + stream.getdents = null; + return 0; + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } + } + function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doWritev(stream, iov, iovcnt); + HEAP32[pnum >>> 2] = num; + return 0; + } catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } + } + function _setTempRet0($i) { + setTempRet0($i | 0); + } + function __isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function __arraySum(array, index) { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) { + } + return sum; + } + var __MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + var __MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function __addDays(date, days) { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = __isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; + } + function _strftime(s, maxsize, format, tm) { + var tm_zone = HEAP32[tm + 40 >>> 2]; + var date = { tm_sec: HEAP32[tm >>> 2], tm_min: HEAP32[tm + 4 >>> 2], tm_hour: HEAP32[tm + 8 >>> 2], tm_mday: HEAP32[tm + 12 >>> 2], tm_mon: HEAP32[tm + 16 >>> 2], tm_year: HEAP32[tm + 20 >>> 2], tm_wday: HEAP32[tm + 24 >>> 2], tm_yday: HEAP32[tm + 28 >>> 2], tm_isdst: HEAP32[tm + 32 >>> 2], tm_gmtoff: HEAP32[tm + 36 >>> 2], tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { "%c": "%a %b %d %H:%M:%S %Y", "%D": "%m/%d/%y", "%F": "%Y-%m-%d", "%h": "%b", "%r": "%I:%M:%S %p", "%R": "%H:%M", "%T": "%H:%M:%S", "%x": "%m/%d/%y", "%X": "%H:%M:%S", "%Ec": "%c", "%EC": "%C", "%Ex": "%m/%d/%y", "%EX": "%H:%M:%S", "%Ey": "%y", "%EY": "%Y", "%Od": "%d", "%Oe": "%e", "%OH": "%H", "%OI": "%I", "%Om": "%m", "%OM": "%M", "%OS": "%S", "%Ou": "%u", "%OU": "%U", "%OV": "%V", "%Ow": "%w", "%OW": "%W", "%Oy": "%y" }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); + } + var WEEKDAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; + var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + function leadingSomething(value, digits, character) { + var str = typeof value === "number" ? value.toString() : value || ""; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, "0"); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { + if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + case 1: + return janFourth; + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date2) { + var thisDate = __addDays(new Date(date2.tm_year + 1900, 0, 1), date2.tm_yday); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } else { + return thisDate.getFullYear(); + } + } else { + return thisDate.getFullYear() - 1; + } + } + var EXPANSION_RULES_2 = { "%a": function(date2) { + return WEEKDAYS[date2.tm_wday].substring(0, 3); + }, "%A": function(date2) { + return WEEKDAYS[date2.tm_wday]; + }, "%b": function(date2) { + return MONTHS[date2.tm_mon].substring(0, 3); + }, "%B": function(date2) { + return MONTHS[date2.tm_mon]; + }, "%C": function(date2) { + var year = date2.tm_year + 1900; + return leadingNulls(year / 100 | 0, 2); + }, "%d": function(date2) { + return leadingNulls(date2.tm_mday, 2); + }, "%e": function(date2) { + return leadingSomething(date2.tm_mday, 2, " "); + }, "%g": function(date2) { + return getWeekBasedYear(date2).toString().substring(2); + }, "%G": function(date2) { + return getWeekBasedYear(date2); + }, "%H": function(date2) { + return leadingNulls(date2.tm_hour, 2); + }, "%I": function(date2) { + var twelveHour = date2.tm_hour; + if (twelveHour == 0) + twelveHour = 12; + else if (twelveHour > 12) + twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, "%j": function(date2) { + return leadingNulls(date2.tm_mday + __arraySum(__isLeapYear(date2.tm_year + 1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date2.tm_mon - 1), 3); + }, "%m": function(date2) { + return leadingNulls(date2.tm_mon + 1, 2); + }, "%M": function(date2) { + return leadingNulls(date2.tm_min, 2); + }, "%n": function() { + return "\n"; + }, "%p": function(date2) { + if (date2.tm_hour >= 0 && date2.tm_hour < 12) { + return "AM"; + } else { + return "PM"; + } + }, "%S": function(date2) { + return leadingNulls(date2.tm_sec, 2); + }, "%t": function() { + return " "; + }, "%u": function(date2) { + return date2.tm_wday || 7; + }, "%U": function(date2) { + var janFirst = new Date(date2.tm_year + 1900, 0, 1); + var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7 - janFirst.getDay()); + var endDate = new Date(date2.tm_year + 1900, date2.tm_mon, date2.tm_mday); + if (compareByDay(firstSunday, endDate) < 0) { + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31; + var firstSundayUntilEndJanuary = 31 - firstSunday.getDate(); + var days = firstSundayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate(); + return leadingNulls(Math.ceil(days / 7), 2); + } + return compareByDay(firstSunday, janFirst) === 0 ? "01" : "00"; + }, "%V": function(date2) { + var janFourthThisYear = new Date(date2.tm_year + 1900, 0, 4); + var janFourthNextYear = new Date(date2.tm_year + 1901, 0, 4); + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + var endDate = __addDays(new Date(date2.tm_year + 1900, 0, 1), date2.tm_yday); + if (compareByDay(endDate, firstWeekStartThisYear) < 0) { + return "53"; + } + if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { + return "01"; + } + var daysDifference; + if (firstWeekStartThisYear.getFullYear() < date2.tm_year + 1900) { + daysDifference = date2.tm_yday + 32 - firstWeekStartThisYear.getDate(); + } else { + daysDifference = date2.tm_yday + 1 - firstWeekStartThisYear.getDate(); + } + return leadingNulls(Math.ceil(daysDifference / 7), 2); + }, "%w": function(date2) { + return date2.tm_wday; + }, "%W": function(date2) { + var janFirst = new Date(date2.tm_year, 0, 1); + var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1); + var endDate = new Date(date2.tm_year + 1900, date2.tm_mon, date2.tm_mday); + if (compareByDay(firstMonday, endDate) < 0) { + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31; + var firstMondayUntilEndJanuary = 31 - firstMonday.getDate(); + var days = firstMondayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate(); + return leadingNulls(Math.ceil(days / 7), 2); + } + return compareByDay(firstMonday, janFirst) === 0 ? "01" : "00"; + }, "%y": function(date2) { + return (date2.tm_year + 1900).toString().substring(2); + }, "%Y": function(date2) { + return date2.tm_year + 1900; + }, "%z": function(date2) { + var off = date2.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = off / 60 * 100 + off % 60; + return (ahead ? "+" : "-") + String("0000" + off).slice(-4); + }, "%Z": function(date2) { + return date2.tm_zone; + }, "%%": function() { + return "%"; + } }; + for (var rule in EXPANSION_RULES_2) { + if (pattern.indexOf(rule) >= 0) { + pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); + } + } + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; + } + function _strftime_l(s, maxsize, format, tm) { + return _strftime(s, maxsize, format, tm); + } + var FSNode = function(parent, name2, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name2; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + var readMode = 292 | 73; + var writeMode = 146; + Object.defineProperties(FSNode.prototype, { read: { get: function() { + return (this.mode & readMode) === readMode; + }, set: function(val) { + val ? this.mode |= readMode : this.mode &= ~readMode; + } }, write: { get: function() { + return (this.mode & writeMode) === writeMode; + }, set: function(val) { + val ? this.mode |= writeMode : this.mode &= ~writeMode; + } }, isFolder: { get: function() { + return FS.isDir(this.mode); + } }, isDevice: { get: function() { + return FS.isChrdev(this.mode); + } } }); + FS.FSNode = FSNode; + FS.staticInit(); + Module["FS_createPath"] = FS.createPath; + Module["FS_createDataFile"] = FS.createDataFile; + Module["FS_createPreloadedFile"] = FS.createPreloadedFile; + Module["FS_createLazyFile"] = FS.createLazyFile; + Module["FS_createDevice"] = FS.createDevice; + Module["FS_unlink"] = FS.unlink; + InternalError = Module["InternalError"] = extendError(Error, "InternalError"); + embind_init_charCodes(); + BindingError = Module["BindingError"] = extendError(Error, "BindingError"); + init_ClassHandle(); + init_RegisteredPointer(); + init_embind(); + UnboundTypeError = Module["UnboundTypeError"] = extendError(Error, "UnboundTypeError"); + init_emval(); + function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) + u8array.length = numBytesWritten; + return u8array; + } + __ATINIT__.push({ func: function() { + ___wasm_call_ctors(); + } }); + var asmLibraryArg = { "x": ___assert_fail, "A": ___sys_fcntl64, "P": ___sys_ioctl, "Q": ___sys_open, "U": __embind_finalize_value_array, "s": __embind_finalize_value_object, "S": __embind_register_bool, "v": __embind_register_class, "u": __embind_register_class_constructor, "d": __embind_register_class_function, "R": __embind_register_emval, "C": __embind_register_float, "h": __embind_register_function, "m": __embind_register_integer, "k": __embind_register_memory_view, "D": __embind_register_std_string, "w": __embind_register_std_wstring, "V": __embind_register_value_array, "g": __embind_register_value_array_element, "t": __embind_register_value_object, "j": __embind_register_value_object_field, "T": __embind_register_void, "q": __emval_as, "W": __emval_call, "b": __emval_decref, "F": __emval_get_global, "n": __emval_get_property, "l": __emval_incref, "N": __emval_instanceof, "E": __emval_is_number, "y": __emval_new_array, "f": __emval_new_cstring, "r": __emval_new_object, "p": __emval_run_destructors, "i": __emval_set_property, "e": __emval_take_value, "c": _abort, "M": _clock_gettime, "I": _emscripten_memcpy_big, "o": _emscripten_resize_heap, "K": _environ_get, "L": _environ_sizes_get, "B": _fd_close, "O": _fd_read, "G": _fd_seek, "z": _fd_write, "a": wasmMemory, "H": _setTempRet0, "J": _strftime_l }; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _main = Module["_main"] = function() { + return (_main = Module["_main"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["_"]).apply(null, arguments); + }; + var ___getTypeName = Module["___getTypeName"] = function() { + return (___getTypeName = Module["___getTypeName"] = Module["asm"]["$"]).apply(null, arguments); + }; + var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = function() { + return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var dynCall_jiji = Module["dynCall_jiji"] = function() { + return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["da"]).apply(null, arguments); + }; + var dynCall_viijii = Module["dynCall_viijii"] = function() { + return (dynCall_viijii = Module["dynCall_viijii"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = function() { + return (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var dynCall_iiiiij = Module["dynCall_iiiiij"] = function() { + return (dynCall_iiiiij = Module["dynCall_iiiiij"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = function() { + return (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = Module["asm"]["ha"]).apply(null, arguments); + }; + Module["addRunDependency"] = addRunDependency; + Module["removeRunDependency"] = removeRunDependency; + Module["FS_createPath"] = FS.createPath; + Module["FS_createDataFile"] = FS.createDataFile; + Module["FS_createPreloadedFile"] = FS.createPreloadedFile; + Module["FS_createLazyFile"] = FS.createLazyFile; + Module["FS_createDevice"] = FS.createDevice; + Module["FS_unlink"] = FS.unlink; + Module["FS"] = FS; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + var calledMain = false; + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function callMain(args) { + var entryFunction = Module["_main"]; + var argc = 0; + var argv = 0; + try { + var ret = entryFunction(argc, argv); + exit(ret, true); + } catch (e) { + if (e instanceof ExitStatus) { + return; + } else if (e == "unwind") { + noExitRuntime = true; + return; + } else { + var toLog = e; + if (e && typeof e === "object" && e.stack) { + toLog = [e, e.stack]; + } + err("exception thrown: " + toLog); + quit_(1, e); + } + } finally { + calledMain = true; + } + } + function run(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) + return; + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + if (shouldRunNow) + callMain(args); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (noExitRuntime) { + } else { + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + var shouldRunNow = true; + if (Module["noInitialRun"]) + shouldRunNow = false; + noExitRuntime = true; + run(); + return WebIFCWasm3.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WebIFCWasm2; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WebIFCWasm2; + }); + else if (typeof exports === "object") + exports["WebIFCWasm"] = WebIFCWasm2; + } +}); + +// dist/ifc2x4.ts +var IFCACTIONREQUEST = 3821786052; +var IFCACTOR = 2296667514; +var IFCACTORROLE = 3630933823; +var IFCACTUATOR = 4288193352; +var IFCACTUATORTYPE = 2874132201; +var IFCADDRESS = 618182010; +var IFCADVANCEDBREP = 1635779807; +var IFCADVANCEDBREPWITHVOIDS = 2603310189; +var IFCADVANCEDFACE = 3406155212; +var IFCAIRTERMINAL = 1634111441; +var IFCAIRTERMINALBOX = 177149247; +var IFCAIRTERMINALBOXTYPE = 1411407467; +var IFCAIRTERMINALTYPE = 3352864051; +var IFCAIRTOAIRHEATRECOVERY = 2056796094; +var IFCAIRTOAIRHEATRECOVERYTYPE = 1871374353; +var IFCALARM = 3087945054; +var IFCALARMTYPE = 3001207471; +var IFCALIGNMENT = 325726236; +var IFCALIGNMENT2DHORIZONTAL = 749761778; +var IFCALIGNMENT2DHORIZONTALSEGMENT = 3199563722; +var IFCALIGNMENT2DSEGMENT = 2483840362; +var IFCALIGNMENT2DVERSEGCIRCULARARC = 3379348081; +var IFCALIGNMENT2DVERSEGLINE = 3239324667; +var IFCALIGNMENT2DVERSEGPARABOLICARC = 4263986512; +var IFCALIGNMENT2DVERTICAL = 53199957; +var IFCALIGNMENT2DVERTICALSEGMENT = 2029264950; +var IFCALIGNMENTCURVE = 3512275521; +var IFCANNOTATION = 1674181508; +var IFCANNOTATIONFILLAREA = 669184980; +var IFCAPPLICATION = 639542469; +var IFCAPPLIEDVALUE = 411424972; +var IFCAPPROVAL = 130549933; +var IFCAPPROVALRELATIONSHIP = 3869604511; +var IFCARBITRARYCLOSEDPROFILEDEF = 3798115385; +var IFCARBITRARYOPENPROFILEDEF = 1310608509; +var IFCARBITRARYPROFILEDEFWITHVOIDS = 2705031697; +var IFCASSET = 3460190687; +var IFCASYMMETRICISHAPEPROFILEDEF = 3207858831; +var IFCAUDIOVISUALAPPLIANCE = 277319702; +var IFCAUDIOVISUALAPPLIANCETYPE = 1532957894; +var IFCAXIS1PLACEMENT = 4261334040; +var IFCAXIS2PLACEMENT2D = 3125803723; +var IFCAXIS2PLACEMENT3D = 2740243338; +var IFCBSPLINECURVE = 1967976161; +var IFCBSPLINECURVEWITHKNOTS = 2461110595; +var IFCBSPLINESURFACE = 2887950389; +var IFCBSPLINESURFACEWITHKNOTS = 167062518; +var IFCBEAM = 753842376; +var IFCBEAMSTANDARDCASE = 2906023776; +var IFCBEAMTYPE = 819618141; +var IFCBEARING = 4196446775; +var IFCBEARINGTYPE = 3649138523; +var IFCBLOBTEXTURE = 616511568; +var IFCBLOCK = 1334484129; +var IFCBOILER = 32344328; +var IFCBOILERTYPE = 231477066; +var IFCBOOLEANCLIPPINGRESULT = 3649129432; +var IFCBOOLEANRESULT = 2736907675; +var IFCBOUNDARYCONDITION = 4037036970; +var IFCBOUNDARYCURVE = 1136057603; +var IFCBOUNDARYEDGECONDITION = 1560379544; +var IFCBOUNDARYFACECONDITION = 3367102660; +var IFCBOUNDARYNODECONDITION = 1387855156; +var IFCBOUNDARYNODECONDITIONWARPING = 2069777674; +var IFCBOUNDEDCURVE = 1260505505; +var IFCBOUNDEDSURFACE = 4182860854; +var IFCBOUNDINGBOX = 2581212453; +var IFCBOXEDHALFSPACE = 2713105998; +var IFCBRIDGE = 644574406; +var IFCBRIDGEPART = 963979645; +var IFCBUILDING = 4031249490; +var IFCBUILDINGELEMENT = 3299480353; +var IFCBUILDINGELEMENTPART = 2979338954; +var IFCBUILDINGELEMENTPARTTYPE = 39481116; +var IFCBUILDINGELEMENTPROXY = 1095909175; +var IFCBUILDINGELEMENTPROXYTYPE = 1909888760; +var IFCBUILDINGELEMENTTYPE = 1950629157; +var IFCBUILDINGSTOREY = 3124254112; +var IFCBUILDINGSYSTEM = 1177604601; +var IFCBURNER = 2938176219; +var IFCBURNERTYPE = 2188180465; +var IFCCSHAPEPROFILEDEF = 2898889636; +var IFCCABLECARRIERFITTING = 635142910; +var IFCCABLECARRIERFITTINGTYPE = 395041908; +var IFCCABLECARRIERSEGMENT = 3758799889; +var IFCCABLECARRIERSEGMENTTYPE = 3293546465; +var IFCCABLEFITTING = 1051757585; +var IFCCABLEFITTINGTYPE = 2674252688; +var IFCCABLESEGMENT = 4217484030; +var IFCCABLESEGMENTTYPE = 1285652485; +var IFCCAISSONFOUNDATION = 3999819293; +var IFCCAISSONFOUNDATIONTYPE = 3203706013; +var IFCCARTESIANPOINT = 1123145078; +var IFCCARTESIANPOINTLIST = 574549367; +var IFCCARTESIANPOINTLIST2D = 1675464909; +var IFCCARTESIANPOINTLIST3D = 2059837836; +var IFCCARTESIANTRANSFORMATIONOPERATOR = 59481748; +var IFCCARTESIANTRANSFORMATIONOPERATOR2D = 3749851601; +var IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM = 3486308946; +var IFCCARTESIANTRANSFORMATIONOPERATOR3D = 3331915920; +var IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM = 1416205885; +var IFCCENTERLINEPROFILEDEF = 3150382593; +var IFCCHILLER = 3902619387; +var IFCCHILLERTYPE = 2951183804; +var IFCCHIMNEY = 3296154744; +var IFCCHIMNEYTYPE = 2197970202; +var IFCCIRCLE = 2611217952; +var IFCCIRCLEHOLLOWPROFILEDEF = 2937912522; +var IFCCIRCLEPROFILEDEF = 1383045692; +var IFCCIRCULARARCSEGMENT2D = 1062206242; +var IFCCIVILELEMENT = 1677625105; +var IFCCIVILELEMENTTYPE = 3893394355; +var IFCCLASSIFICATION = 747523909; +var IFCCLASSIFICATIONREFERENCE = 647927063; +var IFCCLOSEDSHELL = 2205249479; +var IFCCOIL = 639361253; +var IFCCOILTYPE = 2301859152; +var IFCCOLOURRGB = 776857604; +var IFCCOLOURRGBLIST = 3285139300; +var IFCCOLOURSPECIFICATION = 3264961684; +var IFCCOLUMN = 843113511; +var IFCCOLUMNSTANDARDCASE = 905975707; +var IFCCOLUMNTYPE = 300633059; +var IFCCOMMUNICATIONSAPPLIANCE = 3221913625; +var IFCCOMMUNICATIONSAPPLIANCETYPE = 400855858; +var IFCCOMPLEXPROPERTY = 2542286263; +var IFCCOMPLEXPROPERTYTEMPLATE = 3875453745; +var IFCCOMPOSITECURVE = 3732776249; +var IFCCOMPOSITECURVEONSURFACE = 15328376; +var IFCCOMPOSITECURVESEGMENT = 2485617015; +var IFCCOMPOSITEPROFILEDEF = 1485152156; +var IFCCOMPRESSOR = 3571504051; +var IFCCOMPRESSORTYPE = 3850581409; +var IFCCONDENSER = 2272882330; +var IFCCONDENSERTYPE = 2816379211; +var IFCCONIC = 2510884976; +var IFCCONNECTEDFACESET = 370225590; +var IFCCONNECTIONCURVEGEOMETRY = 1981873012; +var IFCCONNECTIONGEOMETRY = 2859738748; +var IFCCONNECTIONPOINTECCENTRICITY = 45288368; +var IFCCONNECTIONPOINTGEOMETRY = 2614616156; +var IFCCONNECTIONSURFACEGEOMETRY = 2732653382; +var IFCCONNECTIONVOLUMEGEOMETRY = 775493141; +var IFCCONSTRAINT = 1959218052; +var IFCCONSTRUCTIONEQUIPMENTRESOURCE = 3898045240; +var IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE = 2185764099; +var IFCCONSTRUCTIONMATERIALRESOURCE = 1060000209; +var IFCCONSTRUCTIONMATERIALRESOURCETYPE = 4105962743; +var IFCCONSTRUCTIONPRODUCTRESOURCE = 488727124; +var IFCCONSTRUCTIONPRODUCTRESOURCETYPE = 1525564444; +var IFCCONSTRUCTIONRESOURCE = 2559216714; +var IFCCONSTRUCTIONRESOURCETYPE = 2574617495; +var IFCCONTEXT = 3419103109; +var IFCCONTEXTDEPENDENTUNIT = 3050246964; +var IFCCONTROL = 3293443760; +var IFCCONTROLLER = 25142252; +var IFCCONTROLLERTYPE = 578613899; +var IFCCONVERSIONBASEDUNIT = 2889183280; +var IFCCONVERSIONBASEDUNITWITHOFFSET = 2713554722; +var IFCCOOLEDBEAM = 4136498852; +var IFCCOOLEDBEAMTYPE = 335055490; +var IFCCOOLINGTOWER = 3640358203; +var IFCCOOLINGTOWERTYPE = 2954562838; +var IFCCOORDINATEOPERATION = 1785450214; +var IFCCOORDINATEREFERENCESYSTEM = 1466758467; +var IFCCOSTITEM = 3895139033; +var IFCCOSTSCHEDULE = 1419761937; +var IFCCOSTVALUE = 602808272; +var IFCCOVERING = 1973544240; +var IFCCOVERINGTYPE = 1916426348; +var IFCCREWRESOURCE = 3295246426; +var IFCCREWRESOURCETYPE = 1815067380; +var IFCCSGPRIMITIVE3D = 2506170314; +var IFCCSGSOLID = 2147822146; +var IFCCURRENCYRELATIONSHIP = 539742890; +var IFCCURTAINWALL = 3495092785; +var IFCCURTAINWALLTYPE = 1457835157; +var IFCCURVE = 2601014836; +var IFCCURVEBOUNDEDPLANE = 2827736869; +var IFCCURVEBOUNDEDSURFACE = 2629017746; +var IFCCURVESEGMENT2D = 1186437898; +var IFCCURVESTYLE = 3800577675; +var IFCCURVESTYLEFONT = 1105321065; +var IFCCURVESTYLEFONTANDSCALING = 2367409068; +var IFCCURVESTYLEFONTPATTERN = 3510044353; +var IFCCYLINDRICALSURFACE = 1213902940; +var IFCDAMPER = 4074379575; +var IFCDAMPERTYPE = 3961806047; +var IFCDEEPFOUNDATION = 3426335179; +var IFCDEEPFOUNDATIONTYPE = 1306400036; +var IFCDERIVEDPROFILEDEF = 3632507154; +var IFCDERIVEDUNIT = 1765591967; +var IFCDERIVEDUNITELEMENT = 1045800335; +var IFCDIMENSIONALEXPONENTS = 2949456006; +var IFCDIRECTION = 32440307; +var IFCDISCRETEACCESSORY = 1335981549; +var IFCDISCRETEACCESSORYTYPE = 2635815018; +var IFCDISTANCEEXPRESSION = 1945343521; +var IFCDISTRIBUTIONCHAMBERELEMENT = 1052013943; +var IFCDISTRIBUTIONCHAMBERELEMENTTYPE = 1599208980; +var IFCDISTRIBUTIONCIRCUIT = 562808652; +var IFCDISTRIBUTIONCONTROLELEMENT = 1062813311; +var IFCDISTRIBUTIONCONTROLELEMENTTYPE = 2063403501; +var IFCDISTRIBUTIONELEMENT = 1945004755; +var IFCDISTRIBUTIONELEMENTTYPE = 3256556792; +var IFCDISTRIBUTIONFLOWELEMENT = 3040386961; +var IFCDISTRIBUTIONFLOWELEMENTTYPE = 3849074793; +var IFCDISTRIBUTIONPORT = 3041715199; +var IFCDISTRIBUTIONSYSTEM = 3205830791; +var IFCDOCUMENTINFORMATION = 1154170062; +var IFCDOCUMENTINFORMATIONRELATIONSHIP = 770865208; +var IFCDOCUMENTREFERENCE = 3732053477; +var IFCDOOR = 395920057; +var IFCDOORLININGPROPERTIES = 2963535650; +var IFCDOORPANELPROPERTIES = 1714330368; +var IFCDOORSTANDARDCASE = 3242481149; +var IFCDOORSTYLE = 526551008; +var IFCDOORTYPE = 2323601079; +var IFCDRAUGHTINGPREDEFINEDCOLOUR = 445594917; +var IFCDRAUGHTINGPREDEFINEDCURVEFONT = 4006246654; +var IFCDUCTFITTING = 342316401; +var IFCDUCTFITTINGTYPE = 869906466; +var IFCDUCTSEGMENT = 3518393246; +var IFCDUCTSEGMENTTYPE = 3760055223; +var IFCDUCTSILENCER = 1360408905; +var IFCDUCTSILENCERTYPE = 2030761528; +var IFCEDGE = 3900360178; +var IFCEDGECURVE = 476780140; +var IFCEDGELOOP = 1472233963; +var IFCELECTRICAPPLIANCE = 1904799276; +var IFCELECTRICAPPLIANCETYPE = 663422040; +var IFCELECTRICDISTRIBUTIONBOARD = 862014818; +var IFCELECTRICDISTRIBUTIONBOARDTYPE = 2417008758; +var IFCELECTRICFLOWSTORAGEDEVICE = 3310460725; +var IFCELECTRICFLOWSTORAGEDEVICETYPE = 3277789161; +var IFCELECTRICGENERATOR = 264262732; +var IFCELECTRICGENERATORTYPE = 1534661035; +var IFCELECTRICMOTOR = 402227799; +var IFCELECTRICMOTORTYPE = 1217240411; +var IFCELECTRICTIMECONTROL = 1003880860; +var IFCELECTRICTIMECONTROLTYPE = 712377611; +var IFCELEMENT = 1758889154; +var IFCELEMENTASSEMBLY = 4123344466; +var IFCELEMENTASSEMBLYTYPE = 2397081782; +var IFCELEMENTCOMPONENT = 1623761950; +var IFCELEMENTCOMPONENTTYPE = 2590856083; +var IFCELEMENTQUANTITY = 1883228015; +var IFCELEMENTTYPE = 339256511; +var IFCELEMENTARYSURFACE = 2777663545; +var IFCELLIPSE = 1704287377; +var IFCELLIPSEPROFILEDEF = 2835456948; +var IFCENERGYCONVERSIONDEVICE = 1658829314; +var IFCENERGYCONVERSIONDEVICETYPE = 2107101300; +var IFCENGINE = 2814081492; +var IFCENGINETYPE = 132023988; +var IFCEVAPORATIVECOOLER = 3747195512; +var IFCEVAPORATIVECOOLERTYPE = 3174744832; +var IFCEVAPORATOR = 484807127; +var IFCEVAPORATORTYPE = 3390157468; +var IFCEVENT = 4148101412; +var IFCEVENTTIME = 211053100; +var IFCEVENTTYPE = 4024345920; +var IFCEXTENDEDPROPERTIES = 297599258; +var IFCEXTERNALINFORMATION = 4294318154; +var IFCEXTERNALREFERENCE = 3200245327; +var IFCEXTERNALREFERENCERELATIONSHIP = 1437805879; +var IFCEXTERNALSPATIALELEMENT = 1209101575; +var IFCEXTERNALSPATIALSTRUCTUREELEMENT = 2853485674; +var IFCEXTERNALLYDEFINEDHATCHSTYLE = 2242383968; +var IFCEXTERNALLYDEFINEDSURFACESTYLE = 1040185647; +var IFCEXTERNALLYDEFINEDTEXTFONT = 3548104201; +var IFCEXTRUDEDAREASOLID = 477187591; +var IFCEXTRUDEDAREASOLIDTAPERED = 2804161546; +var IFCFACE = 2556980723; +var IFCFACEBASEDSURFACEMODEL = 2047409740; +var IFCFACEBOUND = 1809719519; +var IFCFACEOUTERBOUND = 803316827; +var IFCFACESURFACE = 3008276851; +var IFCFACETEDBREP = 807026263; +var IFCFACETEDBREPWITHVOIDS = 3737207727; +var IFCFACILITY = 24185140; +var IFCFACILITYPART = 1310830890; +var IFCFAILURECONNECTIONCONDITION = 4219587988; +var IFCFAN = 3415622556; +var IFCFANTYPE = 346874300; +var IFCFASTENER = 647756555; +var IFCFASTENERTYPE = 2489546625; +var IFCFEATUREELEMENT = 2827207264; +var IFCFEATUREELEMENTADDITION = 2143335405; +var IFCFEATUREELEMENTSUBTRACTION = 1287392070; +var IFCFILLAREASTYLE = 738692330; +var IFCFILLAREASTYLEHATCHING = 374418227; +var IFCFILLAREASTYLETILES = 315944413; +var IFCFILTER = 819412036; +var IFCFILTERTYPE = 1810631287; +var IFCFIRESUPPRESSIONTERMINAL = 1426591983; +var IFCFIRESUPPRESSIONTERMINALTYPE = 4222183408; +var IFCFIXEDREFERENCESWEPTAREASOLID = 2652556860; +var IFCFLOWCONTROLLER = 2058353004; +var IFCFLOWCONTROLLERTYPE = 3907093117; +var IFCFLOWFITTING = 4278956645; +var IFCFLOWFITTINGTYPE = 3198132628; +var IFCFLOWINSTRUMENT = 182646315; +var IFCFLOWINSTRUMENTTYPE = 4037862832; +var IFCFLOWMETER = 2188021234; +var IFCFLOWMETERTYPE = 3815607619; +var IFCFLOWMOVINGDEVICE = 3132237377; +var IFCFLOWMOVINGDEVICETYPE = 1482959167; +var IFCFLOWSEGMENT = 987401354; +var IFCFLOWSEGMENTTYPE = 1834744321; +var IFCFLOWSTORAGEDEVICE = 707683696; +var IFCFLOWSTORAGEDEVICETYPE = 1339347760; +var IFCFLOWTERMINAL = 2223149337; +var IFCFLOWTERMINALTYPE = 2297155007; +var IFCFLOWTREATMENTDEVICE = 3508470533; +var IFCFLOWTREATMENTDEVICETYPE = 3009222698; +var IFCFOOTING = 900683007; +var IFCFOOTINGTYPE = 1893162501; +var IFCFURNISHINGELEMENT = 263784265; +var IFCFURNISHINGELEMENTTYPE = 4238390223; +var IFCFURNITURE = 1509553395; +var IFCFURNITURETYPE = 1268542332; +var IFCGEOGRAPHICELEMENT = 3493046030; +var IFCGEOGRAPHICELEMENTTYPE = 4095422895; +var IFCGEOMETRICCURVESET = 987898635; +var IFCGEOMETRICREPRESENTATIONCONTEXT = 3448662350; +var IFCGEOMETRICREPRESENTATIONITEM = 2453401579; +var IFCGEOMETRICREPRESENTATIONSUBCONTEXT = 4142052618; +var IFCGEOMETRICSET = 3590301190; +var IFCGRID = 3009204131; +var IFCGRIDAXIS = 852622518; +var IFCGRIDPLACEMENT = 178086475; +var IFCGROUP = 2706460486; +var IFCHALFSPACESOLID = 812098782; +var IFCHEATEXCHANGER = 3319311131; +var IFCHEATEXCHANGERTYPE = 1251058090; +var IFCHUMIDIFIER = 2068733104; +var IFCHUMIDIFIERTYPE = 1806887404; +var IFCISHAPEPROFILEDEF = 1484403080; +var IFCIMAGETEXTURE = 3905492369; +var IFCINDEXEDCOLOURMAP = 3570813810; +var IFCINDEXEDPOLYCURVE = 2571569899; +var IFCINDEXEDPOLYGONALFACE = 178912537; +var IFCINDEXEDPOLYGONALFACEWITHVOIDS = 2294589976; +var IFCINDEXEDTEXTUREMAP = 1437953363; +var IFCINDEXEDTRIANGLETEXTUREMAP = 2133299955; +var IFCINTERCEPTOR = 4175244083; +var IFCINTERCEPTORTYPE = 3946677679; +var IFCINTERSECTIONCURVE = 3113134337; +var IFCINVENTORY = 2391368822; +var IFCIRREGULARTIMESERIES = 3741457305; +var IFCIRREGULARTIMESERIESVALUE = 3020489413; +var IFCJUNCTIONBOX = 2176052936; +var IFCJUNCTIONBOXTYPE = 4288270099; +var IFCLSHAPEPROFILEDEF = 572779678; +var IFCLABORRESOURCE = 3827777499; +var IFCLABORRESOURCETYPE = 428585644; +var IFCLAGTIME = 1585845231; +var IFCLAMP = 76236018; +var IFCLAMPTYPE = 1051575348; +var IFCLIBRARYINFORMATION = 2655187982; +var IFCLIBRARYREFERENCE = 3452421091; +var IFCLIGHTDISTRIBUTIONDATA = 4162380809; +var IFCLIGHTFIXTURE = 629592764; +var IFCLIGHTFIXTURETYPE = 1161773419; +var IFCLIGHTINTENSITYDISTRIBUTION = 1566485204; +var IFCLIGHTSOURCE = 1402838566; +var IFCLIGHTSOURCEAMBIENT = 125510826; +var IFCLIGHTSOURCEDIRECTIONAL = 2604431987; +var IFCLIGHTSOURCEGONIOMETRIC = 4266656042; +var IFCLIGHTSOURCEPOSITIONAL = 1520743889; +var IFCLIGHTSOURCESPOT = 3422422726; +var IFCLINE = 1281925730; +var IFCLINESEGMENT2D = 3092502836; +var IFCLINEARPLACEMENT = 388784114; +var IFCLINEARPOSITIONINGELEMENT = 1154579445; +var IFCLOCALPLACEMENT = 2624227202; +var IFCLOOP = 1008929658; +var IFCMANIFOLDSOLIDBREP = 1425443689; +var IFCMAPCONVERSION = 3057273783; +var IFCMAPPEDITEM = 2347385850; +var IFCMATERIAL = 1838606355; +var IFCMATERIALCLASSIFICATIONRELATIONSHIP = 1847130766; +var IFCMATERIALCONSTITUENT = 3708119e3; +var IFCMATERIALCONSTITUENTSET = 2852063980; +var IFCMATERIALDEFINITION = 760658860; +var IFCMATERIALDEFINITIONREPRESENTATION = 2022407955; +var IFCMATERIALLAYER = 248100487; +var IFCMATERIALLAYERSET = 3303938423; +var IFCMATERIALLAYERSETUSAGE = 1303795690; +var IFCMATERIALLAYERWITHOFFSETS = 1847252529; +var IFCMATERIALLIST = 2199411900; +var IFCMATERIALPROFILE = 2235152071; +var IFCMATERIALPROFILESET = 164193824; +var IFCMATERIALPROFILESETUSAGE = 3079605661; +var IFCMATERIALPROFILESETUSAGETAPERING = 3404854881; +var IFCMATERIALPROFILEWITHOFFSETS = 552965576; +var IFCMATERIALPROPERTIES = 3265635763; +var IFCMATERIALRELATIONSHIP = 853536259; +var IFCMATERIALUSAGEDEFINITION = 1507914824; +var IFCMEASUREWITHUNIT = 2597039031; +var IFCMECHANICALFASTENER = 377706215; +var IFCMECHANICALFASTENERTYPE = 2108223431; +var IFCMEDICALDEVICE = 1437502449; +var IFCMEDICALDEVICETYPE = 1114901282; +var IFCMEMBER = 1073191201; +var IFCMEMBERSTANDARDCASE = 1911478936; +var IFCMEMBERTYPE = 3181161470; +var IFCMETRIC = 3368373690; +var IFCMIRROREDPROFILEDEF = 2998442950; +var IFCMONETARYUNIT = 2706619895; +var IFCMOTORCONNECTION = 2474470126; +var IFCMOTORCONNECTIONTYPE = 977012517; +var IFCNAMEDUNIT = 1918398963; +var IFCOBJECT = 3888040117; +var IFCOBJECTDEFINITION = 219451334; +var IFCOBJECTPLACEMENT = 3701648758; +var IFCOBJECTIVE = 2251480897; +var IFCOCCUPANT = 4143007308; +var IFCOFFSETCURVE = 590820931; +var IFCOFFSETCURVE2D = 3388369263; +var IFCOFFSETCURVE3D = 3505215534; +var IFCOFFSETCURVEBYDISTANCES = 2485787929; +var IFCOPENSHELL = 2665983363; +var IFCOPENINGELEMENT = 3588315303; +var IFCOPENINGSTANDARDCASE = 3079942009; +var IFCORGANIZATION = 4251960020; +var IFCORGANIZATIONRELATIONSHIP = 1411181986; +var IFCORIENTATIONEXPRESSION = 643959842; +var IFCORIENTEDEDGE = 1029017970; +var IFCOUTERBOUNDARYCURVE = 144952367; +var IFCOUTLET = 3694346114; +var IFCOUTLETTYPE = 2837617999; +var IFCOWNERHISTORY = 1207048766; +var IFCPARAMETERIZEDPROFILEDEF = 2529465313; +var IFCPATH = 2519244187; +var IFCPCURVE = 1682466193; +var IFCPERFORMANCEHISTORY = 2382730787; +var IFCPERMEABLECOVERINGPROPERTIES = 3566463478; +var IFCPERMIT = 3327091369; +var IFCPERSON = 2077209135; +var IFCPERSONANDORGANIZATION = 101040310; +var IFCPHYSICALCOMPLEXQUANTITY = 3021840470; +var IFCPHYSICALQUANTITY = 2483315170; +var IFCPHYSICALSIMPLEQUANTITY = 2226359599; +var IFCPILE = 1687234759; +var IFCPILETYPE = 1158309216; +var IFCPIPEFITTING = 310824031; +var IFCPIPEFITTINGTYPE = 804291784; +var IFCPIPESEGMENT = 3612865200; +var IFCPIPESEGMENTTYPE = 4231323485; +var IFCPIXELTEXTURE = 597895409; +var IFCPLACEMENT = 2004835150; +var IFCPLANARBOX = 603570806; +var IFCPLANAREXTENT = 1663979128; +var IFCPLANE = 220341763; +var IFCPLATE = 3171933400; +var IFCPLATESTANDARDCASE = 1156407060; +var IFCPLATETYPE = 4017108033; +var IFCPOINT = 2067069095; +var IFCPOINTONCURVE = 4022376103; +var IFCPOINTONSURFACE = 1423911732; +var IFCPOLYLOOP = 2924175390; +var IFCPOLYGONALBOUNDEDHALFSPACE = 2775532180; +var IFCPOLYGONALFACESET = 2839578677; +var IFCPOLYLINE = 3724593414; +var IFCPORT = 3740093272; +var IFCPOSITIONINGELEMENT = 1946335990; +var IFCPOSTALADDRESS = 3355820592; +var IFCPREDEFINEDCOLOUR = 759155922; +var IFCPREDEFINEDCURVEFONT = 2559016684; +var IFCPREDEFINEDITEM = 3727388367; +var IFCPREDEFINEDPROPERTIES = 3778827333; +var IFCPREDEFINEDPROPERTYSET = 3967405729; +var IFCPREDEFINEDTEXTFONT = 1775413392; +var IFCPRESENTATIONITEM = 677532197; +var IFCPRESENTATIONLAYERASSIGNMENT = 2022622350; +var IFCPRESENTATIONLAYERWITHSTYLE = 1304840413; +var IFCPRESENTATIONSTYLE = 3119450353; +var IFCPRESENTATIONSTYLEASSIGNMENT = 2417041796; +var IFCPROCEDURE = 2744685151; +var IFCPROCEDURETYPE = 569719735; +var IFCPROCESS = 2945172077; +var IFCPRODUCT = 4208778838; +var IFCPRODUCTDEFINITIONSHAPE = 673634403; +var IFCPRODUCTREPRESENTATION = 2095639259; +var IFCPROFILEDEF = 3958567839; +var IFCPROFILEPROPERTIES = 2802850158; +var IFCPROJECT = 103090709; +var IFCPROJECTLIBRARY = 653396225; +var IFCPROJECTORDER = 2904328755; +var IFCPROJECTEDCRS = 3843373140; +var IFCPROJECTIONELEMENT = 3651124850; +var IFCPROPERTY = 2598011224; +var IFCPROPERTYABSTRACTION = 986844984; +var IFCPROPERTYBOUNDEDVALUE = 871118103; +var IFCPROPERTYDEFINITION = 1680319473; +var IFCPROPERTYDEPENDENCYRELATIONSHIP = 148025276; +var IFCPROPERTYENUMERATEDVALUE = 4166981789; +var IFCPROPERTYENUMERATION = 3710013099; +var IFCPROPERTYLISTVALUE = 2752243245; +var IFCPROPERTYREFERENCEVALUE = 941946838; +var IFCPROPERTYSET = 1451395588; +var IFCPROPERTYSETDEFINITION = 3357820518; +var IFCPROPERTYSETTEMPLATE = 492091185; +var IFCPROPERTYSINGLEVALUE = 3650150729; +var IFCPROPERTYTABLEVALUE = 110355661; +var IFCPROPERTYTEMPLATE = 3521284610; +var IFCPROPERTYTEMPLATEDEFINITION = 1482703590; +var IFCPROTECTIVEDEVICE = 738039164; +var IFCPROTECTIVEDEVICETRIPPINGUNIT = 2295281155; +var IFCPROTECTIVEDEVICETRIPPINGUNITTYPE = 655969474; +var IFCPROTECTIVEDEVICETYPE = 1842657554; +var IFCPROXY = 3219374653; +var IFCPUMP = 90941305; +var IFCPUMPTYPE = 2250791053; +var IFCQUANTITYAREA = 2044713172; +var IFCQUANTITYCOUNT = 2093928680; +var IFCQUANTITYLENGTH = 931644368; +var IFCQUANTITYSET = 2090586900; +var IFCQUANTITYTIME = 3252649465; +var IFCQUANTITYVOLUME = 2405470396; +var IFCQUANTITYWEIGHT = 825690147; +var IFCRAILING = 2262370178; +var IFCRAILINGTYPE = 2893384427; +var IFCRAMP = 3024970846; +var IFCRAMPFLIGHT = 3283111854; +var IFCRAMPFLIGHTTYPE = 2324767716; +var IFCRAMPTYPE = 1469900589; +var IFCRATIONALBSPLINECURVEWITHKNOTS = 1232101972; +var IFCRATIONALBSPLINESURFACEWITHKNOTS = 683857671; +var IFCRECTANGLEHOLLOWPROFILEDEF = 2770003689; +var IFCRECTANGLEPROFILEDEF = 3615266464; +var IFCRECTANGULARPYRAMID = 2798486643; +var IFCRECTANGULARTRIMMEDSURFACE = 3454111270; +var IFCRECURRENCEPATTERN = 3915482550; +var IFCREFERENCE = 2433181523; +var IFCREFERENT = 4021432810; +var IFCREGULARTIMESERIES = 3413951693; +var IFCREINFORCEMENTBARPROPERTIES = 1580146022; +var IFCREINFORCEMENTDEFINITIONPROPERTIES = 3765753017; +var IFCREINFORCINGBAR = 979691226; +var IFCREINFORCINGBARTYPE = 2572171363; +var IFCREINFORCINGELEMENT = 3027567501; +var IFCREINFORCINGELEMENTTYPE = 964333572; +var IFCREINFORCINGMESH = 2320036040; +var IFCREINFORCINGMESHTYPE = 2310774935; +var IFCRELAGGREGATES = 160246688; +var IFCRELASSIGNS = 3939117080; +var IFCRELASSIGNSTOACTOR = 1683148259; +var IFCRELASSIGNSTOCONTROL = 2495723537; +var IFCRELASSIGNSTOGROUP = 1307041759; +var IFCRELASSIGNSTOGROUPBYFACTOR = 1027710054; +var IFCRELASSIGNSTOPROCESS = 4278684876; +var IFCRELASSIGNSTOPRODUCT = 2857406711; +var IFCRELASSIGNSTORESOURCE = 205026976; +var IFCRELASSOCIATES = 1865459582; +var IFCRELASSOCIATESAPPROVAL = 4095574036; +var IFCRELASSOCIATESCLASSIFICATION = 919958153; +var IFCRELASSOCIATESCONSTRAINT = 2728634034; +var IFCRELASSOCIATESDOCUMENT = 982818633; +var IFCRELASSOCIATESLIBRARY = 3840914261; +var IFCRELASSOCIATESMATERIAL = 2655215786; +var IFCRELCONNECTS = 826625072; +var IFCRELCONNECTSELEMENTS = 1204542856; +var IFCRELCONNECTSPATHELEMENTS = 3945020480; +var IFCRELCONNECTSPORTTOELEMENT = 4201705270; +var IFCRELCONNECTSPORTS = 3190031847; +var IFCRELCONNECTSSTRUCTURALACTIVITY = 2127690289; +var IFCRELCONNECTSSTRUCTURALMEMBER = 1638771189; +var IFCRELCONNECTSWITHECCENTRICITY = 504942748; +var IFCRELCONNECTSWITHREALIZINGELEMENTS = 3678494232; +var IFCRELCONTAINEDINSPATIALSTRUCTURE = 3242617779; +var IFCRELCOVERSBLDGELEMENTS = 886880790; +var IFCRELCOVERSSPACES = 2802773753; +var IFCRELDECLARES = 2565941209; +var IFCRELDECOMPOSES = 2551354335; +var IFCRELDEFINES = 693640335; +var IFCRELDEFINESBYOBJECT = 1462361463; +var IFCRELDEFINESBYPROPERTIES = 4186316022; +var IFCRELDEFINESBYTEMPLATE = 307848117; +var IFCRELDEFINESBYTYPE = 781010003; +var IFCRELFILLSELEMENT = 3940055652; +var IFCRELFLOWCONTROLELEMENTS = 279856033; +var IFCRELINTERFERESELEMENTS = 427948657; +var IFCRELNESTS = 3268803585; +var IFCRELPOSITIONS = 1441486842; +var IFCRELPROJECTSELEMENT = 750771296; +var IFCRELREFERENCEDINSPATIALSTRUCTURE = 1245217292; +var IFCRELSEQUENCE = 4122056220; +var IFCRELSERVICESBUILDINGS = 366585022; +var IFCRELSPACEBOUNDARY = 3451746338; +var IFCRELSPACEBOUNDARY1STLEVEL = 3523091289; +var IFCRELSPACEBOUNDARY2NDLEVEL = 1521410863; +var IFCRELVOIDSELEMENT = 1401173127; +var IFCRELATIONSHIP = 478536968; +var IFCREPARAMETRISEDCOMPOSITECURVESEGMENT = 816062949; +var IFCREPRESENTATION = 1076942058; +var IFCREPRESENTATIONCONTEXT = 3377609919; +var IFCREPRESENTATIONITEM = 3008791417; +var IFCREPRESENTATIONMAP = 1660063152; +var IFCRESOURCE = 2914609552; +var IFCRESOURCEAPPROVALRELATIONSHIP = 2943643501; +var IFCRESOURCECONSTRAINTRELATIONSHIP = 1608871552; +var IFCRESOURCELEVELRELATIONSHIP = 2439245199; +var IFCRESOURCETIME = 1042787934; +var IFCREVOLVEDAREASOLID = 1856042241; +var IFCREVOLVEDAREASOLIDTAPERED = 3243963512; +var IFCRIGHTCIRCULARCONE = 4158566097; +var IFCRIGHTCIRCULARCYLINDER = 3626867408; +var IFCROOF = 2016517767; +var IFCROOFTYPE = 2781568857; +var IFCROOT = 2341007311; +var IFCROUNDEDRECTANGLEPROFILEDEF = 2778083089; +var IFCSIUNIT = 448429030; +var IFCSANITARYTERMINAL = 3053780830; +var IFCSANITARYTERMINALTYPE = 1768891740; +var IFCSCHEDULINGTIME = 1054537805; +var IFCSEAMCURVE = 2157484638; +var IFCSECTIONPROPERTIES = 2042790032; +var IFCSECTIONREINFORCEMENTPROPERTIES = 4165799628; +var IFCSECTIONEDSOLID = 1862484736; +var IFCSECTIONEDSOLIDHORIZONTAL = 1290935644; +var IFCSECTIONEDSPINE = 1509187699; +var IFCSENSOR = 4086658281; +var IFCSENSORTYPE = 1783015770; +var IFCSHADINGDEVICE = 1329646415; +var IFCSHADINGDEVICETYPE = 4074543187; +var IFCSHAPEASPECT = 867548509; +var IFCSHAPEMODEL = 3982875396; +var IFCSHAPEREPRESENTATION = 4240577450; +var IFCSHELLBASEDSURFACEMODEL = 4124623270; +var IFCSIMPLEPROPERTY = 3692461612; +var IFCSIMPLEPROPERTYTEMPLATE = 3663146110; +var IFCSITE = 4097777520; +var IFCSLAB = 1529196076; +var IFCSLABELEMENTEDCASE = 3127900445; +var IFCSLABSTANDARDCASE = 3027962421; +var IFCSLABTYPE = 2533589738; +var IFCSLIPPAGECONNECTIONCONDITION = 2609359061; +var IFCSOLARDEVICE = 3420628829; +var IFCSOLARDEVICETYPE = 1072016465; +var IFCSOLIDMODEL = 723233188; +var IFCSPACE = 3856911033; +var IFCSPACEHEATER = 1999602285; +var IFCSPACEHEATERTYPE = 1305183839; +var IFCSPACETYPE = 3812236995; +var IFCSPATIALELEMENT = 1412071761; +var IFCSPATIALELEMENTTYPE = 710998568; +var IFCSPATIALSTRUCTUREELEMENT = 2706606064; +var IFCSPATIALSTRUCTUREELEMENTTYPE = 3893378262; +var IFCSPATIALZONE = 463610769; +var IFCSPATIALZONETYPE = 2481509218; +var IFCSPHERE = 451544542; +var IFCSPHERICALSURFACE = 4015995234; +var IFCSTACKTERMINAL = 1404847402; +var IFCSTACKTERMINALTYPE = 3112655638; +var IFCSTAIR = 331165859; +var IFCSTAIRFLIGHT = 4252922144; +var IFCSTAIRFLIGHTTYPE = 1039846685; +var IFCSTAIRTYPE = 338393293; +var IFCSTRUCTURALACTION = 682877961; +var IFCSTRUCTURALACTIVITY = 3544373492; +var IFCSTRUCTURALANALYSISMODEL = 2515109513; +var IFCSTRUCTURALCONNECTION = 1179482911; +var IFCSTRUCTURALCONNECTIONCONDITION = 2273995522; +var IFCSTRUCTURALCURVEACTION = 1004757350; +var IFCSTRUCTURALCURVECONNECTION = 4243806635; +var IFCSTRUCTURALCURVEMEMBER = 214636428; +var IFCSTRUCTURALCURVEMEMBERVARYING = 2445595289; +var IFCSTRUCTURALCURVEREACTION = 2757150158; +var IFCSTRUCTURALITEM = 3136571912; +var IFCSTRUCTURALLINEARACTION = 1807405624; +var IFCSTRUCTURALLOAD = 2162789131; +var IFCSTRUCTURALLOADCASE = 385403989; +var IFCSTRUCTURALLOADCONFIGURATION = 3478079324; +var IFCSTRUCTURALLOADGROUP = 1252848954; +var IFCSTRUCTURALLOADLINEARFORCE = 1595516126; +var IFCSTRUCTURALLOADORRESULT = 609421318; +var IFCSTRUCTURALLOADPLANARFORCE = 2668620305; +var IFCSTRUCTURALLOADSINGLEDISPLACEMENT = 2473145415; +var IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION = 1973038258; +var IFCSTRUCTURALLOADSINGLEFORCE = 1597423693; +var IFCSTRUCTURALLOADSINGLEFORCEWARPING = 1190533807; +var IFCSTRUCTURALLOADSTATIC = 2525727697; +var IFCSTRUCTURALLOADTEMPERATURE = 3408363356; +var IFCSTRUCTURALMEMBER = 530289379; +var IFCSTRUCTURALPLANARACTION = 1621171031; +var IFCSTRUCTURALPOINTACTION = 2082059205; +var IFCSTRUCTURALPOINTCONNECTION = 734778138; +var IFCSTRUCTURALPOINTREACTION = 1235345126; +var IFCSTRUCTURALREACTION = 3689010777; +var IFCSTRUCTURALRESULTGROUP = 2986769608; +var IFCSTRUCTURALSURFACEACTION = 3657597509; +var IFCSTRUCTURALSURFACECONNECTION = 1975003073; +var IFCSTRUCTURALSURFACEMEMBER = 3979015343; +var IFCSTRUCTURALSURFACEMEMBERVARYING = 2218152070; +var IFCSTRUCTURALSURFACEREACTION = 603775116; +var IFCSTYLEMODEL = 2830218821; +var IFCSTYLEDITEM = 3958052878; +var IFCSTYLEDREPRESENTATION = 3049322572; +var IFCSUBCONTRACTRESOURCE = 148013059; +var IFCSUBCONTRACTRESOURCETYPE = 4095615324; +var IFCSUBEDGE = 2233826070; +var IFCSURFACE = 2513912981; +var IFCSURFACECURVE = 699246055; +var IFCSURFACECURVESWEPTAREASOLID = 2028607225; +var IFCSURFACEFEATURE = 3101698114; +var IFCSURFACEOFLINEAREXTRUSION = 2809605785; +var IFCSURFACEOFREVOLUTION = 4124788165; +var IFCSURFACEREINFORCEMENTAREA = 2934153892; +var IFCSURFACESTYLE = 1300840506; +var IFCSURFACESTYLELIGHTING = 3303107099; +var IFCSURFACESTYLEREFRACTION = 1607154358; +var IFCSURFACESTYLERENDERING = 1878645084; +var IFCSURFACESTYLESHADING = 846575682; +var IFCSURFACESTYLEWITHTEXTURES = 1351298697; +var IFCSURFACETEXTURE = 626085974; +var IFCSWEPTAREASOLID = 2247615214; +var IFCSWEPTDISKSOLID = 1260650574; +var IFCSWEPTDISKSOLIDPOLYGONAL = 1096409881; +var IFCSWEPTSURFACE = 230924584; +var IFCSWITCHINGDEVICE = 1162798199; +var IFCSWITCHINGDEVICETYPE = 2315554128; +var IFCSYSTEM = 2254336722; +var IFCSYSTEMFURNITUREELEMENT = 413509423; +var IFCSYSTEMFURNITUREELEMENTTYPE = 1580310250; +var IFCTSHAPEPROFILEDEF = 3071757647; +var IFCTABLE = 985171141; +var IFCTABLECOLUMN = 2043862942; +var IFCTABLEROW = 531007025; +var IFCTANK = 812556717; +var IFCTANKTYPE = 5716631; +var IFCTASK = 3473067441; +var IFCTASKTIME = 1549132990; +var IFCTASKTIMERECURRING = 2771591690; +var IFCTASKTYPE = 3206491090; +var IFCTELECOMADDRESS = 912023232; +var IFCTENDON = 3824725483; +var IFCTENDONANCHOR = 2347447852; +var IFCTENDONANCHORTYPE = 3081323446; +var IFCTENDONCONDUIT = 3663046924; +var IFCTENDONCONDUITTYPE = 2281632017; +var IFCTENDONTYPE = 2415094496; +var IFCTESSELLATEDFACESET = 2387106220; +var IFCTESSELLATEDITEM = 901063453; +var IFCTEXTLITERAL = 4282788508; +var IFCTEXTLITERALWITHEXTENT = 3124975700; +var IFCTEXTSTYLE = 1447204868; +var IFCTEXTSTYLEFONTMODEL = 1983826977; +var IFCTEXTSTYLEFORDEFINEDFONT = 2636378356; +var IFCTEXTSTYLETEXTMODEL = 1640371178; +var IFCTEXTURECOORDINATE = 280115917; +var IFCTEXTURECOORDINATEGENERATOR = 1742049831; +var IFCTEXTUREMAP = 2552916305; +var IFCTEXTUREVERTEX = 1210645708; +var IFCTEXTUREVERTEXLIST = 3611470254; +var IFCTIMEPERIOD = 1199560280; +var IFCTIMESERIES = 3101149627; +var IFCTIMESERIESVALUE = 581633288; +var IFCTOPOLOGICALREPRESENTATIONITEM = 1377556343; +var IFCTOPOLOGYREPRESENTATION = 1735638870; +var IFCTOROIDALSURFACE = 1935646853; +var IFCTRANSFORMER = 3825984169; +var IFCTRANSFORMERTYPE = 1692211062; +var IFCTRANSITIONCURVESEGMENT2D = 2595432518; +var IFCTRANSPORTELEMENT = 1620046519; +var IFCTRANSPORTELEMENTTYPE = 2097647324; +var IFCTRAPEZIUMPROFILEDEF = 2715220739; +var IFCTRIANGULATEDFACESET = 2916149573; +var IFCTRIANGULATEDIRREGULARNETWORK = 1229763772; +var IFCTRIMMEDCURVE = 3593883385; +var IFCTUBEBUNDLE = 3026737570; +var IFCTUBEBUNDLETYPE = 1600972822; +var IFCTYPEOBJECT = 1628702193; +var IFCTYPEPROCESS = 3736923433; +var IFCTYPEPRODUCT = 2347495698; +var IFCTYPERESOURCE = 3698973494; +var IFCUSHAPEPROFILEDEF = 427810014; +var IFCUNITASSIGNMENT = 180925521; +var IFCUNITARYCONTROLELEMENT = 630975310; +var IFCUNITARYCONTROLELEMENTTYPE = 3179687236; +var IFCUNITARYEQUIPMENT = 4292641817; +var IFCUNITARYEQUIPMENTTYPE = 1911125066; +var IFCVALVE = 4207607924; +var IFCVALVETYPE = 728799441; +var IFCVECTOR = 1417489154; +var IFCVERTEX = 2799835756; +var IFCVERTEXLOOP = 2759199220; +var IFCVERTEXPOINT = 1907098498; +var IFCVIBRATIONDAMPER = 1530820697; +var IFCVIBRATIONDAMPERTYPE = 3956297820; +var IFCVIBRATIONISOLATOR = 2391383451; +var IFCVIBRATIONISOLATORTYPE = 3313531582; +var IFCVIRTUALELEMENT = 2769231204; +var IFCVIRTUALGRIDINTERSECTION = 891718957; +var IFCVOIDINGFEATURE = 926996030; +var IFCWALL = 2391406946; +var IFCWALLELEMENTEDCASE = 4156078855; +var IFCWALLSTANDARDCASE = 3512223829; +var IFCWALLTYPE = 1898987631; +var IFCWASTETERMINAL = 4237592921; +var IFCWASTETERMINALTYPE = 1133259667; +var IFCWINDOW = 3304561284; +var IFCWINDOWLININGPROPERTIES = 336235671; +var IFCWINDOWPANELPROPERTIES = 512836454; +var IFCWINDOWSTANDARDCASE = 486154966; +var IFCWINDOWSTYLE = 1299126871; +var IFCWINDOWTYPE = 4009809668; +var IFCWORKCALENDAR = 4088093105; +var IFCWORKCONTROL = 1028945134; +var IFCWORKPLAN = 4218914973; +var IFCWORKSCHEDULE = 3342526732; +var IFCWORKTIME = 1236880293; +var IFCZSHAPEPROFILEDEF = 2543172580; +var IFCZONE = 1033361043; +var IfcElements = [ + 4288193352, + 1634111441, + 177149247, + 2056796094, + 3087945054, + 277319702, + 753842376, + 2906023776, + 32344328, + 2979338954, + 1095909175, + 2938176219, + 635142910, + 3758799889, + 1051757585, + 4217484030, + 3902619387, + 3296154744, + 1677625105, + 639361253, + 843113511, + 905975707, + 3221913625, + 3571504051, + 2272882330, + 25142252, + 4136498852, + 3640358203, + 1973544240, + 3495092785, + 4074379575, + 1335981549, + 1052013943, + 1062813311, + 1945004755, + 3040386961, + 395920057, + 3242481149, + 342316401, + 3518393246, + 1360408905, + 1904799276, + 862014818, + 3310460725, + 264262732, + 402227799, + 1003880860, + 4123344466, + 1658829314, + 2814081492, + 3747195512, + 484807127, + 3415622556, + 647756555, + 819412036, + 1426591983, + 2058353004, + 4278956645, + 182646315, + 2188021234, + 3132237377, + 987401354, + 707683696, + 2223149337, + 3508470533, + 900683007, + 263784265, + 1509553395, + 3493046030, + 3319311131, + 2068733104, + 4175244083, + 2176052936, + 76236018, + 629592764, + 377706215, + 1437502449, + 1073191201, + 1911478936, + 2474470126, + 3588315303, + 3079942009, + 3694346114, + 1687234759, + 310824031, + 3612865200, + 3171933400, + 1156407060, + 3651124850, + 738039164, + 2295281155, + 90941305, + 2262370178, + 3024970846, + 3283111854, + 979691226, + 2320036040, + 2016517767, + 3053780830, + 4086658281, + 1329646415, + 1529196076, + 3127900445, + 3027962421, + 3420628829, + 1999602285, + 1404847402, + 331165859, + 4252922144, + 3101698114, + 1162798199, + 413509423, + 812556717, + 3824725483, + 2347447852, + 3825984169, + 1620046519, + 3026737570, + 630975310, + 4292641817, + 4207607924, + 2391383451, + 2769231204, + 926996030, + 2391406946, + 4156078855, + 3512223829, + 4237592921, + 3304561284, + 486154966 +]; + +// dist/ifc2x4_helper.ts +var FromRawLineData = {}; +FromRawLineData[IFCACTIONREQUEST] = (d) => { + return IfcActionRequest.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCACTOR] = (d) => { + return IfcActor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCACTORROLE] = (d) => { + return IfcActorRole.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCACTUATOR] = (d) => { + return IfcActuator.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCACTUATORTYPE] = (d) => { + return IfcActuatorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCADDRESS] = (d) => { + return IfcAddress.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCADVANCEDBREP] = (d) => { + return IfcAdvancedBrep.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCADVANCEDBREPWITHVOIDS] = (d) => { + return IfcAdvancedBrepWithVoids.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCADVANCEDFACE] = (d) => { + return IfcAdvancedFace.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAIRTERMINAL] = (d) => { + return IfcAirTerminal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAIRTERMINALBOX] = (d) => { + return IfcAirTerminalBox.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAIRTERMINALBOXTYPE] = (d) => { + return IfcAirTerminalBoxType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAIRTERMINALTYPE] = (d) => { + return IfcAirTerminalType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAIRTOAIRHEATRECOVERY] = (d) => { + return IfcAirToAirHeatRecovery.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAIRTOAIRHEATRECOVERYTYPE] = (d) => { + return IfcAirToAirHeatRecoveryType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALARM] = (d) => { + return IfcAlarm.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALARMTYPE] = (d) => { + return IfcAlarmType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT] = (d) => { + return IfcAlignment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DHORIZONTAL] = (d) => { + return IfcAlignment2DHorizontal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DHORIZONTALSEGMENT] = (d) => { + return IfcAlignment2DHorizontalSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DSEGMENT] = (d) => { + return IfcAlignment2DSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DVERSEGCIRCULARARC] = (d) => { + return IfcAlignment2DVerSegCircularArc.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DVERSEGLINE] = (d) => { + return IfcAlignment2DVerSegLine.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DVERSEGPARABOLICARC] = (d) => { + return IfcAlignment2DVerSegParabolicArc.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DVERTICAL] = (d) => { + return IfcAlignment2DVertical.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENT2DVERTICALSEGMENT] = (d) => { + return IfcAlignment2DVerticalSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCALIGNMENTCURVE] = (d) => { + return IfcAlignmentCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCANNOTATION] = (d) => { + return IfcAnnotation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCANNOTATIONFILLAREA] = (d) => { + return IfcAnnotationFillArea.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAPPLICATION] = (d) => { + return IfcApplication.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAPPLIEDVALUE] = (d) => { + return IfcAppliedValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAPPROVAL] = (d) => { + return IfcApproval.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAPPROVALRELATIONSHIP] = (d) => { + return IfcApprovalRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCARBITRARYCLOSEDPROFILEDEF] = (d) => { + return IfcArbitraryClosedProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCARBITRARYOPENPROFILEDEF] = (d) => { + return IfcArbitraryOpenProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCARBITRARYPROFILEDEFWITHVOIDS] = (d) => { + return IfcArbitraryProfileDefWithVoids.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCASSET] = (d) => { + return IfcAsset.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCASYMMETRICISHAPEPROFILEDEF] = (d) => { + return IfcAsymmetricIShapeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAUDIOVISUALAPPLIANCE] = (d) => { + return IfcAudioVisualAppliance.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAUDIOVISUALAPPLIANCETYPE] = (d) => { + return IfcAudioVisualApplianceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAXIS1PLACEMENT] = (d) => { + return IfcAxis1Placement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAXIS2PLACEMENT2D] = (d) => { + return IfcAxis2Placement2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCAXIS2PLACEMENT3D] = (d) => { + return IfcAxis2Placement3D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBSPLINECURVE] = (d) => { + return IfcBSplineCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBSPLINECURVEWITHKNOTS] = (d) => { + return IfcBSplineCurveWithKnots.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBSPLINESURFACE] = (d) => { + return IfcBSplineSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBSPLINESURFACEWITHKNOTS] = (d) => { + return IfcBSplineSurfaceWithKnots.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBEAM] = (d) => { + return IfcBeam.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBEAMSTANDARDCASE] = (d) => { + return IfcBeamStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBEAMTYPE] = (d) => { + return IfcBeamType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBEARING] = (d) => { + return IfcBearing.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBEARINGTYPE] = (d) => { + return IfcBearingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBLOBTEXTURE] = (d) => { + return IfcBlobTexture.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBLOCK] = (d) => { + return IfcBlock.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOILER] = (d) => { + return IfcBoiler.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOILERTYPE] = (d) => { + return IfcBoilerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOOLEANCLIPPINGRESULT] = (d) => { + return IfcBooleanClippingResult.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOOLEANRESULT] = (d) => { + return IfcBooleanResult.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDARYCONDITION] = (d) => { + return IfcBoundaryCondition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDARYCURVE] = (d) => { + return IfcBoundaryCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDARYEDGECONDITION] = (d) => { + return IfcBoundaryEdgeCondition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDARYFACECONDITION] = (d) => { + return IfcBoundaryFaceCondition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDARYNODECONDITION] = (d) => { + return IfcBoundaryNodeCondition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDARYNODECONDITIONWARPING] = (d) => { + return IfcBoundaryNodeConditionWarping.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDEDCURVE] = (d) => { + return IfcBoundedCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDEDSURFACE] = (d) => { + return IfcBoundedSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOUNDINGBOX] = (d) => { + return IfcBoundingBox.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBOXEDHALFSPACE] = (d) => { + return IfcBoxedHalfSpace.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBRIDGE] = (d) => { + return IfcBridge.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBRIDGEPART] = (d) => { + return IfcBridgePart.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDING] = (d) => { + return IfcBuilding.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGELEMENT] = (d) => { + return IfcBuildingElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGELEMENTPART] = (d) => { + return IfcBuildingElementPart.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGELEMENTPARTTYPE] = (d) => { + return IfcBuildingElementPartType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGELEMENTPROXY] = (d) => { + return IfcBuildingElementProxy.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGELEMENTPROXYTYPE] = (d) => { + return IfcBuildingElementProxyType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGELEMENTTYPE] = (d) => { + return IfcBuildingElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGSTOREY] = (d) => { + return IfcBuildingStorey.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBUILDINGSYSTEM] = (d) => { + return IfcBuildingSystem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBURNER] = (d) => { + return IfcBurner.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCBURNERTYPE] = (d) => { + return IfcBurnerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCSHAPEPROFILEDEF] = (d) => { + return IfcCShapeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLECARRIERFITTING] = (d) => { + return IfcCableCarrierFitting.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLECARRIERFITTINGTYPE] = (d) => { + return IfcCableCarrierFittingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLECARRIERSEGMENT] = (d) => { + return IfcCableCarrierSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLECARRIERSEGMENTTYPE] = (d) => { + return IfcCableCarrierSegmentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLEFITTING] = (d) => { + return IfcCableFitting.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLEFITTINGTYPE] = (d) => { + return IfcCableFittingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLESEGMENT] = (d) => { + return IfcCableSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCABLESEGMENTTYPE] = (d) => { + return IfcCableSegmentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCAISSONFOUNDATION] = (d) => { + return IfcCaissonFoundation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCAISSONFOUNDATIONTYPE] = (d) => { + return IfcCaissonFoundationType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANPOINT] = (d) => { + return IfcCartesianPoint.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANPOINTLIST] = (d) => { + return IfcCartesianPointList.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANPOINTLIST2D] = (d) => { + return IfcCartesianPointList2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANPOINTLIST3D] = (d) => { + return IfcCartesianPointList3D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR] = (d) => { + return IfcCartesianTransformationOperator.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR2D] = (d) => { + return IfcCartesianTransformationOperator2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM] = (d) => { + return IfcCartesianTransformationOperator2DnonUniform.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR3D] = (d) => { + return IfcCartesianTransformationOperator3D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM] = (d) => { + return IfcCartesianTransformationOperator3DnonUniform.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCENTERLINEPROFILEDEF] = (d) => { + return IfcCenterLineProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCHILLER] = (d) => { + return IfcChiller.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCHILLERTYPE] = (d) => { + return IfcChillerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCHIMNEY] = (d) => { + return IfcChimney.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCHIMNEYTYPE] = (d) => { + return IfcChimneyType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCIRCLE] = (d) => { + return IfcCircle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCIRCLEHOLLOWPROFILEDEF] = (d) => { + return IfcCircleHollowProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCIRCLEPROFILEDEF] = (d) => { + return IfcCircleProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCIRCULARARCSEGMENT2D] = (d) => { + return IfcCircularArcSegment2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCIVILELEMENT] = (d) => { + return IfcCivilElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCIVILELEMENTTYPE] = (d) => { + return IfcCivilElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCLASSIFICATION] = (d) => { + return IfcClassification.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCLASSIFICATIONREFERENCE] = (d) => { + return IfcClassificationReference.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCLOSEDSHELL] = (d) => { + return IfcClosedShell.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOIL] = (d) => { + return IfcCoil.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOILTYPE] = (d) => { + return IfcCoilType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOLOURRGB] = (d) => { + return IfcColourRgb.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOLOURRGBLIST] = (d) => { + return IfcColourRgbList.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOLOURSPECIFICATION] = (d) => { + return IfcColourSpecification.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOLUMN] = (d) => { + return IfcColumn.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOLUMNSTANDARDCASE] = (d) => { + return IfcColumnStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOLUMNTYPE] = (d) => { + return IfcColumnType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMMUNICATIONSAPPLIANCE] = (d) => { + return IfcCommunicationsAppliance.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMMUNICATIONSAPPLIANCETYPE] = (d) => { + return IfcCommunicationsApplianceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPLEXPROPERTY] = (d) => { + return IfcComplexProperty.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPLEXPROPERTYTEMPLATE] = (d) => { + return IfcComplexPropertyTemplate.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPOSITECURVE] = (d) => { + return IfcCompositeCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPOSITECURVEONSURFACE] = (d) => { + return IfcCompositeCurveOnSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPOSITECURVESEGMENT] = (d) => { + return IfcCompositeCurveSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPOSITEPROFILEDEF] = (d) => { + return IfcCompositeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPRESSOR] = (d) => { + return IfcCompressor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOMPRESSORTYPE] = (d) => { + return IfcCompressorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONDENSER] = (d) => { + return IfcCondenser.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONDENSERTYPE] = (d) => { + return IfcCondenserType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONIC] = (d) => { + return IfcConic.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONNECTEDFACESET] = (d) => { + return IfcConnectedFaceSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONNECTIONCURVEGEOMETRY] = (d) => { + return IfcConnectionCurveGeometry.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONNECTIONGEOMETRY] = (d) => { + return IfcConnectionGeometry.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONNECTIONPOINTECCENTRICITY] = (d) => { + return IfcConnectionPointEccentricity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONNECTIONPOINTGEOMETRY] = (d) => { + return IfcConnectionPointGeometry.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONNECTIONSURFACEGEOMETRY] = (d) => { + return IfcConnectionSurfaceGeometry.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONNECTIONVOLUMEGEOMETRY] = (d) => { + return IfcConnectionVolumeGeometry.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRAINT] = (d) => { + return IfcConstraint.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONEQUIPMENTRESOURCE] = (d) => { + return IfcConstructionEquipmentResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE] = (d) => { + return IfcConstructionEquipmentResourceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONMATERIALRESOURCE] = (d) => { + return IfcConstructionMaterialResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONMATERIALRESOURCETYPE] = (d) => { + return IfcConstructionMaterialResourceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONPRODUCTRESOURCE] = (d) => { + return IfcConstructionProductResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONPRODUCTRESOURCETYPE] = (d) => { + return IfcConstructionProductResourceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONRESOURCE] = (d) => { + return IfcConstructionResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONSTRUCTIONRESOURCETYPE] = (d) => { + return IfcConstructionResourceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONTEXT] = (d) => { + return IfcContext.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONTEXTDEPENDENTUNIT] = (d) => { + return IfcContextDependentUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONTROL] = (d) => { + return IfcControl.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONTROLLER] = (d) => { + return IfcController.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONTROLLERTYPE] = (d) => { + return IfcControllerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONVERSIONBASEDUNIT] = (d) => { + return IfcConversionBasedUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCONVERSIONBASEDUNITWITHOFFSET] = (d) => { + return IfcConversionBasedUnitWithOffset.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOOLEDBEAM] = (d) => { + return IfcCooledBeam.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOOLEDBEAMTYPE] = (d) => { + return IfcCooledBeamType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOOLINGTOWER] = (d) => { + return IfcCoolingTower.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOOLINGTOWERTYPE] = (d) => { + return IfcCoolingTowerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOORDINATEOPERATION] = (d) => { + return IfcCoordinateOperation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOORDINATEREFERENCESYSTEM] = (d) => { + return IfcCoordinateReferenceSystem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOSTITEM] = (d) => { + return IfcCostItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOSTSCHEDULE] = (d) => { + return IfcCostSchedule.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOSTVALUE] = (d) => { + return IfcCostValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOVERING] = (d) => { + return IfcCovering.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCOVERINGTYPE] = (d) => { + return IfcCoveringType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCREWRESOURCE] = (d) => { + return IfcCrewResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCREWRESOURCETYPE] = (d) => { + return IfcCrewResourceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCSGPRIMITIVE3D] = (d) => { + return IfcCsgPrimitive3D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCSGSOLID] = (d) => { + return IfcCsgSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURRENCYRELATIONSHIP] = (d) => { + return IfcCurrencyRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURTAINWALL] = (d) => { + return IfcCurtainWall.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURTAINWALLTYPE] = (d) => { + return IfcCurtainWallType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVE] = (d) => { + return IfcCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVEBOUNDEDPLANE] = (d) => { + return IfcCurveBoundedPlane.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVEBOUNDEDSURFACE] = (d) => { + return IfcCurveBoundedSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVESEGMENT2D] = (d) => { + return IfcCurveSegment2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVESTYLE] = (d) => { + return IfcCurveStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVESTYLEFONT] = (d) => { + return IfcCurveStyleFont.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVESTYLEFONTANDSCALING] = (d) => { + return IfcCurveStyleFontAndScaling.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCURVESTYLEFONTPATTERN] = (d) => { + return IfcCurveStyleFontPattern.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCCYLINDRICALSURFACE] = (d) => { + return IfcCylindricalSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDAMPER] = (d) => { + return IfcDamper.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDAMPERTYPE] = (d) => { + return IfcDamperType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDEEPFOUNDATION] = (d) => { + return IfcDeepFoundation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDEEPFOUNDATIONTYPE] = (d) => { + return IfcDeepFoundationType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDERIVEDPROFILEDEF] = (d) => { + return IfcDerivedProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDERIVEDUNIT] = (d) => { + return IfcDerivedUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDERIVEDUNITELEMENT] = (d) => { + return IfcDerivedUnitElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDIMENSIONALEXPONENTS] = (d) => { + return IfcDimensionalExponents.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDIRECTION] = (d) => { + return IfcDirection.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISCRETEACCESSORY] = (d) => { + return IfcDiscreteAccessory.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISCRETEACCESSORYTYPE] = (d) => { + return IfcDiscreteAccessoryType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTANCEEXPRESSION] = (d) => { + return IfcDistanceExpression.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONCHAMBERELEMENT] = (d) => { + return IfcDistributionChamberElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONCHAMBERELEMENTTYPE] = (d) => { + return IfcDistributionChamberElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONCIRCUIT] = (d) => { + return IfcDistributionCircuit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONCONTROLELEMENT] = (d) => { + return IfcDistributionControlElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONCONTROLELEMENTTYPE] = (d) => { + return IfcDistributionControlElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONELEMENT] = (d) => { + return IfcDistributionElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONELEMENTTYPE] = (d) => { + return IfcDistributionElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONFLOWELEMENT] = (d) => { + return IfcDistributionFlowElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONFLOWELEMENTTYPE] = (d) => { + return IfcDistributionFlowElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONPORT] = (d) => { + return IfcDistributionPort.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDISTRIBUTIONSYSTEM] = (d) => { + return IfcDistributionSystem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOCUMENTINFORMATION] = (d) => { + return IfcDocumentInformation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOCUMENTINFORMATIONRELATIONSHIP] = (d) => { + return IfcDocumentInformationRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOCUMENTREFERENCE] = (d) => { + return IfcDocumentReference.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOOR] = (d) => { + return IfcDoor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOORLININGPROPERTIES] = (d) => { + return IfcDoorLiningProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOORPANELPROPERTIES] = (d) => { + return IfcDoorPanelProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOORSTANDARDCASE] = (d) => { + return IfcDoorStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOORSTYLE] = (d) => { + return IfcDoorStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDOORTYPE] = (d) => { + return IfcDoorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDRAUGHTINGPREDEFINEDCOLOUR] = (d) => { + return IfcDraughtingPreDefinedColour.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDRAUGHTINGPREDEFINEDCURVEFONT] = (d) => { + return IfcDraughtingPreDefinedCurveFont.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDUCTFITTING] = (d) => { + return IfcDuctFitting.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDUCTFITTINGTYPE] = (d) => { + return IfcDuctFittingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDUCTSEGMENT] = (d) => { + return IfcDuctSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDUCTSEGMENTTYPE] = (d) => { + return IfcDuctSegmentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDUCTSILENCER] = (d) => { + return IfcDuctSilencer.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCDUCTSILENCERTYPE] = (d) => { + return IfcDuctSilencerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEDGE] = (d) => { + return IfcEdge.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEDGECURVE] = (d) => { + return IfcEdgeCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEDGELOOP] = (d) => { + return IfcEdgeLoop.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICAPPLIANCE] = (d) => { + return IfcElectricAppliance.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICAPPLIANCETYPE] = (d) => { + return IfcElectricApplianceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICDISTRIBUTIONBOARD] = (d) => { + return IfcElectricDistributionBoard.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICDISTRIBUTIONBOARDTYPE] = (d) => { + return IfcElectricDistributionBoardType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICFLOWSTORAGEDEVICE] = (d) => { + return IfcElectricFlowStorageDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICFLOWSTORAGEDEVICETYPE] = (d) => { + return IfcElectricFlowStorageDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICGENERATOR] = (d) => { + return IfcElectricGenerator.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICGENERATORTYPE] = (d) => { + return IfcElectricGeneratorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICMOTOR] = (d) => { + return IfcElectricMotor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICMOTORTYPE] = (d) => { + return IfcElectricMotorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICTIMECONTROL] = (d) => { + return IfcElectricTimeControl.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELECTRICTIMECONTROLTYPE] = (d) => { + return IfcElectricTimeControlType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENT] = (d) => { + return IfcElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENTASSEMBLY] = (d) => { + return IfcElementAssembly.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENTASSEMBLYTYPE] = (d) => { + return IfcElementAssemblyType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENTCOMPONENT] = (d) => { + return IfcElementComponent.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENTCOMPONENTTYPE] = (d) => { + return IfcElementComponentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENTQUANTITY] = (d) => { + return IfcElementQuantity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENTTYPE] = (d) => { + return IfcElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELEMENTARYSURFACE] = (d) => { + return IfcElementarySurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELLIPSE] = (d) => { + return IfcEllipse.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCELLIPSEPROFILEDEF] = (d) => { + return IfcEllipseProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCENERGYCONVERSIONDEVICE] = (d) => { + return IfcEnergyConversionDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCENERGYCONVERSIONDEVICETYPE] = (d) => { + return IfcEnergyConversionDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCENGINE] = (d) => { + return IfcEngine.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCENGINETYPE] = (d) => { + return IfcEngineType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEVAPORATIVECOOLER] = (d) => { + return IfcEvaporativeCooler.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEVAPORATIVECOOLERTYPE] = (d) => { + return IfcEvaporativeCoolerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEVAPORATOR] = (d) => { + return IfcEvaporator.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEVAPORATORTYPE] = (d) => { + return IfcEvaporatorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEVENT] = (d) => { + return IfcEvent.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEVENTTIME] = (d) => { + return IfcEventTime.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEVENTTYPE] = (d) => { + return IfcEventType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTENDEDPROPERTIES] = (d) => { + return IfcExtendedProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALINFORMATION] = (d) => { + return IfcExternalInformation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALREFERENCE] = (d) => { + return IfcExternalReference.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALREFERENCERELATIONSHIP] = (d) => { + return IfcExternalReferenceRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALSPATIALELEMENT] = (d) => { + return IfcExternalSpatialElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALSPATIALSTRUCTUREELEMENT] = (d) => { + return IfcExternalSpatialStructureElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALLYDEFINEDHATCHSTYLE] = (d) => { + return IfcExternallyDefinedHatchStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALLYDEFINEDSURFACESTYLE] = (d) => { + return IfcExternallyDefinedSurfaceStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTERNALLYDEFINEDTEXTFONT] = (d) => { + return IfcExternallyDefinedTextFont.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTRUDEDAREASOLID] = (d) => { + return IfcExtrudedAreaSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCEXTRUDEDAREASOLIDTAPERED] = (d) => { + return IfcExtrudedAreaSolidTapered.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACE] = (d) => { + return IfcFace.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACEBASEDSURFACEMODEL] = (d) => { + return IfcFaceBasedSurfaceModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACEBOUND] = (d) => { + return IfcFaceBound.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACEOUTERBOUND] = (d) => { + return IfcFaceOuterBound.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACESURFACE] = (d) => { + return IfcFaceSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACETEDBREP] = (d) => { + return IfcFacetedBrep.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACETEDBREPWITHVOIDS] = (d) => { + return IfcFacetedBrepWithVoids.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACILITY] = (d) => { + return IfcFacility.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFACILITYPART] = (d) => { + return IfcFacilityPart.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFAILURECONNECTIONCONDITION] = (d) => { + return IfcFailureConnectionCondition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFAN] = (d) => { + return IfcFan.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFANTYPE] = (d) => { + return IfcFanType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFASTENER] = (d) => { + return IfcFastener.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFASTENERTYPE] = (d) => { + return IfcFastenerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFEATUREELEMENT] = (d) => { + return IfcFeatureElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFEATUREELEMENTADDITION] = (d) => { + return IfcFeatureElementAddition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFEATUREELEMENTSUBTRACTION] = (d) => { + return IfcFeatureElementSubtraction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFILLAREASTYLE] = (d) => { + return IfcFillAreaStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFILLAREASTYLEHATCHING] = (d) => { + return IfcFillAreaStyleHatching.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFILLAREASTYLETILES] = (d) => { + return IfcFillAreaStyleTiles.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFILTER] = (d) => { + return IfcFilter.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFILTERTYPE] = (d) => { + return IfcFilterType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFIRESUPPRESSIONTERMINAL] = (d) => { + return IfcFireSuppressionTerminal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFIRESUPPRESSIONTERMINALTYPE] = (d) => { + return IfcFireSuppressionTerminalType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFIXEDREFERENCESWEPTAREASOLID] = (d) => { + return IfcFixedReferenceSweptAreaSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWCONTROLLER] = (d) => { + return IfcFlowController.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWCONTROLLERTYPE] = (d) => { + return IfcFlowControllerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWFITTING] = (d) => { + return IfcFlowFitting.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWFITTINGTYPE] = (d) => { + return IfcFlowFittingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWINSTRUMENT] = (d) => { + return IfcFlowInstrument.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWINSTRUMENTTYPE] = (d) => { + return IfcFlowInstrumentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWMETER] = (d) => { + return IfcFlowMeter.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWMETERTYPE] = (d) => { + return IfcFlowMeterType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWMOVINGDEVICE] = (d) => { + return IfcFlowMovingDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWMOVINGDEVICETYPE] = (d) => { + return IfcFlowMovingDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWSEGMENT] = (d) => { + return IfcFlowSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWSEGMENTTYPE] = (d) => { + return IfcFlowSegmentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWSTORAGEDEVICE] = (d) => { + return IfcFlowStorageDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWSTORAGEDEVICETYPE] = (d) => { + return IfcFlowStorageDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWTERMINAL] = (d) => { + return IfcFlowTerminal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWTERMINALTYPE] = (d) => { + return IfcFlowTerminalType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWTREATMENTDEVICE] = (d) => { + return IfcFlowTreatmentDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFLOWTREATMENTDEVICETYPE] = (d) => { + return IfcFlowTreatmentDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFOOTING] = (d) => { + return IfcFooting.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFOOTINGTYPE] = (d) => { + return IfcFootingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFURNISHINGELEMENT] = (d) => { + return IfcFurnishingElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFURNISHINGELEMENTTYPE] = (d) => { + return IfcFurnishingElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFURNITURE] = (d) => { + return IfcFurniture.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCFURNITURETYPE] = (d) => { + return IfcFurnitureType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGEOGRAPHICELEMENT] = (d) => { + return IfcGeographicElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGEOGRAPHICELEMENTTYPE] = (d) => { + return IfcGeographicElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGEOMETRICCURVESET] = (d) => { + return IfcGeometricCurveSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGEOMETRICREPRESENTATIONCONTEXT] = (d) => { + return IfcGeometricRepresentationContext.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGEOMETRICREPRESENTATIONITEM] = (d) => { + return IfcGeometricRepresentationItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGEOMETRICREPRESENTATIONSUBCONTEXT] = (d) => { + return IfcGeometricRepresentationSubContext.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGEOMETRICSET] = (d) => { + return IfcGeometricSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGRID] = (d) => { + return IfcGrid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGRIDAXIS] = (d) => { + return IfcGridAxis.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGRIDPLACEMENT] = (d) => { + return IfcGridPlacement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCGROUP] = (d) => { + return IfcGroup.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCHALFSPACESOLID] = (d) => { + return IfcHalfSpaceSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCHEATEXCHANGER] = (d) => { + return IfcHeatExchanger.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCHEATEXCHANGERTYPE] = (d) => { + return IfcHeatExchangerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCHUMIDIFIER] = (d) => { + return IfcHumidifier.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCHUMIDIFIERTYPE] = (d) => { + return IfcHumidifierType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCISHAPEPROFILEDEF] = (d) => { + return IfcIShapeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCIMAGETEXTURE] = (d) => { + return IfcImageTexture.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINDEXEDCOLOURMAP] = (d) => { + return IfcIndexedColourMap.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINDEXEDPOLYCURVE] = (d) => { + return IfcIndexedPolyCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINDEXEDPOLYGONALFACE] = (d) => { + return IfcIndexedPolygonalFace.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINDEXEDPOLYGONALFACEWITHVOIDS] = (d) => { + return IfcIndexedPolygonalFaceWithVoids.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINDEXEDTEXTUREMAP] = (d) => { + return IfcIndexedTextureMap.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINDEXEDTRIANGLETEXTUREMAP] = (d) => { + return IfcIndexedTriangleTextureMap.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINTERCEPTOR] = (d) => { + return IfcInterceptor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINTERCEPTORTYPE] = (d) => { + return IfcInterceptorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINTERSECTIONCURVE] = (d) => { + return IfcIntersectionCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCINVENTORY] = (d) => { + return IfcInventory.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCIRREGULARTIMESERIES] = (d) => { + return IfcIrregularTimeSeries.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCIRREGULARTIMESERIESVALUE] = (d) => { + return IfcIrregularTimeSeriesValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCJUNCTIONBOX] = (d) => { + return IfcJunctionBox.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCJUNCTIONBOXTYPE] = (d) => { + return IfcJunctionBoxType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLSHAPEPROFILEDEF] = (d) => { + return IfcLShapeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLABORRESOURCE] = (d) => { + return IfcLaborResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLABORRESOURCETYPE] = (d) => { + return IfcLaborResourceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLAGTIME] = (d) => { + return IfcLagTime.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLAMP] = (d) => { + return IfcLamp.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLAMPTYPE] = (d) => { + return IfcLampType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIBRARYINFORMATION] = (d) => { + return IfcLibraryInformation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIBRARYREFERENCE] = (d) => { + return IfcLibraryReference.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTDISTRIBUTIONDATA] = (d) => { + return IfcLightDistributionData.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTFIXTURE] = (d) => { + return IfcLightFixture.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTFIXTURETYPE] = (d) => { + return IfcLightFixtureType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTINTENSITYDISTRIBUTION] = (d) => { + return IfcLightIntensityDistribution.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTSOURCE] = (d) => { + return IfcLightSource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTSOURCEAMBIENT] = (d) => { + return IfcLightSourceAmbient.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTSOURCEDIRECTIONAL] = (d) => { + return IfcLightSourceDirectional.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTSOURCEGONIOMETRIC] = (d) => { + return IfcLightSourceGoniometric.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTSOURCEPOSITIONAL] = (d) => { + return IfcLightSourcePositional.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLIGHTSOURCESPOT] = (d) => { + return IfcLightSourceSpot.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLINE] = (d) => { + return IfcLine.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLINESEGMENT2D] = (d) => { + return IfcLineSegment2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLINEARPLACEMENT] = (d) => { + return IfcLinearPlacement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLINEARPOSITIONINGELEMENT] = (d) => { + return IfcLinearPositioningElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLOCALPLACEMENT] = (d) => { + return IfcLocalPlacement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCLOOP] = (d) => { + return IfcLoop.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMANIFOLDSOLIDBREP] = (d) => { + return IfcManifoldSolidBrep.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMAPCONVERSION] = (d) => { + return IfcMapConversion.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMAPPEDITEM] = (d) => { + return IfcMappedItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIAL] = (d) => { + return IfcMaterial.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALCLASSIFICATIONRELATIONSHIP] = (d) => { + return IfcMaterialClassificationRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALCONSTITUENT] = (d) => { + return IfcMaterialConstituent.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALCONSTITUENTSET] = (d) => { + return IfcMaterialConstituentSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALDEFINITION] = (d) => { + return IfcMaterialDefinition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALDEFINITIONREPRESENTATION] = (d) => { + return IfcMaterialDefinitionRepresentation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALLAYER] = (d) => { + return IfcMaterialLayer.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALLAYERSET] = (d) => { + return IfcMaterialLayerSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALLAYERSETUSAGE] = (d) => { + return IfcMaterialLayerSetUsage.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALLAYERWITHOFFSETS] = (d) => { + return IfcMaterialLayerWithOffsets.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALLIST] = (d) => { + return IfcMaterialList.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALPROFILE] = (d) => { + return IfcMaterialProfile.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALPROFILESET] = (d) => { + return IfcMaterialProfileSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALPROFILESETUSAGE] = (d) => { + return IfcMaterialProfileSetUsage.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALPROFILESETUSAGETAPERING] = (d) => { + return IfcMaterialProfileSetUsageTapering.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALPROFILEWITHOFFSETS] = (d) => { + return IfcMaterialProfileWithOffsets.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALPROPERTIES] = (d) => { + return IfcMaterialProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALRELATIONSHIP] = (d) => { + return IfcMaterialRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMATERIALUSAGEDEFINITION] = (d) => { + return IfcMaterialUsageDefinition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMEASUREWITHUNIT] = (d) => { + return IfcMeasureWithUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMECHANICALFASTENER] = (d) => { + return IfcMechanicalFastener.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMECHANICALFASTENERTYPE] = (d) => { + return IfcMechanicalFastenerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMEDICALDEVICE] = (d) => { + return IfcMedicalDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMEDICALDEVICETYPE] = (d) => { + return IfcMedicalDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMEMBER] = (d) => { + return IfcMember.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMEMBERSTANDARDCASE] = (d) => { + return IfcMemberStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMEMBERTYPE] = (d) => { + return IfcMemberType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMETRIC] = (d) => { + return IfcMetric.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMIRROREDPROFILEDEF] = (d) => { + return IfcMirroredProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMONETARYUNIT] = (d) => { + return IfcMonetaryUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMOTORCONNECTION] = (d) => { + return IfcMotorConnection.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCMOTORCONNECTIONTYPE] = (d) => { + return IfcMotorConnectionType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCNAMEDUNIT] = (d) => { + return IfcNamedUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOBJECT] = (d) => { + return IfcObject.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOBJECTDEFINITION] = (d) => { + return IfcObjectDefinition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOBJECTPLACEMENT] = (d) => { + return IfcObjectPlacement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOBJECTIVE] = (d) => { + return IfcObjective.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOCCUPANT] = (d) => { + return IfcOccupant.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOFFSETCURVE] = (d) => { + return IfcOffsetCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOFFSETCURVE2D] = (d) => { + return IfcOffsetCurve2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOFFSETCURVE3D] = (d) => { + return IfcOffsetCurve3D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOFFSETCURVEBYDISTANCES] = (d) => { + return IfcOffsetCurveByDistances.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOPENSHELL] = (d) => { + return IfcOpenShell.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOPENINGELEMENT] = (d) => { + return IfcOpeningElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOPENINGSTANDARDCASE] = (d) => { + return IfcOpeningStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCORGANIZATION] = (d) => { + return IfcOrganization.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCORGANIZATIONRELATIONSHIP] = (d) => { + return IfcOrganizationRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCORIENTATIONEXPRESSION] = (d) => { + return IfcOrientationExpression.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCORIENTEDEDGE] = (d) => { + return IfcOrientedEdge.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOUTERBOUNDARYCURVE] = (d) => { + return IfcOuterBoundaryCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOUTLET] = (d) => { + return IfcOutlet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOUTLETTYPE] = (d) => { + return IfcOutletType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCOWNERHISTORY] = (d) => { + return IfcOwnerHistory.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPARAMETERIZEDPROFILEDEF] = (d) => { + return IfcParameterizedProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPATH] = (d) => { + return IfcPath.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPCURVE] = (d) => { + return IfcPcurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPERFORMANCEHISTORY] = (d) => { + return IfcPerformanceHistory.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPERMEABLECOVERINGPROPERTIES] = (d) => { + return IfcPermeableCoveringProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPERMIT] = (d) => { + return IfcPermit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPERSON] = (d) => { + return IfcPerson.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPERSONANDORGANIZATION] = (d) => { + return IfcPersonAndOrganization.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPHYSICALCOMPLEXQUANTITY] = (d) => { + return IfcPhysicalComplexQuantity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPHYSICALQUANTITY] = (d) => { + return IfcPhysicalQuantity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPHYSICALSIMPLEQUANTITY] = (d) => { + return IfcPhysicalSimpleQuantity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPILE] = (d) => { + return IfcPile.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPILETYPE] = (d) => { + return IfcPileType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPIPEFITTING] = (d) => { + return IfcPipeFitting.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPIPEFITTINGTYPE] = (d) => { + return IfcPipeFittingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPIPESEGMENT] = (d) => { + return IfcPipeSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPIPESEGMENTTYPE] = (d) => { + return IfcPipeSegmentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPIXELTEXTURE] = (d) => { + return IfcPixelTexture.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPLACEMENT] = (d) => { + return IfcPlacement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPLANARBOX] = (d) => { + return IfcPlanarBox.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPLANAREXTENT] = (d) => { + return IfcPlanarExtent.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPLANE] = (d) => { + return IfcPlane.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPLATE] = (d) => { + return IfcPlate.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPLATESTANDARDCASE] = (d) => { + return IfcPlateStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPLATETYPE] = (d) => { + return IfcPlateType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOINT] = (d) => { + return IfcPoint.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOINTONCURVE] = (d) => { + return IfcPointOnCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOINTONSURFACE] = (d) => { + return IfcPointOnSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOLYLOOP] = (d) => { + return IfcPolyLoop.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOLYGONALBOUNDEDHALFSPACE] = (d) => { + return IfcPolygonalBoundedHalfSpace.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOLYGONALFACESET] = (d) => { + return IfcPolygonalFaceSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOLYLINE] = (d) => { + return IfcPolyline.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPORT] = (d) => { + return IfcPort.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOSITIONINGELEMENT] = (d) => { + return IfcPositioningElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPOSTALADDRESS] = (d) => { + return IfcPostalAddress.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPREDEFINEDCOLOUR] = (d) => { + return IfcPreDefinedColour.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPREDEFINEDCURVEFONT] = (d) => { + return IfcPreDefinedCurveFont.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPREDEFINEDITEM] = (d) => { + return IfcPreDefinedItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPREDEFINEDPROPERTIES] = (d) => { + return IfcPreDefinedProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPREDEFINEDPROPERTYSET] = (d) => { + return IfcPreDefinedPropertySet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPREDEFINEDTEXTFONT] = (d) => { + return IfcPreDefinedTextFont.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRESENTATIONITEM] = (d) => { + return IfcPresentationItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRESENTATIONLAYERASSIGNMENT] = (d) => { + return IfcPresentationLayerAssignment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRESENTATIONLAYERWITHSTYLE] = (d) => { + return IfcPresentationLayerWithStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRESENTATIONSTYLE] = (d) => { + return IfcPresentationStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRESENTATIONSTYLEASSIGNMENT] = (d) => { + return IfcPresentationStyleAssignment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROCEDURE] = (d) => { + return IfcProcedure.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROCEDURETYPE] = (d) => { + return IfcProcedureType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROCESS] = (d) => { + return IfcProcess.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRODUCT] = (d) => { + return IfcProduct.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRODUCTDEFINITIONSHAPE] = (d) => { + return IfcProductDefinitionShape.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPRODUCTREPRESENTATION] = (d) => { + return IfcProductRepresentation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROFILEDEF] = (d) => { + return IfcProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROFILEPROPERTIES] = (d) => { + return IfcProfileProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROJECT] = (d) => { + return IfcProject.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROJECTLIBRARY] = (d) => { + return IfcProjectLibrary.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROJECTORDER] = (d) => { + return IfcProjectOrder.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROJECTEDCRS] = (d) => { + return IfcProjectedCRS.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROJECTIONELEMENT] = (d) => { + return IfcProjectionElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTY] = (d) => { + return IfcProperty.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYABSTRACTION] = (d) => { + return IfcPropertyAbstraction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYBOUNDEDVALUE] = (d) => { + return IfcPropertyBoundedValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYDEFINITION] = (d) => { + return IfcPropertyDefinition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYDEPENDENCYRELATIONSHIP] = (d) => { + return IfcPropertyDependencyRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYENUMERATEDVALUE] = (d) => { + return IfcPropertyEnumeratedValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYENUMERATION] = (d) => { + return IfcPropertyEnumeration.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYLISTVALUE] = (d) => { + return IfcPropertyListValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYREFERENCEVALUE] = (d) => { + return IfcPropertyReferenceValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYSET] = (d) => { + return IfcPropertySet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYSETDEFINITION] = (d) => { + return IfcPropertySetDefinition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYSETTEMPLATE] = (d) => { + return IfcPropertySetTemplate.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYSINGLEVALUE] = (d) => { + return IfcPropertySingleValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYTABLEVALUE] = (d) => { + return IfcPropertyTableValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYTEMPLATE] = (d) => { + return IfcPropertyTemplate.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROPERTYTEMPLATEDEFINITION] = (d) => { + return IfcPropertyTemplateDefinition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROTECTIVEDEVICE] = (d) => { + return IfcProtectiveDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROTECTIVEDEVICETRIPPINGUNIT] = (d) => { + return IfcProtectiveDeviceTrippingUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROTECTIVEDEVICETRIPPINGUNITTYPE] = (d) => { + return IfcProtectiveDeviceTrippingUnitType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROTECTIVEDEVICETYPE] = (d) => { + return IfcProtectiveDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPROXY] = (d) => { + return IfcProxy.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPUMP] = (d) => { + return IfcPump.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCPUMPTYPE] = (d) => { + return IfcPumpType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCQUANTITYAREA] = (d) => { + return IfcQuantityArea.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCQUANTITYCOUNT] = (d) => { + return IfcQuantityCount.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCQUANTITYLENGTH] = (d) => { + return IfcQuantityLength.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCQUANTITYSET] = (d) => { + return IfcQuantitySet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCQUANTITYTIME] = (d) => { + return IfcQuantityTime.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCQUANTITYVOLUME] = (d) => { + return IfcQuantityVolume.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCQUANTITYWEIGHT] = (d) => { + return IfcQuantityWeight.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRAILING] = (d) => { + return IfcRailing.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRAILINGTYPE] = (d) => { + return IfcRailingType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRAMP] = (d) => { + return IfcRamp.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRAMPFLIGHT] = (d) => { + return IfcRampFlight.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRAMPFLIGHTTYPE] = (d) => { + return IfcRampFlightType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRAMPTYPE] = (d) => { + return IfcRampType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRATIONALBSPLINECURVEWITHKNOTS] = (d) => { + return IfcRationalBSplineCurveWithKnots.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRATIONALBSPLINESURFACEWITHKNOTS] = (d) => { + return IfcRationalBSplineSurfaceWithKnots.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRECTANGLEHOLLOWPROFILEDEF] = (d) => { + return IfcRectangleHollowProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRECTANGLEPROFILEDEF] = (d) => { + return IfcRectangleProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRECTANGULARPYRAMID] = (d) => { + return IfcRectangularPyramid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRECTANGULARTRIMMEDSURFACE] = (d) => { + return IfcRectangularTrimmedSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRECURRENCEPATTERN] = (d) => { + return IfcRecurrencePattern.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREFERENCE] = (d) => { + return IfcReference.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREFERENT] = (d) => { + return IfcReferent.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREGULARTIMESERIES] = (d) => { + return IfcRegularTimeSeries.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCEMENTBARPROPERTIES] = (d) => { + return IfcReinforcementBarProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCEMENTDEFINITIONPROPERTIES] = (d) => { + return IfcReinforcementDefinitionProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCINGBAR] = (d) => { + return IfcReinforcingBar.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCINGBARTYPE] = (d) => { + return IfcReinforcingBarType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCINGELEMENT] = (d) => { + return IfcReinforcingElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCINGELEMENTTYPE] = (d) => { + return IfcReinforcingElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCINGMESH] = (d) => { + return IfcReinforcingMesh.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREINFORCINGMESHTYPE] = (d) => { + return IfcReinforcingMeshType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELAGGREGATES] = (d) => { + return IfcRelAggregates.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNS] = (d) => { + return IfcRelAssigns.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNSTOACTOR] = (d) => { + return IfcRelAssignsToActor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNSTOCONTROL] = (d) => { + return IfcRelAssignsToControl.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNSTOGROUP] = (d) => { + return IfcRelAssignsToGroup.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNSTOGROUPBYFACTOR] = (d) => { + return IfcRelAssignsToGroupByFactor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNSTOPROCESS] = (d) => { + return IfcRelAssignsToProcess.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNSTOPRODUCT] = (d) => { + return IfcRelAssignsToProduct.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSIGNSTORESOURCE] = (d) => { + return IfcRelAssignsToResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSOCIATES] = (d) => { + return IfcRelAssociates.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSOCIATESAPPROVAL] = (d) => { + return IfcRelAssociatesApproval.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSOCIATESCLASSIFICATION] = (d) => { + return IfcRelAssociatesClassification.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSOCIATESCONSTRAINT] = (d) => { + return IfcRelAssociatesConstraint.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSOCIATESDOCUMENT] = (d) => { + return IfcRelAssociatesDocument.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSOCIATESLIBRARY] = (d) => { + return IfcRelAssociatesLibrary.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELASSOCIATESMATERIAL] = (d) => { + return IfcRelAssociatesMaterial.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTS] = (d) => { + return IfcRelConnects.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSELEMENTS] = (d) => { + return IfcRelConnectsElements.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSPATHELEMENTS] = (d) => { + return IfcRelConnectsPathElements.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSPORTTOELEMENT] = (d) => { + return IfcRelConnectsPortToElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSPORTS] = (d) => { + return IfcRelConnectsPorts.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSSTRUCTURALACTIVITY] = (d) => { + return IfcRelConnectsStructuralActivity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSSTRUCTURALMEMBER] = (d) => { + return IfcRelConnectsStructuralMember.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSWITHECCENTRICITY] = (d) => { + return IfcRelConnectsWithEccentricity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONNECTSWITHREALIZINGELEMENTS] = (d) => { + return IfcRelConnectsWithRealizingElements.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCONTAINEDINSPATIALSTRUCTURE] = (d) => { + return IfcRelContainedInSpatialStructure.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCOVERSBLDGELEMENTS] = (d) => { + return IfcRelCoversBldgElements.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELCOVERSSPACES] = (d) => { + return IfcRelCoversSpaces.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELDECLARES] = (d) => { + return IfcRelDeclares.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELDECOMPOSES] = (d) => { + return IfcRelDecomposes.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELDEFINES] = (d) => { + return IfcRelDefines.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELDEFINESBYOBJECT] = (d) => { + return IfcRelDefinesByObject.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELDEFINESBYPROPERTIES] = (d) => { + return IfcRelDefinesByProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELDEFINESBYTEMPLATE] = (d) => { + return IfcRelDefinesByTemplate.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELDEFINESBYTYPE] = (d) => { + return IfcRelDefinesByType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELFILLSELEMENT] = (d) => { + return IfcRelFillsElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELFLOWCONTROLELEMENTS] = (d) => { + return IfcRelFlowControlElements.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELINTERFERESELEMENTS] = (d) => { + return IfcRelInterferesElements.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELNESTS] = (d) => { + return IfcRelNests.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELPOSITIONS] = (d) => { + return IfcRelPositions.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELPROJECTSELEMENT] = (d) => { + return IfcRelProjectsElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELREFERENCEDINSPATIALSTRUCTURE] = (d) => { + return IfcRelReferencedInSpatialStructure.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELSEQUENCE] = (d) => { + return IfcRelSequence.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELSERVICESBUILDINGS] = (d) => { + return IfcRelServicesBuildings.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELSPACEBOUNDARY] = (d) => { + return IfcRelSpaceBoundary.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELSPACEBOUNDARY1STLEVEL] = (d) => { + return IfcRelSpaceBoundary1stLevel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELSPACEBOUNDARY2NDLEVEL] = (d) => { + return IfcRelSpaceBoundary2ndLevel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELVOIDSELEMENT] = (d) => { + return IfcRelVoidsElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRELATIONSHIP] = (d) => { + return IfcRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREPARAMETRISEDCOMPOSITECURVESEGMENT] = (d) => { + return IfcReparametrisedCompositeCurveSegment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREPRESENTATION] = (d) => { + return IfcRepresentation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREPRESENTATIONCONTEXT] = (d) => { + return IfcRepresentationContext.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREPRESENTATIONITEM] = (d) => { + return IfcRepresentationItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREPRESENTATIONMAP] = (d) => { + return IfcRepresentationMap.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRESOURCE] = (d) => { + return IfcResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRESOURCEAPPROVALRELATIONSHIP] = (d) => { + return IfcResourceApprovalRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRESOURCECONSTRAINTRELATIONSHIP] = (d) => { + return IfcResourceConstraintRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRESOURCELEVELRELATIONSHIP] = (d) => { + return IfcResourceLevelRelationship.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRESOURCETIME] = (d) => { + return IfcResourceTime.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREVOLVEDAREASOLID] = (d) => { + return IfcRevolvedAreaSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCREVOLVEDAREASOLIDTAPERED] = (d) => { + return IfcRevolvedAreaSolidTapered.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRIGHTCIRCULARCONE] = (d) => { + return IfcRightCircularCone.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCRIGHTCIRCULARCYLINDER] = (d) => { + return IfcRightCircularCylinder.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCROOF] = (d) => { + return IfcRoof.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCROOFTYPE] = (d) => { + return IfcRoofType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCROOT] = (d) => { + return IfcRoot.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCROUNDEDRECTANGLEPROFILEDEF] = (d) => { + return IfcRoundedRectangleProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSIUNIT] = (d) => { + return IfcSIUnit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSANITARYTERMINAL] = (d) => { + return IfcSanitaryTerminal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSANITARYTERMINALTYPE] = (d) => { + return IfcSanitaryTerminalType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSCHEDULINGTIME] = (d) => { + return IfcSchedulingTime.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSEAMCURVE] = (d) => { + return IfcSeamCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSECTIONPROPERTIES] = (d) => { + return IfcSectionProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSECTIONREINFORCEMENTPROPERTIES] = (d) => { + return IfcSectionReinforcementProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSECTIONEDSOLID] = (d) => { + return IfcSectionedSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSECTIONEDSOLIDHORIZONTAL] = (d) => { + return IfcSectionedSolidHorizontal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSECTIONEDSPINE] = (d) => { + return IfcSectionedSpine.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSENSOR] = (d) => { + return IfcSensor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSENSORTYPE] = (d) => { + return IfcSensorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSHADINGDEVICE] = (d) => { + return IfcShadingDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSHADINGDEVICETYPE] = (d) => { + return IfcShadingDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSHAPEASPECT] = (d) => { + return IfcShapeAspect.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSHAPEMODEL] = (d) => { + return IfcShapeModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSHAPEREPRESENTATION] = (d) => { + return IfcShapeRepresentation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSHELLBASEDSURFACEMODEL] = (d) => { + return IfcShellBasedSurfaceModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSIMPLEPROPERTY] = (d) => { + return IfcSimpleProperty.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSIMPLEPROPERTYTEMPLATE] = (d) => { + return IfcSimplePropertyTemplate.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSITE] = (d) => { + return IfcSite.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSLAB] = (d) => { + return IfcSlab.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSLABELEMENTEDCASE] = (d) => { + return IfcSlabElementedCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSLABSTANDARDCASE] = (d) => { + return IfcSlabStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSLABTYPE] = (d) => { + return IfcSlabType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSLIPPAGECONNECTIONCONDITION] = (d) => { + return IfcSlippageConnectionCondition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSOLARDEVICE] = (d) => { + return IfcSolarDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSOLARDEVICETYPE] = (d) => { + return IfcSolarDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSOLIDMODEL] = (d) => { + return IfcSolidModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPACE] = (d) => { + return IfcSpace.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPACEHEATER] = (d) => { + return IfcSpaceHeater.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPACEHEATERTYPE] = (d) => { + return IfcSpaceHeaterType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPACETYPE] = (d) => { + return IfcSpaceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPATIALELEMENT] = (d) => { + return IfcSpatialElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPATIALELEMENTTYPE] = (d) => { + return IfcSpatialElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPATIALSTRUCTUREELEMENT] = (d) => { + return IfcSpatialStructureElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPATIALSTRUCTUREELEMENTTYPE] = (d) => { + return IfcSpatialStructureElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPATIALZONE] = (d) => { + return IfcSpatialZone.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPATIALZONETYPE] = (d) => { + return IfcSpatialZoneType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPHERE] = (d) => { + return IfcSphere.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSPHERICALSURFACE] = (d) => { + return IfcSphericalSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTACKTERMINAL] = (d) => { + return IfcStackTerminal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTACKTERMINALTYPE] = (d) => { + return IfcStackTerminalType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTAIR] = (d) => { + return IfcStair.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTAIRFLIGHT] = (d) => { + return IfcStairFlight.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTAIRFLIGHTTYPE] = (d) => { + return IfcStairFlightType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTAIRTYPE] = (d) => { + return IfcStairType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALACTION] = (d) => { + return IfcStructuralAction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALACTIVITY] = (d) => { + return IfcStructuralActivity.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALANALYSISMODEL] = (d) => { + return IfcStructuralAnalysisModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALCONNECTION] = (d) => { + return IfcStructuralConnection.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALCONNECTIONCONDITION] = (d) => { + return IfcStructuralConnectionCondition.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALCURVEACTION] = (d) => { + return IfcStructuralCurveAction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALCURVECONNECTION] = (d) => { + return IfcStructuralCurveConnection.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALCURVEMEMBER] = (d) => { + return IfcStructuralCurveMember.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALCURVEMEMBERVARYING] = (d) => { + return IfcStructuralCurveMemberVarying.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALCURVEREACTION] = (d) => { + return IfcStructuralCurveReaction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALITEM] = (d) => { + return IfcStructuralItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLINEARACTION] = (d) => { + return IfcStructuralLinearAction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOAD] = (d) => { + return IfcStructuralLoad.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADCASE] = (d) => { + return IfcStructuralLoadCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADCONFIGURATION] = (d) => { + return IfcStructuralLoadConfiguration.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADGROUP] = (d) => { + return IfcStructuralLoadGroup.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADLINEARFORCE] = (d) => { + return IfcStructuralLoadLinearForce.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADORRESULT] = (d) => { + return IfcStructuralLoadOrResult.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADPLANARFORCE] = (d) => { + return IfcStructuralLoadPlanarForce.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADSINGLEDISPLACEMENT] = (d) => { + return IfcStructuralLoadSingleDisplacement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION] = (d) => { + return IfcStructuralLoadSingleDisplacementDistortion.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADSINGLEFORCE] = (d) => { + return IfcStructuralLoadSingleForce.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADSINGLEFORCEWARPING] = (d) => { + return IfcStructuralLoadSingleForceWarping.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADSTATIC] = (d) => { + return IfcStructuralLoadStatic.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALLOADTEMPERATURE] = (d) => { + return IfcStructuralLoadTemperature.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALMEMBER] = (d) => { + return IfcStructuralMember.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALPLANARACTION] = (d) => { + return IfcStructuralPlanarAction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALPOINTACTION] = (d) => { + return IfcStructuralPointAction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALPOINTCONNECTION] = (d) => { + return IfcStructuralPointConnection.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALPOINTREACTION] = (d) => { + return IfcStructuralPointReaction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALREACTION] = (d) => { + return IfcStructuralReaction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALRESULTGROUP] = (d) => { + return IfcStructuralResultGroup.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALSURFACEACTION] = (d) => { + return IfcStructuralSurfaceAction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALSURFACECONNECTION] = (d) => { + return IfcStructuralSurfaceConnection.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALSURFACEMEMBER] = (d) => { + return IfcStructuralSurfaceMember.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALSURFACEMEMBERVARYING] = (d) => { + return IfcStructuralSurfaceMemberVarying.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTRUCTURALSURFACEREACTION] = (d) => { + return IfcStructuralSurfaceReaction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTYLEMODEL] = (d) => { + return IfcStyleModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTYLEDITEM] = (d) => { + return IfcStyledItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSTYLEDREPRESENTATION] = (d) => { + return IfcStyledRepresentation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSUBCONTRACTRESOURCE] = (d) => { + return IfcSubContractResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSUBCONTRACTRESOURCETYPE] = (d) => { + return IfcSubContractResourceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSUBEDGE] = (d) => { + return IfcSubedge.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACE] = (d) => { + return IfcSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACECURVE] = (d) => { + return IfcSurfaceCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACECURVESWEPTAREASOLID] = (d) => { + return IfcSurfaceCurveSweptAreaSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACEFEATURE] = (d) => { + return IfcSurfaceFeature.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACEOFLINEAREXTRUSION] = (d) => { + return IfcSurfaceOfLinearExtrusion.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACEOFREVOLUTION] = (d) => { + return IfcSurfaceOfRevolution.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACEREINFORCEMENTAREA] = (d) => { + return IfcSurfaceReinforcementArea.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACESTYLE] = (d) => { + return IfcSurfaceStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACESTYLELIGHTING] = (d) => { + return IfcSurfaceStyleLighting.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACESTYLEREFRACTION] = (d) => { + return IfcSurfaceStyleRefraction.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACESTYLERENDERING] = (d) => { + return IfcSurfaceStyleRendering.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACESTYLESHADING] = (d) => { + return IfcSurfaceStyleShading.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACESTYLEWITHTEXTURES] = (d) => { + return IfcSurfaceStyleWithTextures.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSURFACETEXTURE] = (d) => { + return IfcSurfaceTexture.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSWEPTAREASOLID] = (d) => { + return IfcSweptAreaSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSWEPTDISKSOLID] = (d) => { + return IfcSweptDiskSolid.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSWEPTDISKSOLIDPOLYGONAL] = (d) => { + return IfcSweptDiskSolidPolygonal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSWEPTSURFACE] = (d) => { + return IfcSweptSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSWITCHINGDEVICE] = (d) => { + return IfcSwitchingDevice.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSWITCHINGDEVICETYPE] = (d) => { + return IfcSwitchingDeviceType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSYSTEM] = (d) => { + return IfcSystem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSYSTEMFURNITUREELEMENT] = (d) => { + return IfcSystemFurnitureElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCSYSTEMFURNITUREELEMENTTYPE] = (d) => { + return IfcSystemFurnitureElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTSHAPEPROFILEDEF] = (d) => { + return IfcTShapeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTABLE] = (d) => { + return IfcTable.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTABLECOLUMN] = (d) => { + return IfcTableColumn.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTABLEROW] = (d) => { + return IfcTableRow.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTANK] = (d) => { + return IfcTank.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTANKTYPE] = (d) => { + return IfcTankType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTASK] = (d) => { + return IfcTask.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTASKTIME] = (d) => { + return IfcTaskTime.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTASKTIMERECURRING] = (d) => { + return IfcTaskTimeRecurring.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTASKTYPE] = (d) => { + return IfcTaskType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTELECOMADDRESS] = (d) => { + return IfcTelecomAddress.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTENDON] = (d) => { + return IfcTendon.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTENDONANCHOR] = (d) => { + return IfcTendonAnchor.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTENDONANCHORTYPE] = (d) => { + return IfcTendonAnchorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTENDONCONDUIT] = (d) => { + return IfcTendonConduit.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTENDONCONDUITTYPE] = (d) => { + return IfcTendonConduitType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTENDONTYPE] = (d) => { + return IfcTendonType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTESSELLATEDFACESET] = (d) => { + return IfcTessellatedFaceSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTESSELLATEDITEM] = (d) => { + return IfcTessellatedItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTLITERAL] = (d) => { + return IfcTextLiteral.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTLITERALWITHEXTENT] = (d) => { + return IfcTextLiteralWithExtent.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTSTYLE] = (d) => { + return IfcTextStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTSTYLEFONTMODEL] = (d) => { + return IfcTextStyleFontModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTSTYLEFORDEFINEDFONT] = (d) => { + return IfcTextStyleForDefinedFont.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTSTYLETEXTMODEL] = (d) => { + return IfcTextStyleTextModel.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTURECOORDINATE] = (d) => { + return IfcTextureCoordinate.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTURECOORDINATEGENERATOR] = (d) => { + return IfcTextureCoordinateGenerator.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTUREMAP] = (d) => { + return IfcTextureMap.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTUREVERTEX] = (d) => { + return IfcTextureVertex.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTEXTUREVERTEXLIST] = (d) => { + return IfcTextureVertexList.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTIMEPERIOD] = (d) => { + return IfcTimePeriod.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTIMESERIES] = (d) => { + return IfcTimeSeries.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTIMESERIESVALUE] = (d) => { + return IfcTimeSeriesValue.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTOPOLOGICALREPRESENTATIONITEM] = (d) => { + return IfcTopologicalRepresentationItem.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTOPOLOGYREPRESENTATION] = (d) => { + return IfcTopologyRepresentation.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTOROIDALSURFACE] = (d) => { + return IfcToroidalSurface.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRANSFORMER] = (d) => { + return IfcTransformer.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRANSFORMERTYPE] = (d) => { + return IfcTransformerType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRANSITIONCURVESEGMENT2D] = (d) => { + return IfcTransitionCurveSegment2D.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRANSPORTELEMENT] = (d) => { + return IfcTransportElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRANSPORTELEMENTTYPE] = (d) => { + return IfcTransportElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRAPEZIUMPROFILEDEF] = (d) => { + return IfcTrapeziumProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRIANGULATEDFACESET] = (d) => { + return IfcTriangulatedFaceSet.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRIANGULATEDIRREGULARNETWORK] = (d) => { + return IfcTriangulatedIrregularNetwork.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTRIMMEDCURVE] = (d) => { + return IfcTrimmedCurve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTUBEBUNDLE] = (d) => { + return IfcTubeBundle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTUBEBUNDLETYPE] = (d) => { + return IfcTubeBundleType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTYPEOBJECT] = (d) => { + return IfcTypeObject.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTYPEPROCESS] = (d) => { + return IfcTypeProcess.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTYPEPRODUCT] = (d) => { + return IfcTypeProduct.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCTYPERESOURCE] = (d) => { + return IfcTypeResource.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCUSHAPEPROFILEDEF] = (d) => { + return IfcUShapeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCUNITASSIGNMENT] = (d) => { + return IfcUnitAssignment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCUNITARYCONTROLELEMENT] = (d) => { + return IfcUnitaryControlElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCUNITARYCONTROLELEMENTTYPE] = (d) => { + return IfcUnitaryControlElementType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCUNITARYEQUIPMENT] = (d) => { + return IfcUnitaryEquipment.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCUNITARYEQUIPMENTTYPE] = (d) => { + return IfcUnitaryEquipmentType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVALVE] = (d) => { + return IfcValve.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVALVETYPE] = (d) => { + return IfcValveType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVECTOR] = (d) => { + return IfcVector.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVERTEX] = (d) => { + return IfcVertex.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVERTEXLOOP] = (d) => { + return IfcVertexLoop.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVERTEXPOINT] = (d) => { + return IfcVertexPoint.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVIBRATIONDAMPER] = (d) => { + return IfcVibrationDamper.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVIBRATIONDAMPERTYPE] = (d) => { + return IfcVibrationDamperType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVIBRATIONISOLATOR] = (d) => { + return IfcVibrationIsolator.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVIBRATIONISOLATORTYPE] = (d) => { + return IfcVibrationIsolatorType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVIRTUALELEMENT] = (d) => { + return IfcVirtualElement.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVIRTUALGRIDINTERSECTION] = (d) => { + return IfcVirtualGridIntersection.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCVOIDINGFEATURE] = (d) => { + return IfcVoidingFeature.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWALL] = (d) => { + return IfcWall.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWALLELEMENTEDCASE] = (d) => { + return IfcWallElementedCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWALLSTANDARDCASE] = (d) => { + return IfcWallStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWALLTYPE] = (d) => { + return IfcWallType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWASTETERMINAL] = (d) => { + return IfcWasteTerminal.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWASTETERMINALTYPE] = (d) => { + return IfcWasteTerminalType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWINDOW] = (d) => { + return IfcWindow.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWINDOWLININGPROPERTIES] = (d) => { + return IfcWindowLiningProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWINDOWPANELPROPERTIES] = (d) => { + return IfcWindowPanelProperties.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWINDOWSTANDARDCASE] = (d) => { + return IfcWindowStandardCase.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWINDOWSTYLE] = (d) => { + return IfcWindowStyle.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWINDOWTYPE] = (d) => { + return IfcWindowType.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWORKCALENDAR] = (d) => { + return IfcWorkCalendar.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWORKCONTROL] = (d) => { + return IfcWorkControl.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWORKPLAN] = (d) => { + return IfcWorkPlan.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWORKSCHEDULE] = (d) => { + return IfcWorkSchedule.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCWORKTIME] = (d) => { + return IfcWorkTime.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCZSHAPEPROFILEDEF] = (d) => { + return IfcZShapeProfileDef.FromTape(d.ID, d.type, d.arguments); +}; +FromRawLineData[IFCZONE] = (d) => { + return IfcZone.FromTape(d.ID, d.type, d.arguments); +}; +var Handle = class { + constructor(id) { + this.value = id; + } + toTape(args) { + args.push({ type: 5, value: this.value }); + } +}; +function Value(type, value) { + return { t: type, v: value }; +} +var IfcAbsorbedDoseMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcAccelerationMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcAmountOfSubstanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcAngularVelocityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcAreaDensityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcAreaMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcBinary = class { + constructor(v) { + this.value = v; + } +}; +var IfcBoolean = class { + constructor(v) { + this.value = v; + } +}; +var IfcBoxAlignment = class { + constructor(v) { + this.value = v; + } +}; +var IfcCardinalPointReference = class { + constructor(v) { + this.value = v; + } +}; +var IfcContextDependentMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcCountMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcCurvatureMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcDate = class { + constructor(v) { + this.value = v; + } +}; +var IfcDateTime = class { + constructor(v) { + this.value = v; + } +}; +var IfcDayInMonthNumber = class { + constructor(v) { + this.value = v; + } +}; +var IfcDayInWeekNumber = class { + constructor(v) { + this.value = v; + } +}; +var IfcDescriptiveMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcDimensionCount = class { + constructor(v) { + this.value = v; + } +}; +var IfcDoseEquivalentMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcDuration = class { + constructor(v) { + this.value = v; + } +}; +var IfcDynamicViscosityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcElectricCapacitanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcElectricChargeMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcElectricConductanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcElectricCurrentMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcElectricResistanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcElectricVoltageMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcEnergyMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcFontStyle = class { + constructor(v) { + this.value = v; + } +}; +var IfcFontVariant = class { + constructor(v) { + this.value = v; + } +}; +var IfcFontWeight = class { + constructor(v) { + this.value = v; + } +}; +var IfcForceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcFrequencyMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcGloballyUniqueId = class { + constructor(v) { + this.value = v; + } +}; +var IfcHeatFluxDensityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcHeatingValueMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcIdentifier = class { + constructor(v) { + this.value = v; + } +}; +var IfcIlluminanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcInductanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcInteger = class { + constructor(v) { + this.value = v; + } +}; +var IfcIntegerCountRateMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcIonConcentrationMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcIsothermalMoistureCapacityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcKinematicViscosityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLabel = class { + constructor(v) { + this.value = v; + } +}; +var IfcLanguageId = class { + constructor(v) { + this.value = v; + } +}; +var IfcLengthMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLinearForceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLinearMomentMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLinearStiffnessMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLinearVelocityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLogical = class { + constructor(v) { + this.value = v; + } +}; +var IfcLuminousFluxMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLuminousIntensityDistributionMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcLuminousIntensityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMagneticFluxDensityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMagneticFluxMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMassDensityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMassFlowRateMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMassMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMassPerLengthMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcModulusOfElasticityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcModulusOfLinearSubgradeReactionMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcModulusOfRotationalSubgradeReactionMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcModulusOfSubgradeReactionMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMoistureDiffusivityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMolecularWeightMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMomentOfInertiaMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMonetaryMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcMonthInYearNumber = class { + constructor(v) { + this.value = v; + } +}; +var IfcNonNegativeLengthMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcNormalisedRatioMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcNumericMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcPHMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcParameterValue = class { + constructor(v) { + this.value = v; + } +}; +var IfcPlanarForceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcPlaneAngleMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcPositiveInteger = class { + constructor(v) { + this.value = v; + } +}; +var IfcPositiveLengthMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcPositivePlaneAngleMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcPositiveRatioMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcPowerMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcPresentableText = class { + constructor(v) { + this.value = v; + } +}; +var IfcPressureMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcRadioActivityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcRatioMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcReal = class { + constructor(v) { + this.value = v; + } +}; +var IfcRotationalFrequencyMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcRotationalMassMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcRotationalStiffnessMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSectionModulusMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSectionalAreaIntegralMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcShearModulusMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSolidAngleMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSoundPowerLevelMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSoundPowerMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSoundPressureLevelMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSoundPressureMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSpecificHeatCapacityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcSpecularExponent = class { + constructor(v) { + this.value = v; + } +}; +var IfcSpecularRoughness = class { + constructor(v) { + this.value = v; + } +}; +var IfcTemperatureGradientMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcTemperatureRateOfChangeMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcText = class { + constructor(v) { + this.value = v; + } +}; +var IfcTextAlignment = class { + constructor(v) { + this.value = v; + } +}; +var IfcTextDecoration = class { + constructor(v) { + this.value = v; + } +}; +var IfcTextFontName = class { + constructor(v) { + this.value = v; + } +}; +var IfcTextTransformation = class { + constructor(v) { + this.value = v; + } +}; +var IfcThermalAdmittanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcThermalConductivityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcThermalExpansionCoefficientMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcThermalResistanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcThermalTransmittanceMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcThermodynamicTemperatureMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcTime = class { + constructor(v) { + this.value = v; + } +}; +var IfcTimeMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcTimeStamp = class { + constructor(v) { + this.value = v; + } +}; +var IfcTorqueMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcURIReference = class { + constructor(v) { + this.value = v; + } +}; +var IfcVaporPermeabilityMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcVolumeMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcVolumetricFlowRateMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcWarpingConstantMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcWarpingMomentMeasure = class { + constructor(v) { + this.value = v; + } +}; +var IfcActionRequestTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcActionRequestTypeEnum.EMAIL = "EMAIL"; +IfcActionRequestTypeEnum.FAX = "FAX"; +IfcActionRequestTypeEnum.PHONE = "PHONE"; +IfcActionRequestTypeEnum.POST = "POST"; +IfcActionRequestTypeEnum.VERBAL = "VERBAL"; +IfcActionRequestTypeEnum.USERDEFINED = "USERDEFINED"; +IfcActionRequestTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcActionSourceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcActionSourceTypeEnum.DEAD_LOAD_G = "DEAD_LOAD_G"; +IfcActionSourceTypeEnum.COMPLETION_G1 = "COMPLETION_G1"; +IfcActionSourceTypeEnum.LIVE_LOAD_Q = "LIVE_LOAD_Q"; +IfcActionSourceTypeEnum.SNOW_S = "SNOW_S"; +IfcActionSourceTypeEnum.WIND_W = "WIND_W"; +IfcActionSourceTypeEnum.PRESTRESSING_P = "PRESTRESSING_P"; +IfcActionSourceTypeEnum.SETTLEMENT_U = "SETTLEMENT_U"; +IfcActionSourceTypeEnum.TEMPERATURE_T = "TEMPERATURE_T"; +IfcActionSourceTypeEnum.EARTHQUAKE_E = "EARTHQUAKE_E"; +IfcActionSourceTypeEnum.FIRE = "FIRE"; +IfcActionSourceTypeEnum.IMPULSE = "IMPULSE"; +IfcActionSourceTypeEnum.IMPACT = "IMPACT"; +IfcActionSourceTypeEnum.TRANSPORT = "TRANSPORT"; +IfcActionSourceTypeEnum.ERECTION = "ERECTION"; +IfcActionSourceTypeEnum.PROPPING = "PROPPING"; +IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION = "SYSTEM_IMPERFECTION"; +IfcActionSourceTypeEnum.SHRINKAGE = "SHRINKAGE"; +IfcActionSourceTypeEnum.CREEP = "CREEP"; +IfcActionSourceTypeEnum.LACK_OF_FIT = "LACK_OF_FIT"; +IfcActionSourceTypeEnum.BUOYANCY = "BUOYANCY"; +IfcActionSourceTypeEnum.ICE = "ICE"; +IfcActionSourceTypeEnum.CURRENT = "CURRENT"; +IfcActionSourceTypeEnum.WAVE = "WAVE"; +IfcActionSourceTypeEnum.RAIN = "RAIN"; +IfcActionSourceTypeEnum.BRAKES = "BRAKES"; +IfcActionSourceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcActionSourceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcActionTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcActionTypeEnum.PERMANENT_G = "PERMANENT_G"; +IfcActionTypeEnum.VARIABLE_Q = "VARIABLE_Q"; +IfcActionTypeEnum.EXTRAORDINARY_A = "EXTRAORDINARY_A"; +IfcActionTypeEnum.USERDEFINED = "USERDEFINED"; +IfcActionTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcActuatorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcActuatorTypeEnum.ELECTRICACTUATOR = "ELECTRICACTUATOR"; +IfcActuatorTypeEnum.HANDOPERATEDACTUATOR = "HANDOPERATEDACTUATOR"; +IfcActuatorTypeEnum.HYDRAULICACTUATOR = "HYDRAULICACTUATOR"; +IfcActuatorTypeEnum.PNEUMATICACTUATOR = "PNEUMATICACTUATOR"; +IfcActuatorTypeEnum.THERMOSTATICACTUATOR = "THERMOSTATICACTUATOR"; +IfcActuatorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcActuatorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAddressTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAddressTypeEnum.OFFICE = "OFFICE"; +IfcAddressTypeEnum.SITE = "SITE"; +IfcAddressTypeEnum.HOME = "HOME"; +IfcAddressTypeEnum.DISTRIBUTIONPOINT = "DISTRIBUTIONPOINT"; +IfcAddressTypeEnum.USERDEFINED = "USERDEFINED"; +var IfcAirTerminalBoxTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAirTerminalBoxTypeEnum.CONSTANTFLOW = "CONSTANTFLOW"; +IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT = "VARIABLEFLOWPRESSUREDEPENDANT"; +IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT = "VARIABLEFLOWPRESSUREINDEPENDANT"; +IfcAirTerminalBoxTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAirTerminalBoxTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAirTerminalTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAirTerminalTypeEnum.DIFFUSER = "DIFFUSER"; +IfcAirTerminalTypeEnum.GRILLE = "GRILLE"; +IfcAirTerminalTypeEnum.LOUVRE = "LOUVRE"; +IfcAirTerminalTypeEnum.REGISTER = "REGISTER"; +IfcAirTerminalTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAirTerminalTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAirToAirHeatRecoveryTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER = "FIXEDPLATECOUNTERFLOWEXCHANGER"; +IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER = "FIXEDPLATECROSSFLOWEXCHANGER"; +IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER = "FIXEDPLATEPARALLELFLOWEXCHANGER"; +IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL = "ROTARYWHEEL"; +IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP = "RUNAROUNDCOILLOOP"; +IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE = "HEATPIPE"; +IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS = "TWINTOWERENTHALPYRECOVERYLOOPS"; +IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS = "THERMOSIPHONSEALEDTUBEHEATEXCHANGERS"; +IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS = "THERMOSIPHONCOILTYPEHEATEXCHANGERS"; +IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAlarmTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAlarmTypeEnum.BELL = "BELL"; +IfcAlarmTypeEnum.BREAKGLASSBUTTON = "BREAKGLASSBUTTON"; +IfcAlarmTypeEnum.LIGHT = "LIGHT"; +IfcAlarmTypeEnum.MANUALPULLBOX = "MANUALPULLBOX"; +IfcAlarmTypeEnum.SIREN = "SIREN"; +IfcAlarmTypeEnum.WHISTLE = "WHISTLE"; +IfcAlarmTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAlarmTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAlignmentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAlignmentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAlignmentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAnalysisModelTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D = "IN_PLANE_LOADING_2D"; +IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D = "OUT_PLANE_LOADING_2D"; +IfcAnalysisModelTypeEnum.LOADING_3D = "LOADING_3D"; +IfcAnalysisModelTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAnalysisModelTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAnalysisTheoryTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY = "FIRST_ORDER_THEORY"; +IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY = "SECOND_ORDER_THEORY"; +IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY = "THIRD_ORDER_THEORY"; +IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY = "FULL_NONLINEAR_THEORY"; +IfcAnalysisTheoryTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAnalysisTheoryTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcArithmeticOperatorEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcArithmeticOperatorEnum.ADD = "ADD"; +IfcArithmeticOperatorEnum.DIVIDE = "DIVIDE"; +IfcArithmeticOperatorEnum.MULTIPLY = "MULTIPLY"; +IfcArithmeticOperatorEnum.SUBTRACT = "SUBTRACT"; +var IfcAssemblyPlaceEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAssemblyPlaceEnum.SITE = "SITE"; +IfcAssemblyPlaceEnum.FACTORY = "FACTORY"; +IfcAssemblyPlaceEnum.NOTDEFINED = "NOTDEFINED"; +var IfcAudioVisualApplianceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcAudioVisualApplianceTypeEnum.AMPLIFIER = "AMPLIFIER"; +IfcAudioVisualApplianceTypeEnum.CAMERA = "CAMERA"; +IfcAudioVisualApplianceTypeEnum.DISPLAY = "DISPLAY"; +IfcAudioVisualApplianceTypeEnum.MICROPHONE = "MICROPHONE"; +IfcAudioVisualApplianceTypeEnum.PLAYER = "PLAYER"; +IfcAudioVisualApplianceTypeEnum.PROJECTOR = "PROJECTOR"; +IfcAudioVisualApplianceTypeEnum.RECEIVER = "RECEIVER"; +IfcAudioVisualApplianceTypeEnum.SPEAKER = "SPEAKER"; +IfcAudioVisualApplianceTypeEnum.SWITCHER = "SWITCHER"; +IfcAudioVisualApplianceTypeEnum.TELEPHONE = "TELEPHONE"; +IfcAudioVisualApplianceTypeEnum.TUNER = "TUNER"; +IfcAudioVisualApplianceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcAudioVisualApplianceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBSplineCurveForm = class { + constructor(v) { + this.value = v; + } +}; +IfcBSplineCurveForm.POLYLINE_FORM = "POLYLINE_FORM"; +IfcBSplineCurveForm.CIRCULAR_ARC = "CIRCULAR_ARC"; +IfcBSplineCurveForm.ELLIPTIC_ARC = "ELLIPTIC_ARC"; +IfcBSplineCurveForm.PARABOLIC_ARC = "PARABOLIC_ARC"; +IfcBSplineCurveForm.HYPERBOLIC_ARC = "HYPERBOLIC_ARC"; +IfcBSplineCurveForm.UNSPECIFIED = "UNSPECIFIED"; +var IfcBSplineSurfaceForm = class { + constructor(v) { + this.value = v; + } +}; +IfcBSplineSurfaceForm.PLANE_SURF = "PLANE_SURF"; +IfcBSplineSurfaceForm.CYLINDRICAL_SURF = "CYLINDRICAL_SURF"; +IfcBSplineSurfaceForm.CONICAL_SURF = "CONICAL_SURF"; +IfcBSplineSurfaceForm.SPHERICAL_SURF = "SPHERICAL_SURF"; +IfcBSplineSurfaceForm.TOROIDAL_SURF = "TOROIDAL_SURF"; +IfcBSplineSurfaceForm.SURF_OF_REVOLUTION = "SURF_OF_REVOLUTION"; +IfcBSplineSurfaceForm.RULED_SURF = "RULED_SURF"; +IfcBSplineSurfaceForm.GENERALISED_CONE = "GENERALISED_CONE"; +IfcBSplineSurfaceForm.QUADRIC_SURF = "QUADRIC_SURF"; +IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION = "SURF_OF_LINEAR_EXTRUSION"; +IfcBSplineSurfaceForm.UNSPECIFIED = "UNSPECIFIED"; +var IfcBeamTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBeamTypeEnum.BEAM = "BEAM"; +IfcBeamTypeEnum.JOIST = "JOIST"; +IfcBeamTypeEnum.HOLLOWCORE = "HOLLOWCORE"; +IfcBeamTypeEnum.LINTEL = "LINTEL"; +IfcBeamTypeEnum.SPANDREL = "SPANDREL"; +IfcBeamTypeEnum.T_BEAM = "T_BEAM"; +IfcBeamTypeEnum.GIRDER_SEGMENT = "GIRDER_SEGMENT"; +IfcBeamTypeEnum.DIAPHRAGM = "DIAPHRAGM"; +IfcBeamTypeEnum.PIERCAP = "PIERCAP"; +IfcBeamTypeEnum.HATSTONE = "HATSTONE"; +IfcBeamTypeEnum.CORNICE = "CORNICE"; +IfcBeamTypeEnum.EDGEBEAM = "EDGEBEAM"; +IfcBeamTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBeamTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBearingTypeDisplacementEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT = "FIXED_MOVEMENT"; +IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL = "GUIDED_LONGITUDINAL"; +IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL = "GUIDED_TRANSVERSAL"; +IfcBearingTypeDisplacementEnum.FREE_MOVEMENT = "FREE_MOVEMENT"; +IfcBearingTypeDisplacementEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBearingTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBearingTypeEnum.CYLINDRICAL = "CYLINDRICAL"; +IfcBearingTypeEnum.SPHERICAL = "SPHERICAL"; +IfcBearingTypeEnum.ELASTOMERIC = "ELASTOMERIC"; +IfcBearingTypeEnum.POT = "POT"; +IfcBearingTypeEnum.GUIDE = "GUIDE"; +IfcBearingTypeEnum.ROCKER = "ROCKER"; +IfcBearingTypeEnum.ROLLER = "ROLLER"; +IfcBearingTypeEnum.DISK = "DISK"; +IfcBearingTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBearingTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBenchmarkEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBenchmarkEnum.GREATERTHAN = "GREATERTHAN"; +IfcBenchmarkEnum.GREATERTHANOREQUALTO = "GREATERTHANOREQUALTO"; +IfcBenchmarkEnum.LESSTHAN = "LESSTHAN"; +IfcBenchmarkEnum.LESSTHANOREQUALTO = "LESSTHANOREQUALTO"; +IfcBenchmarkEnum.EQUALTO = "EQUALTO"; +IfcBenchmarkEnum.NOTEQUALTO = "NOTEQUALTO"; +IfcBenchmarkEnum.INCLUDES = "INCLUDES"; +IfcBenchmarkEnum.NOTINCLUDES = "NOTINCLUDES"; +IfcBenchmarkEnum.INCLUDEDIN = "INCLUDEDIN"; +IfcBenchmarkEnum.NOTINCLUDEDIN = "NOTINCLUDEDIN"; +var IfcBoilerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBoilerTypeEnum.WATER = "WATER"; +IfcBoilerTypeEnum.STEAM = "STEAM"; +IfcBoilerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBoilerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBooleanOperator = class { + constructor(v) { + this.value = v; + } +}; +IfcBooleanOperator.UNION = "UNION"; +IfcBooleanOperator.INTERSECTION = "INTERSECTION"; +IfcBooleanOperator.DIFFERENCE = "DIFFERENCE"; +var IfcBridgePartTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBridgePartTypeEnum.ABUTMENT = "ABUTMENT"; +IfcBridgePartTypeEnum.DECK = "DECK"; +IfcBridgePartTypeEnum.DECK_SEGMENT = "DECK_SEGMENT"; +IfcBridgePartTypeEnum.FOUNDATION = "FOUNDATION"; +IfcBridgePartTypeEnum.PIER = "PIER"; +IfcBridgePartTypeEnum.PIER_SEGMENT = "PIER_SEGMENT"; +IfcBridgePartTypeEnum.PYLON = "PYLON"; +IfcBridgePartTypeEnum.SUBSTRUCTURE = "SUBSTRUCTURE"; +IfcBridgePartTypeEnum.SUPERSTRUCTURE = "SUPERSTRUCTURE"; +IfcBridgePartTypeEnum.SURFACESTRUCTURE = "SURFACESTRUCTURE"; +IfcBridgePartTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBridgePartTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBridgeTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBridgeTypeEnum.ARCHED = "ARCHED"; +IfcBridgeTypeEnum.CABLE_STAYED = "CABLE_STAYED"; +IfcBridgeTypeEnum.CANTILEVER = "CANTILEVER"; +IfcBridgeTypeEnum.CULVERT = "CULVERT"; +IfcBridgeTypeEnum.FRAMEWORK = "FRAMEWORK"; +IfcBridgeTypeEnum.GIRDER = "GIRDER"; +IfcBridgeTypeEnum.SUSPENSION = "SUSPENSION"; +IfcBridgeTypeEnum.TRUSS = "TRUSS"; +IfcBridgeTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBridgeTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBuildingElementPartTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBuildingElementPartTypeEnum.INSULATION = "INSULATION"; +IfcBuildingElementPartTypeEnum.PRECASTPANEL = "PRECASTPANEL"; +IfcBuildingElementPartTypeEnum.APRON = "APRON"; +IfcBuildingElementPartTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBuildingElementPartTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBuildingElementProxyTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBuildingElementProxyTypeEnum.COMPLEX = "COMPLEX"; +IfcBuildingElementProxyTypeEnum.ELEMENT = "ELEMENT"; +IfcBuildingElementProxyTypeEnum.PARTIAL = "PARTIAL"; +IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID = "PROVISIONFORVOID"; +IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE = "PROVISIONFORSPACE"; +IfcBuildingElementProxyTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBuildingElementProxyTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBuildingSystemTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBuildingSystemTypeEnum.FENESTRATION = "FENESTRATION"; +IfcBuildingSystemTypeEnum.FOUNDATION = "FOUNDATION"; +IfcBuildingSystemTypeEnum.LOADBEARING = "LOADBEARING"; +IfcBuildingSystemTypeEnum.OUTERSHELL = "OUTERSHELL"; +IfcBuildingSystemTypeEnum.SHADING = "SHADING"; +IfcBuildingSystemTypeEnum.TRANSPORT = "TRANSPORT"; +IfcBuildingSystemTypeEnum.REINFORCING = "REINFORCING"; +IfcBuildingSystemTypeEnum.PRESTRESSING = "PRESTRESSING"; +IfcBuildingSystemTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBuildingSystemTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcBurnerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcBurnerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcBurnerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCableCarrierFittingTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCableCarrierFittingTypeEnum.BEND = "BEND"; +IfcCableCarrierFittingTypeEnum.CROSS = "CROSS"; +IfcCableCarrierFittingTypeEnum.REDUCER = "REDUCER"; +IfcCableCarrierFittingTypeEnum.TEE = "TEE"; +IfcCableCarrierFittingTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCableCarrierFittingTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCableCarrierSegmentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT = "CABLELADDERSEGMENT"; +IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT = "CABLETRAYSEGMENT"; +IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT = "CABLETRUNKINGSEGMENT"; +IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT = "CONDUITSEGMENT"; +IfcCableCarrierSegmentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCableCarrierSegmentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCableFittingTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCableFittingTypeEnum.CONNECTOR = "CONNECTOR"; +IfcCableFittingTypeEnum.ENTRY = "ENTRY"; +IfcCableFittingTypeEnum.EXIT = "EXIT"; +IfcCableFittingTypeEnum.JUNCTION = "JUNCTION"; +IfcCableFittingTypeEnum.TRANSITION = "TRANSITION"; +IfcCableFittingTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCableFittingTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCableSegmentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCableSegmentTypeEnum.BUSBARSEGMENT = "BUSBARSEGMENT"; +IfcCableSegmentTypeEnum.CABLESEGMENT = "CABLESEGMENT"; +IfcCableSegmentTypeEnum.CONDUCTORSEGMENT = "CONDUCTORSEGMENT"; +IfcCableSegmentTypeEnum.CORESEGMENT = "CORESEGMENT"; +IfcCableSegmentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCableSegmentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCaissonFoundationTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCaissonFoundationTypeEnum.WELL = "WELL"; +IfcCaissonFoundationTypeEnum.CAISSON = "CAISSON"; +IfcCaissonFoundationTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCaissonFoundationTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcChangeActionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcChangeActionEnum.NOCHANGE = "NOCHANGE"; +IfcChangeActionEnum.MODIFIED = "MODIFIED"; +IfcChangeActionEnum.ADDED = "ADDED"; +IfcChangeActionEnum.DELETED = "DELETED"; +IfcChangeActionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcChillerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcChillerTypeEnum.AIRCOOLED = "AIRCOOLED"; +IfcChillerTypeEnum.WATERCOOLED = "WATERCOOLED"; +IfcChillerTypeEnum.HEATRECOVERY = "HEATRECOVERY"; +IfcChillerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcChillerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcChimneyTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcChimneyTypeEnum.USERDEFINED = "USERDEFINED"; +IfcChimneyTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCoilTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCoilTypeEnum.DXCOOLINGCOIL = "DXCOOLINGCOIL"; +IfcCoilTypeEnum.ELECTRICHEATINGCOIL = "ELECTRICHEATINGCOIL"; +IfcCoilTypeEnum.GASHEATINGCOIL = "GASHEATINGCOIL"; +IfcCoilTypeEnum.HYDRONICCOIL = "HYDRONICCOIL"; +IfcCoilTypeEnum.STEAMHEATINGCOIL = "STEAMHEATINGCOIL"; +IfcCoilTypeEnum.WATERCOOLINGCOIL = "WATERCOOLINGCOIL"; +IfcCoilTypeEnum.WATERHEATINGCOIL = "WATERHEATINGCOIL"; +IfcCoilTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCoilTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcColumnTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcColumnTypeEnum.COLUMN = "COLUMN"; +IfcColumnTypeEnum.PILASTER = "PILASTER"; +IfcColumnTypeEnum.PIERSTEM = "PIERSTEM"; +IfcColumnTypeEnum.PIERSTEM_SEGMENT = "PIERSTEM_SEGMENT"; +IfcColumnTypeEnum.STANDCOLUMN = "STANDCOLUMN"; +IfcColumnTypeEnum.USERDEFINED = "USERDEFINED"; +IfcColumnTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCommunicationsApplianceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCommunicationsApplianceTypeEnum.ANTENNA = "ANTENNA"; +IfcCommunicationsApplianceTypeEnum.COMPUTER = "COMPUTER"; +IfcCommunicationsApplianceTypeEnum.FAX = "FAX"; +IfcCommunicationsApplianceTypeEnum.GATEWAY = "GATEWAY"; +IfcCommunicationsApplianceTypeEnum.MODEM = "MODEM"; +IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE = "NETWORKAPPLIANCE"; +IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE = "NETWORKBRIDGE"; +IfcCommunicationsApplianceTypeEnum.NETWORKHUB = "NETWORKHUB"; +IfcCommunicationsApplianceTypeEnum.PRINTER = "PRINTER"; +IfcCommunicationsApplianceTypeEnum.REPEATER = "REPEATER"; +IfcCommunicationsApplianceTypeEnum.ROUTER = "ROUTER"; +IfcCommunicationsApplianceTypeEnum.SCANNER = "SCANNER"; +IfcCommunicationsApplianceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCommunicationsApplianceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcComplexPropertyTemplateTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcComplexPropertyTemplateTypeEnum.P_COMPLEX = "P_COMPLEX"; +IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX = "Q_COMPLEX"; +var IfcCompressorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCompressorTypeEnum.DYNAMIC = "DYNAMIC"; +IfcCompressorTypeEnum.RECIPROCATING = "RECIPROCATING"; +IfcCompressorTypeEnum.ROTARY = "ROTARY"; +IfcCompressorTypeEnum.SCROLL = "SCROLL"; +IfcCompressorTypeEnum.TROCHOIDAL = "TROCHOIDAL"; +IfcCompressorTypeEnum.SINGLESTAGE = "SINGLESTAGE"; +IfcCompressorTypeEnum.BOOSTER = "BOOSTER"; +IfcCompressorTypeEnum.OPENTYPE = "OPENTYPE"; +IfcCompressorTypeEnum.HERMETIC = "HERMETIC"; +IfcCompressorTypeEnum.SEMIHERMETIC = "SEMIHERMETIC"; +IfcCompressorTypeEnum.WELDEDSHELLHERMETIC = "WELDEDSHELLHERMETIC"; +IfcCompressorTypeEnum.ROLLINGPISTON = "ROLLINGPISTON"; +IfcCompressorTypeEnum.ROTARYVANE = "ROTARYVANE"; +IfcCompressorTypeEnum.SINGLESCREW = "SINGLESCREW"; +IfcCompressorTypeEnum.TWINSCREW = "TWINSCREW"; +IfcCompressorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCompressorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCondenserTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCondenserTypeEnum.AIRCOOLED = "AIRCOOLED"; +IfcCondenserTypeEnum.EVAPORATIVECOOLED = "EVAPORATIVECOOLED"; +IfcCondenserTypeEnum.WATERCOOLED = "WATERCOOLED"; +IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE = "WATERCOOLEDBRAZEDPLATE"; +IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL = "WATERCOOLEDSHELLCOIL"; +IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE = "WATERCOOLEDSHELLTUBE"; +IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE = "WATERCOOLEDTUBEINTUBE"; +IfcCondenserTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCondenserTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcConnectionTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcConnectionTypeEnum.ATPATH = "ATPATH"; +IfcConnectionTypeEnum.ATSTART = "ATSTART"; +IfcConnectionTypeEnum.ATEND = "ATEND"; +IfcConnectionTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcConstraintEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcConstraintEnum.HARD = "HARD"; +IfcConstraintEnum.SOFT = "SOFT"; +IfcConstraintEnum.ADVISORY = "ADVISORY"; +IfcConstraintEnum.USERDEFINED = "USERDEFINED"; +IfcConstraintEnum.NOTDEFINED = "NOTDEFINED"; +var IfcConstructionEquipmentResourceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING = "DEMOLISHING"; +IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING = "EARTHMOVING"; +IfcConstructionEquipmentResourceTypeEnum.ERECTING = "ERECTING"; +IfcConstructionEquipmentResourceTypeEnum.HEATING = "HEATING"; +IfcConstructionEquipmentResourceTypeEnum.LIGHTING = "LIGHTING"; +IfcConstructionEquipmentResourceTypeEnum.PAVING = "PAVING"; +IfcConstructionEquipmentResourceTypeEnum.PUMPING = "PUMPING"; +IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING = "TRANSPORTING"; +IfcConstructionEquipmentResourceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcConstructionMaterialResourceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcConstructionMaterialResourceTypeEnum.AGGREGATES = "AGGREGATES"; +IfcConstructionMaterialResourceTypeEnum.CONCRETE = "CONCRETE"; +IfcConstructionMaterialResourceTypeEnum.DRYWALL = "DRYWALL"; +IfcConstructionMaterialResourceTypeEnum.FUEL = "FUEL"; +IfcConstructionMaterialResourceTypeEnum.GYPSUM = "GYPSUM"; +IfcConstructionMaterialResourceTypeEnum.MASONRY = "MASONRY"; +IfcConstructionMaterialResourceTypeEnum.METAL = "METAL"; +IfcConstructionMaterialResourceTypeEnum.PLASTIC = "PLASTIC"; +IfcConstructionMaterialResourceTypeEnum.WOOD = "WOOD"; +IfcConstructionMaterialResourceTypeEnum.NOTDEFINED = "NOTDEFINED"; +IfcConstructionMaterialResourceTypeEnum.USERDEFINED = "USERDEFINED"; +var IfcConstructionProductResourceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcConstructionProductResourceTypeEnum.ASSEMBLY = "ASSEMBLY"; +IfcConstructionProductResourceTypeEnum.FORMWORK = "FORMWORK"; +IfcConstructionProductResourceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcConstructionProductResourceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcControllerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcControllerTypeEnum.FLOATING = "FLOATING"; +IfcControllerTypeEnum.PROGRAMMABLE = "PROGRAMMABLE"; +IfcControllerTypeEnum.PROPORTIONAL = "PROPORTIONAL"; +IfcControllerTypeEnum.MULTIPOSITION = "MULTIPOSITION"; +IfcControllerTypeEnum.TWOPOSITION = "TWOPOSITION"; +IfcControllerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcControllerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCooledBeamTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCooledBeamTypeEnum.ACTIVE = "ACTIVE"; +IfcCooledBeamTypeEnum.PASSIVE = "PASSIVE"; +IfcCooledBeamTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCooledBeamTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCoolingTowerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCoolingTowerTypeEnum.NATURALDRAFT = "NATURALDRAFT"; +IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT = "MECHANICALINDUCEDDRAFT"; +IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT = "MECHANICALFORCEDDRAFT"; +IfcCoolingTowerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCoolingTowerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCostItemTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCostItemTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCostItemTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCostScheduleTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCostScheduleTypeEnum.BUDGET = "BUDGET"; +IfcCostScheduleTypeEnum.COSTPLAN = "COSTPLAN"; +IfcCostScheduleTypeEnum.ESTIMATE = "ESTIMATE"; +IfcCostScheduleTypeEnum.TENDER = "TENDER"; +IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES = "PRICEDBILLOFQUANTITIES"; +IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES = "UNPRICEDBILLOFQUANTITIES"; +IfcCostScheduleTypeEnum.SCHEDULEOFRATES = "SCHEDULEOFRATES"; +IfcCostScheduleTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCostScheduleTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCoveringTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCoveringTypeEnum.CEILING = "CEILING"; +IfcCoveringTypeEnum.FLOORING = "FLOORING"; +IfcCoveringTypeEnum.CLADDING = "CLADDING"; +IfcCoveringTypeEnum.ROOFING = "ROOFING"; +IfcCoveringTypeEnum.MOLDING = "MOLDING"; +IfcCoveringTypeEnum.SKIRTINGBOARD = "SKIRTINGBOARD"; +IfcCoveringTypeEnum.INSULATION = "INSULATION"; +IfcCoveringTypeEnum.MEMBRANE = "MEMBRANE"; +IfcCoveringTypeEnum.SLEEVING = "SLEEVING"; +IfcCoveringTypeEnum.WRAPPING = "WRAPPING"; +IfcCoveringTypeEnum.COPING = "COPING"; +IfcCoveringTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCoveringTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCrewResourceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCrewResourceTypeEnum.OFFICE = "OFFICE"; +IfcCrewResourceTypeEnum.SITE = "SITE"; +IfcCrewResourceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCrewResourceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCurtainWallTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCurtainWallTypeEnum.USERDEFINED = "USERDEFINED"; +IfcCurtainWallTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcCurveInterpolationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcCurveInterpolationEnum.LINEAR = "LINEAR"; +IfcCurveInterpolationEnum.LOG_LINEAR = "LOG_LINEAR"; +IfcCurveInterpolationEnum.LOG_LOG = "LOG_LOG"; +IfcCurveInterpolationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDamperTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDamperTypeEnum.BACKDRAFTDAMPER = "BACKDRAFTDAMPER"; +IfcDamperTypeEnum.BALANCINGDAMPER = "BALANCINGDAMPER"; +IfcDamperTypeEnum.BLASTDAMPER = "BLASTDAMPER"; +IfcDamperTypeEnum.CONTROLDAMPER = "CONTROLDAMPER"; +IfcDamperTypeEnum.FIREDAMPER = "FIREDAMPER"; +IfcDamperTypeEnum.FIRESMOKEDAMPER = "FIRESMOKEDAMPER"; +IfcDamperTypeEnum.FUMEHOODEXHAUST = "FUMEHOODEXHAUST"; +IfcDamperTypeEnum.GRAVITYDAMPER = "GRAVITYDAMPER"; +IfcDamperTypeEnum.GRAVITYRELIEFDAMPER = "GRAVITYRELIEFDAMPER"; +IfcDamperTypeEnum.RELIEFDAMPER = "RELIEFDAMPER"; +IfcDamperTypeEnum.SMOKEDAMPER = "SMOKEDAMPER"; +IfcDamperTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDamperTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDataOriginEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDataOriginEnum.MEASURED = "MEASURED"; +IfcDataOriginEnum.PREDICTED = "PREDICTED"; +IfcDataOriginEnum.SIMULATED = "SIMULATED"; +IfcDataOriginEnum.USERDEFINED = "USERDEFINED"; +IfcDataOriginEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDerivedUnitEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDerivedUnitEnum.ANGULARVELOCITYUNIT = "ANGULARVELOCITYUNIT"; +IfcDerivedUnitEnum.AREADENSITYUNIT = "AREADENSITYUNIT"; +IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT = "COMPOUNDPLANEANGLEUNIT"; +IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT = "DYNAMICVISCOSITYUNIT"; +IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT = "HEATFLUXDENSITYUNIT"; +IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT = "INTEGERCOUNTRATEUNIT"; +IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT = "ISOTHERMALMOISTURECAPACITYUNIT"; +IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT = "KINEMATICVISCOSITYUNIT"; +IfcDerivedUnitEnum.LINEARVELOCITYUNIT = "LINEARVELOCITYUNIT"; +IfcDerivedUnitEnum.MASSDENSITYUNIT = "MASSDENSITYUNIT"; +IfcDerivedUnitEnum.MASSFLOWRATEUNIT = "MASSFLOWRATEUNIT"; +IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT = "MOISTUREDIFFUSIVITYUNIT"; +IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT = "MOLECULARWEIGHTUNIT"; +IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT = "SPECIFICHEATCAPACITYUNIT"; +IfcDerivedUnitEnum.THERMALADMITTANCEUNIT = "THERMALADMITTANCEUNIT"; +IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT = "THERMALCONDUCTANCEUNIT"; +IfcDerivedUnitEnum.THERMALRESISTANCEUNIT = "THERMALRESISTANCEUNIT"; +IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT = "THERMALTRANSMITTANCEUNIT"; +IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT = "VAPORPERMEABILITYUNIT"; +IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT = "VOLUMETRICFLOWRATEUNIT"; +IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT = "ROTATIONALFREQUENCYUNIT"; +IfcDerivedUnitEnum.TORQUEUNIT = "TORQUEUNIT"; +IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT = "MOMENTOFINERTIAUNIT"; +IfcDerivedUnitEnum.LINEARMOMENTUNIT = "LINEARMOMENTUNIT"; +IfcDerivedUnitEnum.LINEARFORCEUNIT = "LINEARFORCEUNIT"; +IfcDerivedUnitEnum.PLANARFORCEUNIT = "PLANARFORCEUNIT"; +IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT = "MODULUSOFELASTICITYUNIT"; +IfcDerivedUnitEnum.SHEARMODULUSUNIT = "SHEARMODULUSUNIT"; +IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT = "LINEARSTIFFNESSUNIT"; +IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT = "ROTATIONALSTIFFNESSUNIT"; +IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT = "MODULUSOFSUBGRADEREACTIONUNIT"; +IfcDerivedUnitEnum.ACCELERATIONUNIT = "ACCELERATIONUNIT"; +IfcDerivedUnitEnum.CURVATUREUNIT = "CURVATUREUNIT"; +IfcDerivedUnitEnum.HEATINGVALUEUNIT = "HEATINGVALUEUNIT"; +IfcDerivedUnitEnum.IONCONCENTRATIONUNIT = "IONCONCENTRATIONUNIT"; +IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT = "LUMINOUSINTENSITYDISTRIBUTIONUNIT"; +IfcDerivedUnitEnum.MASSPERLENGTHUNIT = "MASSPERLENGTHUNIT"; +IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT = "MODULUSOFLINEARSUBGRADEREACTIONUNIT"; +IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT = "MODULUSOFROTATIONALSUBGRADEREACTIONUNIT"; +IfcDerivedUnitEnum.PHUNIT = "PHUNIT"; +IfcDerivedUnitEnum.ROTATIONALMASSUNIT = "ROTATIONALMASSUNIT"; +IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT = "SECTIONAREAINTEGRALUNIT"; +IfcDerivedUnitEnum.SECTIONMODULUSUNIT = "SECTIONMODULUSUNIT"; +IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT = "SOUNDPOWERLEVELUNIT"; +IfcDerivedUnitEnum.SOUNDPOWERUNIT = "SOUNDPOWERUNIT"; +IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT = "SOUNDPRESSURELEVELUNIT"; +IfcDerivedUnitEnum.SOUNDPRESSUREUNIT = "SOUNDPRESSUREUNIT"; +IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT = "TEMPERATUREGRADIENTUNIT"; +IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT = "TEMPERATURERATEOFCHANGEUNIT"; +IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT = "THERMALEXPANSIONCOEFFICIENTUNIT"; +IfcDerivedUnitEnum.WARPINGCONSTANTUNIT = "WARPINGCONSTANTUNIT"; +IfcDerivedUnitEnum.WARPINGMOMENTUNIT = "WARPINGMOMENTUNIT"; +IfcDerivedUnitEnum.USERDEFINED = "USERDEFINED"; +var IfcDirectionSenseEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDirectionSenseEnum.POSITIVE = "POSITIVE"; +IfcDirectionSenseEnum.NEGATIVE = "NEGATIVE"; +var IfcDiscreteAccessoryTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDiscreteAccessoryTypeEnum.ANCHORPLATE = "ANCHORPLATE"; +IfcDiscreteAccessoryTypeEnum.BRACKET = "BRACKET"; +IfcDiscreteAccessoryTypeEnum.SHOE = "SHOE"; +IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE = "EXPANSION_JOINT_DEVICE"; +IfcDiscreteAccessoryTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDiscreteAccessoryTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDistributionChamberElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDistributionChamberElementTypeEnum.FORMEDDUCT = "FORMEDDUCT"; +IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER = "INSPECTIONCHAMBER"; +IfcDistributionChamberElementTypeEnum.INSPECTIONPIT = "INSPECTIONPIT"; +IfcDistributionChamberElementTypeEnum.MANHOLE = "MANHOLE"; +IfcDistributionChamberElementTypeEnum.METERCHAMBER = "METERCHAMBER"; +IfcDistributionChamberElementTypeEnum.SUMP = "SUMP"; +IfcDistributionChamberElementTypeEnum.TRENCH = "TRENCH"; +IfcDistributionChamberElementTypeEnum.VALVECHAMBER = "VALVECHAMBER"; +IfcDistributionChamberElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDistributionChamberElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDistributionPortTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDistributionPortTypeEnum.CABLE = "CABLE"; +IfcDistributionPortTypeEnum.CABLECARRIER = "CABLECARRIER"; +IfcDistributionPortTypeEnum.DUCT = "DUCT"; +IfcDistributionPortTypeEnum.PIPE = "PIPE"; +IfcDistributionPortTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDistributionPortTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDistributionSystemEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDistributionSystemEnum.AIRCONDITIONING = "AIRCONDITIONING"; +IfcDistributionSystemEnum.AUDIOVISUAL = "AUDIOVISUAL"; +IfcDistributionSystemEnum.CHEMICAL = "CHEMICAL"; +IfcDistributionSystemEnum.CHILLEDWATER = "CHILLEDWATER"; +IfcDistributionSystemEnum.COMMUNICATION = "COMMUNICATION"; +IfcDistributionSystemEnum.COMPRESSEDAIR = "COMPRESSEDAIR"; +IfcDistributionSystemEnum.CONDENSERWATER = "CONDENSERWATER"; +IfcDistributionSystemEnum.CONTROL = "CONTROL"; +IfcDistributionSystemEnum.CONVEYING = "CONVEYING"; +IfcDistributionSystemEnum.DATA = "DATA"; +IfcDistributionSystemEnum.DISPOSAL = "DISPOSAL"; +IfcDistributionSystemEnum.DOMESTICCOLDWATER = "DOMESTICCOLDWATER"; +IfcDistributionSystemEnum.DOMESTICHOTWATER = "DOMESTICHOTWATER"; +IfcDistributionSystemEnum.DRAINAGE = "DRAINAGE"; +IfcDistributionSystemEnum.EARTHING = "EARTHING"; +IfcDistributionSystemEnum.ELECTRICAL = "ELECTRICAL"; +IfcDistributionSystemEnum.ELECTROACOUSTIC = "ELECTROACOUSTIC"; +IfcDistributionSystemEnum.EXHAUST = "EXHAUST"; +IfcDistributionSystemEnum.FIREPROTECTION = "FIREPROTECTION"; +IfcDistributionSystemEnum.FUEL = "FUEL"; +IfcDistributionSystemEnum.GAS = "GAS"; +IfcDistributionSystemEnum.HAZARDOUS = "HAZARDOUS"; +IfcDistributionSystemEnum.HEATING = "HEATING"; +IfcDistributionSystemEnum.LIGHTING = "LIGHTING"; +IfcDistributionSystemEnum.LIGHTNINGPROTECTION = "LIGHTNINGPROTECTION"; +IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE = "MUNICIPALSOLIDWASTE"; +IfcDistributionSystemEnum.OIL = "OIL"; +IfcDistributionSystemEnum.OPERATIONAL = "OPERATIONAL"; +IfcDistributionSystemEnum.POWERGENERATION = "POWERGENERATION"; +IfcDistributionSystemEnum.RAINWATER = "RAINWATER"; +IfcDistributionSystemEnum.REFRIGERATION = "REFRIGERATION"; +IfcDistributionSystemEnum.SECURITY = "SECURITY"; +IfcDistributionSystemEnum.SEWAGE = "SEWAGE"; +IfcDistributionSystemEnum.SIGNAL = "SIGNAL"; +IfcDistributionSystemEnum.STORMWATER = "STORMWATER"; +IfcDistributionSystemEnum.TELEPHONE = "TELEPHONE"; +IfcDistributionSystemEnum.TV = "TV"; +IfcDistributionSystemEnum.VACUUM = "VACUUM"; +IfcDistributionSystemEnum.VENT = "VENT"; +IfcDistributionSystemEnum.VENTILATION = "VENTILATION"; +IfcDistributionSystemEnum.WASTEWATER = "WASTEWATER"; +IfcDistributionSystemEnum.WATERSUPPLY = "WATERSUPPLY"; +IfcDistributionSystemEnum.USERDEFINED = "USERDEFINED"; +IfcDistributionSystemEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDocumentConfidentialityEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDocumentConfidentialityEnum.PUBLIC = "PUBLIC"; +IfcDocumentConfidentialityEnum.RESTRICTED = "RESTRICTED"; +IfcDocumentConfidentialityEnum.CONFIDENTIAL = "CONFIDENTIAL"; +IfcDocumentConfidentialityEnum.PERSONAL = "PERSONAL"; +IfcDocumentConfidentialityEnum.USERDEFINED = "USERDEFINED"; +IfcDocumentConfidentialityEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDocumentStatusEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDocumentStatusEnum.DRAFT = "DRAFT"; +IfcDocumentStatusEnum.FINALDRAFT = "FINALDRAFT"; +IfcDocumentStatusEnum.FINAL = "FINAL"; +IfcDocumentStatusEnum.REVISION = "REVISION"; +IfcDocumentStatusEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDoorPanelOperationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDoorPanelOperationEnum.SWINGING = "SWINGING"; +IfcDoorPanelOperationEnum.DOUBLE_ACTING = "DOUBLE_ACTING"; +IfcDoorPanelOperationEnum.SLIDING = "SLIDING"; +IfcDoorPanelOperationEnum.FOLDING = "FOLDING"; +IfcDoorPanelOperationEnum.REVOLVING = "REVOLVING"; +IfcDoorPanelOperationEnum.ROLLINGUP = "ROLLINGUP"; +IfcDoorPanelOperationEnum.FIXEDPANEL = "FIXEDPANEL"; +IfcDoorPanelOperationEnum.USERDEFINED = "USERDEFINED"; +IfcDoorPanelOperationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDoorPanelPositionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDoorPanelPositionEnum.LEFT = "LEFT"; +IfcDoorPanelPositionEnum.MIDDLE = "MIDDLE"; +IfcDoorPanelPositionEnum.RIGHT = "RIGHT"; +IfcDoorPanelPositionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDoorStyleConstructionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDoorStyleConstructionEnum.ALUMINIUM = "ALUMINIUM"; +IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL = "HIGH_GRADE_STEEL"; +IfcDoorStyleConstructionEnum.STEEL = "STEEL"; +IfcDoorStyleConstructionEnum.WOOD = "WOOD"; +IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD = "ALUMINIUM_WOOD"; +IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC = "ALUMINIUM_PLASTIC"; +IfcDoorStyleConstructionEnum.PLASTIC = "PLASTIC"; +IfcDoorStyleConstructionEnum.USERDEFINED = "USERDEFINED"; +IfcDoorStyleConstructionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDoorStyleOperationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT = "SINGLE_SWING_LEFT"; +IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT = "SINGLE_SWING_RIGHT"; +IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING = "DOUBLE_DOOR_SINGLE_SWING"; +IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT"; +IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT"; +IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT = "DOUBLE_SWING_LEFT"; +IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT = "DOUBLE_SWING_RIGHT"; +IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING = "DOUBLE_DOOR_DOUBLE_SWING"; +IfcDoorStyleOperationEnum.SLIDING_TO_LEFT = "SLIDING_TO_LEFT"; +IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT = "SLIDING_TO_RIGHT"; +IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING = "DOUBLE_DOOR_SLIDING"; +IfcDoorStyleOperationEnum.FOLDING_TO_LEFT = "FOLDING_TO_LEFT"; +IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT = "FOLDING_TO_RIGHT"; +IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING = "DOUBLE_DOOR_FOLDING"; +IfcDoorStyleOperationEnum.REVOLVING = "REVOLVING"; +IfcDoorStyleOperationEnum.ROLLINGUP = "ROLLINGUP"; +IfcDoorStyleOperationEnum.USERDEFINED = "USERDEFINED"; +IfcDoorStyleOperationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDoorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDoorTypeEnum.DOOR = "DOOR"; +IfcDoorTypeEnum.GATE = "GATE"; +IfcDoorTypeEnum.TRAPDOOR = "TRAPDOOR"; +IfcDoorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDoorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDoorTypeOperationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT = "SINGLE_SWING_LEFT"; +IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT = "SINGLE_SWING_RIGHT"; +IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING = "DOUBLE_DOOR_SINGLE_SWING"; +IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT"; +IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT"; +IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT = "DOUBLE_SWING_LEFT"; +IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT = "DOUBLE_SWING_RIGHT"; +IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING = "DOUBLE_DOOR_DOUBLE_SWING"; +IfcDoorTypeOperationEnum.SLIDING_TO_LEFT = "SLIDING_TO_LEFT"; +IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT = "SLIDING_TO_RIGHT"; +IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING = "DOUBLE_DOOR_SLIDING"; +IfcDoorTypeOperationEnum.FOLDING_TO_LEFT = "FOLDING_TO_LEFT"; +IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT = "FOLDING_TO_RIGHT"; +IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING = "DOUBLE_DOOR_FOLDING"; +IfcDoorTypeOperationEnum.REVOLVING = "REVOLVING"; +IfcDoorTypeOperationEnum.ROLLINGUP = "ROLLINGUP"; +IfcDoorTypeOperationEnum.SWING_FIXED_LEFT = "SWING_FIXED_LEFT"; +IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT = "SWING_FIXED_RIGHT"; +IfcDoorTypeOperationEnum.USERDEFINED = "USERDEFINED"; +IfcDoorTypeOperationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDuctFittingTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDuctFittingTypeEnum.BEND = "BEND"; +IfcDuctFittingTypeEnum.CONNECTOR = "CONNECTOR"; +IfcDuctFittingTypeEnum.ENTRY = "ENTRY"; +IfcDuctFittingTypeEnum.EXIT = "EXIT"; +IfcDuctFittingTypeEnum.JUNCTION = "JUNCTION"; +IfcDuctFittingTypeEnum.OBSTRUCTION = "OBSTRUCTION"; +IfcDuctFittingTypeEnum.TRANSITION = "TRANSITION"; +IfcDuctFittingTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDuctFittingTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDuctSegmentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDuctSegmentTypeEnum.RIGIDSEGMENT = "RIGIDSEGMENT"; +IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT = "FLEXIBLESEGMENT"; +IfcDuctSegmentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDuctSegmentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcDuctSilencerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcDuctSilencerTypeEnum.FLATOVAL = "FLATOVAL"; +IfcDuctSilencerTypeEnum.RECTANGULAR = "RECTANGULAR"; +IfcDuctSilencerTypeEnum.ROUND = "ROUND"; +IfcDuctSilencerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcDuctSilencerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElectricApplianceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElectricApplianceTypeEnum.DISHWASHER = "DISHWASHER"; +IfcElectricApplianceTypeEnum.ELECTRICCOOKER = "ELECTRICCOOKER"; +IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER = "FREESTANDINGELECTRICHEATER"; +IfcElectricApplianceTypeEnum.FREESTANDINGFAN = "FREESTANDINGFAN"; +IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER = "FREESTANDINGWATERHEATER"; +IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER = "FREESTANDINGWATERCOOLER"; +IfcElectricApplianceTypeEnum.FREEZER = "FREEZER"; +IfcElectricApplianceTypeEnum.FRIDGE_FREEZER = "FRIDGE_FREEZER"; +IfcElectricApplianceTypeEnum.HANDDRYER = "HANDDRYER"; +IfcElectricApplianceTypeEnum.KITCHENMACHINE = "KITCHENMACHINE"; +IfcElectricApplianceTypeEnum.MICROWAVE = "MICROWAVE"; +IfcElectricApplianceTypeEnum.PHOTOCOPIER = "PHOTOCOPIER"; +IfcElectricApplianceTypeEnum.REFRIGERATOR = "REFRIGERATOR"; +IfcElectricApplianceTypeEnum.TUMBLEDRYER = "TUMBLEDRYER"; +IfcElectricApplianceTypeEnum.VENDINGMACHINE = "VENDINGMACHINE"; +IfcElectricApplianceTypeEnum.WASHINGMACHINE = "WASHINGMACHINE"; +IfcElectricApplianceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcElectricApplianceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElectricDistributionBoardTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT = "CONSUMERUNIT"; +IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD = "DISTRIBUTIONBOARD"; +IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE = "MOTORCONTROLCENTRE"; +IfcElectricDistributionBoardTypeEnum.SWITCHBOARD = "SWITCHBOARD"; +IfcElectricDistributionBoardTypeEnum.USERDEFINED = "USERDEFINED"; +IfcElectricDistributionBoardTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElectricFlowStorageDeviceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElectricFlowStorageDeviceTypeEnum.BATTERY = "BATTERY"; +IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK = "CAPACITORBANK"; +IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER = "HARMONICFILTER"; +IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK = "INDUCTORBANK"; +IfcElectricFlowStorageDeviceTypeEnum.UPS = "UPS"; +IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElectricGeneratorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElectricGeneratorTypeEnum.CHP = "CHP"; +IfcElectricGeneratorTypeEnum.ENGINEGENERATOR = "ENGINEGENERATOR"; +IfcElectricGeneratorTypeEnum.STANDALONE = "STANDALONE"; +IfcElectricGeneratorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcElectricGeneratorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElectricMotorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElectricMotorTypeEnum.DC = "DC"; +IfcElectricMotorTypeEnum.INDUCTION = "INDUCTION"; +IfcElectricMotorTypeEnum.POLYPHASE = "POLYPHASE"; +IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS = "RELUCTANCESYNCHRONOUS"; +IfcElectricMotorTypeEnum.SYNCHRONOUS = "SYNCHRONOUS"; +IfcElectricMotorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcElectricMotorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElectricTimeControlTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElectricTimeControlTypeEnum.TIMECLOCK = "TIMECLOCK"; +IfcElectricTimeControlTypeEnum.TIMEDELAY = "TIMEDELAY"; +IfcElectricTimeControlTypeEnum.RELAY = "RELAY"; +IfcElectricTimeControlTypeEnum.USERDEFINED = "USERDEFINED"; +IfcElectricTimeControlTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElementAssemblyTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY = "ACCESSORY_ASSEMBLY"; +IfcElementAssemblyTypeEnum.ARCH = "ARCH"; +IfcElementAssemblyTypeEnum.BEAM_GRID = "BEAM_GRID"; +IfcElementAssemblyTypeEnum.BRACED_FRAME = "BRACED_FRAME"; +IfcElementAssemblyTypeEnum.GIRDER = "GIRDER"; +IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT = "REINFORCEMENT_UNIT"; +IfcElementAssemblyTypeEnum.RIGID_FRAME = "RIGID_FRAME"; +IfcElementAssemblyTypeEnum.SLAB_FIELD = "SLAB_FIELD"; +IfcElementAssemblyTypeEnum.TRUSS = "TRUSS"; +IfcElementAssemblyTypeEnum.ABUTMENT = "ABUTMENT"; +IfcElementAssemblyTypeEnum.PIER = "PIER"; +IfcElementAssemblyTypeEnum.PYLON = "PYLON"; +IfcElementAssemblyTypeEnum.CROSS_BRACING = "CROSS_BRACING"; +IfcElementAssemblyTypeEnum.DECK = "DECK"; +IfcElementAssemblyTypeEnum.USERDEFINED = "USERDEFINED"; +IfcElementAssemblyTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcElementCompositionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcElementCompositionEnum.COMPLEX = "COMPLEX"; +IfcElementCompositionEnum.ELEMENT = "ELEMENT"; +IfcElementCompositionEnum.PARTIAL = "PARTIAL"; +var IfcEngineTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcEngineTypeEnum.EXTERNALCOMBUSTION = "EXTERNALCOMBUSTION"; +IfcEngineTypeEnum.INTERNALCOMBUSTION = "INTERNALCOMBUSTION"; +IfcEngineTypeEnum.USERDEFINED = "USERDEFINED"; +IfcEngineTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcEvaporativeCoolerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER = "DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER"; +IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER = "DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER"; +IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER = "DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER"; +IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER = "DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER"; +IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER = "DIRECTEVAPORATIVEAIRWASHER"; +IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER = "INDIRECTEVAPORATIVEPACKAGEAIRCOOLER"; +IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL = "INDIRECTEVAPORATIVEWETCOIL"; +IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER = "INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER"; +IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION = "INDIRECTDIRECTCOMBINATION"; +IfcEvaporativeCoolerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcEvaporativeCoolerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcEvaporatorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcEvaporatorTypeEnum.DIRECTEXPANSION = "DIRECTEXPANSION"; +IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE = "DIRECTEXPANSIONSHELLANDTUBE"; +IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE = "DIRECTEXPANSIONTUBEINTUBE"; +IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE = "DIRECTEXPANSIONBRAZEDPLATE"; +IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE = "FLOODEDSHELLANDTUBE"; +IfcEvaporatorTypeEnum.SHELLANDCOIL = "SHELLANDCOIL"; +IfcEvaporatorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcEvaporatorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcEventTriggerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcEventTriggerTypeEnum.EVENTRULE = "EVENTRULE"; +IfcEventTriggerTypeEnum.EVENTMESSAGE = "EVENTMESSAGE"; +IfcEventTriggerTypeEnum.EVENTTIME = "EVENTTIME"; +IfcEventTriggerTypeEnum.EVENTCOMPLEX = "EVENTCOMPLEX"; +IfcEventTriggerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcEventTriggerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcEventTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcEventTypeEnum.STARTEVENT = "STARTEVENT"; +IfcEventTypeEnum.ENDEVENT = "ENDEVENT"; +IfcEventTypeEnum.INTERMEDIATEEVENT = "INTERMEDIATEEVENT"; +IfcEventTypeEnum.USERDEFINED = "USERDEFINED"; +IfcEventTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcExternalSpatialElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcExternalSpatialElementTypeEnum.EXTERNAL = "EXTERNAL"; +IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH = "EXTERNAL_EARTH"; +IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER = "EXTERNAL_WATER"; +IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE = "EXTERNAL_FIRE"; +IfcExternalSpatialElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcExternalSpatialElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFanTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED = "CENTRIFUGALFORWARDCURVED"; +IfcFanTypeEnum.CENTRIFUGALRADIAL = "CENTRIFUGALRADIAL"; +IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED = "CENTRIFUGALBACKWARDINCLINEDCURVED"; +IfcFanTypeEnum.CENTRIFUGALAIRFOIL = "CENTRIFUGALAIRFOIL"; +IfcFanTypeEnum.TUBEAXIAL = "TUBEAXIAL"; +IfcFanTypeEnum.VANEAXIAL = "VANEAXIAL"; +IfcFanTypeEnum.PROPELLORAXIAL = "PROPELLORAXIAL"; +IfcFanTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFanTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFastenerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFastenerTypeEnum.GLUE = "GLUE"; +IfcFastenerTypeEnum.MORTAR = "MORTAR"; +IfcFastenerTypeEnum.WELD = "WELD"; +IfcFastenerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFastenerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFilterTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFilterTypeEnum.AIRPARTICLEFILTER = "AIRPARTICLEFILTER"; +IfcFilterTypeEnum.COMPRESSEDAIRFILTER = "COMPRESSEDAIRFILTER"; +IfcFilterTypeEnum.ODORFILTER = "ODORFILTER"; +IfcFilterTypeEnum.OILFILTER = "OILFILTER"; +IfcFilterTypeEnum.STRAINER = "STRAINER"; +IfcFilterTypeEnum.WATERFILTER = "WATERFILTER"; +IfcFilterTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFilterTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFireSuppressionTerminalTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET = "BREECHINGINLET"; +IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT = "FIREHYDRANT"; +IfcFireSuppressionTerminalTypeEnum.HOSEREEL = "HOSEREEL"; +IfcFireSuppressionTerminalTypeEnum.SPRINKLER = "SPRINKLER"; +IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR = "SPRINKLERDEFLECTOR"; +IfcFireSuppressionTerminalTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFireSuppressionTerminalTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFlowDirectionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFlowDirectionEnum.SOURCE = "SOURCE"; +IfcFlowDirectionEnum.SINK = "SINK"; +IfcFlowDirectionEnum.SOURCEANDSINK = "SOURCEANDSINK"; +IfcFlowDirectionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFlowInstrumentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFlowInstrumentTypeEnum.PRESSUREGAUGE = "PRESSUREGAUGE"; +IfcFlowInstrumentTypeEnum.THERMOMETER = "THERMOMETER"; +IfcFlowInstrumentTypeEnum.AMMETER = "AMMETER"; +IfcFlowInstrumentTypeEnum.FREQUENCYMETER = "FREQUENCYMETER"; +IfcFlowInstrumentTypeEnum.POWERFACTORMETER = "POWERFACTORMETER"; +IfcFlowInstrumentTypeEnum.PHASEANGLEMETER = "PHASEANGLEMETER"; +IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK = "VOLTMETER_PEAK"; +IfcFlowInstrumentTypeEnum.VOLTMETER_RMS = "VOLTMETER_RMS"; +IfcFlowInstrumentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFlowInstrumentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFlowMeterTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFlowMeterTypeEnum.ENERGYMETER = "ENERGYMETER"; +IfcFlowMeterTypeEnum.GASMETER = "GASMETER"; +IfcFlowMeterTypeEnum.OILMETER = "OILMETER"; +IfcFlowMeterTypeEnum.WATERMETER = "WATERMETER"; +IfcFlowMeterTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFlowMeterTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFootingTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFootingTypeEnum.CAISSON_FOUNDATION = "CAISSON_FOUNDATION"; +IfcFootingTypeEnum.FOOTING_BEAM = "FOOTING_BEAM"; +IfcFootingTypeEnum.PAD_FOOTING = "PAD_FOOTING"; +IfcFootingTypeEnum.PILE_CAP = "PILE_CAP"; +IfcFootingTypeEnum.STRIP_FOOTING = "STRIP_FOOTING"; +IfcFootingTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFootingTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcFurnitureTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcFurnitureTypeEnum.CHAIR = "CHAIR"; +IfcFurnitureTypeEnum.TABLE = "TABLE"; +IfcFurnitureTypeEnum.DESK = "DESK"; +IfcFurnitureTypeEnum.BED = "BED"; +IfcFurnitureTypeEnum.FILECABINET = "FILECABINET"; +IfcFurnitureTypeEnum.SHELF = "SHELF"; +IfcFurnitureTypeEnum.SOFA = "SOFA"; +IfcFurnitureTypeEnum.USERDEFINED = "USERDEFINED"; +IfcFurnitureTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcGeographicElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcGeographicElementTypeEnum.TERRAIN = "TERRAIN"; +IfcGeographicElementTypeEnum.SOIL_BORING_POINT = "SOIL_BORING_POINT"; +IfcGeographicElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcGeographicElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcGeometricProjectionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcGeometricProjectionEnum.GRAPH_VIEW = "GRAPH_VIEW"; +IfcGeometricProjectionEnum.SKETCH_VIEW = "SKETCH_VIEW"; +IfcGeometricProjectionEnum.MODEL_VIEW = "MODEL_VIEW"; +IfcGeometricProjectionEnum.PLAN_VIEW = "PLAN_VIEW"; +IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW = "REFLECTED_PLAN_VIEW"; +IfcGeometricProjectionEnum.SECTION_VIEW = "SECTION_VIEW"; +IfcGeometricProjectionEnum.ELEVATION_VIEW = "ELEVATION_VIEW"; +IfcGeometricProjectionEnum.USERDEFINED = "USERDEFINED"; +IfcGeometricProjectionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcGlobalOrLocalEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcGlobalOrLocalEnum.GLOBAL_COORDS = "GLOBAL_COORDS"; +IfcGlobalOrLocalEnum.LOCAL_COORDS = "LOCAL_COORDS"; +var IfcGridTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcGridTypeEnum.RECTANGULAR = "RECTANGULAR"; +IfcGridTypeEnum.RADIAL = "RADIAL"; +IfcGridTypeEnum.TRIANGULAR = "TRIANGULAR"; +IfcGridTypeEnum.IRREGULAR = "IRREGULAR"; +IfcGridTypeEnum.USERDEFINED = "USERDEFINED"; +IfcGridTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcHeatExchangerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcHeatExchangerTypeEnum.PLATE = "PLATE"; +IfcHeatExchangerTypeEnum.SHELLANDTUBE = "SHELLANDTUBE"; +IfcHeatExchangerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcHeatExchangerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcHumidifierTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcHumidifierTypeEnum.STEAMINJECTION = "STEAMINJECTION"; +IfcHumidifierTypeEnum.ADIABATICAIRWASHER = "ADIABATICAIRWASHER"; +IfcHumidifierTypeEnum.ADIABATICPAN = "ADIABATICPAN"; +IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT = "ADIABATICWETTEDELEMENT"; +IfcHumidifierTypeEnum.ADIABATICATOMIZING = "ADIABATICATOMIZING"; +IfcHumidifierTypeEnum.ADIABATICULTRASONIC = "ADIABATICULTRASONIC"; +IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA = "ADIABATICRIGIDMEDIA"; +IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE = "ADIABATICCOMPRESSEDAIRNOZZLE"; +IfcHumidifierTypeEnum.ASSISTEDELECTRIC = "ASSISTEDELECTRIC"; +IfcHumidifierTypeEnum.ASSISTEDNATURALGAS = "ASSISTEDNATURALGAS"; +IfcHumidifierTypeEnum.ASSISTEDPROPANE = "ASSISTEDPROPANE"; +IfcHumidifierTypeEnum.ASSISTEDBUTANE = "ASSISTEDBUTANE"; +IfcHumidifierTypeEnum.ASSISTEDSTEAM = "ASSISTEDSTEAM"; +IfcHumidifierTypeEnum.USERDEFINED = "USERDEFINED"; +IfcHumidifierTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcInterceptorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcInterceptorTypeEnum.CYCLONIC = "CYCLONIC"; +IfcInterceptorTypeEnum.GREASE = "GREASE"; +IfcInterceptorTypeEnum.OIL = "OIL"; +IfcInterceptorTypeEnum.PETROL = "PETROL"; +IfcInterceptorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcInterceptorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcInternalOrExternalEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcInternalOrExternalEnum.INTERNAL = "INTERNAL"; +IfcInternalOrExternalEnum.EXTERNAL = "EXTERNAL"; +IfcInternalOrExternalEnum.EXTERNAL_EARTH = "EXTERNAL_EARTH"; +IfcInternalOrExternalEnum.EXTERNAL_WATER = "EXTERNAL_WATER"; +IfcInternalOrExternalEnum.EXTERNAL_FIRE = "EXTERNAL_FIRE"; +IfcInternalOrExternalEnum.NOTDEFINED = "NOTDEFINED"; +var IfcInventoryTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcInventoryTypeEnum.ASSETINVENTORY = "ASSETINVENTORY"; +IfcInventoryTypeEnum.SPACEINVENTORY = "SPACEINVENTORY"; +IfcInventoryTypeEnum.FURNITUREINVENTORY = "FURNITUREINVENTORY"; +IfcInventoryTypeEnum.USERDEFINED = "USERDEFINED"; +IfcInventoryTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcJunctionBoxTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcJunctionBoxTypeEnum.DATA = "DATA"; +IfcJunctionBoxTypeEnum.POWER = "POWER"; +IfcJunctionBoxTypeEnum.USERDEFINED = "USERDEFINED"; +IfcJunctionBoxTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcKnotType = class { + constructor(v) { + this.value = v; + } +}; +IfcKnotType.UNIFORM_KNOTS = "UNIFORM_KNOTS"; +IfcKnotType.QUASI_UNIFORM_KNOTS = "QUASI_UNIFORM_KNOTS"; +IfcKnotType.PIECEWISE_BEZIER_KNOTS = "PIECEWISE_BEZIER_KNOTS"; +IfcKnotType.UNSPECIFIED = "UNSPECIFIED"; +var IfcLaborResourceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLaborResourceTypeEnum.ADMINISTRATION = "ADMINISTRATION"; +IfcLaborResourceTypeEnum.CARPENTRY = "CARPENTRY"; +IfcLaborResourceTypeEnum.CLEANING = "CLEANING"; +IfcLaborResourceTypeEnum.CONCRETE = "CONCRETE"; +IfcLaborResourceTypeEnum.DRYWALL = "DRYWALL"; +IfcLaborResourceTypeEnum.ELECTRIC = "ELECTRIC"; +IfcLaborResourceTypeEnum.FINISHING = "FINISHING"; +IfcLaborResourceTypeEnum.FLOORING = "FLOORING"; +IfcLaborResourceTypeEnum.GENERAL = "GENERAL"; +IfcLaborResourceTypeEnum.HVAC = "HVAC"; +IfcLaborResourceTypeEnum.LANDSCAPING = "LANDSCAPING"; +IfcLaborResourceTypeEnum.MASONRY = "MASONRY"; +IfcLaborResourceTypeEnum.PAINTING = "PAINTING"; +IfcLaborResourceTypeEnum.PAVING = "PAVING"; +IfcLaborResourceTypeEnum.PLUMBING = "PLUMBING"; +IfcLaborResourceTypeEnum.ROOFING = "ROOFING"; +IfcLaborResourceTypeEnum.SITEGRADING = "SITEGRADING"; +IfcLaborResourceTypeEnum.STEELWORK = "STEELWORK"; +IfcLaborResourceTypeEnum.SURVEYING = "SURVEYING"; +IfcLaborResourceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcLaborResourceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcLampTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLampTypeEnum.COMPACTFLUORESCENT = "COMPACTFLUORESCENT"; +IfcLampTypeEnum.FLUORESCENT = "FLUORESCENT"; +IfcLampTypeEnum.HALOGEN = "HALOGEN"; +IfcLampTypeEnum.HIGHPRESSUREMERCURY = "HIGHPRESSUREMERCURY"; +IfcLampTypeEnum.HIGHPRESSURESODIUM = "HIGHPRESSURESODIUM"; +IfcLampTypeEnum.LED = "LED"; +IfcLampTypeEnum.METALHALIDE = "METALHALIDE"; +IfcLampTypeEnum.OLED = "OLED"; +IfcLampTypeEnum.TUNGSTENFILAMENT = "TUNGSTENFILAMENT"; +IfcLampTypeEnum.USERDEFINED = "USERDEFINED"; +IfcLampTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcLayerSetDirectionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLayerSetDirectionEnum.AXIS1 = "AXIS1"; +IfcLayerSetDirectionEnum.AXIS2 = "AXIS2"; +IfcLayerSetDirectionEnum.AXIS3 = "AXIS3"; +var IfcLightDistributionCurveEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLightDistributionCurveEnum.TYPE_A = "TYPE_A"; +IfcLightDistributionCurveEnum.TYPE_B = "TYPE_B"; +IfcLightDistributionCurveEnum.TYPE_C = "TYPE_C"; +IfcLightDistributionCurveEnum.NOTDEFINED = "NOTDEFINED"; +var IfcLightEmissionSourceEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLightEmissionSourceEnum.COMPACTFLUORESCENT = "COMPACTFLUORESCENT"; +IfcLightEmissionSourceEnum.FLUORESCENT = "FLUORESCENT"; +IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY = "HIGHPRESSUREMERCURY"; +IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM = "HIGHPRESSURESODIUM"; +IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE = "LIGHTEMITTINGDIODE"; +IfcLightEmissionSourceEnum.LOWPRESSURESODIUM = "LOWPRESSURESODIUM"; +IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN = "LOWVOLTAGEHALOGEN"; +IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN = "MAINVOLTAGEHALOGEN"; +IfcLightEmissionSourceEnum.METALHALIDE = "METALHALIDE"; +IfcLightEmissionSourceEnum.TUNGSTENFILAMENT = "TUNGSTENFILAMENT"; +IfcLightEmissionSourceEnum.NOTDEFINED = "NOTDEFINED"; +var IfcLightFixtureTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLightFixtureTypeEnum.POINTSOURCE = "POINTSOURCE"; +IfcLightFixtureTypeEnum.DIRECTIONSOURCE = "DIRECTIONSOURCE"; +IfcLightFixtureTypeEnum.SECURITYLIGHTING = "SECURITYLIGHTING"; +IfcLightFixtureTypeEnum.USERDEFINED = "USERDEFINED"; +IfcLightFixtureTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcLoadGroupTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLoadGroupTypeEnum.LOAD_GROUP = "LOAD_GROUP"; +IfcLoadGroupTypeEnum.LOAD_CASE = "LOAD_CASE"; +IfcLoadGroupTypeEnum.LOAD_COMBINATION = "LOAD_COMBINATION"; +IfcLoadGroupTypeEnum.USERDEFINED = "USERDEFINED"; +IfcLoadGroupTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcLogicalOperatorEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcLogicalOperatorEnum.LOGICALAND = "LOGICALAND"; +IfcLogicalOperatorEnum.LOGICALOR = "LOGICALOR"; +IfcLogicalOperatorEnum.LOGICALXOR = "LOGICALXOR"; +IfcLogicalOperatorEnum.LOGICALNOTAND = "LOGICALNOTAND"; +IfcLogicalOperatorEnum.LOGICALNOTOR = "LOGICALNOTOR"; +var IfcMechanicalFastenerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcMechanicalFastenerTypeEnum.ANCHORBOLT = "ANCHORBOLT"; +IfcMechanicalFastenerTypeEnum.BOLT = "BOLT"; +IfcMechanicalFastenerTypeEnum.DOWEL = "DOWEL"; +IfcMechanicalFastenerTypeEnum.NAIL = "NAIL"; +IfcMechanicalFastenerTypeEnum.NAILPLATE = "NAILPLATE"; +IfcMechanicalFastenerTypeEnum.RIVET = "RIVET"; +IfcMechanicalFastenerTypeEnum.SCREW = "SCREW"; +IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR = "SHEARCONNECTOR"; +IfcMechanicalFastenerTypeEnum.STAPLE = "STAPLE"; +IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR = "STUDSHEARCONNECTOR"; +IfcMechanicalFastenerTypeEnum.COUPLER = "COUPLER"; +IfcMechanicalFastenerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcMechanicalFastenerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcMedicalDeviceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcMedicalDeviceTypeEnum.AIRSTATION = "AIRSTATION"; +IfcMedicalDeviceTypeEnum.FEEDAIRUNIT = "FEEDAIRUNIT"; +IfcMedicalDeviceTypeEnum.OXYGENGENERATOR = "OXYGENGENERATOR"; +IfcMedicalDeviceTypeEnum.OXYGENPLANT = "OXYGENPLANT"; +IfcMedicalDeviceTypeEnum.VACUUMSTATION = "VACUUMSTATION"; +IfcMedicalDeviceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcMedicalDeviceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcMemberTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcMemberTypeEnum.BRACE = "BRACE"; +IfcMemberTypeEnum.CHORD = "CHORD"; +IfcMemberTypeEnum.COLLAR = "COLLAR"; +IfcMemberTypeEnum.MEMBER = "MEMBER"; +IfcMemberTypeEnum.MULLION = "MULLION"; +IfcMemberTypeEnum.PLATE = "PLATE"; +IfcMemberTypeEnum.POST = "POST"; +IfcMemberTypeEnum.PURLIN = "PURLIN"; +IfcMemberTypeEnum.RAFTER = "RAFTER"; +IfcMemberTypeEnum.STRINGER = "STRINGER"; +IfcMemberTypeEnum.STRUT = "STRUT"; +IfcMemberTypeEnum.STUD = "STUD"; +IfcMemberTypeEnum.STIFFENING_RIB = "STIFFENING_RIB"; +IfcMemberTypeEnum.ARCH_SEGMENT = "ARCH_SEGMENT"; +IfcMemberTypeEnum.SUSPENSION_CABLE = "SUSPENSION_CABLE"; +IfcMemberTypeEnum.SUSPENDER = "SUSPENDER"; +IfcMemberTypeEnum.STAY_CABLE = "STAY_CABLE"; +IfcMemberTypeEnum.USERDEFINED = "USERDEFINED"; +IfcMemberTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcMotorConnectionTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcMotorConnectionTypeEnum.BELTDRIVE = "BELTDRIVE"; +IfcMotorConnectionTypeEnum.COUPLING = "COUPLING"; +IfcMotorConnectionTypeEnum.DIRECTDRIVE = "DIRECTDRIVE"; +IfcMotorConnectionTypeEnum.USERDEFINED = "USERDEFINED"; +IfcMotorConnectionTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcNullStyle = class { + constructor(v) { + this.value = v; + } +}; +IfcNullStyle.NULL = "NULL"; +var IfcObjectTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcObjectTypeEnum.PRODUCT = "PRODUCT"; +IfcObjectTypeEnum.PROCESS = "PROCESS"; +IfcObjectTypeEnum.CONTROL = "CONTROL"; +IfcObjectTypeEnum.RESOURCE = "RESOURCE"; +IfcObjectTypeEnum.ACTOR = "ACTOR"; +IfcObjectTypeEnum.GROUP = "GROUP"; +IfcObjectTypeEnum.PROJECT = "PROJECT"; +IfcObjectTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcObjectiveEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcObjectiveEnum.CODECOMPLIANCE = "CODECOMPLIANCE"; +IfcObjectiveEnum.CODEWAIVER = "CODEWAIVER"; +IfcObjectiveEnum.DESIGNINTENT = "DESIGNINTENT"; +IfcObjectiveEnum.EXTERNAL = "EXTERNAL"; +IfcObjectiveEnum.HEALTHANDSAFETY = "HEALTHANDSAFETY"; +IfcObjectiveEnum.MERGECONFLICT = "MERGECONFLICT"; +IfcObjectiveEnum.MODELVIEW = "MODELVIEW"; +IfcObjectiveEnum.PARAMETER = "PARAMETER"; +IfcObjectiveEnum.REQUIREMENT = "REQUIREMENT"; +IfcObjectiveEnum.SPECIFICATION = "SPECIFICATION"; +IfcObjectiveEnum.TRIGGERCONDITION = "TRIGGERCONDITION"; +IfcObjectiveEnum.USERDEFINED = "USERDEFINED"; +IfcObjectiveEnum.NOTDEFINED = "NOTDEFINED"; +var IfcOccupantTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcOccupantTypeEnum.ASSIGNEE = "ASSIGNEE"; +IfcOccupantTypeEnum.ASSIGNOR = "ASSIGNOR"; +IfcOccupantTypeEnum.LESSEE = "LESSEE"; +IfcOccupantTypeEnum.LESSOR = "LESSOR"; +IfcOccupantTypeEnum.LETTINGAGENT = "LETTINGAGENT"; +IfcOccupantTypeEnum.OWNER = "OWNER"; +IfcOccupantTypeEnum.TENANT = "TENANT"; +IfcOccupantTypeEnum.USERDEFINED = "USERDEFINED"; +IfcOccupantTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcOpeningElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcOpeningElementTypeEnum.OPENING = "OPENING"; +IfcOpeningElementTypeEnum.RECESS = "RECESS"; +IfcOpeningElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcOpeningElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcOutletTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcOutletTypeEnum.AUDIOVISUALOUTLET = "AUDIOVISUALOUTLET"; +IfcOutletTypeEnum.COMMUNICATIONSOUTLET = "COMMUNICATIONSOUTLET"; +IfcOutletTypeEnum.POWEROUTLET = "POWEROUTLET"; +IfcOutletTypeEnum.DATAOUTLET = "DATAOUTLET"; +IfcOutletTypeEnum.TELEPHONEOUTLET = "TELEPHONEOUTLET"; +IfcOutletTypeEnum.USERDEFINED = "USERDEFINED"; +IfcOutletTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPerformanceHistoryTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPerformanceHistoryTypeEnum.USERDEFINED = "USERDEFINED"; +IfcPerformanceHistoryTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPermeableCoveringOperationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPermeableCoveringOperationEnum.GRILL = "GRILL"; +IfcPermeableCoveringOperationEnum.LOUVER = "LOUVER"; +IfcPermeableCoveringOperationEnum.SCREEN = "SCREEN"; +IfcPermeableCoveringOperationEnum.USERDEFINED = "USERDEFINED"; +IfcPermeableCoveringOperationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPermitTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPermitTypeEnum.ACCESS = "ACCESS"; +IfcPermitTypeEnum.BUILDING = "BUILDING"; +IfcPermitTypeEnum.WORK = "WORK"; +IfcPermitTypeEnum.USERDEFINED = "USERDEFINED"; +IfcPermitTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPhysicalOrVirtualEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPhysicalOrVirtualEnum.PHYSICAL = "PHYSICAL"; +IfcPhysicalOrVirtualEnum.VIRTUAL = "VIRTUAL"; +IfcPhysicalOrVirtualEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPileConstructionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPileConstructionEnum.CAST_IN_PLACE = "CAST_IN_PLACE"; +IfcPileConstructionEnum.COMPOSITE = "COMPOSITE"; +IfcPileConstructionEnum.PRECAST_CONCRETE = "PRECAST_CONCRETE"; +IfcPileConstructionEnum.PREFAB_STEEL = "PREFAB_STEEL"; +IfcPileConstructionEnum.USERDEFINED = "USERDEFINED"; +IfcPileConstructionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPileTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPileTypeEnum.BORED = "BORED"; +IfcPileTypeEnum.DRIVEN = "DRIVEN"; +IfcPileTypeEnum.JETGROUTING = "JETGROUTING"; +IfcPileTypeEnum.COHESION = "COHESION"; +IfcPileTypeEnum.FRICTION = "FRICTION"; +IfcPileTypeEnum.SUPPORT = "SUPPORT"; +IfcPileTypeEnum.USERDEFINED = "USERDEFINED"; +IfcPileTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPipeFittingTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPipeFittingTypeEnum.BEND = "BEND"; +IfcPipeFittingTypeEnum.CONNECTOR = "CONNECTOR"; +IfcPipeFittingTypeEnum.ENTRY = "ENTRY"; +IfcPipeFittingTypeEnum.EXIT = "EXIT"; +IfcPipeFittingTypeEnum.JUNCTION = "JUNCTION"; +IfcPipeFittingTypeEnum.OBSTRUCTION = "OBSTRUCTION"; +IfcPipeFittingTypeEnum.TRANSITION = "TRANSITION"; +IfcPipeFittingTypeEnum.USERDEFINED = "USERDEFINED"; +IfcPipeFittingTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPipeSegmentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPipeSegmentTypeEnum.CULVERT = "CULVERT"; +IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT = "FLEXIBLESEGMENT"; +IfcPipeSegmentTypeEnum.RIGIDSEGMENT = "RIGIDSEGMENT"; +IfcPipeSegmentTypeEnum.GUTTER = "GUTTER"; +IfcPipeSegmentTypeEnum.SPOOL = "SPOOL"; +IfcPipeSegmentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcPipeSegmentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPlateTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPlateTypeEnum.CURTAIN_PANEL = "CURTAIN_PANEL"; +IfcPlateTypeEnum.SHEET = "SHEET"; +IfcPlateTypeEnum.FLANGE_PLATE = "FLANGE_PLATE"; +IfcPlateTypeEnum.WEB_PLATE = "WEB_PLATE"; +IfcPlateTypeEnum.STIFFENER_PLATE = "STIFFENER_PLATE"; +IfcPlateTypeEnum.GUSSET_PLATE = "GUSSET_PLATE"; +IfcPlateTypeEnum.COVER_PLATE = "COVER_PLATE"; +IfcPlateTypeEnum.SPLICE_PLATE = "SPLICE_PLATE"; +IfcPlateTypeEnum.BASE_PLATE = "BASE_PLATE"; +IfcPlateTypeEnum.USERDEFINED = "USERDEFINED"; +IfcPlateTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPreferredSurfaceCurveRepresentation = class { + constructor(v) { + this.value = v; + } +}; +IfcPreferredSurfaceCurveRepresentation.CURVE3D = "CURVE3D"; +IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 = "PCURVE_S1"; +IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 = "PCURVE_S2"; +var IfcProcedureTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcProcedureTypeEnum.ADVICE_CAUTION = "ADVICE_CAUTION"; +IfcProcedureTypeEnum.ADVICE_NOTE = "ADVICE_NOTE"; +IfcProcedureTypeEnum.ADVICE_WARNING = "ADVICE_WARNING"; +IfcProcedureTypeEnum.CALIBRATION = "CALIBRATION"; +IfcProcedureTypeEnum.DIAGNOSTIC = "DIAGNOSTIC"; +IfcProcedureTypeEnum.SHUTDOWN = "SHUTDOWN"; +IfcProcedureTypeEnum.STARTUP = "STARTUP"; +IfcProcedureTypeEnum.USERDEFINED = "USERDEFINED"; +IfcProcedureTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcProfileTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcProfileTypeEnum.CURVE = "CURVE"; +IfcProfileTypeEnum.AREA = "AREA"; +var IfcProjectOrderTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcProjectOrderTypeEnum.CHANGEORDER = "CHANGEORDER"; +IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER = "MAINTENANCEWORKORDER"; +IfcProjectOrderTypeEnum.MOVEORDER = "MOVEORDER"; +IfcProjectOrderTypeEnum.PURCHASEORDER = "PURCHASEORDER"; +IfcProjectOrderTypeEnum.WORKORDER = "WORKORDER"; +IfcProjectOrderTypeEnum.USERDEFINED = "USERDEFINED"; +IfcProjectOrderTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcProjectedOrTrueLengthEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH = "PROJECTED_LENGTH"; +IfcProjectedOrTrueLengthEnum.TRUE_LENGTH = "TRUE_LENGTH"; +var IfcProjectionElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcProjectionElementTypeEnum.BLISTER = "BLISTER"; +IfcProjectionElementTypeEnum.DEVIATOR = "DEVIATOR"; +IfcProjectionElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcProjectionElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPropertySetTemplateTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY = "PSET_TYPEDRIVENONLY"; +IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE = "PSET_TYPEDRIVENOVERRIDE"; +IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN = "PSET_OCCURRENCEDRIVEN"; +IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN = "PSET_PERFORMANCEDRIVEN"; +IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY = "QTO_TYPEDRIVENONLY"; +IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE = "QTO_TYPEDRIVENOVERRIDE"; +IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN = "QTO_OCCURRENCEDRIVEN"; +IfcPropertySetTemplateTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcProtectiveDeviceTrippingUnitTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC = "ELECTRONIC"; +IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC = "ELECTROMAGNETIC"; +IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT = "RESIDUALCURRENT"; +IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL = "THERMAL"; +IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED = "USERDEFINED"; +IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcProtectiveDeviceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER = "CIRCUITBREAKER"; +IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER = "EARTHLEAKAGECIRCUITBREAKER"; +IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH = "EARTHINGSWITCH"; +IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR = "FUSEDISCONNECTOR"; +IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER = "RESIDUALCURRENTCIRCUITBREAKER"; +IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH = "RESIDUALCURRENTSWITCH"; +IfcProtectiveDeviceTypeEnum.VARISTOR = "VARISTOR"; +IfcProtectiveDeviceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcProtectiveDeviceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcPumpTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcPumpTypeEnum.CIRCULATOR = "CIRCULATOR"; +IfcPumpTypeEnum.ENDSUCTION = "ENDSUCTION"; +IfcPumpTypeEnum.SPLITCASE = "SPLITCASE"; +IfcPumpTypeEnum.SUBMERSIBLEPUMP = "SUBMERSIBLEPUMP"; +IfcPumpTypeEnum.SUMPPUMP = "SUMPPUMP"; +IfcPumpTypeEnum.VERTICALINLINE = "VERTICALINLINE"; +IfcPumpTypeEnum.VERTICALTURBINE = "VERTICALTURBINE"; +IfcPumpTypeEnum.USERDEFINED = "USERDEFINED"; +IfcPumpTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcRailingTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcRailingTypeEnum.HANDRAIL = "HANDRAIL"; +IfcRailingTypeEnum.GUARDRAIL = "GUARDRAIL"; +IfcRailingTypeEnum.BALUSTRADE = "BALUSTRADE"; +IfcRailingTypeEnum.USERDEFINED = "USERDEFINED"; +IfcRailingTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcRampFlightTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcRampFlightTypeEnum.STRAIGHT = "STRAIGHT"; +IfcRampFlightTypeEnum.SPIRAL = "SPIRAL"; +IfcRampFlightTypeEnum.USERDEFINED = "USERDEFINED"; +IfcRampFlightTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcRampTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcRampTypeEnum.STRAIGHT_RUN_RAMP = "STRAIGHT_RUN_RAMP"; +IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP = "TWO_STRAIGHT_RUN_RAMP"; +IfcRampTypeEnum.QUARTER_TURN_RAMP = "QUARTER_TURN_RAMP"; +IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP = "TWO_QUARTER_TURN_RAMP"; +IfcRampTypeEnum.HALF_TURN_RAMP = "HALF_TURN_RAMP"; +IfcRampTypeEnum.SPIRAL_RAMP = "SPIRAL_RAMP"; +IfcRampTypeEnum.USERDEFINED = "USERDEFINED"; +IfcRampTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcRecurrenceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcRecurrenceTypeEnum.DAILY = "DAILY"; +IfcRecurrenceTypeEnum.WEEKLY = "WEEKLY"; +IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH = "MONTHLY_BY_DAY_OF_MONTH"; +IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION = "MONTHLY_BY_POSITION"; +IfcRecurrenceTypeEnum.BY_DAY_COUNT = "BY_DAY_COUNT"; +IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT = "BY_WEEKDAY_COUNT"; +IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH = "YEARLY_BY_DAY_OF_MONTH"; +IfcRecurrenceTypeEnum.YEARLY_BY_POSITION = "YEARLY_BY_POSITION"; +var IfcReferentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcReferentTypeEnum.KILOPOINT = "KILOPOINT"; +IfcReferentTypeEnum.MILEPOINT = "MILEPOINT"; +IfcReferentTypeEnum.STATION = "STATION"; +IfcReferentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcReferentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcReflectanceMethodEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcReflectanceMethodEnum.BLINN = "BLINN"; +IfcReflectanceMethodEnum.FLAT = "FLAT"; +IfcReflectanceMethodEnum.GLASS = "GLASS"; +IfcReflectanceMethodEnum.MATT = "MATT"; +IfcReflectanceMethodEnum.METAL = "METAL"; +IfcReflectanceMethodEnum.MIRROR = "MIRROR"; +IfcReflectanceMethodEnum.PHONG = "PHONG"; +IfcReflectanceMethodEnum.PLASTIC = "PLASTIC"; +IfcReflectanceMethodEnum.STRAUSS = "STRAUSS"; +IfcReflectanceMethodEnum.NOTDEFINED = "NOTDEFINED"; +var IfcReinforcingBarRoleEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcReinforcingBarRoleEnum.MAIN = "MAIN"; +IfcReinforcingBarRoleEnum.SHEAR = "SHEAR"; +IfcReinforcingBarRoleEnum.LIGATURE = "LIGATURE"; +IfcReinforcingBarRoleEnum.STUD = "STUD"; +IfcReinforcingBarRoleEnum.PUNCHING = "PUNCHING"; +IfcReinforcingBarRoleEnum.EDGE = "EDGE"; +IfcReinforcingBarRoleEnum.RING = "RING"; +IfcReinforcingBarRoleEnum.ANCHORING = "ANCHORING"; +IfcReinforcingBarRoleEnum.USERDEFINED = "USERDEFINED"; +IfcReinforcingBarRoleEnum.NOTDEFINED = "NOTDEFINED"; +var IfcReinforcingBarSurfaceEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcReinforcingBarSurfaceEnum.PLAIN = "PLAIN"; +IfcReinforcingBarSurfaceEnum.TEXTURED = "TEXTURED"; +var IfcReinforcingBarTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcReinforcingBarTypeEnum.ANCHORING = "ANCHORING"; +IfcReinforcingBarTypeEnum.EDGE = "EDGE"; +IfcReinforcingBarTypeEnum.LIGATURE = "LIGATURE"; +IfcReinforcingBarTypeEnum.MAIN = "MAIN"; +IfcReinforcingBarTypeEnum.PUNCHING = "PUNCHING"; +IfcReinforcingBarTypeEnum.RING = "RING"; +IfcReinforcingBarTypeEnum.SHEAR = "SHEAR"; +IfcReinforcingBarTypeEnum.STUD = "STUD"; +IfcReinforcingBarTypeEnum.SPACEBAR = "SPACEBAR"; +IfcReinforcingBarTypeEnum.USERDEFINED = "USERDEFINED"; +IfcReinforcingBarTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcReinforcingMeshTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcReinforcingMeshTypeEnum.USERDEFINED = "USERDEFINED"; +IfcReinforcingMeshTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcRoleEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcRoleEnum.SUPPLIER = "SUPPLIER"; +IfcRoleEnum.MANUFACTURER = "MANUFACTURER"; +IfcRoleEnum.CONTRACTOR = "CONTRACTOR"; +IfcRoleEnum.SUBCONTRACTOR = "SUBCONTRACTOR"; +IfcRoleEnum.ARCHITECT = "ARCHITECT"; +IfcRoleEnum.STRUCTURALENGINEER = "STRUCTURALENGINEER"; +IfcRoleEnum.COSTENGINEER = "COSTENGINEER"; +IfcRoleEnum.CLIENT = "CLIENT"; +IfcRoleEnum.BUILDINGOWNER = "BUILDINGOWNER"; +IfcRoleEnum.BUILDINGOPERATOR = "BUILDINGOPERATOR"; +IfcRoleEnum.MECHANICALENGINEER = "MECHANICALENGINEER"; +IfcRoleEnum.ELECTRICALENGINEER = "ELECTRICALENGINEER"; +IfcRoleEnum.PROJECTMANAGER = "PROJECTMANAGER"; +IfcRoleEnum.FACILITIESMANAGER = "FACILITIESMANAGER"; +IfcRoleEnum.CIVILENGINEER = "CIVILENGINEER"; +IfcRoleEnum.COMMISSIONINGENGINEER = "COMMISSIONINGENGINEER"; +IfcRoleEnum.ENGINEER = "ENGINEER"; +IfcRoleEnum.OWNER = "OWNER"; +IfcRoleEnum.CONSULTANT = "CONSULTANT"; +IfcRoleEnum.CONSTRUCTIONMANAGER = "CONSTRUCTIONMANAGER"; +IfcRoleEnum.FIELDCONSTRUCTIONMANAGER = "FIELDCONSTRUCTIONMANAGER"; +IfcRoleEnum.RESELLER = "RESELLER"; +IfcRoleEnum.USERDEFINED = "USERDEFINED"; +var IfcRoofTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcRoofTypeEnum.FLAT_ROOF = "FLAT_ROOF"; +IfcRoofTypeEnum.SHED_ROOF = "SHED_ROOF"; +IfcRoofTypeEnum.GABLE_ROOF = "GABLE_ROOF"; +IfcRoofTypeEnum.HIP_ROOF = "HIP_ROOF"; +IfcRoofTypeEnum.HIPPED_GABLE_ROOF = "HIPPED_GABLE_ROOF"; +IfcRoofTypeEnum.GAMBREL_ROOF = "GAMBREL_ROOF"; +IfcRoofTypeEnum.MANSARD_ROOF = "MANSARD_ROOF"; +IfcRoofTypeEnum.BARREL_ROOF = "BARREL_ROOF"; +IfcRoofTypeEnum.RAINBOW_ROOF = "RAINBOW_ROOF"; +IfcRoofTypeEnum.BUTTERFLY_ROOF = "BUTTERFLY_ROOF"; +IfcRoofTypeEnum.PAVILION_ROOF = "PAVILION_ROOF"; +IfcRoofTypeEnum.DOME_ROOF = "DOME_ROOF"; +IfcRoofTypeEnum.FREEFORM = "FREEFORM"; +IfcRoofTypeEnum.USERDEFINED = "USERDEFINED"; +IfcRoofTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSIPrefix = class { + constructor(v) { + this.value = v; + } +}; +IfcSIPrefix.EXA = "EXA"; +IfcSIPrefix.PETA = "PETA"; +IfcSIPrefix.TERA = "TERA"; +IfcSIPrefix.GIGA = "GIGA"; +IfcSIPrefix.MEGA = "MEGA"; +IfcSIPrefix.KILO = "KILO"; +IfcSIPrefix.HECTO = "HECTO"; +IfcSIPrefix.DECA = "DECA"; +IfcSIPrefix.DECI = "DECI"; +IfcSIPrefix.CENTI = "CENTI"; +IfcSIPrefix.MILLI = "MILLI"; +IfcSIPrefix.MICRO = "MICRO"; +IfcSIPrefix.NANO = "NANO"; +IfcSIPrefix.PICO = "PICO"; +IfcSIPrefix.FEMTO = "FEMTO"; +IfcSIPrefix.ATTO = "ATTO"; +var IfcSIUnitName = class { + constructor(v) { + this.value = v; + } +}; +IfcSIUnitName.AMPERE = "AMPERE"; +IfcSIUnitName.BECQUEREL = "BECQUEREL"; +IfcSIUnitName.CANDELA = "CANDELA"; +IfcSIUnitName.COULOMB = "COULOMB"; +IfcSIUnitName.CUBIC_METRE = "CUBIC_METRE"; +IfcSIUnitName.DEGREE_CELSIUS = "DEGREE_CELSIUS"; +IfcSIUnitName.FARAD = "FARAD"; +IfcSIUnitName.GRAM = "GRAM"; +IfcSIUnitName.GRAY = "GRAY"; +IfcSIUnitName.HENRY = "HENRY"; +IfcSIUnitName.HERTZ = "HERTZ"; +IfcSIUnitName.JOULE = "JOULE"; +IfcSIUnitName.KELVIN = "KELVIN"; +IfcSIUnitName.LUMEN = "LUMEN"; +IfcSIUnitName.LUX = "LUX"; +IfcSIUnitName.METRE = "METRE"; +IfcSIUnitName.MOLE = "MOLE"; +IfcSIUnitName.NEWTON = "NEWTON"; +IfcSIUnitName.OHM = "OHM"; +IfcSIUnitName.PASCAL = "PASCAL"; +IfcSIUnitName.RADIAN = "RADIAN"; +IfcSIUnitName.SECOND = "SECOND"; +IfcSIUnitName.SIEMENS = "SIEMENS"; +IfcSIUnitName.SIEVERT = "SIEVERT"; +IfcSIUnitName.SQUARE_METRE = "SQUARE_METRE"; +IfcSIUnitName.STERADIAN = "STERADIAN"; +IfcSIUnitName.TESLA = "TESLA"; +IfcSIUnitName.VOLT = "VOLT"; +IfcSIUnitName.WATT = "WATT"; +IfcSIUnitName.WEBER = "WEBER"; +var IfcSanitaryTerminalTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSanitaryTerminalTypeEnum.BATH = "BATH"; +IfcSanitaryTerminalTypeEnum.BIDET = "BIDET"; +IfcSanitaryTerminalTypeEnum.CISTERN = "CISTERN"; +IfcSanitaryTerminalTypeEnum.SHOWER = "SHOWER"; +IfcSanitaryTerminalTypeEnum.SINK = "SINK"; +IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN = "SANITARYFOUNTAIN"; +IfcSanitaryTerminalTypeEnum.TOILETPAN = "TOILETPAN"; +IfcSanitaryTerminalTypeEnum.URINAL = "URINAL"; +IfcSanitaryTerminalTypeEnum.WASHHANDBASIN = "WASHHANDBASIN"; +IfcSanitaryTerminalTypeEnum.WCSEAT = "WCSEAT"; +IfcSanitaryTerminalTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSanitaryTerminalTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSectionTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSectionTypeEnum.UNIFORM = "UNIFORM"; +IfcSectionTypeEnum.TAPERED = "TAPERED"; +var IfcSensorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSensorTypeEnum.COSENSOR = "COSENSOR"; +IfcSensorTypeEnum.CO2SENSOR = "CO2SENSOR"; +IfcSensorTypeEnum.CONDUCTANCESENSOR = "CONDUCTANCESENSOR"; +IfcSensorTypeEnum.CONTACTSENSOR = "CONTACTSENSOR"; +IfcSensorTypeEnum.FIRESENSOR = "FIRESENSOR"; +IfcSensorTypeEnum.FLOWSENSOR = "FLOWSENSOR"; +IfcSensorTypeEnum.FROSTSENSOR = "FROSTSENSOR"; +IfcSensorTypeEnum.GASSENSOR = "GASSENSOR"; +IfcSensorTypeEnum.HEATSENSOR = "HEATSENSOR"; +IfcSensorTypeEnum.HUMIDITYSENSOR = "HUMIDITYSENSOR"; +IfcSensorTypeEnum.IDENTIFIERSENSOR = "IDENTIFIERSENSOR"; +IfcSensorTypeEnum.IONCONCENTRATIONSENSOR = "IONCONCENTRATIONSENSOR"; +IfcSensorTypeEnum.LEVELSENSOR = "LEVELSENSOR"; +IfcSensorTypeEnum.LIGHTSENSOR = "LIGHTSENSOR"; +IfcSensorTypeEnum.MOISTURESENSOR = "MOISTURESENSOR"; +IfcSensorTypeEnum.MOVEMENTSENSOR = "MOVEMENTSENSOR"; +IfcSensorTypeEnum.PHSENSOR = "PHSENSOR"; +IfcSensorTypeEnum.PRESSURESENSOR = "PRESSURESENSOR"; +IfcSensorTypeEnum.RADIATIONSENSOR = "RADIATIONSENSOR"; +IfcSensorTypeEnum.RADIOACTIVITYSENSOR = "RADIOACTIVITYSENSOR"; +IfcSensorTypeEnum.SMOKESENSOR = "SMOKESENSOR"; +IfcSensorTypeEnum.SOUNDSENSOR = "SOUNDSENSOR"; +IfcSensorTypeEnum.TEMPERATURESENSOR = "TEMPERATURESENSOR"; +IfcSensorTypeEnum.WINDSENSOR = "WINDSENSOR"; +IfcSensorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSensorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSequenceEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSequenceEnum.START_START = "START_START"; +IfcSequenceEnum.START_FINISH = "START_FINISH"; +IfcSequenceEnum.FINISH_START = "FINISH_START"; +IfcSequenceEnum.FINISH_FINISH = "FINISH_FINISH"; +IfcSequenceEnum.USERDEFINED = "USERDEFINED"; +IfcSequenceEnum.NOTDEFINED = "NOTDEFINED"; +var IfcShadingDeviceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcShadingDeviceTypeEnum.JALOUSIE = "JALOUSIE"; +IfcShadingDeviceTypeEnum.SHUTTER = "SHUTTER"; +IfcShadingDeviceTypeEnum.AWNING = "AWNING"; +IfcShadingDeviceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcShadingDeviceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSimplePropertyTemplateTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE = "P_SINGLEVALUE"; +IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE = "P_ENUMERATEDVALUE"; +IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE = "P_BOUNDEDVALUE"; +IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE = "P_LISTVALUE"; +IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE = "P_TABLEVALUE"; +IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE = "P_REFERENCEVALUE"; +IfcSimplePropertyTemplateTypeEnum.Q_LENGTH = "Q_LENGTH"; +IfcSimplePropertyTemplateTypeEnum.Q_AREA = "Q_AREA"; +IfcSimplePropertyTemplateTypeEnum.Q_VOLUME = "Q_VOLUME"; +IfcSimplePropertyTemplateTypeEnum.Q_COUNT = "Q_COUNT"; +IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT = "Q_WEIGHT"; +IfcSimplePropertyTemplateTypeEnum.Q_TIME = "Q_TIME"; +var IfcSlabTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSlabTypeEnum.FLOOR = "FLOOR"; +IfcSlabTypeEnum.ROOF = "ROOF"; +IfcSlabTypeEnum.LANDING = "LANDING"; +IfcSlabTypeEnum.BASESLAB = "BASESLAB"; +IfcSlabTypeEnum.APPROACH_SLAB = "APPROACH_SLAB"; +IfcSlabTypeEnum.PAVING = "PAVING"; +IfcSlabTypeEnum.WEARING = "WEARING"; +IfcSlabTypeEnum.SIDEWALK = "SIDEWALK"; +IfcSlabTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSlabTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSolarDeviceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSolarDeviceTypeEnum.SOLARCOLLECTOR = "SOLARCOLLECTOR"; +IfcSolarDeviceTypeEnum.SOLARPANEL = "SOLARPANEL"; +IfcSolarDeviceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSolarDeviceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSpaceHeaterTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSpaceHeaterTypeEnum.CONVECTOR = "CONVECTOR"; +IfcSpaceHeaterTypeEnum.RADIATOR = "RADIATOR"; +IfcSpaceHeaterTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSpaceHeaterTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSpaceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSpaceTypeEnum.SPACE = "SPACE"; +IfcSpaceTypeEnum.PARKING = "PARKING"; +IfcSpaceTypeEnum.GFA = "GFA"; +IfcSpaceTypeEnum.INTERNAL = "INTERNAL"; +IfcSpaceTypeEnum.EXTERNAL = "EXTERNAL"; +IfcSpaceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSpaceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSpatialZoneTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSpatialZoneTypeEnum.CONSTRUCTION = "CONSTRUCTION"; +IfcSpatialZoneTypeEnum.FIRESAFETY = "FIRESAFETY"; +IfcSpatialZoneTypeEnum.LIGHTING = "LIGHTING"; +IfcSpatialZoneTypeEnum.OCCUPANCY = "OCCUPANCY"; +IfcSpatialZoneTypeEnum.SECURITY = "SECURITY"; +IfcSpatialZoneTypeEnum.THERMAL = "THERMAL"; +IfcSpatialZoneTypeEnum.TRANSPORT = "TRANSPORT"; +IfcSpatialZoneTypeEnum.VENTILATION = "VENTILATION"; +IfcSpatialZoneTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSpatialZoneTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcStackTerminalTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStackTerminalTypeEnum.BIRDCAGE = "BIRDCAGE"; +IfcStackTerminalTypeEnum.COWL = "COWL"; +IfcStackTerminalTypeEnum.RAINWATERHOPPER = "RAINWATERHOPPER"; +IfcStackTerminalTypeEnum.USERDEFINED = "USERDEFINED"; +IfcStackTerminalTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcStairFlightTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStairFlightTypeEnum.STRAIGHT = "STRAIGHT"; +IfcStairFlightTypeEnum.WINDER = "WINDER"; +IfcStairFlightTypeEnum.SPIRAL = "SPIRAL"; +IfcStairFlightTypeEnum.CURVED = "CURVED"; +IfcStairFlightTypeEnum.FREEFORM = "FREEFORM"; +IfcStairFlightTypeEnum.USERDEFINED = "USERDEFINED"; +IfcStairFlightTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcStairTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStairTypeEnum.STRAIGHT_RUN_STAIR = "STRAIGHT_RUN_STAIR"; +IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR = "TWO_STRAIGHT_RUN_STAIR"; +IfcStairTypeEnum.QUARTER_WINDING_STAIR = "QUARTER_WINDING_STAIR"; +IfcStairTypeEnum.QUARTER_TURN_STAIR = "QUARTER_TURN_STAIR"; +IfcStairTypeEnum.HALF_WINDING_STAIR = "HALF_WINDING_STAIR"; +IfcStairTypeEnum.HALF_TURN_STAIR = "HALF_TURN_STAIR"; +IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR = "TWO_QUARTER_WINDING_STAIR"; +IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR = "TWO_QUARTER_TURN_STAIR"; +IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR = "THREE_QUARTER_WINDING_STAIR"; +IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR = "THREE_QUARTER_TURN_STAIR"; +IfcStairTypeEnum.SPIRAL_STAIR = "SPIRAL_STAIR"; +IfcStairTypeEnum.DOUBLE_RETURN_STAIR = "DOUBLE_RETURN_STAIR"; +IfcStairTypeEnum.CURVED_RUN_STAIR = "CURVED_RUN_STAIR"; +IfcStairTypeEnum.TWO_CURVED_RUN_STAIR = "TWO_CURVED_RUN_STAIR"; +IfcStairTypeEnum.USERDEFINED = "USERDEFINED"; +IfcStairTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcStateEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStateEnum.READWRITE = "READWRITE"; +IfcStateEnum.READONLY = "READONLY"; +IfcStateEnum.LOCKED = "LOCKED"; +IfcStateEnum.READWRITELOCKED = "READWRITELOCKED"; +IfcStateEnum.READONLYLOCKED = "READONLYLOCKED"; +var IfcStructuralCurveActivityTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStructuralCurveActivityTypeEnum.CONST = "CONST"; +IfcStructuralCurveActivityTypeEnum.LINEAR = "LINEAR"; +IfcStructuralCurveActivityTypeEnum.POLYGONAL = "POLYGONAL"; +IfcStructuralCurveActivityTypeEnum.EQUIDISTANT = "EQUIDISTANT"; +IfcStructuralCurveActivityTypeEnum.SINUS = "SINUS"; +IfcStructuralCurveActivityTypeEnum.PARABOLA = "PARABOLA"; +IfcStructuralCurveActivityTypeEnum.DISCRETE = "DISCRETE"; +IfcStructuralCurveActivityTypeEnum.USERDEFINED = "USERDEFINED"; +IfcStructuralCurveActivityTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcStructuralCurveMemberTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER = "RIGID_JOINED_MEMBER"; +IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER = "PIN_JOINED_MEMBER"; +IfcStructuralCurveMemberTypeEnum.CABLE = "CABLE"; +IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER = "TENSION_MEMBER"; +IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER = "COMPRESSION_MEMBER"; +IfcStructuralCurveMemberTypeEnum.USERDEFINED = "USERDEFINED"; +IfcStructuralCurveMemberTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcStructuralSurfaceActivityTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStructuralSurfaceActivityTypeEnum.CONST = "CONST"; +IfcStructuralSurfaceActivityTypeEnum.BILINEAR = "BILINEAR"; +IfcStructuralSurfaceActivityTypeEnum.DISCRETE = "DISCRETE"; +IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR = "ISOCONTOUR"; +IfcStructuralSurfaceActivityTypeEnum.USERDEFINED = "USERDEFINED"; +IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcStructuralSurfaceMemberTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT = "BENDING_ELEMENT"; +IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT = "MEMBRANE_ELEMENT"; +IfcStructuralSurfaceMemberTypeEnum.SHELL = "SHELL"; +IfcStructuralSurfaceMemberTypeEnum.USERDEFINED = "USERDEFINED"; +IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSubContractResourceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSubContractResourceTypeEnum.PURCHASE = "PURCHASE"; +IfcSubContractResourceTypeEnum.WORK = "WORK"; +IfcSubContractResourceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSubContractResourceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSurfaceFeatureTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSurfaceFeatureTypeEnum.MARK = "MARK"; +IfcSurfaceFeatureTypeEnum.TAG = "TAG"; +IfcSurfaceFeatureTypeEnum.TREATMENT = "TREATMENT"; +IfcSurfaceFeatureTypeEnum.DEFECT = "DEFECT"; +IfcSurfaceFeatureTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSurfaceFeatureTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSurfaceSide = class { + constructor(v) { + this.value = v; + } +}; +IfcSurfaceSide.POSITIVE = "POSITIVE"; +IfcSurfaceSide.NEGATIVE = "NEGATIVE"; +IfcSurfaceSide.BOTH = "BOTH"; +var IfcSwitchingDeviceTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSwitchingDeviceTypeEnum.CONTACTOR = "CONTACTOR"; +IfcSwitchingDeviceTypeEnum.DIMMERSWITCH = "DIMMERSWITCH"; +IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP = "EMERGENCYSTOP"; +IfcSwitchingDeviceTypeEnum.KEYPAD = "KEYPAD"; +IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH = "MOMENTARYSWITCH"; +IfcSwitchingDeviceTypeEnum.SELECTORSWITCH = "SELECTORSWITCH"; +IfcSwitchingDeviceTypeEnum.STARTER = "STARTER"; +IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR = "SWITCHDISCONNECTOR"; +IfcSwitchingDeviceTypeEnum.TOGGLESWITCH = "TOGGLESWITCH"; +IfcSwitchingDeviceTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSwitchingDeviceTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcSystemFurnitureElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcSystemFurnitureElementTypeEnum.PANEL = "PANEL"; +IfcSystemFurnitureElementTypeEnum.WORKSURFACE = "WORKSURFACE"; +IfcSystemFurnitureElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcSystemFurnitureElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTankTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTankTypeEnum.BASIN = "BASIN"; +IfcTankTypeEnum.BREAKPRESSURE = "BREAKPRESSURE"; +IfcTankTypeEnum.EXPANSION = "EXPANSION"; +IfcTankTypeEnum.FEEDANDEXPANSION = "FEEDANDEXPANSION"; +IfcTankTypeEnum.PRESSUREVESSEL = "PRESSUREVESSEL"; +IfcTankTypeEnum.STORAGE = "STORAGE"; +IfcTankTypeEnum.VESSEL = "VESSEL"; +IfcTankTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTankTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTaskDurationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTaskDurationEnum.ELAPSEDTIME = "ELAPSEDTIME"; +IfcTaskDurationEnum.WORKTIME = "WORKTIME"; +IfcTaskDurationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTaskTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTaskTypeEnum.ATTENDANCE = "ATTENDANCE"; +IfcTaskTypeEnum.CONSTRUCTION = "CONSTRUCTION"; +IfcTaskTypeEnum.DEMOLITION = "DEMOLITION"; +IfcTaskTypeEnum.DISMANTLE = "DISMANTLE"; +IfcTaskTypeEnum.DISPOSAL = "DISPOSAL"; +IfcTaskTypeEnum.INSTALLATION = "INSTALLATION"; +IfcTaskTypeEnum.LOGISTIC = "LOGISTIC"; +IfcTaskTypeEnum.MAINTENANCE = "MAINTENANCE"; +IfcTaskTypeEnum.MOVE = "MOVE"; +IfcTaskTypeEnum.OPERATION = "OPERATION"; +IfcTaskTypeEnum.REMOVAL = "REMOVAL"; +IfcTaskTypeEnum.RENOVATION = "RENOVATION"; +IfcTaskTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTaskTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTendonAnchorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTendonAnchorTypeEnum.COUPLER = "COUPLER"; +IfcTendonAnchorTypeEnum.FIXED_END = "FIXED_END"; +IfcTendonAnchorTypeEnum.TENSIONING_END = "TENSIONING_END"; +IfcTendonAnchorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTendonAnchorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTendonConduitTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTendonConduitTypeEnum.DUCT = "DUCT"; +IfcTendonConduitTypeEnum.COUPLER = "COUPLER"; +IfcTendonConduitTypeEnum.GROUTING_DUCT = "GROUTING_DUCT"; +IfcTendonConduitTypeEnum.TRUMPET = "TRUMPET"; +IfcTendonConduitTypeEnum.DIABOLO = "DIABOLO"; +IfcTendonConduitTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTendonConduitTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTendonTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTendonTypeEnum.BAR = "BAR"; +IfcTendonTypeEnum.COATED = "COATED"; +IfcTendonTypeEnum.STRAND = "STRAND"; +IfcTendonTypeEnum.WIRE = "WIRE"; +IfcTendonTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTendonTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTextPath = class { + constructor(v) { + this.value = v; + } +}; +IfcTextPath.LEFT = "LEFT"; +IfcTextPath.RIGHT = "RIGHT"; +IfcTextPath.UP = "UP"; +IfcTextPath.DOWN = "DOWN"; +var IfcTimeSeriesDataTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTimeSeriesDataTypeEnum.CONTINUOUS = "CONTINUOUS"; +IfcTimeSeriesDataTypeEnum.DISCRETE = "DISCRETE"; +IfcTimeSeriesDataTypeEnum.DISCRETEBINARY = "DISCRETEBINARY"; +IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY = "PIECEWISEBINARY"; +IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT = "PIECEWISECONSTANT"; +IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS = "PIECEWISECONTINUOUS"; +IfcTimeSeriesDataTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTransformerTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTransformerTypeEnum.CURRENT = "CURRENT"; +IfcTransformerTypeEnum.FREQUENCY = "FREQUENCY"; +IfcTransformerTypeEnum.INVERTER = "INVERTER"; +IfcTransformerTypeEnum.RECTIFIER = "RECTIFIER"; +IfcTransformerTypeEnum.VOLTAGE = "VOLTAGE"; +IfcTransformerTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTransformerTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTransitionCode = class { + constructor(v) { + this.value = v; + } +}; +IfcTransitionCode.DISCONTINUOUS = "DISCONTINUOUS"; +IfcTransitionCode.CONTINUOUS = "CONTINUOUS"; +IfcTransitionCode.CONTSAMEGRADIENT = "CONTSAMEGRADIENT"; +IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE = "CONTSAMEGRADIENTSAMECURVATURE"; +var IfcTransitionCurveType = class { + constructor(v) { + this.value = v; + } +}; +IfcTransitionCurveType.BIQUADRATICPARABOLA = "BIQUADRATICPARABOLA"; +IfcTransitionCurveType.BLOSSCURVE = "BLOSSCURVE"; +IfcTransitionCurveType.CLOTHOIDCURVE = "CLOTHOIDCURVE"; +IfcTransitionCurveType.COSINECURVE = "COSINECURVE"; +IfcTransitionCurveType.CUBICPARABOLA = "CUBICPARABOLA"; +IfcTransitionCurveType.SINECURVE = "SINECURVE"; +var IfcTransportElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTransportElementTypeEnum.ELEVATOR = "ELEVATOR"; +IfcTransportElementTypeEnum.ESCALATOR = "ESCALATOR"; +IfcTransportElementTypeEnum.MOVINGWALKWAY = "MOVINGWALKWAY"; +IfcTransportElementTypeEnum.CRANEWAY = "CRANEWAY"; +IfcTransportElementTypeEnum.LIFTINGGEAR = "LIFTINGGEAR"; +IfcTransportElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTransportElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcTrimmingPreference = class { + constructor(v) { + this.value = v; + } +}; +IfcTrimmingPreference.CARTESIAN = "CARTESIAN"; +IfcTrimmingPreference.PARAMETER = "PARAMETER"; +IfcTrimmingPreference.UNSPECIFIED = "UNSPECIFIED"; +var IfcTubeBundleTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcTubeBundleTypeEnum.FINNED = "FINNED"; +IfcTubeBundleTypeEnum.USERDEFINED = "USERDEFINED"; +IfcTubeBundleTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcUnitEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcUnitEnum.ABSORBEDDOSEUNIT = "ABSORBEDDOSEUNIT"; +IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT = "AMOUNTOFSUBSTANCEUNIT"; +IfcUnitEnum.AREAUNIT = "AREAUNIT"; +IfcUnitEnum.DOSEEQUIVALENTUNIT = "DOSEEQUIVALENTUNIT"; +IfcUnitEnum.ELECTRICCAPACITANCEUNIT = "ELECTRICCAPACITANCEUNIT"; +IfcUnitEnum.ELECTRICCHARGEUNIT = "ELECTRICCHARGEUNIT"; +IfcUnitEnum.ELECTRICCONDUCTANCEUNIT = "ELECTRICCONDUCTANCEUNIT"; +IfcUnitEnum.ELECTRICCURRENTUNIT = "ELECTRICCURRENTUNIT"; +IfcUnitEnum.ELECTRICRESISTANCEUNIT = "ELECTRICRESISTANCEUNIT"; +IfcUnitEnum.ELECTRICVOLTAGEUNIT = "ELECTRICVOLTAGEUNIT"; +IfcUnitEnum.ENERGYUNIT = "ENERGYUNIT"; +IfcUnitEnum.FORCEUNIT = "FORCEUNIT"; +IfcUnitEnum.FREQUENCYUNIT = "FREQUENCYUNIT"; +IfcUnitEnum.ILLUMINANCEUNIT = "ILLUMINANCEUNIT"; +IfcUnitEnum.INDUCTANCEUNIT = "INDUCTANCEUNIT"; +IfcUnitEnum.LENGTHUNIT = "LENGTHUNIT"; +IfcUnitEnum.LUMINOUSFLUXUNIT = "LUMINOUSFLUXUNIT"; +IfcUnitEnum.LUMINOUSINTENSITYUNIT = "LUMINOUSINTENSITYUNIT"; +IfcUnitEnum.MAGNETICFLUXDENSITYUNIT = "MAGNETICFLUXDENSITYUNIT"; +IfcUnitEnum.MAGNETICFLUXUNIT = "MAGNETICFLUXUNIT"; +IfcUnitEnum.MASSUNIT = "MASSUNIT"; +IfcUnitEnum.PLANEANGLEUNIT = "PLANEANGLEUNIT"; +IfcUnitEnum.POWERUNIT = "POWERUNIT"; +IfcUnitEnum.PRESSUREUNIT = "PRESSUREUNIT"; +IfcUnitEnum.RADIOACTIVITYUNIT = "RADIOACTIVITYUNIT"; +IfcUnitEnum.SOLIDANGLEUNIT = "SOLIDANGLEUNIT"; +IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT = "THERMODYNAMICTEMPERATUREUNIT"; +IfcUnitEnum.TIMEUNIT = "TIMEUNIT"; +IfcUnitEnum.VOLUMEUNIT = "VOLUMEUNIT"; +IfcUnitEnum.USERDEFINED = "USERDEFINED"; +var IfcUnitaryControlElementTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcUnitaryControlElementTypeEnum.ALARMPANEL = "ALARMPANEL"; +IfcUnitaryControlElementTypeEnum.CONTROLPANEL = "CONTROLPANEL"; +IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL = "GASDETECTIONPANEL"; +IfcUnitaryControlElementTypeEnum.INDICATORPANEL = "INDICATORPANEL"; +IfcUnitaryControlElementTypeEnum.MIMICPANEL = "MIMICPANEL"; +IfcUnitaryControlElementTypeEnum.HUMIDISTAT = "HUMIDISTAT"; +IfcUnitaryControlElementTypeEnum.THERMOSTAT = "THERMOSTAT"; +IfcUnitaryControlElementTypeEnum.WEATHERSTATION = "WEATHERSTATION"; +IfcUnitaryControlElementTypeEnum.USERDEFINED = "USERDEFINED"; +IfcUnitaryControlElementTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcUnitaryEquipmentTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcUnitaryEquipmentTypeEnum.AIRHANDLER = "AIRHANDLER"; +IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT = "AIRCONDITIONINGUNIT"; +IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER = "DEHUMIDIFIER"; +IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM = "SPLITSYSTEM"; +IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT = "ROOFTOPUNIT"; +IfcUnitaryEquipmentTypeEnum.USERDEFINED = "USERDEFINED"; +IfcUnitaryEquipmentTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcValveTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcValveTypeEnum.AIRRELEASE = "AIRRELEASE"; +IfcValveTypeEnum.ANTIVACUUM = "ANTIVACUUM"; +IfcValveTypeEnum.CHANGEOVER = "CHANGEOVER"; +IfcValveTypeEnum.CHECK = "CHECK"; +IfcValveTypeEnum.COMMISSIONING = "COMMISSIONING"; +IfcValveTypeEnum.DIVERTING = "DIVERTING"; +IfcValveTypeEnum.DRAWOFFCOCK = "DRAWOFFCOCK"; +IfcValveTypeEnum.DOUBLECHECK = "DOUBLECHECK"; +IfcValveTypeEnum.DOUBLEREGULATING = "DOUBLEREGULATING"; +IfcValveTypeEnum.FAUCET = "FAUCET"; +IfcValveTypeEnum.FLUSHING = "FLUSHING"; +IfcValveTypeEnum.GASCOCK = "GASCOCK"; +IfcValveTypeEnum.GASTAP = "GASTAP"; +IfcValveTypeEnum.ISOLATING = "ISOLATING"; +IfcValveTypeEnum.MIXING = "MIXING"; +IfcValveTypeEnum.PRESSUREREDUCING = "PRESSUREREDUCING"; +IfcValveTypeEnum.PRESSURERELIEF = "PRESSURERELIEF"; +IfcValveTypeEnum.REGULATING = "REGULATING"; +IfcValveTypeEnum.SAFETYCUTOFF = "SAFETYCUTOFF"; +IfcValveTypeEnum.STEAMTRAP = "STEAMTRAP"; +IfcValveTypeEnum.STOPCOCK = "STOPCOCK"; +IfcValveTypeEnum.USERDEFINED = "USERDEFINED"; +IfcValveTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcVibrationDamperTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcVibrationDamperTypeEnum.BENDING_YIELD = "BENDING_YIELD"; +IfcVibrationDamperTypeEnum.SHEAR_YIELD = "SHEAR_YIELD"; +IfcVibrationDamperTypeEnum.AXIAL_YIELD = "AXIAL_YIELD"; +IfcVibrationDamperTypeEnum.FRICTION = "FRICTION"; +IfcVibrationDamperTypeEnum.VISCOUS = "VISCOUS"; +IfcVibrationDamperTypeEnum.RUBBER = "RUBBER"; +IfcVibrationDamperTypeEnum.USERDEFINED = "USERDEFINED"; +IfcVibrationDamperTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcVibrationIsolatorTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcVibrationIsolatorTypeEnum.COMPRESSION = "COMPRESSION"; +IfcVibrationIsolatorTypeEnum.SPRING = "SPRING"; +IfcVibrationIsolatorTypeEnum.BASE = "BASE"; +IfcVibrationIsolatorTypeEnum.USERDEFINED = "USERDEFINED"; +IfcVibrationIsolatorTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcVoidingFeatureTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcVoidingFeatureTypeEnum.CUTOUT = "CUTOUT"; +IfcVoidingFeatureTypeEnum.NOTCH = "NOTCH"; +IfcVoidingFeatureTypeEnum.HOLE = "HOLE"; +IfcVoidingFeatureTypeEnum.MITER = "MITER"; +IfcVoidingFeatureTypeEnum.CHAMFER = "CHAMFER"; +IfcVoidingFeatureTypeEnum.EDGE = "EDGE"; +IfcVoidingFeatureTypeEnum.USERDEFINED = "USERDEFINED"; +IfcVoidingFeatureTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWallTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWallTypeEnum.MOVABLE = "MOVABLE"; +IfcWallTypeEnum.PARAPET = "PARAPET"; +IfcWallTypeEnum.PARTITIONING = "PARTITIONING"; +IfcWallTypeEnum.PLUMBINGWALL = "PLUMBINGWALL"; +IfcWallTypeEnum.SHEAR = "SHEAR"; +IfcWallTypeEnum.SOLIDWALL = "SOLIDWALL"; +IfcWallTypeEnum.STANDARD = "STANDARD"; +IfcWallTypeEnum.POLYGONAL = "POLYGONAL"; +IfcWallTypeEnum.ELEMENTEDWALL = "ELEMENTEDWALL"; +IfcWallTypeEnum.RETAININGWALL = "RETAININGWALL"; +IfcWallTypeEnum.USERDEFINED = "USERDEFINED"; +IfcWallTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWasteTerminalTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWasteTerminalTypeEnum.FLOORTRAP = "FLOORTRAP"; +IfcWasteTerminalTypeEnum.FLOORWASTE = "FLOORWASTE"; +IfcWasteTerminalTypeEnum.GULLYSUMP = "GULLYSUMP"; +IfcWasteTerminalTypeEnum.GULLYTRAP = "GULLYTRAP"; +IfcWasteTerminalTypeEnum.ROOFDRAIN = "ROOFDRAIN"; +IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT = "WASTEDISPOSALUNIT"; +IfcWasteTerminalTypeEnum.WASTETRAP = "WASTETRAP"; +IfcWasteTerminalTypeEnum.USERDEFINED = "USERDEFINED"; +IfcWasteTerminalTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWindowPanelOperationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND = "SIDEHUNGRIGHTHAND"; +IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND = "SIDEHUNGLEFTHAND"; +IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND = "TILTANDTURNRIGHTHAND"; +IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND = "TILTANDTURNLEFTHAND"; +IfcWindowPanelOperationEnum.TOPHUNG = "TOPHUNG"; +IfcWindowPanelOperationEnum.BOTTOMHUNG = "BOTTOMHUNG"; +IfcWindowPanelOperationEnum.PIVOTHORIZONTAL = "PIVOTHORIZONTAL"; +IfcWindowPanelOperationEnum.PIVOTVERTICAL = "PIVOTVERTICAL"; +IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL = "SLIDINGHORIZONTAL"; +IfcWindowPanelOperationEnum.SLIDINGVERTICAL = "SLIDINGVERTICAL"; +IfcWindowPanelOperationEnum.REMOVABLECASEMENT = "REMOVABLECASEMENT"; +IfcWindowPanelOperationEnum.FIXEDCASEMENT = "FIXEDCASEMENT"; +IfcWindowPanelOperationEnum.OTHEROPERATION = "OTHEROPERATION"; +IfcWindowPanelOperationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWindowPanelPositionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWindowPanelPositionEnum.LEFT = "LEFT"; +IfcWindowPanelPositionEnum.MIDDLE = "MIDDLE"; +IfcWindowPanelPositionEnum.RIGHT = "RIGHT"; +IfcWindowPanelPositionEnum.BOTTOM = "BOTTOM"; +IfcWindowPanelPositionEnum.TOP = "TOP"; +IfcWindowPanelPositionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWindowStyleConstructionEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWindowStyleConstructionEnum.ALUMINIUM = "ALUMINIUM"; +IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL = "HIGH_GRADE_STEEL"; +IfcWindowStyleConstructionEnum.STEEL = "STEEL"; +IfcWindowStyleConstructionEnum.WOOD = "WOOD"; +IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD = "ALUMINIUM_WOOD"; +IfcWindowStyleConstructionEnum.PLASTIC = "PLASTIC"; +IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION = "OTHER_CONSTRUCTION"; +IfcWindowStyleConstructionEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWindowStyleOperationEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWindowStyleOperationEnum.SINGLE_PANEL = "SINGLE_PANEL"; +IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL = "DOUBLE_PANEL_VERTICAL"; +IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL = "DOUBLE_PANEL_HORIZONTAL"; +IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL = "TRIPLE_PANEL_VERTICAL"; +IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM = "TRIPLE_PANEL_BOTTOM"; +IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP = "TRIPLE_PANEL_TOP"; +IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT = "TRIPLE_PANEL_LEFT"; +IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT = "TRIPLE_PANEL_RIGHT"; +IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL = "TRIPLE_PANEL_HORIZONTAL"; +IfcWindowStyleOperationEnum.USERDEFINED = "USERDEFINED"; +IfcWindowStyleOperationEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWindowTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWindowTypeEnum.WINDOW = "WINDOW"; +IfcWindowTypeEnum.SKYLIGHT = "SKYLIGHT"; +IfcWindowTypeEnum.LIGHTDOME = "LIGHTDOME"; +IfcWindowTypeEnum.USERDEFINED = "USERDEFINED"; +IfcWindowTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWindowTypePartitioningEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWindowTypePartitioningEnum.SINGLE_PANEL = "SINGLE_PANEL"; +IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL = "DOUBLE_PANEL_VERTICAL"; +IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL = "DOUBLE_PANEL_HORIZONTAL"; +IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL = "TRIPLE_PANEL_VERTICAL"; +IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM = "TRIPLE_PANEL_BOTTOM"; +IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP = "TRIPLE_PANEL_TOP"; +IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT = "TRIPLE_PANEL_LEFT"; +IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT = "TRIPLE_PANEL_RIGHT"; +IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL = "TRIPLE_PANEL_HORIZONTAL"; +IfcWindowTypePartitioningEnum.USERDEFINED = "USERDEFINED"; +IfcWindowTypePartitioningEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWorkCalendarTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWorkCalendarTypeEnum.FIRSTSHIFT = "FIRSTSHIFT"; +IfcWorkCalendarTypeEnum.SECONDSHIFT = "SECONDSHIFT"; +IfcWorkCalendarTypeEnum.THIRDSHIFT = "THIRDSHIFT"; +IfcWorkCalendarTypeEnum.USERDEFINED = "USERDEFINED"; +IfcWorkCalendarTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWorkPlanTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWorkPlanTypeEnum.ACTUAL = "ACTUAL"; +IfcWorkPlanTypeEnum.BASELINE = "BASELINE"; +IfcWorkPlanTypeEnum.PLANNED = "PLANNED"; +IfcWorkPlanTypeEnum.USERDEFINED = "USERDEFINED"; +IfcWorkPlanTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcWorkScheduleTypeEnum = class { + constructor(v) { + this.value = v; + } +}; +IfcWorkScheduleTypeEnum.ACTUAL = "ACTUAL"; +IfcWorkScheduleTypeEnum.BASELINE = "BASELINE"; +IfcWorkScheduleTypeEnum.PLANNED = "PLANNED"; +IfcWorkScheduleTypeEnum.USERDEFINED = "USERDEFINED"; +IfcWorkScheduleTypeEnum.NOTDEFINED = "NOTDEFINED"; +var IfcActionRequest = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.PredefinedType = PredefinedType; + this.Status = Status; + this.LongDescription = LongDescription; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Status = tape[ptr++]; + let LongDescription = tape[ptr++]; + return new IfcActionRequest(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.PredefinedType); + ; + args.push(this.Status); + ; + args.push(this.LongDescription); + ; + return args; + } +}; +var IfcActor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.TheActor = TheActor; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let TheActor = tape[ptr++]; + return new IfcActor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.TheActor); + ; + return args; + } +}; +var IfcActorRole = class { + constructor(expressID, type, Role, UserDefinedRole, Description) { + this.expressID = expressID; + this.type = type; + this.Role = Role; + this.UserDefinedRole = UserDefinedRole; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Role = tape[ptr++]; + let UserDefinedRole = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcActorRole(expressID, type, Role, UserDefinedRole, Description); + } + ToTape() { + let args = []; + args.push(this.Role); + ; + args.push(this.UserDefinedRole); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcActuator = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcActuator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcActuatorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcActuatorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAddress = class { + constructor(expressID, type, Purpose, Description, UserDefinedPurpose) { + this.expressID = expressID; + this.type = type; + this.Purpose = Purpose; + this.Description = Description; + this.UserDefinedPurpose = UserDefinedPurpose; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Purpose = tape[ptr++]; + let Description = tape[ptr++]; + let UserDefinedPurpose = tape[ptr++]; + return new IfcAddress(expressID, type, Purpose, Description, UserDefinedPurpose); + } + ToTape() { + let args = []; + args.push(this.Purpose); + ; + args.push(this.Description); + ; + args.push(this.UserDefinedPurpose); + ; + return args; + } +}; +var IfcAdvancedBrep = class { + constructor(expressID, type, Outer) { + this.expressID = expressID; + this.type = type; + this.Outer = Outer; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Outer = tape[ptr++]; + return new IfcAdvancedBrep(expressID, type, Outer); + } + ToTape() { + let args = []; + args.push(this.Outer); + ; + return args; + } +}; +var IfcAdvancedBrepWithVoids = class { + constructor(expressID, type, Outer, Voids) { + this.expressID = expressID; + this.type = type; + this.Outer = Outer; + this.Voids = Voids; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Outer = tape[ptr++]; + let Voids = tape[ptr++]; + return new IfcAdvancedBrepWithVoids(expressID, type, Outer, Voids); + } + ToTape() { + let args = []; + args.push(this.Outer); + ; + args.push(this.Voids); + ; + return args; + } +}; +var IfcAdvancedFace = class { + constructor(expressID, type, Bounds, FaceSurface, SameSense) { + this.expressID = expressID; + this.type = type; + this.Bounds = Bounds; + this.FaceSurface = FaceSurface; + this.SameSense = SameSense; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Bounds = tape[ptr++]; + let FaceSurface = tape[ptr++]; + let SameSense = tape[ptr++]; + return new IfcAdvancedFace(expressID, type, Bounds, FaceSurface, SameSense); + } + ToTape() { + let args = []; + args.push(this.Bounds); + ; + args.push(this.FaceSurface); + ; + args.push(this.SameSense); + ; + return args; + } +}; +var IfcAirTerminal = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAirTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAirTerminalBox = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAirTerminalBox(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAirTerminalBoxType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAirTerminalBoxType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAirTerminalType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAirTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAirToAirHeatRecovery = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAirToAirHeatRecovery(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAirToAirHeatRecoveryType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAirToAirHeatRecoveryType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAlarm = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAlarm(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAlarmType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAlarmType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAlignment = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Axis = Axis; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Axis = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAlignment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Axis); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAlignment2DHorizontal = class { + constructor(expressID, type, StartDistAlong, Segments) { + this.expressID = expressID; + this.type = type; + this.StartDistAlong = StartDistAlong; + this.Segments = Segments; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let StartDistAlong = tape[ptr++]; + let Segments = tape[ptr++]; + return new IfcAlignment2DHorizontal(expressID, type, StartDistAlong, Segments); + } + ToTape() { + let args = []; + args.push(this.StartDistAlong); + ; + args.push(this.Segments); + ; + return args; + } +}; +var IfcAlignment2DHorizontalSegment = class { + constructor(expressID, type, TangentialContinuity, StartTag, EndTag, CurveGeometry) { + this.expressID = expressID; + this.type = type; + this.TangentialContinuity = TangentialContinuity; + this.StartTag = StartTag; + this.EndTag = EndTag; + this.CurveGeometry = CurveGeometry; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TangentialContinuity = tape[ptr++]; + let StartTag = tape[ptr++]; + let EndTag = tape[ptr++]; + let CurveGeometry = tape[ptr++]; + return new IfcAlignment2DHorizontalSegment(expressID, type, TangentialContinuity, StartTag, EndTag, CurveGeometry); + } + ToTape() { + let args = []; + args.push(this.TangentialContinuity); + ; + args.push(this.StartTag); + ; + args.push(this.EndTag); + ; + args.push(this.CurveGeometry); + ; + return args; + } +}; +var IfcAlignment2DSegment = class { + constructor(expressID, type, TangentialContinuity, StartTag, EndTag) { + this.expressID = expressID; + this.type = type; + this.TangentialContinuity = TangentialContinuity; + this.StartTag = StartTag; + this.EndTag = EndTag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TangentialContinuity = tape[ptr++]; + let StartTag = tape[ptr++]; + let EndTag = tape[ptr++]; + return new IfcAlignment2DSegment(expressID, type, TangentialContinuity, StartTag, EndTag); + } + ToTape() { + let args = []; + args.push(this.TangentialContinuity); + ; + args.push(this.StartTag); + ; + args.push(this.EndTag); + ; + return args; + } +}; +var IfcAlignment2DVerSegCircularArc = class { + constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, Radius, IsConvex) { + this.expressID = expressID; + this.type = type; + this.TangentialContinuity = TangentialContinuity; + this.StartTag = StartTag; + this.EndTag = EndTag; + this.StartDistAlong = StartDistAlong; + this.HorizontalLength = HorizontalLength; + this.StartHeight = StartHeight; + this.StartGradient = StartGradient; + this.Radius = Radius; + this.IsConvex = IsConvex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TangentialContinuity = tape[ptr++]; + let StartTag = tape[ptr++]; + let EndTag = tape[ptr++]; + let StartDistAlong = tape[ptr++]; + let HorizontalLength = tape[ptr++]; + let StartHeight = tape[ptr++]; + let StartGradient = tape[ptr++]; + let Radius = tape[ptr++]; + let IsConvex = tape[ptr++]; + return new IfcAlignment2DVerSegCircularArc(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, Radius, IsConvex); + } + ToTape() { + let args = []; + args.push(this.TangentialContinuity); + ; + args.push(this.StartTag); + ; + args.push(this.EndTag); + ; + args.push(this.StartDistAlong); + ; + args.push(this.HorizontalLength); + ; + args.push(this.StartHeight); + ; + args.push(this.StartGradient); + ; + args.push(this.Radius); + ; + args.push(this.IsConvex); + ; + return args; + } +}; +var IfcAlignment2DVerSegLine = class { + constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient) { + this.expressID = expressID; + this.type = type; + this.TangentialContinuity = TangentialContinuity; + this.StartTag = StartTag; + this.EndTag = EndTag; + this.StartDistAlong = StartDistAlong; + this.HorizontalLength = HorizontalLength; + this.StartHeight = StartHeight; + this.StartGradient = StartGradient; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TangentialContinuity = tape[ptr++]; + let StartTag = tape[ptr++]; + let EndTag = tape[ptr++]; + let StartDistAlong = tape[ptr++]; + let HorizontalLength = tape[ptr++]; + let StartHeight = tape[ptr++]; + let StartGradient = tape[ptr++]; + return new IfcAlignment2DVerSegLine(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient); + } + ToTape() { + let args = []; + args.push(this.TangentialContinuity); + ; + args.push(this.StartTag); + ; + args.push(this.EndTag); + ; + args.push(this.StartDistAlong); + ; + args.push(this.HorizontalLength); + ; + args.push(this.StartHeight); + ; + args.push(this.StartGradient); + ; + return args; + } +}; +var IfcAlignment2DVerSegParabolicArc = class { + constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, ParabolaConstant, IsConvex) { + this.expressID = expressID; + this.type = type; + this.TangentialContinuity = TangentialContinuity; + this.StartTag = StartTag; + this.EndTag = EndTag; + this.StartDistAlong = StartDistAlong; + this.HorizontalLength = HorizontalLength; + this.StartHeight = StartHeight; + this.StartGradient = StartGradient; + this.ParabolaConstant = ParabolaConstant; + this.IsConvex = IsConvex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TangentialContinuity = tape[ptr++]; + let StartTag = tape[ptr++]; + let EndTag = tape[ptr++]; + let StartDistAlong = tape[ptr++]; + let HorizontalLength = tape[ptr++]; + let StartHeight = tape[ptr++]; + let StartGradient = tape[ptr++]; + let ParabolaConstant = tape[ptr++]; + let IsConvex = tape[ptr++]; + return new IfcAlignment2DVerSegParabolicArc(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, ParabolaConstant, IsConvex); + } + ToTape() { + let args = []; + args.push(this.TangentialContinuity); + ; + args.push(this.StartTag); + ; + args.push(this.EndTag); + ; + args.push(this.StartDistAlong); + ; + args.push(this.HorizontalLength); + ; + args.push(this.StartHeight); + ; + args.push(this.StartGradient); + ; + args.push(this.ParabolaConstant); + ; + args.push(this.IsConvex); + ; + return args; + } +}; +var IfcAlignment2DVertical = class { + constructor(expressID, type, Segments) { + this.expressID = expressID; + this.type = type; + this.Segments = Segments; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Segments = tape[ptr++]; + return new IfcAlignment2DVertical(expressID, type, Segments); + } + ToTape() { + let args = []; + args.push(this.Segments); + ; + return args; + } +}; +var IfcAlignment2DVerticalSegment = class { + constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient) { + this.expressID = expressID; + this.type = type; + this.TangentialContinuity = TangentialContinuity; + this.StartTag = StartTag; + this.EndTag = EndTag; + this.StartDistAlong = StartDistAlong; + this.HorizontalLength = HorizontalLength; + this.StartHeight = StartHeight; + this.StartGradient = StartGradient; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TangentialContinuity = tape[ptr++]; + let StartTag = tape[ptr++]; + let EndTag = tape[ptr++]; + let StartDistAlong = tape[ptr++]; + let HorizontalLength = tape[ptr++]; + let StartHeight = tape[ptr++]; + let StartGradient = tape[ptr++]; + return new IfcAlignment2DVerticalSegment(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient); + } + ToTape() { + let args = []; + args.push(this.TangentialContinuity); + ; + args.push(this.StartTag); + ; + args.push(this.EndTag); + ; + args.push(this.StartDistAlong); + ; + args.push(this.HorizontalLength); + ; + args.push(this.StartHeight); + ; + args.push(this.StartGradient); + ; + return args; + } +}; +var IfcAlignmentCurve = class { + constructor(expressID, type, Horizontal, Vertical, Tag) { + this.expressID = expressID; + this.type = type; + this.Horizontal = Horizontal; + this.Vertical = Vertical; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Horizontal = tape[ptr++]; + let Vertical = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcAlignmentCurve(expressID, type, Horizontal, Vertical, Tag); + } + ToTape() { + let args = []; + args.push(this.Horizontal); + ; + args.push(this.Vertical); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcAnnotation = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + return new IfcAnnotation(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + return args; + } +}; +var IfcAnnotationFillArea = class { + constructor(expressID, type, OuterBoundary, InnerBoundaries) { + this.expressID = expressID; + this.type = type; + this.OuterBoundary = OuterBoundary; + this.InnerBoundaries = InnerBoundaries; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let OuterBoundary = tape[ptr++]; + let InnerBoundaries = tape[ptr++]; + return new IfcAnnotationFillArea(expressID, type, OuterBoundary, InnerBoundaries); + } + ToTape() { + let args = []; + args.push(this.OuterBoundary); + ; + args.push(this.InnerBoundaries); + ; + return args; + } +}; +var IfcApplication = class { + constructor(expressID, type, ApplicationDeveloper, Version, ApplicationFullName, ApplicationIdentifier) { + this.expressID = expressID; + this.type = type; + this.ApplicationDeveloper = ApplicationDeveloper; + this.Version = Version; + this.ApplicationFullName = ApplicationFullName; + this.ApplicationIdentifier = ApplicationIdentifier; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ApplicationDeveloper = tape[ptr++]; + let Version = tape[ptr++]; + let ApplicationFullName = tape[ptr++]; + let ApplicationIdentifier = tape[ptr++]; + return new IfcApplication(expressID, type, ApplicationDeveloper, Version, ApplicationFullName, ApplicationIdentifier); + } + ToTape() { + let args = []; + args.push(this.ApplicationDeveloper); + ; + args.push(this.Version); + ; + args.push(this.ApplicationFullName); + ; + args.push(this.ApplicationIdentifier); + ; + return args; + } +}; +var IfcAppliedValue = class { + constructor(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.AppliedValue = AppliedValue; + this.UnitBasis = UnitBasis; + this.ApplicableDate = ApplicableDate; + this.FixedUntilDate = FixedUntilDate; + this.Category = Category; + this.Condition = Condition; + this.ArithmeticOperator = ArithmeticOperator; + this.Components = Components; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let AppliedValue = tape[ptr++]; + let UnitBasis = tape[ptr++]; + let ApplicableDate = tape[ptr++]; + let FixedUntilDate = tape[ptr++]; + let Category = tape[ptr++]; + let Condition = tape[ptr++]; + let ArithmeticOperator = tape[ptr++]; + let Components = tape[ptr++]; + return new IfcAppliedValue(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.AppliedValue); + ; + args.push(this.UnitBasis); + ; + args.push(this.ApplicableDate); + ; + args.push(this.FixedUntilDate); + ; + args.push(this.Category); + ; + args.push(this.Condition); + ; + args.push(this.ArithmeticOperator); + ; + args.push(this.Components); + ; + return args; + } +}; +var IfcApproval = class { + constructor(expressID, type, Identifier, Name, Description, TimeOfApproval, Status, Level, Qualifier, RequestingApproval, GivingApproval) { + this.expressID = expressID; + this.type = type; + this.Identifier = Identifier; + this.Name = Name; + this.Description = Description; + this.TimeOfApproval = TimeOfApproval; + this.Status = Status; + this.Level = Level; + this.Qualifier = Qualifier; + this.RequestingApproval = RequestingApproval; + this.GivingApproval = GivingApproval; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Identifier = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let TimeOfApproval = tape[ptr++]; + let Status = tape[ptr++]; + let Level = tape[ptr++]; + let Qualifier = tape[ptr++]; + let RequestingApproval = tape[ptr++]; + let GivingApproval = tape[ptr++]; + return new IfcApproval(expressID, type, Identifier, Name, Description, TimeOfApproval, Status, Level, Qualifier, RequestingApproval, GivingApproval); + } + ToTape() { + let args = []; + args.push(this.Identifier); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.TimeOfApproval); + ; + args.push(this.Status); + ; + args.push(this.Level); + ; + args.push(this.Qualifier); + ; + args.push(this.RequestingApproval); + ; + args.push(this.GivingApproval); + ; + return args; + } +}; +var IfcApprovalRelationship = class { + constructor(expressID, type, Name, Description, RelatingApproval, RelatedApprovals) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatingApproval = RelatingApproval; + this.RelatedApprovals = RelatedApprovals; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingApproval = tape[ptr++]; + let RelatedApprovals = tape[ptr++]; + return new IfcApprovalRelationship(expressID, type, Name, Description, RelatingApproval, RelatedApprovals); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingApproval); + ; + args.push(this.RelatedApprovals); + ; + return args; + } +}; +var IfcArbitraryClosedProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, OuterCurve) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.OuterCurve = OuterCurve; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let OuterCurve = tape[ptr++]; + return new IfcArbitraryClosedProfileDef(expressID, type, ProfileType, ProfileName, OuterCurve); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.OuterCurve); + ; + return args; + } +}; +var IfcArbitraryOpenProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Curve) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Curve = Curve; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Curve = tape[ptr++]; + return new IfcArbitraryOpenProfileDef(expressID, type, ProfileType, ProfileName, Curve); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Curve); + ; + return args; + } +}; +var IfcArbitraryProfileDefWithVoids = class { + constructor(expressID, type, ProfileType, ProfileName, OuterCurve, InnerCurves) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.OuterCurve = OuterCurve; + this.InnerCurves = InnerCurves; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let OuterCurve = tape[ptr++]; + let InnerCurves = tape[ptr++]; + return new IfcArbitraryProfileDefWithVoids(expressID, type, ProfileType, ProfileName, OuterCurve, InnerCurves); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.OuterCurve); + ; + args.push(this.InnerCurves); + ; + return args; + } +}; +var IfcAsset = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, OriginalValue, CurrentValue, TotalReplacementCost, Owner, User, ResponsiblePerson, IncorporationDate, DepreciatedValue) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.OriginalValue = OriginalValue; + this.CurrentValue = CurrentValue; + this.TotalReplacementCost = TotalReplacementCost; + this.Owner = Owner; + this.User = User; + this.ResponsiblePerson = ResponsiblePerson; + this.IncorporationDate = IncorporationDate; + this.DepreciatedValue = DepreciatedValue; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let OriginalValue = tape[ptr++]; + let CurrentValue = tape[ptr++]; + let TotalReplacementCost = tape[ptr++]; + let Owner = tape[ptr++]; + let User = tape[ptr++]; + let ResponsiblePerson = tape[ptr++]; + let IncorporationDate = tape[ptr++]; + let DepreciatedValue = tape[ptr++]; + return new IfcAsset(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, OriginalValue, CurrentValue, TotalReplacementCost, Owner, User, ResponsiblePerson, IncorporationDate, DepreciatedValue); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.OriginalValue); + ; + args.push(this.CurrentValue); + ; + args.push(this.TotalReplacementCost); + ; + args.push(this.Owner); + ; + args.push(this.User); + ; + args.push(this.ResponsiblePerson); + ; + args.push(this.IncorporationDate); + ; + args.push(this.DepreciatedValue); + ; + return args; + } +}; +var IfcAsymmetricIShapeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, BottomFlangeWidth, OverallDepth, WebThickness, BottomFlangeThickness, BottomFlangeFilletRadius, TopFlangeWidth, TopFlangeThickness, TopFlangeFilletRadius, BottomFlangeEdgeRadius, BottomFlangeSlope, TopFlangeEdgeRadius, TopFlangeSlope) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.BottomFlangeWidth = BottomFlangeWidth; + this.OverallDepth = OverallDepth; + this.WebThickness = WebThickness; + this.BottomFlangeThickness = BottomFlangeThickness; + this.BottomFlangeFilletRadius = BottomFlangeFilletRadius; + this.TopFlangeWidth = TopFlangeWidth; + this.TopFlangeThickness = TopFlangeThickness; + this.TopFlangeFilletRadius = TopFlangeFilletRadius; + this.BottomFlangeEdgeRadius = BottomFlangeEdgeRadius; + this.BottomFlangeSlope = BottomFlangeSlope; + this.TopFlangeEdgeRadius = TopFlangeEdgeRadius; + this.TopFlangeSlope = TopFlangeSlope; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let BottomFlangeWidth = tape[ptr++]; + let OverallDepth = tape[ptr++]; + let WebThickness = tape[ptr++]; + let BottomFlangeThickness = tape[ptr++]; + let BottomFlangeFilletRadius = tape[ptr++]; + let TopFlangeWidth = tape[ptr++]; + let TopFlangeThickness = tape[ptr++]; + let TopFlangeFilletRadius = tape[ptr++]; + let BottomFlangeEdgeRadius = tape[ptr++]; + let BottomFlangeSlope = tape[ptr++]; + let TopFlangeEdgeRadius = tape[ptr++]; + let TopFlangeSlope = tape[ptr++]; + return new IfcAsymmetricIShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, BottomFlangeWidth, OverallDepth, WebThickness, BottomFlangeThickness, BottomFlangeFilletRadius, TopFlangeWidth, TopFlangeThickness, TopFlangeFilletRadius, BottomFlangeEdgeRadius, BottomFlangeSlope, TopFlangeEdgeRadius, TopFlangeSlope); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.BottomFlangeWidth); + ; + args.push(this.OverallDepth); + ; + args.push(this.WebThickness); + ; + args.push(this.BottomFlangeThickness); + ; + args.push(this.BottomFlangeFilletRadius); + ; + args.push(this.TopFlangeWidth); + ; + args.push(this.TopFlangeThickness); + ; + args.push(this.TopFlangeFilletRadius); + ; + args.push(this.BottomFlangeEdgeRadius); + ; + args.push(this.BottomFlangeSlope); + ; + args.push(this.TopFlangeEdgeRadius); + ; + args.push(this.TopFlangeSlope); + ; + return args; + } +}; +var IfcAudioVisualAppliance = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAudioVisualAppliance(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAudioVisualApplianceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcAudioVisualApplianceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcAxis1Placement = class { + constructor(expressID, type, Location, Axis) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Axis = Axis; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Axis = tape[ptr++]; + return new IfcAxis1Placement(expressID, type, Location, Axis); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Axis); + ; + return args; + } +}; +var IfcAxis2Placement2D = class { + constructor(expressID, type, Location, RefDirection) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.RefDirection = RefDirection; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let RefDirection = tape[ptr++]; + return new IfcAxis2Placement2D(expressID, type, Location, RefDirection); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.RefDirection); + ; + return args; + } +}; +var IfcAxis2Placement3D = class { + constructor(expressID, type, Location, Axis, RefDirection) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Axis = Axis; + this.RefDirection = RefDirection; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Axis = tape[ptr++]; + let RefDirection = tape[ptr++]; + return new IfcAxis2Placement3D(expressID, type, Location, Axis, RefDirection); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Axis); + ; + args.push(this.RefDirection); + ; + return args; + } +}; +var IfcBSplineCurve = class { + constructor(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.Degree = Degree; + this.ControlPointsList = ControlPointsList; + this.CurveForm = CurveForm; + this.ClosedCurve = ClosedCurve; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Degree = tape[ptr++]; + let ControlPointsList = tape[ptr++]; + let CurveForm = tape[ptr++]; + let ClosedCurve = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcBSplineCurve(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.Degree); + ; + args.push(this.ControlPointsList); + ; + args.push(this.CurveForm); + ; + args.push(this.ClosedCurve); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcBSplineCurveWithKnots = class { + constructor(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec) { + this.expressID = expressID; + this.type = type; + this.Degree = Degree; + this.ControlPointsList = ControlPointsList; + this.CurveForm = CurveForm; + this.ClosedCurve = ClosedCurve; + this.SelfIntersect = SelfIntersect; + this.KnotMultiplicities = KnotMultiplicities; + this.Knots = Knots; + this.KnotSpec = KnotSpec; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Degree = tape[ptr++]; + let ControlPointsList = tape[ptr++]; + let CurveForm = tape[ptr++]; + let ClosedCurve = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + let KnotMultiplicities = tape[ptr++]; + let Knots = tape[ptr++]; + let KnotSpec = tape[ptr++]; + return new IfcBSplineCurveWithKnots(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec); + } + ToTape() { + let args = []; + args.push(this.Degree); + ; + args.push(this.ControlPointsList); + ; + args.push(this.CurveForm); + ; + args.push(this.ClosedCurve); + ; + args.push(this.SelfIntersect); + ; + args.push(this.KnotMultiplicities); + ; + args.push(this.Knots); + ; + args.push(this.KnotSpec); + ; + return args; + } +}; +var IfcBSplineSurface = class { + constructor(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.UDegree = UDegree; + this.VDegree = VDegree; + this.ControlPointsList = ControlPointsList; + this.SurfaceForm = SurfaceForm; + this.UClosed = UClosed; + this.VClosed = VClosed; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let UDegree = tape[ptr++]; + let VDegree = tape[ptr++]; + let ControlPointsList = tape[ptr++]; + let SurfaceForm = tape[ptr++]; + let UClosed = tape[ptr++]; + let VClosed = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcBSplineSurface(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.UDegree); + ; + args.push(this.VDegree); + ; + args.push(this.ControlPointsList); + ; + args.push(this.SurfaceForm); + ; + args.push(this.UClosed); + ; + args.push(this.VClosed); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcBSplineSurfaceWithKnots = class { + constructor(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec) { + this.expressID = expressID; + this.type = type; + this.UDegree = UDegree; + this.VDegree = VDegree; + this.ControlPointsList = ControlPointsList; + this.SurfaceForm = SurfaceForm; + this.UClosed = UClosed; + this.VClosed = VClosed; + this.SelfIntersect = SelfIntersect; + this.UMultiplicities = UMultiplicities; + this.VMultiplicities = VMultiplicities; + this.UKnots = UKnots; + this.VKnots = VKnots; + this.KnotSpec = KnotSpec; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let UDegree = tape[ptr++]; + let VDegree = tape[ptr++]; + let ControlPointsList = tape[ptr++]; + let SurfaceForm = tape[ptr++]; + let UClosed = tape[ptr++]; + let VClosed = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + let UMultiplicities = tape[ptr++]; + let VMultiplicities = tape[ptr++]; + let UKnots = tape[ptr++]; + let VKnots = tape[ptr++]; + let KnotSpec = tape[ptr++]; + return new IfcBSplineSurfaceWithKnots(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec); + } + ToTape() { + let args = []; + args.push(this.UDegree); + ; + args.push(this.VDegree); + ; + args.push(this.ControlPointsList); + ; + args.push(this.SurfaceForm); + ; + args.push(this.UClosed); + ; + args.push(this.VClosed); + ; + args.push(this.SelfIntersect); + ; + args.push(this.UMultiplicities); + ; + args.push(this.VMultiplicities); + ; + args.push(this.UKnots); + ; + args.push(this.VKnots); + ; + args.push(this.KnotSpec); + ; + return args; + } +}; +var IfcBeam = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBeam(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBeamStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBeamStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBeamType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBeamType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBearing = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBearing(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBearingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBearingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBlobTexture = class { + constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, RasterFormat, RasterCode) { + this.expressID = expressID; + this.type = type; + this.RepeatS = RepeatS; + this.RepeatT = RepeatT; + this.Mode = Mode; + this.TextureTransform = TextureTransform; + this.Parameter = Parameter; + this.RasterFormat = RasterFormat; + this.RasterCode = RasterCode; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let RepeatS = tape[ptr++]; + let RepeatT = tape[ptr++]; + let Mode = tape[ptr++]; + let TextureTransform = tape[ptr++]; + let Parameter = tape[ptr++]; + let RasterFormat = tape[ptr++]; + let RasterCode = tape[ptr++]; + return new IfcBlobTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, RasterFormat, RasterCode); + } + ToTape() { + let args = []; + args.push(this.RepeatS); + ; + args.push(this.RepeatT); + ; + args.push(this.Mode); + ; + args.push(this.TextureTransform); + ; + args.push(this.Parameter); + ; + args.push(this.RasterFormat); + ; + args.push(this.RasterCode); + ; + return args; + } +}; +var IfcBlock = class { + constructor(expressID, type, Position, XLength, YLength, ZLength) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.XLength = XLength; + this.YLength = YLength; + this.ZLength = ZLength; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let XLength = tape[ptr++]; + let YLength = tape[ptr++]; + let ZLength = tape[ptr++]; + return new IfcBlock(expressID, type, Position, XLength, YLength, ZLength); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.XLength); + ; + args.push(this.YLength); + ; + args.push(this.ZLength); + ; + return args; + } +}; +var IfcBoiler = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBoiler(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBoilerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBoilerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBooleanClippingResult = class { + constructor(expressID, type, Operator, FirstOperand, SecondOperand) { + this.expressID = expressID; + this.type = type; + this.Operator = Operator; + this.FirstOperand = FirstOperand; + this.SecondOperand = SecondOperand; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Operator = tape[ptr++]; + let FirstOperand = tape[ptr++]; + let SecondOperand = tape[ptr++]; + return new IfcBooleanClippingResult(expressID, type, Operator, FirstOperand, SecondOperand); + } + ToTape() { + let args = []; + args.push(this.Operator); + ; + args.push(this.FirstOperand); + ; + args.push(this.SecondOperand); + ; + return args; + } +}; +var IfcBooleanResult = class { + constructor(expressID, type, Operator, FirstOperand, SecondOperand) { + this.expressID = expressID; + this.type = type; + this.Operator = Operator; + this.FirstOperand = FirstOperand; + this.SecondOperand = SecondOperand; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Operator = tape[ptr++]; + let FirstOperand = tape[ptr++]; + let SecondOperand = tape[ptr++]; + return new IfcBooleanResult(expressID, type, Operator, FirstOperand, SecondOperand); + } + ToTape() { + let args = []; + args.push(this.Operator); + ; + args.push(this.FirstOperand); + ; + args.push(this.SecondOperand); + ; + return args; + } +}; +var IfcBoundaryCondition = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcBoundaryCondition(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcBoundaryCurve = class { + constructor(expressID, type, Segments, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.Segments = Segments; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Segments = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcBoundaryCurve(expressID, type, Segments, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.Segments); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcBoundaryEdgeCondition = class { + constructor(expressID, type, Name, TranslationalStiffnessByLengthX, TranslationalStiffnessByLengthY, TranslationalStiffnessByLengthZ, RotationalStiffnessByLengthX, RotationalStiffnessByLengthY, RotationalStiffnessByLengthZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.TranslationalStiffnessByLengthX = TranslationalStiffnessByLengthX; + this.TranslationalStiffnessByLengthY = TranslationalStiffnessByLengthY; + this.TranslationalStiffnessByLengthZ = TranslationalStiffnessByLengthZ; + this.RotationalStiffnessByLengthX = RotationalStiffnessByLengthX; + this.RotationalStiffnessByLengthY = RotationalStiffnessByLengthY; + this.RotationalStiffnessByLengthZ = RotationalStiffnessByLengthZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let TranslationalStiffnessByLengthX = tape[ptr++]; + let TranslationalStiffnessByLengthY = tape[ptr++]; + let TranslationalStiffnessByLengthZ = tape[ptr++]; + let RotationalStiffnessByLengthX = tape[ptr++]; + let RotationalStiffnessByLengthY = tape[ptr++]; + let RotationalStiffnessByLengthZ = tape[ptr++]; + return new IfcBoundaryEdgeCondition(expressID, type, Name, TranslationalStiffnessByLengthX, TranslationalStiffnessByLengthY, TranslationalStiffnessByLengthZ, RotationalStiffnessByLengthX, RotationalStiffnessByLengthY, RotationalStiffnessByLengthZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.TranslationalStiffnessByLengthX); + ; + args.push(this.TranslationalStiffnessByLengthY); + ; + args.push(this.TranslationalStiffnessByLengthZ); + ; + args.push(this.RotationalStiffnessByLengthX); + ; + args.push(this.RotationalStiffnessByLengthY); + ; + args.push(this.RotationalStiffnessByLengthZ); + ; + return args; + } +}; +var IfcBoundaryFaceCondition = class { + constructor(expressID, type, Name, TranslationalStiffnessByAreaX, TranslationalStiffnessByAreaY, TranslationalStiffnessByAreaZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.TranslationalStiffnessByAreaX = TranslationalStiffnessByAreaX; + this.TranslationalStiffnessByAreaY = TranslationalStiffnessByAreaY; + this.TranslationalStiffnessByAreaZ = TranslationalStiffnessByAreaZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let TranslationalStiffnessByAreaX = tape[ptr++]; + let TranslationalStiffnessByAreaY = tape[ptr++]; + let TranslationalStiffnessByAreaZ = tape[ptr++]; + return new IfcBoundaryFaceCondition(expressID, type, Name, TranslationalStiffnessByAreaX, TranslationalStiffnessByAreaY, TranslationalStiffnessByAreaZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.TranslationalStiffnessByAreaX); + ; + args.push(this.TranslationalStiffnessByAreaY); + ; + args.push(this.TranslationalStiffnessByAreaZ); + ; + return args; + } +}; +var IfcBoundaryNodeCondition = class { + constructor(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.TranslationalStiffnessX = TranslationalStiffnessX; + this.TranslationalStiffnessY = TranslationalStiffnessY; + this.TranslationalStiffnessZ = TranslationalStiffnessZ; + this.RotationalStiffnessX = RotationalStiffnessX; + this.RotationalStiffnessY = RotationalStiffnessY; + this.RotationalStiffnessZ = RotationalStiffnessZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let TranslationalStiffnessX = tape[ptr++]; + let TranslationalStiffnessY = tape[ptr++]; + let TranslationalStiffnessZ = tape[ptr++]; + let RotationalStiffnessX = tape[ptr++]; + let RotationalStiffnessY = tape[ptr++]; + let RotationalStiffnessZ = tape[ptr++]; + return new IfcBoundaryNodeCondition(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.TranslationalStiffnessX); + ; + args.push(this.TranslationalStiffnessY); + ; + args.push(this.TranslationalStiffnessZ); + ; + args.push(this.RotationalStiffnessX); + ; + args.push(this.RotationalStiffnessY); + ; + args.push(this.RotationalStiffnessZ); + ; + return args; + } +}; +var IfcBoundaryNodeConditionWarping = class { + constructor(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ, WarpingStiffness) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.TranslationalStiffnessX = TranslationalStiffnessX; + this.TranslationalStiffnessY = TranslationalStiffnessY; + this.TranslationalStiffnessZ = TranslationalStiffnessZ; + this.RotationalStiffnessX = RotationalStiffnessX; + this.RotationalStiffnessY = RotationalStiffnessY; + this.RotationalStiffnessZ = RotationalStiffnessZ; + this.WarpingStiffness = WarpingStiffness; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let TranslationalStiffnessX = tape[ptr++]; + let TranslationalStiffnessY = tape[ptr++]; + let TranslationalStiffnessZ = tape[ptr++]; + let RotationalStiffnessX = tape[ptr++]; + let RotationalStiffnessY = tape[ptr++]; + let RotationalStiffnessZ = tape[ptr++]; + let WarpingStiffness = tape[ptr++]; + return new IfcBoundaryNodeConditionWarping(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ, WarpingStiffness); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.TranslationalStiffnessX); + ; + args.push(this.TranslationalStiffnessY); + ; + args.push(this.TranslationalStiffnessZ); + ; + args.push(this.RotationalStiffnessX); + ; + args.push(this.RotationalStiffnessY); + ; + args.push(this.RotationalStiffnessZ); + ; + args.push(this.WarpingStiffness); + ; + return args; + } +}; +var IfcBoundedCurve = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcBoundedCurve(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcBoundedSurface = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcBoundedSurface(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcBoundingBox = class { + constructor(expressID, type, Corner, XDim, YDim, ZDim) { + this.expressID = expressID; + this.type = type; + this.Corner = Corner; + this.XDim = XDim; + this.YDim = YDim; + this.ZDim = ZDim; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Corner = tape[ptr++]; + let XDim = tape[ptr++]; + let YDim = tape[ptr++]; + let ZDim = tape[ptr++]; + return new IfcBoundingBox(expressID, type, Corner, XDim, YDim, ZDim); + } + ToTape() { + let args = []; + args.push(this.Corner); + ; + args.push(this.XDim); + ; + args.push(this.YDim); + ; + args.push(this.ZDim); + ; + return args; + } +}; +var IfcBoxedHalfSpace = class { + constructor(expressID, type, BaseSurface, AgreementFlag, Enclosure) { + this.expressID = expressID; + this.type = type; + this.BaseSurface = BaseSurface; + this.AgreementFlag = AgreementFlag; + this.Enclosure = Enclosure; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BaseSurface = tape[ptr++]; + let AgreementFlag = tape[ptr++]; + let Enclosure = tape[ptr++]; + return new IfcBoxedHalfSpace(expressID, type, BaseSurface, AgreementFlag, Enclosure); + } + ToTape() { + let args = []; + args.push(this.BaseSurface); + ; + args.push(this.AgreementFlag); + ; + args.push(this.Enclosure); + ; + return args; + } +}; +var IfcBridge = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBridge(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBridgePart = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBridgePart(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBuilding = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, ElevationOfRefHeight, ElevationOfTerrain, BuildingAddress) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + this.ElevationOfRefHeight = ElevationOfRefHeight; + this.ElevationOfTerrain = ElevationOfTerrain; + this.BuildingAddress = BuildingAddress; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + let ElevationOfRefHeight = tape[ptr++]; + let ElevationOfTerrain = tape[ptr++]; + let BuildingAddress = tape[ptr++]; + return new IfcBuilding(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, ElevationOfRefHeight, ElevationOfTerrain, BuildingAddress); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + args.push(this.ElevationOfRefHeight); + ; + args.push(this.ElevationOfTerrain); + ; + args.push(this.BuildingAddress); + ; + return args; + } +}; +var IfcBuildingElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcBuildingElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcBuildingElementPart = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBuildingElementPart(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBuildingElementPartType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBuildingElementPartType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBuildingElementProxy = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBuildingElementProxy(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBuildingElementProxyType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBuildingElementProxyType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBuildingElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcBuildingElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcBuildingStorey = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, Elevation) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + this.Elevation = Elevation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + let Elevation = tape[ptr++]; + return new IfcBuildingStorey(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, Elevation); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + args.push(this.Elevation); + ; + return args; + } +}; +var IfcBuildingSystem = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, LongName) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.PredefinedType = PredefinedType; + this.LongName = LongName; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let LongName = tape[ptr++]; + return new IfcBuildingSystem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, LongName); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.PredefinedType); + ; + args.push(this.LongName); + ; + return args; + } +}; +var IfcBurner = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBurner(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcBurnerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcBurnerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCShapeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, Depth, Width, WallThickness, Girth, InternalFilletRadius) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.Depth = Depth; + this.Width = Width; + this.WallThickness = WallThickness; + this.Girth = Girth; + this.InternalFilletRadius = InternalFilletRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let Depth = tape[ptr++]; + let Width = tape[ptr++]; + let WallThickness = tape[ptr++]; + let Girth = tape[ptr++]; + let InternalFilletRadius = tape[ptr++]; + return new IfcCShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, Width, WallThickness, Girth, InternalFilletRadius); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.Depth); + ; + args.push(this.Width); + ; + args.push(this.WallThickness); + ; + args.push(this.Girth); + ; + args.push(this.InternalFilletRadius); + ; + return args; + } +}; +var IfcCableCarrierFitting = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableCarrierFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCableCarrierFittingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableCarrierFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCableCarrierSegment = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableCarrierSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCableCarrierSegmentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableCarrierSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCableFitting = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCableFittingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCableSegment = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCableSegmentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCableSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCaissonFoundation = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCaissonFoundation(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCaissonFoundationType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCaissonFoundationType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCartesianPoint = class { + constructor(expressID, type, Coordinates) { + this.expressID = expressID; + this.type = type; + this.Coordinates = Coordinates; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Coordinates = tape[ptr++]; + return new IfcCartesianPoint(expressID, type, Coordinates); + } + ToTape() { + let args = []; + args.push(this.Coordinates); + ; + return args; + } +}; +var IfcCartesianPointList = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcCartesianPointList(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcCartesianPointList2D = class { + constructor(expressID, type, CoordList, TagList) { + this.expressID = expressID; + this.type = type; + this.CoordList = CoordList; + this.TagList = TagList; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CoordList = tape[ptr++]; + let TagList = tape[ptr++]; + return new IfcCartesianPointList2D(expressID, type, CoordList, TagList); + } + ToTape() { + let args = []; + args.push(this.CoordList); + ; + args.push(this.TagList); + ; + return args; + } +}; +var IfcCartesianPointList3D = class { + constructor(expressID, type, CoordList, TagList) { + this.expressID = expressID; + this.type = type; + this.CoordList = CoordList; + this.TagList = TagList; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CoordList = tape[ptr++]; + let TagList = tape[ptr++]; + return new IfcCartesianPointList3D(expressID, type, CoordList, TagList); + } + ToTape() { + let args = []; + args.push(this.CoordList); + ; + args.push(this.TagList); + ; + return args; + } +}; +var IfcCartesianTransformationOperator = class { + constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale) { + this.expressID = expressID; + this.type = type; + this.Axis1 = Axis1; + this.Axis2 = Axis2; + this.LocalOrigin = LocalOrigin; + this.Scale = Scale; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Axis1 = tape[ptr++]; + let Axis2 = tape[ptr++]; + let LocalOrigin = tape[ptr++]; + let Scale = tape[ptr++]; + return new IfcCartesianTransformationOperator(expressID, type, Axis1, Axis2, LocalOrigin, Scale); + } + ToTape() { + let args = []; + args.push(this.Axis1); + ; + args.push(this.Axis2); + ; + args.push(this.LocalOrigin); + ; + args.push(this.Scale); + ; + return args; + } +}; +var IfcCartesianTransformationOperator2D = class { + constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale) { + this.expressID = expressID; + this.type = type; + this.Axis1 = Axis1; + this.Axis2 = Axis2; + this.LocalOrigin = LocalOrigin; + this.Scale = Scale; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Axis1 = tape[ptr++]; + let Axis2 = tape[ptr++]; + let LocalOrigin = tape[ptr++]; + let Scale = tape[ptr++]; + return new IfcCartesianTransformationOperator2D(expressID, type, Axis1, Axis2, LocalOrigin, Scale); + } + ToTape() { + let args = []; + args.push(this.Axis1); + ; + args.push(this.Axis2); + ; + args.push(this.LocalOrigin); + ; + args.push(this.Scale); + ; + return args; + } +}; +var IfcCartesianTransformationOperator2DnonUniform = class { + constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Scale2) { + this.expressID = expressID; + this.type = type; + this.Axis1 = Axis1; + this.Axis2 = Axis2; + this.LocalOrigin = LocalOrigin; + this.Scale = Scale; + this.Scale2 = Scale2; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Axis1 = tape[ptr++]; + let Axis2 = tape[ptr++]; + let LocalOrigin = tape[ptr++]; + let Scale = tape[ptr++]; + let Scale2 = tape[ptr++]; + return new IfcCartesianTransformationOperator2DnonUniform(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Scale2); + } + ToTape() { + let args = []; + args.push(this.Axis1); + ; + args.push(this.Axis2); + ; + args.push(this.LocalOrigin); + ; + args.push(this.Scale); + ; + args.push(this.Scale2); + ; + return args; + } +}; +var IfcCartesianTransformationOperator3D = class { + constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3) { + this.expressID = expressID; + this.type = type; + this.Axis1 = Axis1; + this.Axis2 = Axis2; + this.LocalOrigin = LocalOrigin; + this.Scale = Scale; + this.Axis3 = Axis3; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Axis1 = tape[ptr++]; + let Axis2 = tape[ptr++]; + let LocalOrigin = tape[ptr++]; + let Scale = tape[ptr++]; + let Axis3 = tape[ptr++]; + return new IfcCartesianTransformationOperator3D(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3); + } + ToTape() { + let args = []; + args.push(this.Axis1); + ; + args.push(this.Axis2); + ; + args.push(this.LocalOrigin); + ; + args.push(this.Scale); + ; + args.push(this.Axis3); + ; + return args; + } +}; +var IfcCartesianTransformationOperator3DnonUniform = class { + constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3, Scale2, Scale3) { + this.expressID = expressID; + this.type = type; + this.Axis1 = Axis1; + this.Axis2 = Axis2; + this.LocalOrigin = LocalOrigin; + this.Scale = Scale; + this.Axis3 = Axis3; + this.Scale2 = Scale2; + this.Scale3 = Scale3; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Axis1 = tape[ptr++]; + let Axis2 = tape[ptr++]; + let LocalOrigin = tape[ptr++]; + let Scale = tape[ptr++]; + let Axis3 = tape[ptr++]; + let Scale2 = tape[ptr++]; + let Scale3 = tape[ptr++]; + return new IfcCartesianTransformationOperator3DnonUniform(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3, Scale2, Scale3); + } + ToTape() { + let args = []; + args.push(this.Axis1); + ; + args.push(this.Axis2); + ; + args.push(this.LocalOrigin); + ; + args.push(this.Scale); + ; + args.push(this.Axis3); + ; + args.push(this.Scale2); + ; + args.push(this.Scale3); + ; + return args; + } +}; +var IfcCenterLineProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Curve, Thickness) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Curve = Curve; + this.Thickness = Thickness; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Curve = tape[ptr++]; + let Thickness = tape[ptr++]; + return new IfcCenterLineProfileDef(expressID, type, ProfileType, ProfileName, Curve, Thickness); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Curve); + ; + args.push(this.Thickness); + ; + return args; + } +}; +var IfcChiller = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcChiller(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcChillerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcChillerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcChimney = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcChimney(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcChimneyType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcChimneyType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCircle = class { + constructor(expressID, type, Position, Radius) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.Radius = Radius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + return new IfcCircle(expressID, type, Position, Radius); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.Radius); + ; + return args; + } +}; +var IfcCircleHollowProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, Radius, WallThickness) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.Radius = Radius; + this.WallThickness = WallThickness; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + let WallThickness = tape[ptr++]; + return new IfcCircleHollowProfileDef(expressID, type, ProfileType, ProfileName, Position, Radius, WallThickness); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.Radius); + ; + args.push(this.WallThickness); + ; + return args; + } +}; +var IfcCircleProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, Radius) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.Radius = Radius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + return new IfcCircleProfileDef(expressID, type, ProfileType, ProfileName, Position, Radius); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.Radius); + ; + return args; + } +}; +var IfcCircularArcSegment2D = class { + constructor(expressID, type, StartPoint, StartDirection, SegmentLength, Radius, IsCCW) { + this.expressID = expressID; + this.type = type; + this.StartPoint = StartPoint; + this.StartDirection = StartDirection; + this.SegmentLength = SegmentLength; + this.Radius = Radius; + this.IsCCW = IsCCW; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let StartPoint = tape[ptr++]; + let StartDirection = tape[ptr++]; + let SegmentLength = tape[ptr++]; + let Radius = tape[ptr++]; + let IsCCW = tape[ptr++]; + return new IfcCircularArcSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength, Radius, IsCCW); + } + ToTape() { + let args = []; + args.push(this.StartPoint); + ; + args.push(this.StartDirection); + ; + args.push(this.SegmentLength); + ; + args.push(this.Radius); + ; + args.push(this.IsCCW); + ; + return args; + } +}; +var IfcCivilElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcCivilElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcCivilElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcCivilElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcClassification = class { + constructor(expressID, type, Source, Edition, EditionDate, Name, Description, Location, ReferenceTokens) { + this.expressID = expressID; + this.type = type; + this.Source = Source; + this.Edition = Edition; + this.EditionDate = EditionDate; + this.Name = Name; + this.Description = Description; + this.Location = Location; + this.ReferenceTokens = ReferenceTokens; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Source = tape[ptr++]; + let Edition = tape[ptr++]; + let EditionDate = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Location = tape[ptr++]; + let ReferenceTokens = tape[ptr++]; + return new IfcClassification(expressID, type, Source, Edition, EditionDate, Name, Description, Location, ReferenceTokens); + } + ToTape() { + let args = []; + args.push(this.Source); + ; + args.push(this.Edition); + ; + args.push(this.EditionDate); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Location); + ; + args.push(this.ReferenceTokens); + ; + return args; + } +}; +var IfcClassificationReference = class { + constructor(expressID, type, Location, Identification, Name, ReferencedSource, Description, Sort) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Identification = Identification; + this.Name = Name; + this.ReferencedSource = ReferencedSource; + this.Description = Description; + this.Sort = Sort; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + let ReferencedSource = tape[ptr++]; + let Description = tape[ptr++]; + let Sort = tape[ptr++]; + return new IfcClassificationReference(expressID, type, Location, Identification, Name, ReferencedSource, Description, Sort); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Identification); + ; + args.push(this.Name); + ; + args.push(this.ReferencedSource); + ; + args.push(this.Description); + ; + args.push(this.Sort); + ; + return args; + } +}; +var IfcClosedShell = class { + constructor(expressID, type, CfsFaces) { + this.expressID = expressID; + this.type = type; + this.CfsFaces = CfsFaces; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CfsFaces = tape[ptr++]; + return new IfcClosedShell(expressID, type, CfsFaces); + } + ToTape() { + let args = []; + args.push(this.CfsFaces); + ; + return args; + } +}; +var IfcCoil = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCoil(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCoilType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCoilType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcColourRgb = class { + constructor(expressID, type, Name, Red, Green, Blue) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Red = Red; + this.Green = Green; + this.Blue = Blue; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Red = tape[ptr++]; + let Green = tape[ptr++]; + let Blue = tape[ptr++]; + return new IfcColourRgb(expressID, type, Name, Red, Green, Blue); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Red); + ; + args.push(this.Green); + ; + args.push(this.Blue); + ; + return args; + } +}; +var IfcColourRgbList = class { + constructor(expressID, type, ColourList) { + this.expressID = expressID; + this.type = type; + this.ColourList = ColourList; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ColourList = tape[ptr++]; + return new IfcColourRgbList(expressID, type, ColourList); + } + ToTape() { + let args = []; + args.push(this.ColourList); + ; + return args; + } +}; +var IfcColourSpecification = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcColourSpecification(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcColumn = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcColumn(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcColumnStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcColumnStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcColumnType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcColumnType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCommunicationsAppliance = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCommunicationsAppliance(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCommunicationsApplianceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCommunicationsApplianceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcComplexProperty = class { + constructor(expressID, type, Name, Description, UsageName, HasProperties) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.UsageName = UsageName; + this.HasProperties = HasProperties; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let UsageName = tape[ptr++]; + let HasProperties = tape[ptr++]; + return new IfcComplexProperty(expressID, type, Name, Description, UsageName, HasProperties); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.UsageName); + ; + args.push(this.HasProperties); + ; + return args; + } +}; +var IfcComplexPropertyTemplate = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, UsageName, TemplateType, HasPropertyTemplates) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.UsageName = UsageName; + this.TemplateType = TemplateType; + this.HasPropertyTemplates = HasPropertyTemplates; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let UsageName = tape[ptr++]; + let TemplateType = tape[ptr++]; + let HasPropertyTemplates = tape[ptr++]; + return new IfcComplexPropertyTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, UsageName, TemplateType, HasPropertyTemplates); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.UsageName); + ; + args.push(this.TemplateType); + ; + args.push(this.HasPropertyTemplates); + ; + return args; + } +}; +var IfcCompositeCurve = class { + constructor(expressID, type, Segments, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.Segments = Segments; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Segments = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcCompositeCurve(expressID, type, Segments, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.Segments); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcCompositeCurveOnSurface = class { + constructor(expressID, type, Segments, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.Segments = Segments; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Segments = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcCompositeCurveOnSurface(expressID, type, Segments, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.Segments); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcCompositeCurveSegment = class { + constructor(expressID, type, Transition, SameSense, ParentCurve) { + this.expressID = expressID; + this.type = type; + this.Transition = Transition; + this.SameSense = SameSense; + this.ParentCurve = ParentCurve; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Transition = tape[ptr++]; + let SameSense = tape[ptr++]; + let ParentCurve = tape[ptr++]; + return new IfcCompositeCurveSegment(expressID, type, Transition, SameSense, ParentCurve); + } + ToTape() { + let args = []; + args.push(this.Transition); + ; + args.push(this.SameSense); + ; + args.push(this.ParentCurve); + ; + return args; + } +}; +var IfcCompositeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Profiles, Label) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Profiles = Profiles; + this.Label = Label; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Profiles = tape[ptr++]; + let Label = tape[ptr++]; + return new IfcCompositeProfileDef(expressID, type, ProfileType, ProfileName, Profiles, Label); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Profiles); + ; + args.push(this.Label); + ; + return args; + } +}; +var IfcCompressor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCompressor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCompressorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCompressorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCondenser = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCondenser(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCondenserType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCondenserType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConic = class { + constructor(expressID, type, Position) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + return new IfcConic(expressID, type, Position); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + return args; + } +}; +var IfcConnectedFaceSet = class { + constructor(expressID, type, CfsFaces) { + this.expressID = expressID; + this.type = type; + this.CfsFaces = CfsFaces; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CfsFaces = tape[ptr++]; + return new IfcConnectedFaceSet(expressID, type, CfsFaces); + } + ToTape() { + let args = []; + args.push(this.CfsFaces); + ; + return args; + } +}; +var IfcConnectionCurveGeometry = class { + constructor(expressID, type, CurveOnRelatingElement, CurveOnRelatedElement) { + this.expressID = expressID; + this.type = type; + this.CurveOnRelatingElement = CurveOnRelatingElement; + this.CurveOnRelatedElement = CurveOnRelatedElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CurveOnRelatingElement = tape[ptr++]; + let CurveOnRelatedElement = tape[ptr++]; + return new IfcConnectionCurveGeometry(expressID, type, CurveOnRelatingElement, CurveOnRelatedElement); + } + ToTape() { + let args = []; + args.push(this.CurveOnRelatingElement); + ; + args.push(this.CurveOnRelatedElement); + ; + return args; + } +}; +var IfcConnectionGeometry = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcConnectionGeometry(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcConnectionPointEccentricity = class { + constructor(expressID, type, PointOnRelatingElement, PointOnRelatedElement, EccentricityInX, EccentricityInY, EccentricityInZ) { + this.expressID = expressID; + this.type = type; + this.PointOnRelatingElement = PointOnRelatingElement; + this.PointOnRelatedElement = PointOnRelatedElement; + this.EccentricityInX = EccentricityInX; + this.EccentricityInY = EccentricityInY; + this.EccentricityInZ = EccentricityInZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let PointOnRelatingElement = tape[ptr++]; + let PointOnRelatedElement = tape[ptr++]; + let EccentricityInX = tape[ptr++]; + let EccentricityInY = tape[ptr++]; + let EccentricityInZ = tape[ptr++]; + return new IfcConnectionPointEccentricity(expressID, type, PointOnRelatingElement, PointOnRelatedElement, EccentricityInX, EccentricityInY, EccentricityInZ); + } + ToTape() { + let args = []; + args.push(this.PointOnRelatingElement); + ; + args.push(this.PointOnRelatedElement); + ; + args.push(this.EccentricityInX); + ; + args.push(this.EccentricityInY); + ; + args.push(this.EccentricityInZ); + ; + return args; + } +}; +var IfcConnectionPointGeometry = class { + constructor(expressID, type, PointOnRelatingElement, PointOnRelatedElement) { + this.expressID = expressID; + this.type = type; + this.PointOnRelatingElement = PointOnRelatingElement; + this.PointOnRelatedElement = PointOnRelatedElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let PointOnRelatingElement = tape[ptr++]; + let PointOnRelatedElement = tape[ptr++]; + return new IfcConnectionPointGeometry(expressID, type, PointOnRelatingElement, PointOnRelatedElement); + } + ToTape() { + let args = []; + args.push(this.PointOnRelatingElement); + ; + args.push(this.PointOnRelatedElement); + ; + return args; + } +}; +var IfcConnectionSurfaceGeometry = class { + constructor(expressID, type, SurfaceOnRelatingElement, SurfaceOnRelatedElement) { + this.expressID = expressID; + this.type = type; + this.SurfaceOnRelatingElement = SurfaceOnRelatingElement; + this.SurfaceOnRelatedElement = SurfaceOnRelatedElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SurfaceOnRelatingElement = tape[ptr++]; + let SurfaceOnRelatedElement = tape[ptr++]; + return new IfcConnectionSurfaceGeometry(expressID, type, SurfaceOnRelatingElement, SurfaceOnRelatedElement); + } + ToTape() { + let args = []; + args.push(this.SurfaceOnRelatingElement); + ; + args.push(this.SurfaceOnRelatedElement); + ; + return args; + } +}; +var IfcConnectionVolumeGeometry = class { + constructor(expressID, type, VolumeOnRelatingElement, VolumeOnRelatedElement) { + this.expressID = expressID; + this.type = type; + this.VolumeOnRelatingElement = VolumeOnRelatingElement; + this.VolumeOnRelatedElement = VolumeOnRelatedElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let VolumeOnRelatingElement = tape[ptr++]; + let VolumeOnRelatedElement = tape[ptr++]; + return new IfcConnectionVolumeGeometry(expressID, type, VolumeOnRelatingElement, VolumeOnRelatedElement); + } + ToTape() { + let args = []; + args.push(this.VolumeOnRelatingElement); + ; + args.push(this.VolumeOnRelatedElement); + ; + return args; + } +}; +var IfcConstraint = class { + constructor(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.ConstraintGrade = ConstraintGrade; + this.ConstraintSource = ConstraintSource; + this.CreatingActor = CreatingActor; + this.CreationTime = CreationTime; + this.UserDefinedGrade = UserDefinedGrade; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ConstraintGrade = tape[ptr++]; + let ConstraintSource = tape[ptr++]; + let CreatingActor = tape[ptr++]; + let CreationTime = tape[ptr++]; + let UserDefinedGrade = tape[ptr++]; + return new IfcConstraint(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ConstraintGrade); + ; + args.push(this.ConstraintSource); + ; + args.push(this.CreatingActor); + ; + args.push(this.CreationTime); + ; + args.push(this.UserDefinedGrade); + ; + return args; + } +}; +var IfcConstructionEquipmentResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Usage = Usage; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Usage = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcConstructionEquipmentResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Usage); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConstructionEquipmentResourceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcConstructionEquipmentResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConstructionMaterialResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Usage = Usage; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Usage = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcConstructionMaterialResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Usage); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConstructionMaterialResourceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcConstructionMaterialResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConstructionProductResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Usage = Usage; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Usage = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcConstructionProductResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Usage); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConstructionProductResourceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcConstructionProductResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConstructionResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Usage = Usage; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Usage = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + return new IfcConstructionResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Usage); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + return args; + } +}; +var IfcConstructionResourceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + return new IfcConstructionResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + return args; + } +}; +var IfcContext = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.LongName = LongName; + this.Phase = Phase; + this.RepresentationContexts = RepresentationContexts; + this.UnitsInContext = UnitsInContext; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let LongName = tape[ptr++]; + let Phase = tape[ptr++]; + let RepresentationContexts = tape[ptr++]; + let UnitsInContext = tape[ptr++]; + return new IfcContext(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.LongName); + ; + args.push(this.Phase); + ; + args.push(this.RepresentationContexts); + ; + args.push(this.UnitsInContext); + ; + return args; + } +}; +var IfcContextDependentUnit = class { + constructor(expressID, type, Dimensions, UnitType, Name) { + this.expressID = expressID; + this.type = type; + this.Dimensions = Dimensions; + this.UnitType = UnitType; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Dimensions = tape[ptr++]; + let UnitType = tape[ptr++]; + let Name = tape[ptr++]; + return new IfcContextDependentUnit(expressID, type, Dimensions, UnitType, Name); + } + ToTape() { + let args = []; + args.push(this.Dimensions); + ; + args.push(this.UnitType); + ; + args.push(this.Name); + ; + return args; + } +}; +var IfcControl = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + return new IfcControl(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + return args; + } +}; +var IfcController = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcController(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcControllerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcControllerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcConversionBasedUnit = class { + constructor(expressID, type, Dimensions, UnitType, Name, ConversionFactor) { + this.expressID = expressID; + this.type = type; + this.Dimensions = Dimensions; + this.UnitType = UnitType; + this.Name = Name; + this.ConversionFactor = ConversionFactor; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Dimensions = tape[ptr++]; + let UnitType = tape[ptr++]; + let Name = tape[ptr++]; + let ConversionFactor = tape[ptr++]; + return new IfcConversionBasedUnit(expressID, type, Dimensions, UnitType, Name, ConversionFactor); + } + ToTape() { + let args = []; + args.push(this.Dimensions); + ; + args.push(this.UnitType); + ; + args.push(this.Name); + ; + args.push(this.ConversionFactor); + ; + return args; + } +}; +var IfcConversionBasedUnitWithOffset = class { + constructor(expressID, type, Dimensions, UnitType, Name, ConversionFactor, ConversionOffset) { + this.expressID = expressID; + this.type = type; + this.Dimensions = Dimensions; + this.UnitType = UnitType; + this.Name = Name; + this.ConversionFactor = ConversionFactor; + this.ConversionOffset = ConversionOffset; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Dimensions = tape[ptr++]; + let UnitType = tape[ptr++]; + let Name = tape[ptr++]; + let ConversionFactor = tape[ptr++]; + let ConversionOffset = tape[ptr++]; + return new IfcConversionBasedUnitWithOffset(expressID, type, Dimensions, UnitType, Name, ConversionFactor, ConversionOffset); + } + ToTape() { + let args = []; + args.push(this.Dimensions); + ; + args.push(this.UnitType); + ; + args.push(this.Name); + ; + args.push(this.ConversionFactor); + ; + args.push(this.ConversionOffset); + ; + return args; + } +}; +var IfcCooledBeam = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCooledBeam(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCooledBeamType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCooledBeamType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCoolingTower = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCoolingTower(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCoolingTowerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCoolingTowerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCoordinateOperation = class { + constructor(expressID, type, SourceCRS, TargetCRS) { + this.expressID = expressID; + this.type = type; + this.SourceCRS = SourceCRS; + this.TargetCRS = TargetCRS; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SourceCRS = tape[ptr++]; + let TargetCRS = tape[ptr++]; + return new IfcCoordinateOperation(expressID, type, SourceCRS, TargetCRS); + } + ToTape() { + let args = []; + args.push(this.SourceCRS); + ; + args.push(this.TargetCRS); + ; + return args; + } +}; +var IfcCoordinateReferenceSystem = class { + constructor(expressID, type, Name, Description, GeodeticDatum, VerticalDatum) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.GeodeticDatum = GeodeticDatum; + this.VerticalDatum = VerticalDatum; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let GeodeticDatum = tape[ptr++]; + let VerticalDatum = tape[ptr++]; + return new IfcCoordinateReferenceSystem(expressID, type, Name, Description, GeodeticDatum, VerticalDatum); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.GeodeticDatum); + ; + args.push(this.VerticalDatum); + ; + return args; + } +}; +var IfcCostItem = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, CostValues, CostQuantities) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.PredefinedType = PredefinedType; + this.CostValues = CostValues; + this.CostQuantities = CostQuantities; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let CostValues = tape[ptr++]; + let CostQuantities = tape[ptr++]; + return new IfcCostItem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, CostValues, CostQuantities); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.PredefinedType); + ; + args.push(this.CostValues); + ; + args.push(this.CostQuantities); + ; + return args; + } +}; +var IfcCostSchedule = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, SubmittedOn, UpdateDate) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.PredefinedType = PredefinedType; + this.Status = Status; + this.SubmittedOn = SubmittedOn; + this.UpdateDate = UpdateDate; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Status = tape[ptr++]; + let SubmittedOn = tape[ptr++]; + let UpdateDate = tape[ptr++]; + return new IfcCostSchedule(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, SubmittedOn, UpdateDate); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.PredefinedType); + ; + args.push(this.Status); + ; + args.push(this.SubmittedOn); + ; + args.push(this.UpdateDate); + ; + return args; + } +}; +var IfcCostValue = class { + constructor(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.AppliedValue = AppliedValue; + this.UnitBasis = UnitBasis; + this.ApplicableDate = ApplicableDate; + this.FixedUntilDate = FixedUntilDate; + this.Category = Category; + this.Condition = Condition; + this.ArithmeticOperator = ArithmeticOperator; + this.Components = Components; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let AppliedValue = tape[ptr++]; + let UnitBasis = tape[ptr++]; + let ApplicableDate = tape[ptr++]; + let FixedUntilDate = tape[ptr++]; + let Category = tape[ptr++]; + let Condition = tape[ptr++]; + let ArithmeticOperator = tape[ptr++]; + let Components = tape[ptr++]; + return new IfcCostValue(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.AppliedValue); + ; + args.push(this.UnitBasis); + ; + args.push(this.ApplicableDate); + ; + args.push(this.FixedUntilDate); + ; + args.push(this.Category); + ; + args.push(this.Condition); + ; + args.push(this.ArithmeticOperator); + ; + args.push(this.Components); + ; + return args; + } +}; +var IfcCovering = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCovering(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCoveringType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCoveringType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCrewResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Usage = Usage; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Usage = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCrewResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Usage); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCrewResourceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCrewResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCsgPrimitive3D = class { + constructor(expressID, type, Position) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + return new IfcCsgPrimitive3D(expressID, type, Position); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + return args; + } +}; +var IfcCsgSolid = class { + constructor(expressID, type, TreeRootExpression) { + this.expressID = expressID; + this.type = type; + this.TreeRootExpression = TreeRootExpression; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TreeRootExpression = tape[ptr++]; + return new IfcCsgSolid(expressID, type, TreeRootExpression); + } + ToTape() { + let args = []; + args.push(this.TreeRootExpression); + ; + return args; + } +}; +var IfcCurrencyRelationship = class { + constructor(expressID, type, Name, Description, RelatingMonetaryUnit, RelatedMonetaryUnit, ExchangeRate, RateDateTime, RateSource) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatingMonetaryUnit = RelatingMonetaryUnit; + this.RelatedMonetaryUnit = RelatedMonetaryUnit; + this.ExchangeRate = ExchangeRate; + this.RateDateTime = RateDateTime; + this.RateSource = RateSource; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingMonetaryUnit = tape[ptr++]; + let RelatedMonetaryUnit = tape[ptr++]; + let ExchangeRate = tape[ptr++]; + let RateDateTime = tape[ptr++]; + let RateSource = tape[ptr++]; + return new IfcCurrencyRelationship(expressID, type, Name, Description, RelatingMonetaryUnit, RelatedMonetaryUnit, ExchangeRate, RateDateTime, RateSource); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingMonetaryUnit); + ; + args.push(this.RelatedMonetaryUnit); + ; + args.push(this.ExchangeRate); + ; + args.push(this.RateDateTime); + ; + args.push(this.RateSource); + ; + return args; + } +}; +var IfcCurtainWall = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCurtainWall(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCurtainWallType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcCurtainWallType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcCurve = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcCurve(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcCurveBoundedPlane = class { + constructor(expressID, type, BasisSurface, OuterBoundary, InnerBoundaries) { + this.expressID = expressID; + this.type = type; + this.BasisSurface = BasisSurface; + this.OuterBoundary = OuterBoundary; + this.InnerBoundaries = InnerBoundaries; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisSurface = tape[ptr++]; + let OuterBoundary = tape[ptr++]; + let InnerBoundaries = tape[ptr++]; + return new IfcCurveBoundedPlane(expressID, type, BasisSurface, OuterBoundary, InnerBoundaries); + } + ToTape() { + let args = []; + args.push(this.BasisSurface); + ; + args.push(this.OuterBoundary); + ; + args.push(this.InnerBoundaries); + ; + return args; + } +}; +var IfcCurveBoundedSurface = class { + constructor(expressID, type, BasisSurface, Boundaries, ImplicitOuter) { + this.expressID = expressID; + this.type = type; + this.BasisSurface = BasisSurface; + this.Boundaries = Boundaries; + this.ImplicitOuter = ImplicitOuter; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisSurface = tape[ptr++]; + let Boundaries = tape[ptr++]; + let ImplicitOuter = tape[ptr++]; + return new IfcCurveBoundedSurface(expressID, type, BasisSurface, Boundaries, ImplicitOuter); + } + ToTape() { + let args = []; + args.push(this.BasisSurface); + ; + args.push(this.Boundaries); + ; + args.push(this.ImplicitOuter); + ; + return args; + } +}; +var IfcCurveSegment2D = class { + constructor(expressID, type, StartPoint, StartDirection, SegmentLength) { + this.expressID = expressID; + this.type = type; + this.StartPoint = StartPoint; + this.StartDirection = StartDirection; + this.SegmentLength = SegmentLength; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let StartPoint = tape[ptr++]; + let StartDirection = tape[ptr++]; + let SegmentLength = tape[ptr++]; + return new IfcCurveSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength); + } + ToTape() { + let args = []; + args.push(this.StartPoint); + ; + args.push(this.StartDirection); + ; + args.push(this.SegmentLength); + ; + return args; + } +}; +var IfcCurveStyle = class { + constructor(expressID, type, Name, CurveFont, CurveWidth, CurveColour, ModelOrDraughting) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.CurveFont = CurveFont; + this.CurveWidth = CurveWidth; + this.CurveColour = CurveColour; + this.ModelOrDraughting = ModelOrDraughting; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let CurveFont = tape[ptr++]; + let CurveWidth = tape[ptr++]; + let CurveColour = tape[ptr++]; + let ModelOrDraughting = tape[ptr++]; + return new IfcCurveStyle(expressID, type, Name, CurveFont, CurveWidth, CurveColour, ModelOrDraughting); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.CurveFont); + ; + args.push(this.CurveWidth); + ; + args.push(this.CurveColour); + ; + args.push(this.ModelOrDraughting); + ; + return args; + } +}; +var IfcCurveStyleFont = class { + constructor(expressID, type, Name, PatternList) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.PatternList = PatternList; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let PatternList = tape[ptr++]; + return new IfcCurveStyleFont(expressID, type, Name, PatternList); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.PatternList); + ; + return args; + } +}; +var IfcCurveStyleFontAndScaling = class { + constructor(expressID, type, Name, CurveFont, CurveFontScaling) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.CurveFont = CurveFont; + this.CurveFontScaling = CurveFontScaling; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let CurveFont = tape[ptr++]; + let CurveFontScaling = tape[ptr++]; + return new IfcCurveStyleFontAndScaling(expressID, type, Name, CurveFont, CurveFontScaling); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.CurveFont); + ; + args.push(this.CurveFontScaling); + ; + return args; + } +}; +var IfcCurveStyleFontPattern = class { + constructor(expressID, type, VisibleSegmentLength, InvisibleSegmentLength) { + this.expressID = expressID; + this.type = type; + this.VisibleSegmentLength = VisibleSegmentLength; + this.InvisibleSegmentLength = InvisibleSegmentLength; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let VisibleSegmentLength = tape[ptr++]; + let InvisibleSegmentLength = tape[ptr++]; + return new IfcCurveStyleFontPattern(expressID, type, VisibleSegmentLength, InvisibleSegmentLength); + } + ToTape() { + let args = []; + args.push(this.VisibleSegmentLength); + ; + args.push(this.InvisibleSegmentLength); + ; + return args; + } +}; +var IfcCylindricalSurface = class { + constructor(expressID, type, Position, Radius) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.Radius = Radius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + return new IfcCylindricalSurface(expressID, type, Position, Radius); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.Radius); + ; + return args; + } +}; +var IfcDamper = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDamper(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDamperType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDamperType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDeepFoundation = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcDeepFoundation(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcDeepFoundationType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcDeepFoundationType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcDerivedProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.ParentProfile = ParentProfile; + this.Operator = Operator; + this.Label = Label; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let ParentProfile = tape[ptr++]; + let Operator = tape[ptr++]; + let Label = tape[ptr++]; + return new IfcDerivedProfileDef(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.ParentProfile); + ; + args.push(this.Operator); + ; + args.push(this.Label); + ; + return args; + } +}; +var IfcDerivedUnit = class { + constructor(expressID, type, Elements, UnitType, UserDefinedType) { + this.expressID = expressID; + this.type = type; + this.Elements = Elements; + this.UnitType = UnitType; + this.UserDefinedType = UserDefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Elements = tape[ptr++]; + let UnitType = tape[ptr++]; + let UserDefinedType = tape[ptr++]; + return new IfcDerivedUnit(expressID, type, Elements, UnitType, UserDefinedType); + } + ToTape() { + let args = []; + args.push(this.Elements); + ; + args.push(this.UnitType); + ; + args.push(this.UserDefinedType); + ; + return args; + } +}; +var IfcDerivedUnitElement = class { + constructor(expressID, type, Unit, Exponent) { + this.expressID = expressID; + this.type = type; + this.Unit = Unit; + this.Exponent = Exponent; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Unit = tape[ptr++]; + let Exponent = tape[ptr++]; + return new IfcDerivedUnitElement(expressID, type, Unit, Exponent); + } + ToTape() { + let args = []; + args.push(this.Unit); + ; + args.push(this.Exponent); + ; + return args; + } +}; +var IfcDimensionalExponents = class { + constructor(expressID, type, LengthExponent, MassExponent, TimeExponent, ElectricCurrentExponent, ThermodynamicTemperatureExponent, AmountOfSubstanceExponent, LuminousIntensityExponent) { + this.expressID = expressID; + this.type = type; + this.LengthExponent = LengthExponent; + this.MassExponent = MassExponent; + this.TimeExponent = TimeExponent; + this.ElectricCurrentExponent = ElectricCurrentExponent; + this.ThermodynamicTemperatureExponent = ThermodynamicTemperatureExponent; + this.AmountOfSubstanceExponent = AmountOfSubstanceExponent; + this.LuminousIntensityExponent = LuminousIntensityExponent; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let LengthExponent = tape[ptr++]; + let MassExponent = tape[ptr++]; + let TimeExponent = tape[ptr++]; + let ElectricCurrentExponent = tape[ptr++]; + let ThermodynamicTemperatureExponent = tape[ptr++]; + let AmountOfSubstanceExponent = tape[ptr++]; + let LuminousIntensityExponent = tape[ptr++]; + return new IfcDimensionalExponents(expressID, type, LengthExponent, MassExponent, TimeExponent, ElectricCurrentExponent, ThermodynamicTemperatureExponent, AmountOfSubstanceExponent, LuminousIntensityExponent); + } + ToTape() { + let args = []; + args.push(this.LengthExponent); + ; + args.push(this.MassExponent); + ; + args.push(this.TimeExponent); + ; + args.push(this.ElectricCurrentExponent); + ; + args.push(this.ThermodynamicTemperatureExponent); + ; + args.push(this.AmountOfSubstanceExponent); + ; + args.push(this.LuminousIntensityExponent); + ; + return args; + } +}; +var IfcDirection = class { + constructor(expressID, type, DirectionRatios) { + this.expressID = expressID; + this.type = type; + this.DirectionRatios = DirectionRatios; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let DirectionRatios = tape[ptr++]; + return new IfcDirection(expressID, type, DirectionRatios); + } + ToTape() { + let args = []; + args.push(this.DirectionRatios); + ; + return args; + } +}; +var IfcDiscreteAccessory = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDiscreteAccessory(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDiscreteAccessoryType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDiscreteAccessoryType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDistanceExpression = class { + constructor(expressID, type, DistanceAlong, OffsetLateral, OffsetVertical, OffsetLongitudinal, AlongHorizontal) { + this.expressID = expressID; + this.type = type; + this.DistanceAlong = DistanceAlong; + this.OffsetLateral = OffsetLateral; + this.OffsetVertical = OffsetVertical; + this.OffsetLongitudinal = OffsetLongitudinal; + this.AlongHorizontal = AlongHorizontal; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let DistanceAlong = tape[ptr++]; + let OffsetLateral = tape[ptr++]; + let OffsetVertical = tape[ptr++]; + let OffsetLongitudinal = tape[ptr++]; + let AlongHorizontal = tape[ptr++]; + return new IfcDistanceExpression(expressID, type, DistanceAlong, OffsetLateral, OffsetVertical, OffsetLongitudinal, AlongHorizontal); + } + ToTape() { + let args = []; + args.push(this.DistanceAlong); + ; + args.push(this.OffsetLateral); + ; + args.push(this.OffsetVertical); + ; + args.push(this.OffsetLongitudinal); + ; + args.push(this.AlongHorizontal); + ; + return args; + } +}; +var IfcDistributionChamberElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDistributionChamberElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDistributionChamberElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDistributionChamberElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDistributionCircuit = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.LongName = LongName; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let LongName = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDistributionCircuit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.LongName); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDistributionControlElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcDistributionControlElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcDistributionControlElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcDistributionControlElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcDistributionElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcDistributionElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcDistributionElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcDistributionElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcDistributionFlowElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcDistributionFlowElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcDistributionFlowElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcDistributionFlowElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcDistributionPort = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, FlowDirection, PredefinedType, SystemType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.FlowDirection = FlowDirection; + this.PredefinedType = PredefinedType; + this.SystemType = SystemType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let FlowDirection = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let SystemType = tape[ptr++]; + return new IfcDistributionPort(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, FlowDirection, PredefinedType, SystemType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.FlowDirection); + ; + args.push(this.PredefinedType); + ; + args.push(this.SystemType); + ; + return args; + } +}; +var IfcDistributionSystem = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.LongName = LongName; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let LongName = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDistributionSystem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.LongName); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDocumentInformation = class { + constructor(expressID, type, Identification, Name, Description, Location, Purpose, IntendedUse, Scope, Revision, DocumentOwner, Editors, CreationTime, LastRevisionTime, ElectronicFormat, ValidFrom, ValidUntil, Confidentiality, Status) { + this.expressID = expressID; + this.type = type; + this.Identification = Identification; + this.Name = Name; + this.Description = Description; + this.Location = Location; + this.Purpose = Purpose; + this.IntendedUse = IntendedUse; + this.Scope = Scope; + this.Revision = Revision; + this.DocumentOwner = DocumentOwner; + this.Editors = Editors; + this.CreationTime = CreationTime; + this.LastRevisionTime = LastRevisionTime; + this.ElectronicFormat = ElectronicFormat; + this.ValidFrom = ValidFrom; + this.ValidUntil = ValidUntil; + this.Confidentiality = Confidentiality; + this.Status = Status; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Location = tape[ptr++]; + let Purpose = tape[ptr++]; + let IntendedUse = tape[ptr++]; + let Scope = tape[ptr++]; + let Revision = tape[ptr++]; + let DocumentOwner = tape[ptr++]; + let Editors = tape[ptr++]; + let CreationTime = tape[ptr++]; + let LastRevisionTime = tape[ptr++]; + let ElectronicFormat = tape[ptr++]; + let ValidFrom = tape[ptr++]; + let ValidUntil = tape[ptr++]; + let Confidentiality = tape[ptr++]; + let Status = tape[ptr++]; + return new IfcDocumentInformation(expressID, type, Identification, Name, Description, Location, Purpose, IntendedUse, Scope, Revision, DocumentOwner, Editors, CreationTime, LastRevisionTime, ElectronicFormat, ValidFrom, ValidUntil, Confidentiality, Status); + } + ToTape() { + let args = []; + args.push(this.Identification); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Location); + ; + args.push(this.Purpose); + ; + args.push(this.IntendedUse); + ; + args.push(this.Scope); + ; + args.push(this.Revision); + ; + args.push(this.DocumentOwner); + ; + args.push(this.Editors); + ; + args.push(this.CreationTime); + ; + args.push(this.LastRevisionTime); + ; + args.push(this.ElectronicFormat); + ; + args.push(this.ValidFrom); + ; + args.push(this.ValidUntil); + ; + args.push(this.Confidentiality); + ; + args.push(this.Status); + ; + return args; + } +}; +var IfcDocumentInformationRelationship = class { + constructor(expressID, type, Name, Description, RelatingDocument, RelatedDocuments, RelationshipType) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatingDocument = RelatingDocument; + this.RelatedDocuments = RelatedDocuments; + this.RelationshipType = RelationshipType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingDocument = tape[ptr++]; + let RelatedDocuments = tape[ptr++]; + let RelationshipType = tape[ptr++]; + return new IfcDocumentInformationRelationship(expressID, type, Name, Description, RelatingDocument, RelatedDocuments, RelationshipType); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingDocument); + ; + args.push(this.RelatedDocuments); + ; + args.push(this.RelationshipType); + ; + return args; + } +}; +var IfcDocumentReference = class { + constructor(expressID, type, Location, Identification, Name, Description, ReferencedDocument) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Identification = Identification; + this.Name = Name; + this.Description = Description; + this.ReferencedDocument = ReferencedDocument; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ReferencedDocument = tape[ptr++]; + return new IfcDocumentReference(expressID, type, Location, Identification, Name, Description, ReferencedDocument); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Identification); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ReferencedDocument); + ; + return args; + } +}; +var IfcDoor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.OverallHeight = OverallHeight; + this.OverallWidth = OverallWidth; + this.PredefinedType = PredefinedType; + this.OperationType = OperationType; + this.UserDefinedOperationType = UserDefinedOperationType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let OverallHeight = tape[ptr++]; + let OverallWidth = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let OperationType = tape[ptr++]; + let UserDefinedOperationType = tape[ptr++]; + return new IfcDoor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.OverallHeight); + ; + args.push(this.OverallWidth); + ; + args.push(this.PredefinedType); + ; + args.push(this.OperationType); + ; + args.push(this.UserDefinedOperationType); + ; + return args; + } +}; +var IfcDoorLiningProperties = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, ThresholdDepth, ThresholdThickness, TransomThickness, TransomOffset, LiningOffset, ThresholdOffset, CasingThickness, CasingDepth, ShapeAspectStyle, LiningToPanelOffsetX, LiningToPanelOffsetY) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.LiningDepth = LiningDepth; + this.LiningThickness = LiningThickness; + this.ThresholdDepth = ThresholdDepth; + this.ThresholdThickness = ThresholdThickness; + this.TransomThickness = TransomThickness; + this.TransomOffset = TransomOffset; + this.LiningOffset = LiningOffset; + this.ThresholdOffset = ThresholdOffset; + this.CasingThickness = CasingThickness; + this.CasingDepth = CasingDepth; + this.ShapeAspectStyle = ShapeAspectStyle; + this.LiningToPanelOffsetX = LiningToPanelOffsetX; + this.LiningToPanelOffsetY = LiningToPanelOffsetY; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let LiningDepth = tape[ptr++]; + let LiningThickness = tape[ptr++]; + let ThresholdDepth = tape[ptr++]; + let ThresholdThickness = tape[ptr++]; + let TransomThickness = tape[ptr++]; + let TransomOffset = tape[ptr++]; + let LiningOffset = tape[ptr++]; + let ThresholdOffset = tape[ptr++]; + let CasingThickness = tape[ptr++]; + let CasingDepth = tape[ptr++]; + let ShapeAspectStyle = tape[ptr++]; + let LiningToPanelOffsetX = tape[ptr++]; + let LiningToPanelOffsetY = tape[ptr++]; + return new IfcDoorLiningProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, ThresholdDepth, ThresholdThickness, TransomThickness, TransomOffset, LiningOffset, ThresholdOffset, CasingThickness, CasingDepth, ShapeAspectStyle, LiningToPanelOffsetX, LiningToPanelOffsetY); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.LiningDepth); + ; + args.push(this.LiningThickness); + ; + args.push(this.ThresholdDepth); + ; + args.push(this.ThresholdThickness); + ; + args.push(this.TransomThickness); + ; + args.push(this.TransomOffset); + ; + args.push(this.LiningOffset); + ; + args.push(this.ThresholdOffset); + ; + args.push(this.CasingThickness); + ; + args.push(this.CasingDepth); + ; + args.push(this.ShapeAspectStyle); + ; + args.push(this.LiningToPanelOffsetX); + ; + args.push(this.LiningToPanelOffsetY); + ; + return args; + } +}; +var IfcDoorPanelProperties = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, PanelDepth, PanelOperation, PanelWidth, PanelPosition, ShapeAspectStyle) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.PanelDepth = PanelDepth; + this.PanelOperation = PanelOperation; + this.PanelWidth = PanelWidth; + this.PanelPosition = PanelPosition; + this.ShapeAspectStyle = ShapeAspectStyle; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let PanelDepth = tape[ptr++]; + let PanelOperation = tape[ptr++]; + let PanelWidth = tape[ptr++]; + let PanelPosition = tape[ptr++]; + let ShapeAspectStyle = tape[ptr++]; + return new IfcDoorPanelProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, PanelDepth, PanelOperation, PanelWidth, PanelPosition, ShapeAspectStyle); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.PanelDepth); + ; + args.push(this.PanelOperation); + ; + args.push(this.PanelWidth); + ; + args.push(this.PanelPosition); + ; + args.push(this.ShapeAspectStyle); + ; + return args; + } +}; +var IfcDoorStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.OverallHeight = OverallHeight; + this.OverallWidth = OverallWidth; + this.PredefinedType = PredefinedType; + this.OperationType = OperationType; + this.UserDefinedOperationType = UserDefinedOperationType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let OverallHeight = tape[ptr++]; + let OverallWidth = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let OperationType = tape[ptr++]; + let UserDefinedOperationType = tape[ptr++]; + return new IfcDoorStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.OverallHeight); + ; + args.push(this.OverallWidth); + ; + args.push(this.PredefinedType); + ; + args.push(this.OperationType); + ; + args.push(this.UserDefinedOperationType); + ; + return args; + } +}; +var IfcDoorStyle = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, OperationType, ConstructionType, ParameterTakesPrecedence, Sizeable) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.OperationType = OperationType; + this.ConstructionType = ConstructionType; + this.ParameterTakesPrecedence = ParameterTakesPrecedence; + this.Sizeable = Sizeable; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let OperationType = tape[ptr++]; + let ConstructionType = tape[ptr++]; + let ParameterTakesPrecedence = tape[ptr++]; + let Sizeable = tape[ptr++]; + return new IfcDoorStyle(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, OperationType, ConstructionType, ParameterTakesPrecedence, Sizeable); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.OperationType); + ; + args.push(this.ConstructionType); + ; + args.push(this.ParameterTakesPrecedence); + ; + args.push(this.Sizeable); + ; + return args; + } +}; +var IfcDoorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, OperationType, ParameterTakesPrecedence, UserDefinedOperationType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.OperationType = OperationType; + this.ParameterTakesPrecedence = ParameterTakesPrecedence; + this.UserDefinedOperationType = UserDefinedOperationType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let OperationType = tape[ptr++]; + let ParameterTakesPrecedence = tape[ptr++]; + let UserDefinedOperationType = tape[ptr++]; + return new IfcDoorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, OperationType, ParameterTakesPrecedence, UserDefinedOperationType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.OperationType); + ; + args.push(this.ParameterTakesPrecedence); + ; + args.push(this.UserDefinedOperationType); + ; + return args; + } +}; +var IfcDraughtingPreDefinedColour = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcDraughtingPreDefinedColour(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcDraughtingPreDefinedCurveFont = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcDraughtingPreDefinedCurveFont(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcDuctFitting = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDuctFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDuctFittingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDuctFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDuctSegment = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDuctSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDuctSegmentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDuctSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDuctSilencer = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDuctSilencer(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcDuctSilencerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcDuctSilencerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcEdge = class { + constructor(expressID, type, EdgeStart, EdgeEnd) { + this.expressID = expressID; + this.type = type; + this.EdgeStart = EdgeStart; + this.EdgeEnd = EdgeEnd; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let EdgeStart = tape[ptr++]; + let EdgeEnd = tape[ptr++]; + return new IfcEdge(expressID, type, EdgeStart, EdgeEnd); + } + ToTape() { + let args = []; + args.push(this.EdgeStart); + ; + args.push(this.EdgeEnd); + ; + return args; + } +}; +var IfcEdgeCurve = class { + constructor(expressID, type, EdgeStart, EdgeEnd, EdgeGeometry, SameSense) { + this.expressID = expressID; + this.type = type; + this.EdgeStart = EdgeStart; + this.EdgeEnd = EdgeEnd; + this.EdgeGeometry = EdgeGeometry; + this.SameSense = SameSense; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let EdgeStart = tape[ptr++]; + let EdgeEnd = tape[ptr++]; + let EdgeGeometry = tape[ptr++]; + let SameSense = tape[ptr++]; + return new IfcEdgeCurve(expressID, type, EdgeStart, EdgeEnd, EdgeGeometry, SameSense); + } + ToTape() { + let args = []; + args.push(this.EdgeStart); + ; + args.push(this.EdgeEnd); + ; + args.push(this.EdgeGeometry); + ; + args.push(this.SameSense); + ; + return args; + } +}; +var IfcEdgeLoop = class { + constructor(expressID, type, EdgeList) { + this.expressID = expressID; + this.type = type; + this.EdgeList = EdgeList; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let EdgeList = tape[ptr++]; + return new IfcEdgeLoop(expressID, type, EdgeList); + } + ToTape() { + let args = []; + args.push(this.EdgeList); + ; + return args; + } +}; +var IfcElectricAppliance = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricAppliance(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricApplianceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricApplianceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricDistributionBoard = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricDistributionBoard(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricDistributionBoardType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricDistributionBoardType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricFlowStorageDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricFlowStorageDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricFlowStorageDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricFlowStorageDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricGenerator = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricGenerator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricGeneratorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricGeneratorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricMotor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricMotor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricMotorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricMotorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricTimeControl = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricTimeControl(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElectricTimeControlType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElectricTimeControlType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcElementAssembly = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, AssemblyPlace, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.AssemblyPlace = AssemblyPlace; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let AssemblyPlace = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElementAssembly(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, AssemblyPlace, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.AssemblyPlace); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElementAssemblyType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcElementAssemblyType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcElementComponent = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcElementComponent(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcElementComponentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcElementComponentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcElementQuantity = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, MethodOfMeasurement, Quantities) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.MethodOfMeasurement = MethodOfMeasurement; + this.Quantities = Quantities; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let MethodOfMeasurement = tape[ptr++]; + let Quantities = tape[ptr++]; + return new IfcElementQuantity(expressID, type, GlobalId, OwnerHistory, Name, Description, MethodOfMeasurement, Quantities); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.MethodOfMeasurement); + ; + args.push(this.Quantities); + ; + return args; + } +}; +var IfcElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcElementarySurface = class { + constructor(expressID, type, Position) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + return new IfcElementarySurface(expressID, type, Position); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + return args; + } +}; +var IfcEllipse = class { + constructor(expressID, type, Position, SemiAxis1, SemiAxis2) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.SemiAxis1 = SemiAxis1; + this.SemiAxis2 = SemiAxis2; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let SemiAxis1 = tape[ptr++]; + let SemiAxis2 = tape[ptr++]; + return new IfcEllipse(expressID, type, Position, SemiAxis1, SemiAxis2); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.SemiAxis1); + ; + args.push(this.SemiAxis2); + ; + return args; + } +}; +var IfcEllipseProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, SemiAxis1, SemiAxis2) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.SemiAxis1 = SemiAxis1; + this.SemiAxis2 = SemiAxis2; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let SemiAxis1 = tape[ptr++]; + let SemiAxis2 = tape[ptr++]; + return new IfcEllipseProfileDef(expressID, type, ProfileType, ProfileName, Position, SemiAxis1, SemiAxis2); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.SemiAxis1); + ; + args.push(this.SemiAxis2); + ; + return args; + } +}; +var IfcEnergyConversionDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcEnergyConversionDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcEnergyConversionDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcEnergyConversionDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcEngine = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcEngine(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcEngineType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcEngineType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcEvaporativeCooler = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcEvaporativeCooler(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcEvaporativeCoolerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcEvaporativeCoolerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcEvaporator = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcEvaporator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcEvaporatorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcEvaporatorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcEvent = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType, EventTriggerType, UserDefinedEventTriggerType, EventOccurenceTime) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.PredefinedType = PredefinedType; + this.EventTriggerType = EventTriggerType; + this.UserDefinedEventTriggerType = UserDefinedEventTriggerType; + this.EventOccurenceTime = EventOccurenceTime; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let EventTriggerType = tape[ptr++]; + let UserDefinedEventTriggerType = tape[ptr++]; + let EventOccurenceTime = tape[ptr++]; + return new IfcEvent(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType, EventTriggerType, UserDefinedEventTriggerType, EventOccurenceTime); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.PredefinedType); + ; + args.push(this.EventTriggerType); + ; + args.push(this.UserDefinedEventTriggerType); + ; + args.push(this.EventOccurenceTime); + ; + return args; + } +}; +var IfcEventTime = class { + constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ActualDate, EarlyDate, LateDate, ScheduleDate) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.ActualDate = ActualDate; + this.EarlyDate = EarlyDate; + this.LateDate = LateDate; + this.ScheduleDate = ScheduleDate; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let ActualDate = tape[ptr++]; + let EarlyDate = tape[ptr++]; + let LateDate = tape[ptr++]; + let ScheduleDate = tape[ptr++]; + return new IfcEventTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ActualDate, EarlyDate, LateDate, ScheduleDate); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.ActualDate); + ; + args.push(this.EarlyDate); + ; + args.push(this.LateDate); + ; + args.push(this.ScheduleDate); + ; + return args; + } +}; +var IfcEventType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, EventTriggerType, UserDefinedEventTriggerType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ProcessType = ProcessType; + this.PredefinedType = PredefinedType; + this.EventTriggerType = EventTriggerType; + this.UserDefinedEventTriggerType = UserDefinedEventTriggerType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ProcessType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let EventTriggerType = tape[ptr++]; + let UserDefinedEventTriggerType = tape[ptr++]; + return new IfcEventType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, EventTriggerType, UserDefinedEventTriggerType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ProcessType); + ; + args.push(this.PredefinedType); + ; + args.push(this.EventTriggerType); + ; + args.push(this.UserDefinedEventTriggerType); + ; + return args; + } +}; +var IfcExtendedProperties = class { + constructor(expressID, type, Name, Description, Properties) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Properties = Properties; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Properties = tape[ptr++]; + return new IfcExtendedProperties(expressID, type, Name, Description, Properties); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Properties); + ; + return args; + } +}; +var IfcExternalInformation = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcExternalInformation(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcExternalReference = class { + constructor(expressID, type, Location, Identification, Name) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Identification = Identification; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + return new IfcExternalReference(expressID, type, Location, Identification, Name); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Identification); + ; + args.push(this.Name); + ; + return args; + } +}; +var IfcExternalReferenceRelationship = class { + constructor(expressID, type, Name, Description, RelatingReference, RelatedResourceObjects) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatingReference = RelatingReference; + this.RelatedResourceObjects = RelatedResourceObjects; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingReference = tape[ptr++]; + let RelatedResourceObjects = tape[ptr++]; + return new IfcExternalReferenceRelationship(expressID, type, Name, Description, RelatingReference, RelatedResourceObjects); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingReference); + ; + args.push(this.RelatedResourceObjects); + ; + return args; + } +}; +var IfcExternalSpatialElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcExternalSpatialElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcExternalSpatialStructureElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + return new IfcExternalSpatialStructureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + return args; + } +}; +var IfcExternallyDefinedHatchStyle = class { + constructor(expressID, type, Location, Identification, Name) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Identification = Identification; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + return new IfcExternallyDefinedHatchStyle(expressID, type, Location, Identification, Name); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Identification); + ; + args.push(this.Name); + ; + return args; + } +}; +var IfcExternallyDefinedSurfaceStyle = class { + constructor(expressID, type, Location, Identification, Name) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Identification = Identification; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + return new IfcExternallyDefinedSurfaceStyle(expressID, type, Location, Identification, Name); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Identification); + ; + args.push(this.Name); + ; + return args; + } +}; +var IfcExternallyDefinedTextFont = class { + constructor(expressID, type, Location, Identification, Name) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Identification = Identification; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + return new IfcExternallyDefinedTextFont(expressID, type, Location, Identification, Name); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Identification); + ; + args.push(this.Name); + ; + return args; + } +}; +var IfcExtrudedAreaSolid = class { + constructor(expressID, type, SweptArea, Position, ExtrudedDirection, Depth) { + this.expressID = expressID; + this.type = type; + this.SweptArea = SweptArea; + this.Position = Position; + this.ExtrudedDirection = ExtrudedDirection; + this.Depth = Depth; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptArea = tape[ptr++]; + let Position = tape[ptr++]; + let ExtrudedDirection = tape[ptr++]; + let Depth = tape[ptr++]; + return new IfcExtrudedAreaSolid(expressID, type, SweptArea, Position, ExtrudedDirection, Depth); + } + ToTape() { + let args = []; + args.push(this.SweptArea); + ; + args.push(this.Position); + ; + args.push(this.ExtrudedDirection); + ; + args.push(this.Depth); + ; + return args; + } +}; +var IfcExtrudedAreaSolidTapered = class { + constructor(expressID, type, SweptArea, Position, ExtrudedDirection, Depth, EndSweptArea) { + this.expressID = expressID; + this.type = type; + this.SweptArea = SweptArea; + this.Position = Position; + this.ExtrudedDirection = ExtrudedDirection; + this.Depth = Depth; + this.EndSweptArea = EndSweptArea; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptArea = tape[ptr++]; + let Position = tape[ptr++]; + let ExtrudedDirection = tape[ptr++]; + let Depth = tape[ptr++]; + let EndSweptArea = tape[ptr++]; + return new IfcExtrudedAreaSolidTapered(expressID, type, SweptArea, Position, ExtrudedDirection, Depth, EndSweptArea); + } + ToTape() { + let args = []; + args.push(this.SweptArea); + ; + args.push(this.Position); + ; + args.push(this.ExtrudedDirection); + ; + args.push(this.Depth); + ; + args.push(this.EndSweptArea); + ; + return args; + } +}; +var IfcFace = class { + constructor(expressID, type, Bounds) { + this.expressID = expressID; + this.type = type; + this.Bounds = Bounds; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Bounds = tape[ptr++]; + return new IfcFace(expressID, type, Bounds); + } + ToTape() { + let args = []; + args.push(this.Bounds); + ; + return args; + } +}; +var IfcFaceBasedSurfaceModel = class { + constructor(expressID, type, FbsmFaces) { + this.expressID = expressID; + this.type = type; + this.FbsmFaces = FbsmFaces; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let FbsmFaces = tape[ptr++]; + return new IfcFaceBasedSurfaceModel(expressID, type, FbsmFaces); + } + ToTape() { + let args = []; + args.push(this.FbsmFaces); + ; + return args; + } +}; +var IfcFaceBound = class { + constructor(expressID, type, Bound, Orientation) { + this.expressID = expressID; + this.type = type; + this.Bound = Bound; + this.Orientation = Orientation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Bound = tape[ptr++]; + let Orientation = tape[ptr++]; + return new IfcFaceBound(expressID, type, Bound, Orientation); + } + ToTape() { + let args = []; + args.push(this.Bound); + ; + args.push(this.Orientation); + ; + return args; + } +}; +var IfcFaceOuterBound = class { + constructor(expressID, type, Bound, Orientation) { + this.expressID = expressID; + this.type = type; + this.Bound = Bound; + this.Orientation = Orientation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Bound = tape[ptr++]; + let Orientation = tape[ptr++]; + return new IfcFaceOuterBound(expressID, type, Bound, Orientation); + } + ToTape() { + let args = []; + args.push(this.Bound); + ; + args.push(this.Orientation); + ; + return args; + } +}; +var IfcFaceSurface = class { + constructor(expressID, type, Bounds, FaceSurface, SameSense) { + this.expressID = expressID; + this.type = type; + this.Bounds = Bounds; + this.FaceSurface = FaceSurface; + this.SameSense = SameSense; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Bounds = tape[ptr++]; + let FaceSurface = tape[ptr++]; + let SameSense = tape[ptr++]; + return new IfcFaceSurface(expressID, type, Bounds, FaceSurface, SameSense); + } + ToTape() { + let args = []; + args.push(this.Bounds); + ; + args.push(this.FaceSurface); + ; + args.push(this.SameSense); + ; + return args; + } +}; +var IfcFacetedBrep = class { + constructor(expressID, type, Outer) { + this.expressID = expressID; + this.type = type; + this.Outer = Outer; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Outer = tape[ptr++]; + return new IfcFacetedBrep(expressID, type, Outer); + } + ToTape() { + let args = []; + args.push(this.Outer); + ; + return args; + } +}; +var IfcFacetedBrepWithVoids = class { + constructor(expressID, type, Outer, Voids) { + this.expressID = expressID; + this.type = type; + this.Outer = Outer; + this.Voids = Voids; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Outer = tape[ptr++]; + let Voids = tape[ptr++]; + return new IfcFacetedBrepWithVoids(expressID, type, Outer, Voids); + } + ToTape() { + let args = []; + args.push(this.Outer); + ; + args.push(this.Voids); + ; + return args; + } +}; +var IfcFacility = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + return new IfcFacility(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + return args; + } +}; +var IfcFacilityPart = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + return new IfcFacilityPart(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + return args; + } +}; +var IfcFailureConnectionCondition = class { + constructor(expressID, type, Name, TensionFailureX, TensionFailureY, TensionFailureZ, CompressionFailureX, CompressionFailureY, CompressionFailureZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.TensionFailureX = TensionFailureX; + this.TensionFailureY = TensionFailureY; + this.TensionFailureZ = TensionFailureZ; + this.CompressionFailureX = CompressionFailureX; + this.CompressionFailureY = CompressionFailureY; + this.CompressionFailureZ = CompressionFailureZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let TensionFailureX = tape[ptr++]; + let TensionFailureY = tape[ptr++]; + let TensionFailureZ = tape[ptr++]; + let CompressionFailureX = tape[ptr++]; + let CompressionFailureY = tape[ptr++]; + let CompressionFailureZ = tape[ptr++]; + return new IfcFailureConnectionCondition(expressID, type, Name, TensionFailureX, TensionFailureY, TensionFailureZ, CompressionFailureX, CompressionFailureY, CompressionFailureZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.TensionFailureX); + ; + args.push(this.TensionFailureY); + ; + args.push(this.TensionFailureZ); + ; + args.push(this.CompressionFailureX); + ; + args.push(this.CompressionFailureY); + ; + args.push(this.CompressionFailureZ); + ; + return args; + } +}; +var IfcFan = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFan(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFanType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFanType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFastener = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFastener(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFastenerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFastenerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFeatureElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFeatureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFeatureElementAddition = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFeatureElementAddition(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFeatureElementSubtraction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFeatureElementSubtraction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFillAreaStyle = class { + constructor(expressID, type, Name, FillStyles, ModelorDraughting) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.FillStyles = FillStyles; + this.ModelorDraughting = ModelorDraughting; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let FillStyles = tape[ptr++]; + let ModelorDraughting = tape[ptr++]; + return new IfcFillAreaStyle(expressID, type, Name, FillStyles, ModelorDraughting); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.FillStyles); + ; + args.push(this.ModelorDraughting); + ; + return args; + } +}; +var IfcFillAreaStyleHatching = class { + constructor(expressID, type, HatchLineAppearance, StartOfNextHatchLine, PointOfReferenceHatchLine, PatternStart, HatchLineAngle) { + this.expressID = expressID; + this.type = type; + this.HatchLineAppearance = HatchLineAppearance; + this.StartOfNextHatchLine = StartOfNextHatchLine; + this.PointOfReferenceHatchLine = PointOfReferenceHatchLine; + this.PatternStart = PatternStart; + this.HatchLineAngle = HatchLineAngle; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let HatchLineAppearance = tape[ptr++]; + let StartOfNextHatchLine = tape[ptr++]; + let PointOfReferenceHatchLine = tape[ptr++]; + let PatternStart = tape[ptr++]; + let HatchLineAngle = tape[ptr++]; + return new IfcFillAreaStyleHatching(expressID, type, HatchLineAppearance, StartOfNextHatchLine, PointOfReferenceHatchLine, PatternStart, HatchLineAngle); + } + ToTape() { + let args = []; + args.push(this.HatchLineAppearance); + ; + args.push(this.StartOfNextHatchLine); + ; + args.push(this.PointOfReferenceHatchLine); + ; + args.push(this.PatternStart); + ; + args.push(this.HatchLineAngle); + ; + return args; + } +}; +var IfcFillAreaStyleTiles = class { + constructor(expressID, type, TilingPattern, Tiles, TilingScale) { + this.expressID = expressID; + this.type = type; + this.TilingPattern = TilingPattern; + this.Tiles = Tiles; + this.TilingScale = TilingScale; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TilingPattern = tape[ptr++]; + let Tiles = tape[ptr++]; + let TilingScale = tape[ptr++]; + return new IfcFillAreaStyleTiles(expressID, type, TilingPattern, Tiles, TilingScale); + } + ToTape() { + let args = []; + args.push(this.TilingPattern); + ; + args.push(this.Tiles); + ; + args.push(this.TilingScale); + ; + return args; + } +}; +var IfcFilter = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFilter(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFilterType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFilterType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFireSuppressionTerminal = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFireSuppressionTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFireSuppressionTerminalType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFireSuppressionTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFixedReferenceSweptAreaSolid = class { + constructor(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, FixedReference) { + this.expressID = expressID; + this.type = type; + this.SweptArea = SweptArea; + this.Position = Position; + this.Directrix = Directrix; + this.StartParam = StartParam; + this.EndParam = EndParam; + this.FixedReference = FixedReference; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptArea = tape[ptr++]; + let Position = tape[ptr++]; + let Directrix = tape[ptr++]; + let StartParam = tape[ptr++]; + let EndParam = tape[ptr++]; + let FixedReference = tape[ptr++]; + return new IfcFixedReferenceSweptAreaSolid(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, FixedReference); + } + ToTape() { + let args = []; + args.push(this.SweptArea); + ; + args.push(this.Position); + ; + args.push(this.Directrix); + ; + args.push(this.StartParam); + ; + args.push(this.EndParam); + ; + args.push(this.FixedReference); + ; + return args; + } +}; +var IfcFlowController = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFlowController(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFlowControllerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFlowControllerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFlowFitting = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFlowFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFlowFittingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFlowFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFlowInstrument = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFlowInstrument(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFlowInstrumentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFlowInstrumentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFlowMeter = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFlowMeter(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFlowMeterType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFlowMeterType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFlowMovingDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFlowMovingDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFlowMovingDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFlowMovingDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFlowSegment = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFlowSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFlowSegmentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFlowSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFlowStorageDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFlowStorageDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFlowStorageDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFlowStorageDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFlowTerminal = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFlowTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFlowTerminalType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFlowTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFlowTreatmentDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFlowTreatmentDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFlowTreatmentDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFlowTreatmentDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFooting = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFooting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFootingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFootingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFurnishingElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcFurnishingElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcFurnishingElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcFurnishingElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcFurniture = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFurniture(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcFurnitureType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, AssemblyPlace, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.AssemblyPlace = AssemblyPlace; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let AssemblyPlace = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcFurnitureType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, AssemblyPlace, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.AssemblyPlace); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcGeographicElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcGeographicElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcGeographicElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcGeographicElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcGeometricCurveSet = class { + constructor(expressID, type, Elements) { + this.expressID = expressID; + this.type = type; + this.Elements = Elements; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Elements = tape[ptr++]; + return new IfcGeometricCurveSet(expressID, type, Elements); + } + ToTape() { + let args = []; + args.push(this.Elements); + ; + return args; + } +}; +var IfcGeometricRepresentationContext = class { + constructor(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth) { + this.expressID = expressID; + this.type = type; + this.ContextIdentifier = ContextIdentifier; + this.ContextType = ContextType; + this.CoordinateSpaceDimension = CoordinateSpaceDimension; + this.Precision = Precision; + this.WorldCoordinateSystem = WorldCoordinateSystem; + this.TrueNorth = TrueNorth; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextIdentifier = tape[ptr++]; + let ContextType = tape[ptr++]; + let CoordinateSpaceDimension = tape[ptr++]; + let Precision = tape[ptr++]; + let WorldCoordinateSystem = tape[ptr++]; + let TrueNorth = tape[ptr++]; + return new IfcGeometricRepresentationContext(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth); + } + ToTape() { + let args = []; + args.push(this.ContextIdentifier); + ; + args.push(this.ContextType); + ; + args.push(this.CoordinateSpaceDimension); + ; + args.push(this.Precision); + ; + args.push(this.WorldCoordinateSystem); + ; + args.push(this.TrueNorth); + ; + return args; + } +}; +var IfcGeometricRepresentationItem = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcGeometricRepresentationItem(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcGeometricRepresentationSubContext = class { + constructor(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth, ParentContext, TargetScale, TargetView, UserDefinedTargetView) { + this.expressID = expressID; + this.type = type; + this.ContextIdentifier = ContextIdentifier; + this.ContextType = ContextType; + this.CoordinateSpaceDimension = CoordinateSpaceDimension; + this.Precision = Precision; + this.WorldCoordinateSystem = WorldCoordinateSystem; + this.TrueNorth = TrueNorth; + this.ParentContext = ParentContext; + this.TargetScale = TargetScale; + this.TargetView = TargetView; + this.UserDefinedTargetView = UserDefinedTargetView; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextIdentifier = tape[ptr++]; + let ContextType = tape[ptr++]; + let CoordinateSpaceDimension = tape[ptr++]; + let Precision = tape[ptr++]; + let WorldCoordinateSystem = tape[ptr++]; + let TrueNorth = tape[ptr++]; + let ParentContext = tape[ptr++]; + let TargetScale = tape[ptr++]; + let TargetView = tape[ptr++]; + let UserDefinedTargetView = tape[ptr++]; + return new IfcGeometricRepresentationSubContext(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth, ParentContext, TargetScale, TargetView, UserDefinedTargetView); + } + ToTape() { + let args = []; + args.push(this.ContextIdentifier); + ; + args.push(this.ContextType); + ; + args.push(this.CoordinateSpaceDimension); + ; + args.push(this.Precision); + ; + args.push(this.WorldCoordinateSystem); + ; + args.push(this.TrueNorth); + ; + args.push(this.ParentContext); + ; + args.push(this.TargetScale); + ; + args.push(this.TargetView); + ; + args.push(this.UserDefinedTargetView); + ; + return args; + } +}; +var IfcGeometricSet = class { + constructor(expressID, type, Elements) { + this.expressID = expressID; + this.type = type; + this.Elements = Elements; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Elements = tape[ptr++]; + return new IfcGeometricSet(expressID, type, Elements); + } + ToTape() { + let args = []; + args.push(this.Elements); + ; + return args; + } +}; +var IfcGrid = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, UAxes, VAxes, WAxes, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.UAxes = UAxes; + this.VAxes = VAxes; + this.WAxes = WAxes; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let UAxes = tape[ptr++]; + let VAxes = tape[ptr++]; + let WAxes = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcGrid(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, UAxes, VAxes, WAxes, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.UAxes); + ; + args.push(this.VAxes); + ; + args.push(this.WAxes); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcGridAxis = class { + constructor(expressID, type, AxisTag, AxisCurve, SameSense) { + this.expressID = expressID; + this.type = type; + this.AxisTag = AxisTag; + this.AxisCurve = AxisCurve; + this.SameSense = SameSense; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let AxisTag = tape[ptr++]; + let AxisCurve = tape[ptr++]; + let SameSense = tape[ptr++]; + return new IfcGridAxis(expressID, type, AxisTag, AxisCurve, SameSense); + } + ToTape() { + let args = []; + args.push(this.AxisTag); + ; + args.push(this.AxisCurve); + ; + args.push(this.SameSense); + ; + return args; + } +}; +var IfcGridPlacement = class { + constructor(expressID, type, PlacementRelTo, PlacementLocation, PlacementRefDirection) { + this.expressID = expressID; + this.type = type; + this.PlacementRelTo = PlacementRelTo; + this.PlacementLocation = PlacementLocation; + this.PlacementRefDirection = PlacementRefDirection; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let PlacementRelTo = tape[ptr++]; + let PlacementLocation = tape[ptr++]; + let PlacementRefDirection = tape[ptr++]; + return new IfcGridPlacement(expressID, type, PlacementRelTo, PlacementLocation, PlacementRefDirection); + } + ToTape() { + let args = []; + args.push(this.PlacementRelTo); + ; + args.push(this.PlacementLocation); + ; + args.push(this.PlacementRefDirection); + ; + return args; + } +}; +var IfcGroup = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + return new IfcGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + return args; + } +}; +var IfcHalfSpaceSolid = class { + constructor(expressID, type, BaseSurface, AgreementFlag) { + this.expressID = expressID; + this.type = type; + this.BaseSurface = BaseSurface; + this.AgreementFlag = AgreementFlag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BaseSurface = tape[ptr++]; + let AgreementFlag = tape[ptr++]; + return new IfcHalfSpaceSolid(expressID, type, BaseSurface, AgreementFlag); + } + ToTape() { + let args = []; + args.push(this.BaseSurface); + ; + args.push(this.AgreementFlag); + ; + return args; + } +}; +var IfcHeatExchanger = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcHeatExchanger(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcHeatExchangerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcHeatExchangerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcHumidifier = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcHumidifier(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcHumidifierType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcHumidifierType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcIShapeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, OverallWidth, OverallDepth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, FlangeSlope) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.OverallWidth = OverallWidth; + this.OverallDepth = OverallDepth; + this.WebThickness = WebThickness; + this.FlangeThickness = FlangeThickness; + this.FilletRadius = FilletRadius; + this.FlangeEdgeRadius = FlangeEdgeRadius; + this.FlangeSlope = FlangeSlope; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let OverallWidth = tape[ptr++]; + let OverallDepth = tape[ptr++]; + let WebThickness = tape[ptr++]; + let FlangeThickness = tape[ptr++]; + let FilletRadius = tape[ptr++]; + let FlangeEdgeRadius = tape[ptr++]; + let FlangeSlope = tape[ptr++]; + return new IfcIShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, OverallWidth, OverallDepth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, FlangeSlope); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.OverallWidth); + ; + args.push(this.OverallDepth); + ; + args.push(this.WebThickness); + ; + args.push(this.FlangeThickness); + ; + args.push(this.FilletRadius); + ; + args.push(this.FlangeEdgeRadius); + ; + args.push(this.FlangeSlope); + ; + return args; + } +}; +var IfcImageTexture = class { + constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, URLReference) { + this.expressID = expressID; + this.type = type; + this.RepeatS = RepeatS; + this.RepeatT = RepeatT; + this.Mode = Mode; + this.TextureTransform = TextureTransform; + this.Parameter = Parameter; + this.URLReference = URLReference; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let RepeatS = tape[ptr++]; + let RepeatT = tape[ptr++]; + let Mode = tape[ptr++]; + let TextureTransform = tape[ptr++]; + let Parameter = tape[ptr++]; + let URLReference = tape[ptr++]; + return new IfcImageTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, URLReference); + } + ToTape() { + let args = []; + args.push(this.RepeatS); + ; + args.push(this.RepeatT); + ; + args.push(this.Mode); + ; + args.push(this.TextureTransform); + ; + args.push(this.Parameter); + ; + args.push(this.URLReference); + ; + return args; + } +}; +var IfcIndexedColourMap = class { + constructor(expressID, type, MappedTo, Opacity, Colours, ColourIndex) { + this.expressID = expressID; + this.type = type; + this.MappedTo = MappedTo; + this.Opacity = Opacity; + this.Colours = Colours; + this.ColourIndex = ColourIndex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let MappedTo = tape[ptr++]; + let Opacity = tape[ptr++]; + let Colours = tape[ptr++]; + let ColourIndex = tape[ptr++]; + return new IfcIndexedColourMap(expressID, type, MappedTo, Opacity, Colours, ColourIndex); + } + ToTape() { + let args = []; + args.push(this.MappedTo); + ; + args.push(this.Opacity); + ; + args.push(this.Colours); + ; + args.push(this.ColourIndex); + ; + return args; + } +}; +var IfcIndexedPolyCurve = class { + constructor(expressID, type, Points, Segments, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.Points = Points; + this.Segments = Segments; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Points = tape[ptr++]; + let Segments = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcIndexedPolyCurve(expressID, type, Points, Segments, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.Points); + ; + args.push(this.Segments); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcIndexedPolygonalFace = class { + constructor(expressID, type, CoordIndex) { + this.expressID = expressID; + this.type = type; + this.CoordIndex = CoordIndex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CoordIndex = tape[ptr++]; + return new IfcIndexedPolygonalFace(expressID, type, CoordIndex); + } + ToTape() { + let args = []; + args.push(this.CoordIndex); + ; + return args; + } +}; +var IfcIndexedPolygonalFaceWithVoids = class { + constructor(expressID, type, CoordIndex, InnerCoordIndices) { + this.expressID = expressID; + this.type = type; + this.CoordIndex = CoordIndex; + this.InnerCoordIndices = InnerCoordIndices; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CoordIndex = tape[ptr++]; + let InnerCoordIndices = tape[ptr++]; + return new IfcIndexedPolygonalFaceWithVoids(expressID, type, CoordIndex, InnerCoordIndices); + } + ToTape() { + let args = []; + args.push(this.CoordIndex); + ; + args.push(this.InnerCoordIndices); + ; + return args; + } +}; +var IfcIndexedTextureMap = class { + constructor(expressID, type, Maps, MappedTo, TexCoords) { + this.expressID = expressID; + this.type = type; + this.Maps = Maps; + this.MappedTo = MappedTo; + this.TexCoords = TexCoords; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Maps = tape[ptr++]; + let MappedTo = tape[ptr++]; + let TexCoords = tape[ptr++]; + return new IfcIndexedTextureMap(expressID, type, Maps, MappedTo, TexCoords); + } + ToTape() { + let args = []; + args.push(this.Maps); + ; + args.push(this.MappedTo); + ; + args.push(this.TexCoords); + ; + return args; + } +}; +var IfcIndexedTriangleTextureMap = class { + constructor(expressID, type, Maps, MappedTo, TexCoords, TexCoordIndex) { + this.expressID = expressID; + this.type = type; + this.Maps = Maps; + this.MappedTo = MappedTo; + this.TexCoords = TexCoords; + this.TexCoordIndex = TexCoordIndex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Maps = tape[ptr++]; + let MappedTo = tape[ptr++]; + let TexCoords = tape[ptr++]; + let TexCoordIndex = tape[ptr++]; + return new IfcIndexedTriangleTextureMap(expressID, type, Maps, MappedTo, TexCoords, TexCoordIndex); + } + ToTape() { + let args = []; + args.push(this.Maps); + ; + args.push(this.MappedTo); + ; + args.push(this.TexCoords); + ; + args.push(this.TexCoordIndex); + ; + return args; + } +}; +var IfcInterceptor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcInterceptor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcInterceptorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcInterceptorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcIntersectionCurve = class { + constructor(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation) { + this.expressID = expressID; + this.type = type; + this.Curve3D = Curve3D; + this.AssociatedGeometry = AssociatedGeometry; + this.MasterRepresentation = MasterRepresentation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Curve3D = tape[ptr++]; + let AssociatedGeometry = tape[ptr++]; + let MasterRepresentation = tape[ptr++]; + return new IfcIntersectionCurve(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation); + } + ToTape() { + let args = []; + args.push(this.Curve3D); + ; + args.push(this.AssociatedGeometry); + ; + args.push(this.MasterRepresentation); + ; + return args; + } +}; +var IfcInventory = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, Jurisdiction, ResponsiblePersons, LastUpdateDate, CurrentValue, OriginalValue) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.PredefinedType = PredefinedType; + this.Jurisdiction = Jurisdiction; + this.ResponsiblePersons = ResponsiblePersons; + this.LastUpdateDate = LastUpdateDate; + this.CurrentValue = CurrentValue; + this.OriginalValue = OriginalValue; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Jurisdiction = tape[ptr++]; + let ResponsiblePersons = tape[ptr++]; + let LastUpdateDate = tape[ptr++]; + let CurrentValue = tape[ptr++]; + let OriginalValue = tape[ptr++]; + return new IfcInventory(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, Jurisdiction, ResponsiblePersons, LastUpdateDate, CurrentValue, OriginalValue); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.PredefinedType); + ; + args.push(this.Jurisdiction); + ; + args.push(this.ResponsiblePersons); + ; + args.push(this.LastUpdateDate); + ; + args.push(this.CurrentValue); + ; + args.push(this.OriginalValue); + ; + return args; + } +}; +var IfcIrregularTimeSeries = class { + constructor(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, Values) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.StartTime = StartTime; + this.EndTime = EndTime; + this.TimeSeriesDataType = TimeSeriesDataType; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.Unit = Unit; + this.Values = Values; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let StartTime = tape[ptr++]; + let EndTime = tape[ptr++]; + let TimeSeriesDataType = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let Unit = tape[ptr++]; + let Values = tape[ptr++]; + return new IfcIrregularTimeSeries(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, Values); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.StartTime); + ; + args.push(this.EndTime); + ; + args.push(this.TimeSeriesDataType); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.Unit); + ; + args.push(this.Values); + ; + return args; + } +}; +var IfcIrregularTimeSeriesValue = class { + constructor(expressID, type, TimeStamp, ListValues) { + this.expressID = expressID; + this.type = type; + this.TimeStamp = TimeStamp; + this.ListValues = ListValues; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TimeStamp = tape[ptr++]; + let ListValues = tape[ptr++]; + return new IfcIrregularTimeSeriesValue(expressID, type, TimeStamp, ListValues); + } + ToTape() { + let args = []; + args.push(this.TimeStamp); + ; + args.push(this.ListValues); + ; + return args; + } +}; +var IfcJunctionBox = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcJunctionBox(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcJunctionBoxType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcJunctionBoxType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcLShapeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, Depth, Width, Thickness, FilletRadius, EdgeRadius, LegSlope) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.Depth = Depth; + this.Width = Width; + this.Thickness = Thickness; + this.FilletRadius = FilletRadius; + this.EdgeRadius = EdgeRadius; + this.LegSlope = LegSlope; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let Depth = tape[ptr++]; + let Width = tape[ptr++]; + let Thickness = tape[ptr++]; + let FilletRadius = tape[ptr++]; + let EdgeRadius = tape[ptr++]; + let LegSlope = tape[ptr++]; + return new IfcLShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, Width, Thickness, FilletRadius, EdgeRadius, LegSlope); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.Depth); + ; + args.push(this.Width); + ; + args.push(this.Thickness); + ; + args.push(this.FilletRadius); + ; + args.push(this.EdgeRadius); + ; + args.push(this.LegSlope); + ; + return args; + } +}; +var IfcLaborResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Usage = Usage; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Usage = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcLaborResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Usage); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcLaborResourceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcLaborResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcLagTime = class { + constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, LagValue, DurationType) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.LagValue = LagValue; + this.DurationType = DurationType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let LagValue = tape[ptr++]; + let DurationType = tape[ptr++]; + return new IfcLagTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, LagValue, DurationType); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.LagValue); + ; + args.push(this.DurationType); + ; + return args; + } +}; +var IfcLamp = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcLamp(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcLampType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcLampType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcLibraryInformation = class { + constructor(expressID, type, Name, Version, Publisher, VersionDate, Location, Description) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Version = Version; + this.Publisher = Publisher; + this.VersionDate = VersionDate; + this.Location = Location; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Version = tape[ptr++]; + let Publisher = tape[ptr++]; + let VersionDate = tape[ptr++]; + let Location = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcLibraryInformation(expressID, type, Name, Version, Publisher, VersionDate, Location, Description); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Version); + ; + args.push(this.Publisher); + ; + args.push(this.VersionDate); + ; + args.push(this.Location); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcLibraryReference = class { + constructor(expressID, type, Location, Identification, Name, Description, Language, ReferencedLibrary) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + this.Identification = Identification; + this.Name = Name; + this.Description = Description; + this.Language = Language; + this.ReferencedLibrary = ReferencedLibrary; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Language = tape[ptr++]; + let ReferencedLibrary = tape[ptr++]; + return new IfcLibraryReference(expressID, type, Location, Identification, Name, Description, Language, ReferencedLibrary); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + args.push(this.Identification); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Language); + ; + args.push(this.ReferencedLibrary); + ; + return args; + } +}; +var IfcLightDistributionData = class { + constructor(expressID, type, MainPlaneAngle, SecondaryPlaneAngle, LuminousIntensity) { + this.expressID = expressID; + this.type = type; + this.MainPlaneAngle = MainPlaneAngle; + this.SecondaryPlaneAngle = SecondaryPlaneAngle; + this.LuminousIntensity = LuminousIntensity; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let MainPlaneAngle = tape[ptr++]; + let SecondaryPlaneAngle = tape[ptr++]; + let LuminousIntensity = tape[ptr++]; + return new IfcLightDistributionData(expressID, type, MainPlaneAngle, SecondaryPlaneAngle, LuminousIntensity); + } + ToTape() { + let args = []; + args.push(this.MainPlaneAngle); + ; + args.push(this.SecondaryPlaneAngle); + ; + args.push(this.LuminousIntensity); + ; + return args; + } +}; +var IfcLightFixture = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcLightFixture(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcLightFixtureType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcLightFixtureType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcLightIntensityDistribution = class { + constructor(expressID, type, LightDistributionCurve, DistributionData) { + this.expressID = expressID; + this.type = type; + this.LightDistributionCurve = LightDistributionCurve; + this.DistributionData = DistributionData; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let LightDistributionCurve = tape[ptr++]; + let DistributionData = tape[ptr++]; + return new IfcLightIntensityDistribution(expressID, type, LightDistributionCurve, DistributionData); + } + ToTape() { + let args = []; + args.push(this.LightDistributionCurve); + ; + args.push(this.DistributionData); + ; + return args; + } +}; +var IfcLightSource = class { + constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.LightColour = LightColour; + this.AmbientIntensity = AmbientIntensity; + this.Intensity = Intensity; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let LightColour = tape[ptr++]; + let AmbientIntensity = tape[ptr++]; + let Intensity = tape[ptr++]; + return new IfcLightSource(expressID, type, Name, LightColour, AmbientIntensity, Intensity); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.LightColour); + ; + args.push(this.AmbientIntensity); + ; + args.push(this.Intensity); + ; + return args; + } +}; +var IfcLightSourceAmbient = class { + constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.LightColour = LightColour; + this.AmbientIntensity = AmbientIntensity; + this.Intensity = Intensity; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let LightColour = tape[ptr++]; + let AmbientIntensity = tape[ptr++]; + let Intensity = tape[ptr++]; + return new IfcLightSourceAmbient(expressID, type, Name, LightColour, AmbientIntensity, Intensity); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.LightColour); + ; + args.push(this.AmbientIntensity); + ; + args.push(this.Intensity); + ; + return args; + } +}; +var IfcLightSourceDirectional = class { + constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Orientation) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.LightColour = LightColour; + this.AmbientIntensity = AmbientIntensity; + this.Intensity = Intensity; + this.Orientation = Orientation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let LightColour = tape[ptr++]; + let AmbientIntensity = tape[ptr++]; + let Intensity = tape[ptr++]; + let Orientation = tape[ptr++]; + return new IfcLightSourceDirectional(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Orientation); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.LightColour); + ; + args.push(this.AmbientIntensity); + ; + args.push(this.Intensity); + ; + args.push(this.Orientation); + ; + return args; + } +}; +var IfcLightSourceGoniometric = class { + constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, ColourAppearance, ColourTemperature, LuminousFlux, LightEmissionSource, LightDistributionDataSource) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.LightColour = LightColour; + this.AmbientIntensity = AmbientIntensity; + this.Intensity = Intensity; + this.Position = Position; + this.ColourAppearance = ColourAppearance; + this.ColourTemperature = ColourTemperature; + this.LuminousFlux = LuminousFlux; + this.LightEmissionSource = LightEmissionSource; + this.LightDistributionDataSource = LightDistributionDataSource; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let LightColour = tape[ptr++]; + let AmbientIntensity = tape[ptr++]; + let Intensity = tape[ptr++]; + let Position = tape[ptr++]; + let ColourAppearance = tape[ptr++]; + let ColourTemperature = tape[ptr++]; + let LuminousFlux = tape[ptr++]; + let LightEmissionSource = tape[ptr++]; + let LightDistributionDataSource = tape[ptr++]; + return new IfcLightSourceGoniometric(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, ColourAppearance, ColourTemperature, LuminousFlux, LightEmissionSource, LightDistributionDataSource); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.LightColour); + ; + args.push(this.AmbientIntensity); + ; + args.push(this.Intensity); + ; + args.push(this.Position); + ; + args.push(this.ColourAppearance); + ; + args.push(this.ColourTemperature); + ; + args.push(this.LuminousFlux); + ; + args.push(this.LightEmissionSource); + ; + args.push(this.LightDistributionDataSource); + ; + return args; + } +}; +var IfcLightSourcePositional = class { + constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.LightColour = LightColour; + this.AmbientIntensity = AmbientIntensity; + this.Intensity = Intensity; + this.Position = Position; + this.Radius = Radius; + this.ConstantAttenuation = ConstantAttenuation; + this.DistanceAttenuation = DistanceAttenuation; + this.QuadricAttenuation = QuadricAttenuation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let LightColour = tape[ptr++]; + let AmbientIntensity = tape[ptr++]; + let Intensity = tape[ptr++]; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + let ConstantAttenuation = tape[ptr++]; + let DistanceAttenuation = tape[ptr++]; + let QuadricAttenuation = tape[ptr++]; + return new IfcLightSourcePositional(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.LightColour); + ; + args.push(this.AmbientIntensity); + ; + args.push(this.Intensity); + ; + args.push(this.Position); + ; + args.push(this.Radius); + ; + args.push(this.ConstantAttenuation); + ; + args.push(this.DistanceAttenuation); + ; + args.push(this.QuadricAttenuation); + ; + return args; + } +}; +var IfcLightSourceSpot = class { + constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation, Orientation, ConcentrationExponent, SpreadAngle, BeamWidthAngle) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.LightColour = LightColour; + this.AmbientIntensity = AmbientIntensity; + this.Intensity = Intensity; + this.Position = Position; + this.Radius = Radius; + this.ConstantAttenuation = ConstantAttenuation; + this.DistanceAttenuation = DistanceAttenuation; + this.QuadricAttenuation = QuadricAttenuation; + this.Orientation = Orientation; + this.ConcentrationExponent = ConcentrationExponent; + this.SpreadAngle = SpreadAngle; + this.BeamWidthAngle = BeamWidthAngle; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let LightColour = tape[ptr++]; + let AmbientIntensity = tape[ptr++]; + let Intensity = tape[ptr++]; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + let ConstantAttenuation = tape[ptr++]; + let DistanceAttenuation = tape[ptr++]; + let QuadricAttenuation = tape[ptr++]; + let Orientation = tape[ptr++]; + let ConcentrationExponent = tape[ptr++]; + let SpreadAngle = tape[ptr++]; + let BeamWidthAngle = tape[ptr++]; + return new IfcLightSourceSpot(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation, Orientation, ConcentrationExponent, SpreadAngle, BeamWidthAngle); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.LightColour); + ; + args.push(this.AmbientIntensity); + ; + args.push(this.Intensity); + ; + args.push(this.Position); + ; + args.push(this.Radius); + ; + args.push(this.ConstantAttenuation); + ; + args.push(this.DistanceAttenuation); + ; + args.push(this.QuadricAttenuation); + ; + args.push(this.Orientation); + ; + args.push(this.ConcentrationExponent); + ; + args.push(this.SpreadAngle); + ; + args.push(this.BeamWidthAngle); + ; + return args; + } +}; +var IfcLine = class { + constructor(expressID, type, Pnt, Dir) { + this.expressID = expressID; + this.type = type; + this.Pnt = Pnt; + this.Dir = Dir; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Pnt = tape[ptr++]; + let Dir = tape[ptr++]; + return new IfcLine(expressID, type, Pnt, Dir); + } + ToTape() { + let args = []; + args.push(this.Pnt); + ; + args.push(this.Dir); + ; + return args; + } +}; +var IfcLineSegment2D = class { + constructor(expressID, type, StartPoint, StartDirection, SegmentLength) { + this.expressID = expressID; + this.type = type; + this.StartPoint = StartPoint; + this.StartDirection = StartDirection; + this.SegmentLength = SegmentLength; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let StartPoint = tape[ptr++]; + let StartDirection = tape[ptr++]; + let SegmentLength = tape[ptr++]; + return new IfcLineSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength); + } + ToTape() { + let args = []; + args.push(this.StartPoint); + ; + args.push(this.StartDirection); + ; + args.push(this.SegmentLength); + ; + return args; + } +}; +var IfcLinearPlacement = class { + constructor(expressID, type, PlacementRelTo, PlacementMeasuredAlong, Distance, Orientation, CartesianPosition) { + this.expressID = expressID; + this.type = type; + this.PlacementRelTo = PlacementRelTo; + this.PlacementMeasuredAlong = PlacementMeasuredAlong; + this.Distance = Distance; + this.Orientation = Orientation; + this.CartesianPosition = CartesianPosition; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let PlacementRelTo = tape[ptr++]; + let PlacementMeasuredAlong = tape[ptr++]; + let Distance = tape[ptr++]; + let Orientation = tape[ptr++]; + let CartesianPosition = tape[ptr++]; + return new IfcLinearPlacement(expressID, type, PlacementRelTo, PlacementMeasuredAlong, Distance, Orientation, CartesianPosition); + } + ToTape() { + let args = []; + args.push(this.PlacementRelTo); + ; + args.push(this.PlacementMeasuredAlong); + ; + args.push(this.Distance); + ; + args.push(this.Orientation); + ; + args.push(this.CartesianPosition); + ; + return args; + } +}; +var IfcLinearPositioningElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Axis = Axis; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Axis = tape[ptr++]; + return new IfcLinearPositioningElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Axis); + ; + return args; + } +}; +var IfcLocalPlacement = class { + constructor(expressID, type, PlacementRelTo, RelativePlacement) { + this.expressID = expressID; + this.type = type; + this.PlacementRelTo = PlacementRelTo; + this.RelativePlacement = RelativePlacement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let PlacementRelTo = tape[ptr++]; + let RelativePlacement = tape[ptr++]; + return new IfcLocalPlacement(expressID, type, PlacementRelTo, RelativePlacement); + } + ToTape() { + let args = []; + args.push(this.PlacementRelTo); + ; + args.push(this.RelativePlacement); + ; + return args; + } +}; +var IfcLoop = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcLoop(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcManifoldSolidBrep = class { + constructor(expressID, type, Outer) { + this.expressID = expressID; + this.type = type; + this.Outer = Outer; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Outer = tape[ptr++]; + return new IfcManifoldSolidBrep(expressID, type, Outer); + } + ToTape() { + let args = []; + args.push(this.Outer); + ; + return args; + } +}; +var IfcMapConversion = class { + constructor(expressID, type, SourceCRS, TargetCRS, Eastings, Northings, OrthogonalHeight, XAxisAbscissa, XAxisOrdinate, Scale) { + this.expressID = expressID; + this.type = type; + this.SourceCRS = SourceCRS; + this.TargetCRS = TargetCRS; + this.Eastings = Eastings; + this.Northings = Northings; + this.OrthogonalHeight = OrthogonalHeight; + this.XAxisAbscissa = XAxisAbscissa; + this.XAxisOrdinate = XAxisOrdinate; + this.Scale = Scale; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SourceCRS = tape[ptr++]; + let TargetCRS = tape[ptr++]; + let Eastings = tape[ptr++]; + let Northings = tape[ptr++]; + let OrthogonalHeight = tape[ptr++]; + let XAxisAbscissa = tape[ptr++]; + let XAxisOrdinate = tape[ptr++]; + let Scale = tape[ptr++]; + return new IfcMapConversion(expressID, type, SourceCRS, TargetCRS, Eastings, Northings, OrthogonalHeight, XAxisAbscissa, XAxisOrdinate, Scale); + } + ToTape() { + let args = []; + args.push(this.SourceCRS); + ; + args.push(this.TargetCRS); + ; + args.push(this.Eastings); + ; + args.push(this.Northings); + ; + args.push(this.OrthogonalHeight); + ; + args.push(this.XAxisAbscissa); + ; + args.push(this.XAxisOrdinate); + ; + args.push(this.Scale); + ; + return args; + } +}; +var IfcMappedItem = class { + constructor(expressID, type, MappingSource, MappingTarget) { + this.expressID = expressID; + this.type = type; + this.MappingSource = MappingSource; + this.MappingTarget = MappingTarget; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let MappingSource = tape[ptr++]; + let MappingTarget = tape[ptr++]; + return new IfcMappedItem(expressID, type, MappingSource, MappingTarget); + } + ToTape() { + let args = []; + args.push(this.MappingSource); + ; + args.push(this.MappingTarget); + ; + return args; + } +}; +var IfcMaterial = class { + constructor(expressID, type, Name, Description, Category) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Category = Category; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Category = tape[ptr++]; + return new IfcMaterial(expressID, type, Name, Description, Category); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Category); + ; + return args; + } +}; +var IfcMaterialClassificationRelationship = class { + constructor(expressID, type, MaterialClassifications, ClassifiedMaterial) { + this.expressID = expressID; + this.type = type; + this.MaterialClassifications = MaterialClassifications; + this.ClassifiedMaterial = ClassifiedMaterial; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let MaterialClassifications = tape[ptr++]; + let ClassifiedMaterial = tape[ptr++]; + return new IfcMaterialClassificationRelationship(expressID, type, MaterialClassifications, ClassifiedMaterial); + } + ToTape() { + let args = []; + args.push(this.MaterialClassifications); + ; + args.push(this.ClassifiedMaterial); + ; + return args; + } +}; +var IfcMaterialConstituent = class { + constructor(expressID, type, Name, Description, Material, Fraction, Category) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Material = Material; + this.Fraction = Fraction; + this.Category = Category; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Material = tape[ptr++]; + let Fraction = tape[ptr++]; + let Category = tape[ptr++]; + return new IfcMaterialConstituent(expressID, type, Name, Description, Material, Fraction, Category); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Material); + ; + args.push(this.Fraction); + ; + args.push(this.Category); + ; + return args; + } +}; +var IfcMaterialConstituentSet = class { + constructor(expressID, type, Name, Description, MaterialConstituents) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.MaterialConstituents = MaterialConstituents; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let MaterialConstituents = tape[ptr++]; + return new IfcMaterialConstituentSet(expressID, type, Name, Description, MaterialConstituents); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.MaterialConstituents); + ; + return args; + } +}; +var IfcMaterialDefinition = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcMaterialDefinition(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcMaterialDefinitionRepresentation = class { + constructor(expressID, type, Name, Description, Representations, RepresentedMaterial) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Representations = Representations; + this.RepresentedMaterial = RepresentedMaterial; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Representations = tape[ptr++]; + let RepresentedMaterial = tape[ptr++]; + return new IfcMaterialDefinitionRepresentation(expressID, type, Name, Description, Representations, RepresentedMaterial); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Representations); + ; + args.push(this.RepresentedMaterial); + ; + return args; + } +}; +var IfcMaterialLayer = class { + constructor(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority) { + this.expressID = expressID; + this.type = type; + this.Material = Material; + this.LayerThickness = LayerThickness; + this.IsVentilated = IsVentilated; + this.Name = Name; + this.Description = Description; + this.Category = Category; + this.Priority = Priority; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Material = tape[ptr++]; + let LayerThickness = tape[ptr++]; + let IsVentilated = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Category = tape[ptr++]; + let Priority = tape[ptr++]; + return new IfcMaterialLayer(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority); + } + ToTape() { + let args = []; + args.push(this.Material); + ; + args.push(this.LayerThickness); + ; + args.push(this.IsVentilated); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Category); + ; + args.push(this.Priority); + ; + return args; + } +}; +var IfcMaterialLayerSet = class { + constructor(expressID, type, MaterialLayers, LayerSetName, Description) { + this.expressID = expressID; + this.type = type; + this.MaterialLayers = MaterialLayers; + this.LayerSetName = LayerSetName; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let MaterialLayers = tape[ptr++]; + let LayerSetName = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcMaterialLayerSet(expressID, type, MaterialLayers, LayerSetName, Description); + } + ToTape() { + let args = []; + args.push(this.MaterialLayers); + ; + args.push(this.LayerSetName); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcMaterialLayerSetUsage = class { + constructor(expressID, type, ForLayerSet, LayerSetDirection, DirectionSense, OffsetFromReferenceLine, ReferenceExtent) { + this.expressID = expressID; + this.type = type; + this.ForLayerSet = ForLayerSet; + this.LayerSetDirection = LayerSetDirection; + this.DirectionSense = DirectionSense; + this.OffsetFromReferenceLine = OffsetFromReferenceLine; + this.ReferenceExtent = ReferenceExtent; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ForLayerSet = tape[ptr++]; + let LayerSetDirection = tape[ptr++]; + let DirectionSense = tape[ptr++]; + let OffsetFromReferenceLine = tape[ptr++]; + let ReferenceExtent = tape[ptr++]; + return new IfcMaterialLayerSetUsage(expressID, type, ForLayerSet, LayerSetDirection, DirectionSense, OffsetFromReferenceLine, ReferenceExtent); + } + ToTape() { + let args = []; + args.push(this.ForLayerSet); + ; + args.push(this.LayerSetDirection); + ; + args.push(this.DirectionSense); + ; + args.push(this.OffsetFromReferenceLine); + ; + args.push(this.ReferenceExtent); + ; + return args; + } +}; +var IfcMaterialLayerWithOffsets = class { + constructor(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority, OffsetDirection, OffsetValues) { + this.expressID = expressID; + this.type = type; + this.Material = Material; + this.LayerThickness = LayerThickness; + this.IsVentilated = IsVentilated; + this.Name = Name; + this.Description = Description; + this.Category = Category; + this.Priority = Priority; + this.OffsetDirection = OffsetDirection; + this.OffsetValues = OffsetValues; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Material = tape[ptr++]; + let LayerThickness = tape[ptr++]; + let IsVentilated = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Category = tape[ptr++]; + let Priority = tape[ptr++]; + let OffsetDirection = tape[ptr++]; + let OffsetValues = tape[ptr++]; + return new IfcMaterialLayerWithOffsets(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority, OffsetDirection, OffsetValues); + } + ToTape() { + let args = []; + args.push(this.Material); + ; + args.push(this.LayerThickness); + ; + args.push(this.IsVentilated); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Category); + ; + args.push(this.Priority); + ; + args.push(this.OffsetDirection); + ; + args.push(this.OffsetValues); + ; + return args; + } +}; +var IfcMaterialList = class { + constructor(expressID, type, Materials) { + this.expressID = expressID; + this.type = type; + this.Materials = Materials; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Materials = tape[ptr++]; + return new IfcMaterialList(expressID, type, Materials); + } + ToTape() { + let args = []; + args.push(this.Materials); + ; + return args; + } +}; +var IfcMaterialProfile = class { + constructor(expressID, type, Name, Description, Material, Profile, Priority, Category) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Material = Material; + this.Profile = Profile; + this.Priority = Priority; + this.Category = Category; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Material = tape[ptr++]; + let Profile = tape[ptr++]; + let Priority = tape[ptr++]; + let Category = tape[ptr++]; + return new IfcMaterialProfile(expressID, type, Name, Description, Material, Profile, Priority, Category); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Material); + ; + args.push(this.Profile); + ; + args.push(this.Priority); + ; + args.push(this.Category); + ; + return args; + } +}; +var IfcMaterialProfileSet = class { + constructor(expressID, type, Name, Description, MaterialProfiles, CompositeProfile) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.MaterialProfiles = MaterialProfiles; + this.CompositeProfile = CompositeProfile; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let MaterialProfiles = tape[ptr++]; + let CompositeProfile = tape[ptr++]; + return new IfcMaterialProfileSet(expressID, type, Name, Description, MaterialProfiles, CompositeProfile); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.MaterialProfiles); + ; + args.push(this.CompositeProfile); + ; + return args; + } +}; +var IfcMaterialProfileSetUsage = class { + constructor(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent) { + this.expressID = expressID; + this.type = type; + this.ForProfileSet = ForProfileSet; + this.CardinalPoint = CardinalPoint; + this.ReferenceExtent = ReferenceExtent; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ForProfileSet = tape[ptr++]; + let CardinalPoint = tape[ptr++]; + let ReferenceExtent = tape[ptr++]; + return new IfcMaterialProfileSetUsage(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent); + } + ToTape() { + let args = []; + args.push(this.ForProfileSet); + ; + args.push(this.CardinalPoint); + ; + args.push(this.ReferenceExtent); + ; + return args; + } +}; +var IfcMaterialProfileSetUsageTapering = class { + constructor(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent, ForProfileEndSet, CardinalEndPoint) { + this.expressID = expressID; + this.type = type; + this.ForProfileSet = ForProfileSet; + this.CardinalPoint = CardinalPoint; + this.ReferenceExtent = ReferenceExtent; + this.ForProfileEndSet = ForProfileEndSet; + this.CardinalEndPoint = CardinalEndPoint; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ForProfileSet = tape[ptr++]; + let CardinalPoint = tape[ptr++]; + let ReferenceExtent = tape[ptr++]; + let ForProfileEndSet = tape[ptr++]; + let CardinalEndPoint = tape[ptr++]; + return new IfcMaterialProfileSetUsageTapering(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent, ForProfileEndSet, CardinalEndPoint); + } + ToTape() { + let args = []; + args.push(this.ForProfileSet); + ; + args.push(this.CardinalPoint); + ; + args.push(this.ReferenceExtent); + ; + args.push(this.ForProfileEndSet); + ; + args.push(this.CardinalEndPoint); + ; + return args; + } +}; +var IfcMaterialProfileWithOffsets = class { + constructor(expressID, type, Name, Description, Material, Profile, Priority, Category, OffsetValues) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Material = Material; + this.Profile = Profile; + this.Priority = Priority; + this.Category = Category; + this.OffsetValues = OffsetValues; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Material = tape[ptr++]; + let Profile = tape[ptr++]; + let Priority = tape[ptr++]; + let Category = tape[ptr++]; + let OffsetValues = tape[ptr++]; + return new IfcMaterialProfileWithOffsets(expressID, type, Name, Description, Material, Profile, Priority, Category, OffsetValues); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Material); + ; + args.push(this.Profile); + ; + args.push(this.Priority); + ; + args.push(this.Category); + ; + args.push(this.OffsetValues); + ; + return args; + } +}; +var IfcMaterialProperties = class { + constructor(expressID, type, Name, Description, Properties, Material) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Properties = Properties; + this.Material = Material; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Properties = tape[ptr++]; + let Material = tape[ptr++]; + return new IfcMaterialProperties(expressID, type, Name, Description, Properties, Material); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Properties); + ; + args.push(this.Material); + ; + return args; + } +}; +var IfcMaterialRelationship = class { + constructor(expressID, type, Name, Description, RelatingMaterial, RelatedMaterials, Expression) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatingMaterial = RelatingMaterial; + this.RelatedMaterials = RelatedMaterials; + this.Expression = Expression; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingMaterial = tape[ptr++]; + let RelatedMaterials = tape[ptr++]; + let Expression = tape[ptr++]; + return new IfcMaterialRelationship(expressID, type, Name, Description, RelatingMaterial, RelatedMaterials, Expression); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingMaterial); + ; + args.push(this.RelatedMaterials); + ; + args.push(this.Expression); + ; + return args; + } +}; +var IfcMaterialUsageDefinition = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcMaterialUsageDefinition(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcMeasureWithUnit = class { + constructor(expressID, type, ValueComponent, UnitComponent) { + this.expressID = expressID; + this.type = type; + this.ValueComponent = ValueComponent; + this.UnitComponent = UnitComponent; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ValueComponent = tape[ptr++]; + let UnitComponent = tape[ptr++]; + return new IfcMeasureWithUnit(expressID, type, ValueComponent, UnitComponent); + } + ToTape() { + let args = []; + args.push(this.ValueComponent); + ; + args.push(this.UnitComponent); + ; + return args; + } +}; +var IfcMechanicalFastener = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NominalDiameter, NominalLength, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.NominalDiameter = NominalDiameter; + this.NominalLength = NominalLength; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let NominalDiameter = tape[ptr++]; + let NominalLength = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMechanicalFastener(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NominalDiameter, NominalLength, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.NominalDiameter); + ; + args.push(this.NominalLength); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcMechanicalFastenerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, NominalLength) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.NominalDiameter = NominalDiameter; + this.NominalLength = NominalLength; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let NominalDiameter = tape[ptr++]; + let NominalLength = tape[ptr++]; + return new IfcMechanicalFastenerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, NominalLength); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.NominalDiameter); + ; + args.push(this.NominalLength); + ; + return args; + } +}; +var IfcMedicalDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMedicalDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcMedicalDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMedicalDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcMember = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcMemberStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMemberStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcMemberType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMemberType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcMetric = class { + constructor(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, Benchmark, ValueSource, DataValue, ReferencePath) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.ConstraintGrade = ConstraintGrade; + this.ConstraintSource = ConstraintSource; + this.CreatingActor = CreatingActor; + this.CreationTime = CreationTime; + this.UserDefinedGrade = UserDefinedGrade; + this.Benchmark = Benchmark; + this.ValueSource = ValueSource; + this.DataValue = DataValue; + this.ReferencePath = ReferencePath; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ConstraintGrade = tape[ptr++]; + let ConstraintSource = tape[ptr++]; + let CreatingActor = tape[ptr++]; + let CreationTime = tape[ptr++]; + let UserDefinedGrade = tape[ptr++]; + let Benchmark = tape[ptr++]; + let ValueSource = tape[ptr++]; + let DataValue = tape[ptr++]; + let ReferencePath = tape[ptr++]; + return new IfcMetric(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, Benchmark, ValueSource, DataValue, ReferencePath); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ConstraintGrade); + ; + args.push(this.ConstraintSource); + ; + args.push(this.CreatingActor); + ; + args.push(this.CreationTime); + ; + args.push(this.UserDefinedGrade); + ; + args.push(this.Benchmark); + ; + args.push(this.ValueSource); + ; + args.push(this.DataValue); + ; + args.push(this.ReferencePath); + ; + return args; + } +}; +var IfcMirroredProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.ParentProfile = ParentProfile; + this.Operator = Operator; + this.Label = Label; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let ParentProfile = tape[ptr++]; + let Operator = tape[ptr++]; + let Label = tape[ptr++]; + return new IfcMirroredProfileDef(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.ParentProfile); + ; + args.push(this.Operator); + ; + args.push(this.Label); + ; + return args; + } +}; +var IfcMonetaryUnit = class { + constructor(expressID, type, Currency) { + this.expressID = expressID; + this.type = type; + this.Currency = Currency; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Currency = tape[ptr++]; + return new IfcMonetaryUnit(expressID, type, Currency); + } + ToTape() { + let args = []; + args.push(this.Currency); + ; + return args; + } +}; +var IfcMotorConnection = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMotorConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcMotorConnectionType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcMotorConnectionType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcNamedUnit = class { + constructor(expressID, type, Dimensions, UnitType) { + this.expressID = expressID; + this.type = type; + this.Dimensions = Dimensions; + this.UnitType = UnitType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Dimensions = tape[ptr++]; + let UnitType = tape[ptr++]; + return new IfcNamedUnit(expressID, type, Dimensions, UnitType); + } + ToTape() { + let args = []; + args.push(this.Dimensions); + ; + args.push(this.UnitType); + ; + return args; + } +}; +var IfcObject = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + return new IfcObject(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + return args; + } +}; +var IfcObjectDefinition = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcObjectDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcObjectPlacement = class { + constructor(expressID, type, PlacementRelTo) { + this.expressID = expressID; + this.type = type; + this.PlacementRelTo = PlacementRelTo; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let PlacementRelTo = tape[ptr++]; + return new IfcObjectPlacement(expressID, type, PlacementRelTo); + } + ToTape() { + let args = []; + args.push(this.PlacementRelTo); + ; + return args; + } +}; +var IfcObjective = class { + constructor(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, BenchmarkValues, LogicalAggregator, ObjectiveQualifier, UserDefinedQualifier) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.ConstraintGrade = ConstraintGrade; + this.ConstraintSource = ConstraintSource; + this.CreatingActor = CreatingActor; + this.CreationTime = CreationTime; + this.UserDefinedGrade = UserDefinedGrade; + this.BenchmarkValues = BenchmarkValues; + this.LogicalAggregator = LogicalAggregator; + this.ObjectiveQualifier = ObjectiveQualifier; + this.UserDefinedQualifier = UserDefinedQualifier; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ConstraintGrade = tape[ptr++]; + let ConstraintSource = tape[ptr++]; + let CreatingActor = tape[ptr++]; + let CreationTime = tape[ptr++]; + let UserDefinedGrade = tape[ptr++]; + let BenchmarkValues = tape[ptr++]; + let LogicalAggregator = tape[ptr++]; + let ObjectiveQualifier = tape[ptr++]; + let UserDefinedQualifier = tape[ptr++]; + return new IfcObjective(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, BenchmarkValues, LogicalAggregator, ObjectiveQualifier, UserDefinedQualifier); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ConstraintGrade); + ; + args.push(this.ConstraintSource); + ; + args.push(this.CreatingActor); + ; + args.push(this.CreationTime); + ; + args.push(this.UserDefinedGrade); + ; + args.push(this.BenchmarkValues); + ; + args.push(this.LogicalAggregator); + ; + args.push(this.ObjectiveQualifier); + ; + args.push(this.UserDefinedQualifier); + ; + return args; + } +}; +var IfcOccupant = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.TheActor = TheActor; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let TheActor = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcOccupant(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.TheActor); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcOffsetCurve = class { + constructor(expressID, type, BasisCurve) { + this.expressID = expressID; + this.type = type; + this.BasisCurve = BasisCurve; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisCurve = tape[ptr++]; + return new IfcOffsetCurve(expressID, type, BasisCurve); + } + ToTape() { + let args = []; + args.push(this.BasisCurve); + ; + return args; + } +}; +var IfcOffsetCurve2D = class { + constructor(expressID, type, BasisCurve, Distance, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.BasisCurve = BasisCurve; + this.Distance = Distance; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisCurve = tape[ptr++]; + let Distance = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcOffsetCurve2D(expressID, type, BasisCurve, Distance, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.BasisCurve); + ; + args.push(this.Distance); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcOffsetCurve3D = class { + constructor(expressID, type, BasisCurve, Distance, SelfIntersect, RefDirection) { + this.expressID = expressID; + this.type = type; + this.BasisCurve = BasisCurve; + this.Distance = Distance; + this.SelfIntersect = SelfIntersect; + this.RefDirection = RefDirection; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisCurve = tape[ptr++]; + let Distance = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + let RefDirection = tape[ptr++]; + return new IfcOffsetCurve3D(expressID, type, BasisCurve, Distance, SelfIntersect, RefDirection); + } + ToTape() { + let args = []; + args.push(this.BasisCurve); + ; + args.push(this.Distance); + ; + args.push(this.SelfIntersect); + ; + args.push(this.RefDirection); + ; + return args; + } +}; +var IfcOffsetCurveByDistances = class { + constructor(expressID, type, BasisCurve, OffsetValues, Tag) { + this.expressID = expressID; + this.type = type; + this.BasisCurve = BasisCurve; + this.OffsetValues = OffsetValues; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisCurve = tape[ptr++]; + let OffsetValues = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcOffsetCurveByDistances(expressID, type, BasisCurve, OffsetValues, Tag); + } + ToTape() { + let args = []; + args.push(this.BasisCurve); + ; + args.push(this.OffsetValues); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcOpenShell = class { + constructor(expressID, type, CfsFaces) { + this.expressID = expressID; + this.type = type; + this.CfsFaces = CfsFaces; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let CfsFaces = tape[ptr++]; + return new IfcOpenShell(expressID, type, CfsFaces); + } + ToTape() { + let args = []; + args.push(this.CfsFaces); + ; + return args; + } +}; +var IfcOpeningElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcOpeningElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcOpeningStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcOpeningStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcOrganization = class { + constructor(expressID, type, Identification, Name, Description, Roles, Addresses) { + this.expressID = expressID; + this.type = type; + this.Identification = Identification; + this.Name = Name; + this.Description = Description; + this.Roles = Roles; + this.Addresses = Addresses; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Identification = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Roles = tape[ptr++]; + let Addresses = tape[ptr++]; + return new IfcOrganization(expressID, type, Identification, Name, Description, Roles, Addresses); + } + ToTape() { + let args = []; + args.push(this.Identification); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Roles); + ; + args.push(this.Addresses); + ; + return args; + } +}; +var IfcOrganizationRelationship = class { + constructor(expressID, type, Name, Description, RelatingOrganization, RelatedOrganizations) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatingOrganization = RelatingOrganization; + this.RelatedOrganizations = RelatedOrganizations; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingOrganization = tape[ptr++]; + let RelatedOrganizations = tape[ptr++]; + return new IfcOrganizationRelationship(expressID, type, Name, Description, RelatingOrganization, RelatedOrganizations); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingOrganization); + ; + args.push(this.RelatedOrganizations); + ; + return args; + } +}; +var IfcOrientationExpression = class { + constructor(expressID, type, LateralAxisDirection, VerticalAxisDirection) { + this.expressID = expressID; + this.type = type; + this.LateralAxisDirection = LateralAxisDirection; + this.VerticalAxisDirection = VerticalAxisDirection; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let LateralAxisDirection = tape[ptr++]; + let VerticalAxisDirection = tape[ptr++]; + return new IfcOrientationExpression(expressID, type, LateralAxisDirection, VerticalAxisDirection); + } + ToTape() { + let args = []; + args.push(this.LateralAxisDirection); + ; + args.push(this.VerticalAxisDirection); + ; + return args; + } +}; +var IfcOrientedEdge = class { + constructor(expressID, type, EdgeStart, EdgeEnd, EdgeElement, Orientation) { + this.expressID = expressID; + this.type = type; + this.EdgeStart = EdgeStart; + this.EdgeEnd = EdgeEnd; + this.EdgeElement = EdgeElement; + this.Orientation = Orientation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let EdgeStart = tape[ptr++]; + let EdgeEnd = tape[ptr++]; + let EdgeElement = tape[ptr++]; + let Orientation = tape[ptr++]; + return new IfcOrientedEdge(expressID, type, EdgeStart, EdgeEnd, EdgeElement, Orientation); + } + ToTape() { + let args = []; + args.push(this.EdgeStart); + ; + args.push(this.EdgeEnd); + ; + args.push(this.EdgeElement); + ; + args.push(this.Orientation); + ; + return args; + } +}; +var IfcOuterBoundaryCurve = class { + constructor(expressID, type, Segments, SelfIntersect) { + this.expressID = expressID; + this.type = type; + this.Segments = Segments; + this.SelfIntersect = SelfIntersect; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Segments = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + return new IfcOuterBoundaryCurve(expressID, type, Segments, SelfIntersect); + } + ToTape() { + let args = []; + args.push(this.Segments); + ; + args.push(this.SelfIntersect); + ; + return args; + } +}; +var IfcOutlet = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcOutlet(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcOutletType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcOutletType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcOwnerHistory = class { + constructor(expressID, type, OwningUser, OwningApplication, State, ChangeAction, LastModifiedDate, LastModifyingUser, LastModifyingApplication, CreationDate) { + this.expressID = expressID; + this.type = type; + this.OwningUser = OwningUser; + this.OwningApplication = OwningApplication; + this.State = State; + this.ChangeAction = ChangeAction; + this.LastModifiedDate = LastModifiedDate; + this.LastModifyingUser = LastModifyingUser; + this.LastModifyingApplication = LastModifyingApplication; + this.CreationDate = CreationDate; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let OwningUser = tape[ptr++]; + let OwningApplication = tape[ptr++]; + let State = tape[ptr++]; + let ChangeAction = tape[ptr++]; + let LastModifiedDate = tape[ptr++]; + let LastModifyingUser = tape[ptr++]; + let LastModifyingApplication = tape[ptr++]; + let CreationDate = tape[ptr++]; + return new IfcOwnerHistory(expressID, type, OwningUser, OwningApplication, State, ChangeAction, LastModifiedDate, LastModifyingUser, LastModifyingApplication, CreationDate); + } + ToTape() { + let args = []; + args.push(this.OwningUser); + ; + args.push(this.OwningApplication); + ; + args.push(this.State); + ; + args.push(this.ChangeAction); + ; + args.push(this.LastModifiedDate); + ; + args.push(this.LastModifyingUser); + ; + args.push(this.LastModifyingApplication); + ; + args.push(this.CreationDate); + ; + return args; + } +}; +var IfcParameterizedProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + return new IfcParameterizedProfileDef(expressID, type, ProfileType, ProfileName, Position); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + return args; + } +}; +var IfcPath = class { + constructor(expressID, type, EdgeList) { + this.expressID = expressID; + this.type = type; + this.EdgeList = EdgeList; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let EdgeList = tape[ptr++]; + return new IfcPath(expressID, type, EdgeList); + } + ToTape() { + let args = []; + args.push(this.EdgeList); + ; + return args; + } +}; +var IfcPcurve = class { + constructor(expressID, type, BasisSurface, ReferenceCurve) { + this.expressID = expressID; + this.type = type; + this.BasisSurface = BasisSurface; + this.ReferenceCurve = ReferenceCurve; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisSurface = tape[ptr++]; + let ReferenceCurve = tape[ptr++]; + return new IfcPcurve(expressID, type, BasisSurface, ReferenceCurve); + } + ToTape() { + let args = []; + args.push(this.BasisSurface); + ; + args.push(this.ReferenceCurve); + ; + return args; + } +}; +var IfcPerformanceHistory = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LifeCyclePhase, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LifeCyclePhase = LifeCyclePhase; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LifeCyclePhase = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPerformanceHistory(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LifeCyclePhase, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LifeCyclePhase); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPermeableCoveringProperties = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.OperationType = OperationType; + this.PanelPosition = PanelPosition; + this.FrameDepth = FrameDepth; + this.FrameThickness = FrameThickness; + this.ShapeAspectStyle = ShapeAspectStyle; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let OperationType = tape[ptr++]; + let PanelPosition = tape[ptr++]; + let FrameDepth = tape[ptr++]; + let FrameThickness = tape[ptr++]; + let ShapeAspectStyle = tape[ptr++]; + return new IfcPermeableCoveringProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.OperationType); + ; + args.push(this.PanelPosition); + ; + args.push(this.FrameDepth); + ; + args.push(this.FrameThickness); + ; + args.push(this.ShapeAspectStyle); + ; + return args; + } +}; +var IfcPermit = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.PredefinedType = PredefinedType; + this.Status = Status; + this.LongDescription = LongDescription; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Status = tape[ptr++]; + let LongDescription = tape[ptr++]; + return new IfcPermit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.PredefinedType); + ; + args.push(this.Status); + ; + args.push(this.LongDescription); + ; + return args; + } +}; +var IfcPerson = class { + constructor(expressID, type, Identification, FamilyName, GivenName, MiddleNames, PrefixTitles, SuffixTitles, Roles, Addresses) { + this.expressID = expressID; + this.type = type; + this.Identification = Identification; + this.FamilyName = FamilyName; + this.GivenName = GivenName; + this.MiddleNames = MiddleNames; + this.PrefixTitles = PrefixTitles; + this.SuffixTitles = SuffixTitles; + this.Roles = Roles; + this.Addresses = Addresses; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Identification = tape[ptr++]; + let FamilyName = tape[ptr++]; + let GivenName = tape[ptr++]; + let MiddleNames = tape[ptr++]; + let PrefixTitles = tape[ptr++]; + let SuffixTitles = tape[ptr++]; + let Roles = tape[ptr++]; + let Addresses = tape[ptr++]; + return new IfcPerson(expressID, type, Identification, FamilyName, GivenName, MiddleNames, PrefixTitles, SuffixTitles, Roles, Addresses); + } + ToTape() { + let args = []; + args.push(this.Identification); + ; + args.push(this.FamilyName); + ; + args.push(this.GivenName); + ; + args.push(this.MiddleNames); + ; + args.push(this.PrefixTitles); + ; + args.push(this.SuffixTitles); + ; + args.push(this.Roles); + ; + args.push(this.Addresses); + ; + return args; + } +}; +var IfcPersonAndOrganization = class { + constructor(expressID, type, ThePerson, TheOrganization, Roles) { + this.expressID = expressID; + this.type = type; + this.ThePerson = ThePerson; + this.TheOrganization = TheOrganization; + this.Roles = Roles; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ThePerson = tape[ptr++]; + let TheOrganization = tape[ptr++]; + let Roles = tape[ptr++]; + return new IfcPersonAndOrganization(expressID, type, ThePerson, TheOrganization, Roles); + } + ToTape() { + let args = []; + args.push(this.ThePerson); + ; + args.push(this.TheOrganization); + ; + args.push(this.Roles); + ; + return args; + } +}; +var IfcPhysicalComplexQuantity = class { + constructor(expressID, type, Name, Description, HasQuantities, Discrimination, Quality, Usage) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.HasQuantities = HasQuantities; + this.Discrimination = Discrimination; + this.Quality = Quality; + this.Usage = Usage; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let HasQuantities = tape[ptr++]; + let Discrimination = tape[ptr++]; + let Quality = tape[ptr++]; + let Usage = tape[ptr++]; + return new IfcPhysicalComplexQuantity(expressID, type, Name, Description, HasQuantities, Discrimination, Quality, Usage); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.HasQuantities); + ; + args.push(this.Discrimination); + ; + args.push(this.Quality); + ; + args.push(this.Usage); + ; + return args; + } +}; +var IfcPhysicalQuantity = class { + constructor(expressID, type, Name, Description) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcPhysicalQuantity(expressID, type, Name, Description); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcPhysicalSimpleQuantity = class { + constructor(expressID, type, Name, Description, Unit) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + return new IfcPhysicalSimpleQuantity(expressID, type, Name, Description, Unit); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + return args; + } +}; +var IfcPile = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType, ConstructionType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + this.ConstructionType = ConstructionType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let ConstructionType = tape[ptr++]; + return new IfcPile(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType, ConstructionType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + args.push(this.ConstructionType); + ; + return args; + } +}; +var IfcPileType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPileType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPipeFitting = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPipeFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPipeFittingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPipeFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPipeSegment = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPipeSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPipeSegmentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPipeSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPixelTexture = class { + constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, Width, Height, ColourComponents, Pixel) { + this.expressID = expressID; + this.type = type; + this.RepeatS = RepeatS; + this.RepeatT = RepeatT; + this.Mode = Mode; + this.TextureTransform = TextureTransform; + this.Parameter = Parameter; + this.Width = Width; + this.Height = Height; + this.ColourComponents = ColourComponents; + this.Pixel = Pixel; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let RepeatS = tape[ptr++]; + let RepeatT = tape[ptr++]; + let Mode = tape[ptr++]; + let TextureTransform = tape[ptr++]; + let Parameter = tape[ptr++]; + let Width = tape[ptr++]; + let Height = tape[ptr++]; + let ColourComponents = tape[ptr++]; + let Pixel = tape[ptr++]; + return new IfcPixelTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, Width, Height, ColourComponents, Pixel); + } + ToTape() { + let args = []; + args.push(this.RepeatS); + ; + args.push(this.RepeatT); + ; + args.push(this.Mode); + ; + args.push(this.TextureTransform); + ; + args.push(this.Parameter); + ; + args.push(this.Width); + ; + args.push(this.Height); + ; + args.push(this.ColourComponents); + ; + args.push(this.Pixel); + ; + return args; + } +}; +var IfcPlacement = class { + constructor(expressID, type, Location) { + this.expressID = expressID; + this.type = type; + this.Location = Location; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Location = tape[ptr++]; + return new IfcPlacement(expressID, type, Location); + } + ToTape() { + let args = []; + args.push(this.Location); + ; + return args; + } +}; +var IfcPlanarBox = class { + constructor(expressID, type, SizeInX, SizeInY, Placement) { + this.expressID = expressID; + this.type = type; + this.SizeInX = SizeInX; + this.SizeInY = SizeInY; + this.Placement = Placement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SizeInX = tape[ptr++]; + let SizeInY = tape[ptr++]; + let Placement = tape[ptr++]; + return new IfcPlanarBox(expressID, type, SizeInX, SizeInY, Placement); + } + ToTape() { + let args = []; + args.push(this.SizeInX); + ; + args.push(this.SizeInY); + ; + args.push(this.Placement); + ; + return args; + } +}; +var IfcPlanarExtent = class { + constructor(expressID, type, SizeInX, SizeInY) { + this.expressID = expressID; + this.type = type; + this.SizeInX = SizeInX; + this.SizeInY = SizeInY; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SizeInX = tape[ptr++]; + let SizeInY = tape[ptr++]; + return new IfcPlanarExtent(expressID, type, SizeInX, SizeInY); + } + ToTape() { + let args = []; + args.push(this.SizeInX); + ; + args.push(this.SizeInY); + ; + return args; + } +}; +var IfcPlane = class { + constructor(expressID, type, Position) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + return new IfcPlane(expressID, type, Position); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + return args; + } +}; +var IfcPlate = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPlate(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPlateStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPlateStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPlateType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPlateType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPoint = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcPoint(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcPointOnCurve = class { + constructor(expressID, type, BasisCurve, PointParameter) { + this.expressID = expressID; + this.type = type; + this.BasisCurve = BasisCurve; + this.PointParameter = PointParameter; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisCurve = tape[ptr++]; + let PointParameter = tape[ptr++]; + return new IfcPointOnCurve(expressID, type, BasisCurve, PointParameter); + } + ToTape() { + let args = []; + args.push(this.BasisCurve); + ; + args.push(this.PointParameter); + ; + return args; + } +}; +var IfcPointOnSurface = class { + constructor(expressID, type, BasisSurface, PointParameterU, PointParameterV) { + this.expressID = expressID; + this.type = type; + this.BasisSurface = BasisSurface; + this.PointParameterU = PointParameterU; + this.PointParameterV = PointParameterV; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisSurface = tape[ptr++]; + let PointParameterU = tape[ptr++]; + let PointParameterV = tape[ptr++]; + return new IfcPointOnSurface(expressID, type, BasisSurface, PointParameterU, PointParameterV); + } + ToTape() { + let args = []; + args.push(this.BasisSurface); + ; + args.push(this.PointParameterU); + ; + args.push(this.PointParameterV); + ; + return args; + } +}; +var IfcPolyLoop = class { + constructor(expressID, type, Polygon) { + this.expressID = expressID; + this.type = type; + this.Polygon = Polygon; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Polygon = tape[ptr++]; + return new IfcPolyLoop(expressID, type, Polygon); + } + ToTape() { + let args = []; + args.push(this.Polygon); + ; + return args; + } +}; +var IfcPolygonalBoundedHalfSpace = class { + constructor(expressID, type, BaseSurface, AgreementFlag, Position, PolygonalBoundary) { + this.expressID = expressID; + this.type = type; + this.BaseSurface = BaseSurface; + this.AgreementFlag = AgreementFlag; + this.Position = Position; + this.PolygonalBoundary = PolygonalBoundary; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BaseSurface = tape[ptr++]; + let AgreementFlag = tape[ptr++]; + let Position = tape[ptr++]; + let PolygonalBoundary = tape[ptr++]; + return new IfcPolygonalBoundedHalfSpace(expressID, type, BaseSurface, AgreementFlag, Position, PolygonalBoundary); + } + ToTape() { + let args = []; + args.push(this.BaseSurface); + ; + args.push(this.AgreementFlag); + ; + args.push(this.Position); + ; + args.push(this.PolygonalBoundary); + ; + return args; + } +}; +var IfcPolygonalFaceSet = class { + constructor(expressID, type, Coordinates, Closed, Faces, PnIndex) { + this.expressID = expressID; + this.type = type; + this.Coordinates = Coordinates; + this.Closed = Closed; + this.Faces = Faces; + this.PnIndex = PnIndex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Coordinates = tape[ptr++]; + let Closed = tape[ptr++]; + let Faces = tape[ptr++]; + let PnIndex = tape[ptr++]; + return new IfcPolygonalFaceSet(expressID, type, Coordinates, Closed, Faces, PnIndex); + } + ToTape() { + let args = []; + args.push(this.Coordinates); + ; + args.push(this.Closed); + ; + args.push(this.Faces); + ; + args.push(this.PnIndex); + ; + return args; + } +}; +var IfcPolyline = class { + constructor(expressID, type, Points) { + this.expressID = expressID; + this.type = type; + this.Points = Points; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Points = tape[ptr++]; + return new IfcPolyline(expressID, type, Points); + } + ToTape() { + let args = []; + args.push(this.Points); + ; + return args; + } +}; +var IfcPort = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + return new IfcPort(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + return args; + } +}; +var IfcPositioningElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + return new IfcPositioningElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + return args; + } +}; +var IfcPostalAddress = class { + constructor(expressID, type, Purpose, Description, UserDefinedPurpose, InternalLocation, AddressLines, PostalBox, Town, Region, PostalCode, Country) { + this.expressID = expressID; + this.type = type; + this.Purpose = Purpose; + this.Description = Description; + this.UserDefinedPurpose = UserDefinedPurpose; + this.InternalLocation = InternalLocation; + this.AddressLines = AddressLines; + this.PostalBox = PostalBox; + this.Town = Town; + this.Region = Region; + this.PostalCode = PostalCode; + this.Country = Country; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Purpose = tape[ptr++]; + let Description = tape[ptr++]; + let UserDefinedPurpose = tape[ptr++]; + let InternalLocation = tape[ptr++]; + let AddressLines = tape[ptr++]; + let PostalBox = tape[ptr++]; + let Town = tape[ptr++]; + let Region = tape[ptr++]; + let PostalCode = tape[ptr++]; + let Country = tape[ptr++]; + return new IfcPostalAddress(expressID, type, Purpose, Description, UserDefinedPurpose, InternalLocation, AddressLines, PostalBox, Town, Region, PostalCode, Country); + } + ToTape() { + let args = []; + args.push(this.Purpose); + ; + args.push(this.Description); + ; + args.push(this.UserDefinedPurpose); + ; + args.push(this.InternalLocation); + ; + args.push(this.AddressLines); + ; + args.push(this.PostalBox); + ; + args.push(this.Town); + ; + args.push(this.Region); + ; + args.push(this.PostalCode); + ; + args.push(this.Country); + ; + return args; + } +}; +var IfcPreDefinedColour = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcPreDefinedColour(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcPreDefinedCurveFont = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcPreDefinedCurveFont(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcPreDefinedItem = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcPreDefinedItem(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcPreDefinedProperties = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcPreDefinedProperties(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcPreDefinedPropertySet = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcPreDefinedPropertySet(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcPreDefinedTextFont = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcPreDefinedTextFont(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcPresentationItem = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcPresentationItem(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcPresentationLayerAssignment = class { + constructor(expressID, type, Name, Description, AssignedItems, Identifier) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.AssignedItems = AssignedItems; + this.Identifier = Identifier; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let AssignedItems = tape[ptr++]; + let Identifier = tape[ptr++]; + return new IfcPresentationLayerAssignment(expressID, type, Name, Description, AssignedItems, Identifier); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.AssignedItems); + ; + args.push(this.Identifier); + ; + return args; + } +}; +var IfcPresentationLayerWithStyle = class { + constructor(expressID, type, Name, Description, AssignedItems, Identifier, LayerOn, LayerFrozen, LayerBlocked, LayerStyles) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.AssignedItems = AssignedItems; + this.Identifier = Identifier; + this.LayerOn = LayerOn; + this.LayerFrozen = LayerFrozen; + this.LayerBlocked = LayerBlocked; + this.LayerStyles = LayerStyles; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let AssignedItems = tape[ptr++]; + let Identifier = tape[ptr++]; + let LayerOn = tape[ptr++]; + let LayerFrozen = tape[ptr++]; + let LayerBlocked = tape[ptr++]; + let LayerStyles = tape[ptr++]; + return new IfcPresentationLayerWithStyle(expressID, type, Name, Description, AssignedItems, Identifier, LayerOn, LayerFrozen, LayerBlocked, LayerStyles); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.AssignedItems); + ; + args.push(this.Identifier); + ; + args.push(this.LayerOn); + ; + args.push(this.LayerFrozen); + ; + args.push(this.LayerBlocked); + ; + args.push(this.LayerStyles); + ; + return args; + } +}; +var IfcPresentationStyle = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcPresentationStyle(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcPresentationStyleAssignment = class { + constructor(expressID, type, Styles) { + this.expressID = expressID; + this.type = type; + this.Styles = Styles; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Styles = tape[ptr++]; + return new IfcPresentationStyleAssignment(expressID, type, Styles); + } + ToTape() { + let args = []; + args.push(this.Styles); + ; + return args; + } +}; +var IfcProcedure = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcProcedure(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcProcedureType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ProcessType = ProcessType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ProcessType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcProcedureType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ProcessType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcProcess = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + return new IfcProcess(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + return args; + } +}; +var IfcProduct = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + return new IfcProduct(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + return args; + } +}; +var IfcProductDefinitionShape = class { + constructor(expressID, type, Name, Description, Representations) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Representations = Representations; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Representations = tape[ptr++]; + return new IfcProductDefinitionShape(expressID, type, Name, Description, Representations); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Representations); + ; + return args; + } +}; +var IfcProductRepresentation = class { + constructor(expressID, type, Name, Description, Representations) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Representations = Representations; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Representations = tape[ptr++]; + return new IfcProductRepresentation(expressID, type, Name, Description, Representations); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Representations); + ; + return args; + } +}; +var IfcProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + return new IfcProfileDef(expressID, type, ProfileType, ProfileName); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + return args; + } +}; +var IfcProfileProperties = class { + constructor(expressID, type, Name, Description, Properties, ProfileDefinition) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Properties = Properties; + this.ProfileDefinition = ProfileDefinition; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Properties = tape[ptr++]; + let ProfileDefinition = tape[ptr++]; + return new IfcProfileProperties(expressID, type, Name, Description, Properties, ProfileDefinition); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Properties); + ; + args.push(this.ProfileDefinition); + ; + return args; + } +}; +var IfcProject = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.LongName = LongName; + this.Phase = Phase; + this.RepresentationContexts = RepresentationContexts; + this.UnitsInContext = UnitsInContext; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let LongName = tape[ptr++]; + let Phase = tape[ptr++]; + let RepresentationContexts = tape[ptr++]; + let UnitsInContext = tape[ptr++]; + return new IfcProject(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.LongName); + ; + args.push(this.Phase); + ; + args.push(this.RepresentationContexts); + ; + args.push(this.UnitsInContext); + ; + return args; + } +}; +var IfcProjectLibrary = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.LongName = LongName; + this.Phase = Phase; + this.RepresentationContexts = RepresentationContexts; + this.UnitsInContext = UnitsInContext; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let LongName = tape[ptr++]; + let Phase = tape[ptr++]; + let RepresentationContexts = tape[ptr++]; + let UnitsInContext = tape[ptr++]; + return new IfcProjectLibrary(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.LongName); + ; + args.push(this.Phase); + ; + args.push(this.RepresentationContexts); + ; + args.push(this.UnitsInContext); + ; + return args; + } +}; +var IfcProjectOrder = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.PredefinedType = PredefinedType; + this.Status = Status; + this.LongDescription = LongDescription; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Status = tape[ptr++]; + let LongDescription = tape[ptr++]; + return new IfcProjectOrder(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.PredefinedType); + ; + args.push(this.Status); + ; + args.push(this.LongDescription); + ; + return args; + } +}; +var IfcProjectedCRS = class { + constructor(expressID, type, Name, Description, GeodeticDatum, VerticalDatum, MapProjection, MapZone, MapUnit) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.GeodeticDatum = GeodeticDatum; + this.VerticalDatum = VerticalDatum; + this.MapProjection = MapProjection; + this.MapZone = MapZone; + this.MapUnit = MapUnit; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let GeodeticDatum = tape[ptr++]; + let VerticalDatum = tape[ptr++]; + let MapProjection = tape[ptr++]; + let MapZone = tape[ptr++]; + let MapUnit = tape[ptr++]; + return new IfcProjectedCRS(expressID, type, Name, Description, GeodeticDatum, VerticalDatum, MapProjection, MapZone, MapUnit); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.GeodeticDatum); + ; + args.push(this.VerticalDatum); + ; + args.push(this.MapProjection); + ; + args.push(this.MapZone); + ; + args.push(this.MapUnit); + ; + return args; + } +}; +var IfcProjectionElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcProjectionElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcProperty = class { + constructor(expressID, type, Name, Description) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcProperty(expressID, type, Name, Description); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcPropertyAbstraction = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcPropertyAbstraction(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcPropertyBoundedValue = class { + constructor(expressID, type, Name, Description, UpperBoundValue, LowerBoundValue, Unit, SetPointValue) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.UpperBoundValue = UpperBoundValue; + this.LowerBoundValue = LowerBoundValue; + this.Unit = Unit; + this.SetPointValue = SetPointValue; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let UpperBoundValue = tape[ptr++]; + let LowerBoundValue = tape[ptr++]; + let Unit = tape[ptr++]; + let SetPointValue = tape[ptr++]; + return new IfcPropertyBoundedValue(expressID, type, Name, Description, UpperBoundValue, LowerBoundValue, Unit, SetPointValue); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.UpperBoundValue); + ; + args.push(this.LowerBoundValue); + ; + args.push(this.Unit); + ; + args.push(this.SetPointValue); + ; + return args; + } +}; +var IfcPropertyDefinition = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcPropertyDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcPropertyDependencyRelationship = class { + constructor(expressID, type, Name, Description, DependingProperty, DependantProperty, Expression) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.DependingProperty = DependingProperty; + this.DependantProperty = DependantProperty; + this.Expression = Expression; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let DependingProperty = tape[ptr++]; + let DependantProperty = tape[ptr++]; + let Expression = tape[ptr++]; + return new IfcPropertyDependencyRelationship(expressID, type, Name, Description, DependingProperty, DependantProperty, Expression); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.DependingProperty); + ; + args.push(this.DependantProperty); + ; + args.push(this.Expression); + ; + return args; + } +}; +var IfcPropertyEnumeratedValue = class { + constructor(expressID, type, Name, Description, EnumerationValues, EnumerationReference) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.EnumerationValues = EnumerationValues; + this.EnumerationReference = EnumerationReference; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let EnumerationValues = tape[ptr++]; + let EnumerationReference = tape[ptr++]; + return new IfcPropertyEnumeratedValue(expressID, type, Name, Description, EnumerationValues, EnumerationReference); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.EnumerationValues); + ; + args.push(this.EnumerationReference); + ; + return args; + } +}; +var IfcPropertyEnumeration = class { + constructor(expressID, type, Name, EnumerationValues, Unit) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.EnumerationValues = EnumerationValues; + this.Unit = Unit; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let EnumerationValues = tape[ptr++]; + let Unit = tape[ptr++]; + return new IfcPropertyEnumeration(expressID, type, Name, EnumerationValues, Unit); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.EnumerationValues); + ; + args.push(this.Unit); + ; + return args; + } +}; +var IfcPropertyListValue = class { + constructor(expressID, type, Name, Description, ListValues, Unit) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.ListValues = ListValues; + this.Unit = Unit; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ListValues = tape[ptr++]; + let Unit = tape[ptr++]; + return new IfcPropertyListValue(expressID, type, Name, Description, ListValues, Unit); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ListValues); + ; + args.push(this.Unit); + ; + return args; + } +}; +var IfcPropertyReferenceValue = class { + constructor(expressID, type, Name, Description, UsageName, PropertyReference) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.UsageName = UsageName; + this.PropertyReference = PropertyReference; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let UsageName = tape[ptr++]; + let PropertyReference = tape[ptr++]; + return new IfcPropertyReferenceValue(expressID, type, Name, Description, UsageName, PropertyReference); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.UsageName); + ; + args.push(this.PropertyReference); + ; + return args; + } +}; +var IfcPropertySet = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, HasProperties) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.HasProperties = HasProperties; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let HasProperties = tape[ptr++]; + return new IfcPropertySet(expressID, type, GlobalId, OwnerHistory, Name, Description, HasProperties); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.HasProperties); + ; + return args; + } +}; +var IfcPropertySetDefinition = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcPropertySetDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcPropertySetTemplate = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, ApplicableEntity, HasPropertyTemplates) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.TemplateType = TemplateType; + this.ApplicableEntity = ApplicableEntity; + this.HasPropertyTemplates = HasPropertyTemplates; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let TemplateType = tape[ptr++]; + let ApplicableEntity = tape[ptr++]; + let HasPropertyTemplates = tape[ptr++]; + return new IfcPropertySetTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, ApplicableEntity, HasPropertyTemplates); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.TemplateType); + ; + args.push(this.ApplicableEntity); + ; + args.push(this.HasPropertyTemplates); + ; + return args; + } +}; +var IfcPropertySingleValue = class { + constructor(expressID, type, Name, Description, NominalValue, Unit) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.NominalValue = NominalValue; + this.Unit = Unit; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let NominalValue = tape[ptr++]; + let Unit = tape[ptr++]; + return new IfcPropertySingleValue(expressID, type, Name, Description, NominalValue, Unit); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.NominalValue); + ; + args.push(this.Unit); + ; + return args; + } +}; +var IfcPropertyTableValue = class { + constructor(expressID, type, Name, Description, DefiningValues, DefinedValues, Expression, DefiningUnit, DefinedUnit, CurveInterpolation) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.DefiningValues = DefiningValues; + this.DefinedValues = DefinedValues; + this.Expression = Expression; + this.DefiningUnit = DefiningUnit; + this.DefinedUnit = DefinedUnit; + this.CurveInterpolation = CurveInterpolation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let DefiningValues = tape[ptr++]; + let DefinedValues = tape[ptr++]; + let Expression = tape[ptr++]; + let DefiningUnit = tape[ptr++]; + let DefinedUnit = tape[ptr++]; + let CurveInterpolation = tape[ptr++]; + return new IfcPropertyTableValue(expressID, type, Name, Description, DefiningValues, DefinedValues, Expression, DefiningUnit, DefinedUnit, CurveInterpolation); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.DefiningValues); + ; + args.push(this.DefinedValues); + ; + args.push(this.Expression); + ; + args.push(this.DefiningUnit); + ; + args.push(this.DefinedUnit); + ; + args.push(this.CurveInterpolation); + ; + return args; + } +}; +var IfcPropertyTemplate = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcPropertyTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcPropertyTemplateDefinition = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcPropertyTemplateDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcProtectiveDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcProtectiveDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcProtectiveDeviceTrippingUnit = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcProtectiveDeviceTrippingUnit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcProtectiveDeviceTrippingUnitType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcProtectiveDeviceTrippingUnitType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcProtectiveDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcProtectiveDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcProxy = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, ProxyType, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.ProxyType = ProxyType; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let ProxyType = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcProxy(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, ProxyType, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.ProxyType); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcPump = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPump(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcPumpType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcPumpType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcQuantityArea = class { + constructor(expressID, type, Name, Description, Unit, AreaValue, Formula) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + this.AreaValue = AreaValue; + this.Formula = Formula; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + let AreaValue = tape[ptr++]; + let Formula = tape[ptr++]; + return new IfcQuantityArea(expressID, type, Name, Description, Unit, AreaValue, Formula); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + args.push(this.AreaValue); + ; + args.push(this.Formula); + ; + return args; + } +}; +var IfcQuantityCount = class { + constructor(expressID, type, Name, Description, Unit, CountValue, Formula) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + this.CountValue = CountValue; + this.Formula = Formula; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + let CountValue = tape[ptr++]; + let Formula = tape[ptr++]; + return new IfcQuantityCount(expressID, type, Name, Description, Unit, CountValue, Formula); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + args.push(this.CountValue); + ; + args.push(this.Formula); + ; + return args; + } +}; +var IfcQuantityLength = class { + constructor(expressID, type, Name, Description, Unit, LengthValue, Formula) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + this.LengthValue = LengthValue; + this.Formula = Formula; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + let LengthValue = tape[ptr++]; + let Formula = tape[ptr++]; + return new IfcQuantityLength(expressID, type, Name, Description, Unit, LengthValue, Formula); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + args.push(this.LengthValue); + ; + args.push(this.Formula); + ; + return args; + } +}; +var IfcQuantitySet = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcQuantitySet(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcQuantityTime = class { + constructor(expressID, type, Name, Description, Unit, TimeValue, Formula) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + this.TimeValue = TimeValue; + this.Formula = Formula; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + let TimeValue = tape[ptr++]; + let Formula = tape[ptr++]; + return new IfcQuantityTime(expressID, type, Name, Description, Unit, TimeValue, Formula); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + args.push(this.TimeValue); + ; + args.push(this.Formula); + ; + return args; + } +}; +var IfcQuantityVolume = class { + constructor(expressID, type, Name, Description, Unit, VolumeValue, Formula) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + this.VolumeValue = VolumeValue; + this.Formula = Formula; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + let VolumeValue = tape[ptr++]; + let Formula = tape[ptr++]; + return new IfcQuantityVolume(expressID, type, Name, Description, Unit, VolumeValue, Formula); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + args.push(this.VolumeValue); + ; + args.push(this.Formula); + ; + return args; + } +}; +var IfcQuantityWeight = class { + constructor(expressID, type, Name, Description, Unit, WeightValue, Formula) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + this.WeightValue = WeightValue; + this.Formula = Formula; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + let WeightValue = tape[ptr++]; + let Formula = tape[ptr++]; + return new IfcQuantityWeight(expressID, type, Name, Description, Unit, WeightValue, Formula); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + args.push(this.WeightValue); + ; + args.push(this.Formula); + ; + return args; + } +}; +var IfcRailing = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRailing(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRailingType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRailingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRamp = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRamp(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRampFlight = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRampFlight(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRampFlightType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRampFlightType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRampType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRampType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRationalBSplineCurveWithKnots = class { + constructor(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec, WeightsData) { + this.expressID = expressID; + this.type = type; + this.Degree = Degree; + this.ControlPointsList = ControlPointsList; + this.CurveForm = CurveForm; + this.ClosedCurve = ClosedCurve; + this.SelfIntersect = SelfIntersect; + this.KnotMultiplicities = KnotMultiplicities; + this.Knots = Knots; + this.KnotSpec = KnotSpec; + this.WeightsData = WeightsData; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Degree = tape[ptr++]; + let ControlPointsList = tape[ptr++]; + let CurveForm = tape[ptr++]; + let ClosedCurve = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + let KnotMultiplicities = tape[ptr++]; + let Knots = tape[ptr++]; + let KnotSpec = tape[ptr++]; + let WeightsData = tape[ptr++]; + return new IfcRationalBSplineCurveWithKnots(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec, WeightsData); + } + ToTape() { + let args = []; + args.push(this.Degree); + ; + args.push(this.ControlPointsList); + ; + args.push(this.CurveForm); + ; + args.push(this.ClosedCurve); + ; + args.push(this.SelfIntersect); + ; + args.push(this.KnotMultiplicities); + ; + args.push(this.Knots); + ; + args.push(this.KnotSpec); + ; + args.push(this.WeightsData); + ; + return args; + } +}; +var IfcRationalBSplineSurfaceWithKnots = class { + constructor(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec, WeightsData) { + this.expressID = expressID; + this.type = type; + this.UDegree = UDegree; + this.VDegree = VDegree; + this.ControlPointsList = ControlPointsList; + this.SurfaceForm = SurfaceForm; + this.UClosed = UClosed; + this.VClosed = VClosed; + this.SelfIntersect = SelfIntersect; + this.UMultiplicities = UMultiplicities; + this.VMultiplicities = VMultiplicities; + this.UKnots = UKnots; + this.VKnots = VKnots; + this.KnotSpec = KnotSpec; + this.WeightsData = WeightsData; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let UDegree = tape[ptr++]; + let VDegree = tape[ptr++]; + let ControlPointsList = tape[ptr++]; + let SurfaceForm = tape[ptr++]; + let UClosed = tape[ptr++]; + let VClosed = tape[ptr++]; + let SelfIntersect = tape[ptr++]; + let UMultiplicities = tape[ptr++]; + let VMultiplicities = tape[ptr++]; + let UKnots = tape[ptr++]; + let VKnots = tape[ptr++]; + let KnotSpec = tape[ptr++]; + let WeightsData = tape[ptr++]; + return new IfcRationalBSplineSurfaceWithKnots(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec, WeightsData); + } + ToTape() { + let args = []; + args.push(this.UDegree); + ; + args.push(this.VDegree); + ; + args.push(this.ControlPointsList); + ; + args.push(this.SurfaceForm); + ; + args.push(this.UClosed); + ; + args.push(this.VClosed); + ; + args.push(this.SelfIntersect); + ; + args.push(this.UMultiplicities); + ; + args.push(this.VMultiplicities); + ; + args.push(this.UKnots); + ; + args.push(this.VKnots); + ; + args.push(this.KnotSpec); + ; + args.push(this.WeightsData); + ; + return args; + } +}; +var IfcRectangleHollowProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, WallThickness, InnerFilletRadius, OuterFilletRadius) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.XDim = XDim; + this.YDim = YDim; + this.WallThickness = WallThickness; + this.InnerFilletRadius = InnerFilletRadius; + this.OuterFilletRadius = OuterFilletRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let XDim = tape[ptr++]; + let YDim = tape[ptr++]; + let WallThickness = tape[ptr++]; + let InnerFilletRadius = tape[ptr++]; + let OuterFilletRadius = tape[ptr++]; + return new IfcRectangleHollowProfileDef(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, WallThickness, InnerFilletRadius, OuterFilletRadius); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.XDim); + ; + args.push(this.YDim); + ; + args.push(this.WallThickness); + ; + args.push(this.InnerFilletRadius); + ; + args.push(this.OuterFilletRadius); + ; + return args; + } +}; +var IfcRectangleProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, XDim, YDim) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.XDim = XDim; + this.YDim = YDim; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let XDim = tape[ptr++]; + let YDim = tape[ptr++]; + return new IfcRectangleProfileDef(expressID, type, ProfileType, ProfileName, Position, XDim, YDim); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.XDim); + ; + args.push(this.YDim); + ; + return args; + } +}; +var IfcRectangularPyramid = class { + constructor(expressID, type, Position, XLength, YLength, Height) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.XLength = XLength; + this.YLength = YLength; + this.Height = Height; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let XLength = tape[ptr++]; + let YLength = tape[ptr++]; + let Height = tape[ptr++]; + return new IfcRectangularPyramid(expressID, type, Position, XLength, YLength, Height); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.XLength); + ; + args.push(this.YLength); + ; + args.push(this.Height); + ; + return args; + } +}; +var IfcRectangularTrimmedSurface = class { + constructor(expressID, type, BasisSurface, U1, V1, U2, V2, Usense, Vsense) { + this.expressID = expressID; + this.type = type; + this.BasisSurface = BasisSurface; + this.U1 = U1; + this.V1 = V1; + this.U2 = U2; + this.V2 = V2; + this.Usense = Usense; + this.Vsense = Vsense; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisSurface = tape[ptr++]; + let U1 = tape[ptr++]; + let V1 = tape[ptr++]; + let U2 = tape[ptr++]; + let V2 = tape[ptr++]; + let Usense = tape[ptr++]; + let Vsense = tape[ptr++]; + return new IfcRectangularTrimmedSurface(expressID, type, BasisSurface, U1, V1, U2, V2, Usense, Vsense); + } + ToTape() { + let args = []; + args.push(this.BasisSurface); + ; + args.push(this.U1); + ; + args.push(this.V1); + ; + args.push(this.U2); + ; + args.push(this.V2); + ; + args.push(this.Usense); + ; + args.push(this.Vsense); + ; + return args; + } +}; +var IfcRecurrencePattern = class { + constructor(expressID, type, RecurrenceType, DayComponent, WeekdayComponent, MonthComponent, Position, Interval, Occurrences, TimePeriods) { + this.expressID = expressID; + this.type = type; + this.RecurrenceType = RecurrenceType; + this.DayComponent = DayComponent; + this.WeekdayComponent = WeekdayComponent; + this.MonthComponent = MonthComponent; + this.Position = Position; + this.Interval = Interval; + this.Occurrences = Occurrences; + this.TimePeriods = TimePeriods; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let RecurrenceType = tape[ptr++]; + let DayComponent = tape[ptr++]; + let WeekdayComponent = tape[ptr++]; + let MonthComponent = tape[ptr++]; + let Position = tape[ptr++]; + let Interval = tape[ptr++]; + let Occurrences = tape[ptr++]; + let TimePeriods = tape[ptr++]; + return new IfcRecurrencePattern(expressID, type, RecurrenceType, DayComponent, WeekdayComponent, MonthComponent, Position, Interval, Occurrences, TimePeriods); + } + ToTape() { + let args = []; + args.push(this.RecurrenceType); + ; + args.push(this.DayComponent); + ; + args.push(this.WeekdayComponent); + ; + args.push(this.MonthComponent); + ; + args.push(this.Position); + ; + args.push(this.Interval); + ; + args.push(this.Occurrences); + ; + args.push(this.TimePeriods); + ; + return args; + } +}; +var IfcReference = class { + constructor(expressID, type, TypeIdentifier, AttributeIdentifier, InstanceName, ListPositions, InnerReference) { + this.expressID = expressID; + this.type = type; + this.TypeIdentifier = TypeIdentifier; + this.AttributeIdentifier = AttributeIdentifier; + this.InstanceName = InstanceName; + this.ListPositions = ListPositions; + this.InnerReference = InnerReference; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TypeIdentifier = tape[ptr++]; + let AttributeIdentifier = tape[ptr++]; + let InstanceName = tape[ptr++]; + let ListPositions = tape[ptr++]; + let InnerReference = tape[ptr++]; + return new IfcReference(expressID, type, TypeIdentifier, AttributeIdentifier, InstanceName, ListPositions, InnerReference); + } + ToTape() { + let args = []; + args.push(this.TypeIdentifier); + ; + args.push(this.AttributeIdentifier); + ; + args.push(this.InstanceName); + ; + args.push(this.ListPositions); + ; + args.push(this.InnerReference); + ; + return args; + } +}; +var IfcReferent = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, RestartDistance) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.PredefinedType = PredefinedType; + this.RestartDistance = RestartDistance; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let RestartDistance = tape[ptr++]; + return new IfcReferent(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, RestartDistance); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.PredefinedType); + ; + args.push(this.RestartDistance); + ; + return args; + } +}; +var IfcRegularTimeSeries = class { + constructor(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, TimeStep, Values) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.StartTime = StartTime; + this.EndTime = EndTime; + this.TimeSeriesDataType = TimeSeriesDataType; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.Unit = Unit; + this.TimeStep = TimeStep; + this.Values = Values; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let StartTime = tape[ptr++]; + let EndTime = tape[ptr++]; + let TimeSeriesDataType = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let Unit = tape[ptr++]; + let TimeStep = tape[ptr++]; + let Values = tape[ptr++]; + return new IfcRegularTimeSeries(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, TimeStep, Values); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.StartTime); + ; + args.push(this.EndTime); + ; + args.push(this.TimeSeriesDataType); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.Unit); + ; + args.push(this.TimeStep); + ; + args.push(this.Values); + ; + return args; + } +}; +var IfcReinforcementBarProperties = class { + constructor(expressID, type, TotalCrossSectionArea, SteelGrade, BarSurface, EffectiveDepth, NominalBarDiameter, BarCount) { + this.expressID = expressID; + this.type = type; + this.TotalCrossSectionArea = TotalCrossSectionArea; + this.SteelGrade = SteelGrade; + this.BarSurface = BarSurface; + this.EffectiveDepth = EffectiveDepth; + this.NominalBarDiameter = NominalBarDiameter; + this.BarCount = BarCount; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TotalCrossSectionArea = tape[ptr++]; + let SteelGrade = tape[ptr++]; + let BarSurface = tape[ptr++]; + let EffectiveDepth = tape[ptr++]; + let NominalBarDiameter = tape[ptr++]; + let BarCount = tape[ptr++]; + return new IfcReinforcementBarProperties(expressID, type, TotalCrossSectionArea, SteelGrade, BarSurface, EffectiveDepth, NominalBarDiameter, BarCount); + } + ToTape() { + let args = []; + args.push(this.TotalCrossSectionArea); + ; + args.push(this.SteelGrade); + ; + args.push(this.BarSurface); + ; + args.push(this.EffectiveDepth); + ; + args.push(this.NominalBarDiameter); + ; + args.push(this.BarCount); + ; + return args; + } +}; +var IfcReinforcementDefinitionProperties = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, DefinitionType, ReinforcementSectionDefinitions) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.DefinitionType = DefinitionType; + this.ReinforcementSectionDefinitions = ReinforcementSectionDefinitions; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let DefinitionType = tape[ptr++]; + let ReinforcementSectionDefinitions = tape[ptr++]; + return new IfcReinforcementDefinitionProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, DefinitionType, ReinforcementSectionDefinitions); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.DefinitionType); + ; + args.push(this.ReinforcementSectionDefinitions); + ; + return args; + } +}; +var IfcReinforcingBar = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, NominalDiameter, CrossSectionArea, BarLength, PredefinedType, BarSurface) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.SteelGrade = SteelGrade; + this.NominalDiameter = NominalDiameter; + this.CrossSectionArea = CrossSectionArea; + this.BarLength = BarLength; + this.PredefinedType = PredefinedType; + this.BarSurface = BarSurface; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let SteelGrade = tape[ptr++]; + let NominalDiameter = tape[ptr++]; + let CrossSectionArea = tape[ptr++]; + let BarLength = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let BarSurface = tape[ptr++]; + return new IfcReinforcingBar(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, NominalDiameter, CrossSectionArea, BarLength, PredefinedType, BarSurface); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.SteelGrade); + ; + args.push(this.NominalDiameter); + ; + args.push(this.CrossSectionArea); + ; + args.push(this.BarLength); + ; + args.push(this.PredefinedType); + ; + args.push(this.BarSurface); + ; + return args; + } +}; +var IfcReinforcingBarType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, BarLength, BarSurface, BendingShapeCode, BendingParameters) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.NominalDiameter = NominalDiameter; + this.CrossSectionArea = CrossSectionArea; + this.BarLength = BarLength; + this.BarSurface = BarSurface; + this.BendingShapeCode = BendingShapeCode; + this.BendingParameters = BendingParameters; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let NominalDiameter = tape[ptr++]; + let CrossSectionArea = tape[ptr++]; + let BarLength = tape[ptr++]; + let BarSurface = tape[ptr++]; + let BendingShapeCode = tape[ptr++]; + let BendingParameters = tape[ptr++]; + return new IfcReinforcingBarType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, BarLength, BarSurface, BendingShapeCode, BendingParameters); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.NominalDiameter); + ; + args.push(this.CrossSectionArea); + ; + args.push(this.BarLength); + ; + args.push(this.BarSurface); + ; + args.push(this.BendingShapeCode); + ; + args.push(this.BendingParameters); + ; + return args; + } +}; +var IfcReinforcingElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.SteelGrade = SteelGrade; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let SteelGrade = tape[ptr++]; + return new IfcReinforcingElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.SteelGrade); + ; + return args; + } +}; +var IfcReinforcingElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcReinforcingElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcReinforcingMesh = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.SteelGrade = SteelGrade; + this.MeshLength = MeshLength; + this.MeshWidth = MeshWidth; + this.LongitudinalBarNominalDiameter = LongitudinalBarNominalDiameter; + this.TransverseBarNominalDiameter = TransverseBarNominalDiameter; + this.LongitudinalBarCrossSectionArea = LongitudinalBarCrossSectionArea; + this.TransverseBarCrossSectionArea = TransverseBarCrossSectionArea; + this.LongitudinalBarSpacing = LongitudinalBarSpacing; + this.TransverseBarSpacing = TransverseBarSpacing; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let SteelGrade = tape[ptr++]; + let MeshLength = tape[ptr++]; + let MeshWidth = tape[ptr++]; + let LongitudinalBarNominalDiameter = tape[ptr++]; + let TransverseBarNominalDiameter = tape[ptr++]; + let LongitudinalBarCrossSectionArea = tape[ptr++]; + let TransverseBarCrossSectionArea = tape[ptr++]; + let LongitudinalBarSpacing = tape[ptr++]; + let TransverseBarSpacing = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcReinforcingMesh(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.SteelGrade); + ; + args.push(this.MeshLength); + ; + args.push(this.MeshWidth); + ; + args.push(this.LongitudinalBarNominalDiameter); + ; + args.push(this.TransverseBarNominalDiameter); + ; + args.push(this.LongitudinalBarCrossSectionArea); + ; + args.push(this.TransverseBarCrossSectionArea); + ; + args.push(this.LongitudinalBarSpacing); + ; + args.push(this.TransverseBarSpacing); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcReinforcingMeshType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, BendingShapeCode, BendingParameters) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.MeshLength = MeshLength; + this.MeshWidth = MeshWidth; + this.LongitudinalBarNominalDiameter = LongitudinalBarNominalDiameter; + this.TransverseBarNominalDiameter = TransverseBarNominalDiameter; + this.LongitudinalBarCrossSectionArea = LongitudinalBarCrossSectionArea; + this.TransverseBarCrossSectionArea = TransverseBarCrossSectionArea; + this.LongitudinalBarSpacing = LongitudinalBarSpacing; + this.TransverseBarSpacing = TransverseBarSpacing; + this.BendingShapeCode = BendingShapeCode; + this.BendingParameters = BendingParameters; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let MeshLength = tape[ptr++]; + let MeshWidth = tape[ptr++]; + let LongitudinalBarNominalDiameter = tape[ptr++]; + let TransverseBarNominalDiameter = tape[ptr++]; + let LongitudinalBarCrossSectionArea = tape[ptr++]; + let TransverseBarCrossSectionArea = tape[ptr++]; + let LongitudinalBarSpacing = tape[ptr++]; + let TransverseBarSpacing = tape[ptr++]; + let BendingShapeCode = tape[ptr++]; + let BendingParameters = tape[ptr++]; + return new IfcReinforcingMeshType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, BendingShapeCode, BendingParameters); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.MeshLength); + ; + args.push(this.MeshWidth); + ; + args.push(this.LongitudinalBarNominalDiameter); + ; + args.push(this.TransverseBarNominalDiameter); + ; + args.push(this.LongitudinalBarCrossSectionArea); + ; + args.push(this.TransverseBarCrossSectionArea); + ; + args.push(this.LongitudinalBarSpacing); + ; + args.push(this.TransverseBarSpacing); + ; + args.push(this.BendingShapeCode); + ; + args.push(this.BendingParameters); + ; + return args; + } +}; +var IfcRelAggregates = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingObject = RelatingObject; + this.RelatedObjects = RelatedObjects; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingObject = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + return new IfcRelAggregates(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingObject); + ; + args.push(this.RelatedObjects); + ; + return args; + } +}; +var IfcRelAssigns = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + return new IfcRelAssigns(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + return args; + } +}; +var IfcRelAssignsToActor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingActor, ActingRole) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + this.RelatingActor = RelatingActor; + this.ActingRole = ActingRole; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + let RelatingActor = tape[ptr++]; + let ActingRole = tape[ptr++]; + return new IfcRelAssignsToActor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingActor, ActingRole); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + args.push(this.RelatingActor); + ; + args.push(this.ActingRole); + ; + return args; + } +}; +var IfcRelAssignsToControl = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingControl) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + this.RelatingControl = RelatingControl; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + let RelatingControl = tape[ptr++]; + return new IfcRelAssignsToControl(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingControl); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + args.push(this.RelatingControl); + ; + return args; + } +}; +var IfcRelAssignsToGroup = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + this.RelatingGroup = RelatingGroup; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + let RelatingGroup = tape[ptr++]; + return new IfcRelAssignsToGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + args.push(this.RelatingGroup); + ; + return args; + } +}; +var IfcRelAssignsToGroupByFactor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup, Factor) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + this.RelatingGroup = RelatingGroup; + this.Factor = Factor; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + let RelatingGroup = tape[ptr++]; + let Factor = tape[ptr++]; + return new IfcRelAssignsToGroupByFactor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup, Factor); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + args.push(this.RelatingGroup); + ; + args.push(this.Factor); + ; + return args; + } +}; +var IfcRelAssignsToProcess = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProcess, QuantityInProcess) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + this.RelatingProcess = RelatingProcess; + this.QuantityInProcess = QuantityInProcess; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + let RelatingProcess = tape[ptr++]; + let QuantityInProcess = tape[ptr++]; + return new IfcRelAssignsToProcess(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProcess, QuantityInProcess); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + args.push(this.RelatingProcess); + ; + args.push(this.QuantityInProcess); + ; + return args; + } +}; +var IfcRelAssignsToProduct = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProduct) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + this.RelatingProduct = RelatingProduct; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + let RelatingProduct = tape[ptr++]; + return new IfcRelAssignsToProduct(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProduct); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + args.push(this.RelatingProduct); + ; + return args; + } +}; +var IfcRelAssignsToResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingResource) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatedObjectsType = RelatedObjectsType; + this.RelatingResource = RelatingResource; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatedObjectsType = tape[ptr++]; + let RelatingResource = tape[ptr++]; + return new IfcRelAssignsToResource(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingResource); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatedObjectsType); + ; + args.push(this.RelatingResource); + ; + return args; + } +}; +var IfcRelAssociates = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + return new IfcRelAssociates(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + return args; + } +}; +var IfcRelAssociatesApproval = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingApproval) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingApproval = RelatingApproval; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingApproval = tape[ptr++]; + return new IfcRelAssociatesApproval(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingApproval); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingApproval); + ; + return args; + } +}; +var IfcRelAssociatesClassification = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingClassification) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingClassification = RelatingClassification; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingClassification = tape[ptr++]; + return new IfcRelAssociatesClassification(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingClassification); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingClassification); + ; + return args; + } +}; +var IfcRelAssociatesConstraint = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, Intent, RelatingConstraint) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.Intent = Intent; + this.RelatingConstraint = RelatingConstraint; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let Intent = tape[ptr++]; + let RelatingConstraint = tape[ptr++]; + return new IfcRelAssociatesConstraint(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, Intent, RelatingConstraint); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.Intent); + ; + args.push(this.RelatingConstraint); + ; + return args; + } +}; +var IfcRelAssociatesDocument = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingDocument) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingDocument = RelatingDocument; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingDocument = tape[ptr++]; + return new IfcRelAssociatesDocument(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingDocument); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingDocument); + ; + return args; + } +}; +var IfcRelAssociatesLibrary = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingLibrary) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingLibrary = RelatingLibrary; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingLibrary = tape[ptr++]; + return new IfcRelAssociatesLibrary(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingLibrary); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingLibrary); + ; + return args; + } +}; +var IfcRelAssociatesMaterial = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingMaterial) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingMaterial = RelatingMaterial; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingMaterial = tape[ptr++]; + return new IfcRelAssociatesMaterial(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingMaterial); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingMaterial); + ; + return args; + } +}; +var IfcRelConnects = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcRelConnects(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcRelConnectsElements = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ConnectionGeometry = ConnectionGeometry; + this.RelatingElement = RelatingElement; + this.RelatedElement = RelatedElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ConnectionGeometry = tape[ptr++]; + let RelatingElement = tape[ptr++]; + let RelatedElement = tape[ptr++]; + return new IfcRelConnectsElements(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ConnectionGeometry); + ; + args.push(this.RelatingElement); + ; + args.push(this.RelatedElement); + ; + return args; + } +}; +var IfcRelConnectsPathElements = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RelatingPriorities, RelatedPriorities, RelatedConnectionType, RelatingConnectionType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ConnectionGeometry = ConnectionGeometry; + this.RelatingElement = RelatingElement; + this.RelatedElement = RelatedElement; + this.RelatingPriorities = RelatingPriorities; + this.RelatedPriorities = RelatedPriorities; + this.RelatedConnectionType = RelatedConnectionType; + this.RelatingConnectionType = RelatingConnectionType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ConnectionGeometry = tape[ptr++]; + let RelatingElement = tape[ptr++]; + let RelatedElement = tape[ptr++]; + let RelatingPriorities = tape[ptr++]; + let RelatedPriorities = tape[ptr++]; + let RelatedConnectionType = tape[ptr++]; + let RelatingConnectionType = tape[ptr++]; + return new IfcRelConnectsPathElements(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RelatingPriorities, RelatedPriorities, RelatedConnectionType, RelatingConnectionType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ConnectionGeometry); + ; + args.push(this.RelatingElement); + ; + args.push(this.RelatedElement); + ; + args.push(this.RelatingPriorities); + ; + args.push(this.RelatedPriorities); + ; + args.push(this.RelatedConnectionType); + ; + args.push(this.RelatingConnectionType); + ; + return args; + } +}; +var IfcRelConnectsPortToElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedElement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingPort = RelatingPort; + this.RelatedElement = RelatedElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingPort = tape[ptr++]; + let RelatedElement = tape[ptr++]; + return new IfcRelConnectsPortToElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedElement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingPort); + ; + args.push(this.RelatedElement); + ; + return args; + } +}; +var IfcRelConnectsPorts = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedPort, RealizingElement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingPort = RelatingPort; + this.RelatedPort = RelatedPort; + this.RealizingElement = RealizingElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingPort = tape[ptr++]; + let RelatedPort = tape[ptr++]; + let RealizingElement = tape[ptr++]; + return new IfcRelConnectsPorts(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedPort, RealizingElement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingPort); + ; + args.push(this.RelatedPort); + ; + args.push(this.RealizingElement); + ; + return args; + } +}; +var IfcRelConnectsStructuralActivity = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedStructuralActivity) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingElement = RelatingElement; + this.RelatedStructuralActivity = RelatedStructuralActivity; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingElement = tape[ptr++]; + let RelatedStructuralActivity = tape[ptr++]; + return new IfcRelConnectsStructuralActivity(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedStructuralActivity); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingElement); + ; + args.push(this.RelatedStructuralActivity); + ; + return args; + } +}; +var IfcRelConnectsStructuralMember = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingStructuralMember = RelatingStructuralMember; + this.RelatedStructuralConnection = RelatedStructuralConnection; + this.AppliedCondition = AppliedCondition; + this.AdditionalConditions = AdditionalConditions; + this.SupportedLength = SupportedLength; + this.ConditionCoordinateSystem = ConditionCoordinateSystem; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingStructuralMember = tape[ptr++]; + let RelatedStructuralConnection = tape[ptr++]; + let AppliedCondition = tape[ptr++]; + let AdditionalConditions = tape[ptr++]; + let SupportedLength = tape[ptr++]; + let ConditionCoordinateSystem = tape[ptr++]; + return new IfcRelConnectsStructuralMember(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingStructuralMember); + ; + args.push(this.RelatedStructuralConnection); + ; + args.push(this.AppliedCondition); + ; + args.push(this.AdditionalConditions); + ; + args.push(this.SupportedLength); + ; + args.push(this.ConditionCoordinateSystem); + ; + return args; + } +}; +var IfcRelConnectsWithEccentricity = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem, ConnectionConstraint) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingStructuralMember = RelatingStructuralMember; + this.RelatedStructuralConnection = RelatedStructuralConnection; + this.AppliedCondition = AppliedCondition; + this.AdditionalConditions = AdditionalConditions; + this.SupportedLength = SupportedLength; + this.ConditionCoordinateSystem = ConditionCoordinateSystem; + this.ConnectionConstraint = ConnectionConstraint; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingStructuralMember = tape[ptr++]; + let RelatedStructuralConnection = tape[ptr++]; + let AppliedCondition = tape[ptr++]; + let AdditionalConditions = tape[ptr++]; + let SupportedLength = tape[ptr++]; + let ConditionCoordinateSystem = tape[ptr++]; + let ConnectionConstraint = tape[ptr++]; + return new IfcRelConnectsWithEccentricity(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem, ConnectionConstraint); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingStructuralMember); + ; + args.push(this.RelatedStructuralConnection); + ; + args.push(this.AppliedCondition); + ; + args.push(this.AdditionalConditions); + ; + args.push(this.SupportedLength); + ; + args.push(this.ConditionCoordinateSystem); + ; + args.push(this.ConnectionConstraint); + ; + return args; + } +}; +var IfcRelConnectsWithRealizingElements = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RealizingElements, ConnectionType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ConnectionGeometry = ConnectionGeometry; + this.RelatingElement = RelatingElement; + this.RelatedElement = RelatedElement; + this.RealizingElements = RealizingElements; + this.ConnectionType = ConnectionType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ConnectionGeometry = tape[ptr++]; + let RelatingElement = tape[ptr++]; + let RelatedElement = tape[ptr++]; + let RealizingElements = tape[ptr++]; + let ConnectionType = tape[ptr++]; + return new IfcRelConnectsWithRealizingElements(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RealizingElements, ConnectionType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ConnectionGeometry); + ; + args.push(this.RelatingElement); + ; + args.push(this.RelatedElement); + ; + args.push(this.RealizingElements); + ; + args.push(this.ConnectionType); + ; + return args; + } +}; +var IfcRelContainedInSpatialStructure = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedElements = RelatedElements; + this.RelatingStructure = RelatingStructure; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedElements = tape[ptr++]; + let RelatingStructure = tape[ptr++]; + return new IfcRelContainedInSpatialStructure(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedElements); + ; + args.push(this.RelatingStructure); + ; + return args; + } +}; +var IfcRelCoversBldgElements = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedCoverings) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingBuildingElement = RelatingBuildingElement; + this.RelatedCoverings = RelatedCoverings; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingBuildingElement = tape[ptr++]; + let RelatedCoverings = tape[ptr++]; + return new IfcRelCoversBldgElements(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedCoverings); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingBuildingElement); + ; + args.push(this.RelatedCoverings); + ; + return args; + } +}; +var IfcRelCoversSpaces = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedCoverings) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingSpace = RelatingSpace; + this.RelatedCoverings = RelatedCoverings; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingSpace = tape[ptr++]; + let RelatedCoverings = tape[ptr++]; + return new IfcRelCoversSpaces(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedCoverings); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingSpace); + ; + args.push(this.RelatedCoverings); + ; + return args; + } +}; +var IfcRelDeclares = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingContext, RelatedDefinitions) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingContext = RelatingContext; + this.RelatedDefinitions = RelatedDefinitions; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingContext = tape[ptr++]; + let RelatedDefinitions = tape[ptr++]; + return new IfcRelDeclares(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingContext, RelatedDefinitions); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingContext); + ; + args.push(this.RelatedDefinitions); + ; + return args; + } +}; +var IfcRelDecomposes = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcRelDecomposes(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcRelDefines = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcRelDefines(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcRelDefinesByObject = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingObject) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingObject = RelatingObject; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingObject = tape[ptr++]; + return new IfcRelDefinesByObject(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingObject); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingObject); + ; + return args; + } +}; +var IfcRelDefinesByProperties = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingPropertyDefinition) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingPropertyDefinition = RelatingPropertyDefinition; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingPropertyDefinition = tape[ptr++]; + return new IfcRelDefinesByProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingPropertyDefinition); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingPropertyDefinition); + ; + return args; + } +}; +var IfcRelDefinesByTemplate = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedPropertySets, RelatingTemplate) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedPropertySets = RelatedPropertySets; + this.RelatingTemplate = RelatingTemplate; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedPropertySets = tape[ptr++]; + let RelatingTemplate = tape[ptr++]; + return new IfcRelDefinesByTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedPropertySets, RelatingTemplate); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedPropertySets); + ; + args.push(this.RelatingTemplate); + ; + return args; + } +}; +var IfcRelDefinesByType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedObjects = RelatedObjects; + this.RelatingType = RelatingType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + let RelatingType = tape[ptr++]; + return new IfcRelDefinesByType(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedObjects); + ; + args.push(this.RelatingType); + ; + return args; + } +}; +var IfcRelFillsElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingOpeningElement, RelatedBuildingElement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingOpeningElement = RelatingOpeningElement; + this.RelatedBuildingElement = RelatedBuildingElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingOpeningElement = tape[ptr++]; + let RelatedBuildingElement = tape[ptr++]; + return new IfcRelFillsElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingOpeningElement, RelatedBuildingElement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingOpeningElement); + ; + args.push(this.RelatedBuildingElement); + ; + return args; + } +}; +var IfcRelFlowControlElements = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedControlElements, RelatingFlowElement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedControlElements = RelatedControlElements; + this.RelatingFlowElement = RelatingFlowElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedControlElements = tape[ptr++]; + let RelatingFlowElement = tape[ptr++]; + return new IfcRelFlowControlElements(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedControlElements, RelatingFlowElement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedControlElements); + ; + args.push(this.RelatingFlowElement); + ; + return args; + } +}; +var IfcRelInterferesElements = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedElement, InterferenceGeometry, InterferenceType, ImpliedOrder) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingElement = RelatingElement; + this.RelatedElement = RelatedElement; + this.InterferenceGeometry = InterferenceGeometry; + this.InterferenceType = InterferenceType; + this.ImpliedOrder = ImpliedOrder; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingElement = tape[ptr++]; + let RelatedElement = tape[ptr++]; + let InterferenceGeometry = tape[ptr++]; + let InterferenceType = tape[ptr++]; + let ImpliedOrder = tape[ptr++]; + return new IfcRelInterferesElements(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedElement, InterferenceGeometry, InterferenceType, ImpliedOrder); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingElement); + ; + args.push(this.RelatedElement); + ; + args.push(this.InterferenceGeometry); + ; + args.push(this.InterferenceType); + ; + args.push(this.ImpliedOrder); + ; + return args; + } +}; +var IfcRelNests = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingObject = RelatingObject; + this.RelatedObjects = RelatedObjects; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingObject = tape[ptr++]; + let RelatedObjects = tape[ptr++]; + return new IfcRelNests(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingObject); + ; + args.push(this.RelatedObjects); + ; + return args; + } +}; +var IfcRelPositions = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPositioningElement, RelatedProducts) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingPositioningElement = RelatingPositioningElement; + this.RelatedProducts = RelatedProducts; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingPositioningElement = tape[ptr++]; + let RelatedProducts = tape[ptr++]; + return new IfcRelPositions(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPositioningElement, RelatedProducts); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingPositioningElement); + ; + args.push(this.RelatedProducts); + ; + return args; + } +}; +var IfcRelProjectsElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedFeatureElement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingElement = RelatingElement; + this.RelatedFeatureElement = RelatedFeatureElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingElement = tape[ptr++]; + let RelatedFeatureElement = tape[ptr++]; + return new IfcRelProjectsElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedFeatureElement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingElement); + ; + args.push(this.RelatedFeatureElement); + ; + return args; + } +}; +var IfcRelReferencedInSpatialStructure = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatedElements = RelatedElements; + this.RelatingStructure = RelatingStructure; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedElements = tape[ptr++]; + let RelatingStructure = tape[ptr++]; + return new IfcRelReferencedInSpatialStructure(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedElements); + ; + args.push(this.RelatingStructure); + ; + return args; + } +}; +var IfcRelSequence = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingProcess, RelatedProcess, TimeLag, SequenceType, UserDefinedSequenceType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingProcess = RelatingProcess; + this.RelatedProcess = RelatedProcess; + this.TimeLag = TimeLag; + this.SequenceType = SequenceType; + this.UserDefinedSequenceType = UserDefinedSequenceType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingProcess = tape[ptr++]; + let RelatedProcess = tape[ptr++]; + let TimeLag = tape[ptr++]; + let SequenceType = tape[ptr++]; + let UserDefinedSequenceType = tape[ptr++]; + return new IfcRelSequence(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingProcess, RelatedProcess, TimeLag, SequenceType, UserDefinedSequenceType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingProcess); + ; + args.push(this.RelatedProcess); + ; + args.push(this.TimeLag); + ; + args.push(this.SequenceType); + ; + args.push(this.UserDefinedSequenceType); + ; + return args; + } +}; +var IfcRelServicesBuildings = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSystem, RelatedBuildings) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingSystem = RelatingSystem; + this.RelatedBuildings = RelatedBuildings; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingSystem = tape[ptr++]; + let RelatedBuildings = tape[ptr++]; + return new IfcRelServicesBuildings(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSystem, RelatedBuildings); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingSystem); + ; + args.push(this.RelatedBuildings); + ; + return args; + } +}; +var IfcRelSpaceBoundary = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingSpace = RelatingSpace; + this.RelatedBuildingElement = RelatedBuildingElement; + this.ConnectionGeometry = ConnectionGeometry; + this.PhysicalOrVirtualBoundary = PhysicalOrVirtualBoundary; + this.InternalOrExternalBoundary = InternalOrExternalBoundary; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingSpace = tape[ptr++]; + let RelatedBuildingElement = tape[ptr++]; + let ConnectionGeometry = tape[ptr++]; + let PhysicalOrVirtualBoundary = tape[ptr++]; + let InternalOrExternalBoundary = tape[ptr++]; + return new IfcRelSpaceBoundary(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingSpace); + ; + args.push(this.RelatedBuildingElement); + ; + args.push(this.ConnectionGeometry); + ; + args.push(this.PhysicalOrVirtualBoundary); + ; + args.push(this.InternalOrExternalBoundary); + ; + return args; + } +}; +var IfcRelSpaceBoundary1stLevel = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingSpace = RelatingSpace; + this.RelatedBuildingElement = RelatedBuildingElement; + this.ConnectionGeometry = ConnectionGeometry; + this.PhysicalOrVirtualBoundary = PhysicalOrVirtualBoundary; + this.InternalOrExternalBoundary = InternalOrExternalBoundary; + this.ParentBoundary = ParentBoundary; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingSpace = tape[ptr++]; + let RelatedBuildingElement = tape[ptr++]; + let ConnectionGeometry = tape[ptr++]; + let PhysicalOrVirtualBoundary = tape[ptr++]; + let InternalOrExternalBoundary = tape[ptr++]; + let ParentBoundary = tape[ptr++]; + return new IfcRelSpaceBoundary1stLevel(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingSpace); + ; + args.push(this.RelatedBuildingElement); + ; + args.push(this.ConnectionGeometry); + ; + args.push(this.PhysicalOrVirtualBoundary); + ; + args.push(this.InternalOrExternalBoundary); + ; + args.push(this.ParentBoundary); + ; + return args; + } +}; +var IfcRelSpaceBoundary2ndLevel = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary, CorrespondingBoundary) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingSpace = RelatingSpace; + this.RelatedBuildingElement = RelatedBuildingElement; + this.ConnectionGeometry = ConnectionGeometry; + this.PhysicalOrVirtualBoundary = PhysicalOrVirtualBoundary; + this.InternalOrExternalBoundary = InternalOrExternalBoundary; + this.ParentBoundary = ParentBoundary; + this.CorrespondingBoundary = CorrespondingBoundary; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingSpace = tape[ptr++]; + let RelatedBuildingElement = tape[ptr++]; + let ConnectionGeometry = tape[ptr++]; + let PhysicalOrVirtualBoundary = tape[ptr++]; + let InternalOrExternalBoundary = tape[ptr++]; + let ParentBoundary = tape[ptr++]; + let CorrespondingBoundary = tape[ptr++]; + return new IfcRelSpaceBoundary2ndLevel(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary, CorrespondingBoundary); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingSpace); + ; + args.push(this.RelatedBuildingElement); + ; + args.push(this.ConnectionGeometry); + ; + args.push(this.PhysicalOrVirtualBoundary); + ; + args.push(this.InternalOrExternalBoundary); + ; + args.push(this.ParentBoundary); + ; + args.push(this.CorrespondingBoundary); + ; + return args; + } +}; +var IfcRelVoidsElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedOpeningElement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.RelatingBuildingElement = RelatingBuildingElement; + this.RelatedOpeningElement = RelatedOpeningElement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingBuildingElement = tape[ptr++]; + let RelatedOpeningElement = tape[ptr++]; + return new IfcRelVoidsElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedOpeningElement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingBuildingElement); + ; + args.push(this.RelatedOpeningElement); + ; + return args; + } +}; +var IfcRelationship = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcRelationship(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcReparametrisedCompositeCurveSegment = class { + constructor(expressID, type, Transition, SameSense, ParentCurve, ParamLength) { + this.expressID = expressID; + this.type = type; + this.Transition = Transition; + this.SameSense = SameSense; + this.ParentCurve = ParentCurve; + this.ParamLength = ParamLength; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Transition = tape[ptr++]; + let SameSense = tape[ptr++]; + let ParentCurve = tape[ptr++]; + let ParamLength = tape[ptr++]; + return new IfcReparametrisedCompositeCurveSegment(expressID, type, Transition, SameSense, ParentCurve, ParamLength); + } + ToTape() { + let args = []; + args.push(this.Transition); + ; + args.push(this.SameSense); + ; + args.push(this.ParentCurve); + ; + args.push(this.ParamLength); + ; + return args; + } +}; +var IfcRepresentation = class { + constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) { + this.expressID = expressID; + this.type = type; + this.ContextOfItems = ContextOfItems; + this.RepresentationIdentifier = RepresentationIdentifier; + this.RepresentationType = RepresentationType; + this.Items = Items; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextOfItems = tape[ptr++]; + let RepresentationIdentifier = tape[ptr++]; + let RepresentationType = tape[ptr++]; + let Items = tape[ptr++]; + return new IfcRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items); + } + ToTape() { + let args = []; + args.push(this.ContextOfItems); + ; + args.push(this.RepresentationIdentifier); + ; + args.push(this.RepresentationType); + ; + args.push(this.Items); + ; + return args; + } +}; +var IfcRepresentationContext = class { + constructor(expressID, type, ContextIdentifier, ContextType) { + this.expressID = expressID; + this.type = type; + this.ContextIdentifier = ContextIdentifier; + this.ContextType = ContextType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextIdentifier = tape[ptr++]; + let ContextType = tape[ptr++]; + return new IfcRepresentationContext(expressID, type, ContextIdentifier, ContextType); + } + ToTape() { + let args = []; + args.push(this.ContextIdentifier); + ; + args.push(this.ContextType); + ; + return args; + } +}; +var IfcRepresentationItem = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcRepresentationItem(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcRepresentationMap = class { + constructor(expressID, type, MappingOrigin, MappedRepresentation) { + this.expressID = expressID; + this.type = type; + this.MappingOrigin = MappingOrigin; + this.MappedRepresentation = MappedRepresentation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let MappingOrigin = tape[ptr++]; + let MappedRepresentation = tape[ptr++]; + return new IfcRepresentationMap(expressID, type, MappingOrigin, MappedRepresentation); + } + ToTape() { + let args = []; + args.push(this.MappingOrigin); + ; + args.push(this.MappedRepresentation); + ; + return args; + } +}; +var IfcResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + return new IfcResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + return args; + } +}; +var IfcResourceApprovalRelationship = class { + constructor(expressID, type, Name, Description, RelatedResourceObjects, RelatingApproval) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatedResourceObjects = RelatedResourceObjects; + this.RelatingApproval = RelatingApproval; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatedResourceObjects = tape[ptr++]; + let RelatingApproval = tape[ptr++]; + return new IfcResourceApprovalRelationship(expressID, type, Name, Description, RelatedResourceObjects, RelatingApproval); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatedResourceObjects); + ; + args.push(this.RelatingApproval); + ; + return args; + } +}; +var IfcResourceConstraintRelationship = class { + constructor(expressID, type, Name, Description, RelatingConstraint, RelatedResourceObjects) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.RelatingConstraint = RelatingConstraint; + this.RelatedResourceObjects = RelatedResourceObjects; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let RelatingConstraint = tape[ptr++]; + let RelatedResourceObjects = tape[ptr++]; + return new IfcResourceConstraintRelationship(expressID, type, Name, Description, RelatingConstraint, RelatedResourceObjects); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.RelatingConstraint); + ; + args.push(this.RelatedResourceObjects); + ; + return args; + } +}; +var IfcResourceLevelRelationship = class { + constructor(expressID, type, Name, Description) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcResourceLevelRelationship(expressID, type, Name, Description); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcResourceTime = class { + constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ScheduleWork, ScheduleUsage, ScheduleStart, ScheduleFinish, ScheduleContour, LevelingDelay, IsOverAllocated, StatusTime, ActualWork, ActualUsage, ActualStart, ActualFinish, RemainingWork, RemainingUsage, Completion) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.ScheduleWork = ScheduleWork; + this.ScheduleUsage = ScheduleUsage; + this.ScheduleStart = ScheduleStart; + this.ScheduleFinish = ScheduleFinish; + this.ScheduleContour = ScheduleContour; + this.LevelingDelay = LevelingDelay; + this.IsOverAllocated = IsOverAllocated; + this.StatusTime = StatusTime; + this.ActualWork = ActualWork; + this.ActualUsage = ActualUsage; + this.ActualStart = ActualStart; + this.ActualFinish = ActualFinish; + this.RemainingWork = RemainingWork; + this.RemainingUsage = RemainingUsage; + this.Completion = Completion; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let ScheduleWork = tape[ptr++]; + let ScheduleUsage = tape[ptr++]; + let ScheduleStart = tape[ptr++]; + let ScheduleFinish = tape[ptr++]; + let ScheduleContour = tape[ptr++]; + let LevelingDelay = tape[ptr++]; + let IsOverAllocated = tape[ptr++]; + let StatusTime = tape[ptr++]; + let ActualWork = tape[ptr++]; + let ActualUsage = tape[ptr++]; + let ActualStart = tape[ptr++]; + let ActualFinish = tape[ptr++]; + let RemainingWork = tape[ptr++]; + let RemainingUsage = tape[ptr++]; + let Completion = tape[ptr++]; + return new IfcResourceTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ScheduleWork, ScheduleUsage, ScheduleStart, ScheduleFinish, ScheduleContour, LevelingDelay, IsOverAllocated, StatusTime, ActualWork, ActualUsage, ActualStart, ActualFinish, RemainingWork, RemainingUsage, Completion); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.ScheduleWork); + ; + args.push(this.ScheduleUsage); + ; + args.push(this.ScheduleStart); + ; + args.push(this.ScheduleFinish); + ; + args.push(this.ScheduleContour); + ; + args.push(this.LevelingDelay); + ; + args.push(this.IsOverAllocated); + ; + args.push(this.StatusTime); + ; + args.push(this.ActualWork); + ; + args.push(this.ActualUsage); + ; + args.push(this.ActualStart); + ; + args.push(this.ActualFinish); + ; + args.push(this.RemainingWork); + ; + args.push(this.RemainingUsage); + ; + args.push(this.Completion); + ; + return args; + } +}; +var IfcRevolvedAreaSolid = class { + constructor(expressID, type, SweptArea, Position, Axis, Angle) { + this.expressID = expressID; + this.type = type; + this.SweptArea = SweptArea; + this.Position = Position; + this.Axis = Axis; + this.Angle = Angle; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptArea = tape[ptr++]; + let Position = tape[ptr++]; + let Axis = tape[ptr++]; + let Angle = tape[ptr++]; + return new IfcRevolvedAreaSolid(expressID, type, SweptArea, Position, Axis, Angle); + } + ToTape() { + let args = []; + args.push(this.SweptArea); + ; + args.push(this.Position); + ; + args.push(this.Axis); + ; + args.push(this.Angle); + ; + return args; + } +}; +var IfcRevolvedAreaSolidTapered = class { + constructor(expressID, type, SweptArea, Position, Axis, Angle, EndSweptArea) { + this.expressID = expressID; + this.type = type; + this.SweptArea = SweptArea; + this.Position = Position; + this.Axis = Axis; + this.Angle = Angle; + this.EndSweptArea = EndSweptArea; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptArea = tape[ptr++]; + let Position = tape[ptr++]; + let Axis = tape[ptr++]; + let Angle = tape[ptr++]; + let EndSweptArea = tape[ptr++]; + return new IfcRevolvedAreaSolidTapered(expressID, type, SweptArea, Position, Axis, Angle, EndSweptArea); + } + ToTape() { + let args = []; + args.push(this.SweptArea); + ; + args.push(this.Position); + ; + args.push(this.Axis); + ; + args.push(this.Angle); + ; + args.push(this.EndSweptArea); + ; + return args; + } +}; +var IfcRightCircularCone = class { + constructor(expressID, type, Position, Height, BottomRadius) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.Height = Height; + this.BottomRadius = BottomRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let Height = tape[ptr++]; + let BottomRadius = tape[ptr++]; + return new IfcRightCircularCone(expressID, type, Position, Height, BottomRadius); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.Height); + ; + args.push(this.BottomRadius); + ; + return args; + } +}; +var IfcRightCircularCylinder = class { + constructor(expressID, type, Position, Height, Radius) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.Height = Height; + this.Radius = Radius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let Height = tape[ptr++]; + let Radius = tape[ptr++]; + return new IfcRightCircularCylinder(expressID, type, Position, Height, Radius); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.Height); + ; + args.push(this.Radius); + ; + return args; + } +}; +var IfcRoof = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRoof(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRoofType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcRoofType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcRoot = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcRoot(expressID, type, GlobalId, OwnerHistory, Name, Description); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcRoundedRectangleProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, RoundingRadius) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.XDim = XDim; + this.YDim = YDim; + this.RoundingRadius = RoundingRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let XDim = tape[ptr++]; + let YDim = tape[ptr++]; + let RoundingRadius = tape[ptr++]; + return new IfcRoundedRectangleProfileDef(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, RoundingRadius); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.XDim); + ; + args.push(this.YDim); + ; + args.push(this.RoundingRadius); + ; + return args; + } +}; +var IfcSIUnit = class { + constructor(expressID, type, Dimensions, UnitType, Prefix, Name) { + this.expressID = expressID; + this.type = type; + this.Dimensions = Dimensions; + this.UnitType = UnitType; + this.Prefix = Prefix; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Dimensions = tape[ptr++]; + let UnitType = tape[ptr++]; + let Prefix = tape[ptr++]; + let Name = tape[ptr++]; + return new IfcSIUnit(expressID, type, Dimensions, UnitType, Prefix, Name); + } + ToTape() { + let args = []; + args.push(this.Dimensions); + ; + args.push(this.UnitType); + ; + args.push(this.Prefix); + ; + args.push(this.Name); + ; + return args; + } +}; +var IfcSanitaryTerminal = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSanitaryTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSanitaryTerminalType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSanitaryTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSchedulingTime = class { + constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + return new IfcSchedulingTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + return args; + } +}; +var IfcSeamCurve = class { + constructor(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation) { + this.expressID = expressID; + this.type = type; + this.Curve3D = Curve3D; + this.AssociatedGeometry = AssociatedGeometry; + this.MasterRepresentation = MasterRepresentation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Curve3D = tape[ptr++]; + let AssociatedGeometry = tape[ptr++]; + let MasterRepresentation = tape[ptr++]; + return new IfcSeamCurve(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation); + } + ToTape() { + let args = []; + args.push(this.Curve3D); + ; + args.push(this.AssociatedGeometry); + ; + args.push(this.MasterRepresentation); + ; + return args; + } +}; +var IfcSectionProperties = class { + constructor(expressID, type, SectionType, StartProfile, EndProfile) { + this.expressID = expressID; + this.type = type; + this.SectionType = SectionType; + this.StartProfile = StartProfile; + this.EndProfile = EndProfile; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SectionType = tape[ptr++]; + let StartProfile = tape[ptr++]; + let EndProfile = tape[ptr++]; + return new IfcSectionProperties(expressID, type, SectionType, StartProfile, EndProfile); + } + ToTape() { + let args = []; + args.push(this.SectionType); + ; + args.push(this.StartProfile); + ; + args.push(this.EndProfile); + ; + return args; + } +}; +var IfcSectionReinforcementProperties = class { + constructor(expressID, type, LongitudinalStartPosition, LongitudinalEndPosition, TransversePosition, ReinforcementRole, SectionDefinition, CrossSectionReinforcementDefinitions) { + this.expressID = expressID; + this.type = type; + this.LongitudinalStartPosition = LongitudinalStartPosition; + this.LongitudinalEndPosition = LongitudinalEndPosition; + this.TransversePosition = TransversePosition; + this.ReinforcementRole = ReinforcementRole; + this.SectionDefinition = SectionDefinition; + this.CrossSectionReinforcementDefinitions = CrossSectionReinforcementDefinitions; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let LongitudinalStartPosition = tape[ptr++]; + let LongitudinalEndPosition = tape[ptr++]; + let TransversePosition = tape[ptr++]; + let ReinforcementRole = tape[ptr++]; + let SectionDefinition = tape[ptr++]; + let CrossSectionReinforcementDefinitions = tape[ptr++]; + return new IfcSectionReinforcementProperties(expressID, type, LongitudinalStartPosition, LongitudinalEndPosition, TransversePosition, ReinforcementRole, SectionDefinition, CrossSectionReinforcementDefinitions); + } + ToTape() { + let args = []; + args.push(this.LongitudinalStartPosition); + ; + args.push(this.LongitudinalEndPosition); + ; + args.push(this.TransversePosition); + ; + args.push(this.ReinforcementRole); + ; + args.push(this.SectionDefinition); + ; + args.push(this.CrossSectionReinforcementDefinitions); + ; + return args; + } +}; +var IfcSectionedSolid = class { + constructor(expressID, type, Directrix, CrossSections) { + this.expressID = expressID; + this.type = type; + this.Directrix = Directrix; + this.CrossSections = CrossSections; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Directrix = tape[ptr++]; + let CrossSections = tape[ptr++]; + return new IfcSectionedSolid(expressID, type, Directrix, CrossSections); + } + ToTape() { + let args = []; + args.push(this.Directrix); + ; + args.push(this.CrossSections); + ; + return args; + } +}; +var IfcSectionedSolidHorizontal = class { + constructor(expressID, type, Directrix, CrossSections, CrossSectionPositions, FixedAxisVertical) { + this.expressID = expressID; + this.type = type; + this.Directrix = Directrix; + this.CrossSections = CrossSections; + this.CrossSectionPositions = CrossSectionPositions; + this.FixedAxisVertical = FixedAxisVertical; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Directrix = tape[ptr++]; + let CrossSections = tape[ptr++]; + let CrossSectionPositions = tape[ptr++]; + let FixedAxisVertical = tape[ptr++]; + return new IfcSectionedSolidHorizontal(expressID, type, Directrix, CrossSections, CrossSectionPositions, FixedAxisVertical); + } + ToTape() { + let args = []; + args.push(this.Directrix); + ; + args.push(this.CrossSections); + ; + args.push(this.CrossSectionPositions); + ; + args.push(this.FixedAxisVertical); + ; + return args; + } +}; +var IfcSectionedSpine = class { + constructor(expressID, type, SpineCurve, CrossSections, CrossSectionPositions) { + this.expressID = expressID; + this.type = type; + this.SpineCurve = SpineCurve; + this.CrossSections = CrossSections; + this.CrossSectionPositions = CrossSectionPositions; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SpineCurve = tape[ptr++]; + let CrossSections = tape[ptr++]; + let CrossSectionPositions = tape[ptr++]; + return new IfcSectionedSpine(expressID, type, SpineCurve, CrossSections, CrossSectionPositions); + } + ToTape() { + let args = []; + args.push(this.SpineCurve); + ; + args.push(this.CrossSections); + ; + args.push(this.CrossSectionPositions); + ; + return args; + } +}; +var IfcSensor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSensor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSensorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSensorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcShadingDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcShadingDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcShadingDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcShadingDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcShapeAspect = class { + constructor(expressID, type, ShapeRepresentations, Name, Description, ProductDefinitional, PartOfProductDefinitionShape) { + this.expressID = expressID; + this.type = type; + this.ShapeRepresentations = ShapeRepresentations; + this.Name = Name; + this.Description = Description; + this.ProductDefinitional = ProductDefinitional; + this.PartOfProductDefinitionShape = PartOfProductDefinitionShape; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ShapeRepresentations = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ProductDefinitional = tape[ptr++]; + let PartOfProductDefinitionShape = tape[ptr++]; + return new IfcShapeAspect(expressID, type, ShapeRepresentations, Name, Description, ProductDefinitional, PartOfProductDefinitionShape); + } + ToTape() { + let args = []; + args.push(this.ShapeRepresentations); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ProductDefinitional); + ; + args.push(this.PartOfProductDefinitionShape); + ; + return args; + } +}; +var IfcShapeModel = class { + constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) { + this.expressID = expressID; + this.type = type; + this.ContextOfItems = ContextOfItems; + this.RepresentationIdentifier = RepresentationIdentifier; + this.RepresentationType = RepresentationType; + this.Items = Items; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextOfItems = tape[ptr++]; + let RepresentationIdentifier = tape[ptr++]; + let RepresentationType = tape[ptr++]; + let Items = tape[ptr++]; + return new IfcShapeModel(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items); + } + ToTape() { + let args = []; + args.push(this.ContextOfItems); + ; + args.push(this.RepresentationIdentifier); + ; + args.push(this.RepresentationType); + ; + args.push(this.Items); + ; + return args; + } +}; +var IfcShapeRepresentation = class { + constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) { + this.expressID = expressID; + this.type = type; + this.ContextOfItems = ContextOfItems; + this.RepresentationIdentifier = RepresentationIdentifier; + this.RepresentationType = RepresentationType; + this.Items = Items; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextOfItems = tape[ptr++]; + let RepresentationIdentifier = tape[ptr++]; + let RepresentationType = tape[ptr++]; + let Items = tape[ptr++]; + return new IfcShapeRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items); + } + ToTape() { + let args = []; + args.push(this.ContextOfItems); + ; + args.push(this.RepresentationIdentifier); + ; + args.push(this.RepresentationType); + ; + args.push(this.Items); + ; + return args; + } +}; +var IfcShellBasedSurfaceModel = class { + constructor(expressID, type, SbsmBoundary) { + this.expressID = expressID; + this.type = type; + this.SbsmBoundary = SbsmBoundary; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SbsmBoundary = tape[ptr++]; + return new IfcShellBasedSurfaceModel(expressID, type, SbsmBoundary); + } + ToTape() { + let args = []; + args.push(this.SbsmBoundary); + ; + return args; + } +}; +var IfcSimpleProperty = class { + constructor(expressID, type, Name, Description) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + return new IfcSimpleProperty(expressID, type, Name, Description); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + return args; + } +}; +var IfcSimplePropertyTemplate = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, PrimaryMeasureType, SecondaryMeasureType, Enumerators, PrimaryUnit, SecondaryUnit, Expression, AccessState) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.TemplateType = TemplateType; + this.PrimaryMeasureType = PrimaryMeasureType; + this.SecondaryMeasureType = SecondaryMeasureType; + this.Enumerators = Enumerators; + this.PrimaryUnit = PrimaryUnit; + this.SecondaryUnit = SecondaryUnit; + this.Expression = Expression; + this.AccessState = AccessState; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let TemplateType = tape[ptr++]; + let PrimaryMeasureType = tape[ptr++]; + let SecondaryMeasureType = tape[ptr++]; + let Enumerators = tape[ptr++]; + let PrimaryUnit = tape[ptr++]; + let SecondaryUnit = tape[ptr++]; + let Expression = tape[ptr++]; + let AccessState = tape[ptr++]; + return new IfcSimplePropertyTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, PrimaryMeasureType, SecondaryMeasureType, Enumerators, PrimaryUnit, SecondaryUnit, Expression, AccessState); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.TemplateType); + ; + args.push(this.PrimaryMeasureType); + ; + args.push(this.SecondaryMeasureType); + ; + args.push(this.Enumerators); + ; + args.push(this.PrimaryUnit); + ; + args.push(this.SecondaryUnit); + ; + args.push(this.Expression); + ; + args.push(this.AccessState); + ; + return args; + } +}; +var IfcSite = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, RefLatitude, RefLongitude, RefElevation, LandTitleNumber, SiteAddress) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + this.RefLatitude = RefLatitude; + this.RefLongitude = RefLongitude; + this.RefElevation = RefElevation; + this.LandTitleNumber = LandTitleNumber; + this.SiteAddress = SiteAddress; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + let RefLatitude = tape[ptr++]; + let RefLongitude = tape[ptr++]; + let RefElevation = tape[ptr++]; + let LandTitleNumber = tape[ptr++]; + let SiteAddress = tape[ptr++]; + return new IfcSite(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, RefLatitude, RefLongitude, RefElevation, LandTitleNumber, SiteAddress); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + args.push(this.RefLatitude); + ; + args.push(this.RefLongitude); + ; + args.push(this.RefElevation); + ; + args.push(this.LandTitleNumber); + ; + args.push(this.SiteAddress); + ; + return args; + } +}; +var IfcSlab = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSlab(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSlabElementedCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSlabElementedCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSlabStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSlabStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSlabType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSlabType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSlippageConnectionCondition = class { + constructor(expressID, type, Name, SlippageX, SlippageY, SlippageZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.SlippageX = SlippageX; + this.SlippageY = SlippageY; + this.SlippageZ = SlippageZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let SlippageX = tape[ptr++]; + let SlippageY = tape[ptr++]; + let SlippageZ = tape[ptr++]; + return new IfcSlippageConnectionCondition(expressID, type, Name, SlippageX, SlippageY, SlippageZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.SlippageX); + ; + args.push(this.SlippageY); + ; + args.push(this.SlippageZ); + ; + return args; + } +}; +var IfcSolarDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSolarDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSolarDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSolarDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSolidModel = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcSolidModel(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcSpace = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType, ElevationWithFlooring) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + this.PredefinedType = PredefinedType; + this.ElevationWithFlooring = ElevationWithFlooring; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let ElevationWithFlooring = tape[ptr++]; + return new IfcSpace(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType, ElevationWithFlooring); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + args.push(this.PredefinedType); + ; + args.push(this.ElevationWithFlooring); + ; + return args; + } +}; +var IfcSpaceHeater = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSpaceHeater(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSpaceHeaterType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSpaceHeaterType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSpaceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.LongName = LongName; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let LongName = tape[ptr++]; + return new IfcSpaceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.LongName); + ; + return args; + } +}; +var IfcSpatialElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + return new IfcSpatialElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + return args; + } +}; +var IfcSpatialElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcSpatialElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcSpatialStructureElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.CompositionType = CompositionType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let CompositionType = tape[ptr++]; + return new IfcSpatialStructureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.CompositionType); + ; + return args; + } +}; +var IfcSpatialStructureElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + return new IfcSpatialStructureElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + return args; + } +}; +var IfcSpatialZone = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.LongName = LongName; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let LongName = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSpatialZone(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.LongName); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSpatialZoneType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.LongName = LongName; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let LongName = tape[ptr++]; + return new IfcSpatialZoneType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.LongName); + ; + return args; + } +}; +var IfcSphere = class { + constructor(expressID, type, Position, Radius) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.Radius = Radius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + return new IfcSphere(expressID, type, Position, Radius); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.Radius); + ; + return args; + } +}; +var IfcSphericalSurface = class { + constructor(expressID, type, Position, Radius) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.Radius = Radius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let Radius = tape[ptr++]; + return new IfcSphericalSurface(expressID, type, Position, Radius); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.Radius); + ; + return args; + } +}; +var IfcStackTerminal = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStackTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStackTerminalType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStackTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStair = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStair(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStairFlight = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NumberOfRisers, NumberOfTreads, RiserHeight, TreadLength, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.NumberOfRisers = NumberOfRisers; + this.NumberOfTreads = NumberOfTreads; + this.RiserHeight = RiserHeight; + this.TreadLength = TreadLength; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let NumberOfRisers = tape[ptr++]; + let NumberOfTreads = tape[ptr++]; + let RiserHeight = tape[ptr++]; + let TreadLength = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStairFlight(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NumberOfRisers, NumberOfTreads, RiserHeight, TreadLength, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.NumberOfRisers); + ; + args.push(this.NumberOfTreads); + ; + args.push(this.RiserHeight); + ; + args.push(this.TreadLength); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStairFlightType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStairFlightType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStairType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStairType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStructuralAction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.DestabilizingLoad = DestabilizingLoad; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let DestabilizingLoad = tape[ptr++]; + return new IfcStructuralAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.DestabilizingLoad); + ; + return args; + } +}; +var IfcStructuralActivity = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + return new IfcStructuralActivity(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + return args; + } +}; +var IfcStructuralAnalysisModel = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, OrientationOf2DPlane, LoadedBy, HasResults, SharedPlacement) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.PredefinedType = PredefinedType; + this.OrientationOf2DPlane = OrientationOf2DPlane; + this.LoadedBy = LoadedBy; + this.HasResults = HasResults; + this.SharedPlacement = SharedPlacement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let OrientationOf2DPlane = tape[ptr++]; + let LoadedBy = tape[ptr++]; + let HasResults = tape[ptr++]; + let SharedPlacement = tape[ptr++]; + return new IfcStructuralAnalysisModel(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, OrientationOf2DPlane, LoadedBy, HasResults, SharedPlacement); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.PredefinedType); + ; + args.push(this.OrientationOf2DPlane); + ; + args.push(this.LoadedBy); + ; + args.push(this.HasResults); + ; + args.push(this.SharedPlacement); + ; + return args; + } +}; +var IfcStructuralConnection = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedCondition = AppliedCondition; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedCondition = tape[ptr++]; + return new IfcStructuralConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedCondition); + ; + return args; + } +}; +var IfcStructuralConnectionCondition = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcStructuralConnectionCondition(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcStructuralCurveAction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.DestabilizingLoad = DestabilizingLoad; + this.ProjectedOrTrue = ProjectedOrTrue; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let DestabilizingLoad = tape[ptr++]; + let ProjectedOrTrue = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStructuralCurveAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.DestabilizingLoad); + ; + args.push(this.ProjectedOrTrue); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStructuralCurveConnection = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, Axis) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedCondition = AppliedCondition; + this.Axis = Axis; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedCondition = tape[ptr++]; + let Axis = tape[ptr++]; + return new IfcStructuralCurveConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, Axis); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedCondition); + ; + args.push(this.Axis); + ; + return args; + } +}; +var IfcStructuralCurveMember = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.PredefinedType = PredefinedType; + this.Axis = Axis; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Axis = tape[ptr++]; + return new IfcStructuralCurveMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.PredefinedType); + ; + args.push(this.Axis); + ; + return args; + } +}; +var IfcStructuralCurveMemberVarying = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.PredefinedType = PredefinedType; + this.Axis = Axis; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Axis = tape[ptr++]; + return new IfcStructuralCurveMemberVarying(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.PredefinedType); + ; + args.push(this.Axis); + ; + return args; + } +}; +var IfcStructuralCurveReaction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStructuralCurveReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStructuralItem = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + return new IfcStructuralItem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + return args; + } +}; +var IfcStructuralLinearAction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.DestabilizingLoad = DestabilizingLoad; + this.ProjectedOrTrue = ProjectedOrTrue; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let DestabilizingLoad = tape[ptr++]; + let ProjectedOrTrue = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStructuralLinearAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.DestabilizingLoad); + ; + args.push(this.ProjectedOrTrue); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStructuralLoad = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcStructuralLoad(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcStructuralLoadCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose, SelfWeightCoefficients) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.PredefinedType = PredefinedType; + this.ActionType = ActionType; + this.ActionSource = ActionSource; + this.Coefficient = Coefficient; + this.Purpose = Purpose; + this.SelfWeightCoefficients = SelfWeightCoefficients; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let ActionType = tape[ptr++]; + let ActionSource = tape[ptr++]; + let Coefficient = tape[ptr++]; + let Purpose = tape[ptr++]; + let SelfWeightCoefficients = tape[ptr++]; + return new IfcStructuralLoadCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose, SelfWeightCoefficients); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.PredefinedType); + ; + args.push(this.ActionType); + ; + args.push(this.ActionSource); + ; + args.push(this.Coefficient); + ; + args.push(this.Purpose); + ; + args.push(this.SelfWeightCoefficients); + ; + return args; + } +}; +var IfcStructuralLoadConfiguration = class { + constructor(expressID, type, Name, Values, Locations) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Values = Values; + this.Locations = Locations; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Values = tape[ptr++]; + let Locations = tape[ptr++]; + return new IfcStructuralLoadConfiguration(expressID, type, Name, Values, Locations); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Values); + ; + args.push(this.Locations); + ; + return args; + } +}; +var IfcStructuralLoadGroup = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.PredefinedType = PredefinedType; + this.ActionType = ActionType; + this.ActionSource = ActionSource; + this.Coefficient = Coefficient; + this.Purpose = Purpose; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let ActionType = tape[ptr++]; + let ActionSource = tape[ptr++]; + let Coefficient = tape[ptr++]; + let Purpose = tape[ptr++]; + return new IfcStructuralLoadGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.PredefinedType); + ; + args.push(this.ActionType); + ; + args.push(this.ActionSource); + ; + args.push(this.Coefficient); + ; + args.push(this.Purpose); + ; + return args; + } +}; +var IfcStructuralLoadLinearForce = class { + constructor(expressID, type, Name, LinearForceX, LinearForceY, LinearForceZ, LinearMomentX, LinearMomentY, LinearMomentZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.LinearForceX = LinearForceX; + this.LinearForceY = LinearForceY; + this.LinearForceZ = LinearForceZ; + this.LinearMomentX = LinearMomentX; + this.LinearMomentY = LinearMomentY; + this.LinearMomentZ = LinearMomentZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let LinearForceX = tape[ptr++]; + let LinearForceY = tape[ptr++]; + let LinearForceZ = tape[ptr++]; + let LinearMomentX = tape[ptr++]; + let LinearMomentY = tape[ptr++]; + let LinearMomentZ = tape[ptr++]; + return new IfcStructuralLoadLinearForce(expressID, type, Name, LinearForceX, LinearForceY, LinearForceZ, LinearMomentX, LinearMomentY, LinearMomentZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.LinearForceX); + ; + args.push(this.LinearForceY); + ; + args.push(this.LinearForceZ); + ; + args.push(this.LinearMomentX); + ; + args.push(this.LinearMomentY); + ; + args.push(this.LinearMomentZ); + ; + return args; + } +}; +var IfcStructuralLoadOrResult = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcStructuralLoadOrResult(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcStructuralLoadPlanarForce = class { + constructor(expressID, type, Name, PlanarForceX, PlanarForceY, PlanarForceZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.PlanarForceX = PlanarForceX; + this.PlanarForceY = PlanarForceY; + this.PlanarForceZ = PlanarForceZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let PlanarForceX = tape[ptr++]; + let PlanarForceY = tape[ptr++]; + let PlanarForceZ = tape[ptr++]; + return new IfcStructuralLoadPlanarForce(expressID, type, Name, PlanarForceX, PlanarForceY, PlanarForceZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.PlanarForceX); + ; + args.push(this.PlanarForceY); + ; + args.push(this.PlanarForceZ); + ; + return args; + } +}; +var IfcStructuralLoadSingleDisplacement = class { + constructor(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DisplacementX = DisplacementX; + this.DisplacementY = DisplacementY; + this.DisplacementZ = DisplacementZ; + this.RotationalDisplacementRX = RotationalDisplacementRX; + this.RotationalDisplacementRY = RotationalDisplacementRY; + this.RotationalDisplacementRZ = RotationalDisplacementRZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DisplacementX = tape[ptr++]; + let DisplacementY = tape[ptr++]; + let DisplacementZ = tape[ptr++]; + let RotationalDisplacementRX = tape[ptr++]; + let RotationalDisplacementRY = tape[ptr++]; + let RotationalDisplacementRZ = tape[ptr++]; + return new IfcStructuralLoadSingleDisplacement(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DisplacementX); + ; + args.push(this.DisplacementY); + ; + args.push(this.DisplacementZ); + ; + args.push(this.RotationalDisplacementRX); + ; + args.push(this.RotationalDisplacementRY); + ; + args.push(this.RotationalDisplacementRZ); + ; + return args; + } +}; +var IfcStructuralLoadSingleDisplacementDistortion = class { + constructor(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ, Distortion) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DisplacementX = DisplacementX; + this.DisplacementY = DisplacementY; + this.DisplacementZ = DisplacementZ; + this.RotationalDisplacementRX = RotationalDisplacementRX; + this.RotationalDisplacementRY = RotationalDisplacementRY; + this.RotationalDisplacementRZ = RotationalDisplacementRZ; + this.Distortion = Distortion; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DisplacementX = tape[ptr++]; + let DisplacementY = tape[ptr++]; + let DisplacementZ = tape[ptr++]; + let RotationalDisplacementRX = tape[ptr++]; + let RotationalDisplacementRY = tape[ptr++]; + let RotationalDisplacementRZ = tape[ptr++]; + let Distortion = tape[ptr++]; + return new IfcStructuralLoadSingleDisplacementDistortion(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ, Distortion); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DisplacementX); + ; + args.push(this.DisplacementY); + ; + args.push(this.DisplacementZ); + ; + args.push(this.RotationalDisplacementRX); + ; + args.push(this.RotationalDisplacementRY); + ; + args.push(this.RotationalDisplacementRZ); + ; + args.push(this.Distortion); + ; + return args; + } +}; +var IfcStructuralLoadSingleForce = class { + constructor(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.ForceX = ForceX; + this.ForceY = ForceY; + this.ForceZ = ForceZ; + this.MomentX = MomentX; + this.MomentY = MomentY; + this.MomentZ = MomentZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let ForceX = tape[ptr++]; + let ForceY = tape[ptr++]; + let ForceZ = tape[ptr++]; + let MomentX = tape[ptr++]; + let MomentY = tape[ptr++]; + let MomentZ = tape[ptr++]; + return new IfcStructuralLoadSingleForce(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.ForceX); + ; + args.push(this.ForceY); + ; + args.push(this.ForceZ); + ; + args.push(this.MomentX); + ; + args.push(this.MomentY); + ; + args.push(this.MomentZ); + ; + return args; + } +}; +var IfcStructuralLoadSingleForceWarping = class { + constructor(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ, WarpingMoment) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.ForceX = ForceX; + this.ForceY = ForceY; + this.ForceZ = ForceZ; + this.MomentX = MomentX; + this.MomentY = MomentY; + this.MomentZ = MomentZ; + this.WarpingMoment = WarpingMoment; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let ForceX = tape[ptr++]; + let ForceY = tape[ptr++]; + let ForceZ = tape[ptr++]; + let MomentX = tape[ptr++]; + let MomentY = tape[ptr++]; + let MomentZ = tape[ptr++]; + let WarpingMoment = tape[ptr++]; + return new IfcStructuralLoadSingleForceWarping(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ, WarpingMoment); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.ForceX); + ; + args.push(this.ForceY); + ; + args.push(this.ForceZ); + ; + args.push(this.MomentX); + ; + args.push(this.MomentY); + ; + args.push(this.MomentZ); + ; + args.push(this.WarpingMoment); + ; + return args; + } +}; +var IfcStructuralLoadStatic = class { + constructor(expressID, type, Name) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + return new IfcStructuralLoadStatic(expressID, type, Name); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + return args; + } +}; +var IfcStructuralLoadTemperature = class { + constructor(expressID, type, Name, DeltaTConstant, DeltaTY, DeltaTZ) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DeltaTConstant = DeltaTConstant; + this.DeltaTY = DeltaTY; + this.DeltaTZ = DeltaTZ; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DeltaTConstant = tape[ptr++]; + let DeltaTY = tape[ptr++]; + let DeltaTZ = tape[ptr++]; + return new IfcStructuralLoadTemperature(expressID, type, Name, DeltaTConstant, DeltaTY, DeltaTZ); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DeltaTConstant); + ; + args.push(this.DeltaTY); + ; + args.push(this.DeltaTZ); + ; + return args; + } +}; +var IfcStructuralMember = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + return new IfcStructuralMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + return args; + } +}; +var IfcStructuralPlanarAction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.DestabilizingLoad = DestabilizingLoad; + this.ProjectedOrTrue = ProjectedOrTrue; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let DestabilizingLoad = tape[ptr++]; + let ProjectedOrTrue = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStructuralPlanarAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.DestabilizingLoad); + ; + args.push(this.ProjectedOrTrue); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStructuralPointAction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.DestabilizingLoad = DestabilizingLoad; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let DestabilizingLoad = tape[ptr++]; + return new IfcStructuralPointAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.DestabilizingLoad); + ; + return args; + } +}; +var IfcStructuralPointConnection = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, ConditionCoordinateSystem) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedCondition = AppliedCondition; + this.ConditionCoordinateSystem = ConditionCoordinateSystem; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedCondition = tape[ptr++]; + let ConditionCoordinateSystem = tape[ptr++]; + return new IfcStructuralPointConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, ConditionCoordinateSystem); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedCondition); + ; + args.push(this.ConditionCoordinateSystem); + ; + return args; + } +}; +var IfcStructuralPointReaction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + return new IfcStructuralPointReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + return args; + } +}; +var IfcStructuralReaction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + return new IfcStructuralReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + return args; + } +}; +var IfcStructuralResultGroup = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheoryType, ResultForLoadGroup, IsLinear) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.TheoryType = TheoryType; + this.ResultForLoadGroup = ResultForLoadGroup; + this.IsLinear = IsLinear; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let TheoryType = tape[ptr++]; + let ResultForLoadGroup = tape[ptr++]; + let IsLinear = tape[ptr++]; + return new IfcStructuralResultGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheoryType, ResultForLoadGroup, IsLinear); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.TheoryType); + ; + args.push(this.ResultForLoadGroup); + ; + args.push(this.IsLinear); + ; + return args; + } +}; +var IfcStructuralSurfaceAction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.DestabilizingLoad = DestabilizingLoad; + this.ProjectedOrTrue = ProjectedOrTrue; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let DestabilizingLoad = tape[ptr++]; + let ProjectedOrTrue = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStructuralSurfaceAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.DestabilizingLoad); + ; + args.push(this.ProjectedOrTrue); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStructuralSurfaceConnection = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedCondition = AppliedCondition; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedCondition = tape[ptr++]; + return new IfcStructuralSurfaceConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedCondition); + ; + return args; + } +}; +var IfcStructuralSurfaceMember = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.PredefinedType = PredefinedType; + this.Thickness = Thickness; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Thickness = tape[ptr++]; + return new IfcStructuralSurfaceMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.PredefinedType); + ; + args.push(this.Thickness); + ; + return args; + } +}; +var IfcStructuralSurfaceMemberVarying = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.PredefinedType = PredefinedType; + this.Thickness = Thickness; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let Thickness = tape[ptr++]; + return new IfcStructuralSurfaceMemberVarying(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.PredefinedType); + ; + args.push(this.Thickness); + ; + return args; + } +}; +var IfcStructuralSurfaceReaction = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.AppliedLoad = AppliedLoad; + this.GlobalOrLocal = GlobalOrLocal; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let AppliedLoad = tape[ptr++]; + let GlobalOrLocal = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcStructuralSurfaceReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.AppliedLoad); + ; + args.push(this.GlobalOrLocal); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcStyleModel = class { + constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) { + this.expressID = expressID; + this.type = type; + this.ContextOfItems = ContextOfItems; + this.RepresentationIdentifier = RepresentationIdentifier; + this.RepresentationType = RepresentationType; + this.Items = Items; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextOfItems = tape[ptr++]; + let RepresentationIdentifier = tape[ptr++]; + let RepresentationType = tape[ptr++]; + let Items = tape[ptr++]; + return new IfcStyleModel(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items); + } + ToTape() { + let args = []; + args.push(this.ContextOfItems); + ; + args.push(this.RepresentationIdentifier); + ; + args.push(this.RepresentationType); + ; + args.push(this.Items); + ; + return args; + } +}; +var IfcStyledItem = class { + constructor(expressID, type, Item, Styles, Name) { + this.expressID = expressID; + this.type = type; + this.Item = Item; + this.Styles = Styles; + this.Name = Name; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Item = tape[ptr++]; + let Styles = tape[ptr++]; + let Name = tape[ptr++]; + return new IfcStyledItem(expressID, type, Item, Styles, Name); + } + ToTape() { + let args = []; + args.push(this.Item); + ; + args.push(this.Styles); + ; + args.push(this.Name); + ; + return args; + } +}; +var IfcStyledRepresentation = class { + constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) { + this.expressID = expressID; + this.type = type; + this.ContextOfItems = ContextOfItems; + this.RepresentationIdentifier = RepresentationIdentifier; + this.RepresentationType = RepresentationType; + this.Items = Items; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextOfItems = tape[ptr++]; + let RepresentationIdentifier = tape[ptr++]; + let RepresentationType = tape[ptr++]; + let Items = tape[ptr++]; + return new IfcStyledRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items); + } + ToTape() { + let args = []; + args.push(this.ContextOfItems); + ; + args.push(this.RepresentationIdentifier); + ; + args.push(this.RepresentationType); + ; + args.push(this.Items); + ; + return args; + } +}; +var IfcSubContractResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Usage = Usage; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Usage = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSubContractResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Usage); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSubContractResourceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + this.BaseCosts = BaseCosts; + this.BaseQuantity = BaseQuantity; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + let BaseCosts = tape[ptr++]; + let BaseQuantity = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSubContractResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + args.push(this.BaseCosts); + ; + args.push(this.BaseQuantity); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSubedge = class { + constructor(expressID, type, EdgeStart, EdgeEnd, ParentEdge) { + this.expressID = expressID; + this.type = type; + this.EdgeStart = EdgeStart; + this.EdgeEnd = EdgeEnd; + this.ParentEdge = ParentEdge; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let EdgeStart = tape[ptr++]; + let EdgeEnd = tape[ptr++]; + let ParentEdge = tape[ptr++]; + return new IfcSubedge(expressID, type, EdgeStart, EdgeEnd, ParentEdge); + } + ToTape() { + let args = []; + args.push(this.EdgeStart); + ; + args.push(this.EdgeEnd); + ; + args.push(this.ParentEdge); + ; + return args; + } +}; +var IfcSurface = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcSurface(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcSurfaceCurve = class { + constructor(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation) { + this.expressID = expressID; + this.type = type; + this.Curve3D = Curve3D; + this.AssociatedGeometry = AssociatedGeometry; + this.MasterRepresentation = MasterRepresentation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Curve3D = tape[ptr++]; + let AssociatedGeometry = tape[ptr++]; + let MasterRepresentation = tape[ptr++]; + return new IfcSurfaceCurve(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation); + } + ToTape() { + let args = []; + args.push(this.Curve3D); + ; + args.push(this.AssociatedGeometry); + ; + args.push(this.MasterRepresentation); + ; + return args; + } +}; +var IfcSurfaceCurveSweptAreaSolid = class { + constructor(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, ReferenceSurface) { + this.expressID = expressID; + this.type = type; + this.SweptArea = SweptArea; + this.Position = Position; + this.Directrix = Directrix; + this.StartParam = StartParam; + this.EndParam = EndParam; + this.ReferenceSurface = ReferenceSurface; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptArea = tape[ptr++]; + let Position = tape[ptr++]; + let Directrix = tape[ptr++]; + let StartParam = tape[ptr++]; + let EndParam = tape[ptr++]; + let ReferenceSurface = tape[ptr++]; + return new IfcSurfaceCurveSweptAreaSolid(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, ReferenceSurface); + } + ToTape() { + let args = []; + args.push(this.SweptArea); + ; + args.push(this.Position); + ; + args.push(this.Directrix); + ; + args.push(this.StartParam); + ; + args.push(this.EndParam); + ; + args.push(this.ReferenceSurface); + ; + return args; + } +}; +var IfcSurfaceFeature = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSurfaceFeature(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSurfaceOfLinearExtrusion = class { + constructor(expressID, type, SweptCurve, Position, ExtrudedDirection, Depth) { + this.expressID = expressID; + this.type = type; + this.SweptCurve = SweptCurve; + this.Position = Position; + this.ExtrudedDirection = ExtrudedDirection; + this.Depth = Depth; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptCurve = tape[ptr++]; + let Position = tape[ptr++]; + let ExtrudedDirection = tape[ptr++]; + let Depth = tape[ptr++]; + return new IfcSurfaceOfLinearExtrusion(expressID, type, SweptCurve, Position, ExtrudedDirection, Depth); + } + ToTape() { + let args = []; + args.push(this.SweptCurve); + ; + args.push(this.Position); + ; + args.push(this.ExtrudedDirection); + ; + args.push(this.Depth); + ; + return args; + } +}; +var IfcSurfaceOfRevolution = class { + constructor(expressID, type, SweptCurve, Position, AxisPosition) { + this.expressID = expressID; + this.type = type; + this.SweptCurve = SweptCurve; + this.Position = Position; + this.AxisPosition = AxisPosition; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptCurve = tape[ptr++]; + let Position = tape[ptr++]; + let AxisPosition = tape[ptr++]; + return new IfcSurfaceOfRevolution(expressID, type, SweptCurve, Position, AxisPosition); + } + ToTape() { + let args = []; + args.push(this.SweptCurve); + ; + args.push(this.Position); + ; + args.push(this.AxisPosition); + ; + return args; + } +}; +var IfcSurfaceReinforcementArea = class { + constructor(expressID, type, Name, SurfaceReinforcement1, SurfaceReinforcement2, ShearReinforcement) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.SurfaceReinforcement1 = SurfaceReinforcement1; + this.SurfaceReinforcement2 = SurfaceReinforcement2; + this.ShearReinforcement = ShearReinforcement; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let SurfaceReinforcement1 = tape[ptr++]; + let SurfaceReinforcement2 = tape[ptr++]; + let ShearReinforcement = tape[ptr++]; + return new IfcSurfaceReinforcementArea(expressID, type, Name, SurfaceReinforcement1, SurfaceReinforcement2, ShearReinforcement); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.SurfaceReinforcement1); + ; + args.push(this.SurfaceReinforcement2); + ; + args.push(this.ShearReinforcement); + ; + return args; + } +}; +var IfcSurfaceStyle = class { + constructor(expressID, type, Name, Side, Styles) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Side = Side; + this.Styles = Styles; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Side = tape[ptr++]; + let Styles = tape[ptr++]; + return new IfcSurfaceStyle(expressID, type, Name, Side, Styles); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Side); + ; + args.push(this.Styles); + ; + return args; + } +}; +var IfcSurfaceStyleLighting = class { + constructor(expressID, type, DiffuseTransmissionColour, DiffuseReflectionColour, TransmissionColour, ReflectanceColour) { + this.expressID = expressID; + this.type = type; + this.DiffuseTransmissionColour = DiffuseTransmissionColour; + this.DiffuseReflectionColour = DiffuseReflectionColour; + this.TransmissionColour = TransmissionColour; + this.ReflectanceColour = ReflectanceColour; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let DiffuseTransmissionColour = tape[ptr++]; + let DiffuseReflectionColour = tape[ptr++]; + let TransmissionColour = tape[ptr++]; + let ReflectanceColour = tape[ptr++]; + return new IfcSurfaceStyleLighting(expressID, type, DiffuseTransmissionColour, DiffuseReflectionColour, TransmissionColour, ReflectanceColour); + } + ToTape() { + let args = []; + args.push(this.DiffuseTransmissionColour); + ; + args.push(this.DiffuseReflectionColour); + ; + args.push(this.TransmissionColour); + ; + args.push(this.ReflectanceColour); + ; + return args; + } +}; +var IfcSurfaceStyleRefraction = class { + constructor(expressID, type, RefractionIndex, DispersionFactor) { + this.expressID = expressID; + this.type = type; + this.RefractionIndex = RefractionIndex; + this.DispersionFactor = DispersionFactor; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let RefractionIndex = tape[ptr++]; + let DispersionFactor = tape[ptr++]; + return new IfcSurfaceStyleRefraction(expressID, type, RefractionIndex, DispersionFactor); + } + ToTape() { + let args = []; + args.push(this.RefractionIndex); + ; + args.push(this.DispersionFactor); + ; + return args; + } +}; +var IfcSurfaceStyleRendering = class { + constructor(expressID, type, SurfaceColour, Transparency, DiffuseColour, TransmissionColour, DiffuseTransmissionColour, ReflectionColour, SpecularColour, SpecularHighlight, ReflectanceMethod) { + this.expressID = expressID; + this.type = type; + this.SurfaceColour = SurfaceColour; + this.Transparency = Transparency; + this.DiffuseColour = DiffuseColour; + this.TransmissionColour = TransmissionColour; + this.DiffuseTransmissionColour = DiffuseTransmissionColour; + this.ReflectionColour = ReflectionColour; + this.SpecularColour = SpecularColour; + this.SpecularHighlight = SpecularHighlight; + this.ReflectanceMethod = ReflectanceMethod; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SurfaceColour = tape[ptr++]; + let Transparency = tape[ptr++]; + let DiffuseColour = tape[ptr++]; + let TransmissionColour = tape[ptr++]; + let DiffuseTransmissionColour = tape[ptr++]; + let ReflectionColour = tape[ptr++]; + let SpecularColour = tape[ptr++]; + let SpecularHighlight = tape[ptr++]; + let ReflectanceMethod = tape[ptr++]; + return new IfcSurfaceStyleRendering(expressID, type, SurfaceColour, Transparency, DiffuseColour, TransmissionColour, DiffuseTransmissionColour, ReflectionColour, SpecularColour, SpecularHighlight, ReflectanceMethod); + } + ToTape() { + let args = []; + args.push(this.SurfaceColour); + ; + args.push(this.Transparency); + ; + args.push(this.DiffuseColour); + ; + args.push(this.TransmissionColour); + ; + args.push(this.DiffuseTransmissionColour); + ; + args.push(this.ReflectionColour); + ; + args.push(this.SpecularColour); + ; + args.push(this.SpecularHighlight); + ; + args.push(this.ReflectanceMethod); + ; + return args; + } +}; +var IfcSurfaceStyleShading = class { + constructor(expressID, type, SurfaceColour, Transparency) { + this.expressID = expressID; + this.type = type; + this.SurfaceColour = SurfaceColour; + this.Transparency = Transparency; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SurfaceColour = tape[ptr++]; + let Transparency = tape[ptr++]; + return new IfcSurfaceStyleShading(expressID, type, SurfaceColour, Transparency); + } + ToTape() { + let args = []; + args.push(this.SurfaceColour); + ; + args.push(this.Transparency); + ; + return args; + } +}; +var IfcSurfaceStyleWithTextures = class { + constructor(expressID, type, Textures) { + this.expressID = expressID; + this.type = type; + this.Textures = Textures; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Textures = tape[ptr++]; + return new IfcSurfaceStyleWithTextures(expressID, type, Textures); + } + ToTape() { + let args = []; + args.push(this.Textures); + ; + return args; + } +}; +var IfcSurfaceTexture = class { + constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter) { + this.expressID = expressID; + this.type = type; + this.RepeatS = RepeatS; + this.RepeatT = RepeatT; + this.Mode = Mode; + this.TextureTransform = TextureTransform; + this.Parameter = Parameter; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let RepeatS = tape[ptr++]; + let RepeatT = tape[ptr++]; + let Mode = tape[ptr++]; + let TextureTransform = tape[ptr++]; + let Parameter = tape[ptr++]; + return new IfcSurfaceTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter); + } + ToTape() { + let args = []; + args.push(this.RepeatS); + ; + args.push(this.RepeatT); + ; + args.push(this.Mode); + ; + args.push(this.TextureTransform); + ; + args.push(this.Parameter); + ; + return args; + } +}; +var IfcSweptAreaSolid = class { + constructor(expressID, type, SweptArea, Position) { + this.expressID = expressID; + this.type = type; + this.SweptArea = SweptArea; + this.Position = Position; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptArea = tape[ptr++]; + let Position = tape[ptr++]; + return new IfcSweptAreaSolid(expressID, type, SweptArea, Position); + } + ToTape() { + let args = []; + args.push(this.SweptArea); + ; + args.push(this.Position); + ; + return args; + } +}; +var IfcSweptDiskSolid = class { + constructor(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam) { + this.expressID = expressID; + this.type = type; + this.Directrix = Directrix; + this.Radius = Radius; + this.InnerRadius = InnerRadius; + this.StartParam = StartParam; + this.EndParam = EndParam; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Directrix = tape[ptr++]; + let Radius = tape[ptr++]; + let InnerRadius = tape[ptr++]; + let StartParam = tape[ptr++]; + let EndParam = tape[ptr++]; + return new IfcSweptDiskSolid(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam); + } + ToTape() { + let args = []; + args.push(this.Directrix); + ; + args.push(this.Radius); + ; + args.push(this.InnerRadius); + ; + args.push(this.StartParam); + ; + args.push(this.EndParam); + ; + return args; + } +}; +var IfcSweptDiskSolidPolygonal = class { + constructor(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam, FilletRadius) { + this.expressID = expressID; + this.type = type; + this.Directrix = Directrix; + this.Radius = Radius; + this.InnerRadius = InnerRadius; + this.StartParam = StartParam; + this.EndParam = EndParam; + this.FilletRadius = FilletRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Directrix = tape[ptr++]; + let Radius = tape[ptr++]; + let InnerRadius = tape[ptr++]; + let StartParam = tape[ptr++]; + let EndParam = tape[ptr++]; + let FilletRadius = tape[ptr++]; + return new IfcSweptDiskSolidPolygonal(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam, FilletRadius); + } + ToTape() { + let args = []; + args.push(this.Directrix); + ; + args.push(this.Radius); + ; + args.push(this.InnerRadius); + ; + args.push(this.StartParam); + ; + args.push(this.EndParam); + ; + args.push(this.FilletRadius); + ; + return args; + } +}; +var IfcSweptSurface = class { + constructor(expressID, type, SweptCurve, Position) { + this.expressID = expressID; + this.type = type; + this.SweptCurve = SweptCurve; + this.Position = Position; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let SweptCurve = tape[ptr++]; + let Position = tape[ptr++]; + return new IfcSweptSurface(expressID, type, SweptCurve, Position); + } + ToTape() { + let args = []; + args.push(this.SweptCurve); + ; + args.push(this.Position); + ; + return args; + } +}; +var IfcSwitchingDevice = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSwitchingDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSwitchingDeviceType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSwitchingDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSystem = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + return new IfcSystem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + return args; + } +}; +var IfcSystemFurnitureElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSystemFurnitureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcSystemFurnitureElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcSystemFurnitureElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTShapeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, WebEdgeRadius, WebSlope, FlangeSlope) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.Depth = Depth; + this.FlangeWidth = FlangeWidth; + this.WebThickness = WebThickness; + this.FlangeThickness = FlangeThickness; + this.FilletRadius = FilletRadius; + this.FlangeEdgeRadius = FlangeEdgeRadius; + this.WebEdgeRadius = WebEdgeRadius; + this.WebSlope = WebSlope; + this.FlangeSlope = FlangeSlope; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let Depth = tape[ptr++]; + let FlangeWidth = tape[ptr++]; + let WebThickness = tape[ptr++]; + let FlangeThickness = tape[ptr++]; + let FilletRadius = tape[ptr++]; + let FlangeEdgeRadius = tape[ptr++]; + let WebEdgeRadius = tape[ptr++]; + let WebSlope = tape[ptr++]; + let FlangeSlope = tape[ptr++]; + return new IfcTShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, WebEdgeRadius, WebSlope, FlangeSlope); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.Depth); + ; + args.push(this.FlangeWidth); + ; + args.push(this.WebThickness); + ; + args.push(this.FlangeThickness); + ; + args.push(this.FilletRadius); + ; + args.push(this.FlangeEdgeRadius); + ; + args.push(this.WebEdgeRadius); + ; + args.push(this.WebSlope); + ; + args.push(this.FlangeSlope); + ; + return args; + } +}; +var IfcTable = class { + constructor(expressID, type, Name, Rows, Columns) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Rows = Rows; + this.Columns = Columns; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Rows = tape[ptr++]; + let Columns = tape[ptr++]; + return new IfcTable(expressID, type, Name, Rows, Columns); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Rows); + ; + args.push(this.Columns); + ; + return args; + } +}; +var IfcTableColumn = class { + constructor(expressID, type, Identifier, Name, Description, Unit, ReferencePath) { + this.expressID = expressID; + this.type = type; + this.Identifier = Identifier; + this.Name = Name; + this.Description = Description; + this.Unit = Unit; + this.ReferencePath = ReferencePath; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Identifier = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let Unit = tape[ptr++]; + let ReferencePath = tape[ptr++]; + return new IfcTableColumn(expressID, type, Identifier, Name, Description, Unit, ReferencePath); + } + ToTape() { + let args = []; + args.push(this.Identifier); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.Unit); + ; + args.push(this.ReferencePath); + ; + return args; + } +}; +var IfcTableRow = class { + constructor(expressID, type, RowCells, IsHeading) { + this.expressID = expressID; + this.type = type; + this.RowCells = RowCells; + this.IsHeading = IsHeading; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let RowCells = tape[ptr++]; + let IsHeading = tape[ptr++]; + return new IfcTableRow(expressID, type, RowCells, IsHeading); + } + ToTape() { + let args = []; + args.push(this.RowCells); + ; + args.push(this.IsHeading); + ; + return args; + } +}; +var IfcTank = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTank(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTankType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTankType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTask = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Status, WorkMethod, IsMilestone, Priority, TaskTime, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.Status = Status; + this.WorkMethod = WorkMethod; + this.IsMilestone = IsMilestone; + this.Priority = Priority; + this.TaskTime = TaskTime; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let Status = tape[ptr++]; + let WorkMethod = tape[ptr++]; + let IsMilestone = tape[ptr++]; + let Priority = tape[ptr++]; + let TaskTime = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTask(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Status, WorkMethod, IsMilestone, Priority, TaskTime, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.Status); + ; + args.push(this.WorkMethod); + ; + args.push(this.IsMilestone); + ; + args.push(this.Priority); + ; + args.push(this.TaskTime); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTaskTime = class { + constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.DurationType = DurationType; + this.ScheduleDuration = ScheduleDuration; + this.ScheduleStart = ScheduleStart; + this.ScheduleFinish = ScheduleFinish; + this.EarlyStart = EarlyStart; + this.EarlyFinish = EarlyFinish; + this.LateStart = LateStart; + this.LateFinish = LateFinish; + this.FreeFloat = FreeFloat; + this.TotalFloat = TotalFloat; + this.IsCritical = IsCritical; + this.StatusTime = StatusTime; + this.ActualDuration = ActualDuration; + this.ActualStart = ActualStart; + this.ActualFinish = ActualFinish; + this.RemainingTime = RemainingTime; + this.Completion = Completion; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let DurationType = tape[ptr++]; + let ScheduleDuration = tape[ptr++]; + let ScheduleStart = tape[ptr++]; + let ScheduleFinish = tape[ptr++]; + let EarlyStart = tape[ptr++]; + let EarlyFinish = tape[ptr++]; + let LateStart = tape[ptr++]; + let LateFinish = tape[ptr++]; + let FreeFloat = tape[ptr++]; + let TotalFloat = tape[ptr++]; + let IsCritical = tape[ptr++]; + let StatusTime = tape[ptr++]; + let ActualDuration = tape[ptr++]; + let ActualStart = tape[ptr++]; + let ActualFinish = tape[ptr++]; + let RemainingTime = tape[ptr++]; + let Completion = tape[ptr++]; + return new IfcTaskTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.DurationType); + ; + args.push(this.ScheduleDuration); + ; + args.push(this.ScheduleStart); + ; + args.push(this.ScheduleFinish); + ; + args.push(this.EarlyStart); + ; + args.push(this.EarlyFinish); + ; + args.push(this.LateStart); + ; + args.push(this.LateFinish); + ; + args.push(this.FreeFloat); + ; + args.push(this.TotalFloat); + ; + args.push(this.IsCritical); + ; + args.push(this.StatusTime); + ; + args.push(this.ActualDuration); + ; + args.push(this.ActualStart); + ; + args.push(this.ActualFinish); + ; + args.push(this.RemainingTime); + ; + args.push(this.Completion); + ; + return args; + } +}; +var IfcTaskTimeRecurring = class { + constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion, Recurrence) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.DurationType = DurationType; + this.ScheduleDuration = ScheduleDuration; + this.ScheduleStart = ScheduleStart; + this.ScheduleFinish = ScheduleFinish; + this.EarlyStart = EarlyStart; + this.EarlyFinish = EarlyFinish; + this.LateStart = LateStart; + this.LateFinish = LateFinish; + this.FreeFloat = FreeFloat; + this.TotalFloat = TotalFloat; + this.IsCritical = IsCritical; + this.StatusTime = StatusTime; + this.ActualDuration = ActualDuration; + this.ActualStart = ActualStart; + this.ActualFinish = ActualFinish; + this.RemainingTime = RemainingTime; + this.Completion = Completion; + this.Recurrence = Recurrence; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let DurationType = tape[ptr++]; + let ScheduleDuration = tape[ptr++]; + let ScheduleStart = tape[ptr++]; + let ScheduleFinish = tape[ptr++]; + let EarlyStart = tape[ptr++]; + let EarlyFinish = tape[ptr++]; + let LateStart = tape[ptr++]; + let LateFinish = tape[ptr++]; + let FreeFloat = tape[ptr++]; + let TotalFloat = tape[ptr++]; + let IsCritical = tape[ptr++]; + let StatusTime = tape[ptr++]; + let ActualDuration = tape[ptr++]; + let ActualStart = tape[ptr++]; + let ActualFinish = tape[ptr++]; + let RemainingTime = tape[ptr++]; + let Completion = tape[ptr++]; + let Recurrence = tape[ptr++]; + return new IfcTaskTimeRecurring(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion, Recurrence); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.DurationType); + ; + args.push(this.ScheduleDuration); + ; + args.push(this.ScheduleStart); + ; + args.push(this.ScheduleFinish); + ; + args.push(this.EarlyStart); + ; + args.push(this.EarlyFinish); + ; + args.push(this.LateStart); + ; + args.push(this.LateFinish); + ; + args.push(this.FreeFloat); + ; + args.push(this.TotalFloat); + ; + args.push(this.IsCritical); + ; + args.push(this.StatusTime); + ; + args.push(this.ActualDuration); + ; + args.push(this.ActualStart); + ; + args.push(this.ActualFinish); + ; + args.push(this.RemainingTime); + ; + args.push(this.Completion); + ; + args.push(this.Recurrence); + ; + return args; + } +}; +var IfcTaskType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, WorkMethod) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ProcessType = ProcessType; + this.PredefinedType = PredefinedType; + this.WorkMethod = WorkMethod; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ProcessType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let WorkMethod = tape[ptr++]; + return new IfcTaskType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, WorkMethod); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ProcessType); + ; + args.push(this.PredefinedType); + ; + args.push(this.WorkMethod); + ; + return args; + } +}; +var IfcTelecomAddress = class { + constructor(expressID, type, Purpose, Description, UserDefinedPurpose, TelephoneNumbers, FacsimileNumbers, PagerNumber, ElectronicMailAddresses, WWWHomePageURL, MessagingIDs) { + this.expressID = expressID; + this.type = type; + this.Purpose = Purpose; + this.Description = Description; + this.UserDefinedPurpose = UserDefinedPurpose; + this.TelephoneNumbers = TelephoneNumbers; + this.FacsimileNumbers = FacsimileNumbers; + this.PagerNumber = PagerNumber; + this.ElectronicMailAddresses = ElectronicMailAddresses; + this.WWWHomePageURL = WWWHomePageURL; + this.MessagingIDs = MessagingIDs; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Purpose = tape[ptr++]; + let Description = tape[ptr++]; + let UserDefinedPurpose = tape[ptr++]; + let TelephoneNumbers = tape[ptr++]; + let FacsimileNumbers = tape[ptr++]; + let PagerNumber = tape[ptr++]; + let ElectronicMailAddresses = tape[ptr++]; + let WWWHomePageURL = tape[ptr++]; + let MessagingIDs = tape[ptr++]; + return new IfcTelecomAddress(expressID, type, Purpose, Description, UserDefinedPurpose, TelephoneNumbers, FacsimileNumbers, PagerNumber, ElectronicMailAddresses, WWWHomePageURL, MessagingIDs); + } + ToTape() { + let args = []; + args.push(this.Purpose); + ; + args.push(this.Description); + ; + args.push(this.UserDefinedPurpose); + ; + args.push(this.TelephoneNumbers); + ; + args.push(this.FacsimileNumbers); + ; + args.push(this.PagerNumber); + ; + args.push(this.ElectronicMailAddresses); + ; + args.push(this.WWWHomePageURL); + ; + args.push(this.MessagingIDs); + ; + return args; + } +}; +var IfcTendon = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType, NominalDiameter, CrossSectionArea, TensionForce, PreStress, FrictionCoefficient, AnchorageSlip, MinCurvatureRadius) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.SteelGrade = SteelGrade; + this.PredefinedType = PredefinedType; + this.NominalDiameter = NominalDiameter; + this.CrossSectionArea = CrossSectionArea; + this.TensionForce = TensionForce; + this.PreStress = PreStress; + this.FrictionCoefficient = FrictionCoefficient; + this.AnchorageSlip = AnchorageSlip; + this.MinCurvatureRadius = MinCurvatureRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let SteelGrade = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let NominalDiameter = tape[ptr++]; + let CrossSectionArea = tape[ptr++]; + let TensionForce = tape[ptr++]; + let PreStress = tape[ptr++]; + let FrictionCoefficient = tape[ptr++]; + let AnchorageSlip = tape[ptr++]; + let MinCurvatureRadius = tape[ptr++]; + return new IfcTendon(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType, NominalDiameter, CrossSectionArea, TensionForce, PreStress, FrictionCoefficient, AnchorageSlip, MinCurvatureRadius); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.SteelGrade); + ; + args.push(this.PredefinedType); + ; + args.push(this.NominalDiameter); + ; + args.push(this.CrossSectionArea); + ; + args.push(this.TensionForce); + ; + args.push(this.PreStress); + ; + args.push(this.FrictionCoefficient); + ; + args.push(this.AnchorageSlip); + ; + args.push(this.MinCurvatureRadius); + ; + return args; + } +}; +var IfcTendonAnchor = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.SteelGrade = SteelGrade; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let SteelGrade = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTendonAnchor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.SteelGrade); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTendonAnchorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTendonAnchorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTendonConduit = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.SteelGrade = SteelGrade; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let SteelGrade = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTendonConduit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.SteelGrade); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTendonConduitType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTendonConduitType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTendonType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, SheathDiameter) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.NominalDiameter = NominalDiameter; + this.CrossSectionArea = CrossSectionArea; + this.SheathDiameter = SheathDiameter; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let NominalDiameter = tape[ptr++]; + let CrossSectionArea = tape[ptr++]; + let SheathDiameter = tape[ptr++]; + return new IfcTendonType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, SheathDiameter); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.NominalDiameter); + ; + args.push(this.CrossSectionArea); + ; + args.push(this.SheathDiameter); + ; + return args; + } +}; +var IfcTessellatedFaceSet = class { + constructor(expressID, type, Coordinates) { + this.expressID = expressID; + this.type = type; + this.Coordinates = Coordinates; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Coordinates = tape[ptr++]; + return new IfcTessellatedFaceSet(expressID, type, Coordinates); + } + ToTape() { + let args = []; + args.push(this.Coordinates); + ; + return args; + } +}; +var IfcTessellatedItem = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcTessellatedItem(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcTextLiteral = class { + constructor(expressID, type, Literal, Placement, Path) { + this.expressID = expressID; + this.type = type; + this.Literal = Literal; + this.Placement = Placement; + this.Path = Path; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Literal = tape[ptr++]; + let Placement = tape[ptr++]; + let Path = tape[ptr++]; + return new IfcTextLiteral(expressID, type, Literal, Placement, Path); + } + ToTape() { + let args = []; + args.push(this.Literal); + ; + args.push(this.Placement); + ; + args.push(this.Path); + ; + return args; + } +}; +var IfcTextLiteralWithExtent = class { + constructor(expressID, type, Literal, Placement, Path, Extent, BoxAlignment) { + this.expressID = expressID; + this.type = type; + this.Literal = Literal; + this.Placement = Placement; + this.Path = Path; + this.Extent = Extent; + this.BoxAlignment = BoxAlignment; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Literal = tape[ptr++]; + let Placement = tape[ptr++]; + let Path = tape[ptr++]; + let Extent = tape[ptr++]; + let BoxAlignment = tape[ptr++]; + return new IfcTextLiteralWithExtent(expressID, type, Literal, Placement, Path, Extent, BoxAlignment); + } + ToTape() { + let args = []; + args.push(this.Literal); + ; + args.push(this.Placement); + ; + args.push(this.Path); + ; + args.push(this.Extent); + ; + args.push(this.BoxAlignment); + ; + return args; + } +}; +var IfcTextStyle = class { + constructor(expressID, type, Name, TextCharacterAppearance, TextStyle, TextFontStyle, ModelOrDraughting) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.TextCharacterAppearance = TextCharacterAppearance; + this.TextStyle = TextStyle; + this.TextFontStyle = TextFontStyle; + this.ModelOrDraughting = ModelOrDraughting; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let TextCharacterAppearance = tape[ptr++]; + let TextStyle = tape[ptr++]; + let TextFontStyle = tape[ptr++]; + let ModelOrDraughting = tape[ptr++]; + return new IfcTextStyle(expressID, type, Name, TextCharacterAppearance, TextStyle, TextFontStyle, ModelOrDraughting); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.TextCharacterAppearance); + ; + args.push(this.TextStyle); + ; + args.push(this.TextFontStyle); + ; + args.push(this.ModelOrDraughting); + ; + return args; + } +}; +var IfcTextStyleFontModel = class { + constructor(expressID, type, Name, FontFamily, FontStyle, FontVariant, FontWeight, FontSize) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.FontFamily = FontFamily; + this.FontStyle = FontStyle; + this.FontVariant = FontVariant; + this.FontWeight = FontWeight; + this.FontSize = FontSize; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let FontFamily = tape[ptr++]; + let FontStyle = tape[ptr++]; + let FontVariant = tape[ptr++]; + let FontWeight = tape[ptr++]; + let FontSize = tape[ptr++]; + return new IfcTextStyleFontModel(expressID, type, Name, FontFamily, FontStyle, FontVariant, FontWeight, FontSize); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.FontFamily); + ; + args.push(this.FontStyle); + ; + args.push(this.FontVariant); + ; + args.push(this.FontWeight); + ; + args.push(this.FontSize); + ; + return args; + } +}; +var IfcTextStyleForDefinedFont = class { + constructor(expressID, type, Colour, BackgroundColour) { + this.expressID = expressID; + this.type = type; + this.Colour = Colour; + this.BackgroundColour = BackgroundColour; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Colour = tape[ptr++]; + let BackgroundColour = tape[ptr++]; + return new IfcTextStyleForDefinedFont(expressID, type, Colour, BackgroundColour); + } + ToTape() { + let args = []; + args.push(this.Colour); + ; + args.push(this.BackgroundColour); + ; + return args; + } +}; +var IfcTextStyleTextModel = class { + constructor(expressID, type, TextIndent, TextAlign, TextDecoration, LetterSpacing, WordSpacing, TextTransform, LineHeight) { + this.expressID = expressID; + this.type = type; + this.TextIndent = TextIndent; + this.TextAlign = TextAlign; + this.TextDecoration = TextDecoration; + this.LetterSpacing = LetterSpacing; + this.WordSpacing = WordSpacing; + this.TextTransform = TextTransform; + this.LineHeight = LineHeight; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TextIndent = tape[ptr++]; + let TextAlign = tape[ptr++]; + let TextDecoration = tape[ptr++]; + let LetterSpacing = tape[ptr++]; + let WordSpacing = tape[ptr++]; + let TextTransform = tape[ptr++]; + let LineHeight = tape[ptr++]; + return new IfcTextStyleTextModel(expressID, type, TextIndent, TextAlign, TextDecoration, LetterSpacing, WordSpacing, TextTransform, LineHeight); + } + ToTape() { + let args = []; + args.push(this.TextIndent); + ; + args.push(this.TextAlign); + ; + args.push(this.TextDecoration); + ; + args.push(this.LetterSpacing); + ; + args.push(this.WordSpacing); + ; + args.push(this.TextTransform); + ; + args.push(this.LineHeight); + ; + return args; + } +}; +var IfcTextureCoordinate = class { + constructor(expressID, type, Maps) { + this.expressID = expressID; + this.type = type; + this.Maps = Maps; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Maps = tape[ptr++]; + return new IfcTextureCoordinate(expressID, type, Maps); + } + ToTape() { + let args = []; + args.push(this.Maps); + ; + return args; + } +}; +var IfcTextureCoordinateGenerator = class { + constructor(expressID, type, Maps, Mode, Parameter) { + this.expressID = expressID; + this.type = type; + this.Maps = Maps; + this.Mode = Mode; + this.Parameter = Parameter; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Maps = tape[ptr++]; + let Mode = tape[ptr++]; + let Parameter = tape[ptr++]; + return new IfcTextureCoordinateGenerator(expressID, type, Maps, Mode, Parameter); + } + ToTape() { + let args = []; + args.push(this.Maps); + ; + args.push(this.Mode); + ; + args.push(this.Parameter); + ; + return args; + } +}; +var IfcTextureMap = class { + constructor(expressID, type, Maps, Vertices, MappedTo) { + this.expressID = expressID; + this.type = type; + this.Maps = Maps; + this.Vertices = Vertices; + this.MappedTo = MappedTo; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Maps = tape[ptr++]; + let Vertices = tape[ptr++]; + let MappedTo = tape[ptr++]; + return new IfcTextureMap(expressID, type, Maps, Vertices, MappedTo); + } + ToTape() { + let args = []; + args.push(this.Maps); + ; + args.push(this.Vertices); + ; + args.push(this.MappedTo); + ; + return args; + } +}; +var IfcTextureVertex = class { + constructor(expressID, type, Coordinates) { + this.expressID = expressID; + this.type = type; + this.Coordinates = Coordinates; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Coordinates = tape[ptr++]; + return new IfcTextureVertex(expressID, type, Coordinates); + } + ToTape() { + let args = []; + args.push(this.Coordinates); + ; + return args; + } +}; +var IfcTextureVertexList = class { + constructor(expressID, type, TexCoordsList) { + this.expressID = expressID; + this.type = type; + this.TexCoordsList = TexCoordsList; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let TexCoordsList = tape[ptr++]; + return new IfcTextureVertexList(expressID, type, TexCoordsList); + } + ToTape() { + let args = []; + args.push(this.TexCoordsList); + ; + return args; + } +}; +var IfcTimePeriod = class { + constructor(expressID, type, StartTime, EndTime) { + this.expressID = expressID; + this.type = type; + this.StartTime = StartTime; + this.EndTime = EndTime; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let StartTime = tape[ptr++]; + let EndTime = tape[ptr++]; + return new IfcTimePeriod(expressID, type, StartTime, EndTime); + } + ToTape() { + let args = []; + args.push(this.StartTime); + ; + args.push(this.EndTime); + ; + return args; + } +}; +var IfcTimeSeries = class { + constructor(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.Description = Description; + this.StartTime = StartTime; + this.EndTime = EndTime; + this.TimeSeriesDataType = TimeSeriesDataType; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.Unit = Unit; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let StartTime = tape[ptr++]; + let EndTime = tape[ptr++]; + let TimeSeriesDataType = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let Unit = tape[ptr++]; + return new IfcTimeSeries(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.StartTime); + ; + args.push(this.EndTime); + ; + args.push(this.TimeSeriesDataType); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.Unit); + ; + return args; + } +}; +var IfcTimeSeriesValue = class { + constructor(expressID, type, ListValues) { + this.expressID = expressID; + this.type = type; + this.ListValues = ListValues; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ListValues = tape[ptr++]; + return new IfcTimeSeriesValue(expressID, type, ListValues); + } + ToTape() { + let args = []; + args.push(this.ListValues); + ; + return args; + } +}; +var IfcTopologicalRepresentationItem = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcTopologicalRepresentationItem(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcTopologyRepresentation = class { + constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) { + this.expressID = expressID; + this.type = type; + this.ContextOfItems = ContextOfItems; + this.RepresentationIdentifier = RepresentationIdentifier; + this.RepresentationType = RepresentationType; + this.Items = Items; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ContextOfItems = tape[ptr++]; + let RepresentationIdentifier = tape[ptr++]; + let RepresentationType = tape[ptr++]; + let Items = tape[ptr++]; + return new IfcTopologyRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items); + } + ToTape() { + let args = []; + args.push(this.ContextOfItems); + ; + args.push(this.RepresentationIdentifier); + ; + args.push(this.RepresentationType); + ; + args.push(this.Items); + ; + return args; + } +}; +var IfcToroidalSurface = class { + constructor(expressID, type, Position, MajorRadius, MinorRadius) { + this.expressID = expressID; + this.type = type; + this.Position = Position; + this.MajorRadius = MajorRadius; + this.MinorRadius = MinorRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Position = tape[ptr++]; + let MajorRadius = tape[ptr++]; + let MinorRadius = tape[ptr++]; + return new IfcToroidalSurface(expressID, type, Position, MajorRadius, MinorRadius); + } + ToTape() { + let args = []; + args.push(this.Position); + ; + args.push(this.MajorRadius); + ; + args.push(this.MinorRadius); + ; + return args; + } +}; +var IfcTransformer = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTransformer(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTransformerType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTransformerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTransitionCurveSegment2D = class { + constructor(expressID, type, StartPoint, StartDirection, SegmentLength, StartRadius, EndRadius, IsStartRadiusCCW, IsEndRadiusCCW, TransitionCurveType) { + this.expressID = expressID; + this.type = type; + this.StartPoint = StartPoint; + this.StartDirection = StartDirection; + this.SegmentLength = SegmentLength; + this.StartRadius = StartRadius; + this.EndRadius = EndRadius; + this.IsStartRadiusCCW = IsStartRadiusCCW; + this.IsEndRadiusCCW = IsEndRadiusCCW; + this.TransitionCurveType = TransitionCurveType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let StartPoint = tape[ptr++]; + let StartDirection = tape[ptr++]; + let SegmentLength = tape[ptr++]; + let StartRadius = tape[ptr++]; + let EndRadius = tape[ptr++]; + let IsStartRadiusCCW = tape[ptr++]; + let IsEndRadiusCCW = tape[ptr++]; + let TransitionCurveType = tape[ptr++]; + return new IfcTransitionCurveSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength, StartRadius, EndRadius, IsStartRadiusCCW, IsEndRadiusCCW, TransitionCurveType); + } + ToTape() { + let args = []; + args.push(this.StartPoint); + ; + args.push(this.StartDirection); + ; + args.push(this.SegmentLength); + ; + args.push(this.StartRadius); + ; + args.push(this.EndRadius); + ; + args.push(this.IsStartRadiusCCW); + ; + args.push(this.IsEndRadiusCCW); + ; + args.push(this.TransitionCurveType); + ; + return args; + } +}; +var IfcTransportElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTransportElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTransportElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTransportElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTrapeziumProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, BottomXDim, TopXDim, YDim, TopXOffset) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.BottomXDim = BottomXDim; + this.TopXDim = TopXDim; + this.YDim = YDim; + this.TopXOffset = TopXOffset; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let BottomXDim = tape[ptr++]; + let TopXDim = tape[ptr++]; + let YDim = tape[ptr++]; + let TopXOffset = tape[ptr++]; + return new IfcTrapeziumProfileDef(expressID, type, ProfileType, ProfileName, Position, BottomXDim, TopXDim, YDim, TopXOffset); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.BottomXDim); + ; + args.push(this.TopXDim); + ; + args.push(this.YDim); + ; + args.push(this.TopXOffset); + ; + return args; + } +}; +var IfcTriangulatedFaceSet = class { + constructor(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex) { + this.expressID = expressID; + this.type = type; + this.Coordinates = Coordinates; + this.Normals = Normals; + this.Closed = Closed; + this.CoordIndex = CoordIndex; + this.PnIndex = PnIndex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Coordinates = tape[ptr++]; + let Normals = tape[ptr++]; + let Closed = tape[ptr++]; + let CoordIndex = tape[ptr++]; + let PnIndex = tape[ptr++]; + return new IfcTriangulatedFaceSet(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex); + } + ToTape() { + let args = []; + args.push(this.Coordinates); + ; + args.push(this.Normals); + ; + args.push(this.Closed); + ; + args.push(this.CoordIndex); + ; + args.push(this.PnIndex); + ; + return args; + } +}; +var IfcTriangulatedIrregularNetwork = class { + constructor(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex, Flags) { + this.expressID = expressID; + this.type = type; + this.Coordinates = Coordinates; + this.Normals = Normals; + this.Closed = Closed; + this.CoordIndex = CoordIndex; + this.PnIndex = PnIndex; + this.Flags = Flags; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Coordinates = tape[ptr++]; + let Normals = tape[ptr++]; + let Closed = tape[ptr++]; + let CoordIndex = tape[ptr++]; + let PnIndex = tape[ptr++]; + let Flags = tape[ptr++]; + return new IfcTriangulatedIrregularNetwork(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex, Flags); + } + ToTape() { + let args = []; + args.push(this.Coordinates); + ; + args.push(this.Normals); + ; + args.push(this.Closed); + ; + args.push(this.CoordIndex); + ; + args.push(this.PnIndex); + ; + args.push(this.Flags); + ; + return args; + } +}; +var IfcTrimmedCurve = class { + constructor(expressID, type, BasisCurve, Trim1, Trim2, SenseAgreement, MasterRepresentation) { + this.expressID = expressID; + this.type = type; + this.BasisCurve = BasisCurve; + this.Trim1 = Trim1; + this.Trim2 = Trim2; + this.SenseAgreement = SenseAgreement; + this.MasterRepresentation = MasterRepresentation; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let BasisCurve = tape[ptr++]; + let Trim1 = tape[ptr++]; + let Trim2 = tape[ptr++]; + let SenseAgreement = tape[ptr++]; + let MasterRepresentation = tape[ptr++]; + return new IfcTrimmedCurve(expressID, type, BasisCurve, Trim1, Trim2, SenseAgreement, MasterRepresentation); + } + ToTape() { + let args = []; + args.push(this.BasisCurve); + ; + args.push(this.Trim1); + ; + args.push(this.Trim2); + ; + args.push(this.SenseAgreement); + ; + args.push(this.MasterRepresentation); + ; + return args; + } +}; +var IfcTubeBundle = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTubeBundle(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTubeBundleType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcTubeBundleType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcTypeObject = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + return new IfcTypeObject(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + return args; + } +}; +var IfcTypeProcess = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ProcessType = ProcessType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ProcessType = tape[ptr++]; + return new IfcTypeProcess(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ProcessType); + ; + return args; + } +}; +var IfcTypeProduct = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcTypeProduct(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcTypeResource = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.Identification = Identification; + this.LongDescription = LongDescription; + this.ResourceType = ResourceType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let Identification = tape[ptr++]; + let LongDescription = tape[ptr++]; + let ResourceType = tape[ptr++]; + return new IfcTypeResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.Identification); + ; + args.push(this.LongDescription); + ; + args.push(this.ResourceType); + ; + return args; + } +}; +var IfcUShapeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius, FlangeSlope) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.Depth = Depth; + this.FlangeWidth = FlangeWidth; + this.WebThickness = WebThickness; + this.FlangeThickness = FlangeThickness; + this.FilletRadius = FilletRadius; + this.EdgeRadius = EdgeRadius; + this.FlangeSlope = FlangeSlope; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let Depth = tape[ptr++]; + let FlangeWidth = tape[ptr++]; + let WebThickness = tape[ptr++]; + let FlangeThickness = tape[ptr++]; + let FilletRadius = tape[ptr++]; + let EdgeRadius = tape[ptr++]; + let FlangeSlope = tape[ptr++]; + return new IfcUShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius, FlangeSlope); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.Depth); + ; + args.push(this.FlangeWidth); + ; + args.push(this.WebThickness); + ; + args.push(this.FlangeThickness); + ; + args.push(this.FilletRadius); + ; + args.push(this.EdgeRadius); + ; + args.push(this.FlangeSlope); + ; + return args; + } +}; +var IfcUnitAssignment = class { + constructor(expressID, type, Units) { + this.expressID = expressID; + this.type = type; + this.Units = Units; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Units = tape[ptr++]; + return new IfcUnitAssignment(expressID, type, Units); + } + ToTape() { + let args = []; + args.push(this.Units); + ; + return args; + } +}; +var IfcUnitaryControlElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcUnitaryControlElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcUnitaryControlElementType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcUnitaryControlElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcUnitaryEquipment = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcUnitaryEquipment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcUnitaryEquipmentType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcUnitaryEquipmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcValve = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcValve(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcValveType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcValveType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcVector = class { + constructor(expressID, type, Orientation, Magnitude) { + this.expressID = expressID; + this.type = type; + this.Orientation = Orientation; + this.Magnitude = Magnitude; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Orientation = tape[ptr++]; + let Magnitude = tape[ptr++]; + return new IfcVector(expressID, type, Orientation, Magnitude); + } + ToTape() { + let args = []; + args.push(this.Orientation); + ; + args.push(this.Magnitude); + ; + return args; + } +}; +var IfcVertex = class { + constructor(expressID, type) { + this.expressID = expressID; + this.type = type; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + return new IfcVertex(expressID, type); + } + ToTape() { + let args = []; + return args; + } +}; +var IfcVertexLoop = class { + constructor(expressID, type, LoopVertex) { + this.expressID = expressID; + this.type = type; + this.LoopVertex = LoopVertex; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let LoopVertex = tape[ptr++]; + return new IfcVertexLoop(expressID, type, LoopVertex); + } + ToTape() { + let args = []; + args.push(this.LoopVertex); + ; + return args; + } +}; +var IfcVertexPoint = class { + constructor(expressID, type, VertexGeometry) { + this.expressID = expressID; + this.type = type; + this.VertexGeometry = VertexGeometry; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let VertexGeometry = tape[ptr++]; + return new IfcVertexPoint(expressID, type, VertexGeometry); + } + ToTape() { + let args = []; + args.push(this.VertexGeometry); + ; + return args; + } +}; +var IfcVibrationDamper = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcVibrationDamper(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcVibrationDamperType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcVibrationDamperType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcVibrationIsolator = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcVibrationIsolator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcVibrationIsolatorType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcVibrationIsolatorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcVirtualElement = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + return new IfcVirtualElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + return args; + } +}; +var IfcVirtualGridIntersection = class { + constructor(expressID, type, IntersectingAxes, OffsetDistances) { + this.expressID = expressID; + this.type = type; + this.IntersectingAxes = IntersectingAxes; + this.OffsetDistances = OffsetDistances; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let IntersectingAxes = tape[ptr++]; + let OffsetDistances = tape[ptr++]; + return new IfcVirtualGridIntersection(expressID, type, IntersectingAxes, OffsetDistances); + } + ToTape() { + let args = []; + args.push(this.IntersectingAxes); + ; + args.push(this.OffsetDistances); + ; + return args; + } +}; +var IfcVoidingFeature = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcVoidingFeature(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWall = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWall(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWallElementedCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWallElementedCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWallStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWallStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWallType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWallType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWasteTerminal = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWasteTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWasteTerminalType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWasteTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWindow = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.OverallHeight = OverallHeight; + this.OverallWidth = OverallWidth; + this.PredefinedType = PredefinedType; + this.PartitioningType = PartitioningType; + this.UserDefinedPartitioningType = UserDefinedPartitioningType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let OverallHeight = tape[ptr++]; + let OverallWidth = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let PartitioningType = tape[ptr++]; + let UserDefinedPartitioningType = tape[ptr++]; + return new IfcWindow(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.OverallHeight); + ; + args.push(this.OverallWidth); + ; + args.push(this.PredefinedType); + ; + args.push(this.PartitioningType); + ; + args.push(this.UserDefinedPartitioningType); + ; + return args; + } +}; +var IfcWindowLiningProperties = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, TransomThickness, MullionThickness, FirstTransomOffset, SecondTransomOffset, FirstMullionOffset, SecondMullionOffset, ShapeAspectStyle, LiningOffset, LiningToPanelOffsetX, LiningToPanelOffsetY) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.LiningDepth = LiningDepth; + this.LiningThickness = LiningThickness; + this.TransomThickness = TransomThickness; + this.MullionThickness = MullionThickness; + this.FirstTransomOffset = FirstTransomOffset; + this.SecondTransomOffset = SecondTransomOffset; + this.FirstMullionOffset = FirstMullionOffset; + this.SecondMullionOffset = SecondMullionOffset; + this.ShapeAspectStyle = ShapeAspectStyle; + this.LiningOffset = LiningOffset; + this.LiningToPanelOffsetX = LiningToPanelOffsetX; + this.LiningToPanelOffsetY = LiningToPanelOffsetY; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let LiningDepth = tape[ptr++]; + let LiningThickness = tape[ptr++]; + let TransomThickness = tape[ptr++]; + let MullionThickness = tape[ptr++]; + let FirstTransomOffset = tape[ptr++]; + let SecondTransomOffset = tape[ptr++]; + let FirstMullionOffset = tape[ptr++]; + let SecondMullionOffset = tape[ptr++]; + let ShapeAspectStyle = tape[ptr++]; + let LiningOffset = tape[ptr++]; + let LiningToPanelOffsetX = tape[ptr++]; + let LiningToPanelOffsetY = tape[ptr++]; + return new IfcWindowLiningProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, TransomThickness, MullionThickness, FirstTransomOffset, SecondTransomOffset, FirstMullionOffset, SecondMullionOffset, ShapeAspectStyle, LiningOffset, LiningToPanelOffsetX, LiningToPanelOffsetY); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.LiningDepth); + ; + args.push(this.LiningThickness); + ; + args.push(this.TransomThickness); + ; + args.push(this.MullionThickness); + ; + args.push(this.FirstTransomOffset); + ; + args.push(this.SecondTransomOffset); + ; + args.push(this.FirstMullionOffset); + ; + args.push(this.SecondMullionOffset); + ; + args.push(this.ShapeAspectStyle); + ; + args.push(this.LiningOffset); + ; + args.push(this.LiningToPanelOffsetX); + ; + args.push(this.LiningToPanelOffsetY); + ; + return args; + } +}; +var IfcWindowPanelProperties = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.OperationType = OperationType; + this.PanelPosition = PanelPosition; + this.FrameDepth = FrameDepth; + this.FrameThickness = FrameThickness; + this.ShapeAspectStyle = ShapeAspectStyle; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let OperationType = tape[ptr++]; + let PanelPosition = tape[ptr++]; + let FrameDepth = tape[ptr++]; + let FrameThickness = tape[ptr++]; + let ShapeAspectStyle = tape[ptr++]; + return new IfcWindowPanelProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.OperationType); + ; + args.push(this.PanelPosition); + ; + args.push(this.FrameDepth); + ; + args.push(this.FrameThickness); + ; + args.push(this.ShapeAspectStyle); + ; + return args; + } +}; +var IfcWindowStandardCase = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.ObjectPlacement = ObjectPlacement; + this.Representation = Representation; + this.Tag = Tag; + this.OverallHeight = OverallHeight; + this.OverallWidth = OverallWidth; + this.PredefinedType = PredefinedType; + this.PartitioningType = PartitioningType; + this.UserDefinedPartitioningType = UserDefinedPartitioningType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let ObjectPlacement = tape[ptr++]; + let Representation = tape[ptr++]; + let Tag = tape[ptr++]; + let OverallHeight = tape[ptr++]; + let OverallWidth = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let PartitioningType = tape[ptr++]; + let UserDefinedPartitioningType = tape[ptr++]; + return new IfcWindowStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.ObjectPlacement); + ; + args.push(this.Representation); + ; + args.push(this.Tag); + ; + args.push(this.OverallHeight); + ; + args.push(this.OverallWidth); + ; + args.push(this.PredefinedType); + ; + args.push(this.PartitioningType); + ; + args.push(this.UserDefinedPartitioningType); + ; + return args; + } +}; +var IfcWindowStyle = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ConstructionType, OperationType, ParameterTakesPrecedence, Sizeable) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ConstructionType = ConstructionType; + this.OperationType = OperationType; + this.ParameterTakesPrecedence = ParameterTakesPrecedence; + this.Sizeable = Sizeable; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ConstructionType = tape[ptr++]; + let OperationType = tape[ptr++]; + let ParameterTakesPrecedence = tape[ptr++]; + let Sizeable = tape[ptr++]; + return new IfcWindowStyle(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ConstructionType, OperationType, ParameterTakesPrecedence, Sizeable); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ConstructionType); + ; + args.push(this.OperationType); + ; + args.push(this.ParameterTakesPrecedence); + ; + args.push(this.Sizeable); + ; + return args; + } +}; +var IfcWindowType = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, PartitioningType, ParameterTakesPrecedence, UserDefinedPartitioningType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ApplicableOccurrence = ApplicableOccurrence; + this.HasPropertySets = HasPropertySets; + this.RepresentationMaps = RepresentationMaps; + this.Tag = Tag; + this.ElementType = ElementType; + this.PredefinedType = PredefinedType; + this.PartitioningType = PartitioningType; + this.ParameterTakesPrecedence = ParameterTakesPrecedence; + this.UserDefinedPartitioningType = UserDefinedPartitioningType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ApplicableOccurrence = tape[ptr++]; + let HasPropertySets = tape[ptr++]; + let RepresentationMaps = tape[ptr++]; + let Tag = tape[ptr++]; + let ElementType = tape[ptr++]; + let PredefinedType = tape[ptr++]; + let PartitioningType = tape[ptr++]; + let ParameterTakesPrecedence = tape[ptr++]; + let UserDefinedPartitioningType = tape[ptr++]; + return new IfcWindowType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, PartitioningType, ParameterTakesPrecedence, UserDefinedPartitioningType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ApplicableOccurrence); + ; + args.push(this.HasPropertySets); + ; + args.push(this.RepresentationMaps); + ; + args.push(this.Tag); + ; + args.push(this.ElementType); + ; + args.push(this.PredefinedType); + ; + args.push(this.PartitioningType); + ; + args.push(this.ParameterTakesPrecedence); + ; + args.push(this.UserDefinedPartitioningType); + ; + return args; + } +}; +var IfcWorkCalendar = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, WorkingTimes, ExceptionTimes, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.WorkingTimes = WorkingTimes; + this.ExceptionTimes = ExceptionTimes; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let WorkingTimes = tape[ptr++]; + let ExceptionTimes = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWorkCalendar(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, WorkingTimes, ExceptionTimes, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.WorkingTimes); + ; + args.push(this.ExceptionTimes); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWorkControl = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.CreationDate = CreationDate; + this.Creators = Creators; + this.Purpose = Purpose; + this.Duration = Duration; + this.TotalFloat = TotalFloat; + this.StartTime = StartTime; + this.FinishTime = FinishTime; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let CreationDate = tape[ptr++]; + let Creators = tape[ptr++]; + let Purpose = tape[ptr++]; + let Duration = tape[ptr++]; + let TotalFloat = tape[ptr++]; + let StartTime = tape[ptr++]; + let FinishTime = tape[ptr++]; + return new IfcWorkControl(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.CreationDate); + ; + args.push(this.Creators); + ; + args.push(this.Purpose); + ; + args.push(this.Duration); + ; + args.push(this.TotalFloat); + ; + args.push(this.StartTime); + ; + args.push(this.FinishTime); + ; + return args; + } +}; +var IfcWorkPlan = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.CreationDate = CreationDate; + this.Creators = Creators; + this.Purpose = Purpose; + this.Duration = Duration; + this.TotalFloat = TotalFloat; + this.StartTime = StartTime; + this.FinishTime = FinishTime; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let CreationDate = tape[ptr++]; + let Creators = tape[ptr++]; + let Purpose = tape[ptr++]; + let Duration = tape[ptr++]; + let TotalFloat = tape[ptr++]; + let StartTime = tape[ptr++]; + let FinishTime = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWorkPlan(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.CreationDate); + ; + args.push(this.Creators); + ; + args.push(this.Purpose); + ; + args.push(this.Duration); + ; + args.push(this.TotalFloat); + ; + args.push(this.StartTime); + ; + args.push(this.FinishTime); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWorkSchedule = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.Identification = Identification; + this.CreationDate = CreationDate; + this.Creators = Creators; + this.Purpose = Purpose; + this.Duration = Duration; + this.TotalFloat = TotalFloat; + this.StartTime = StartTime; + this.FinishTime = FinishTime; + this.PredefinedType = PredefinedType; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let Identification = tape[ptr++]; + let CreationDate = tape[ptr++]; + let Creators = tape[ptr++]; + let Purpose = tape[ptr++]; + let Duration = tape[ptr++]; + let TotalFloat = tape[ptr++]; + let StartTime = tape[ptr++]; + let FinishTime = tape[ptr++]; + let PredefinedType = tape[ptr++]; + return new IfcWorkSchedule(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.Identification); + ; + args.push(this.CreationDate); + ; + args.push(this.Creators); + ; + args.push(this.Purpose); + ; + args.push(this.Duration); + ; + args.push(this.TotalFloat); + ; + args.push(this.StartTime); + ; + args.push(this.FinishTime); + ; + args.push(this.PredefinedType); + ; + return args; + } +}; +var IfcWorkTime = class { + constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, RecurrencePattern, Start, Finish) { + this.expressID = expressID; + this.type = type; + this.Name = Name; + this.DataOrigin = DataOrigin; + this.UserDefinedDataOrigin = UserDefinedDataOrigin; + this.RecurrencePattern = RecurrencePattern; + this.Start = Start; + this.Finish = Finish; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let Name = tape[ptr++]; + let DataOrigin = tape[ptr++]; + let UserDefinedDataOrigin = tape[ptr++]; + let RecurrencePattern = tape[ptr++]; + let Start = tape[ptr++]; + let Finish = tape[ptr++]; + return new IfcWorkTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, RecurrencePattern, Start, Finish); + } + ToTape() { + let args = []; + args.push(this.Name); + ; + args.push(this.DataOrigin); + ; + args.push(this.UserDefinedDataOrigin); + ; + args.push(this.RecurrencePattern); + ; + args.push(this.Start); + ; + args.push(this.Finish); + ; + return args; + } +}; +var IfcZShapeProfileDef = class { + constructor(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius) { + this.expressID = expressID; + this.type = type; + this.ProfileType = ProfileType; + this.ProfileName = ProfileName; + this.Position = Position; + this.Depth = Depth; + this.FlangeWidth = FlangeWidth; + this.WebThickness = WebThickness; + this.FlangeThickness = FlangeThickness; + this.FilletRadius = FilletRadius; + this.EdgeRadius = EdgeRadius; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let ProfileType = tape[ptr++]; + let ProfileName = tape[ptr++]; + let Position = tape[ptr++]; + let Depth = tape[ptr++]; + let FlangeWidth = tape[ptr++]; + let WebThickness = tape[ptr++]; + let FlangeThickness = tape[ptr++]; + let FilletRadius = tape[ptr++]; + let EdgeRadius = tape[ptr++]; + return new IfcZShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius); + } + ToTape() { + let args = []; + args.push(this.ProfileType); + ; + args.push(this.ProfileName); + ; + args.push(this.Position); + ; + args.push(this.Depth); + ; + args.push(this.FlangeWidth); + ; + args.push(this.WebThickness); + ; + args.push(this.FlangeThickness); + ; + args.push(this.FilletRadius); + ; + args.push(this.EdgeRadius); + ; + return args; + } +}; +var IfcZone = class { + constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName) { + this.expressID = expressID; + this.type = type; + this.GlobalId = GlobalId; + this.OwnerHistory = OwnerHistory; + this.Name = Name; + this.Description = Description; + this.ObjectType = ObjectType; + this.LongName = LongName; + } + static FromTape(expressID, type, tape) { + let ptr = 0; + let GlobalId = tape[ptr++]; + let OwnerHistory = tape[ptr++]; + let Name = tape[ptr++]; + let Description = tape[ptr++]; + let ObjectType = tape[ptr++]; + let LongName = tape[ptr++]; + return new IfcZone(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName); + } + ToTape() { + let args = []; + args.push(this.GlobalId); + ; + args.push(this.OwnerHistory); + ; + args.push(this.Name); + ; + args.push(this.Description); + ; + args.push(this.ObjectType); + ; + args.push(this.LongName); + ; + return args; + } +}; + +// dist/web-ifc-api.ts +var WebIFCWasm = require_web_ifc(); +var UNKNOWN = 0; +var STRING = 1; +var LABEL = 2; +var ENUM = 3; +var REAL = 4; +var REF = 5; +var EMPTY = 6; +var SET_BEGIN = 7; +var SET_END = 8; +var LINE_END = 9; +function ms() { + return new Date().getTime(); +} +var IfcAPI = class { + constructor() { + this.wasmModule = void 0; + this.fs = void 0; + } + Init() { + return __async(this, null, function* () { + if (WebIFCWasm) { + this.wasmModule = yield WebIFCWasm({ noInitialRun: true }); + this.fs = this.wasmModule.FS; + } else { + console.error(`Could not find wasm module at './web-ifc' from web-ifc-api.ts`); + } + }); + } + OpenModel(data, settings) { + this.wasmModule["FS_createDataFile"]("/", "filename", data, true, true, true); + let s = __spreadValues({ + COORDINATE_TO_ORIGIN: false, + USE_FAST_BOOLS: false, + CIRCLE_SEGMENTS_LOW: 5, + CIRCLE_SEGMENTS_MEDIUM: 8, + CIRCLE_SEGMENTS_HIGH: 12 + }, settings); + let result = this.wasmModule.OpenModel(s); + this.wasmModule["FS_unlink"]("/filename"); + return result; + } + CreateModel(settings) { + let s = __spreadValues({ + COORDINATE_TO_ORIGIN: false, + USE_FAST_BOOLS: false, + CIRCLE_SEGMENTS_LOW: 5, + CIRCLE_SEGMENTS_MEDIUM: 8, + CIRCLE_SEGMENTS_HIGH: 12 + }, settings); + let result = this.wasmModule.CreateModel(s); + return result; + } + ExportFileAsIFC(modelID) { + this.wasmModule.ExportFileAsIFC(modelID); + let result = this.fs.readFile("/export.ifc"); + this.wasmModule["FS_unlink"]("/export.ifc"); + return result; + } + GetGeometry(modelID, geometryExpressID) { + return this.wasmModule.GetGeometry(modelID, geometryExpressID); + } + GetLine(modelID, expressID, flatten = false) { + let rawLineData = this.GetRawLineData(modelID, expressID); + let lineData = FromRawLineData[rawLineData.type](rawLineData); + if (flatten) { + this.FlattenLine(modelID, lineData); + } + return lineData; + } + WriteLine(modelID, lineObject) { + Object.keys(lineObject).forEach((propertyName) => { + let property = lineObject[propertyName]; + if (property && property.expressID !== void 0) { + this.WriteLine(modelID, property); + lineObject[propertyName] = { + type: 5, + value: property.expressID + }; + } else if (Array.isArray(property) && property.length > 0) { + for (let i = 0; i < property.length; i++) { + if (property[i].expressID !== void 0) { + this.WriteLine(modelID, property[i]); + lineObject[propertyName][i] = { + type: 5, + value: property[i].expressID + }; + } + } + } + }); + let rawLineData = { + ID: lineObject.expressID, + type: lineObject.type, + arguments: lineObject.ToTape() + }; + this.WriteRawLineData(modelID, rawLineData); + } + FlattenLine(modelID, line) { + Object.keys(line).forEach((propertyName) => { + let property = line[propertyName]; + if (property && property.type === 5) { + line[propertyName] = this.GetLine(modelID, property.value, true); + } else if (Array.isArray(property) && property.length > 0 && property[0].type === 5) { + for (let i = 0; i < property.length; i++) { + line[propertyName][i] = this.GetLine(modelID, property[i].value, true); + } + } + }); + } + GetRawLineData(modelID, expressID) { + return this.wasmModule.GetLine(modelID, expressID); + } + WriteRawLineData(modelID, data) { + return this.wasmModule.WriteLine(modelID, data.ID, data.type, data.arguments); + } + GetLineIDsWithType(modelID, type) { + return this.wasmModule.GetLineIDsWithType(modelID, type); + } + GetAllLines(modelID) { + return this.wasmModule.GetAllLines(modelID); + } + SetGeometryTransformation(modelID, transformationMatrix) { + if (transformationMatrix.length != 16) { + console.log(`Bad transformation matrix size: ${transformationMatrix.length}`); + return; + } + this.wasmModule.SetGeometryTransformation(modelID, transformationMatrix); + } + GetVertexArray(ptr, size) { + return this.getSubArray(this.wasmModule.HEAPF32, ptr, size); + } + GetIndexArray(ptr, size) { + return this.getSubArray(this.wasmModule.HEAPU32, ptr, size); + } + getSubArray(heap, startPtr, sizeBytes) { + return heap.subarray(startPtr / 4, startPtr / 4 + sizeBytes).slice(0); + } + CloseModel(modelID) { + this.wasmModule.CloseModel(modelID); + } + StreamAllMeshes(modelID, meshCallback) { + this.wasmModule.StreamAllMeshes(modelID, meshCallback); + } + IsModelOpen(modelID) { + return this.wasmModule.IsModelOpen(modelID); + } + LoadAllGeometry(modelID) { + return this.wasmModule.LoadAllGeometry(modelID); + } + GetFlatMesh(modelID, expressID) { + return this.wasmModule.GetFlatMesh(modelID, expressID); + } + SetWasmPath(path) { + WasmPath = path; + } +}; +export { + EMPTY, + ENUM, + FromRawLineData, + Handle, + IFCACTIONREQUEST, + IFCACTOR, + IFCACTORROLE, + IFCACTUATOR, + IFCACTUATORTYPE, + IFCADDRESS, + IFCADVANCEDBREP, + IFCADVANCEDBREPWITHVOIDS, + IFCADVANCEDFACE, + IFCAIRTERMINAL, + IFCAIRTERMINALBOX, + IFCAIRTERMINALBOXTYPE, + IFCAIRTERMINALTYPE, + IFCAIRTOAIRHEATRECOVERY, + IFCAIRTOAIRHEATRECOVERYTYPE, + IFCALARM, + IFCALARMTYPE, + IFCALIGNMENT, + IFCALIGNMENT2DHORIZONTAL, + IFCALIGNMENT2DHORIZONTALSEGMENT, + IFCALIGNMENT2DSEGMENT, + IFCALIGNMENT2DVERSEGCIRCULARARC, + IFCALIGNMENT2DVERSEGLINE, + IFCALIGNMENT2DVERSEGPARABOLICARC, + IFCALIGNMENT2DVERTICAL, + IFCALIGNMENT2DVERTICALSEGMENT, + IFCALIGNMENTCURVE, + IFCANNOTATION, + IFCANNOTATIONFILLAREA, + IFCAPPLICATION, + IFCAPPLIEDVALUE, + IFCAPPROVAL, + IFCAPPROVALRELATIONSHIP, + IFCARBITRARYCLOSEDPROFILEDEF, + IFCARBITRARYOPENPROFILEDEF, + IFCARBITRARYPROFILEDEFWITHVOIDS, + IFCASSET, + IFCASYMMETRICISHAPEPROFILEDEF, + IFCAUDIOVISUALAPPLIANCE, + IFCAUDIOVISUALAPPLIANCETYPE, + IFCAXIS1PLACEMENT, + IFCAXIS2PLACEMENT2D, + IFCAXIS2PLACEMENT3D, + IFCBEAM, + IFCBEAMSTANDARDCASE, + IFCBEAMTYPE, + IFCBEARING, + IFCBEARINGTYPE, + IFCBLOBTEXTURE, + IFCBLOCK, + IFCBOILER, + IFCBOILERTYPE, + IFCBOOLEANCLIPPINGRESULT, + IFCBOOLEANRESULT, + IFCBOUNDARYCONDITION, + IFCBOUNDARYCURVE, + IFCBOUNDARYEDGECONDITION, + IFCBOUNDARYFACECONDITION, + IFCBOUNDARYNODECONDITION, + IFCBOUNDARYNODECONDITIONWARPING, + IFCBOUNDEDCURVE, + IFCBOUNDEDSURFACE, + IFCBOUNDINGBOX, + IFCBOXEDHALFSPACE, + IFCBRIDGE, + IFCBRIDGEPART, + IFCBSPLINECURVE, + IFCBSPLINECURVEWITHKNOTS, + IFCBSPLINESURFACE, + IFCBSPLINESURFACEWITHKNOTS, + IFCBUILDING, + IFCBUILDINGELEMENT, + IFCBUILDINGELEMENTPART, + IFCBUILDINGELEMENTPARTTYPE, + IFCBUILDINGELEMENTPROXY, + IFCBUILDINGELEMENTPROXYTYPE, + IFCBUILDINGELEMENTTYPE, + IFCBUILDINGSTOREY, + IFCBUILDINGSYSTEM, + IFCBURNER, + IFCBURNERTYPE, + IFCCABLECARRIERFITTING, + IFCCABLECARRIERFITTINGTYPE, + IFCCABLECARRIERSEGMENT, + IFCCABLECARRIERSEGMENTTYPE, + IFCCABLEFITTING, + IFCCABLEFITTINGTYPE, + IFCCABLESEGMENT, + IFCCABLESEGMENTTYPE, + IFCCAISSONFOUNDATION, + IFCCAISSONFOUNDATIONTYPE, + IFCCARTESIANPOINT, + IFCCARTESIANPOINTLIST, + IFCCARTESIANPOINTLIST2D, + IFCCARTESIANPOINTLIST3D, + IFCCARTESIANTRANSFORMATIONOPERATOR, + IFCCARTESIANTRANSFORMATIONOPERATOR2D, + IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM, + IFCCARTESIANTRANSFORMATIONOPERATOR3D, + IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM, + IFCCENTERLINEPROFILEDEF, + IFCCHILLER, + IFCCHILLERTYPE, + IFCCHIMNEY, + IFCCHIMNEYTYPE, + IFCCIRCLE, + IFCCIRCLEHOLLOWPROFILEDEF, + IFCCIRCLEPROFILEDEF, + IFCCIRCULARARCSEGMENT2D, + IFCCIVILELEMENT, + IFCCIVILELEMENTTYPE, + IFCCLASSIFICATION, + IFCCLASSIFICATIONREFERENCE, + IFCCLOSEDSHELL, + IFCCOIL, + IFCCOILTYPE, + IFCCOLOURRGB, + IFCCOLOURRGBLIST, + IFCCOLOURSPECIFICATION, + IFCCOLUMN, + IFCCOLUMNSTANDARDCASE, + IFCCOLUMNTYPE, + IFCCOMMUNICATIONSAPPLIANCE, + IFCCOMMUNICATIONSAPPLIANCETYPE, + IFCCOMPLEXPROPERTY, + IFCCOMPLEXPROPERTYTEMPLATE, + IFCCOMPOSITECURVE, + IFCCOMPOSITECURVEONSURFACE, + IFCCOMPOSITECURVESEGMENT, + IFCCOMPOSITEPROFILEDEF, + IFCCOMPRESSOR, + IFCCOMPRESSORTYPE, + IFCCONDENSER, + IFCCONDENSERTYPE, + IFCCONIC, + IFCCONNECTEDFACESET, + IFCCONNECTIONCURVEGEOMETRY, + IFCCONNECTIONGEOMETRY, + IFCCONNECTIONPOINTECCENTRICITY, + IFCCONNECTIONPOINTGEOMETRY, + IFCCONNECTIONSURFACEGEOMETRY, + IFCCONNECTIONVOLUMEGEOMETRY, + IFCCONSTRAINT, + IFCCONSTRUCTIONEQUIPMENTRESOURCE, + IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE, + IFCCONSTRUCTIONMATERIALRESOURCE, + IFCCONSTRUCTIONMATERIALRESOURCETYPE, + IFCCONSTRUCTIONPRODUCTRESOURCE, + IFCCONSTRUCTIONPRODUCTRESOURCETYPE, + IFCCONSTRUCTIONRESOURCE, + IFCCONSTRUCTIONRESOURCETYPE, + IFCCONTEXT, + IFCCONTEXTDEPENDENTUNIT, + IFCCONTROL, + IFCCONTROLLER, + IFCCONTROLLERTYPE, + IFCCONVERSIONBASEDUNIT, + IFCCONVERSIONBASEDUNITWITHOFFSET, + IFCCOOLEDBEAM, + IFCCOOLEDBEAMTYPE, + IFCCOOLINGTOWER, + IFCCOOLINGTOWERTYPE, + IFCCOORDINATEOPERATION, + IFCCOORDINATEREFERENCESYSTEM, + IFCCOSTITEM, + IFCCOSTSCHEDULE, + IFCCOSTVALUE, + IFCCOVERING, + IFCCOVERINGTYPE, + IFCCREWRESOURCE, + IFCCREWRESOURCETYPE, + IFCCSGPRIMITIVE3D, + IFCCSGSOLID, + IFCCSHAPEPROFILEDEF, + IFCCURRENCYRELATIONSHIP, + IFCCURTAINWALL, + IFCCURTAINWALLTYPE, + IFCCURVE, + IFCCURVEBOUNDEDPLANE, + IFCCURVEBOUNDEDSURFACE, + IFCCURVESEGMENT2D, + IFCCURVESTYLE, + IFCCURVESTYLEFONT, + IFCCURVESTYLEFONTANDSCALING, + IFCCURVESTYLEFONTPATTERN, + IFCCYLINDRICALSURFACE, + IFCDAMPER, + IFCDAMPERTYPE, + IFCDEEPFOUNDATION, + IFCDEEPFOUNDATIONTYPE, + IFCDERIVEDPROFILEDEF, + IFCDERIVEDUNIT, + IFCDERIVEDUNITELEMENT, + IFCDIMENSIONALEXPONENTS, + IFCDIRECTION, + IFCDISCRETEACCESSORY, + IFCDISCRETEACCESSORYTYPE, + IFCDISTANCEEXPRESSION, + IFCDISTRIBUTIONCHAMBERELEMENT, + IFCDISTRIBUTIONCHAMBERELEMENTTYPE, + IFCDISTRIBUTIONCIRCUIT, + IFCDISTRIBUTIONCONTROLELEMENT, + IFCDISTRIBUTIONCONTROLELEMENTTYPE, + IFCDISTRIBUTIONELEMENT, + IFCDISTRIBUTIONELEMENTTYPE, + IFCDISTRIBUTIONFLOWELEMENT, + IFCDISTRIBUTIONFLOWELEMENTTYPE, + IFCDISTRIBUTIONPORT, + IFCDISTRIBUTIONSYSTEM, + IFCDOCUMENTINFORMATION, + IFCDOCUMENTINFORMATIONRELATIONSHIP, + IFCDOCUMENTREFERENCE, + IFCDOOR, + IFCDOORLININGPROPERTIES, + IFCDOORPANELPROPERTIES, + IFCDOORSTANDARDCASE, + IFCDOORSTYLE, + IFCDOORTYPE, + IFCDRAUGHTINGPREDEFINEDCOLOUR, + IFCDRAUGHTINGPREDEFINEDCURVEFONT, + IFCDUCTFITTING, + IFCDUCTFITTINGTYPE, + IFCDUCTSEGMENT, + IFCDUCTSEGMENTTYPE, + IFCDUCTSILENCER, + IFCDUCTSILENCERTYPE, + IFCEDGE, + IFCEDGECURVE, + IFCEDGELOOP, + IFCELECTRICAPPLIANCE, + IFCELECTRICAPPLIANCETYPE, + IFCELECTRICDISTRIBUTIONBOARD, + IFCELECTRICDISTRIBUTIONBOARDTYPE, + IFCELECTRICFLOWSTORAGEDEVICE, + IFCELECTRICFLOWSTORAGEDEVICETYPE, + IFCELECTRICGENERATOR, + IFCELECTRICGENERATORTYPE, + IFCELECTRICMOTOR, + IFCELECTRICMOTORTYPE, + IFCELECTRICTIMECONTROL, + IFCELECTRICTIMECONTROLTYPE, + IFCELEMENT, + IFCELEMENTARYSURFACE, + IFCELEMENTASSEMBLY, + IFCELEMENTASSEMBLYTYPE, + IFCELEMENTCOMPONENT, + IFCELEMENTCOMPONENTTYPE, + IFCELEMENTQUANTITY, + IFCELEMENTTYPE, + IFCELLIPSE, + IFCELLIPSEPROFILEDEF, + IFCENERGYCONVERSIONDEVICE, + IFCENERGYCONVERSIONDEVICETYPE, + IFCENGINE, + IFCENGINETYPE, + IFCEVAPORATIVECOOLER, + IFCEVAPORATIVECOOLERTYPE, + IFCEVAPORATOR, + IFCEVAPORATORTYPE, + IFCEVENT, + IFCEVENTTIME, + IFCEVENTTYPE, + IFCEXTENDEDPROPERTIES, + IFCEXTERNALINFORMATION, + IFCEXTERNALLYDEFINEDHATCHSTYLE, + IFCEXTERNALLYDEFINEDSURFACESTYLE, + IFCEXTERNALLYDEFINEDTEXTFONT, + IFCEXTERNALREFERENCE, + IFCEXTERNALREFERENCERELATIONSHIP, + IFCEXTERNALSPATIALELEMENT, + IFCEXTERNALSPATIALSTRUCTUREELEMENT, + IFCEXTRUDEDAREASOLID, + IFCEXTRUDEDAREASOLIDTAPERED, + IFCFACE, + IFCFACEBASEDSURFACEMODEL, + IFCFACEBOUND, + IFCFACEOUTERBOUND, + IFCFACESURFACE, + IFCFACETEDBREP, + IFCFACETEDBREPWITHVOIDS, + IFCFACILITY, + IFCFACILITYPART, + IFCFAILURECONNECTIONCONDITION, + IFCFAN, + IFCFANTYPE, + IFCFASTENER, + IFCFASTENERTYPE, + IFCFEATUREELEMENT, + IFCFEATUREELEMENTADDITION, + IFCFEATUREELEMENTSUBTRACTION, + IFCFILLAREASTYLE, + IFCFILLAREASTYLEHATCHING, + IFCFILLAREASTYLETILES, + IFCFILTER, + IFCFILTERTYPE, + IFCFIRESUPPRESSIONTERMINAL, + IFCFIRESUPPRESSIONTERMINALTYPE, + IFCFIXEDREFERENCESWEPTAREASOLID, + IFCFLOWCONTROLLER, + IFCFLOWCONTROLLERTYPE, + IFCFLOWFITTING, + IFCFLOWFITTINGTYPE, + IFCFLOWINSTRUMENT, + IFCFLOWINSTRUMENTTYPE, + IFCFLOWMETER, + IFCFLOWMETERTYPE, + IFCFLOWMOVINGDEVICE, + IFCFLOWMOVINGDEVICETYPE, + IFCFLOWSEGMENT, + IFCFLOWSEGMENTTYPE, + IFCFLOWSTORAGEDEVICE, + IFCFLOWSTORAGEDEVICETYPE, + IFCFLOWTERMINAL, + IFCFLOWTERMINALTYPE, + IFCFLOWTREATMENTDEVICE, + IFCFLOWTREATMENTDEVICETYPE, + IFCFOOTING, + IFCFOOTINGTYPE, + IFCFURNISHINGELEMENT, + IFCFURNISHINGELEMENTTYPE, + IFCFURNITURE, + IFCFURNITURETYPE, + IFCGEOGRAPHICELEMENT, + IFCGEOGRAPHICELEMENTTYPE, + IFCGEOMETRICCURVESET, + IFCGEOMETRICREPRESENTATIONCONTEXT, + IFCGEOMETRICREPRESENTATIONITEM, + IFCGEOMETRICREPRESENTATIONSUBCONTEXT, + IFCGEOMETRICSET, + IFCGRID, + IFCGRIDAXIS, + IFCGRIDPLACEMENT, + IFCGROUP, + IFCHALFSPACESOLID, + IFCHEATEXCHANGER, + IFCHEATEXCHANGERTYPE, + IFCHUMIDIFIER, + IFCHUMIDIFIERTYPE, + IFCIMAGETEXTURE, + IFCINDEXEDCOLOURMAP, + IFCINDEXEDPOLYCURVE, + IFCINDEXEDPOLYGONALFACE, + IFCINDEXEDPOLYGONALFACEWITHVOIDS, + IFCINDEXEDTEXTUREMAP, + IFCINDEXEDTRIANGLETEXTUREMAP, + IFCINTERCEPTOR, + IFCINTERCEPTORTYPE, + IFCINTERSECTIONCURVE, + IFCINVENTORY, + IFCIRREGULARTIMESERIES, + IFCIRREGULARTIMESERIESVALUE, + IFCISHAPEPROFILEDEF, + IFCJUNCTIONBOX, + IFCJUNCTIONBOXTYPE, + IFCLABORRESOURCE, + IFCLABORRESOURCETYPE, + IFCLAGTIME, + IFCLAMP, + IFCLAMPTYPE, + IFCLIBRARYINFORMATION, + IFCLIBRARYREFERENCE, + IFCLIGHTDISTRIBUTIONDATA, + IFCLIGHTFIXTURE, + IFCLIGHTFIXTURETYPE, + IFCLIGHTINTENSITYDISTRIBUTION, + IFCLIGHTSOURCE, + IFCLIGHTSOURCEAMBIENT, + IFCLIGHTSOURCEDIRECTIONAL, + IFCLIGHTSOURCEGONIOMETRIC, + IFCLIGHTSOURCEPOSITIONAL, + IFCLIGHTSOURCESPOT, + IFCLINE, + IFCLINEARPLACEMENT, + IFCLINEARPOSITIONINGELEMENT, + IFCLINESEGMENT2D, + IFCLOCALPLACEMENT, + IFCLOOP, + IFCLSHAPEPROFILEDEF, + IFCMANIFOLDSOLIDBREP, + IFCMAPCONVERSION, + IFCMAPPEDITEM, + IFCMATERIAL, + IFCMATERIALCLASSIFICATIONRELATIONSHIP, + IFCMATERIALCONSTITUENT, + IFCMATERIALCONSTITUENTSET, + IFCMATERIALDEFINITION, + IFCMATERIALDEFINITIONREPRESENTATION, + IFCMATERIALLAYER, + IFCMATERIALLAYERSET, + IFCMATERIALLAYERSETUSAGE, + IFCMATERIALLAYERWITHOFFSETS, + IFCMATERIALLIST, + IFCMATERIALPROFILE, + IFCMATERIALPROFILESET, + IFCMATERIALPROFILESETUSAGE, + IFCMATERIALPROFILESETUSAGETAPERING, + IFCMATERIALPROFILEWITHOFFSETS, + IFCMATERIALPROPERTIES, + IFCMATERIALRELATIONSHIP, + IFCMATERIALUSAGEDEFINITION, + IFCMEASUREWITHUNIT, + IFCMECHANICALFASTENER, + IFCMECHANICALFASTENERTYPE, + IFCMEDICALDEVICE, + IFCMEDICALDEVICETYPE, + IFCMEMBER, + IFCMEMBERSTANDARDCASE, + IFCMEMBERTYPE, + IFCMETRIC, + IFCMIRROREDPROFILEDEF, + IFCMONETARYUNIT, + IFCMOTORCONNECTION, + IFCMOTORCONNECTIONTYPE, + IFCNAMEDUNIT, + IFCOBJECT, + IFCOBJECTDEFINITION, + IFCOBJECTIVE, + IFCOBJECTPLACEMENT, + IFCOCCUPANT, + IFCOFFSETCURVE, + IFCOFFSETCURVE2D, + IFCOFFSETCURVE3D, + IFCOFFSETCURVEBYDISTANCES, + IFCOPENINGELEMENT, + IFCOPENINGSTANDARDCASE, + IFCOPENSHELL, + IFCORGANIZATION, + IFCORGANIZATIONRELATIONSHIP, + IFCORIENTATIONEXPRESSION, + IFCORIENTEDEDGE, + IFCOUTERBOUNDARYCURVE, + IFCOUTLET, + IFCOUTLETTYPE, + IFCOWNERHISTORY, + IFCPARAMETERIZEDPROFILEDEF, + IFCPATH, + IFCPCURVE, + IFCPERFORMANCEHISTORY, + IFCPERMEABLECOVERINGPROPERTIES, + IFCPERMIT, + IFCPERSON, + IFCPERSONANDORGANIZATION, + IFCPHYSICALCOMPLEXQUANTITY, + IFCPHYSICALQUANTITY, + IFCPHYSICALSIMPLEQUANTITY, + IFCPILE, + IFCPILETYPE, + IFCPIPEFITTING, + IFCPIPEFITTINGTYPE, + IFCPIPESEGMENT, + IFCPIPESEGMENTTYPE, + IFCPIXELTEXTURE, + IFCPLACEMENT, + IFCPLANARBOX, + IFCPLANAREXTENT, + IFCPLANE, + IFCPLATE, + IFCPLATESTANDARDCASE, + IFCPLATETYPE, + IFCPOINT, + IFCPOINTONCURVE, + IFCPOINTONSURFACE, + IFCPOLYGONALBOUNDEDHALFSPACE, + IFCPOLYGONALFACESET, + IFCPOLYLINE, + IFCPOLYLOOP, + IFCPORT, + IFCPOSITIONINGELEMENT, + IFCPOSTALADDRESS, + IFCPREDEFINEDCOLOUR, + IFCPREDEFINEDCURVEFONT, + IFCPREDEFINEDITEM, + IFCPREDEFINEDPROPERTIES, + IFCPREDEFINEDPROPERTYSET, + IFCPREDEFINEDTEXTFONT, + IFCPRESENTATIONITEM, + IFCPRESENTATIONLAYERASSIGNMENT, + IFCPRESENTATIONLAYERWITHSTYLE, + IFCPRESENTATIONSTYLE, + IFCPRESENTATIONSTYLEASSIGNMENT, + IFCPROCEDURE, + IFCPROCEDURETYPE, + IFCPROCESS, + IFCPRODUCT, + IFCPRODUCTDEFINITIONSHAPE, + IFCPRODUCTREPRESENTATION, + IFCPROFILEDEF, + IFCPROFILEPROPERTIES, + IFCPROJECT, + IFCPROJECTEDCRS, + IFCPROJECTIONELEMENT, + IFCPROJECTLIBRARY, + IFCPROJECTORDER, + IFCPROPERTY, + IFCPROPERTYABSTRACTION, + IFCPROPERTYBOUNDEDVALUE, + IFCPROPERTYDEFINITION, + IFCPROPERTYDEPENDENCYRELATIONSHIP, + IFCPROPERTYENUMERATEDVALUE, + IFCPROPERTYENUMERATION, + IFCPROPERTYLISTVALUE, + IFCPROPERTYREFERENCEVALUE, + IFCPROPERTYSET, + IFCPROPERTYSETDEFINITION, + IFCPROPERTYSETTEMPLATE, + IFCPROPERTYSINGLEVALUE, + IFCPROPERTYTABLEVALUE, + IFCPROPERTYTEMPLATE, + IFCPROPERTYTEMPLATEDEFINITION, + IFCPROTECTIVEDEVICE, + IFCPROTECTIVEDEVICETRIPPINGUNIT, + IFCPROTECTIVEDEVICETRIPPINGUNITTYPE, + IFCPROTECTIVEDEVICETYPE, + IFCPROXY, + IFCPUMP, + IFCPUMPTYPE, + IFCQUANTITYAREA, + IFCQUANTITYCOUNT, + IFCQUANTITYLENGTH, + IFCQUANTITYSET, + IFCQUANTITYTIME, + IFCQUANTITYVOLUME, + IFCQUANTITYWEIGHT, + IFCRAILING, + IFCRAILINGTYPE, + IFCRAMP, + IFCRAMPFLIGHT, + IFCRAMPFLIGHTTYPE, + IFCRAMPTYPE, + IFCRATIONALBSPLINECURVEWITHKNOTS, + IFCRATIONALBSPLINESURFACEWITHKNOTS, + IFCRECTANGLEHOLLOWPROFILEDEF, + IFCRECTANGLEPROFILEDEF, + IFCRECTANGULARPYRAMID, + IFCRECTANGULARTRIMMEDSURFACE, + IFCRECURRENCEPATTERN, + IFCREFERENCE, + IFCREFERENT, + IFCREGULARTIMESERIES, + IFCREINFORCEMENTBARPROPERTIES, + IFCREINFORCEMENTDEFINITIONPROPERTIES, + IFCREINFORCINGBAR, + IFCREINFORCINGBARTYPE, + IFCREINFORCINGELEMENT, + IFCREINFORCINGELEMENTTYPE, + IFCREINFORCINGMESH, + IFCREINFORCINGMESHTYPE, + IFCRELAGGREGATES, + IFCRELASSIGNS, + IFCRELASSIGNSTOACTOR, + IFCRELASSIGNSTOCONTROL, + IFCRELASSIGNSTOGROUP, + IFCRELASSIGNSTOGROUPBYFACTOR, + IFCRELASSIGNSTOPROCESS, + IFCRELASSIGNSTOPRODUCT, + IFCRELASSIGNSTORESOURCE, + IFCRELASSOCIATES, + IFCRELASSOCIATESAPPROVAL, + IFCRELASSOCIATESCLASSIFICATION, + IFCRELASSOCIATESCONSTRAINT, + IFCRELASSOCIATESDOCUMENT, + IFCRELASSOCIATESLIBRARY, + IFCRELASSOCIATESMATERIAL, + IFCRELATIONSHIP, + IFCRELCONNECTS, + IFCRELCONNECTSELEMENTS, + IFCRELCONNECTSPATHELEMENTS, + IFCRELCONNECTSPORTS, + IFCRELCONNECTSPORTTOELEMENT, + IFCRELCONNECTSSTRUCTURALACTIVITY, + IFCRELCONNECTSSTRUCTURALMEMBER, + IFCRELCONNECTSWITHECCENTRICITY, + IFCRELCONNECTSWITHREALIZINGELEMENTS, + IFCRELCONTAINEDINSPATIALSTRUCTURE, + IFCRELCOVERSBLDGELEMENTS, + IFCRELCOVERSSPACES, + IFCRELDECLARES, + IFCRELDECOMPOSES, + IFCRELDEFINES, + IFCRELDEFINESBYOBJECT, + IFCRELDEFINESBYPROPERTIES, + IFCRELDEFINESBYTEMPLATE, + IFCRELDEFINESBYTYPE, + IFCRELFILLSELEMENT, + IFCRELFLOWCONTROLELEMENTS, + IFCRELINTERFERESELEMENTS, + IFCRELNESTS, + IFCRELPOSITIONS, + IFCRELPROJECTSELEMENT, + IFCRELREFERENCEDINSPATIALSTRUCTURE, + IFCRELSEQUENCE, + IFCRELSERVICESBUILDINGS, + IFCRELSPACEBOUNDARY, + IFCRELSPACEBOUNDARY1STLEVEL, + IFCRELSPACEBOUNDARY2NDLEVEL, + IFCRELVOIDSELEMENT, + IFCREPARAMETRISEDCOMPOSITECURVESEGMENT, + IFCREPRESENTATION, + IFCREPRESENTATIONCONTEXT, + IFCREPRESENTATIONITEM, + IFCREPRESENTATIONMAP, + IFCRESOURCE, + IFCRESOURCEAPPROVALRELATIONSHIP, + IFCRESOURCECONSTRAINTRELATIONSHIP, + IFCRESOURCELEVELRELATIONSHIP, + IFCRESOURCETIME, + IFCREVOLVEDAREASOLID, + IFCREVOLVEDAREASOLIDTAPERED, + IFCRIGHTCIRCULARCONE, + IFCRIGHTCIRCULARCYLINDER, + IFCROOF, + IFCROOFTYPE, + IFCROOT, + IFCROUNDEDRECTANGLEPROFILEDEF, + IFCSANITARYTERMINAL, + IFCSANITARYTERMINALTYPE, + IFCSCHEDULINGTIME, + IFCSEAMCURVE, + IFCSECTIONEDSOLID, + IFCSECTIONEDSOLIDHORIZONTAL, + IFCSECTIONEDSPINE, + IFCSECTIONPROPERTIES, + IFCSECTIONREINFORCEMENTPROPERTIES, + IFCSENSOR, + IFCSENSORTYPE, + IFCSHADINGDEVICE, + IFCSHADINGDEVICETYPE, + IFCSHAPEASPECT, + IFCSHAPEMODEL, + IFCSHAPEREPRESENTATION, + IFCSHELLBASEDSURFACEMODEL, + IFCSIMPLEPROPERTY, + IFCSIMPLEPROPERTYTEMPLATE, + IFCSITE, + IFCSIUNIT, + IFCSLAB, + IFCSLABELEMENTEDCASE, + IFCSLABSTANDARDCASE, + IFCSLABTYPE, + IFCSLIPPAGECONNECTIONCONDITION, + IFCSOLARDEVICE, + IFCSOLARDEVICETYPE, + IFCSOLIDMODEL, + IFCSPACE, + IFCSPACEHEATER, + IFCSPACEHEATERTYPE, + IFCSPACETYPE, + IFCSPATIALELEMENT, + IFCSPATIALELEMENTTYPE, + IFCSPATIALSTRUCTUREELEMENT, + IFCSPATIALSTRUCTUREELEMENTTYPE, + IFCSPATIALZONE, + IFCSPATIALZONETYPE, + IFCSPHERE, + IFCSPHERICALSURFACE, + IFCSTACKTERMINAL, + IFCSTACKTERMINALTYPE, + IFCSTAIR, + IFCSTAIRFLIGHT, + IFCSTAIRFLIGHTTYPE, + IFCSTAIRTYPE, + IFCSTRUCTURALACTION, + IFCSTRUCTURALACTIVITY, + IFCSTRUCTURALANALYSISMODEL, + IFCSTRUCTURALCONNECTION, + IFCSTRUCTURALCONNECTIONCONDITION, + IFCSTRUCTURALCURVEACTION, + IFCSTRUCTURALCURVECONNECTION, + IFCSTRUCTURALCURVEMEMBER, + IFCSTRUCTURALCURVEMEMBERVARYING, + IFCSTRUCTURALCURVEREACTION, + IFCSTRUCTURALITEM, + IFCSTRUCTURALLINEARACTION, + IFCSTRUCTURALLOAD, + IFCSTRUCTURALLOADCASE, + IFCSTRUCTURALLOADCONFIGURATION, + IFCSTRUCTURALLOADGROUP, + IFCSTRUCTURALLOADLINEARFORCE, + IFCSTRUCTURALLOADORRESULT, + IFCSTRUCTURALLOADPLANARFORCE, + IFCSTRUCTURALLOADSINGLEDISPLACEMENT, + IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION, + IFCSTRUCTURALLOADSINGLEFORCE, + IFCSTRUCTURALLOADSINGLEFORCEWARPING, + IFCSTRUCTURALLOADSTATIC, + IFCSTRUCTURALLOADTEMPERATURE, + IFCSTRUCTURALMEMBER, + IFCSTRUCTURALPLANARACTION, + IFCSTRUCTURALPOINTACTION, + IFCSTRUCTURALPOINTCONNECTION, + IFCSTRUCTURALPOINTREACTION, + IFCSTRUCTURALREACTION, + IFCSTRUCTURALRESULTGROUP, + IFCSTRUCTURALSURFACEACTION, + IFCSTRUCTURALSURFACECONNECTION, + IFCSTRUCTURALSURFACEMEMBER, + IFCSTRUCTURALSURFACEMEMBERVARYING, + IFCSTRUCTURALSURFACEREACTION, + IFCSTYLEDITEM, + IFCSTYLEDREPRESENTATION, + IFCSTYLEMODEL, + IFCSUBCONTRACTRESOURCE, + IFCSUBCONTRACTRESOURCETYPE, + IFCSUBEDGE, + IFCSURFACE, + IFCSURFACECURVE, + IFCSURFACECURVESWEPTAREASOLID, + IFCSURFACEFEATURE, + IFCSURFACEOFLINEAREXTRUSION, + IFCSURFACEOFREVOLUTION, + IFCSURFACEREINFORCEMENTAREA, + IFCSURFACESTYLE, + IFCSURFACESTYLELIGHTING, + IFCSURFACESTYLEREFRACTION, + IFCSURFACESTYLERENDERING, + IFCSURFACESTYLESHADING, + IFCSURFACESTYLEWITHTEXTURES, + IFCSURFACETEXTURE, + IFCSWEPTAREASOLID, + IFCSWEPTDISKSOLID, + IFCSWEPTDISKSOLIDPOLYGONAL, + IFCSWEPTSURFACE, + IFCSWITCHINGDEVICE, + IFCSWITCHINGDEVICETYPE, + IFCSYSTEM, + IFCSYSTEMFURNITUREELEMENT, + IFCSYSTEMFURNITUREELEMENTTYPE, + IFCTABLE, + IFCTABLECOLUMN, + IFCTABLEROW, + IFCTANK, + IFCTANKTYPE, + IFCTASK, + IFCTASKTIME, + IFCTASKTIMERECURRING, + IFCTASKTYPE, + IFCTELECOMADDRESS, + IFCTENDON, + IFCTENDONANCHOR, + IFCTENDONANCHORTYPE, + IFCTENDONCONDUIT, + IFCTENDONCONDUITTYPE, + IFCTENDONTYPE, + IFCTESSELLATEDFACESET, + IFCTESSELLATEDITEM, + IFCTEXTLITERAL, + IFCTEXTLITERALWITHEXTENT, + IFCTEXTSTYLE, + IFCTEXTSTYLEFONTMODEL, + IFCTEXTSTYLEFORDEFINEDFONT, + IFCTEXTSTYLETEXTMODEL, + IFCTEXTURECOORDINATE, + IFCTEXTURECOORDINATEGENERATOR, + IFCTEXTUREMAP, + IFCTEXTUREVERTEX, + IFCTEXTUREVERTEXLIST, + IFCTIMEPERIOD, + IFCTIMESERIES, + IFCTIMESERIESVALUE, + IFCTOPOLOGICALREPRESENTATIONITEM, + IFCTOPOLOGYREPRESENTATION, + IFCTOROIDALSURFACE, + IFCTRANSFORMER, + IFCTRANSFORMERTYPE, + IFCTRANSITIONCURVESEGMENT2D, + IFCTRANSPORTELEMENT, + IFCTRANSPORTELEMENTTYPE, + IFCTRAPEZIUMPROFILEDEF, + IFCTRIANGULATEDFACESET, + IFCTRIANGULATEDIRREGULARNETWORK, + IFCTRIMMEDCURVE, + IFCTSHAPEPROFILEDEF, + IFCTUBEBUNDLE, + IFCTUBEBUNDLETYPE, + IFCTYPEOBJECT, + IFCTYPEPROCESS, + IFCTYPEPRODUCT, + IFCTYPERESOURCE, + IFCUNITARYCONTROLELEMENT, + IFCUNITARYCONTROLELEMENTTYPE, + IFCUNITARYEQUIPMENT, + IFCUNITARYEQUIPMENTTYPE, + IFCUNITASSIGNMENT, + IFCUSHAPEPROFILEDEF, + IFCVALVE, + IFCVALVETYPE, + IFCVECTOR, + IFCVERTEX, + IFCVERTEXLOOP, + IFCVERTEXPOINT, + IFCVIBRATIONDAMPER, + IFCVIBRATIONDAMPERTYPE, + IFCVIBRATIONISOLATOR, + IFCVIBRATIONISOLATORTYPE, + IFCVIRTUALELEMENT, + IFCVIRTUALGRIDINTERSECTION, + IFCVOIDINGFEATURE, + IFCWALL, + IFCWALLELEMENTEDCASE, + IFCWALLSTANDARDCASE, + IFCWALLTYPE, + IFCWASTETERMINAL, + IFCWASTETERMINALTYPE, + IFCWINDOW, + IFCWINDOWLININGPROPERTIES, + IFCWINDOWPANELPROPERTIES, + IFCWINDOWSTANDARDCASE, + IFCWINDOWSTYLE, + IFCWINDOWTYPE, + IFCWORKCALENDAR, + IFCWORKCONTROL, + IFCWORKPLAN, + IFCWORKSCHEDULE, + IFCWORKTIME, + IFCZONE, + IFCZSHAPEPROFILEDEF, + IfcAPI, + IfcAbsorbedDoseMeasure, + IfcAccelerationMeasure, + IfcActionRequest, + IfcActionRequestTypeEnum, + IfcActionSourceTypeEnum, + IfcActionTypeEnum, + IfcActor, + IfcActorRole, + IfcActuator, + IfcActuatorType, + IfcActuatorTypeEnum, + IfcAddress, + IfcAddressTypeEnum, + IfcAdvancedBrep, + IfcAdvancedBrepWithVoids, + IfcAdvancedFace, + IfcAirTerminal, + IfcAirTerminalBox, + IfcAirTerminalBoxType, + IfcAirTerminalBoxTypeEnum, + IfcAirTerminalType, + IfcAirTerminalTypeEnum, + IfcAirToAirHeatRecovery, + IfcAirToAirHeatRecoveryType, + IfcAirToAirHeatRecoveryTypeEnum, + IfcAlarm, + IfcAlarmType, + IfcAlarmTypeEnum, + IfcAlignment, + IfcAlignment2DHorizontal, + IfcAlignment2DHorizontalSegment, + IfcAlignment2DSegment, + IfcAlignment2DVerSegCircularArc, + IfcAlignment2DVerSegLine, + IfcAlignment2DVerSegParabolicArc, + IfcAlignment2DVertical, + IfcAlignment2DVerticalSegment, + IfcAlignmentCurve, + IfcAlignmentTypeEnum, + IfcAmountOfSubstanceMeasure, + IfcAnalysisModelTypeEnum, + IfcAnalysisTheoryTypeEnum, + IfcAngularVelocityMeasure, + IfcAnnotation, + IfcAnnotationFillArea, + IfcApplication, + IfcAppliedValue, + IfcApproval, + IfcApprovalRelationship, + IfcArbitraryClosedProfileDef, + IfcArbitraryOpenProfileDef, + IfcArbitraryProfileDefWithVoids, + IfcAreaDensityMeasure, + IfcAreaMeasure, + IfcArithmeticOperatorEnum, + IfcAssemblyPlaceEnum, + IfcAsset, + IfcAsymmetricIShapeProfileDef, + IfcAudioVisualAppliance, + IfcAudioVisualApplianceType, + IfcAudioVisualApplianceTypeEnum, + IfcAxis1Placement, + IfcAxis2Placement2D, + IfcAxis2Placement3D, + IfcBSplineCurve, + IfcBSplineCurveForm, + IfcBSplineCurveWithKnots, + IfcBSplineSurface, + IfcBSplineSurfaceForm, + IfcBSplineSurfaceWithKnots, + IfcBeam, + IfcBeamStandardCase, + IfcBeamType, + IfcBeamTypeEnum, + IfcBearing, + IfcBearingType, + IfcBearingTypeDisplacementEnum, + IfcBearingTypeEnum, + IfcBenchmarkEnum, + IfcBinary, + IfcBlobTexture, + IfcBlock, + IfcBoiler, + IfcBoilerType, + IfcBoilerTypeEnum, + IfcBoolean, + IfcBooleanClippingResult, + IfcBooleanOperator, + IfcBooleanResult, + IfcBoundaryCondition, + IfcBoundaryCurve, + IfcBoundaryEdgeCondition, + IfcBoundaryFaceCondition, + IfcBoundaryNodeCondition, + IfcBoundaryNodeConditionWarping, + IfcBoundedCurve, + IfcBoundedSurface, + IfcBoundingBox, + IfcBoxAlignment, + IfcBoxedHalfSpace, + IfcBridge, + IfcBridgePart, + IfcBridgePartTypeEnum, + IfcBridgeTypeEnum, + IfcBuilding, + IfcBuildingElement, + IfcBuildingElementPart, + IfcBuildingElementPartType, + IfcBuildingElementPartTypeEnum, + IfcBuildingElementProxy, + IfcBuildingElementProxyType, + IfcBuildingElementProxyTypeEnum, + IfcBuildingElementType, + IfcBuildingStorey, + IfcBuildingSystem, + IfcBuildingSystemTypeEnum, + IfcBurner, + IfcBurnerType, + IfcBurnerTypeEnum, + IfcCShapeProfileDef, + IfcCableCarrierFitting, + IfcCableCarrierFittingType, + IfcCableCarrierFittingTypeEnum, + IfcCableCarrierSegment, + IfcCableCarrierSegmentType, + IfcCableCarrierSegmentTypeEnum, + IfcCableFitting, + IfcCableFittingType, + IfcCableFittingTypeEnum, + IfcCableSegment, + IfcCableSegmentType, + IfcCableSegmentTypeEnum, + IfcCaissonFoundation, + IfcCaissonFoundationType, + IfcCaissonFoundationTypeEnum, + IfcCardinalPointReference, + IfcCartesianPoint, + IfcCartesianPointList, + IfcCartesianPointList2D, + IfcCartesianPointList3D, + IfcCartesianTransformationOperator, + IfcCartesianTransformationOperator2D, + IfcCartesianTransformationOperator2DnonUniform, + IfcCartesianTransformationOperator3D, + IfcCartesianTransformationOperator3DnonUniform, + IfcCenterLineProfileDef, + IfcChangeActionEnum, + IfcChiller, + IfcChillerType, + IfcChillerTypeEnum, + IfcChimney, + IfcChimneyType, + IfcChimneyTypeEnum, + IfcCircle, + IfcCircleHollowProfileDef, + IfcCircleProfileDef, + IfcCircularArcSegment2D, + IfcCivilElement, + IfcCivilElementType, + IfcClassification, + IfcClassificationReference, + IfcClosedShell, + IfcCoil, + IfcCoilType, + IfcCoilTypeEnum, + IfcColourRgb, + IfcColourRgbList, + IfcColourSpecification, + IfcColumn, + IfcColumnStandardCase, + IfcColumnType, + IfcColumnTypeEnum, + IfcCommunicationsAppliance, + IfcCommunicationsApplianceType, + IfcCommunicationsApplianceTypeEnum, + IfcComplexProperty, + IfcComplexPropertyTemplate, + IfcComplexPropertyTemplateTypeEnum, + IfcCompositeCurve, + IfcCompositeCurveOnSurface, + IfcCompositeCurveSegment, + IfcCompositeProfileDef, + IfcCompressor, + IfcCompressorType, + IfcCompressorTypeEnum, + IfcCondenser, + IfcCondenserType, + IfcCondenserTypeEnum, + IfcConic, + IfcConnectedFaceSet, + IfcConnectionCurveGeometry, + IfcConnectionGeometry, + IfcConnectionPointEccentricity, + IfcConnectionPointGeometry, + IfcConnectionSurfaceGeometry, + IfcConnectionTypeEnum, + IfcConnectionVolumeGeometry, + IfcConstraint, + IfcConstraintEnum, + IfcConstructionEquipmentResource, + IfcConstructionEquipmentResourceType, + IfcConstructionEquipmentResourceTypeEnum, + IfcConstructionMaterialResource, + IfcConstructionMaterialResourceType, + IfcConstructionMaterialResourceTypeEnum, + IfcConstructionProductResource, + IfcConstructionProductResourceType, + IfcConstructionProductResourceTypeEnum, + IfcConstructionResource, + IfcConstructionResourceType, + IfcContext, + IfcContextDependentMeasure, + IfcContextDependentUnit, + IfcControl, + IfcController, + IfcControllerType, + IfcControllerTypeEnum, + IfcConversionBasedUnit, + IfcConversionBasedUnitWithOffset, + IfcCooledBeam, + IfcCooledBeamType, + IfcCooledBeamTypeEnum, + IfcCoolingTower, + IfcCoolingTowerType, + IfcCoolingTowerTypeEnum, + IfcCoordinateOperation, + IfcCoordinateReferenceSystem, + IfcCostItem, + IfcCostItemTypeEnum, + IfcCostSchedule, + IfcCostScheduleTypeEnum, + IfcCostValue, + IfcCountMeasure, + IfcCovering, + IfcCoveringType, + IfcCoveringTypeEnum, + IfcCrewResource, + IfcCrewResourceType, + IfcCrewResourceTypeEnum, + IfcCsgPrimitive3D, + IfcCsgSolid, + IfcCurrencyRelationship, + IfcCurtainWall, + IfcCurtainWallType, + IfcCurtainWallTypeEnum, + IfcCurvatureMeasure, + IfcCurve, + IfcCurveBoundedPlane, + IfcCurveBoundedSurface, + IfcCurveInterpolationEnum, + IfcCurveSegment2D, + IfcCurveStyle, + IfcCurveStyleFont, + IfcCurveStyleFontAndScaling, + IfcCurveStyleFontPattern, + IfcCylindricalSurface, + IfcDamper, + IfcDamperType, + IfcDamperTypeEnum, + IfcDataOriginEnum, + IfcDate, + IfcDateTime, + IfcDayInMonthNumber, + IfcDayInWeekNumber, + IfcDeepFoundation, + IfcDeepFoundationType, + IfcDerivedProfileDef, + IfcDerivedUnit, + IfcDerivedUnitElement, + IfcDerivedUnitEnum, + IfcDescriptiveMeasure, + IfcDimensionCount, + IfcDimensionalExponents, + IfcDirection, + IfcDirectionSenseEnum, + IfcDiscreteAccessory, + IfcDiscreteAccessoryType, + IfcDiscreteAccessoryTypeEnum, + IfcDistanceExpression, + IfcDistributionChamberElement, + IfcDistributionChamberElementType, + IfcDistributionChamberElementTypeEnum, + IfcDistributionCircuit, + IfcDistributionControlElement, + IfcDistributionControlElementType, + IfcDistributionElement, + IfcDistributionElementType, + IfcDistributionFlowElement, + IfcDistributionFlowElementType, + IfcDistributionPort, + IfcDistributionPortTypeEnum, + IfcDistributionSystem, + IfcDistributionSystemEnum, + IfcDocumentConfidentialityEnum, + IfcDocumentInformation, + IfcDocumentInformationRelationship, + IfcDocumentReference, + IfcDocumentStatusEnum, + IfcDoor, + IfcDoorLiningProperties, + IfcDoorPanelOperationEnum, + IfcDoorPanelPositionEnum, + IfcDoorPanelProperties, + IfcDoorStandardCase, + IfcDoorStyle, + IfcDoorStyleConstructionEnum, + IfcDoorStyleOperationEnum, + IfcDoorType, + IfcDoorTypeEnum, + IfcDoorTypeOperationEnum, + IfcDoseEquivalentMeasure, + IfcDraughtingPreDefinedColour, + IfcDraughtingPreDefinedCurveFont, + IfcDuctFitting, + IfcDuctFittingType, + IfcDuctFittingTypeEnum, + IfcDuctSegment, + IfcDuctSegmentType, + IfcDuctSegmentTypeEnum, + IfcDuctSilencer, + IfcDuctSilencerType, + IfcDuctSilencerTypeEnum, + IfcDuration, + IfcDynamicViscosityMeasure, + IfcEdge, + IfcEdgeCurve, + IfcEdgeLoop, + IfcElectricAppliance, + IfcElectricApplianceType, + IfcElectricApplianceTypeEnum, + IfcElectricCapacitanceMeasure, + IfcElectricChargeMeasure, + IfcElectricConductanceMeasure, + IfcElectricCurrentMeasure, + IfcElectricDistributionBoard, + IfcElectricDistributionBoardType, + IfcElectricDistributionBoardTypeEnum, + IfcElectricFlowStorageDevice, + IfcElectricFlowStorageDeviceType, + IfcElectricFlowStorageDeviceTypeEnum, + IfcElectricGenerator, + IfcElectricGeneratorType, + IfcElectricGeneratorTypeEnum, + IfcElectricMotor, + IfcElectricMotorType, + IfcElectricMotorTypeEnum, + IfcElectricResistanceMeasure, + IfcElectricTimeControl, + IfcElectricTimeControlType, + IfcElectricTimeControlTypeEnum, + IfcElectricVoltageMeasure, + IfcElement, + IfcElementAssembly, + IfcElementAssemblyType, + IfcElementAssemblyTypeEnum, + IfcElementComponent, + IfcElementComponentType, + IfcElementCompositionEnum, + IfcElementQuantity, + IfcElementType, + IfcElementarySurface, + IfcElements, + IfcEllipse, + IfcEllipseProfileDef, + IfcEnergyConversionDevice, + IfcEnergyConversionDeviceType, + IfcEnergyMeasure, + IfcEngine, + IfcEngineType, + IfcEngineTypeEnum, + IfcEvaporativeCooler, + IfcEvaporativeCoolerType, + IfcEvaporativeCoolerTypeEnum, + IfcEvaporator, + IfcEvaporatorType, + IfcEvaporatorTypeEnum, + IfcEvent, + IfcEventTime, + IfcEventTriggerTypeEnum, + IfcEventType, + IfcEventTypeEnum, + IfcExtendedProperties, + IfcExternalInformation, + IfcExternalReference, + IfcExternalReferenceRelationship, + IfcExternalSpatialElement, + IfcExternalSpatialElementTypeEnum, + IfcExternalSpatialStructureElement, + IfcExternallyDefinedHatchStyle, + IfcExternallyDefinedSurfaceStyle, + IfcExternallyDefinedTextFont, + IfcExtrudedAreaSolid, + IfcExtrudedAreaSolidTapered, + IfcFace, + IfcFaceBasedSurfaceModel, + IfcFaceBound, + IfcFaceOuterBound, + IfcFaceSurface, + IfcFacetedBrep, + IfcFacetedBrepWithVoids, + IfcFacility, + IfcFacilityPart, + IfcFailureConnectionCondition, + IfcFan, + IfcFanType, + IfcFanTypeEnum, + IfcFastener, + IfcFastenerType, + IfcFastenerTypeEnum, + IfcFeatureElement, + IfcFeatureElementAddition, + IfcFeatureElementSubtraction, + IfcFillAreaStyle, + IfcFillAreaStyleHatching, + IfcFillAreaStyleTiles, + IfcFilter, + IfcFilterType, + IfcFilterTypeEnum, + IfcFireSuppressionTerminal, + IfcFireSuppressionTerminalType, + IfcFireSuppressionTerminalTypeEnum, + IfcFixedReferenceSweptAreaSolid, + IfcFlowController, + IfcFlowControllerType, + IfcFlowDirectionEnum, + IfcFlowFitting, + IfcFlowFittingType, + IfcFlowInstrument, + IfcFlowInstrumentType, + IfcFlowInstrumentTypeEnum, + IfcFlowMeter, + IfcFlowMeterType, + IfcFlowMeterTypeEnum, + IfcFlowMovingDevice, + IfcFlowMovingDeviceType, + IfcFlowSegment, + IfcFlowSegmentType, + IfcFlowStorageDevice, + IfcFlowStorageDeviceType, + IfcFlowTerminal, + IfcFlowTerminalType, + IfcFlowTreatmentDevice, + IfcFlowTreatmentDeviceType, + IfcFontStyle, + IfcFontVariant, + IfcFontWeight, + IfcFooting, + IfcFootingType, + IfcFootingTypeEnum, + IfcForceMeasure, + IfcFrequencyMeasure, + IfcFurnishingElement, + IfcFurnishingElementType, + IfcFurniture, + IfcFurnitureType, + IfcFurnitureTypeEnum, + IfcGeographicElement, + IfcGeographicElementType, + IfcGeographicElementTypeEnum, + IfcGeometricCurveSet, + IfcGeometricProjectionEnum, + IfcGeometricRepresentationContext, + IfcGeometricRepresentationItem, + IfcGeometricRepresentationSubContext, + IfcGeometricSet, + IfcGlobalOrLocalEnum, + IfcGloballyUniqueId, + IfcGrid, + IfcGridAxis, + IfcGridPlacement, + IfcGridTypeEnum, + IfcGroup, + IfcHalfSpaceSolid, + IfcHeatExchanger, + IfcHeatExchangerType, + IfcHeatExchangerTypeEnum, + IfcHeatFluxDensityMeasure, + IfcHeatingValueMeasure, + IfcHumidifier, + IfcHumidifierType, + IfcHumidifierTypeEnum, + IfcIShapeProfileDef, + IfcIdentifier, + IfcIlluminanceMeasure, + IfcImageTexture, + IfcIndexedColourMap, + IfcIndexedPolyCurve, + IfcIndexedPolygonalFace, + IfcIndexedPolygonalFaceWithVoids, + IfcIndexedTextureMap, + IfcIndexedTriangleTextureMap, + IfcInductanceMeasure, + IfcInteger, + IfcIntegerCountRateMeasure, + IfcInterceptor, + IfcInterceptorType, + IfcInterceptorTypeEnum, + IfcInternalOrExternalEnum, + IfcIntersectionCurve, + IfcInventory, + IfcInventoryTypeEnum, + IfcIonConcentrationMeasure, + IfcIrregularTimeSeries, + IfcIrregularTimeSeriesValue, + IfcIsothermalMoistureCapacityMeasure, + IfcJunctionBox, + IfcJunctionBoxType, + IfcJunctionBoxTypeEnum, + IfcKinematicViscosityMeasure, + IfcKnotType, + IfcLShapeProfileDef, + IfcLabel, + IfcLaborResource, + IfcLaborResourceType, + IfcLaborResourceTypeEnum, + IfcLagTime, + IfcLamp, + IfcLampType, + IfcLampTypeEnum, + IfcLanguageId, + IfcLayerSetDirectionEnum, + IfcLengthMeasure, + IfcLibraryInformation, + IfcLibraryReference, + IfcLightDistributionCurveEnum, + IfcLightDistributionData, + IfcLightEmissionSourceEnum, + IfcLightFixture, + IfcLightFixtureType, + IfcLightFixtureTypeEnum, + IfcLightIntensityDistribution, + IfcLightSource, + IfcLightSourceAmbient, + IfcLightSourceDirectional, + IfcLightSourceGoniometric, + IfcLightSourcePositional, + IfcLightSourceSpot, + IfcLine, + IfcLineSegment2D, + IfcLinearForceMeasure, + IfcLinearMomentMeasure, + IfcLinearPlacement, + IfcLinearPositioningElement, + IfcLinearStiffnessMeasure, + IfcLinearVelocityMeasure, + IfcLoadGroupTypeEnum, + IfcLocalPlacement, + IfcLogical, + IfcLogicalOperatorEnum, + IfcLoop, + IfcLuminousFluxMeasure, + IfcLuminousIntensityDistributionMeasure, + IfcLuminousIntensityMeasure, + IfcMagneticFluxDensityMeasure, + IfcMagneticFluxMeasure, + IfcManifoldSolidBrep, + IfcMapConversion, + IfcMappedItem, + IfcMassDensityMeasure, + IfcMassFlowRateMeasure, + IfcMassMeasure, + IfcMassPerLengthMeasure, + IfcMaterial, + IfcMaterialClassificationRelationship, + IfcMaterialConstituent, + IfcMaterialConstituentSet, + IfcMaterialDefinition, + IfcMaterialDefinitionRepresentation, + IfcMaterialLayer, + IfcMaterialLayerSet, + IfcMaterialLayerSetUsage, + IfcMaterialLayerWithOffsets, + IfcMaterialList, + IfcMaterialProfile, + IfcMaterialProfileSet, + IfcMaterialProfileSetUsage, + IfcMaterialProfileSetUsageTapering, + IfcMaterialProfileWithOffsets, + IfcMaterialProperties, + IfcMaterialRelationship, + IfcMaterialUsageDefinition, + IfcMeasureWithUnit, + IfcMechanicalFastener, + IfcMechanicalFastenerType, + IfcMechanicalFastenerTypeEnum, + IfcMedicalDevice, + IfcMedicalDeviceType, + IfcMedicalDeviceTypeEnum, + IfcMember, + IfcMemberStandardCase, + IfcMemberType, + IfcMemberTypeEnum, + IfcMetric, + IfcMirroredProfileDef, + IfcModulusOfElasticityMeasure, + IfcModulusOfLinearSubgradeReactionMeasure, + IfcModulusOfRotationalSubgradeReactionMeasure, + IfcModulusOfSubgradeReactionMeasure, + IfcMoistureDiffusivityMeasure, + IfcMolecularWeightMeasure, + IfcMomentOfInertiaMeasure, + IfcMonetaryMeasure, + IfcMonetaryUnit, + IfcMonthInYearNumber, + IfcMotorConnection, + IfcMotorConnectionType, + IfcMotorConnectionTypeEnum, + IfcNamedUnit, + IfcNonNegativeLengthMeasure, + IfcNormalisedRatioMeasure, + IfcNullStyle, + IfcNumericMeasure, + IfcObject, + IfcObjectDefinition, + IfcObjectPlacement, + IfcObjectTypeEnum, + IfcObjective, + IfcObjectiveEnum, + IfcOccupant, + IfcOccupantTypeEnum, + IfcOffsetCurve, + IfcOffsetCurve2D, + IfcOffsetCurve3D, + IfcOffsetCurveByDistances, + IfcOpenShell, + IfcOpeningElement, + IfcOpeningElementTypeEnum, + IfcOpeningStandardCase, + IfcOrganization, + IfcOrganizationRelationship, + IfcOrientationExpression, + IfcOrientedEdge, + IfcOuterBoundaryCurve, + IfcOutlet, + IfcOutletType, + IfcOutletTypeEnum, + IfcOwnerHistory, + IfcPHMeasure, + IfcParameterValue, + IfcParameterizedProfileDef, + IfcPath, + IfcPcurve, + IfcPerformanceHistory, + IfcPerformanceHistoryTypeEnum, + IfcPermeableCoveringOperationEnum, + IfcPermeableCoveringProperties, + IfcPermit, + IfcPermitTypeEnum, + IfcPerson, + IfcPersonAndOrganization, + IfcPhysicalComplexQuantity, + IfcPhysicalOrVirtualEnum, + IfcPhysicalQuantity, + IfcPhysicalSimpleQuantity, + IfcPile, + IfcPileConstructionEnum, + IfcPileType, + IfcPileTypeEnum, + IfcPipeFitting, + IfcPipeFittingType, + IfcPipeFittingTypeEnum, + IfcPipeSegment, + IfcPipeSegmentType, + IfcPipeSegmentTypeEnum, + IfcPixelTexture, + IfcPlacement, + IfcPlanarBox, + IfcPlanarExtent, + IfcPlanarForceMeasure, + IfcPlane, + IfcPlaneAngleMeasure, + IfcPlate, + IfcPlateStandardCase, + IfcPlateType, + IfcPlateTypeEnum, + IfcPoint, + IfcPointOnCurve, + IfcPointOnSurface, + IfcPolyLoop, + IfcPolygonalBoundedHalfSpace, + IfcPolygonalFaceSet, + IfcPolyline, + IfcPort, + IfcPositioningElement, + IfcPositiveInteger, + IfcPositiveLengthMeasure, + IfcPositivePlaneAngleMeasure, + IfcPositiveRatioMeasure, + IfcPostalAddress, + IfcPowerMeasure, + IfcPreDefinedColour, + IfcPreDefinedCurveFont, + IfcPreDefinedItem, + IfcPreDefinedProperties, + IfcPreDefinedPropertySet, + IfcPreDefinedTextFont, + IfcPreferredSurfaceCurveRepresentation, + IfcPresentableText, + IfcPresentationItem, + IfcPresentationLayerAssignment, + IfcPresentationLayerWithStyle, + IfcPresentationStyle, + IfcPresentationStyleAssignment, + IfcPressureMeasure, + IfcProcedure, + IfcProcedureType, + IfcProcedureTypeEnum, + IfcProcess, + IfcProduct, + IfcProductDefinitionShape, + IfcProductRepresentation, + IfcProfileDef, + IfcProfileProperties, + IfcProfileTypeEnum, + IfcProject, + IfcProjectLibrary, + IfcProjectOrder, + IfcProjectOrderTypeEnum, + IfcProjectedCRS, + IfcProjectedOrTrueLengthEnum, + IfcProjectionElement, + IfcProjectionElementTypeEnum, + IfcProperty, + IfcPropertyAbstraction, + IfcPropertyBoundedValue, + IfcPropertyDefinition, + IfcPropertyDependencyRelationship, + IfcPropertyEnumeratedValue, + IfcPropertyEnumeration, + IfcPropertyListValue, + IfcPropertyReferenceValue, + IfcPropertySet, + IfcPropertySetDefinition, + IfcPropertySetTemplate, + IfcPropertySetTemplateTypeEnum, + IfcPropertySingleValue, + IfcPropertyTableValue, + IfcPropertyTemplate, + IfcPropertyTemplateDefinition, + IfcProtectiveDevice, + IfcProtectiveDeviceTrippingUnit, + IfcProtectiveDeviceTrippingUnitType, + IfcProtectiveDeviceTrippingUnitTypeEnum, + IfcProtectiveDeviceType, + IfcProtectiveDeviceTypeEnum, + IfcProxy, + IfcPump, + IfcPumpType, + IfcPumpTypeEnum, + IfcQuantityArea, + IfcQuantityCount, + IfcQuantityLength, + IfcQuantitySet, + IfcQuantityTime, + IfcQuantityVolume, + IfcQuantityWeight, + IfcRadioActivityMeasure, + IfcRailing, + IfcRailingType, + IfcRailingTypeEnum, + IfcRamp, + IfcRampFlight, + IfcRampFlightType, + IfcRampFlightTypeEnum, + IfcRampType, + IfcRampTypeEnum, + IfcRatioMeasure, + IfcRationalBSplineCurveWithKnots, + IfcRationalBSplineSurfaceWithKnots, + IfcReal, + IfcRectangleHollowProfileDef, + IfcRectangleProfileDef, + IfcRectangularPyramid, + IfcRectangularTrimmedSurface, + IfcRecurrencePattern, + IfcRecurrenceTypeEnum, + IfcReference, + IfcReferent, + IfcReferentTypeEnum, + IfcReflectanceMethodEnum, + IfcRegularTimeSeries, + IfcReinforcementBarProperties, + IfcReinforcementDefinitionProperties, + IfcReinforcingBar, + IfcReinforcingBarRoleEnum, + IfcReinforcingBarSurfaceEnum, + IfcReinforcingBarType, + IfcReinforcingBarTypeEnum, + IfcReinforcingElement, + IfcReinforcingElementType, + IfcReinforcingMesh, + IfcReinforcingMeshType, + IfcReinforcingMeshTypeEnum, + IfcRelAggregates, + IfcRelAssigns, + IfcRelAssignsToActor, + IfcRelAssignsToControl, + IfcRelAssignsToGroup, + IfcRelAssignsToGroupByFactor, + IfcRelAssignsToProcess, + IfcRelAssignsToProduct, + IfcRelAssignsToResource, + IfcRelAssociates, + IfcRelAssociatesApproval, + IfcRelAssociatesClassification, + IfcRelAssociatesConstraint, + IfcRelAssociatesDocument, + IfcRelAssociatesLibrary, + IfcRelAssociatesMaterial, + IfcRelConnects, + IfcRelConnectsElements, + IfcRelConnectsPathElements, + IfcRelConnectsPortToElement, + IfcRelConnectsPorts, + IfcRelConnectsStructuralActivity, + IfcRelConnectsStructuralMember, + IfcRelConnectsWithEccentricity, + IfcRelConnectsWithRealizingElements, + IfcRelContainedInSpatialStructure, + IfcRelCoversBldgElements, + IfcRelCoversSpaces, + IfcRelDeclares, + IfcRelDecomposes, + IfcRelDefines, + IfcRelDefinesByObject, + IfcRelDefinesByProperties, + IfcRelDefinesByTemplate, + IfcRelDefinesByType, + IfcRelFillsElement, + IfcRelFlowControlElements, + IfcRelInterferesElements, + IfcRelNests, + IfcRelPositions, + IfcRelProjectsElement, + IfcRelReferencedInSpatialStructure, + IfcRelSequence, + IfcRelServicesBuildings, + IfcRelSpaceBoundary, + IfcRelSpaceBoundary1stLevel, + IfcRelSpaceBoundary2ndLevel, + IfcRelVoidsElement, + IfcRelationship, + IfcReparametrisedCompositeCurveSegment, + IfcRepresentation, + IfcRepresentationContext, + IfcRepresentationItem, + IfcRepresentationMap, + IfcResource, + IfcResourceApprovalRelationship, + IfcResourceConstraintRelationship, + IfcResourceLevelRelationship, + IfcResourceTime, + IfcRevolvedAreaSolid, + IfcRevolvedAreaSolidTapered, + IfcRightCircularCone, + IfcRightCircularCylinder, + IfcRoleEnum, + IfcRoof, + IfcRoofType, + IfcRoofTypeEnum, + IfcRoot, + IfcRotationalFrequencyMeasure, + IfcRotationalMassMeasure, + IfcRotationalStiffnessMeasure, + IfcRoundedRectangleProfileDef, + IfcSIPrefix, + IfcSIUnit, + IfcSIUnitName, + IfcSanitaryTerminal, + IfcSanitaryTerminalType, + IfcSanitaryTerminalTypeEnum, + IfcSchedulingTime, + IfcSeamCurve, + IfcSectionModulusMeasure, + IfcSectionProperties, + IfcSectionReinforcementProperties, + IfcSectionTypeEnum, + IfcSectionalAreaIntegralMeasure, + IfcSectionedSolid, + IfcSectionedSolidHorizontal, + IfcSectionedSpine, + IfcSensor, + IfcSensorType, + IfcSensorTypeEnum, + IfcSequenceEnum, + IfcShadingDevice, + IfcShadingDeviceType, + IfcShadingDeviceTypeEnum, + IfcShapeAspect, + IfcShapeModel, + IfcShapeRepresentation, + IfcShearModulusMeasure, + IfcShellBasedSurfaceModel, + IfcSimpleProperty, + IfcSimplePropertyTemplate, + IfcSimplePropertyTemplateTypeEnum, + IfcSite, + IfcSlab, + IfcSlabElementedCase, + IfcSlabStandardCase, + IfcSlabType, + IfcSlabTypeEnum, + IfcSlippageConnectionCondition, + IfcSolarDevice, + IfcSolarDeviceType, + IfcSolarDeviceTypeEnum, + IfcSolidAngleMeasure, + IfcSolidModel, + IfcSoundPowerLevelMeasure, + IfcSoundPowerMeasure, + IfcSoundPressureLevelMeasure, + IfcSoundPressureMeasure, + IfcSpace, + IfcSpaceHeater, + IfcSpaceHeaterType, + IfcSpaceHeaterTypeEnum, + IfcSpaceType, + IfcSpaceTypeEnum, + IfcSpatialElement, + IfcSpatialElementType, + IfcSpatialStructureElement, + IfcSpatialStructureElementType, + IfcSpatialZone, + IfcSpatialZoneType, + IfcSpatialZoneTypeEnum, + IfcSpecificHeatCapacityMeasure, + IfcSpecularExponent, + IfcSpecularRoughness, + IfcSphere, + IfcSphericalSurface, + IfcStackTerminal, + IfcStackTerminalType, + IfcStackTerminalTypeEnum, + IfcStair, + IfcStairFlight, + IfcStairFlightType, + IfcStairFlightTypeEnum, + IfcStairType, + IfcStairTypeEnum, + IfcStateEnum, + IfcStructuralAction, + IfcStructuralActivity, + IfcStructuralAnalysisModel, + IfcStructuralConnection, + IfcStructuralConnectionCondition, + IfcStructuralCurveAction, + IfcStructuralCurveActivityTypeEnum, + IfcStructuralCurveConnection, + IfcStructuralCurveMember, + IfcStructuralCurveMemberTypeEnum, + IfcStructuralCurveMemberVarying, + IfcStructuralCurveReaction, + IfcStructuralItem, + IfcStructuralLinearAction, + IfcStructuralLoad, + IfcStructuralLoadCase, + IfcStructuralLoadConfiguration, + IfcStructuralLoadGroup, + IfcStructuralLoadLinearForce, + IfcStructuralLoadOrResult, + IfcStructuralLoadPlanarForce, + IfcStructuralLoadSingleDisplacement, + IfcStructuralLoadSingleDisplacementDistortion, + IfcStructuralLoadSingleForce, + IfcStructuralLoadSingleForceWarping, + IfcStructuralLoadStatic, + IfcStructuralLoadTemperature, + IfcStructuralMember, + IfcStructuralPlanarAction, + IfcStructuralPointAction, + IfcStructuralPointConnection, + IfcStructuralPointReaction, + IfcStructuralReaction, + IfcStructuralResultGroup, + IfcStructuralSurfaceAction, + IfcStructuralSurfaceActivityTypeEnum, + IfcStructuralSurfaceConnection, + IfcStructuralSurfaceMember, + IfcStructuralSurfaceMemberTypeEnum, + IfcStructuralSurfaceMemberVarying, + IfcStructuralSurfaceReaction, + IfcStyleModel, + IfcStyledItem, + IfcStyledRepresentation, + IfcSubContractResource, + IfcSubContractResourceType, + IfcSubContractResourceTypeEnum, + IfcSubedge, + IfcSurface, + IfcSurfaceCurve, + IfcSurfaceCurveSweptAreaSolid, + IfcSurfaceFeature, + IfcSurfaceFeatureTypeEnum, + IfcSurfaceOfLinearExtrusion, + IfcSurfaceOfRevolution, + IfcSurfaceReinforcementArea, + IfcSurfaceSide, + IfcSurfaceStyle, + IfcSurfaceStyleLighting, + IfcSurfaceStyleRefraction, + IfcSurfaceStyleRendering, + IfcSurfaceStyleShading, + IfcSurfaceStyleWithTextures, + IfcSurfaceTexture, + IfcSweptAreaSolid, + IfcSweptDiskSolid, + IfcSweptDiskSolidPolygonal, + IfcSweptSurface, + IfcSwitchingDevice, + IfcSwitchingDeviceType, + IfcSwitchingDeviceTypeEnum, + IfcSystem, + IfcSystemFurnitureElement, + IfcSystemFurnitureElementType, + IfcSystemFurnitureElementTypeEnum, + IfcTShapeProfileDef, + IfcTable, + IfcTableColumn, + IfcTableRow, + IfcTank, + IfcTankType, + IfcTankTypeEnum, + IfcTask, + IfcTaskDurationEnum, + IfcTaskTime, + IfcTaskTimeRecurring, + IfcTaskType, + IfcTaskTypeEnum, + IfcTelecomAddress, + IfcTemperatureGradientMeasure, + IfcTemperatureRateOfChangeMeasure, + IfcTendon, + IfcTendonAnchor, + IfcTendonAnchorType, + IfcTendonAnchorTypeEnum, + IfcTendonConduit, + IfcTendonConduitType, + IfcTendonConduitTypeEnum, + IfcTendonType, + IfcTendonTypeEnum, + IfcTessellatedFaceSet, + IfcTessellatedItem, + IfcText, + IfcTextAlignment, + IfcTextDecoration, + IfcTextFontName, + IfcTextLiteral, + IfcTextLiteralWithExtent, + IfcTextPath, + IfcTextStyle, + IfcTextStyleFontModel, + IfcTextStyleForDefinedFont, + IfcTextStyleTextModel, + IfcTextTransformation, + IfcTextureCoordinate, + IfcTextureCoordinateGenerator, + IfcTextureMap, + IfcTextureVertex, + IfcTextureVertexList, + IfcThermalAdmittanceMeasure, + IfcThermalConductivityMeasure, + IfcThermalExpansionCoefficientMeasure, + IfcThermalResistanceMeasure, + IfcThermalTransmittanceMeasure, + IfcThermodynamicTemperatureMeasure, + IfcTime, + IfcTimeMeasure, + IfcTimePeriod, + IfcTimeSeries, + IfcTimeSeriesDataTypeEnum, + IfcTimeSeriesValue, + IfcTimeStamp, + IfcTopologicalRepresentationItem, + IfcTopologyRepresentation, + IfcToroidalSurface, + IfcTorqueMeasure, + IfcTransformer, + IfcTransformerType, + IfcTransformerTypeEnum, + IfcTransitionCode, + IfcTransitionCurveSegment2D, + IfcTransitionCurveType, + IfcTransportElement, + IfcTransportElementType, + IfcTransportElementTypeEnum, + IfcTrapeziumProfileDef, + IfcTriangulatedFaceSet, + IfcTriangulatedIrregularNetwork, + IfcTrimmedCurve, + IfcTrimmingPreference, + IfcTubeBundle, + IfcTubeBundleType, + IfcTubeBundleTypeEnum, + IfcTypeObject, + IfcTypeProcess, + IfcTypeProduct, + IfcTypeResource, + IfcURIReference, + IfcUShapeProfileDef, + IfcUnitAssignment, + IfcUnitEnum, + IfcUnitaryControlElement, + IfcUnitaryControlElementType, + IfcUnitaryControlElementTypeEnum, + IfcUnitaryEquipment, + IfcUnitaryEquipmentType, + IfcUnitaryEquipmentTypeEnum, + IfcValve, + IfcValveType, + IfcValveTypeEnum, + IfcVaporPermeabilityMeasure, + IfcVector, + IfcVertex, + IfcVertexLoop, + IfcVertexPoint, + IfcVibrationDamper, + IfcVibrationDamperType, + IfcVibrationDamperTypeEnum, + IfcVibrationIsolator, + IfcVibrationIsolatorType, + IfcVibrationIsolatorTypeEnum, + IfcVirtualElement, + IfcVirtualGridIntersection, + IfcVoidingFeature, + IfcVoidingFeatureTypeEnum, + IfcVolumeMeasure, + IfcVolumetricFlowRateMeasure, + IfcWall, + IfcWallElementedCase, + IfcWallStandardCase, + IfcWallType, + IfcWallTypeEnum, + IfcWarpingConstantMeasure, + IfcWarpingMomentMeasure, + IfcWasteTerminal, + IfcWasteTerminalType, + IfcWasteTerminalTypeEnum, + IfcWindow, + IfcWindowLiningProperties, + IfcWindowPanelOperationEnum, + IfcWindowPanelPositionEnum, + IfcWindowPanelProperties, + IfcWindowStandardCase, + IfcWindowStyle, + IfcWindowStyleConstructionEnum, + IfcWindowStyleOperationEnum, + IfcWindowType, + IfcWindowTypeEnum, + IfcWindowTypePartitioningEnum, + IfcWorkCalendar, + IfcWorkCalendarTypeEnum, + IfcWorkControl, + IfcWorkPlan, + IfcWorkPlanTypeEnum, + IfcWorkSchedule, + IfcWorkScheduleTypeEnum, + IfcWorkTime, + IfcZShapeProfileDef, + IfcZone, + LABEL, + LINE_END, + REAL, + REF, + SET_BEGIN, + SET_END, + STRING, + UNKNOWN, + Value, + ms +}; + + + var WasmPath = ""; + diff --git a/examples/jsm/loaders/ifc/web-ifc.wasm b/examples/jsm/loaders/ifc/web-ifc.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5d259811086096aea62b0d05438d9790fe900380 GIT binary patch literal 428259 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
-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⪼Oz>moL>)wm~Cs{y$%+- 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⩔U^<2dXmx|O zZ;g}nqz<7BdoqBG)1d=z<%ii@+}$S3%o0WSagVs}+uw}WFq6@nRMP|BjL(UPC)%Ud z3N_}JOZ@*5qKa4tq7XXpLR;Sb5vy)`+nf^2sDb*>?pIo{2qfMoZMjD&L7f_B8mr zW3#rKfj!(ht~rUEK)xXHJH&zXp7>42z{yYXl9ntRF%T^efoBEvv%6hTO+K{rA;@SP zt(q7tx-%1_&SM0G%SsoKKm+dCQ73+TZZiVJ2y|xjGrDU*$rk5e&+mpm@T7*ZbLIwr zRVE#8Xj^&3ViW8CT0&0;h-#lEXboSyW9}H28v;5LT zeZ!D(d^rmy%gS3&$a>x>2wDFIf^|@LLkr%Tw>Wm}*;un9l92)8H~ZO$qB6Z3&Cn!f*>EIG&8P71i)QqpY>; zZx?cz}#l)VZ z)MWsmZoW%WmzZc<>hc^F3crxl)$s%@A$1u`)(D!S_vX!9QsnyN$%!rVM5DII72ZH+ zMV$FxBA2jVa)Ey$kxNfHg4GF#T%q2gjz>Qet3~<2dT(y zMcVO%A!>_U&sR-_$Tg|fA_*9LzR*7ZlN%+y$mI=LCoXdBh)W{ZeRcu@%JE6dTQB+^ z$y*wzAG&B-wv~yR$RmWTK_Pcyk{--kWKD>_Bc3N@X%?Vz3~^y9mlQ(Qc0uO!g{&#N zmNlv0ztAz$blHT5?0n=6q0UGhRAEr8VjVJF<+1LD0|otVJbZfLkZB%X+aky)*QsnK zC{+qUsW@Ufh*^E{`#N=#j>z8d^Sm#Nxs_ckXIsa{N*~=kTG64hy*QhRS1){0FEnZDsy%VTdY3Rgd| zhfD~~l)6fGgBpf#xQbm+!z*`qc!C+Kb7XHjU+nYIAhcjTd1^X2J)w{cIEMO|@TB5Y ztf^Abq_^mkmM+Sn>Fj#O3KJFvzTbWZ-XdtREfaMGg1BI{UFpN407)h&A=s>}PY8bK zMReTvj9wbUq53f&*cN57$#e3h#zj6H-3^7KPm1kb1b}+0ky`nR= z=v>k@xl2L*iAzKNXKY-C7xN~q(Onb?o56QY`4c;()7~lnQqo<#x9n0aV^Xhc4 zx^iW_vVY~uf%?kE%Au9@l`BV=tvFNoR@F-BQ(&aFwD)IUNE&1QImEg2{PRg;CC@v{ zRw8%P&4B5v>6Mvls$K2{`%l)p^X))ZFi}*sZwn_Lt3?M z59uXqTdp3%JxV=(OSQ3V{?j*C8>4y(%Pr;or)ne9({6z8t2S7H9Mjg7_f6Htu=?Jf zuYasIhWvbWci@fHMnf6*d^2|EW#_|i+ACPh7UVgv00wjiuwm?!VO`)nR06>45&+=t zct2&_#LPB^PN()(8-&kOQJ4$O*KA0uftk{L9Xyfw(&?T(i24sz9S~L?lyFT~()366 zrh}?u4;8B7!l}xGR2uprJ8`u4=^Ls#{ix<1i%mlA%MQyDGb7ewr6N0`x2{OUdn2f~cppA(HwFQpiB_g0+vo*y?kUcI)kROLFZ_$A?J7hw+ z4>&X-HLgFu!wbDEY283#7A2hD4GA)#8%max3*2^??iTEZ2omeS4$<`;`8-momzKk+ zxY75lBT&XtN4_w>BUKy|BlTa0fp-W^w{Ww<3pWe7drycU*8d+r^#r5)!-YFbimg2D zB~>deshaC7sZzg!P|u15wItq~2>bFA5n-QxvLY-JXSm~`Ey$kTBgj6@OFB@41e1=;@_K~%VFOZ7M+Y-fHsLdPxyfd=Rd z1Z=Si+UDFoNyNov175^^T9=3`W5n@A+@3i(j)=QV=&k`st(>%@GP-2Xp4v`Q>g_3g zQc`bE*^`uddrF^-)Z0^(hL0ol{zJc)dLcM%sdtRE+9UNM^Ol2{VOjmy|AN%p|NSEM zLg2mB`=xHFxBdL^(o*kOAziX?;zgw1#bw?c&%^WKn`0%Bx83qVFY<2qyO00#tN!Ki zdtUNQ#9j;E?r<7dsL6c9I{IoP)o%E^H@xvxAH4HDFS-8&3Umb5cDwH{3$E>_?<)(g z?WgZ83$E>_2g-tL`{}!b;M#uhu5Q7#{d|8AT;F=cd*4SG<~|smobQVOV0i%mlVsm{ z1a6BJxb-suI{4S%=&^RN2gyWaPb4=vt!8~Pm?wO!3S zPE|&Iun?;wptk$;#j=3fe)_M+5m4J1@Ad-fm={ok6mcp7>N8GLK>gx;0X3Xi(}ekO zew!wo<8fgFrz9}?{+*8GdU(FTcq$_FsdR+tDoL(in%|NCd8#t&@yJ=-wRIH}SbLUG zc@bIT$^(c!XEBaKpWpU?rD=Y zda1-gGcd>XzYhC4_FzHx(0uHL>294$&u%?-+_*hQFmPy4@8v*klkg{HU_Z){J55P* z+Rn!NejMdkoG(l_QFJ}gqS_8cSjYv*Iv!BOJsOZ$t$eQAoc+34qLuGyzTmGeknbQ{ zHh#U%=E0in(3+I5V9vJKnXo{UYm!O$n^aEPXbsXOo&Nr4!cThpr_R&AF}`S29thij zRdYw>zM=vKjEi7PyI;94u!dJ%S!CncVx3}-4?bJPuV7@301t?OY0_ZA51^*)S~4LJ z7|7Ou0y`R1sU2rFo+A;~ze4ya#=|IVM0q3wG)bHd1M1lTw)d~#$4pN9bVR}>IMH=fxl3iQ|&?J-sP zoqg;rQf>}JUz0prvWiDA>zeEf29JoY@uTRP0gIT&^2-8P^ny@X6i1E+m(zzUoMSI= z)1Smlb96wdF~9APROWYTkm`ql*N;^E&eus$+I(FbKK?Or(%eQWU48nBn9;E=FcpBf+;BR}rG1Wg! z=xbeQ4H)|Nm(jP~7j=}rP?Ha>tGWY*x1lEiS0LVJX>Z-cCLDZ@UOch(8M^^f9Q3+YQsAw;;8Vr6;-Co~8 zR_j;<=9Q3@XTD=gVltO>m63I8U@K@g##MxPY)!?iC`x+A5j0s3(HDD~DmLNBT$LgO zy@Gsr!U;~&oq_APUK?1i+$_Q(<0Q<6ka_rxQRFLurlRxGYu#JmNgQtCX}C3Fq3aS# zHLJmF$Hf=aq(&_!-M9w+!vkhDXGO!mfQ-2kx(sOcxU}S{0V}9JvJMm(iLKlE3ldIC zgt-<_aJvI<#Ut!?1=iXD%c~a#3pZ!s{t&oaWyb%1EsITdv&zTY}5q` z3pVdoCt=DmQl9`Qx?M%?vR>39mcwe*$fZfMRqB5b3Qy@kuvL__4uPbb`^SnKjASXpP1s&U7d~Rq1Upbm&ljwmWW0#8eug7Vi;n?ZDbawmZ{m z1-4?IGONwn^6tT|hYIsk<9e7q3sg#dscbtf=8;;&o3N41AyyrfSFS5X*!cDD_mgnP zrE-oD@oW`w5I4eJ)ziVG{%wUPK?g;Px|NJyXGRMh<5#;?3^-c^dkYH24BW0zFxF3$ zXdHygBh4cE1<|trj^Uq#ej%nx<8AfA$Gsta>5-5yL&Nd9MGpF|Q}&Ktu{CZg>ulti zK%rMm5^~knE0DVod|_1!>J_LY2w_sWPFSy?NYE>&mAV(xD|+)Sq*qKsT7pR0rB_h) z)bxr2iX-#`UQDm($^zcB^@;=7`W`a9f)OpCSHuskUh&n_)hi6amXyYhqgPB?*kI5r z3MD}nfVPsbUjcjU2NHhHR}!X#pSKqH*%r*_D+y!_N&`$zu@E@0Ae#5?ag`6vB((>mY@TArt%8EroN#S6K=l z5$15D?6o*zpO8lNk5r&)lFG}wR1O-VU69Q1Ez>yXl1RcX!j8E1A!r{oXi5wgeBu%& zF9J#dL_17W-C#YtFqc?d zWLd8)7WbGC_sFql^n#jn3u}XKELm(4NLW&C#&&05;mjP(jW`QhJ&kVV@)X?Vw=;4CU81{C8!ZcLwZL@0IlmK_E_tKw1Z_@Glc0cl<`AJt zn5~MCO#^lI%2*-I8d?$7Y_2*DY$Cg`cWePnO^I%)5KFcLf_+e}xRb%oGA5Fphgc#? z;L?ua5Jwk6q=DUxg5>Qm%9=LS3y-|Q^G)5B3SPCX&eDVD&@5$+&P9J zg((}qipLOMQq??UD`7|+Fa&CSLKw1muX8QoyA4BV_DJGG+wJU5!w_3QfV~K9mxwPF z8b*LvRcB${ z7b}38#7f0d(y`UH=gCrNz-nT`{Y|XUaDHI{Foe?H8#8Gb=>mjl_JCqPs=;evDKna| zMX2bha{W)=H9j>5LOZ`OipYF}3?$Le&dLh)3fps3Hxd_ukh8B;>xTj=&S|?7(oR*V zI2%xrs7tR6=v!o~>h85qy5v!D--%J9#V7TGWUog>PmK%}WxEFzQI-r94FzWcD&E^c z#X}G)x>Z6&s`?(H;@$!k51lY7vO&D+Y91B$0!fdGUh{)$S)jQYpA6guDl*V{sQ94{ zDjq0M@k0eF_61aIv{A8PsF-!5qWM<*fjf!$itAYTyk4kaDT zqpZg~@KjQCH|Bly5zGr`SS`rC7hf+%1b=Wb??01^;I|JY=6$_de@7)4Tgx;LvCh~p zVjWXb$^H=57sy`rW`#50sbt0K5f0PrpG4YEP!?N!Hcb{2Bkrbta=kXaOa=)zGS`;L zAn=mkdgYdfj^lcnjAoI^5L+8WQ}VSS$F<{SC4w;`$z(>#M9l>`i=_8kX}nBkL+cPW zAkLbCWGFp~BIfn_)OLuxwc{$OC)Bh;!(vHfAdqaz9TzdhL0 zs*65-^AY;=Lr9;#`A~4dF1-47wf=|RW`?D-eO8Z!Y4temCHG<&!w3=#V+b`}Mlod| zzJQ13$?rPl*&g%8#}y`sPx6`6F&Qh=8j~?!Pkcnq>oy7gFi_5KJro?c3&W39>)%N{ ziU)H(!9zZZg&l#QsztG|t5tR$iNY~DgTh%z8-8c(2$mI=xEKAiP{-kfZSk^I$$O!_ zxn=;-rCT9I@RE#B_Tw@};oD4M%!N5vi!;)sJ{N7-d-(I%LPX?>}wiCC?KVuQAyv4ErM8=U}HbL1r zPACzU-4oOV=c#QcWR>4$R(V1aGVO{~zaA#5{I=s;<#E6jdu>m^How!`<{4lX_G3P1 zw)qaww6}AfZGKy?ZGL;O%|E`qVT6NyGPjDg%L>k3EzC~aG3BJpI_r;2sviqhR2^s5 zwxV*JnOPKe1~Y=$4!lACE2a;B8HMtX^-`MU3HWptC*X>OI=(^wyy(kjMLjS2O2>-2 z)65Hu-Xj-Uwzjo=@5~Da3M=Z)<6BWX$OX{KW_`s*d0XnNL3RPN{$yfieTExQ&B(7A z9lqExI^16v9lluDQcuII4$iJaD2bh!5XR0k>+dX?A}H%k5mO5pSGU&cUk(T< z8reojXrv(|G_qsN^4<7%1KTGHgq%KogoH%RH*EEo_0Nkw84&W{I|!+Ti@&0TkPnl+ z3umRfO1AyNE7G>@OPkM3s;laT zqYkTmc&z&!C@)CTh;Nur(&oZ(id|aY3m-wL3+*(uu0WtddqK%<2k(H%KL{wbs44$J zL#bOHL8(Vj%HnxW8>M7%!8MKfq}vPmXOE!R4;P9p>Nq-W6e~i;Ui=73{cxewqCTSs z4W(XMTQInv%b0v{Kg7)k_mi;TNq-kiq!`K&-0veXLGQlNy($fHoN|8*Ob!13As zV2g?yTo{IR55sJ;dv@2s7IhtLF=z){RG~Iui5?GxutYgl*`nhISoBFC{Nk`O92!J2%!3!572UZy#W2mvYRdV*j}@wkL{=CmvBjTv;4k``sL0~;w|y@KVtj# zLNp399IKShhtfxX_ENh5*~gHibt`g1Z;`0G$Q!r_H4w!-t)ETLa?T|&oHOznkSVbv zD2yuCFD}qhn-xW7^;NlSC{~Az)SE~`t(YwFRdMNtU3pNMsQ*Rk52@PT&$(~7z%2k5 zfZO&hPWjS)CoUgL*86|VE1sTcyrqk1@|r#pmt3cLdU8{={HFM+4xr`LE5?TsI<0k( z=JoMbbpk=FpBmXb#m?{SyGg4~)Br1l(dp)ZMw7sXW}hMybmVGX0+kiWHg9ZIbpcvm zUe}f6J}*6qazYr!IhW;9mK%Km@I8IewFmU&sSKHT2mJh;Wl&Gn=hl0FLtAq&?`u|5 z8z0RL(qrxyjyXPsL%I^ykUFKo6C@CC9!~lqPJiK0Gk?jN=!60%h^g4z)Hyzbo2iiH zK(B10L>Q1(KEcZLo}T(SP_dd0M~h5=9Hb^4tG2ygkqCYD`;ss*c-eF~i+PHeRX;KP zVPa|vPmJzUq$TEL0GQ;O68$QsgmgYI-r@>hdc!G2x|b$z;Y2Xcrg_XzN|} z@)$y<;|~n{LYHw`;v51c3`5w%q{jOMSN8F7O|-`XLSZ&5xV}Ji0hy``AnT+(&`Wnj z0n%#y&8d&p*Vfy!qc$uxBV5y=?Y{{}0wtR8K;gv#X{xfGdqPvFJDp%j#J^y8LiYtr zZaj{;-)YOnAx;pbKm`Q%8U;Y$*sO#erUC`1F1A4(G?T7JO2fj*9MgMuETYc5;>9f^ zvgjPbwkpep3V?-&lbSIIsFl33SwrSKkmU)UhBhKVsetCl7@kKblHKIe=-W(mCrH(9)1VpNS^oVxK3bwfb+hMNNV!XoKjihX3jZ zK$Qf-0>UtZ*@xm*;-XF9AXo?xS_vl?8teC0(oi>kN)Vo$&5G`;Oay=IZevpgA2 z5{QYw-tTtK=mt}FSnnAw2nV9ZJ}fD!|4oXpl+Zqeom^W#7H9I{Y0mUSGwvE!y6qps zEzA<)ZUio3q%#3BRx6qS}_n!Uz{!HFB!8hWYGF^C8>G-ABo;* z+JsOH>}=pZMFY@_1_;IqrN>^)62y4iuLl|e**qx#Pe_Yow9BziS?d~%&VGb)?YzPe zVRii(CUzSn>^>+jGLY4<0b(I!sOoMgFaS=a#&tg}$mm50=17ZKznI8?9jVq$MTg>B z1rv2iRO&QW#RE<2Ud9Rr#QeHqyrm=S0ibf2gJ%UmJV!_*BE+5bl1^iKtikYD0+o*X zLZH&-`E4uHWn0o4P5jye?KjCqBR>xs8vk=^Y{Qmc0Z?&sSsuTl75{T{%*}p8!m=K@ z`#u7$y2*??zgD@=+K<@M5ijHBa`&l^#P#MG$@+Y3gER>KJ8~?#sg(Zjth~tOjBAK{n#H}mHiHVJtJS1{TgqNeI$0@rt+%G5wyqMH~9T^ey2JCH~y`0mu9~v!X_E3 znX#N~f%B8wYMz%0P*bh==c4f6Z_%RNq;wvVi7u@=PZeL?I@5hh>&(Y>hTl?05R%So z)*Xz7#TIQEx0VoL9yQTIojxxwYTn~+$C%a5R!4dn;P@&&4iYQFI@~ng8qt2STqoWa zrRLmkx6@JdjH^V5USnj7ZTp%sU3-tf!)W*2W@Gr>_rBNNULFs$9RM>Sn!j~Rt)w@UOZ_{|QL2hd0l#9IY$)IE7&gNMgqUIQxYRr?)C>XgZul+QQpLO%~ ztyLQ)cYN{QbP`mUJiOy?ufH*0b^Xust`@40D3Xu8(#x@k5eNWgmXLUlwfLvo@)Sx8y0bRBfoExPjOJ&$&qf=YLx>3jj-@g| zraxdLD;Wuckb0(@nsnBg23WY_h9nFYq$Unj1iXjMN^^N(?g^4yVuOL*rC1YW$5D+Pq)7 zc|Ll%#63m|2d#@Up$*som<0+cj~lqM+3yC`P3xQ+q!U1r3%G>_@MSl6Wy|D04p0Rc z{T?{u6MTOz+NfujaS9;;x%o(_&<#uoHIS}!((5o#ZHX`%dU6LI-}e+4%Gu}nM03bG z&~SfnWj?F|eM|^_P}6j5n6B`!-vWM<_4J{Z4+&zU8}lJ`dN?1>)87NI>6H_$72`uu zSbMXVgv4BtIC4q8f@O?>K(y_7ZK1-^x6uHG|qLhR1W8N4({{Bb39O^c<*angNH zZ8hL1tY)oGnzZ%8KsC8Cws1YcqmJO zt!Rbr|Gmn+L+4t9(#ui&7!+$4Bm_73yBsB#XMppmwa2?=n~d^#O?`PHozU~_XA z9sq}cYI2&N{w`-!vF~84ACwY3!oq3kM2EB8_#U61*=OOm%B*}A3 zI6b!o$ofSk9L=kGt~_q7J6H8@8uvLzC)AB)n^^^@P{y6Q7}Gk~mN?erWaXOdcO=IN zwjLC$Dl9|&SF>O&HE=b{SCpYIAAxJ5z^34sh-^QdwOK(6(-fm1QuL`qF&WA|_s@lM zntmo+C=ZLdI2y}SO$vhm4z&rGridYQctrYozJf|4chg6aJF;IBL90t2193K48|_Yj zL~0r2U$kZ4$e=?(bpxBmX^C&NiK0PjW}@A|gGK7-%_PTgh_)GCjZ>fkIV4lA2o`U*6K(#tP(5&elbL7K{d5&QtG7~>$xK|eko zFp$6!svdG%JgbV_I_g=r*)4OCA;u`^H46M?(ipTUAqVFhZx-Lme#a*641OZom@rdk zMKGAu?z40dOxk9h1xlB%Z;mq)1z}vb{&vWl#|Ta9pwT^nMno?kzikT2C)6-{H-4MQ z;4)4eX^zk<@mn~OEfS8lsI?bK8?+-pc*NM5EsF*{9NE0^$}l1%3l#E}p>az=@A1n+ zzh~WV)2aB?TI&+|o>OP>9sEcvr6#XmtvWH6zsZX;QKWH+mdo-3&Z<^cF38QZer70T z!Shu}Oi}ckQg*8DaTiCD2^0Fjm_yr9^jm_B7b!PMbVbn0G79UXZrfp9Bc8 z9YN5|Dg`A=y#9fJYRvKJR0NNdpMatWRw%%Ax!%08hW;Y!0$PyzVk%ZeFy^8JNvzf>>%Q94vWl{w`jeU%s@c$5Fi5VOaDxc->RRH?7L$<) zX5B>gFOt(^m)fe4vdmA6dos;1fmp;?sm%s|1J)5>rK$iX7(9RwK`v%V=M4KCF>p&o zl2L4ZR*%c>OAKO5o>r+!lot_zWdxusSU>_ajWLxf=~8b~78dBAZ^P-5+lwm${Hs(3 z_%GGR0Kff*efzhSN>r&1#6Dvs;Z0>A;pPH-WXKYEg=V=$V`D2Gr?DFmxJdM2vh2!m zxX3`)dk!;aS~% z+2*tE?vri`6zvZ|YCtTeAL5Z^FO*%?BhB{?k!dg=xTCc!yN+%O%b*Ryx>oELk7fs~ z3+qO_-@g}AlC>?eLIrAOVgL*O0|qlpCd{;s-+}+Y(n=i1^{V|!?RlkMuR-+-o zr`1{?xKMXr;f})l?B*8u_GU!u=O)<`bz&Fx>j?`=n5%yLf7-2Ec?ml|UbOs3DAtX;NUVq@CD(0>l7;sO2)@lNl@g&sN{X(a#Iq zvgPwyzi$+l+QJl>EEc7&>e8VRt4}5moRw>vfkF-=e<1R!AqctFScRe}bj+2yl1kei zHbH}Btqkx20R@IA&TdPF9!qzoc`!bQOWVt)uP?QuK3zX`usjB>Di;YcB6<{U*ph8e zfxd|5ym=a+FU%BT1c&X5G@)c;jKGv{i(yoYfwjp~Y)5ZMIi^S;@;}Ys<(JK1S;gH5{HcAA8N@GvSWgew!)z7> zd>gA}e-PCb+|Y-w0m^-sT@6I~z!oq+zPdFGiqu$_!|M1wC`4j-6`TNlBKm{Gh=dl+ zWWCBR7{0WA>5zE|7_kPI_c3JdCaQ>rHwQZ-t=V$-Bb8h&MqewB6u*{@)at2eR?s<+ zJWc!)+Ni_yh*nS^+MUM7g!Elee+PKms3}97_lt`ZobW{324s{hwJBU31I-qVnmTNt6qdbqKty5%#%{V}zH+7GG3Lu90T_P6rxu>=5+O%dvm?TA2+Zn_;=}v$a=4#rvrYqujF=?;2 z^}dF5`R1POn;Qa$hg`o#3M7BNGp_ zyNfIzKtifiCELghLWx1hJ}2#STVfM3i(o+4(8sTJ2R|4qq|+dK(3hLD<~c7KFwWZN zp*Wkh3UI?(Uk--8$P9P`i+dc#=W)*CEg%Y*H{0%{97c&B^R)U)?1d?XEW*5uE-_RVqgcccQ^xH4 zZ|^fj>oX$Cgk#7e&_zxSas;0+1j{Z0^44{LCv$5Xc&))_nTBXgot*vcrcJWJbx_ZT zX_>^}@3ls_VG;a+g)t4sMy`T0)-PqP_HVpOVwx;a0~4ST>46+WHG;#)l@nJsAtfT2 zP=3QgM4BiJFrhCv<5a2m5d4JV^pF6Y0f>6YWtVO?YewV;+}R#U&lYydB=0`(`EOR9 zJQTaLDI?*}s#5)B4^}_~WYJga zggaf$0OkFG$$s zM$acbC?vnzz%UJ7Ym2}LJyOm7m%a~G zA=Z4)R>8MUU!e?r?jVKznw%yjRzt>vR(z)F*YkdgYczT@U4^F%q0n(xp@Nhuj?f$@ zSAcvAmCIZGxWZ8io-&k(u{83b&Ek||FZrNxdhZZyT!*V;OWrVt;E3Rq50=nyPy=k~ zP?Sud$DVf`h}46G@uiZ{KtlAjHWHE^K-|i%%7;YU&SMIY!3Gaur{NcfkvYRhI}ceQn9#!)Ho zG+vJ7*1}vxWsg+CoL9n}SDI&d!#`2R!Z%EY%mb9dj~)frP^pFO?p<&EvIQ!qmolq^ zu4)CyJ`Tv}M+&ACeEr}h#@F2}50~d>s^vKw?~ydLpEm93Z0f}W{Cw}GdWobU9ldT> zbtqId&BIXDK^w|U7|Q;NuWGvDtE#@Kd6v*AbkMV_?UX(%%+746ak5k6cB^q`sBv4U zaWd4%1eS^y9h&MC-($u1h2pzI@hOUn$bH2u;|$9Kqr>2jU1C$nf->05q`Zo>Aza@`+5Hx1~7cHG-)2mo*dTQ|jTVU)+ORP%4h07FUrq)(-a_Q3HtI)SG`p#*(b ziPiT(R`kpMi*C9w-ANt!85gG8`PP-2YNy@(NxHv5E$J97YqlI<+B@?Bb$1|xe}}G%tG|9I>EF_4)_eK1h|mhkNS_)s1G`qX*9804dIO1R zb=Y2l9*HdO7i~w6^rgKX*;TsGBiq%xSkUQeLgrX$k~~L~lx@~LCsHM;%SISf$x*42 zqbJ(s79BMPL)G;{!ajCMb0lzgREev__KotbBf7vM1L)f0E(2v6?o$!o3WB^@=~9^y zH;3TS^e1bMO44e$k46(``nHFOy0IbUm9Bl<$wN4L>ygs5fuftwuVhE>m(Orm^6&0%#%dT^g4 zDtvmZpK=p^-Pp_-?u;IH~>Hd#y<4%Tzh^{A)81EC2q)vto@Z(-c9i7QWEJglroSi!1lYOI8Y7=*j6E7E4<|7#=;bzxluMoIpqWsQfE2dr06|)Wpo0M& z+&lKxEg*p&;Sbh-P&XPNSNmAlhBW{zYY4IHc48xJh zS;K?%Z7_3fO_x@5q%J^Gh)f_p9Ku6Xyn*eHz*d zEiyNiY~B!2WjxLoA)DhWZ6zjsi76|w+det^j?z05D=AHwUz7H1o39Z;k4JN{ClW{E z)@Wd*AZVFo0xC+62p?Z5o=KtEfF_58CY`)=QL3|t-L!A=pds5#kNttM``6R-<pN$2cuQhq%mZR3Y z75X4nIk6KqMWyXo1%6Aw@+iVcJTaW6sRG(n9qr2YcNXSoLVNR+a35)^*j-jovuYt! zh!>(XicTY-j*VU_nr9!U^HM(4AAF0-e1$A+v_a1q3(Cj3oS{jmv4cC)`T%7K6nb$; zMM`brnW$Nm{YfHi=xqJ82LvmOMre@d@q{MN4iW_p3Lak^{j?sQhqQ<*KAvAWB!sXgMK9#WLN==)8m zPr?rGyeO{~p^*GV7K~pR=hcrhO$?Az%&tvGJl#t zyc3$H`Ae>tCLJ~F&g(fgV2$D}E=+R&<+rDRtM;%zmzTob{i(#wyd7fclefI5oxJOv zmb{A$yM1z+q{l`~Q8R0qf}-<5g}4 zIc&hUkhpc$M!A(_7%sPr$e7!hv zcYV@+ZKvBWPU;^?K$~o)mVLCAeWaFsxaM|zI&pj6g;VI$N%j}13hPn!r-?fd-W=uU zpQox%kFr}5xAnfn?SD7(e4mxMi=RAF8CrAvWC$Ftu*?f3gq)Aw6_`}xTu z)ko(XKRc!PVWoJ->~x;7X*dsoo6pMo_dl zualw8dW9uce+sb8BcUQAw#|EyB$?Idh`6kI*yudOlp7urlw#ORPTbP=kdOK`?TutC zGx!L_7rF@nV&0!UqZPSaIg|-5A+wLje0i-Pf>q!ai?0=!MKyBU8ubfp7#f1nsMX?% zp$F72E`&Q?%t~RAV-PZ7Iia4vNx8%ZuYg5y8IJ=Ps;Nw>Ip3MS)<#wKOob;v$}*D& z24#YwhEnm9Qq+;%me%VH`gcIHp6yBMmqhB7MiqtS)!Sw!zDk>$48q8ca6}U^;gk`_ z1{Einqyn%3Zv_$oq6fAGiQtyKEF+K(3a=D#r33-3DR{&jr@shN&!W@ z8AxiT$Yd`~nAz8NM!NLG3Rv?6!Sck$n~P~Z={bEa8@QQN!M0~UQ;oqo-=5F&7`RQ9 zzbUn6CWYn9Q+ax;^?oYMCYW6*tl7&n z&ree1I^bQ?j1ldj_K5mSs1#$F;ysx?TmDPs%5(9)XtXMGPrZIsn-3V7%CX8Ozh6|O zX%ootF9=hql9M`wqxMkCOQ=s{(s`twL{DyU!UB!6(zjfL(@6&|_&E-n;-mWG+JrF{ zVH89mM;oTM{>+WCPw4Cu)!^|tGIl{Yd^iz`oY~iFmQVY6efH}`O+{5HCl!opqx#2V z+DX<^kz(X^JOO8|5xA6+0E1eILUJS(@p>akK(B4~DI0m~a^L|fGBFCOeC{7_?Vq^H zP4fL5-m^~igk6DDhAMTAq~hk~hVRuA7>t|=;$%R+Vyno_6K%|z5xE5^F! zUEGOSV)jRQv{?z8`!&gvvQ_oZ1w2RT)%;ONs;dS@+v}K~=rV8^l}g)rAwxRFXf+O@q(Ml8E%niVI0Cqz)SmzzOF#pIA)ca_Vo zk>3QIV&#x&MXN^47^tC^byfs?ROkTN1bdLj=^oYbjNzJS0$zf$Iz?X6tb9yFlcnB1 zQ>nl345m}--EFH#D-kI?q$SVq;Hr+?WWU~?zsiXiNNf<-<7rXg0V^;G#+ghJITazI z**K!*hh<8`iQEwi@U0y^V;1pXt=&dMI=_6-*ky$TEu6Fm-^R=Zxs zomX+stEBTP>3NlQUZp*+DxFuAo>v@;@9}NiReN4xXD?pWdR`GOP`v8vdDY)})!*}q zV+@K?13j+>JFfOHR-omY*XR~~IyN8@g&=aruXdo|qiYNS))h`q|zx`V@R z#-?$#rtwjWVmSG}Fs!8s;yoI~BL&_)ri6D>B?R|r%FGRG?kST~h7@I*pGS znld+yxLrV!LM;j@NvR*PQU`}wlm|!LJ$qtzKYvD2&n}VFmyKu`kAKd&q^4$9x_G`H#s&B}hLwob6>W_z<50JCsw!a?y9d+j}l=HlhbNd|#Q*Mf! zjA3oa>1o~LLY67Aq;5A^ZW(ny(UoOg$g+nl6*sN+Nd08UvuDKZ8_}{mUjzNAMdyor zcQfB3>H>ZYr5NB(mtfz!<|%Qg4fzWw5+Hw}mDw`_Bw1Ajjm>D$kQ5q7b@pDnU_=+BZB=wGr>)@ft(s@B7Q zj=T*1ZO9ciseS_frJc)9!4YyX1#j=pWpT;YML!GMU+ZV#UyE$Jm%Dx7!+!n@5bp>q z-T3;}Omp+j2vCqOb~EGx68j_fuBaCl@3#Js&BNjlS%JlSigvnyaiGZSfiVeM0F3u8 znD>1}UJs0&ts#xekpAocBfUeydB5j#|ObMDDYC zv~3w8+0-((cNynLu#b^PZ(&b(r(d7fqxW$3j+b0`xmx^kMCe&otA8sTt=AU15oT9Q#zhuF^7Td@FK0tOIi>)yw`$vCiQz}gZK6Xp z`%Kzynv#MPzMu>~=C>%B3~r)=$>699W>7#5_l~74PeFe{50wg9Y4u;hzVnoD&HIL@e~QOd*uBHJz@hHH8;fJh-^XCYco_S@~8()%X+frJEWnN+jQ*;%Vl zhfKeAlk9L4PnM_e7*5SA_?|>M)MkAK`6T6YJEc;crzSZ7Mfxh$$oQhw{nFhGK3l`n z#0^qj70ppnp8BuyeKy};<2&d3>wKfXm`&6>5phX8MJ0CIGpS)0<&o)eF#5;W_1um) z!`fS(wLcJ=W27($DLbHO!cPqqr1-|Pd6~8+F+PpN9TDi+X3tRyY!KFy&-f=A1BP~n zCeXIf;5f?%1asdAKl}a9Pw|uOv06JgF4cJUM^f=)n>iUtP^GCCMtFXGV;iet*(A*B zQJ8P}jn3QlA+cYHrPvV0HtN}TYYek(tN8JDHIZx(ZtI(ws)pP3W-jrw0@(mhg?RPe zte^QO%X)yUX8UX`p7k4VvaAn~wR)UdKjyRE`WB>)<7EBJ8?Dy8{|xgxPS*e2Ygv(u zEhGBs_+rDF^I7jMvQ|1-AJ+q{Py4L<+F4mxTQZRf1K0&U*+1d4-_glVeAVQ0yur3p zthbeez8GSV?|WtGRu1^=Xk&9eAkU=F&)&~~_gqj73xut1N3)@K}c+10Lk3}d_ z$VN*xM$4U(R{>DU6)bjoCn{yjm)#>~v|)*ZtY**QwUwq$tUFrc&_JHxRS5ln7W|5v z#LB}TFU&G!CN25R9?afayMAL)2OJA_9Ksc=yG7@Xqjhy3LR)k{TA=$7KglEs(RVV; zh~Z*=D*_UaTw*a{db+Or=^AtEr@z|$^lA1qnFPk=DxTvr!?IM94-80i{|g4e4nIAI zuIOu%|N0I8^-TZuZ2L;Ksbcc%>}h~FM0-9JzF}hadyl@gB>7Kc*%zKqhwuI2`(XIi zshj2ev*G!n@I4p4+1zIJPl6|6Xgm0p8<60^uJVKoDqk`czKI>Q-*@m0>zX`@&t`Xc zwzu@`F0&-U0-1gb=`p(^Hv#)2_E(k3Y>!@dfm?+5?LWEiYvL7EldmxWf!5Ixq* zMC`SRm}zfWAfUHUz?O#9iz`lDhHrU~5@yW;yQr66erc!-5k;XXyMqeVijHqOzu#Ew-V6)0M8I|_U7ytNwC6nn9oU< z)2W{)SpScmSkC%8;)K(36~+(Al9+j89^Zx0+kAoALB_;Z*fVhK*f;DH#^lZoXWd+2 z)$}FTORBLxW!n1=LV4Me^K!V0LE|Gk?~DLd?eLS>vZ%y z_kv?&nz(brx|_Gw2}na?w-tr6RY$SG`mVZjLw@sC^DKM9yL%$7Z;5Xh*CF%MI^c_; ztUvz0JZ`Z`b4Sv`tHU-EhO**He3;TLV)w3Ze*MTFYBwwz`6p-Y2+0?3{qhU`aHICU zyU)M(i@X2uGL9CpbpSdvK}?}Z?w@$#An8^}C_h`#!XOeAvhd@zQ(kHf*I zkP)DccS6b*XYDBdz?@N_V~ex4IT{_2nr-c|d$D?EK2x{%oj32NJ44^|?yyIn?kLFL z?c4vtm)?lOgyg#gzKuhJB&Y8D+FNe8Y>55A-)l%AqSG~k1!K4EzC&-XZsZJ@*xj}F z|Gbo>LjV3r9lnfSJ|sO$%!{$RP)jlxtL2(th`xTthl|W=uN? zId3Dv%O>QLeE(GHSge$=k*cA53F@!vujB((pxhd5!R_g0;<)WXU%18QQcl`3V%=VF zC~0i`#9_>}t@?&f9Ik3{le{?kI*;5TJhs{nU#n64`6@4zTz3)xDub^4 zv;}n4xdOVt3E4_e6ohdY17U-jA{`i}oZ}UNrmG&oEw71vA7SkJp5zo*eX~op=AtLY z95!LUcZTn&@V(pKUy$qzzxUYhC&mJ=;3M$L9$^5*=BC5fFre^z4`*p^v6tBtght*; zJm3HiHd6#a33_`tE5U?Q{n%U6ARs~dv5&hdR=5;`D|-T%!Hx&i%8D+PN!fIa-y@ID zO*6Iw@WtlX+w{Grg)QgYw7+%6ZMQ2i#)+C|*qgj{MxNbv`)y$p1;-l`F)vF2RTEQ4 zqtNk9Sw_>SWABOL$S-NKdgKR zwL)gPRz9mpE8o@^E1z$zd|O*u`6R;1C$;FxM`%$jKV&*j{mN%w0<=>rAEqV7rInBO zh@@6NpZ-o6N`%!<+}FI-uTTxG{_6bI&!bab{aygGn^`zy{_&p5`iI$50x@L=k4~IvWc$1DX@*JmyfgH93>Ph?vtSJc$O^m8``GCDl3`*wT!#m2UR36uTLjv%(jEh=Swr} z<`-XLvnZ%3GA?cmWhVkl7GNVfZA}bV-bBs0~PaL|ST9wsK)bJZj#(P5mxa3bZ2 zq!*3gD4Ksk8eZ642jalb69!2Zw6pVxp#-wTlIVCY8gEc&weZP$G}hv*m&UV%i?9;+ zkyn5C)wJ0#^E&L1?S@Pc^;|LTKCE{<;_JiFlR44ZjNsLx%rJzxab@m3Dmf8pj7+hK6+bdLA!xHH zxNue!(M^oc&et({AZO^*E4KvLImYn8TynydyE>_5r2}md#C-FlLVv`y4BWmz>PJN* zcGyMH3R5j{A~Z(eBf^t!ll~xMN3=^%8NYNFY3u~XP6WfbWIwL|(Uu>%RTL7I>X~7O z?YiNK37epd;{WpEoMshhpidZXJt8{yiq6Pah&F+^Eh<6VL>rZ2!T2@Hmu|fbqzaXF z9*ObPPKs=hp!*?ZEHx&`NL9s175o@o9SPdE0S5Q$GQIf(&qYFMEk?`PsTXnnR2n}w zvK`tqPUzdi(KwM|zHu0@5R-8)Or+755bOuCztT2fZLcj;R+IK^!>zr`z7Q`d@Rt~V zH@kmijV!8OF11EF1{u$O#L3MOy&CRd;(USrps82GMI|-gNt=~J)XQrG4pgiWju`_@ zG3>A)d`PECB2s9Lv`JdKCan<+_pA}?O{d;dY}~IAHSWVhzvqpQ+Q=WK#@Rky8o2=- zwo{(IAVqa8P&)=dHjbc@mlr7SPI-Z{>Nyd1!L`5QHul@|VL7Y;?axh;AYd6q$hCC? z0wS$n4BV1?Ng{sgsWkq67%~D%AqKIXL#Bl6g`pTeCOqV3hw&zNF=~^Q*f=Eno!N#F z6rMUX2s6h9WSe?qzcBOdg()Ts@ZO$EI#XD??6r2bz&;|_Wy-|Bv&Vwj<>jY(3{A)) zI)ze(!^ngSsjaleLPC7elhZSx0w|X1BgVH=GQKTE9b-ugW`na}catDY-I3JaD?!Xx zQWlgTIMGdXt)uKng6Jqaq?eK)szx2HH$ttp_;MI6j#aa4+4y0#8J`&1J|g%&1XA~@2)h*m@y)e%Q5!tKkG9VD7E_DQZ zSC5g+3RK$u@- z$;Krj6RTBHqrbeNv^%=%TohK`R=pNVZ|T8xiD{9&~K9 zz)Gul)9zX^XJYA92DUzMl}wIvKu)NDsc9QidFJz?2&FROgB!})!Cj%xGCeNrPc9bj zDgdFoQ8mf+(mKM=8)NEbEj>4#t2VhP@mzu}bnN1}c&T*i;<@SWTJvmuZ?82UtM4P# z=8x)oXHADco|{hAI6IhcjxAs9GJG$Jz2a!ad@O`8aK3Zv%-dTl^YJ_@J<4uxjomiY z`mraNEraWd^D}O5J(}=?)wj1E#fvrEwC!}KIT!m-AIBz7O+A6&&=?EOqw+`V2N4== z%Lsr8))Jf=g!ofX-58@IXXalHSRWhg(di!{am53Bj$T@TYOH76{4~ ze!Wj!`unOc=ipt7W{l`n<@c4m1YcgUp+(Vz`2X-R;dGNPPp4JO&)nym@5`-u^Dqi_ z*!F!i6PY;aLOxu^s2fCdip5C&7{}<9o*ifecJ05Z)(#VEk$ijJ~%A#v$~IzbT5+zc4Tz>Fx(+&G-4{ z!@#iag@Gx%?c1`+)4;szw2c8Je6g8d)rBvK@I`=VPr8SOAMq$yQUFAQm-o?Q3X^DI zJHi-&!$Wf{F97+d++Zk7SqO>==wVOQ7LeU@KEhzFnphp>sW%THQqDWOQdMp4% zP_zt1Lk|{s2|XYTw@qT=VkIv+RXT0kBfK@=ms|6xVg=U2e84?h$%gP8S^`>hP1W-Dm{u)4Aa1}b4Ty^? zv>X>55bsYP_sRoG{D8Fa(g#}FfDHF4odGc$BL1x6SBQec-^9PPx-@GmMZ#Cw60`fY ziX|524MJQZR7+r_r@&fbCykN1`OYt~4n~GyTJtA_k>b6^W<-Po%L<4ovg29RSv(Ol zB!0%uy~?ebN}hS_1dstc0qBB+q%+EsCM2CvcKA#fr8VE?Gshz&#)p?_l*=_7=5Uz? zsIe_8uRLlMt6An}u)OkYhUOt^XKY4uPG;qG#@1PR)_k9DJ|L?3NPAYEsD6isK3Xz~ zjcKKL3!)+z<^5dc;k4JCan6O;U59g?^t$VC&dyXVFr1~+*&s58!-f?EiNXNo6 z)gk#OJyRWKcFHs5nOW0Fz7|u1t*>uL_qey#aF-+bsej6X<9%1&Hc z7yGT?xgE_P3y(q}`qA5oJzY)W?AuvPkJYa;^0W1B#NORD6_lJP`fZCo2M5t%bySzO zG!dOaI&LPZMUr(~*WOEw>l#6zP{x8kn+2HTulBBMOM2I}S55>zDwgXStDO9Iwhv8; zFgyPJb_Nt)Md0F))QJGNn=-DfvJ+vq{Z-6iLqEl-x1T^a!A6u_YH9b@zk~r6FQn|S z6G_`6E?tH8OJ>r3kC}e(X0?Jr*enps;|f@D?{n0_8XmbLU;F>rdk^?Jk1GHB-m7Zs zxwZlZoCa4)!66RmiBm{?L-r;tVF^pwu*>cykSq|Bg+KxU0+D4|?nSP0m#bW4OYTkX zmM!<*i`;vW<=+3_-^@H$l1ma6-Vg8l{x^{Pj_xxvXXeZ~XUa3rnNa#uoN(mR8*-7< z4`gZ{Gd;ICXoPvY=^~k$pGlp1OOWp~RJ~C8*G=7sfor!PBR766A23^!TzQfHL?A7l z-1ang#MKx&uUf(QY7z7a9ki zjDIfD*vMDG8Jg*fx~9$i59+@6|3I;6-z8$8tB2~?wm7k!IPi^VrRjqIJ{KH{g#WA-+ALtNgEzBCNhidbe5QDx3ya z+@qeDvg{VmK!Yp4w&JO}F;*2-(XKvC?Z?+l zRE$s1d3>{Nrd$3}I1G#J>MU!-T;GScGJ!p)7ypk33C4*iyb9+!U4pcd zB#ED^X_6_tF`hnw8)79-Tc@IB8@+Ulrtb!&z%CmlO73DdRXLp|MxOsvG5V-1+Nic~@2 z{u9z}3n+~_X~cdAvM>@#za>48RuJMl)&xFY6?dGXxSN2dyf{|ZBxfY0z3@>+UAQMk z8@`)q?l+{&5F!zkfElOkx(xo6bMo& z-ruRe;l~MW1Wck-ZRIc-MrF-kOnU0b6>|UYhnb-l0^fyIC}OUtRc<4Z(5w8Ysr7M@%thFD&>oiu{JqWMbMVYqI z6CBYu9@V&0sJlKn)s4Pgp76ORLVVpGEdW&lFXPM?&j+f%cz%@M#jl3n|D;@L<}2n; zN=2+StTkstc%-csD+XexyE4k+OW!1A!k|QA%^ITe!nIEnO>2n^1NPS3?~> z47DNMV|S&o{ot zxRx}$nK93gB1xD5MiHV&DT7Y$8LB>%nN&nY@gf9d)60BVDMk(5>m$z2p%L100iHgz0-}X29-N5aqy^)n=b$t|WdBV^Dk-QtLXZnZ+Z%BLrcAvyLrSjFK~WKcM(aWkT~0#|Cv-P40~!+JNH&E} zyq)$F`jv4-@+PWHa@spMSe#bKibATQGCf-#c~je42ud=o=|x|Y{h|^2xuy?QCG=Zu z-`@r&Pi!zrz@7mIB}4!WKp$<22DZ69C`1FM5>?xYroreWj#5sSF$(oP**`Ml-hY zMK(>}l%W0kMAGVS6v9;2j67!S#3>?T=AW`-27XEb?#?vqBsu*Vp?1`unc>OP43nr4 zx6IpOBMcjQvtY`;Tfapc^Wjx2@uO&}G3&=@BeM^MkK*Bdp_iWwy^1Z#lITuT8exT{ z)co`f!UR=UJ;6+5UL*=im~^IclDH|0A7om76$8<`4b4{=5`~fIv(CD3@f4blby-s~ zB}LS6bfSV{+Z%QyN81xdQkY8gBl8KogcR~E!F8p&+lWs~U<%=@3wo8$Yp7NYk7ouX z*+ekyCxKAY5c)y$=yEe0kxw@cXsD93^~jCV=|wD#%y0JPSLkKh?;jO5lm;jB3GPQV z2CE^=Y|LQ(VrC*t%-eLwBqNb=Jjqo+1{r$wA24B7Krd?$uUQ}dOo)cQsb5v2#G**( z&o3ycxm1{{;rR`hruqQt6+0_TNG~y89}0~-rl&J>{z5@0WGp(xT;E9XGPOkG%#dKg zKd=lp^!jz@FCv**CF_NX42uVExCc$DA5bto@>s--OQZ@#>*&J~S%;Y+Xq!7?ilJYg z4!ll!x-MdzCZFo#Gxf=jerBQ=F*@(k$<`^?=(9OlZHi<*MS(DlV!zQ;zRraGv+{+S zb`w8`4>M&t(LhGfssa!BUiuBoxJe|C)-6O(Bo%DbvgVyg(F1k``b6kO+XC5`-!r;) zCzHDVm|sF>=6?eLD%5d=aE=GBqG3CyivdRdrP$H8c`Z<*9ak ziJlHu8cfDWL%Rg_sZFaaJbp|T^(>1uWWaMLR!LiWdgBytxDwLROw{_{QNs`2Z1|Pi zLQR#4k_gUjYXA#lJE|~o<&1-3qQGx7*^e$qmPi0gj7ORyS^6<^#{l^}#Aw{g>$WV( zBtavNPV%Sq``6HCKT1+Gl$8NCv1Pavr#BT31T+gtlyS3h#sJDkNX&rWi#B{;_cEs3 z&YN_SMIg|2W^x%u2N?L1GeT%XvU?d>|J$r3LQNBz(z;-TZ#nAXUNj#fd}8zq--^=Q zNXmQBu31@$@5(Tf2?ftJtP}vlr088Q5v>nLVul7e6#Y-XH>;N#3?(H65|a`*6OIz{ zE;b_wdoh7U^vlv2{cZ<8Hcgc#!9H^{4Es#88KjAAu*%ebh!-Bek(y6+^|eh}`t#R4 zW<_awg!{O70n2!X3eXib3t1krqm7(c;xqY4m$s1u@f ze?f=w%iBD;Y3jOm4@~>7_8!(+B0@aukbJyYYS%iN^vM#5Uiw%$*DjF7>a`t*TjRxn zE|C9gE1P^>W#x?j+EVdV*QlD7lYecgDc6^Zq>^fOyRk1jSeE@=X~<{j4xD^4dd2)KNnpFLcvg4^~2Bc5wDClf#@C${oezD4F868 z$j^mP!AJ`3S^g!GU>(atM0K)C$_K2St)67jUd6!5CvCMV|&oQcMT|%1I)a zru=+Tv`lDz`6^!G#ooR2&(!C60a~3CyCfss*pRnr;LZ7Sqy@f%3b-%+^YO9<)hf(Y zgYHWr-m9wz1xIcz7^F^BSX?aKZ2H*xGSROS4Qh5{ykWB3U0j4bFyDO;R5zI&1@@D% zW7>m1rD4cP$usN3`&3dghFr%PakAkS7Z7tA-VppEQ||vu@8dvqy9av^@z%ILyPJ>) zj10GDd>$U3*Zci1sN(P5&N+t9M?UY`OaW#?JXu>cUy%IN%t2{%jNbUwHFu=gP3pf^ znG>&5X2x?3Z)%_Qo6&QBiI@0XZ)!`V^VscA1+FnZ+(jxHVfs*NW4$K5CA~C31T?0) zkx6%Z|INmn8;lPBpB-}$Ul2JZMdt+UICHBVXIRP^qt)2Wtbw71jkb8A+ZbNRqjAZM zG*YA+j^-(!Fv{rL5B5U*(VT!)*YvV%!08Vg1lke&_+hJdftoHc>AAktYqfH;3T8A< z`AbLhx?K2v?NIJ?K9a%`oWM$mR~s@6@FBj1W0oe@cVDx5pAB%+aP5DR{szNT>UFJU z{Rm%*wykFAsd`ZpvrD5L0y9rA777)qugL=kO=~~UaZmH6;IEpm)w!;A)$=v=ZwRf^ zJk->HdfN-*GEy+=6fB%cqU`*)nF-N?++9ci{2TSKJRU!oYoXk)%oG3L@~c`!6_IW< zi@iJr;r9P0-G5d8;qty_(FX5CLd@I|!LnZC_XWPqAi<+o5W3ztaxvY*?1ON6NXICV zg(mY2-my^;(cWJe5?xF2PaQF0nj->~_=MPKllm0^OMN*KU#&%nc7sN;@AP(NeKRpM z7ODTFXC^db?O_&z(H-nDDhMd|l_vh0BfHALY@~ihG9_s7pkNbq=q55IYKMeIa~}R} z!k2Tr*>vI-=r_5$K*2G{DxIFDZ+fo;0ghCm0GQCL|{(2N)+= zBWat&oOw1|EiWSiBQ~_#RKe^+=~OzA_8I_u5iMC~*42htBJU|V^^p>}CH*%@fnCd{ z3Wt)8+W{J==_wIX(uD|Cm-wa2EX-3cQ!527Dr01)>LIO2vIqfL$1KB;Ks5M%re0zv zyW^k)Xp#528ocI|D|y&sL>xNh$^=4!A-1GpOCdTGr|$v4rkwa5yb`XdM&55ITIKca^D;Rq!SYpl-9Z2Gy%e5RT5mqOHcwx} zN39J|veGB%M#0P!eMmuHu*Of{V)hat<#Tb4wAfhHYi3H~EQehev!_7@X*xcNWI} zrd>LP;>id@wnOD&Q)HevfcG_?ScgL=F*e|X!DnnU*dS67R8vK0h*vdeJOX=JQ#o_$ zMk9%to!g45%IZaJ?x{2VnzNJ2riC2_PB9FaHJm)XDNXs$<2#^&SLmGf8v= zChq#vH5%w>L6U&i3QpnVDW%Z?yZz-0PaEj2YY?p&Y|t5w&zO&`Y)sHP#wAMoOaV^p z7BI@-OpWu^=u&f(;T1Jo1Mxh(5=7b>W$MO9 z8N-%BG|CXD5*1QN*dVmhQkB}HOkIsK3bz(XGTWNc6KvUdhZJ+HD2;;5v7*Fi!G;OC zSjg#nef#${a$t6k1#6OTG(E{`y6md1G@WR$wKP2mO~)O=-Pd%K*=o9qxK`5{lboiT zAv@qq^kXzVDN@&JdTS=4>15Z`)2Q*wR?}f)Ok7~>=2}hn_cha*#~MwqV>R83+T^0O z=Ci`Mru%wXE5u*|5}^I+;F_Nm$}VJ@QaS9?yom5sPUTpYix7$KA**=-f+aGpre@Z` z89;c1h^<2lO{bpx z><+m;TEl2O<^^7SYE~~kHPcIV_S5`4sgTxayhuF>fX}E6TMCiUcxr_+8j7qontHZU zbQ3m4DjAJAgvbk68O<#+8XN;<)R8S|e#vww$=Fg|c99}UvL$0@iP4TFMHPRpVN2%k zYi#MpqlV@Z;~NxxVedMVtfw#J($#f#Ok%y8VpdDZbO0uc^}NrgjLDJD zI=f{5jx5GB73Z_&ct&0Ze(o64c$OOBE;mdwU8czgBeoV8zburZBlVnx%JxZUhqZKD zM=X>Vu{W^L&sYnsE6c4b6SYx~T%64mZTi-ci5l}wjE^_BoYWB@l!?mV%)dQXx=@jnWSnQ`5@bre;T5N_J@T$K>*1|$| z_9+HDR(z_KW}J3v?GJkFdHaK&j~Fnksb83MWJEajD4CgGWLC}$tmFMCzxDVCTB*$I%Y(}Z0!Adb!wR0XQ=RJZftUO z%xDqa&Aye#;THQSX^CeiHXs!S4Pig z$0t6eG=E=XV;soWloBvg%49pG)G%o8MYv{4nXHYqC@K`6Qlf*_##F?$Q%cS@yD24$ z)A%G%J65KTZ?JeuG7~NapZQqXXUJaH=pi=Zrj&Ix4002;S$S(1)E*SWVoi0%4)mKM zVVl{gSyWY99*YrkUi(v9o+g&HEe{7+W2(v3DWAsj5+n7D&T53_L?a!;P$9v8*1q{- zO|Qm%+#FMDd^c*}+{CIA`6i~BX0?gM7h`T-c{3A}ZG9$E?^DC_h~&C=>-KOB6V#vASm2E( zqJO9D3;Y}#wTvPR0Qz_)da^Lcb=2-dA9U}1eaVw}<1cxzYpshgE*YFULyIZ*9Z!Jo zcz7bq(|0^Na%PrVetLFKm4mIem}G2zCUNy=Ji+SEc+9y6mF9fH4VIayH?e)Qlft(e z%3UKw^v#!<*V{hp{u;JVfuF|qO?zB*{aagVPU341#cm+39}DXZt@8_9pb=kt@;>qU zwWn*FHhi3qxcQW~I*~u+)jm(Pk5IEddF>gZa`9fM*{n?5bYgVh*@Npi<4oJ_{Wrl{ zox;YmdBLHW#FU~4r?oo;8?Uv?<*#FEt^H*vyxZ_QCE2Wcn4~gy)zsPUa(!G*x-XLK z?iQlt>o{t7WSz|Br|+HK)&ai&DKVoakwgyvB|PK{PNN&Li7)e<`c^OVY^3ni}Q5CM)S*%qMy=B*lI)!ZR zbGlaM{=SBhd6JcR(#>Vw$jUqdu(xPFfr5HEa6gjdBN$}uWL{lcwh6RvM}>WvHx4{w zkImwe9x{$w&Z&{<2)%QO&=(Q`T7B)b;yNvMOK^Y2z*P8VTCBGwZd&mdYVq|sofg-X zO{GT6EjjT?vwG#GT3pv@aa}Xxl@`~KC|&L(iWbKu`pH@x!UXtyA(Hq&;G1lXOHJ&- z%-f@yof>n9<_+ibw{)FqBJJHud;c|QwY_7yG1`~3NlI(CFlzr-`B}_75O}6`{>)&# z#6Tz%MB%hNh!&p<^3fePaK9KZ|5QGo@i|>TXC4lMLjn(jF9yp0>8J0^8TEA@aza95 zA$MkAI40RJk|n0c_?to=yZ3Z6PwD(ZM%8>87}V{ycV4LRw4~P4z+20fMQc2rSo>*K z&R1(boo1iMW8YFKP|O_;@72Kcn_TWlZ+}G9qC2%w#I7 zU4ua2Zl(2~F0OtWKXhiES`L=IJf8Tku>2*aKQ|?_0_BX{nwAU)F&(t(#kJ< z?x}>PFmD`iAEcp>=7ThTxz@2X4t$eagsjpxm8;>Lve_Kds*QcO_{YbT!I>>yO0uXl zhwdXarj=Y$!$-(}WEK^_^U~k2(@pA}p5CT!ewa@^5U_i+8iW}_{O{Iydz`6VaXx@D zld{MyiM%Mpdqe|KJSE?_+-^RlsF{bcDvNz|^HovWxF83^Vcryn&$;Ycg|nb!C6gZg z6Gwj22Qk+0&9SLcB=kU_2})TjHB~X6y%PM3FkpOq?m~lUIBCQ;BLG*A?$$)CA*;O? z%oi5AD>&gAwi4v8*SPw3(`ymJ_rBi}036KiHxIwkVZO3%Aks z2LcVLq}U<}vu^d8Athc|^0Ds=fhg~L%~Fjv^3^7-fg^FtH2Jk3g~%J%$cNXl^@ym~ zhC0b{5;XWpk_$=#>dXiy-WwTnrk1d*-IF0IMRm>hxvo+sDqYC7kjFO_7IKQ1T03C{ zF<&FBKgE?xwZv6F9jGtAE8cwS>OSgA-oKkCXC!{3Z@(Ug&m8GZPu zQze*#QYx)J9}+6V-RPaZgX6ac0`>Ja&8pWJ{PsubI{8nO0(BNlG`59|b_0ByIhd}( zNZ=~LaL*STSinPQ6VQYi3BXq`f>${j1iYq6*!>AVBZ?*PE8edHA7sFm3%NL=1EglK zMa3Or8TAAW`HldH@Oleq%FaCSIy)0Lu1ID;QDR=Fhi<_o0ED}U0QD6{FA%Ax0D8Ri zSCEuI#8V^-P9r>(@BvWwsf1qvb)HK28IbyvE^>~fJe8o+8p%&3uy%+fJ(bV|NPNo7 z3=@c~C*?L*b~oZ97KD|hQz+^#nE`*LKf;h0xFsZ!6PgU|8>i1l%@y5=A#+tXnq=RZ z>o#wDZFdN9nr$88L&y-6BmsvQ$}k5sDEwP=y81wdt9dC-3QwY`9cdy7loQ}ZF80jn@IOL(YZ)-@IUuujoJAkgK=E4c=i9O5;e%q?DO~X*_ZY>R*m6XcNr* z3?i$9rle+Jrd3-;sudBdWE4}Mi&k%GY1Yq*LaS&t=s97AgY@5z$tMTo;Pg(79*S^v zoY}C~Q8c}fzQJ)P>AZcXrbNsadGFi@y)>mt&+?} z7%LXml}1nq!<;a$9(53_5t@CGgXYn&w4q7CI&Ppz<-TYs3g_TlKhXC`P`~Mrh>;Qs zA|H_`i$ToCmm{T#M87PIX4d{XSI4ho1Z((sue@t};P`p2DFTSIN}FYP-&Vq3sDZw4JY3ovSpi$ZET(JgsI1 zaRXN=-H^6pe#kMpl87)LfTbWGS(~smO+m`zE5hhG^gS4z&nc{M`XpSWx##>>PbSQk zyHvClb&9fi9rpYs`i@}enBG6QW7i41aWu~B+@2>aU=YRon$Gn03C`D(xUwv z-WLcw8A#^DUcMz6F11g>*c|1k`lCQ$!$tw>*a&i@Ap`eAlIB4av$$b2oc^fZGiVp0 znu)fX$fPluNr>E{^nnBoZ@gW}YasI!HL~eHZo3k-OG^KGdei8PhS8M2ANR6`(a)wo zioEKjKN{WCkhS*TO%Qt;M$@Q@X0wt=w6bCJp1)shdfdu%coN-_CX_67c4 zZD;b$9PVXK69KPerZX-vYH=;7UV^#fR5D9m95Cr&w_Ag}+?3LD9$jvh!=(-1XJrw! z-|_Oc*1RIr*rUD3fH_3ZEFu!n$Yu+}+IeiZ+9CmMPbSK(iH*iTm@rVnCn@^pccZCV zwooiLfKv&5=n~+AQkKQRNZ`F_P7nt zP%EzeUnHqsoj_u8Qff*tl)x#B)aV*lb#|>%qwCxsDf-@~9zSewKQLWPjc#&(XcI_- zm)S1RF(dv;MKFlm9Wx4(Qli+DxItICV}9 zq%JA;^J4v!;5LI(qgza)jlVbfv^2fTG}e7x9=cr*`L-t#x*cz3(-V=Zao{fP?bv}N z{UNj8^?!}jT5Mo7A}7xv`l-a`GE~cr85?<#n>OHm^C596s|KL9lV`06zl;FO8&(GXOxcSzc$*<4U5fGeP1BN7psb{Fu!ovrnikzw|v=QM5e)%nCFyKi9xc$P0p+y*JVK zXqkap^Y;Tvrl4acy&|8n#gx7~AtRuHM4I-YmIop<#b!Iww2v>TqvONryNGG@MCe0% zV3)1CCqms!q#{x`vGaMu7NszYB-p2yp+?t>NR_K;3b;~c1c8?`lbo+LLvbVte=DI} zS7G9`1*5dmh^lemvvE=Cc)dBvu%kgV)n>k77*gf~+FPr=8fbFk)c}!YRo5mpRs;6C zhMOK~_{(rEwF=^F&-U@iy`&0%1RSmOaYZd54Zw7cD|K=z~prV)5py&={nh$|5H zs{(5Wh`Dx(_P>AsuLS;A0{?%P0F$vbEoU`*1&m!3Xx&F};@$b!6q)@m(FcaNCLwj-0!;Th<4$F!3*=+b8VGfo#K;VYFS3VXZ!R zDcm|SI{6W=4K6DbEmx*kczY1K#k7Jh(62#O^%>cfl&un@tq%vh)+XtKin2bg{1f6D z3*S%5-qYITLp}vrI(28h%~ZL~&$LjPV&Ug`oI7ySK*&j|Nv}a|hmbTkF?#r5z-wj7 zpFMNQSXX{ULBVK87OSnXaK2tI^*Gag1azrNSa@{b2+M3+oY@X#i-kw1F~`a(ilNJt zw!_$gV=cGyOMGs+$*# zrH})aG=FWE1te{m811w-;N_b3DF(Z&1p~ zqc5+4ZY$C3SvY^K%{3?9t`*7_3%5{XF0>j^0ewtqi;fgk*oJldvTN7Qs=`x_!>I8C zs~p)yt&N3`sDPrL#}7ci4>`D~N2TRew!xQSk#fbtYn1d%`Os6)o5ZWn^kJtguND!< zt76@kgg9}9O?+MIdw zvwr_lI43c>c2&S@X}YOu%fNZg#1_rU8Rf{M>rVG^ zht?g26+3dVS{n=hH<>C6hKz>%4rKQ>+s0T{d5v8K+bB;gJU}(+Gkwrl=q{?^s-9ye zSXM_Kbb{Y~c73TUey5nm!g)%0sAb0~%B2z}A1)}hxpuS)x@>!t4eitVw4!kFZ0LiA z!|D-pNK1d^-s8IK$du8W9ETn~*DrD8#uf7yI`X9YGZrq9FpgaAHy?V4%37R1a=vZY z+3cWe*(POkybgEoyBK<{^6jpiz1Y_Az(QY$lQxW5?^yH{<5>8Iq#U~Wz;eh4WY@xp zYiy>|C;d#5l_?g!ph7oh9}+!Lm6=d9aHDP5)hoUt=FM5Y*D)B-zVkLm9#wl|VV!+B zdFq77eJX6-s{UIov%OC`Ar>f8Ec_%-x6ZEE4*6Zk>`o(hTTTmi_?)KqJzVLE?;@tL z@UKaEsO0DYNY-xAQ#(5yw3)W~axYaLe6N^yJkYKRnnNg|sQFIoCAu!!Z+^hbF(x&x zTh)O-*r96U%+X^U*?UQ=UXDC-ad}%ucFsB0#*r;F?#03#C7`^uv(7<}k;ZhM-18!} z!Mav-2s-o1Q?^)G$1WE1FKY|ATD7U{M8U?qraj^MIQz_&j*h`uu|>_qVEK{F9iTHI z2lYSG!Dd?5+}Dg2$`uRm7XNX}I(CQF%@NTBXIk_mE#}p-rLVoarPNud!*Yt+`9Aw3iU41RDg?J!4@QqfcSa_PLR=X{OpofU>sjeFbTV90`*T-F3 z&KTv&-y^QE@F}G{xa_d#$ltbgx+BkRn?A*no7AChpg7rj(j@3rD)-2Q){||+CPrMl&MQ|ed_a$n zjhiictf}FY&Qom-=O6bCr6Q-(e8-`e_{PFB)UdTDkIsM|pxQ3!a$%;;HZs>2{SIYw zo^R-wV$quPlpR@6W*fGtv1{1Hr7PDs28X*}TH(kEYHlptU*)fu)^-teXH{`x=j_Fn zSI4z}6^|%eEL^Fyht92D30)-m?7+FJEwkNazJ(R0JpTvIS<*0{71L1x@hyX`kKpgRC!|IQ7STb z&V(z_zlSWn*zYPS(Zcm@eNj}cp4QtnYT@}_ogLXjO^tc^q)RYC2cXfx(65rzP?Rt_HW-WX8%tn-)@|m3!U({5^p3mJZ`n<9Y z9&oa^&30v<-^U}BjTxrWmbDyG0Bxo*>t~-SAT9m1ox$3A#Bd;ttv6u}SKX5Sge$~B0tF?n|+g8U%qKV3eqUw3xtX(6Zvs8(z3&)SNl`Oj8 zS8`I%gJT_wrDE*n-xG$FivCw}ZNJjB#O7+}JAui{6bm0#p(}cCn*wcgqFtg$81eWht-ZlbMcLZ*Q<^v@=8}g4;QzBQ9D=JT+LAiTgSdtv(~t5 zYgK}qdoDRWYqd>U*40niPf26p4ywSMrRD2*o}C!oeJJ3yFhkph72OZ~$qsE>uJqgV zp(S@;Dedpb(wt6L9j|@uI-hXl)s}}3I9*VA4B&kt_YIcrt#gdN~ufi@qqyPn@}6q|MdkjNh!8$`%V( z>3N^^yT(ATQoa#oGsf9w^<{Nsn>Dph_XUncaZbsWxkR~~=ik>pZw~Zy$#edyg=Lo6hCJVO_Sw5&rQ+IFjx5(D*kN5E{uH%dgj@z=; zQ;#?@XV&QLj@&AfWbQ9HEo*af3$$6Q^=-9jE9GJ^BaZpX*izZ73*5H6Z3SdkWn0kU zTm?zd#huKTtwe_Q%{}foEEivFM714MdHN{y8MShEs{zMswmG}}Y{Qfd$EW8NgU_FU zz6Ek@pLXX+iZ1T|vg@+^AI-b9?c^BD5!+api;<)2I`3=?X;#<$ zH*D%)bDccv=gL+tCS_{Nrb*{SpB8;;Y`fm1rN`Dh=Dcm*>W=drgLC~hjdkR>!WM;& zY@;5Hg-1$;XV$D30^LnzRrT03%reuEVv{~5Xc4<)w3rsMZ8MSqrE0oPG&-YGWd=k2) z@=aZQ<|Jvc!SV4eg8a#?&p8$fi{q?#AEYIz2Fg0gMwG4ZU;c5IDr7`>FuP0Y@% z-FE@nEGAa%ZheWgSVp_{e(%hkaiEuL+x+1t+Bh;#Ew+1|lNX*9*}>Ft#F`d=Hg)V= z?lUV>F4vx^~70d14z2_fT`@^`6uRdQLFfDPLUX z7Z&&D@0MI*WT!HRmCudQBg%>kptmXGmaBaS!UH=Tu-ot96YUPqb397UT$t?0g2U~L z9Jx;Y8VgrQnbuaW9S%KS^ufxKQMPTfnMhh6I8fPQ;cxMHYWGgXkln?1!0GN2ZQJ^H z_vJY5?3~$-!&vdP6M~6(7iU1W6od8WXV12|`aI#xaJ(|b!cX&b)5M}VkZ(dx*|%-3 zZPv6Le?ZuMYUg@a{H2`Sg^sLJW7#~A)Gl5=H6Qvh$h=WQ7FbS|_!MjLmz4`&rlgbF z!-F8Zi4@=S|Q?a>eb=Y_i#=@A0#l08>cQ zh-m+k3et{NzKW@NJ4uV7t-S0T+WdA$$C!)zsLi+oJsdgv!0d~T@#PaE&Nyhfv315z@l`R&|AnC}S&09j=3R$vbe9MoFCU)o5 zftBKxx#tQTgOc&1`#Ey5T5Gq7*OXL=Y^@3&Jh-ke1yI4}PrC|^RVG*e;@w9IpckuM z-LlRUSY88JdRtz7iWZD^47Q3by8|k3~RA_3~A}Ht4*9|JUuo46{`{}w_TX&cr9sPHrbJ7>QJ|VG34mv3DEyZNo^0c zoow6HBR*y=Rjyb#S6qi=Uz!SSX8Wzq?3!U~*zrrQU46%1dcksCC9bjXWo2qpzPqV= zeY3RRgcpq5+db{F^dpPga2&t>RLpH|PAV_^N7JB7>^xXs-?dMxAK9|km7e^8rOwbw zoUE8k+CJ~QvG7ijr?QHEV3@3rI40}K!C} z4Y5^u_U;*D--E2gD(vu=-@3|~bzk@~RaFbh7wlr5r}scz`|r1N))G9r&C!b-ZVkA& zU){rs%3e~U`Bk)b7J$J57~0N!7CPim}FILM&IpJ@%-{J z_nRCom-^$!ByzZUo?@Q3t-xiARy<}*eabT5tE@aQXnnwzJwPEaEjcE?Q<)=2(qV2F zd~{yHbFpxJm`~_%;W^Wk-BrG@ij~FnSc|O13!tY+!lf0^wstH0+RYqUy4DqM;%>V4 zYXwV(E+^X=iTTWiwJTgU?8Xj?vy?4HC^dE`=bsk2LP>jFC|pNUJXlG5(8*rf`k>=5 zYVE2$j$Eb2vR*a1d!*e4XtPu=IJ$GEWwr#zW|XkT2k4|>+cDh4sznz*bXRLYfu&veV@) z`P7p+;kbL8{`FQS1~_ru-E(v&=osY0g?qb@lJRZbY+oMDyYCv{%C8Vt_mX(qmNh+~ zr>lg)J5Tkq*@_-_Qp{GaSon3G_UtvX0Me|wmz@|rkd$=U<;UEhvu|{V39kGZi}sCi z$9;SXiHKn-JW*gekpK482HeMJi?YLoGWx7lp%{n_9V z<#MyRR(;Dvo4xkdi+k>|4eJnp+f>o1?M26-P$BxValcc8D+Ij#|EZ=&?)C=5^KB z_PsCLTrC>8TqBh$7XAe(%SWwm1!=cCIu^Ibbu+g(a?u~m7Pgst)iKyr(r1n%*Ax4I?EcwweXCm3-SX$0xY*FSk54#*ypQ+E{p=3Md`grwDqd8nb-;@gmD> zd4}V4MY&?(`*^x{&hZk+=OD`#T_|y^;;WK5z4lIV<+l@8CPpf==g149pM`ARrF^o@ z)q16`zH^ler>v%KY+Y0e-C5bz?r%4Xv{=|qIM|uz#gS(!9EanJr>=5j?wEE99JyN^ zik7Ibp+nltgDw=^rhG-2ZP&raT)SE+S1i0#k2_7>u^8G+#r7|mw9MAAx&LNs@S0;A z9fL}-b+06bpK7rNI$uI;*LLF?o9pl?zhy&|&24(E8asCj^l_!_J*;@UZP{UeS7FrI z&4(O^iYZt3I`Wd58w<}?6%Y05zXN)zL{rv(>K@B%c^kiNmuu} zdeHJ(#ERWYvBk>CRgOcE_>xPdPN`gU9NKJDcQ4v=!e%=dUlryko9+EIttXy>H1gU~ zo_m#~m{<<)8tr^>Mp27tZc3QF^=c1CZk>BD*O5i@rnPWnxy&&Z?xjX>C5Zfh=SQT*daeCZD>Z_&lE*e1rY z@aIW6xbxOFkmj{tNq+aXHrJJTey&30iiKYw>Dn5 z-gT2mNtb0a_px2JcW#FY$Dn-X>a~7r3JxuC0iFy zW?RR6(q?O`Y;G>sZb9n}&}PBfx5dWowr#l#%(iWPdmldTSR6gL>X0M%sl~Byff{t7 zNBf=7W=XMcO70=cEib-FaZK6V^0;cydeQCFpsu4Uj#zGO{AF0jCF`pkhkoMg4j2_z zT@`JnUE8|ZNU^hE?9P=iF*<)!?b; zp><&K>ZLswV8%GNoT1dNWmYK{YYvHU;JEFg&D)7XBjzFX@$I7mb*JQDc zh3_F#uLb)>n(6YvDXlu$Oyk+avj#s%xmbuxzt4Nay?p{rl~@WBq{VoO5ZdN}*?2xv1To-Lm~ z((=l>&+*z&balF8a9(U<;d{w6;LOBvkY>?ZJaOY>nvY7_LGBwe1>d6R9~%=?_x9xUE;)G;XQQMuQVm(*Nmzq{rS+6`?i zv1L~7Udw9~Q!C4BfwH;tC>th}9)>ov&S_agk630^UvbQ~&l+&taX2Kt_)O!8^LibF zHuHjt_G6COTy39pxhj;)o$0)sf4&l06ZRE7T3jF{K6BSo&JtU6YdgW2+M&|s106Yi z!pyFYY`v{0$B_eNi+20&=;4-^A$1C@WZ0T36v`NPk+(;-yV@udj!ibTXxGNp&}KXQ z?3m-7i8hALcfQ-nVrc1^zOMXIakWQ8CS2Iv9a1`PZgequN}h9hhAB@hyi1Z8+4e*~ zXtP8ZwB=+0#iNGn<7#-I$L2y;e)ILG20QYw+8PThAl|C%ks^Dlt}}{;4Yu`b-Olf< zY~^Blq33zyt`32I3v$BxOT#R$S(u;o=aV)s9qkw#6kBE&s^am11;e4u2G)t5(?;8D z%XukpvrSeu-ryWYT=tyI=;bF%Ar~3H(IR`MtzjSD>)9Iinbl*y zW3W$bW8s-fI%{=j(Pl5A_3i`nY_`?$R||cWEf)R;Ny`tkSOIxfZ9F-9)e76Lxlg-x zjU2pZi(}BI_0$cHJgL?)ek#+d!(G-v?-O0TVEQ`CYu765D1wIAg&Hmu;;| zh=q5kF8ijHp0G(L@`lGIJ*1>=L^xiUe~RafZ&w-q>~7_(+d=L0m{Y?Xd1}q1 z4vw6(cUF!gyRRI7(XrjGVbQIamSt@@4{er`-7YP>01GUz1w*K{z#huxP6tgoU33L{ zrdpP@t@~BdVu5>~b$U?QZe?r7Y_j;$Fs0luDW@g0c}w2Ed{Az($<-mgGB}}Zj>D<} zz1u-+KeD1tR(q0SgLC6AM3)Xc)8BC@?z6b3BTuWnZVi2?Fux=8dNIyEb)|=8){7Ie zR#!`u&7HD3*LP|!=-$%6oU?`fEw{7r1y<)J0|z-4%f#3Yw|N~e41m-Z2qzZyA80cb z#;0O=%H)pq?e4Qg^m;K^xN80o(qeMPbDXM^qIp?-R7fbceb}Ol{%yzP3u~j^!Y_agqdEETe@k5Yvm9*>1 zEk`V~!xcWWtV1nMI}TmM*R7vBp59#vZT2O`79Fm1b=>Y}Yp!fg6|O9wdmh?+<&d{> z)FsklXni=OVhycBo9Xl2X8r1QQwKQm?C8xM9eFHkP8&yVl~KB-((#U0o3jsYz8q*- zx-FM$m9dz1@zW8J#;5EGrLtu2hyVa`4K0O!zBmv9EWq_8#9~biw_L# z1bI{<&7U~Elg-pCJ|rAbu2}e|JU+R5XBSAb_GmfhN^g>)jl1u1U3T(Ji?Oc!v6~JQ zIdY9!8w>x5{5d`Q4TIDv@15JmkF=bYusLlzY@9MVr&6-G)oAGdBI%qJJ4Rbh`yX(e zmQA`m-4%aIOzrnA1M@G6G@of4&6zpXX6pB(%d}jX+>ErURuH#-JPE)8Dk$WG1ME_Y-{b*Fo;d4BZph0s$a!6`>ZmD_fe#)quV%Eq3jp7)=% zM6_9ltsQ%Hxvk?tPLWx)Z#S>^ddFg^81oudy*cyvjD|H z+-_NQ+2FG(Q!d}z4?DgGdY-(~fq~QaS!Nq)jAgcqqJN5^*;c;UGg|p zP;ta&yU2SGo2_bS|MM=}LY07pNd{w2Ej;6r&h?X?R8n`g?CAdND?HC)%Ec~q^Tf1h zZhp|q0*~VUuM%Ty8+ZjA0bT~%f|tN^Sm{M@7kB}j44wz);>gc|lfbiJbMOqfj}wNc z!3E$ca0Yl1Yz0<Zq8gLz00^ zU@5p990x7~^TDNH4!8t7#rE4`a0j>u91oU*L%@Y#UvL4~87u=^fb+qs)p1ndqLgQwZR9|Lv*N9#G?^%Q|C!BOB8a3nYy903jh zhl3r!LhuY<+dDyMc$;VCV|20lR=b!94H^i{{SYcCZsT z9qb4efgQjeV0-WibH#Sx39v1=6>I~}16zYd+93hEgSp@ZofZcxz#Om#*aE!DR3;nT z3N{B9f?41!@MXsfG5~8s|4qP$H9K!F>ndfsH5N%@CY~%JPht)l6eSR10Dp+ z!2{rUa6fng7r75y4(_Be>cYqtfQgA&u7+eST0M~-2d4aeF+y|}(mxHT7-q(67!7ktm zFdJMBR^p$Rfm6Yy;BasWc%Hf2VsHVt2rLB4!B*fxuz~?^0XPFJ14n`L!Lyupp9d}h z=Ypl+9B>3U8|((o0*5kdnhEv>XMkrokx>e+1gC?uz-eF}I2F9av6m^}W^gh%9h?O2 zWR^M++z3tpCxYX_F5oz@d~d)T3tr%ORSCEaEC!c@W58kHXs{Pp1ZIPyzthl2Uw5HJTE4DQ<*@CJb!z=7Z#umCIs2Y?;G{@^JN3iksy zfqlVQU>|T4*c>n%xdw^rW?qD~t8+e6zQ&(^i*ae&j=7D{|&fvmr z*gx0?><-0xy8s;CZlWBlZt20MCLY;2AI< zJPjV*fc=Ae!IR(?unHUoo&e9YPOAhEBf&0Kg;9l^|8tfn32JQyOfxEy0a3|Or+yNe6js1gV;C65rxJ}Q&t>DR3 z*grT4+zgHaH-QD=e<=}E~AvgqF0Oo=O;fYo)#s0z7;5={)I2Y^z z&H+1sv%v+-NN0hQ!I@wSa0YmAG4>Dc1gC=&!D(POa4L9W5%v$R1t)_uz)4^sI1y|M zP5@7rWB=d*a2&V>91Bk2txO3x6f6cif@8qT3$TB1Ggt(U0Y`xsczrYyoCb~n_s_@v z!R25fI0+o4-{)cf;8Ji1I0YOG_5}xlTjyf`;0&+;>;(=0&(6XA!6jfnuoUbIjsp9D z{lMPf(b?EPI0wuJ$ACS-ZeS1a;`3g2;P~@iH(=BAURPk!^IjLA@Odu}==8kT8MyeI z*9oY2&g%%YdCuzqZ2y|q9w`5s*A5u}HLtDyde&7bpZ2nVwNHB=F@Jj6`!i3T^8S<-UG|jsArg4X`y=gY z;{Ac%Y2y7J88q=epoLAm-{D`Hc)vxvnt1Osw`}6QhevJV{f2qZlisiK#!q_hq8m?o zzhWlxr1wku?+Nd}@jg#@@8FZ4@P2`%KkhX{Adh=*V-=5kKS!32dp|=%9`}Aq|2*dX z7uNKc_ZDOFqu!f%>PNkw;1?eCevI}!;=RFK*h;KST--d9N`NJmmdLT6D#O-Vg914|?Ax?}Og=ug?nS~+vrbY@1I!RH1@tle>L`AL30{=-=q%rd;f@-@Atkzd++yN z#uMG|y~O(9D_)G0U-A9{`FzEDkrCuR@9WH0?(<$?^t{iD(sB2BO<8H&=RHq%H}amN zhK;aJToBwCMc1 zz55sg?)DntA@B0Oj8@#`-AiBJ<=umB+~wVkr@70!i*YN{%S0NPUIt?(0omy5Oz%sy zJ=6OlEz0!nBxR;|2OcNWyB+(<@NOf0hIcFFXLt?i8;H9xeT%7fy>F`=aOJ!N2IG;RnCy)kP1# z=+&WJcXB67bl;ua;1b<g!0<4-6yadd=m@kAy~8U3N+FsJ_O zO`>02TV-OHrw}LphLw(_5NT7f)DzO#!=y#k!K@k)S>otB~;M?H@ zq7|Y_1U;vk4c^fW0PhjunlS0aQeUbxbl$$Dy&mO`-W1AD@iTHcJ3-rZ9TQOviFKyC zEpNy?F_Ikp#XBazyKeP0A=bH#I%03u=7xDw5Vd=?x}H$nwnb=o1^c$w(KiZx&k9dL z#*vI7$2+e2MQyOxE|`vp)K%R3gs6>suiFpPf1~@bQca|Lgh+7n1}+kvEzriEBZ!=2 zWS)DOiSFKFb1gzr?XdGSAi{GRq}cOZ1d6zPY1Lk<~*aHus=I5qXw~#1c%R;w~CN@E<1~6wY)7 zmv}_#HH(CuhATK8!N?7Vo5G81Q5W7r3Z3Rs%JY=Df zg@}cQ>0ij8Q@PeA{dM*2V+y-y)cr+n6N;w()`a?dm%`;cuBN;zmb#0a-c7GdPm$+E zVql{)bgY+Pk|a_w4Pgq&+&B>6h8y`tMj{iB zm3(((hIwq|X#>ET3t1?bpY4dH@XWf6LC#+_)_(}uuA2~Q*ETLFhBwmCB?!q%rm0Dv zTswWT-?|LlUy&R_acloCQm0%uXd`lGTxAtY+!)d1nOlp!Dt7!VVS;0A(2WZg1cTVd__b>5Zc>T zIUdVE_c7O-h)teD?&(JQXnFvBG(h3T^FsjX$mai?S_Fsnv~42jugUjbWeqeez3^10p7x zJOh+_#LqX=MS8;MqUjMV*ExVl$V6qQODT<#s}0`D9wKc%Wd*ZhiyNyDPK=23UgsWMaj$R zW-8{7WK_^9x6Mfof9hB>M-oj*q8VzAa?Fe~qiAL?wxN28ZJ_c@o;0ZmV7iDkVuz|b zGC5Mj^iw}I;+BKBd(y-nf5e)=cTt)ukg74aY}8ChvKoo_h%CU2L~*AXo|zD3MKm2U zcOM0@26Js3u8JP85!}u2-dK}!v#djxSa#VtP29ELq0*RznrVqDUY%A^;GbEfw;9YhdF|>dq$RJp2a%+vjjXOh{^}}p zqszTe6GHV%TOztB(^!UCZkg+3S)Vn+V^M5$hq+8Kvu<>cCDNSv+8JF67eL#h?8;x8 zS$DJYN9k2YW*sA(2*3qCtnJlAwmg-JDBDN@#oAhV!1DF$2BNc&` zst6;uND|iqsRLhT31jcIV@6?wZ`XiG4H=-QNZ8(QK^A!dDwPs-p~&#VI@{1}>~I|??TEmi9Tyhd;;cHyZ^R>vI~!sTYY|0Kw9M==nCzqszHF~SMfr3? zA9u*GZfsx%Z1uRVFXDIZu7GDc(+RC!i1U^pe{J>~)c0&gXxqW}Cu}0%mFh<52qr4@ zl7Anf?l$%}7rt8C1gr`%Sjra6b)Uu#Bqp<|z-7IOQvQfj{+a?nYEoUR-CD;=(`(6q zD+Q?H!}7n9f%d74Cq#s#Wc!KG`%+^B5PF;SyDtONd@}n@w-$=LwcP=v8y{*cv4OR4 zX{+DFK8c~Ek3t_(>q>To+>L(bQoQJt1X+ASw1HJ^Da(`u4Xggujn?nXv?$|K39TLOFw@-^ z1MZ(encUmjSMhkW~N{yqSzOg_;wWlV9upL59JN0W}=BnHbJ&IZlx7}0`-q4bt& z_!Oqe<~PXD+vc~LwbVX{t+T1L_Csp?8L9oJxh%;E!!NlZcOj({)5nM?{aeg{rOu&@ zp!8gRj*fpxs-F=|V6>Bxvh0-<3qqOr3^mP2H#wRg;+7@-MLmCJdn)R^oxUNc3p<8~ zv^p{KfJh?S6=)9XAZ^CwE3vtp(NG@C2aREsiP|Om);0R?`+sw9ph<7MgsrVD^t#e0 zOvb_3&>?tjan{9{fhEDXPg9xe6ioWm$lfp;vCz;0dxN!=4=-ZIDI*U_hn2|BTpJ~i z?Frn2CfNaj?KTfVOyCCz=Nx&l*Iy(BaZH6TMNcv z^OWhZ9VMBnkVZ;m_aN0Sp1DynB;jhK7BH8B%XCAMD)lrf!dj02eDT|YueparrG3&K zq?}#@W*8c^xFI<3Kp+qeyp&dl_Ta1nfwVP=L7Y(2XzQhB@YmoeS}Rhc`n1b5Jrejv zX5#JqEO&=X4MsUsvpiO~^Lt`VZPh%;DX zxJ3r3G|U;9M}j7o;UOkDrhZI4MVZYa&M__Jb8YiGGh(CAxM&?^m$?E~zGld46q*pq z44PTDIGed-`r9&m?pKXaR}HVym?HTA<3{=PoD6y{y~WDY=kr8=X*5G*cJEg=LkElk z{RJW;>nDhecSJQsmWUUU6j@#)GObN%1{1(*M5e#vBD0DkkwKYP1}qp58UK>(1|ox@ z6`2{S*@8~zOJ#~=xqu*08QGAL2S27)|JcC&=*z}euV5f;3VWU!m$~&OiTi%~!k&Ls zOS^auL^pCpu-WQHdxFuA^rk`^-?+)3?l^_3{=$a~U@yP&JndH%%+*hkzCe z#JtIqN66HoJ;C0q%qp5=EfX7;~~e^-`DkehHCVSIUaq_*VHPKQEbnG4GH@cYDJ#(ot5@vnwFWi{0}^?v36?2jP3@P4m@e169>oW zW&8W<7Jg>oR|Y~TwkZMyuEhZ5Hoq4*9PSW>u9XgDHtA+NEO)rl;YMK%Bi!MBKj5&^ z;W>v{^ocIEBz$H-*54VdnZLFE#`p>x<~zh!2Ydq^?tYt4hJqgj|BPSIYvHR`pKpPka4Fjh54A4j zO)*C!*jT?BWF;A8su~X777azIb0i_>)!Q}Di%3gLTQ?%~6p~3z%d7kH;QXtrI{nuh z&ws8{-I-73|KUHrRd34YJGV+NpK`46>py*BbZVQU!Ns?AAN%C<{~X;C$|$~)z2%-; zO6%^prG3eBSH`_@@#1s+4t(&v-_5_J)s>&@-EsT9U*6O7kv?AtJaKDQ-Pz;U>{#3T zzklEA$l#BHL(X(K^UV7fH$Jp?;QJ5n`sbBT-nzN!==%e|{k!)kJonLaKYV`8+sA&B zH=xPHsW0^U!sYM3IOpB(|Fl8>W|LNZQ;4lJ3D&sxM^+MZ+`k$Z+-PEx8`N%Bqe-l)z$A6KmLuBsr65uI{(9Z zg^#YhebmOXk{|ukA0NGc+qv>%{$<0)t@UR#_|Ky+{(9zsO&@l@e1F0d zD_Z})uvt=e%BI}^c=KBm#(cYE-sXL8K3!h;7@VzZdRW@=o@Hzx&ERlzw;cLo+@bdH2tkUud*r%J264(?2{|IJDvD zf&cx`;nC-IH-6%9yAiw6_Drto^!lJ5{%pcO9qx0_tvOq-z86?>p-;ay9pAjO{?O;v zH+}NQ=i78lnLg$0_g{W()eqZryOh)W?ELka7w*{6GY~lY!$9E8{6L@r)IX`o_U{G! z9dv*H{O5t+2EOrMKY8h`U%vC!d%ymD;I}^yq?7KYx8D1~Tfctqtq)#&)CgI{)e~p%Qyb}O_#XlALgm*GFWx_?OQ*2Eb#Nd2Z1-m_UAu;Gw}Ps9|FHq z-IS&cX+inx-g`g)@1OoA@PFES^Z2H!^bhzcvKK`WT*fV+$RdTNdjWwo zN!v&^lXOF|hBj>jX;PDxf}k>@C~o5*F1RnKsJP>}p`suv;*N?7h}($Uh$C(z4)6Cl z_nw=3vs9e-{rvuVFMNB?dCqg5vp;9OCsvQgXLGnM0efS>)9CRzsvK_i8KxS)y|L2b z4>VSIJWfAZ9X_km-srbix$N$MztQQbOQX5$Hb;#sja==hsutnL5q>Zp56*9Fj&;q7 zgc{8yf?fkUvd9|=HieqCjB1KSVsUDT1Um!qU^LMZi?;_m!?7r}s#$5D*AWjT5)NCs z=h{$HCp@d^KCxcNuY@R9DA6VbghL6G8Om=(9djyW_MvJH>4i(5s@R%v6on^3;Ow+S zB3h)We~nU>o{mt|6>APfAom*N{bMLwYdjR}3@KD=B$iN(bm~=#ALKhZ62hImlNbKD zUZB9W0Jx4Zje%kkl|@F6)9^sQq`SWp0k(6JIi<=Y!&)_f$mAqZ)?rdOkr0hp@-Yv> zcZQ=O!7szEi-$Wyf@-;WNbc=RbEF5!pa~BX3Mv-wtPDp&mV~3yD&;wBiMnuSTVQ@i z2yx>GNxujXabf8RjgBfSGa;oukd}dENIVzlI>_RO8{ucF+3oKvY-}tjK^sBUaLji5 z8_R={NUSL+tad!Y?;f4s(F27TQvI4CK=IxY}Nj`tma3|Nk+5J|Z!y9mT+@nX2qA}x4qY5UOM~zXP-4>S}PntcZ8RT#Yqi~Ffh;txg8ITyV<5`zw)ySWNo2DGEW(y&jL|rnL}TeV8ckzp z6dg+^A}OM*b|EkHvXdbtn-*q0}^nk;qnYkj^YMh$g>$JEfpVi|I_&iR{ zYH^~9SbW0naN9g}fd;SQQP})}233w~wJ^8MYVqrsycW0JiKuz)zJSB-Ps(yS+zxkD zCKthjVTCG61zHpOIxBw?~RYwemywlK9OLrK@T9RZ8q@2GNfIt3R~d=2)KYaCvtNil*`N7wPH zMX#nW#e>n2eKCX2?)TLAtRh})M^V~ptRe!c)oS;P0%xnI;w0pz@LN-1uc&d`oLce% z8b!EgNMpd~aAD|Zt??=O0K3IqRfBxD+bS&x$F7L>p&iV?0MpnO0zQk|??nlvBrlaN zLTBDekI#hyQ)|0mQ%Hit<3r7{IQ=y~4q733Jx)(mgAbX2xVQtNV(45PR*Tc<=m^+d zf&p#QZ}*{T)LNW1iZqQR8Iaiy55};_czZq9)>=`WoDRQ|Y&}uO<+6zCrTR&ZI_jH9;;k5fO_u=BQz-;w6Yg|gGY-PH?0qV_F zS>r=XMRBIo%gnAxf5L=3v{oZ(HhZnZsx>9Qk*sjqy#ZZi_1D2}bNHu2Z#itJxD8dv zBT>LcC(X0PXSWDuK~bu`T5WU`Q8Tz?RVR_FYPiA;?V1&Csuv#$3H3XZL#5B6X<)r1 zC#H*m3_f(CeRhW%)zm7KKPN!v=BY#rLZL|Iu8Q_lqEE7ew?5#j@vDkob<_0{Dn;lb zkztv#N7Ga)w-S1V-BzWPe@%r@sz{zxqq6S#)18E8?rgP&CGrzhH&xvzblGhDNQV{m zOVd@zhGc%GI=bwx3cIfs9f!=>%p6K=QY0fa?qqM77I3Cuk?wB#x|VN9pfW3i#hLKADlg=CD`5o3>l!WAlV<4kfX-rcznioZEan8WBLkliRQv3@JS=4Erp2D5#tn-=LODY~zs>-M9 z3B717m{cQOx(G><#x4xp5hn8+!+8vE483ZSB>0^Uuh&wAj$JA}V;MUw6hu%d{sxeHezy!>u7E&@*JVngV zVKCXqWbu2|k-FMpr{smwiz`GCrrqsN4!JP;g-xN0ifQPGjnh4KewC4k6hK!h$+TNs zqMZq;%KQ}yQ_gDr7G=7VR)JIK>>Hg81{>%&F*0MdY@8?fJRXtrcvs2-WV7(e4T)E{ zG3oGG8=wm@Xi0ZaXWe3aQESI^SRFY9MDB|re43k(qE4n{qU5N+iJ?Ab4k&SGdw;b< zbd}N(wGPe2f;nY24vQBl#Ka<-yArg16rs);j5S3nS|b&~^H48chDt%_>at^|hT4ds zw%6l_7*USu4uQhvL&RyrojN&Us2<5 z^6*m(OOYRbOponuW&Q@M&t8e<0XujQJnJ$|6{(Vtl{|+{iL2Z04@j9})qv$l9_dht zy%5eWtgfgj)m$7{wlJn%nOgZP8nilScP44N_K#?5bYmmZyCi4cNvfJ68_$7IFv_}& zaJHg)YgVfV6HUJ;4H;jBRN=%xRw=Ti1E#$^CCr+C$N(NA@)V^S?ZWApf#OJ)qVd?R zR?HC5<)~dA;wMGOqOmxWW3`OV`Yuz)z>5I^k1^Y&Yro^qbksVz=95B}Yd?Cj7$a6RU<$9UJ)}9NhKr=h6-hmB z1_9D%Rh7?P#rdlclu01!8CF@UlkLesPT^DwGy}7tzGxyUEZP7=_H_skRJ~kLbwpzo zL&4P6s++6AW2!4JbYZwJ7m5_Qs=87vP^&_Dp`M~viM0l`j}u;%)id3=P3P!sfSTqF zQuK~lxNR|Tr| zBCP0?3^KWgX9h189c5(LENDJYy=ceCGIV_yykm7X@YrSGmU6> zqwtawNhw8=?Y1-@HoKSCmfTh>%o;~f(sSl`ijhYKc|4TYEf`24YX0%qfY(JuyN4Uw zb-G-oU>K)UBPtOCB%e@Ns$G@H%?uPSN_Fc5HeK6;jkT|FRHpi6hh*x+lDf`CHA*E7 zK^XX8AyQZA6oSH-T+?{pe9Rr}}YP8tgu9@Y!9nOO!)Tgd&n-$0|&HKrTBc zscJqoXmw1os}5QQN_x6rp_tMoWBC^Q93oL3Oy!)qHDewsC=SjBxtYTYs;mhmT`aEZ zR;{%KSGAT^Tbz|*gr#`E5E9*aa%({>UwPajZW@O$@GMX(FSex4GqrglulFeN5lddk zKXv6@SqQ4|)T;uORmF?c+~2&*BhKLQ01k5o5xp$iQf!uz=PHU2O*KS6P5CU$*wHT zV}Oeor&JQV535`*>>Jpt#ZsH1#FJ%!(V!5h%y1xKhTR4cx~A!=!xoFqv!@0V6-}or zHWmSs-6v-{S^zj?g%UzdRhNtPX-ZXPdN&~vI?vC`0MdfwrPd6n6yAK*DI!m0C0dS% zK%p25=m-T0!D_9+X0FITWlDkCldLcb2|b($R&4eq)lZVfCO*AjldBvq50s`l^oDMf zRVRha-dw!2gn_Z<)8X@BV49NgV#XvS5~LQfq#J9gj>;8}!%zxM^du>+ zC|nVsScgE-i^!=lQERSb$?TMYswc^KJB8joTX zE||q*)?f+na+0yf?l$wA3O@s5_N6!RE`~1S{zR3 zFyx+kd;lh$bf_x~gSp2vXf0M_DqRtaiEMJp#IDJ4wPX;3Y|WBsi;Vp-1Ddn124n9` zn>T50ss}8(VG@(FZ=f4r!=IidgNs&MQpXw6tHz)Y(%B%!I>uSC^r1PbnWN3W(-=h6 zNOMl5{o*9Rs*qTY6FjOp9sT6T!7sX(~Oj&rdGV#Qcegio006m5p63I{n;JC5gQh zw>~!%jjz#l(y-ux35iqN;!#CNvYyk|psU;Zii4A7ygR~cn5y>C#WB@Ml_|@GKhw*qV1UB|3Y^@>VRP0+Vi>^ZE3x;$ zOAz|>C#k}-Vl}Q~*)XxvwFY5hX5|D#>Tw`t;L9TruFAU2D5C?as2}rN)IK4K4|R)5 zEbD)gTXRZ<(cS4OlbG_pJUZZ6*S< z7yD@#0oB@-r7{#so!lVR0@Kk%XuOk-1Z(c9U2)Uxc382-tp7%X?Q#l|Ji)EC%VcXx zI&y>7X35;4a=2(pn%2DlO)`3tqPWXGRU9qiYLr}U%EF+MQ%1^aBSIIi zbC*VpFXWC*K(3at2hdd(9>R<1dRlgiEpVe-svlHrR>VDdO<_ruAeWbV5|PT2Dnt7y zqbDJ0Oi3wx+DEmiBW7h+Q=OiQm1<;~>ZZ1r%#LDfp$Dhb^A}06nLUZdm%+*Ki3Wry zr(|Kk)*L>4NY*)(pd=69a0vC6be0t9E)EnK)s=Fb1?@$|MR(4~=wR4kF*-@%tUxmy zxnpLXlgjNvbybd7__ZO2F5a1(6`%ZJK$4MdsVmgUj|Y@>7e1V4IMAVxeN`25305O0 zL12cco(Q#i9AZcoj3o3=+_JR_oM7UA2l04gXrfGUqLX>xTmg@?ZbPbnDjZFr^w z1j<+A!e6z+<+f|x9lma0tLmbkZ^MPH!UbKNorf~1;o-o9-H$<`_VJF;h>B|T_zG=q zj~j)?+dM+dAF=NPQ^B8;sqCs)dk)wTtZ1)X%4)YGy=wFnks3W+ibBCwf6AVol{dxo z&4%qMqglbD8_o(l(t$lId@*O(BFx~Vg{=C>B;4r4J}U5~Oj1)QHifPp>J#777${hY zQYw!;_@|D1P%rDXI+n>zFGc!6R?FI+>IF`EAHtmdER6A(jE-3-EbdjcV>2qNa1e|h ztSK3Gi^b>%ox8e$n?6QTDLN6#kxDnd=wkgVmT`1nB?x|Ou^HTzuoaKIM51}rJBSID zl&E(|3p>R-#u*kjG(A2AQM?I)l}}hBWqJqb9j&jZfGSfIKn1o+#AjD9ROl9>^`jX! zr|MOvae%yZT%au|D=o`NQ(6_%%o?BYSz~ixdD4$BM$?qOC4-yr<8Q!sjN(jVhG8bp z{zWcWd=(BTE?+}Zi5k|wGgMyqT18e7WEE_N9_|q96PMhuVP8NVB^C-e7sk)s0Pf&e0VhnV|6#67i-9-N8irgmAPe($yTApnm&3 zzKvY5xuHPJqB470S`wj7eA>>JdMMAXsoCCh;SdAD0Iph~@v0qHHqdNB=x;pq$ zjZm{`RxB0?1@UD+?&&fGJ53ZI%Xa((-|oJB$}O7~i%bUED#psUsBc7*6@7NT{XLgsVyTYJ)^~C?tr@VcccF zmr^h_G_Ny`x<>v`qy_fQP&~no(N+^~BMdqt9@do1wj$#H!4i%9L zCqyCwi3aTtmUOGzH?}_I3n@sPQ!rO7=Tinyf+8r9?Ow z^~R8G#JP^3`3|DtR1xG#))j5m2dgHd1(zAgz;%(rT|ALU26`5DAw2_oB!)_@RuSBm zgUfNG(l8VsF6|JBN+^kvg{Y5DS6m--B%J6RpTLzA8#5FiM58COd-BH zV?-wPg=?AGCX64?|C>V{i3v@K*4c@?rj8E91hqD+D~#)3EZgz3nZ2OFEI+~U)PP-6 zaaqc&u23{a!3b_DYM#$Iizp9AdlYS*bpY$LAP@yw0oDV0{ltxzbsxL&!#biTf85Yh z{rLHAt~Rb|-DsM)93%!~!EmY!qP;bnI%B35lq%O~j$Sa@$~7&RXl`K$15HlMh3{~4 zXWNM*XoRUP6mD(ngwbRgVVc(-i6%}Q(bn17F>%6#?(XjK-G$?0@zx0i`T6-1;Bka$ z3QgwQNKEt0!ux#XMe_<2E58z*^U?TEG>yOoBC$E4iSgE1qYH|Q$K{X9A2Ugz<%tMP zG>)QGN*D1 z;vfVde%XS~CLmwSc$y1kP6MgML=z@32I?DM2j3yaYDqQ@eN`73n66h9b;b%pIoAuV ztDFrN>r_0Vvy;8vLSCFuBMeV)^{=DKLN0uYK+_#g4{rCt_<%6#w(uVZ@s}+Qa$z3J zfAL)!;q0P^ybh~}D(x=t;v~NZ^^of_Kl(e0mg62HhW?Hs$+tN`^f36>0FsYskHG#9 zfa^Wq)wC5f_AjrnQSVy{|IvL*e0P?q214-gy*j6=W>t>7JIh^y5esy(*$n+CFCW8l zkN!d}e?g;i{}apX)XDsVJGK6lY`%PNVXcU+xF?M5wXk#C`98775N=0Tq766iG|l1k zT&2+Xo-te<$2aSVN75eyo!z7h+h2r?R*b^((7cwSni($#%vRaN%}~3MHT-b) z>}ze?=ODC58S1_$l7n%LAwRDpx4DR3uUF#0_5jRWBK-EEh%U!3SBoNI0v8R4;@u28 z7ZH2nB3cK=C4;$$REprtUPSwxkgNr@&l0q($lyb&o?>y|qodi`ZZ6>q?=(L}#)~N7 zQrH@4FT@zu;S3kqo1Lsq&gcq8!Y$!Y+@8;#k!ro>k=FsjAqzbVd2S3hWAfyH_`W){ z_SPtRd13B~>TQWOOe9F7DOMf@Y9zKqFj`1bgsmkK3wDxn%OyJQ=7|%PTfY>u{vNQ& znkWu`io(#X=k79>7_5Z_sx>*yoH!BlOw!xiL+!En{KmQAQ1@g-a5h(6dZ%O+krK(Q zvN*r?L5j%8?0m@7?2cMgdgS6#*asOsvmu1C#-5_`M+|T`m;8~0o;e_*u;7nG^voeD zWA@BYYUvcQfH7`n$^wSjtgA_mW;8;<7wDO6x!h@-6R~FDUue_RNQS7SVNIL$n)w{BV~iFGEy&Q?v2@ zLR%P$)p${-4cTEFyfKAE3)$XAmb_206X~*%H7T+|(PXdQXW89pqPtTigCO&x_vs?a z`;Z@PX>w6W#u$SDx$*8GS+=ap$$e!=F9_cc=mVge#ufR5i_M9D34{&?4h4<^jsZpj zV}KKY2|zJ02{;k30#$$m;OT%L;4wrH2m!4C4_kTJ?hN1@U@@>1xEQz+z`#IUMS2_F zcLMhUJVkf}cm{YDcpi8Gcnjbf@_!ZI`3NgD&VK_fQ@rm2T_5)+VNZ?!8=&#C0~z!v z-jA^v8L$&}wYHaqV+nCNubmn3@KvUdsez7FP_ef{H`jkWD zDQ5@#a=EB}%at(>N+Y{BlJVRCzpo3S(}27Xf>amkg|HY1c7xJkNujpC0lv_DA_C!}}1j-h?b}w=z7Y zZGru5Kxlqlcvv zP4os}6VJ33MF)Hg+b4it2Yd=UlAopnJ_GG@fWvXZzy3;OLpY)j1|yzT;9H0HKY=d* zeR?*+F4MCU<}ZP-0NLI-oHg*TPYMmZ{hYY;5$I- zGg1HHU!N9z7@QQ8`?~#r-asFqFVGJ_HQ-y-*9`>Ff2><=6O3k&S(deDau&_w^-Lpk_m`96L7^&g=68<;z2 z{{sdec+il8hYmaB(8CV@%MnK&b@VZ&;UkV!82-rp&jtVgIXBYNyWf6&k(Y!r5aSOX zOUyw)ul}}o@3Lq1?hQw=ydCc3?ivfLXuH5p6vBa{aOL`v9GX@!m=;}yR`T(WectH2 zk?L-EYV4v8-{8G_r;IuXJ`OqvC9e#J@IommLkxanOf+~P-1i&U4=Qm$E{bkIU;N3X zzU+s6S{{5WCwDk#$^(Jyfg{oj9zYzx1D0H}d<{PQ1f1n(yoaIuQRMt*fcVR1xZS=5 zJO@A~-osEos5k$i0jMT;@E2|$F%NzQ`D?t7M%^J2e+HlmVD)Lxzy$*0*zV z50Ey&Fn}y?ftZ6BeT4Tg&M}c~N^C{i;dbdeN^Do)Jt}i-DenZ6$&_E8KaWO7yCRV> zWO*IjMfv7}!lL4m(z0?(g%zKGd@^&dPC(H8wgpxfm5%;B4j!5 zy`0<@r?rvq(-sfR;$~>Jz%1_Tz+pc&i;GrNIu5Aubp?VhKk8;4+;79*MEeP+d8@Rj z@F%VH_~p(Ia&q_P^g@9f|KTU7&(k4FyBf?|dNEhuIg(1HXlC`L@&zPQeD)8Kl=6`ZR# zS7NTh+^)F7LJNyxhZZJiVKFOV4FD}n(82^QOwht&rUET2W-BJVhXW&kV}avq#rp(c9FPZ$2POddfEg$N3V|Y^7$^Zsfij>Rm&8kuOyCsYRA44> z8qf%w4*Xw*zW`w^1kM7^2F^hR`0oF&0EC|`Bm6v>GCj884P`==Kow98IDnIY=>RJy z7vKgwfEPF!@Bw}x0Mr1rKpjvIGypSzY!%@DD*Ox;VAs#k;a2?A*e^M`>++NRKyX%5 zbErk>4d&IKkk{c2JECqH*&$jdw}S|pf|Ch&Mmi>rbWI%TH;wEVSq&r8_~Dk!8OW`V z&Fmn}oLNk32e>7(nOmPUbE{z*XI`FaW?pG#UUuigkuqI6Gs`yt%p)SHnp5MGOf!wd zxO?RId>(x(&tx=}?_vBm@B^?L_!0OC_!;;G_!amMz+>HN@J9eSKPYW%#0GgN+Sn40 zwKsNkwv;)X?S%!}s?jCf6!G)|9)OwOYt^?ZqqGUX>C`m0(_sr^`?ImJeO96qzvBN&}_4x1m2GpF-6;E&SD{2W*2 z-=p#~tqm%LX}_zqKgz34@ayxcq_HuIy_;BfV`nTSt5`hkyn^Vzc<%)`j{Iy^!{o^? z({k|c1#p+fbIfnx&W}ESd!M7&)eI@a*{4LXHI$I^H_pdF;F0-QC>eCCJT|yZ_Asr#7SFQIaC@k+qpQ;)X5Hm6 zWzLV8Tq90e#l>$Bu7 z5}z@CS*G{NdG)SE71UMKN3Je1d0eD@9`45HpFyL_DFTfGNk-$*^ z*OB`3Ip)gfN4CM6LF2TnVmIXRNW4<@hSWKJxbee0te>R*O4VhO=g;b^AUv7?mOo2p zX89)IkK!hISda2!0a#D+;{~LdJ2(!DM>bumnMXCOhxy?SF$8cNn4XD;Ww8u)=h0Lf zzz>JXI+*D^n&MFuKayXD!Es=@90v}IA4y|Bl8@yvACJ)Zod7xkez-i?FNeo8Hn#&D zZ#Hur_~Fi*c(=i@#ymvY=(SfyUYU_FMVFIyG%dl2|v;< z^H84`?5|d4v*RdcV^PS_$dBSl?bqj#T{x~1FJW}23R5zxx z|7?6LhwBZ?;ylSDi|eASOR3>-{5j5Cu2M!O9+^h4i87GsV!J*qY}dzKy307ST^}E| z>*K(7+1Ch#inBecj#k&X|D29~^L(YRe*kY)F8}186y3?XX210#TAf#ZOY!0`a#LaKV}Svun32)Xc6Z6|f%XC+VSip(cVS8G?I6UUP~Iz#QVLUHoo zXBzqK#*uhIu;GW7Ld$m5>t zO>#iO<s~;9aQ3bLdhLO+!3SRcYz*{NDyJ9M5LR%oxvPmecj%;jv|r z8qZ?9OVoI-%@EJt7b$T!#`AwyG91rAkeL=wAu^etHt=vfOVxOm;a#rAvssOkzT8)5 zjpzSXnK_HrQiAO85+*L-MF^MU=Gr-oS%SsZ2q z-ZOwxfK!2)z-d4ua5@kKILwuQK1?m0yVWpfK^BMEgm*I#0$PAppbZEEvjGlo=%pN6 zV;bvKnp%#f(XRIYSxa#k9jZJ8Nf#Prmt*QHrHcl}b?9>N$U0P{F&OL74)AaroCBep z)(GD1Kop1p9l#kt97q5h5AmD5cp1v`G7#{jruBc(bR5R1syqbQLt2xKbPf199i8yN z>FC0HF3=6k1Lgx~0tktAT5P6#$3(vkW&F zNrVXBsD)%!CB@3rO#Zu4KG(u8%e)Tn>wz198-bgEn}J&Z&Z|?w&yT)5vaaVP(%19Y z?*ou=E9Bhk}2T8{*Q_^`4WOA6R@xB+h54azA z0C*612;eYn;OA#w(%Fy6dxoD)@c%Nv;cUkH72s8X>*;d1bNi6(xG5HiVBuFTQ__oY ze+|5^1ML3|yx#=g0@(kSEdDtL?7rLRE*FLy8^i4#a+1jF%3C1sZQvb%^KUe0GXKyo zC2)v5)QlgO?uueP+4B0TUb!#k;43q8egS@ryePjoza+mjzbwDpoNqRp3(SS)B6G31 z#9V4FGnW_S7nlnQ3JME~3W^I#3Q7yg3d->d=H|kJ!otF$!s5b`!qURB!t$d0B6Cqe zQDIS0QE^d8QE5?GQF(EGvAMXQxUjgWxVX5axU{&exV$94#9UHPQdm+{Qe09}Qd&}0 zQeK*0YA!7(Ei5f6EiNr7EiEl8EicP2GnW;V6_yp16_=Him6ny2m6s!mNa?`UwU%; zJ@jbsd72nKj^1?PcMkjRpaEZvrz4lWL0=#BUmEk^k+gHlo%Cbzxnz5CJYE0gd9>#E z4zirxNbmf;ocxQ+>H6K}baCT(H2T-4=$B(A(e}Mp)8K3R&_NTvqk%InruJjn>9w;< zXu!*(sM7N&-Pkgf^1f=MCq{MA=U=}-CocG&elG7v%X}BnZ*#t)V;*dz{xdJ7{QYWa z!JbOmbOBc`GKzAH@71{3JMu*qELAOuoLw)+~ zrNXnP(sKnn=^D>=dh)CSI{w7=%!yzqvB&G(mDU$MBiU<6fL}bIL$t8A-x^_ z59Q}|)38ZadSvKET7UQrbnk}eXq?M}vmG;O$yt^3=^1%+-NtLFa29&yHy6^HJFlkF znz!lQDL>I|2OdVQxqGPjhOyM~?mg7B@E1DsfjT;L*cY_UQA?BFd5`WquZ)g6_GNnK zqHdZII2Ox?kJI-9kD$X}{fKTd@1>TbXVZ$hAg%tbiq1Y~D~$*}N(DQY(m$U$oxa=f z3Pnl=(9Ee@=#cI2QvIauwEene^yY}sGKD_cd0~?BJ_3aP&%g zYsDJsd&j@&)b4ZWw&xa8aPoz8QDPq5f5{Arz55j9-O)t5pLv-s{p)vh{Iji8v&l}I z-YcQetKOvNf|t^em%6F<@k41y<#n{7VFSJRyp3EBVK{c^546R4FO6}0PQSl>Acib^ z=;-B}spHju(ZN%Gq;I}oL=S(lo?iH6G+ohWIX!#E6dFI^Vam1tKo<_Vp6)R%pz)8~ zL{-b4qXh*MXi!Z%#qYeF=6rDsnP0w&<{xqrS>}I2yFXe=JE0;z`R94G!hAJd`0X5O zY%HNCe?Ne#uU$i}DpX4l{T-V_N@m}L3IJ0;_M>#8C%F6h*Iu=XKCz@VH(=B9Gx(zv*ndarz% zy8A7sAM!h}`G>L|lolg>=C3ztG7O@1~<}dyek^ z_C7lG_#xE(oQv|#yq?z8UQPQ=T}%UZ{X{2ByM)@!E2w-;KN@5jMqAgPLO(9sKpXF! zPVP;&)19TS&_C}gp?j7sr)?E&ba>NtntRE2)ON9t_IyxE_uX<2eKgFBq4+H{=(qQ& z+0{bd_IZ@Xgz~Ab_8F?$JCSDp`Z#qx{R54@;v>3eQ9iX?@)Pxbc^Lg?L|=OEv!m$5 zhgVYF5r3nSR|b%~;!8UC>6KJ?>?5@6?!S;Hw2Iz*_IAphI+#wG_X-{R>s(rJac^3B zXq-0Q;ip*i6Z-CJ%zRF&rw#8vN_V$BL33Ywjo#>W6g~KT9$m8HSz3Q@H!Z1tpMIWs zGi_Y7n^y0dK-<2#mZqM%mR{f9PM5!M42}KZA9UMD?3vzwE#2$Cg8ot0o5tj=q3Mgx zruX~ZNptT$fEF~|LWc|)OCLU(NB{Z!cUte-mRwmj}D<1@~qe|D5jS>UZwn( zAERd?ztc*(mHI?JqZ!+7rs1(FnlP$s3Yj0Ikh`zg)fJ^HKla)+mBM=_Z#To zXd}(c|BTKbe-|C~(0aP1poIEAx{|(n5IXAT;q7GNMqD{B{mHN* zG&HxFuCiQ87d*Y4-v50p%^CR*TClW;`uy-;dieXGsk?p)g+G0scD;WvJuz`IRUTGJHC>JL=2JgXblFB)J$@z~VEdMioKiu-4HwXu z-@l|U-uZz>EZjt~zZX;g9naI=cQ2*r>`&-{-#5|~{hy_UGdpR{y${hV(Hm$=d;x7d zXg2-)+Fdjz@ew`p(i8al=4AThq5Y}ziR0+=vrebZtryY$!^Y8H4;w^hw=AceF^AAi zXU?VHe}9^4?cdRR=)1pp?_j$4iN|Tf)qBXiY7~7RT~EuOFQKigYH7`?N9eW92hfnE zc@(QFqH(oLX~nCb(mSTdY0hbP)0DB-(?N}!>G#}|=;PhL(Pfj`>60bn=*unV(VjJT z(RcrPgT@!XL=(z`R5sj3N4)nU{dLbk`t79IG~vjt|hxmR35ff1W&Y|V$XZsR+Y zd-zrKmyX9Md}T8oKjUiZX+bI@Sg{m4PI=j9)%Xl)+wFWNbCGi^KVbZWiqI$Bov z9ldnuV-&2vjy|qiOD8YhNL!~INZZb+ro1D!(fx(>?Z-y1%n)3!9yg4UJv z#OgDt=BHcfgbR-)%M&%!5baOH$1b7rs>QVQ(|^+EH*O)vZ_{XR?U!`q;7#;=!$q|G zKPS*z&puCspMQ-$m~kIfJ->v`x6Y#BOD55{`OE3R-~}|+xqudp`wLm08A2Bxe>u&Y zyp&dL_>4aPU;%BI_#7R-`z!jn6?I_QGZeb*1Um7G2kEJWxwP`+4{6l4CJKMNjjmmO zIIS9UCAGaeng)EkhHN*P$bHQw>NvNF&R%#d4Su|U?)>pG8e01W4gbDBJ%TY!>}(g^ ze)!4s$glU%xgWhlS8WT@Atk*K=1sKt)>|n4Z9A1;dM2Iw*j+TI;8dy{g+qNs-{Py8 zZrZcEhH@HQwBw9LWchSsuiO)-{Wkp9sXPqMv*D{=jG?co{ADuUr=Pre-Xyj!K4Mon z-qTDY&n#p6h;u(J!JCfyAzVzBJ6`CeTwn8!Fg!z+e@V)XFZRmaZ`V{D4POmYP6B7F z@g5Rq&v?*L(!4wHr#DVm!=X1H&nC+QFM+oYS=RFVeX?x9`+zgR_5pC=-6}sjVu1b| z-hBot9@lN^l{-LwMFRm_VCO);!FwPJ-~cbb52v_ah67F(UxBwg6TTJZzNfGCQs9pN E2Zatw9RL6T literal 0 HcmV?d00001 diff --git a/examples/jsm/node-editor/NodeEditor.js b/examples/jsm/node-editor/NodeEditor.js index 1fd37ede97e0d8..7476504f9384c2 100644 --- a/examples/jsm/node-editor/NodeEditor.js +++ b/examples/jsm/node-editor/NodeEditor.js @@ -33,7 +33,6 @@ import { PointsEditor } from './scene/PointsEditor.js'; import { MeshEditor } from './scene/MeshEditor.js'; import { FileEditor } from './core/FileEditor.js'; import { FileURLEditor } from './core/FileURLEditor.js'; -import { exportJSON } from './NodeEditorUtils.js'; import { EventDispatcher } from 'three'; Styles.icons.unlink = 'ti ti-unlink'; @@ -541,7 +540,14 @@ export class NodeEditor extends EventDispatcher { saveButton.onClick( () => { - exportJSON( this.canvas.toJSON(), 'node_editor' ); + const json = JSON.stringify( this.canvas.toJSON() ); + + const a = document.createElement( 'a' ); + const file = new Blob( [ json ], { type: 'text/plain' } ); + + a.href = URL.createObjectURL( file ); + a.download = 'node_editor.json'; + a.click(); } ); @@ -857,14 +863,10 @@ export class NodeEditor extends EventDispatcher { } else if ( key === 'Enter' ) { - if ( nodeButtonsVisible[ nodeButtonsIndex ] !== undefined ) { - - nodeButtonsVisible[ nodeButtonsIndex ].dom.click(); + nodeButtonsVisible[ nodeButtonsIndex ].dom.click(); - e.preventDefault(); - e.stopImmediatePropagation(); - - } + e.preventDefault(); + e.stopImmediatePropagation(); } @@ -909,11 +911,7 @@ export class NodeEditor extends EventDispatcher { } - if ( nodeButtonsVisible[ nodeButtonsIndex ] !== undefined ) { - - nodeButtonsVisible[ nodeButtonsIndex ].setSelected( true ); - - } + nodeButtonsVisible[ nodeButtonsIndex ].setSelected( true ); } ); diff --git a/examples/jsm/node-editor/NodeEditorUtils.js b/examples/jsm/node-editor/NodeEditorUtils.js deleted file mode 100644 index 796527af4fbdbf..00000000000000 --- a/examples/jsm/node-editor/NodeEditorUtils.js +++ /dev/null @@ -1,12 +0,0 @@ -export const exportJSON = ( object, name ) => { - - const json = JSON.stringify( object ); - - const a = document.createElement( 'a' ); - const file = new Blob( [ json ], { type: 'text/plain' } ); - - a.href = URL.createObjectURL( file ); - a.download = name + '.json'; - a.click(); - -}; diff --git a/examples/jsm/node-editor/core/BaseNode.js b/examples/jsm/node-editor/core/BaseNode.js index 08472d5b5445eb..79d9beb7c25917 100644 --- a/examples/jsm/node-editor/core/BaseNode.js +++ b/examples/jsm/node-editor/core/BaseNode.js @@ -1,5 +1,4 @@ import { Node, ButtonInput, TitleElement, ContextMenu } from '../../libs/flow.module.js'; -import { exportJSON } from '../NodeEditorUtils.js'; export const onNodeValidElement = ( inputElement, outputElement ) => { @@ -32,43 +31,24 @@ export class BaseNode extends Node { .setSerializable( false ) .setOutput( outputLength ); - const contextButton = new ButtonInput().onClick( () => { + const closeButton = new ButtonInput().onClick( () => { context.open(); } ).setIcon( 'ti ti-dots' ); - const onAddButtons = () => { - - context.removeEventListener( 'show', onAddButtons ); - - if ( this.value && typeof this.value.toJSON === 'function' ) { - - this.context.add( new ButtonInput( 'Export' ).setIcon( 'ti ti-download' ).onClick( () => { - - exportJSON( this.value.toJSON(), this.constructor.name ); - - } ) ); - - } - - context.add( new ButtonInput( 'Remove' ).setIcon( 'ti ti-trash' ).onClick( () => { - - this.dispose(); - - } ) ); + const context = new ContextMenu( this.dom ); + context.add( new ButtonInput( 'Remove' ).setIcon( 'ti ti-trash' ).onClick( () => { - }; + this.dispose(); - const context = new ContextMenu( this.dom ); - context.addEventListener( 'show', onAddButtons ); + } ) ); this.title = title; - - this.contextButton = contextButton; + this.closeButton = closeButton; this.context = context; - title.addButton( contextButton ); + title.addButton( closeButton ); this.add( title ); diff --git a/examples/jsm/node-editor/materials/BasicMaterialEditor.js b/examples/jsm/node-editor/materials/BasicMaterialEditor.js index 38e9a4fdffe909..1bd6ef8f8b5b7e 100644 --- a/examples/jsm/node-editor/materials/BasicMaterialEditor.js +++ b/examples/jsm/node-editor/materials/BasicMaterialEditor.js @@ -1,14 +1,16 @@ import { ColorInput, SliderInput, LabelElement } from '../../libs/flow.module.js'; -import { MaterialEditor } from './MaterialEditor.js'; +import { BaseNode } from '../core/BaseNode.js'; import { MeshBasicNodeMaterial } from 'three/nodes'; -export class BasicMaterialEditor extends MaterialEditor { +export class BasicMaterialEditor extends BaseNode { constructor() { const material = new MeshBasicNodeMaterial(); - super( 'Basic Material', material ); + super( 'Basic Material', 1, material ); + + this.setWidth( 300 ); const color = new LabelElement( 'color' ).setInput( 3 ); const opacity = new LabelElement( 'opacity' ).setInput( 1 ); @@ -40,6 +42,8 @@ export class BasicMaterialEditor extends MaterialEditor { this.opacity = opacity; this.position = position; + this.material = material; + this.update(); } diff --git a/examples/jsm/node-editor/materials/MaterialEditor.js b/examples/jsm/node-editor/materials/MaterialEditor.js deleted file mode 100644 index 87debd7c2637c3..00000000000000 --- a/examples/jsm/node-editor/materials/MaterialEditor.js +++ /dev/null @@ -1,17 +0,0 @@ -import { BaseNode } from '../core/BaseNode.js'; - -export class MaterialEditor extends BaseNode { - - constructor( name, material, width = 300 ) { - - super( name, 1, material, width ); - - } - - get material() { - - return this.value; - - } - -} diff --git a/examples/jsm/node-editor/materials/PointsMaterialEditor.js b/examples/jsm/node-editor/materials/PointsMaterialEditor.js index 9b47747e1e4c9b..eab50af4f3e4ee 100644 --- a/examples/jsm/node-editor/materials/PointsMaterialEditor.js +++ b/examples/jsm/node-editor/materials/PointsMaterialEditor.js @@ -1,15 +1,17 @@ import { ColorInput, ToggleInput, SliderInput, LabelElement } from '../../libs/flow.module.js'; -import { MaterialEditor } from './MaterialEditor.js'; +import { BaseNode } from '../core/BaseNode.js'; import { PointsNodeMaterial } from 'three/nodes'; import * as THREE from 'three'; -export class PointsMaterialEditor extends MaterialEditor { +export class PointsMaterialEditor extends BaseNode { constructor() { const material = new PointsNodeMaterial(); - super( 'Points Material', material ); + super( 'Points Material', 1, material ); + + this.setWidth( 300 ); const color = new LabelElement( 'color' ).setInput( 3 ); const opacity = new LabelElement( 'opacity' ).setInput( 1 ); @@ -55,6 +57,8 @@ export class PointsMaterialEditor extends MaterialEditor { this.position = position; this.sizeAttenuation = sizeAttenuation; + this.material = material; + this.update(); } diff --git a/examples/jsm/node-editor/materials/StandardMaterialEditor.js b/examples/jsm/node-editor/materials/StandardMaterialEditor.js index b80c91d54c8bbc..2f05c1ab4ff68a 100644 --- a/examples/jsm/node-editor/materials/StandardMaterialEditor.js +++ b/examples/jsm/node-editor/materials/StandardMaterialEditor.js @@ -1,14 +1,16 @@ import { ColorInput, SliderInput, LabelElement } from '../../libs/flow.module.js'; -import { MaterialEditor } from './MaterialEditor.js'; +import { BaseNode } from '../core/BaseNode.js'; import { MeshStandardNodeMaterial } from 'three/nodes'; -export class StandardMaterialEditor extends MaterialEditor { +export class StandardMaterialEditor extends BaseNode { constructor() { const material = new MeshStandardNodeMaterial(); - super( 'Standard Material', material ); + super( 'Standard Material', 1, material ); + + this.setWidth( 300 ); const color = new LabelElement( 'color' ).setInput( 3 ); const opacity = new LabelElement( 'opacity' ).setInput( 1 ); @@ -68,6 +70,8 @@ export class StandardMaterialEditor extends MaterialEditor { this.normal = normal; this.position = position; + this.material = material; + this.update(); } diff --git a/examples/jsm/nodes/Nodes.js b/examples/jsm/nodes/Nodes.js index feb34faab9e251..9ff8db15d6591d 100644 --- a/examples/jsm/nodes/Nodes.js +++ b/examples/jsm/nodes/Nodes.js @@ -1,156 +1,391 @@ -// @TODO: We can simplify "export { default as SomeNode, other, exports } from '...'" to just "export * from '...'" if we will use only named exports -// this will also solve issues like "import TempNode from '../core/Node.js'" - -// constants -export * from './core/constants.js'; - // core -export { default as ArrayUniformNode /* @TODO: arrayUniform */ } from './core/ArrayUniformNode.js'; -export { default as AttributeNode, attribute } from './core/AttributeNode.js'; -export { default as BypassNode, bypass } from './core/BypassNode.js'; -export { default as CacheNode, cache } from './core/CacheNode.js'; -export { default as CodeNode, code } from './core/CodeNode.js'; -export { default as ConstNode } from './core/ConstNode.js'; -export { default as ContextNode, context } from './core/ContextNode.js'; -export { default as ExpressionNode, expression } from './core/ExpressionNode.js'; -export { default as FunctionCallNode, call } from './core/FunctionCallNode.js'; -export { default as FunctionNode, func, fn } from './core/FunctionNode.js'; -export { default as InstanceIndexNode, instanceIndex } from './core/InstanceIndexNode.js'; -export { default as LightingModel, lightingModel } from './core/LightingModel.js'; -export { default as Node, addNodeClass, createNodeFromType } from './core/Node.js'; -export { default as NodeAttribute } from './core/NodeAttribute.js'; -export { default as NodeBuilder } from './core/NodeBuilder.js'; -export { default as NodeCache } from './core/NodeCache.js'; -export { default as NodeCode } from './core/NodeCode.js'; -export { default as NodeFrame } from './core/NodeFrame.js'; -export { default as NodeFunctionInput } from './core/NodeFunctionInput.js'; -export { default as NodeKeywords } from './core/NodeKeywords.js'; -export { default as NodeUniform } from './core/NodeUniform.js'; -export { default as NodeVar } from './core/NodeVar.js'; -export { default as NodeVarying } from './core/NodeVarying.js'; -export { default as PropertyNode, property, diffuseColor, roughness, metalness, specularColor, shininess } from './core/PropertyNode.js'; -export { default as StackNode, stack } from './core/StackNode.js'; -export { default as TempNode } from './core/TempNode.js'; -export { default as UniformNode, uniform } from './core/UniformNode.js'; -export { default as VarNode, label, temp } from './core/VarNode.js'; -export { default as VaryingNode, varying } from './core/VaryingNode.js'; - -// math -export { default as MathNode, EPSILON, INFINITY, radians, degrees, exp, exp2, log, log2, sqrt, inversesqrt, floor, ceil, normalize, fract, sin, cos, tan, asin, acos, atan, abs, sign, length, negate, invert, dFdx, dFdy, round, reciprocal, atan2, min, max, mod, step, reflect, distance, difference, dot, cross, pow, pow2, pow3, pow4, transformDirection, mix, clamp, refract, smoothstep, faceforward } from './math/MathNode.js'; -export { default as OperatorNode, add, sub, mul, div, remainder, equal, assign, lessThan, greaterThan, lessThanEqual, greaterThanEqual, and, or, xor, bitAnd, bitOr, bitXor, shiftLeft, shiftRight } from './math/OperatorNode.js'; -export { default as CondNode, cond } from './math/CondNode.js'; - -// utils -export { default as ArrayElementNode } from './utils/ArrayElementNode.js'; -export { default as ConvertNode } from './utils/ConvertNode.js'; -export { default as DiscardNode, discard } from './utils/DiscardNode.js'; -export { default as EquirectUVNode, equirectUV } from './utils/EquirectUVNode.js'; -export { default as JoinNode } from './utils/JoinNode.js'; -export { default as MatcapUVNode, matcapUV } from './utils/MatcapUVNode.js'; -export { default as MaxMipLevelNode, maxMipLevel } from './utils/MaxMipLevelNode.js'; -export { default as OscNode, oscSine, oscSquare, oscTriangle, oscSawtooth } from './utils/OscNode.js'; -export { default as PackingNode, directionToColor, colorToDirection } from './utils/PackingNode.js'; -export { default as RemapNode, remap, remapClamp } from './utils/RemapNode.js'; -export { default as RotateUVNode, rotateUV } from './utils/RotateUVNode.js'; -export { default as SpecularMIPLevelNode, specularMIPLevel } from './utils/SpecularMIPLevelNode.js'; -export { default as SplitNode } from './utils/SplitNode.js'; -export { default as SpriteSheetUVNode, spritesheetUV } from './utils/SpriteSheetUVNode.js'; -export { default as TimerNode, timerLocal, timerGlobal, timerDelta, frameId } from './utils/TimerNode.js'; -export { default as TriplanarTexturesNode, triplanarTextures, triplanarTexture } from './utils/TriplanarTexturesNode.js'; - -// shadernode -export * from './shadernode/ShaderNode.js'; +import ArrayUniformNode from './core/ArrayUniformNode.js'; +import AttributeNode from './core/AttributeNode.js'; +import BypassNode from './core/BypassNode.js'; +import CacheNode from './core/CacheNode.js'; +import CodeNode from './core/CodeNode.js'; +import ConstNode from './core/ConstNode.js'; +import ContextNode from './core/ContextNode.js'; +import ExpressionNode from './core/ExpressionNode.js'; +import FunctionCallNode from './core/FunctionCallNode.js'; +import FunctionNode from './core/FunctionNode.js'; +import InstanceIndexNode from './core/InstanceIndexNode.js'; +import LightingModel from './core/LightingModel.js'; +import Node from './core/Node.js'; +import NodeAttribute from './core/NodeAttribute.js'; +import NodeBuilder from './core/NodeBuilder.js'; +import NodeCache from './core/NodeCache.js'; +import NodeCode from './core/NodeCode.js'; +import NodeFrame from './core/NodeFrame.js'; +import NodeFunctionInput from './core/NodeFunctionInput.js'; +import NodeKeywords from './core/NodeKeywords.js'; +import NodeUniform from './core/NodeUniform.js'; +import NodeVar from './core/NodeVar.js'; +import NodeVarying from './core/NodeVarying.js'; +import PropertyNode from './core/PropertyNode.js'; +import StackNode from './core/StackNode.js'; +import TempNode from './core/TempNode.js'; +import UniformNode from './core/UniformNode.js'; +import VarNode from './core/VarNode.js'; +import VaryingNode from './core/VaryingNode.js'; // accessors -export { default as BitangentNode, bitangentGeometry, bitangentLocal, bitangentView, bitangentWorld, transformedBitangentView, transformedBitangentWorld } from './accessors/BitangentNode.js'; -export { default as BufferNode, buffer } from './accessors/BufferNode.js'; -export { default as CameraNode, cameraProjectionMatrix, cameraViewMatrix, cameraNormalMatrix, cameraWorldMatrix, cameraPosition } from './accessors/CameraNode.js'; -export { default as CubeTextureNode, cubeTexture } from './accessors/CubeTextureNode.js'; -export { default as ExtendedMaterialNode, materialNormal } from './accessors/ExtendedMaterialNode.js'; -export { default as InstanceNode, instance } from './accessors/InstanceNode.js'; -export { default as MaterialNode, materialUV, materialAlphaTest, materialColor, materialShininess, materialEmissive, materialOpacity, materialSpecularColor, materialReflectivity, materialRoughness, materialMetalness, materialRotation } from './accessors/MaterialNode.js'; -export { default as MaterialReferenceNode, materialReference } from './accessors/MaterialReferenceNode.js'; -export { default as ModelNode, modelDirection, modelViewMatrix, modelNormalMatrix, modelWorldMatrix, modelPosition, modelViewPosition } from './accessors/ModelNode.js'; -export { default as ModelViewProjectionNode, modelViewProjection } from './accessors/ModelViewProjectionNode.js'; -export { default as NormalNode, normalGeometry, normalLocal, normalView, normalWorld, transformedNormalView, transformedNormalWorld } from './accessors/NormalNode.js'; -export { default as Object3DNode, objectDirection, objectViewMatrix, objectNormalMatrix, objectWorldMatrix, objectPosition, objectViewPosition } from './accessors/Object3DNode.js'; -export { default as PointUVNode, pointUV } from './accessors/PointUVNode.js'; -export { default as PositionNode, positionGeometry, positionLocal, positionWorld, positionWorldDirection, positionView, positionViewDirection } from './accessors/PositionNode.js'; -export { default as ReferenceNode, reference } from './accessors/ReferenceNode.js'; -export { default as ReflectVectorNode, reflectVector } from './accessors/ReflectVectorNode.js'; -export { default as SkinningNode, skinning } from './accessors/SkinningNode.js'; -export { default as StorageBufferNode, storage } from './accessors/StorageBufferNode.js'; -export { default as TangentNode, tangentGeometry, tangentLocal, tangentView, tangentWorld, transformedTangentView, transformedTangentWorld } from './accessors/TangentNode.js'; -export { default as TextureNode, texture, sampler } from './accessors/TextureNode.js'; -export { default as UVNode, uv } from './accessors/UVNode.js'; -export { default as UserDataNode, userData } from './accessors/UserDataNode.js'; - -// display -export { default as BlendModeNode, burn, dodge, overlay, screen } from './display/BlendModeNode.js'; -export { default as ColorAdjustmentNode, saturation, vibrance, hue, lumaCoeffs, luminance } from './display/ColorAdjustmentNode.js'; -export { default as ColorSpaceNode, colorSpace } from './display/ColorSpaceNode.js'; -export { default as FrontFacingNode, frontFacing, faceDirection } from './display/FrontFacingNode.js'; -export { default as NormalMapNode, normalMap, TBNViewMatrix } from './display/NormalMapNode.js'; -export { default as PosterizeNode, posterize } from './display/PosterizeNode.js'; -export { default as ToneMappingNode, toneMapping } from './display/ToneMappingNode.js'; -export { default as ViewportNode, viewportCoordinate, viewportResolution, viewportTopLeft, viewportBottomLeft, viewportTopRight, viewportBottomRight } from './display/ViewportNode.js'; - -// fog -export { default as FogNode, fog } from './fog/FogNode.js'; -export { default as FogRangeNode, rangeFog } from './fog/FogRangeNode.js'; -export { default as FogExp2Node, densityFog } from './fog/FogExp2Node.js'; +import BitangentNode from './accessors/BitangentNode.js'; +import BufferNode from './accessors/BufferNode.js'; +import CameraNode from './accessors/CameraNode.js'; +import CubeTextureNode from './accessors/CubeTextureNode.js'; +import InstanceNode from './accessors/InstanceNode.js'; +import MaterialNode from './accessors/MaterialNode.js'; +import MaterialReferenceNode from './accessors/MaterialReferenceNode.js'; +import ModelNode from './accessors/ModelNode.js'; +import ModelViewProjectionNode from './accessors/ModelViewProjectionNode.js'; +import NormalNode from './accessors/NormalNode.js'; +import Object3DNode from './accessors/Object3DNode.js'; +import PointUVNode from './accessors/PointUVNode.js'; +import PositionNode from './accessors/PositionNode.js'; +import ReferenceNode from './accessors/ReferenceNode.js'; +import ReflectVectorNode from './accessors/ReflectVectorNode.js'; +import SkinningNode from './accessors/SkinningNode.js'; +import TangentNode from './accessors/TangentNode.js'; +import TextureNode from './accessors/TextureNode.js'; +import UVNode from './accessors/UVNode.js'; +import UserDataNode from './accessors/UserDataNode.js'; // geometry -export { default as RangeNode, range } from './geometry/RangeNode.js'; +import RangeNode from './geometry/RangeNode.js'; // gpgpu -export { default as ComputeNode, compute } from './gpgpu/ComputeNode.js'; +import ComputeNode from './gpgpu/ComputeNode.js'; + +// display +import BlendModeNode from './display/BlendModeNode.js'; +import ColorAdjustmentNode from './display/ColorAdjustmentNode.js'; +import ColorSpaceNode from './display/ColorSpaceNode.js'; +import FrontFacingNode from './display/FrontFacingNode.js'; +import NormalMapNode from './display/NormalMapNode.js'; +import PosterizeNode from './display/PosterizeNode.js'; +import ToneMappingNode from './display/ToneMappingNode.js'; +import ViewportNode from './display/ViewportNode.js'; + +// math +import MathNode from './math/MathNode.js'; +import OperatorNode from './math/OperatorNode.js'; +import CondNode from './math/CondNode.js'; // lighting -export { default as PointLightNode } from './lighting/PointLightNode.js'; -export { default as DirectionalLightNode } from './lighting/DirectionalLightNode.js'; -export { default as SpotLightNode } from './lighting/SpotLightNode.js'; -export { default as IESSpotLightNode } from './lighting/IESSpotLightNode.js'; -export { default as AmbientLightNode } from './lighting/AmbientLightNode.js'; -export { default as LightsNode, lights, lightsWithoutWrap, addLightNode } from './lighting/LightsNode.js'; -export { default as LightingNode /* @TODO: lighting (abstract), light */ } from './lighting/LightingNode.js'; -export { default as LightingContextNode, lightingContext } from './lighting/LightingContextNode.js'; -export { default as HemisphereLightNode } from './lighting/HemisphereLightNode.js'; -export { default as EnvironmentNode } from './lighting/EnvironmentNode.js'; -export { default as AONode } from './lighting/AONode.js'; -export { default as AnalyticLightNode } from './lighting/AnalyticLightNode.js'; +import PointLightNode from './lighting/PointLightNode.js'; +import DirectionalLightNode from './lighting/DirectionalLightNode.js'; +import SpotLightNode from './lighting/SpotLightNode.js'; +import IESSpotLightNode from './lighting/IESSpotLightNode.js'; +import AmbientLightNode from './lighting/AmbientLightNode.js'; +import LightsNode from './lighting/LightsNode.js'; +import LightingNode from './lighting/LightingNode.js'; +import LightingContextNode from './lighting/LightingContextNode.js'; +import HemisphereLightNode from './lighting/HemisphereLightNode.js'; +import EnvironmentNode from './lighting/EnvironmentNode.js'; +import AONode from './lighting/AONode.js'; +import AnalyticLightNode from './lighting/AnalyticLightNode.js'; -// procedural -export { default as CheckerNode, checker } from './procedural/CheckerNode.js'; +// utils +import ArrayElementNode from './utils/ArrayElementNode.js'; +import ConvertNode from './utils/ConvertNode.js'; +import DiscardNode from './utils/DiscardNode.js'; +import EquirectUVNode from './utils/EquirectUVNode.js'; +import JoinNode from './utils/JoinNode.js'; +import MatcapUVNode from './utils/MatcapUVNode.js'; +import MaxMipLevelNode from './utils/MaxMipLevelNode.js'; +import OscNode from './utils/OscNode.js'; +import RemapNode from './utils/RemapNode.js'; +import RotateUVNode from './utils/RotateUVNode.js'; +import SpecularMIPLevelNode from './utils/SpecularMIPLevelNode.js'; +import SplitNode from './utils/SplitNode.js'; +import SpriteSheetUVNode from './utils/SpriteSheetUVNode.js'; +import TimerNode from './utils/TimerNode.js'; +import TriplanarTexturesNode from './utils/TriplanarTexturesNode.js'; // loaders -export { default as NodeLoader } from './loaders/NodeLoader.js'; -export { default as NodeObjectLoader } from './loaders/NodeObjectLoader.js'; -export { default as NodeMaterialLoader } from './loaders/NodeMaterialLoader.js'; +import NodeLoader from './loaders/NodeLoader.js'; +import NodeObjectLoader from './loaders/NodeObjectLoader.js'; +import NodeMaterialLoader from './loaders/NodeMaterialLoader.js'; // parsers -export { default as WGSLNodeParser } from './parsers/WGSLNodeParser.js'; -export { default as GLSLNodeParser } from './parsers/GLSLNodeParser.js'; +import WGSLNodeParser from './parsers/WGSLNodeParser.js'; +import GLSLNodeParser from './parsers/GLSLNodeParser.js'; + +// procedural +import CheckerNode from './procedural/CheckerNode.js'; + +// fog +import FogNode from './fog/FogNode.js'; +import FogRangeNode from './fog/FogRangeNode.js'; +import FogExp2Node from './fog/FogExp2Node.js'; + +// core +export * from './core/constants.js'; // materials export * from './materials/Materials.js'; -// materialX +// shader node +export * from './shadernode/ShaderNodeElements.js'; + +// extensions export * from './materialx/MaterialXNodes.js'; -// functions -export { default as BRDF_BlinnPhong } from './functions/BSDF/BRDF_BlinnPhong.js'; -export { default as BRDF_GGX } from './functions/BSDF/BRDF_GGX.js'; -export { default as BRDF_Lambert } from './functions/BSDF/BRDF_Lambert.js'; -export { default as D_GGX } from './functions/BSDF/D_GGX.js'; -export { default as DFGApprox } from './functions/BSDF/DFGApprox.js'; -export { default as F_Schlick } from './functions/BSDF/F_Schlick.js'; -export { default as V_GGX_SmithCorrelated } from './functions/BSDF/V_GGX_SmithCorrelated.js'; +// shader stages +export { defaultShaderStages } from './core/NodeBuilder.js'; + +const nodeLib = { + // core + ArrayUniformNode, + AttributeNode, + BypassNode, + CacheNode, + CodeNode, + ContextNode, + ConstNode, + ExpressionNode, + FunctionCallNode, + FunctionNode, + InstanceIndexNode, + LightingModel, + Node, + NodeAttribute, + NodeBuilder, + NodeCache, + NodeCode, + NodeFrame, + NodeFunctionInput, + NodeKeywords, + NodeUniform, + NodeVar, + NodeVarying, + PropertyNode, + StackNode, + TempNode, + UniformNode, + VarNode, + VaryingNode, + + // geometry + RangeNode, + + // gpgpu + ComputeNode, + + // accessors + BitangentNode, + BufferNode, + CameraNode, + CubeTextureNode, + InstanceNode, + MaterialNode, + MaterialReferenceNode, + ModelNode, + ModelViewProjectionNode, + NormalNode, + Object3DNode, + PointUVNode, + PositionNode, + ReferenceNode, + ReflectVectorNode, + SkinningNode, + TangentNode, + TextureNode, + UVNode, + UserDataNode, + + // display + BlendModeNode, + ColorAdjustmentNode, + ColorSpaceNode, + FrontFacingNode, + NormalMapNode, + PosterizeNode, + ToneMappingNode, + ViewportNode, + + // math + MathNode, + OperatorNode, + CondNode, + + // lighting + PointLightNode, + DirectionalLightNode, + SpotLightNode, + IESSpotLightNode, + AmbientLightNode, + LightsNode, + LightingNode, + LightingContextNode, + HemisphereLightNode, + EnvironmentNode, + AONode, + AnalyticLightNode, + + // utils + ArrayElementNode, + ConvertNode, + DiscardNode, + EquirectUVNode, + JoinNode, + MatcapUVNode, + MaxMipLevelNode, + OscNode, + RemapNode, + RotateUVNode, + SpecularMIPLevelNode, + SplitNode, + SpriteSheetUVNode, + TimerNode, + TriplanarTexturesNode, + + // procedural + CheckerNode, + + // fog + FogNode, + FogRangeNode, + FogExp2Node, + + // loaders + NodeLoader, + NodeObjectLoader, + NodeMaterialLoader, + + // parsers + WGSLNodeParser, + GLSLNodeParser + +}; + +export const fromType = ( type ) => { + + return new nodeLib[ type ](); + +}; + +export { + // core + ArrayUniformNode, + AttributeNode, + BypassNode, + CacheNode, + CodeNode, + ContextNode, + ConstNode, + ExpressionNode, + FunctionCallNode, + FunctionNode, + InstanceIndexNode, + LightingModel, + Node, + NodeAttribute, + NodeBuilder, + NodeCache, + NodeCode, + NodeFrame, + NodeFunctionInput, + NodeKeywords, + NodeUniform, + NodeVar, + NodeVarying, + PropertyNode, + StackNode, + TempNode, + UniformNode, + VarNode, + VaryingNode, + + // geometry + RangeNode, + + // gpgpu + ComputeNode, + + // accessors + BitangentNode, + BufferNode, + CameraNode, + CubeTextureNode, + InstanceNode, + MaterialNode, + MaterialReferenceNode, + ModelNode, + ModelViewProjectionNode, + NormalNode, + Object3DNode, + PointUVNode, + PositionNode, + ReferenceNode, + ReflectVectorNode, + SkinningNode, + TangentNode, + TextureNode, + UVNode, + UserDataNode, + + // display + BlendModeNode, + ColorAdjustmentNode, + ColorSpaceNode, + FrontFacingNode, + NormalMapNode, + PosterizeNode, + ToneMappingNode, + ViewportNode, + + // math + MathNode, + OperatorNode, + CondNode, + + // lighting + PointLightNode, + DirectionalLightNode, + SpotLightNode, + IESSpotLightNode, + AmbientLightNode, + LightsNode, + LightingNode, + LightingContextNode, + HemisphereLightNode, + EnvironmentNode, + AONode, + AnalyticLightNode, + + // utils + ArrayElementNode, + ConvertNode, + DiscardNode, + EquirectUVNode, + JoinNode, + MatcapUVNode, + MaxMipLevelNode, + OscNode, + RemapNode, + RotateUVNode, + SpecularMIPLevelNode, + SplitNode, + SpriteSheetUVNode, + TimerNode, + TriplanarTexturesNode, + + // procedural + CheckerNode, -export { default as getDistanceAttenuation } from './functions/light/getDistanceAttenuation.js'; + // fog + FogNode, + FogRangeNode, + FogExp2Node, -export { default as getGeometryRoughness } from './functions/material/getGeometryRoughness.js'; -export { default as getRoughness } from './functions/material/getRoughness.js'; + // loaders + NodeLoader, + NodeObjectLoader, + NodeMaterialLoader, -export { default as phongLightingModel } from './functions/PhongLightingModel.js'; -export { default as physicalLightingModel } from './functions/PhysicalLightingModel.js'; + // parsers + WGSLNodeParser, + GLSLNodeParser +}; diff --git a/examples/jsm/nodes/accessors/BitangentNode.js b/examples/jsm/nodes/accessors/BitangentNode.js index 3951d83ccd932d..9048dd6b3fd853 100644 --- a/examples/jsm/nodes/accessors/BitangentNode.js +++ b/examples/jsm/nodes/accessors/BitangentNode.js @@ -1,10 +1,10 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { varying } from '../core/VaryingNode.js'; -import { normalize } from '../math/MathNode.js'; -import { cameraViewMatrix } from './CameraNode.js'; -import { normalGeometry, normalLocal, normalView, normalWorld, transformedNormalView } from './NormalNode.js'; -import { tangentGeometry, tangentLocal, tangentView, tangentWorld, transformedTangentView } from './TangentNode.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import VaryingNode from '../core/VaryingNode.js'; +import OperatorNode from '../math/OperatorNode.js'; +import MathNode from '../math/MathNode.js'; +import SplitNode from '../utils/SplitNode.js'; +import NormalNode from './NormalNode.js'; +import TangentNode from './TangentNode.js'; class BitangentNode extends Node { @@ -26,29 +26,11 @@ class BitangentNode extends Node { const scope = this.scope; - let crossNormalTangent; + const crossNormalTangent = new MathNode( MathNode.CROSS, new NormalNode( scope ), new TangentNode( scope ) ); + const tangentW = new SplitNode( new TangentNode( TangentNode.GEOMETRY ), 'w' ); + const vertexNode = new SplitNode( new OperatorNode( '*', crossNormalTangent, tangentW ), 'xyz' ); - if ( scope === BitangentNode.GEOMETRY ) { - - crossNormalTangent = normalGeometry.cross( tangentGeometry ); - - } else if ( scope === BitangentNode.LOCAL ) { - - crossNormalTangent = normalLocal.cross( tangentLocal ); - - } else if ( scope === BitangentNode.VIEW ) { - - crossNormalTangent = normalView.cross( tangentView ); - - } else if ( scope === BitangentNode.WORLD ) { - - crossNormalTangent = normalWorld.cross( tangentWorld ); - - } - - const vertexNode = crossNormalTangent.mul( tangentGeometry.w ).xyz; - - const outputNode = normalize( varying( vertexNode ) ); + const outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexNode ) ); return outputNode.build( builder, this.getNodeType( builder ) ); @@ -78,12 +60,3 @@ BitangentNode.VIEW = 'view'; BitangentNode.WORLD = 'world'; export default BitangentNode; - -export const bitangentGeometry = nodeImmutable( BitangentNode, BitangentNode.GEOMETRY ); -export const bitangentLocal = nodeImmutable( BitangentNode, BitangentNode.LOCAL ); -export const bitangentView = nodeImmutable( BitangentNode, BitangentNode.VIEW ); -export const bitangentWorld = nodeImmutable( BitangentNode, BitangentNode.WORLD ); -export const transformedBitangentView = normalize( transformedNormalView.cross( transformedTangentView ).mul( tangentGeometry.w ) ); -export const transformedBitangentWorld = normalize( transformedBitangentView.transformDirection( cameraViewMatrix ) ); - -addNodeClass( BitangentNode ); diff --git a/examples/jsm/nodes/accessors/BufferNode.js b/examples/jsm/nodes/accessors/BufferNode.js index 99caa5744e7a92..0331475f332903 100644 --- a/examples/jsm/nodes/accessors/BufferNode.js +++ b/examples/jsm/nodes/accessors/BufferNode.js @@ -1,6 +1,4 @@ import UniformNode from '../core/UniformNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js'; class BufferNode extends UniformNode { @@ -24,7 +22,3 @@ class BufferNode extends UniformNode { } export default BufferNode; - -export const buffer = ( value, nodeOrType, count ) => nodeObject( new BufferNode( value, getConstNodeType( nodeOrType ), count ) ); - -addNodeClass( BufferNode ); diff --git a/examples/jsm/nodes/accessors/CameraNode.js b/examples/jsm/nodes/accessors/CameraNode.js index 7e41af5a01f62b..5e2041745fa23f 100644 --- a/examples/jsm/nodes/accessors/CameraNode.js +++ b/examples/jsm/nodes/accessors/CameraNode.js @@ -1,6 +1,4 @@ import Object3DNode from './Object3DNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; class CameraNode extends Object3DNode { @@ -67,11 +65,3 @@ class CameraNode extends Object3DNode { CameraNode.PROJECTION_MATRIX = 'projectionMatrix'; export default CameraNode; - -export const cameraProjectionMatrix = nodeImmutable( CameraNode, CameraNode.PROJECTION_MATRIX ); -export const cameraViewMatrix = nodeImmutable( CameraNode, CameraNode.VIEW_MATRIX ); -export const cameraNormalMatrix = nodeImmutable( CameraNode, CameraNode.NORMAL_MATRIX ); -export const cameraWorldMatrix = nodeImmutable( CameraNode, CameraNode.WORLD_MATRIX ); -export const cameraPosition = nodeImmutable( CameraNode, CameraNode.POSITION ); - -addNodeClass( CameraNode ); diff --git a/examples/jsm/nodes/accessors/CubeTextureNode.js b/examples/jsm/nodes/accessors/CubeTextureNode.js index 0d27c2d745fd5c..52d0c100ffb3ca 100644 --- a/examples/jsm/nodes/accessors/CubeTextureNode.js +++ b/examples/jsm/nodes/accessors/CubeTextureNode.js @@ -1,8 +1,10 @@ import TextureNode from './TextureNode.js'; import UniformNode from '../core/UniformNode.js'; -import { reflectVector } from './ReflectVectorNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy, vec3 } from '../shadernode/ShaderNode.js'; +import ReflectVectorNode from './ReflectVectorNode.js'; + +import { vec3, nodeObject } from '../shadernode/ShaderNodeBaseElements.js'; + +let defaultUV; class CubeTextureNode extends TextureNode { @@ -22,7 +24,7 @@ class CubeTextureNode extends TextureNode { getDefaultUV() { - return reflectVector; + return defaultUV || ( defaultUV = new ReflectVectorNode() ); } @@ -56,7 +58,8 @@ class CubeTextureNode extends TextureNode { if ( propertyName === undefined ) { - const cubeUV = vec3( uvNode.x.negate(), uvNode.yz ); + const uvNodeObject = nodeObject( uvNode ); + const cubeUV = vec3( uvNodeObject.x.negate(), uvNodeObject.yz ); const uvSnippet = cubeUV.build( builder, 'vec3' ); const nodeVar = builder.getVarFromNode( this, 'vec4' ); @@ -93,9 +96,3 @@ class CubeTextureNode extends TextureNode { } export default CubeTextureNode; - -export const cubeTexture = nodeProxy( CubeTextureNode ); - -addNodeElement( 'cubeTexture', cubeTexture ); - -addNodeClass( CubeTextureNode ); diff --git a/examples/jsm/nodes/accessors/ExtendedMaterialNode.js b/examples/jsm/nodes/accessors/ExtendedMaterialNode.js index 647535c9352d69..ff7b74b8bfed67 100644 --- a/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +++ b/examples/jsm/nodes/accessors/ExtendedMaterialNode.js @@ -1,11 +1,9 @@ -// @TODO: Is this needed? Can it be moved in MaterialNode? - import MaterialNode from './MaterialNode.js'; -import { materialReference } from './MaterialReferenceNode.js'; -import { normalView } from './NormalNode.js'; -import { normalMap } from '../display/NormalMapNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import NormalMapNode from '../display/NormalMapNode.js'; + +import { + normalView, materialReference +} from '../shadernode/ShaderNodeElements.js'; class ExtendedMaterialNode extends MaterialNode { @@ -39,7 +37,7 @@ class ExtendedMaterialNode extends MaterialNode { if ( scope === ExtendedMaterialNode.NORMAL ) { - node = material.normalMap ? normalMap( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView; + node = material.normalMap ? new NormalMapNode( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView; } @@ -52,7 +50,3 @@ class ExtendedMaterialNode extends MaterialNode { ExtendedMaterialNode.NORMAL = 'normal'; export default ExtendedMaterialNode; - -export const materialNormal = nodeImmutable( ExtendedMaterialNode, ExtendedMaterialNode.NORMAL ); - -addNodeClass( ExtendedMaterialNode ); diff --git a/examples/jsm/nodes/accessors/InstanceNode.js b/examples/jsm/nodes/accessors/InstanceNode.js index 4bfe56aea0fce7..cf02402468d46e 100644 --- a/examples/jsm/nodes/accessors/InstanceNode.js +++ b/examples/jsm/nodes/accessors/InstanceNode.js @@ -1,10 +1,18 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { instanceIndex } from '../core/InstanceIndexNode.js'; -import { temp } from '../core/VarNode.js'; -import { buffer } from './BufferNode.js'; -import { normalLocal } from './NormalNode.js'; -import { positionLocal } from './PositionNode.js'; -import { nodeProxy, vec3, mat3 } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import { + vec3, + mat3, + mul, + assign, + buffer, + element, + dot, + div, + temp, + instanceIndex, + positionLocal, + normalLocal +} from '../shadernode/ShaderNodeBaseElements.js'; class InstanceNode extends Node { @@ -18,7 +26,7 @@ class InstanceNode extends Node { const instanceBufferNode = buffer( instanceMesh.instanceMatrix.array, 'mat4', instanceMesh.count ); - this.instanceMatrixNode = temp( instanceBufferNode.element( instanceIndex ) ); // @TODO: a possible caching issue here? + this.instanceMatrixNode = temp( element( instanceBufferNode, instanceIndex ) ); // @TODO: a possible caching issue here? } @@ -28,27 +36,23 @@ class InstanceNode extends Node { // POSITION - const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz; + const instancePosition = mul( instanceMatrixNode, positionLocal ).xyz; // NORMAL const m = mat3( instanceMatrixNode[ 0 ].xyz, instanceMatrixNode[ 1 ].xyz, instanceMatrixNode[ 2 ].xyz ); - const transformedNormal = normalLocal.div( vec3( m[ 0 ].dot( m[ 0 ] ), m[ 1 ].dot( m[ 1 ] ), m[ 2 ].dot( m[ 2 ] ) ) ); + const transformedNormal = div( normalLocal, vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) ) ); - const instanceNormal = m.mul( transformedNormal ).xyz; + const instanceNormal = mul( m, transformedNormal ).xyz; // ASSIGNS - positionLocal.assign( instancePosition ).build( builder ); - normalLocal.assign( instanceNormal ).build( builder ); + assign( positionLocal, instancePosition ).build( builder ); + assign( normalLocal, instanceNormal ).build( builder ); } } export default InstanceNode; - -export const instance = nodeProxy( InstanceNode ); - -addNodeClass( InstanceNode ); diff --git a/examples/jsm/nodes/accessors/MaterialNode.js b/examples/jsm/nodes/accessors/MaterialNode.js index 141be9b4dee4be..6eff9dac203ca4 100644 --- a/examples/jsm/nodes/accessors/MaterialNode.js +++ b/examples/jsm/nodes/accessors/MaterialNode.js @@ -1,8 +1,11 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { uniform } from '../core/UniformNode.js'; -import { materialReference } from './MaterialReferenceNode.js'; -import { uv } from './UVNode.js'; -import { nodeImmutable, vec3 } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import UniformNode from '../core/UniformNode.js'; +import UVNode from '../accessors/UVNode.js'; +import ConstNode from '../core/ConstNode.js'; +import OperatorNode from '../math/OperatorNode.js'; +import JoinNode from '../utils/JoinNode.js'; +import MaterialReferenceNode from './MaterialReferenceNode.js'; +import SplitNode from '../utils/SplitNode.js'; class MaterialNode extends Node { @@ -47,7 +50,7 @@ class MaterialNode extends Node { //@TODO: Check if it can be cached by property name. - return materialReference( property, 'float' ); + return new MaterialReferenceNode( property, 'float' ); } @@ -55,7 +58,7 @@ class MaterialNode extends Node { //@TODO: Check if it can be cached by property name. - return materialReference( property, 'color' ); + return new MaterialReferenceNode( property, 'color' ); } @@ -63,8 +66,8 @@ class MaterialNode extends Node { //@TODO: Check if it can be cached by property name. - const textureRefNode = materialReference( property, 'texture' ); - textureRefNode.node.uvNode = materialUV; + const textureRefNode = new MaterialReferenceNode( property, 'texture' ); + textureRefNode.node.uvNode = new MaterialNode( MaterialNode.UV ); return textureRefNode; @@ -87,7 +90,7 @@ class MaterialNode extends Node { if ( material.map && material.map.isTexture === true ) { - node = colorNode.mul( this.getTexture( 'map' ) ); + node = new OperatorNode( '*', colorNode, this.getTexture( 'map' ) ); } else { @@ -101,7 +104,7 @@ class MaterialNode extends Node { if ( material.alphaMap && material.alphaMap.isTexture === true ) { - node = opacityNode.mul( this.getTexture( 'alphaMap' ) ); + node = new OperatorNode( '*', opacityNode, this.getTexture( 'alphaMap' ) ); } else { @@ -123,7 +126,7 @@ class MaterialNode extends Node { if ( material.specularMap && material.specularMap.isTexture === true ) { - node = reflectivityNode.mul( this.getTexture( 'specularMap' ).r ); + node = new OperatorNode( '*', reflectivityNode, new SplitNode( this.getTexture( 'specularMap' ), 'r' ) ); } else { @@ -137,7 +140,7 @@ class MaterialNode extends Node { if ( material.roughnessMap && material.roughnessMap.isTexture === true ) { - node = roughnessNode.mul( this.getTexture( 'roughnessMap' ).g ); + node = new OperatorNode( '*', roughnessNode, new SplitNode( this.getTexture( 'roughnessMap' ), 'g' ) ); } else { @@ -151,7 +154,7 @@ class MaterialNode extends Node { if ( material.metalnessMap && material.metalnessMap.isTexture === true ) { - node = metalnessNode.mul( this.getTexture( 'metalnessMap' ).b ); + node = new OperatorNode( '*', metalnessNode, new SplitNode( this.getTexture( 'metalnessMap' ), 'b' ) ); } else { @@ -165,7 +168,7 @@ class MaterialNode extends Node { if ( material.emissiveMap && material.emissiveMap.isTexture === true ) { - node = emissiveNode.mul( this.getTexture( 'emissiveMap' ) ); + node = new OperatorNode( '*', emissiveNode, this.getTexture( 'emissiveMap' ) ); } else { @@ -181,6 +184,7 @@ class MaterialNode extends Node { // uv repeat and offset setting priorities + let uvNode; let uvScaleMap = material.map || material.specularMap || @@ -218,19 +222,17 @@ class MaterialNode extends Node { } - node = uniform( uvScaleMap.matrix ).mul( vec3( uv(), 1 ) ); - - } else { - - node = uv(); + uvNode = new OperatorNode( '*', new UniformNode( uvScaleMap.matrix ), new JoinNode( [ new UVNode(), new ConstNode( 1 ) ] ) ); } + return uvNode || new UVNode(); + } else { const outputType = this.getNodeType( builder ); - node = materialReference( scope, outputType ); + node = new MaterialReferenceNode( scope, outputType ); } @@ -253,17 +255,3 @@ MaterialNode.ROTATION = 'rotation'; MaterialNode.UV = 'uv'; export default MaterialNode; - -export const materialUV = nodeImmutable( MaterialNode, MaterialNode.UV ); -export const materialAlphaTest = nodeImmutable( MaterialNode, MaterialNode.ALPHA_TEST ); -export const materialColor = nodeImmutable( MaterialNode, MaterialNode.COLOR ); -export const materialShininess = nodeImmutable( MaterialNode, MaterialNode.SHININESS ); -export const materialEmissive = nodeImmutable( MaterialNode, MaterialNode.EMISSIVE ); -export const materialOpacity = nodeImmutable( MaterialNode, MaterialNode.OPACITY ); -export const materialSpecularColor = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_COLOR ); -export const materialReflectivity = nodeImmutable( MaterialNode, MaterialNode.REFLECTIVITY ); -export const materialRoughness = nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS ); -export const materialMetalness = nodeImmutable( MaterialNode, MaterialNode.METALNESS ); -export const materialRotation = nodeImmutable( MaterialNode, MaterialNode.ROTATION ); - -addNodeClass( MaterialNode ); diff --git a/examples/jsm/nodes/accessors/MaterialReferenceNode.js b/examples/jsm/nodes/accessors/MaterialReferenceNode.js index ff19d79888b42d..c2ccf6de5696b3 100644 --- a/examples/jsm/nodes/accessors/MaterialReferenceNode.js +++ b/examples/jsm/nodes/accessors/MaterialReferenceNode.js @@ -1,6 +1,4 @@ import ReferenceNode from './ReferenceNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js'; class MaterialReferenceNode extends ReferenceNode { @@ -33,7 +31,3 @@ class MaterialReferenceNode extends ReferenceNode { } export default MaterialReferenceNode; - -export const materialReference = ( name, nodeOrType, material ) => nodeObject( new MaterialReferenceNode( name, getConstNodeType( nodeOrType ), material ) ); - -addNodeClass( MaterialReferenceNode ); diff --git a/examples/jsm/nodes/accessors/ModelNode.js b/examples/jsm/nodes/accessors/ModelNode.js index d63adbd57b1242..e4ba2b25ab4af5 100644 --- a/examples/jsm/nodes/accessors/ModelNode.js +++ b/examples/jsm/nodes/accessors/ModelNode.js @@ -1,6 +1,4 @@ import Object3DNode from './Object3DNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; class ModelNode extends Object3DNode { @@ -21,12 +19,3 @@ class ModelNode extends Object3DNode { } export default ModelNode; - -export const modelDirection = nodeImmutable( ModelNode, ModelNode.DIRECTION ); -export const modelViewMatrix = nodeImmutable( ModelNode, ModelNode.VIEW_MATRIX ); -export const modelNormalMatrix = nodeImmutable( ModelNode, ModelNode.NORMAL_MATRIX ); -export const modelWorldMatrix = nodeImmutable( ModelNode, ModelNode.WORLD_MATRIX ); -export const modelPosition = nodeImmutable( ModelNode, ModelNode.POSITION ); -export const modelViewPosition = nodeImmutable( ModelNode, ModelNode.VIEW_POSITION ); - -addNodeClass( ModelNode ); diff --git a/examples/jsm/nodes/accessors/ModelViewProjectionNode.js b/examples/jsm/nodes/accessors/ModelViewProjectionNode.js index 5283c2daecf4cc..ddeccddc46e82b 100644 --- a/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +++ b/examples/jsm/nodes/accessors/ModelViewProjectionNode.js @@ -1,12 +1,12 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { cameraProjectionMatrix } from './CameraNode.js'; -import { modelViewMatrix } from './ModelNode.js'; -import { positionLocal } from './PositionNode.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import CameraNode from '../accessors/CameraNode.js'; +import ModelNode from '../accessors/ModelNode.js'; +import OperatorNode from '../math/OperatorNode.js'; +import PositionNode from '../accessors/PositionNode.js'; class ModelViewProjectionNode extends Node { - constructor( position = positionLocal ) { + constructor( position = new PositionNode() ) { super( 'vec4' ); @@ -18,8 +18,8 @@ class ModelViewProjectionNode extends Node { const position = this.position; - const mvpMatrix = cameraProjectionMatrix.mul( modelViewMatrix ); - const mvpNode = mvpMatrix.mul( position ); + const mvpMatrix = new OperatorNode( '*', new CameraNode( CameraNode.PROJECTION_MATRIX ), new ModelNode( ModelNode.VIEW_MATRIX ) ); + const mvpNode = new OperatorNode( '*', mvpMatrix, position ); return mvpNode.build( builder ); @@ -28,7 +28,3 @@ class ModelViewProjectionNode extends Node { } export default ModelViewProjectionNode; - -export const modelViewProjection = nodeProxy( ModelViewProjectionNode ); - -addNodeClass( ModelViewProjectionNode ); diff --git a/examples/jsm/nodes/accessors/NormalNode.js b/examples/jsm/nodes/accessors/NormalNode.js index 6c2221e7f560ec..2470f28eb1cfe9 100644 --- a/examples/jsm/nodes/accessors/NormalNode.js +++ b/examples/jsm/nodes/accessors/NormalNode.js @@ -1,11 +1,10 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { attribute } from '../core/AttributeNode.js'; -import { label } from '../core/VarNode.js'; -import { varying } from '../core/VaryingNode.js'; -import { normalize } from '../math/MathNode.js'; -import { cameraViewMatrix } from './CameraNode.js'; -import { modelNormalMatrix } from './ModelNode.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import AttributeNode from '../core/AttributeNode.js'; +import VaryingNode from '../core/VaryingNode.js'; +import ModelNode from '../accessors/ModelNode.js'; +import CameraNode from '../accessors/CameraNode.js'; +import OperatorNode from '../math/OperatorNode.js'; +import MathNode from '../math/MathNode.js'; class NormalNode extends Node { @@ -37,22 +36,22 @@ class NormalNode extends Node { if ( scope === NormalNode.GEOMETRY ) { - outputNode = attribute( 'normal', 'vec3' ); + outputNode = new AttributeNode( 'normal', 'vec3' ); } else if ( scope === NormalNode.LOCAL ) { - outputNode = varying( normalGeometry ); + outputNode = new VaryingNode( new NormalNode( NormalNode.GEOMETRY ) ); } else if ( scope === NormalNode.VIEW ) { - const vertexNode = modelNormalMatrix.mul( normalLocal ); - outputNode = normalize( varying( vertexNode ) ); + const vertexNode = new OperatorNode( '*', new ModelNode( ModelNode.NORMAL_MATRIX ), new NormalNode( NormalNode.LOCAL ) ); + outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexNode ) ); } else if ( scope === NormalNode.WORLD ) { - // To use inverseTransformDirection only inverse the param order like this: cameraViewMatrix.transformDirection( normalView ) - const vertexNode = normalView.transformDirection( cameraViewMatrix ); - outputNode = normalize( varying( vertexNode ) ); + // To use INVERSE_TRANSFORM_DIRECTION only inverse the param order like this: MathNode( ..., Vector, Matrix ); + const vertexNode = new MathNode( MathNode.TRANSFORM_DIRECTION, new NormalNode( NormalNode.VIEW ), new CameraNode( CameraNode.VIEW_MATRIX ) ); + outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexNode ) ); } @@ -84,12 +83,3 @@ NormalNode.VIEW = 'view'; NormalNode.WORLD = 'world'; export default NormalNode; - -export const normalGeometry = nodeImmutable( NormalNode, NormalNode.GEOMETRY ); -export const normalLocal = nodeImmutable( NormalNode, NormalNode.LOCAL ); -export const normalView = nodeImmutable( NormalNode, NormalNode.VIEW ); -export const normalWorld = nodeImmutable( NormalNode, NormalNode.WORLD ); -export const transformedNormalView = label( normalView, 'TransformedNormalView' ); -export const transformedNormalWorld = transformedNormalView.transformDirection( cameraViewMatrix ).normalize(); - -addNodeClass( NormalNode ); diff --git a/examples/jsm/nodes/accessors/Object3DNode.js b/examples/jsm/nodes/accessors/Object3DNode.js index 516fc32a8d82bb..21a7acde40c889 100644 --- a/examples/jsm/nodes/accessors/Object3DNode.js +++ b/examples/jsm/nodes/accessors/Object3DNode.js @@ -1,9 +1,7 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { NodeUpdateType } from '../core/constants.js'; -import { uniform } from '../core/UniformNode.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; - import { Vector3 } from 'three'; +import Node from '../core/Node.js'; +import UniformNode from '../core/UniformNode.js'; +import { NodeUpdateType } from '../core/constants.js'; class Object3DNode extends Node { @@ -16,7 +14,7 @@ class Object3DNode extends Node { this.updateType = NodeUpdateType.OBJECT; - this._uniformNode = uniform( null ); + this._uniformNode = new UniformNode( null ); } @@ -131,12 +129,3 @@ Object3DNode.VIEW_POSITION = 'viewPosition'; Object3DNode.DIRECTION = 'direction'; export default Object3DNode; - -export const objectDirection = nodeProxy( Object3DNode, Object3DNode.DIRECTION ); -export const objectViewMatrix = nodeProxy( Object3DNode, Object3DNode.VIEW_MATRIX ); -export const objectNormalMatrix = nodeProxy( Object3DNode, Object3DNode.NORMAL_MATRIX ); -export const objectWorldMatrix = nodeProxy( Object3DNode, Object3DNode.WORLD_MATRIX ); -export const objectPosition = nodeProxy( Object3DNode, Object3DNode.POSITION ); -export const objectViewPosition = nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION ); - -addNodeClass( Object3DNode ); diff --git a/examples/jsm/nodes/accessors/PointUVNode.js b/examples/jsm/nodes/accessors/PointUVNode.js index f270b6c4b7aeef..591b56b0607cef 100644 --- a/examples/jsm/nodes/accessors/PointUVNode.js +++ b/examples/jsm/nodes/accessors/PointUVNode.js @@ -1,5 +1,4 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; class PointUVNode extends Node { @@ -20,7 +19,3 @@ class PointUVNode extends Node { } export default PointUVNode; - -export const pointUV = nodeImmutable( PointUVNode ); - -addNodeClass( PointUVNode ); diff --git a/examples/jsm/nodes/accessors/PositionNode.js b/examples/jsm/nodes/accessors/PositionNode.js index 390fcb7fd1f0cd..6f08c7ffe73d83 100644 --- a/examples/jsm/nodes/accessors/PositionNode.js +++ b/examples/jsm/nodes/accessors/PositionNode.js @@ -1,9 +1,9 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { attribute } from '../core/AttributeNode.js'; -import { varying } from '../core/VaryingNode.js'; -import { normalize } from '../math/MathNode.js'; -import { modelWorldMatrix, modelViewMatrix } from './ModelNode.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import AttributeNode from '../core/AttributeNode.js'; +import VaryingNode from '../core/VaryingNode.js'; +import ModelNode from '../accessors/ModelNode.js'; +import MathNode from '../math/MathNode.js'; +import OperatorNode from '../math/OperatorNode.js'; class PositionNode extends Node { @@ -35,31 +35,31 @@ class PositionNode extends Node { if ( scope === PositionNode.GEOMETRY ) { - outputNode = attribute( 'position', 'vec3' ); + outputNode = new AttributeNode( 'position', 'vec3' ); } else if ( scope === PositionNode.LOCAL ) { - outputNode = varying( positionGeometry ); + outputNode = new VaryingNode( new PositionNode( PositionNode.GEOMETRY ) ); } else if ( scope === PositionNode.WORLD ) { - const vertexPositionNode = modelWorldMatrix.transformDirection( positionLocal ); - outputNode = varying( vertexPositionNode ); + const vertexPositionNode = new MathNode( MathNode.TRANSFORM_DIRECTION, new ModelNode( ModelNode.WORLD_MATRIX ), new PositionNode( PositionNode.LOCAL ) ); + outputNode = new VaryingNode( vertexPositionNode ); } else if ( scope === PositionNode.VIEW ) { - const vertexPositionNode = modelViewMatrix.mul( positionLocal ); - outputNode = varying( vertexPositionNode ); + const vertexPositionNode = new OperatorNode( '*', new ModelNode( ModelNode.VIEW_MATRIX ), new PositionNode( PositionNode.LOCAL ) ); + outputNode = new VaryingNode( vertexPositionNode ); } else if ( scope === PositionNode.VIEW_DIRECTION ) { - const vertexPositionNode = positionView.negate(); - outputNode = normalize( varying( vertexPositionNode ) ); + const vertexPositionNode = new MathNode( MathNode.NEGATE, new PositionNode( PositionNode.VIEW ) ); + outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexPositionNode ) ); } else if ( scope === PositionNode.WORLD_DIRECTION ) { - const vertexPositionNode = positionWorld.negate(); - outputNode = normalize( varying( vertexPositionNode ) ); + const vertexPositionNode = new MathNode( MathNode.NEGATE, new PositionNode( PositionNode.WORLD ) ); + outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexPositionNode ) ); } @@ -93,12 +93,3 @@ PositionNode.VIEW = 'view'; PositionNode.VIEW_DIRECTION = 'viewDirection'; export default PositionNode; - -export const positionGeometry = nodeImmutable( PositionNode, PositionNode.GEOMETRY ); -export const positionLocal = nodeImmutable( PositionNode, PositionNode.LOCAL ); -export const positionWorld = nodeImmutable( PositionNode, PositionNode.WORLD ); -export const positionWorldDirection = nodeImmutable( PositionNode, PositionNode.WORLD_DIRECTION ); -export const positionView = nodeImmutable( PositionNode, PositionNode.VIEW ); -export const positionViewDirection = nodeImmutable( PositionNode, PositionNode.VIEW_DIRECTION ); - -addNodeClass( PositionNode ); diff --git a/examples/jsm/nodes/accessors/ReferenceNode.js b/examples/jsm/nodes/accessors/ReferenceNode.js index cb94ed4bdd92a8..8b6ce2e3810af6 100644 --- a/examples/jsm/nodes/accessors/ReferenceNode.js +++ b/examples/jsm/nodes/accessors/ReferenceNode.js @@ -1,8 +1,7 @@ -import Node, { addNodeClass } from '../core/Node.js'; +import Node from '../core/Node.js'; +import UniformNode from '../core/UniformNode.js'; +import TextureNode from '../accessors/TextureNode.js'; import { NodeUpdateType } from '../core/constants.js'; -import { uniform } from '../core/UniformNode.js'; -import { texture } from './TextureNode.js'; -import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js'; class ReferenceNode extends Node { @@ -30,11 +29,11 @@ class ReferenceNode extends Node { if ( uniformType === 'texture' ) { - node = texture( null ); + node = new TextureNode( null ); } else { - node = uniform( uniformType ); + node = new UniformNode( null, uniformType ); } @@ -66,7 +65,3 @@ class ReferenceNode extends Node { } export default ReferenceNode; - -export const reference = ( name, nodeOrType, object ) => nodeObject( new ReferenceNode( name, getConstNodeType( nodeOrType ), object ) ); - -addNodeClass( ReferenceNode ); diff --git a/examples/jsm/nodes/accessors/ReflectVectorNode.js b/examples/jsm/nodes/accessors/ReflectVectorNode.js index 508d907df72eda..7f6fde5e4c450e 100644 --- a/examples/jsm/nodes/accessors/ReflectVectorNode.js +++ b/examples/jsm/nodes/accessors/ReflectVectorNode.js @@ -1,8 +1,7 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { cameraViewMatrix } from './CameraNode.js'; -import { transformedNormalView } from './NormalNode.js'; -import { positionViewDirection } from './PositionNode.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import { + transformedNormalView, positionViewDirection, cameraViewMatrix +} from '../shadernode/ShaderNodeBaseElements.js'; class ReflectVectorNode extends Node { @@ -29,7 +28,3 @@ class ReflectVectorNode extends Node { } export default ReflectVectorNode; - -export const reflectVector = nodeImmutable( ReflectVectorNode ); - -addNodeClass( ReflectVectorNode ); diff --git a/examples/jsm/nodes/accessors/SkinningNode.js b/examples/jsm/nodes/accessors/SkinningNode.js index 641a6dbb647b8f..d8a5725cfbc1ac 100644 --- a/examples/jsm/nodes/accessors/SkinningNode.js +++ b/examples/jsm/nodes/accessors/SkinningNode.js @@ -1,57 +1,65 @@ -import Node, { addNodeClass } from '../core/Node.js'; +import Node from '../core/Node.js'; +import { + ShaderNode, + attribute, + buffer, + mat4, + uniform, + positionLocal, + normalLocal, + tangentLocal, + assign, + element, + add, + mul, + transformDirection +} from '../shadernode/ShaderNodeBaseElements.js'; + import { NodeUpdateType } from '../core/constants.js'; -import { ShaderNode, nodeProxy } from '../shadernode/ShaderNode.js'; -import { attribute } from '../core/AttributeNode.js'; -import { uniform } from '../core/UniformNode.js'; -import { add } from '../math/OperatorNode.js'; -import { buffer } from './BufferNode.js'; -import { normalLocal } from './NormalNode.js'; -import { positionLocal } from './PositionNode.js'; -import { tangentLocal } from './TangentNode.js'; -const Skinning = new ShaderNode( ( inputs, {}, builder ) => { +const Skinning = new ShaderNode( ( inputs, builder ) => { const { index, weight, bindMatrix, bindMatrixInverse, boneMatrices } = inputs; - const boneMatX = boneMatrices.element( index.x ); - const boneMatY = boneMatrices.element( index.y ); - const boneMatZ = boneMatrices.element( index.z ); - const boneMatW = boneMatrices.element( index.w ); + const boneMatX = element( boneMatrices, index.x ); + const boneMatY = element( boneMatrices, index.y ); + const boneMatZ = element( boneMatrices, index.z ); + const boneMatW = element( boneMatrices, index.w ); // POSITION - const skinVertex = bindMatrix.mul( positionLocal ); + const skinVertex = mul( bindMatrix, positionLocal ); const skinned = add( - boneMatX.mul( skinVertex ).mul( weight.x ), - boneMatY.mul( skinVertex ).mul( weight.y ), - boneMatZ.mul( skinVertex ).mul( weight.z ), - boneMatW.mul( skinVertex ).mul( weight.w ) + mul( mul( boneMatX, skinVertex ), weight.x ), + mul( mul( boneMatY, skinVertex ), weight.y ), + mul( mul( boneMatZ, skinVertex ), weight.z ), + mul( mul( boneMatW, skinVertex ), weight.w ) ); - const skinPosition = bindMatrixInverse.mul( skinned ).xyz; + const skinPosition = mul( bindMatrixInverse, skinned ).xyz; // NORMAL let skinMatrix = add( - weight.x.mul( boneMatX ), - weight.y.mul( boneMatY ), - weight.z.mul( boneMatZ ), - weight.w.mul( boneMatW ) + mul( weight.x, boneMatX ), + mul( weight.y, boneMatY ), + mul( weight.z, boneMatZ ), + mul( weight.w, boneMatW ) ); - skinMatrix = bindMatrixInverse.mul( skinMatrix ).mul( bindMatrix ); + skinMatrix = mul( mul( bindMatrixInverse, skinMatrix ), bindMatrix ); - const skinNormal = skinMatrix.transformDirection( normalLocal ).xyz; + const skinNormal = transformDirection( skinMatrix, normalLocal ).xyz; // ASSIGNS - positionLocal.assign( skinPosition ).build( builder ); // @TODO: For some reason this doesn't work as stack.assign( positionLocal, skinPosition )? - normalLocal.assign( skinNormal ).build( builder ); + assign( positionLocal, skinPosition ).build( builder ); + assign( normalLocal, skinNormal ).build( builder ); if ( builder.hasGeometryAttribute( 'tangent' ) ) { - tangentLocal.assign( skinNormal ).build( builder ); + assign( tangentLocal, skinNormal ).build( builder ); } @@ -72,28 +80,21 @@ class SkinningNode extends Node { this.skinIndexNode = attribute( 'skinIndex', 'uvec4' ); this.skinWeightNode = attribute( 'skinWeight', 'vec4' ); - this.bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' ); - this.bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' ); + this.bindMatrixNode = uniform( mat4( skinnedMesh.bindMatrix ) ); + this.bindMatrixInverseNode = uniform( mat4( skinnedMesh.bindMatrixInverse ) ); this.boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length ); } generate( builder ) { - /*return new ShaderNode( ( {}, stack, builder ) => Skinning.call( { - index: this.skinIndexNode, - weight: this.skinWeightNode, - bindMatrix: this.bindMatrixNode, - bindMatrixInverse: this.bindMatrixInverseNode, - boneMatrices: this.boneMatricesNode - }, stack, builder ) ).build( builder );*/ Skinning.call( { index: this.skinIndexNode, weight: this.skinWeightNode, bindMatrix: this.bindMatrixNode, bindMatrixInverse: this.bindMatrixInverseNode, boneMatrices: this.boneMatricesNode - }, {}, builder ); + }, builder ); } @@ -106,7 +107,3 @@ class SkinningNode extends Node { } export default SkinningNode; - -export const skinning = nodeProxy( SkinningNode ); - -addNodeClass( SkinningNode ); diff --git a/examples/jsm/nodes/accessors/StorageBufferNode.js b/examples/jsm/nodes/accessors/StorageBufferNode.js index 3b9dc137c5d8c7..3404b8e7906f07 100644 --- a/examples/jsm/nodes/accessors/StorageBufferNode.js +++ b/examples/jsm/nodes/accessors/StorageBufferNode.js @@ -1,6 +1,4 @@ import BufferNode from './BufferNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js'; class StorageBufferNode extends BufferNode { @@ -21,7 +19,3 @@ class StorageBufferNode extends BufferNode { } export default StorageBufferNode; - -export const storage = ( value, nodeOrType, count ) => nodeObject( new StorageBufferNode( value, getConstNodeType( nodeOrType ), count ) ); - -addNodeClass( StorageBufferNode ); diff --git a/examples/jsm/nodes/accessors/TangentNode.js b/examples/jsm/nodes/accessors/TangentNode.js index 1240a6b2dc46c1..f8ce12deb57e34 100644 --- a/examples/jsm/nodes/accessors/TangentNode.js +++ b/examples/jsm/nodes/accessors/TangentNode.js @@ -1,11 +1,11 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { attribute } from '../core/AttributeNode.js'; -import { label } from '../core/VarNode.js'; -import { varying } from '../core/VaryingNode.js'; -import { normalize } from '../math/MathNode.js'; -import { cameraViewMatrix } from './CameraNode.js'; -import { modelViewMatrix } from './ModelNode.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import AttributeNode from '../core/AttributeNode.js'; +import VaryingNode from '../core/VaryingNode.js'; +import ModelNode from '../accessors/ModelNode.js'; +import CameraNode from '../accessors/CameraNode.js'; +import OperatorNode from '../math/OperatorNode.js'; +import MathNode from '../math/MathNode.js'; +import SplitNode from '../utils/SplitNode.js'; class TangentNode extends Node { @@ -46,21 +46,22 @@ class TangentNode extends Node { if ( scope === TangentNode.GEOMETRY ) { - outputNode = attribute( 'tangent', 'vec4' ); + outputNode = new AttributeNode( 'tangent', 'vec4' ); } else if ( scope === TangentNode.LOCAL ) { - outputNode = varying( tangentGeometry.xyz ); + outputNode = new VaryingNode( new SplitNode( new TangentNode( TangentNode.GEOMETRY ), 'xyz' ) ); } else if ( scope === TangentNode.VIEW ) { - const vertexNode = modelViewMatrix.mul( tangentLocal ).xyz; - outputNode = normalize( varying( vertexNode ) ); + const vertexNode = new SplitNode( new OperatorNode( '*', new ModelNode( ModelNode.VIEW_MATRIX ), new TangentNode( TangentNode.LOCAL ) ), 'xyz' ); + + outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexNode ) ); } else if ( scope === TangentNode.WORLD ) { - const vertexNode = tangentView.transformDirection( cameraViewMatrix ); - outputNode = normalize( varying( vertexNode ) ); + const vertexNode = new MathNode( MathNode.TRANSFORM_DIRECTION, new TangentNode( TangentNode.VIEW ), new CameraNode( CameraNode.VIEW_MATRIX ) ); + outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexNode ) ); } @@ -92,12 +93,3 @@ TangentNode.VIEW = 'view'; TangentNode.WORLD = 'world'; export default TangentNode; - -export const tangentGeometry = nodeImmutable( TangentNode, TangentNode.GEOMETRY ); -export const tangentLocal = nodeImmutable( TangentNode, TangentNode.LOCAL ); -export const tangentView = nodeImmutable( TangentNode, TangentNode.VIEW ); -export const tangentWorld = nodeImmutable( TangentNode, TangentNode.WORLD ); -export const transformedTangentView = label( tangentView, 'TransformedTangentView' ); -export const transformedTangentWorld = normalize( transformedTangentView.transformDirection( cameraViewMatrix ) ); - -addNodeClass( TangentNode ); diff --git a/examples/jsm/nodes/accessors/TextureNode.js b/examples/jsm/nodes/accessors/TextureNode.js index 02360c98129e0e..3646eb2534e32f 100644 --- a/examples/jsm/nodes/accessors/TextureNode.js +++ b/examples/jsm/nodes/accessors/TextureNode.js @@ -1,7 +1,5 @@ import UniformNode from '../core/UniformNode.js'; -import { uv } from './UVNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import UVNode from './UVNode.js'; let defaultUV; @@ -32,7 +30,7 @@ class TextureNode extends UniformNode { getDefaultUV() { - return defaultUV || ( defaultUV = uv() ); + return defaultUV || ( defaultUV = new UVNode() ); } @@ -150,10 +148,3 @@ class TextureNode extends UniformNode { } export default TextureNode; - -export const texture = nodeProxy( TextureNode ); -export const sampler = ( aTexture ) => ( aTexture.isNode === true ? aTexture : texture( aTexture ) ).convert( 'sampler' ); - -addNodeElement( 'texture', texture ); - -addNodeClass( TextureNode ); diff --git a/examples/jsm/nodes/accessors/UVNode.js b/examples/jsm/nodes/accessors/UVNode.js index 63c5d943545948..1f8cc74e5eba30 100644 --- a/examples/jsm/nodes/accessors/UVNode.js +++ b/examples/jsm/nodes/accessors/UVNode.js @@ -1,6 +1,4 @@ -import { addNodeClass } from '../core/Node.js'; import AttributeNode from '../core/AttributeNode.js'; -import { nodeObject } from '../shadernode/ShaderNode.js'; class UVNode extends AttributeNode { @@ -41,7 +39,3 @@ class UVNode extends AttributeNode { } export default UVNode; - -export const uv = ( ...params ) => nodeObject( new UVNode( ...params ) ); - -addNodeClass( UVNode ); diff --git a/examples/jsm/nodes/accessors/UserDataNode.js b/examples/jsm/nodes/accessors/UserDataNode.js index 5295676389bfab..43a8b8d99628f2 100644 --- a/examples/jsm/nodes/accessors/UserDataNode.js +++ b/examples/jsm/nodes/accessors/UserDataNode.js @@ -1,6 +1,4 @@ import ReferenceNode from './ReferenceNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { nodeObject } from '../shadernode/ShaderNode.js'; class UserDataNode extends ReferenceNode { @@ -23,7 +21,3 @@ class UserDataNode extends ReferenceNode { } export default UserDataNode; - -export const userData = ( name, inputType, userData ) => nodeObject( new UserDataNode( name, inputType, userData ) ); - -addNodeClass( UserDataNode ); diff --git a/examples/jsm/nodes/core/ArrayUniformNode.js b/examples/jsm/nodes/core/ArrayUniformNode.js index eea3f9c46f37a2..2d8167c47d618a 100644 --- a/examples/jsm/nodes/core/ArrayUniformNode.js +++ b/examples/jsm/nodes/core/ArrayUniformNode.js @@ -1,5 +1,4 @@ import UniformNode from './UniformNode.js'; -import { addNodeClass } from './Node.js'; class ArrayUniformNode extends UniformNode { @@ -22,5 +21,3 @@ class ArrayUniformNode extends UniformNode { } export default ArrayUniformNode; - -addNodeClass( ArrayUniformNode ); diff --git a/examples/jsm/nodes/core/AttributeNode.js b/examples/jsm/nodes/core/AttributeNode.js index 23b5b29f7ad861..d7a06ec505c776 100644 --- a/examples/jsm/nodes/core/AttributeNode.js +++ b/examples/jsm/nodes/core/AttributeNode.js @@ -1,6 +1,5 @@ -import Node, { addNodeClass } from './Node.js'; -import { varying } from './VaryingNode.js'; -import { nodeObject } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; +import VaryingNode from './VaryingNode.js'; class AttributeNode extends Node { @@ -74,7 +73,7 @@ class AttributeNode extends Node { } else { - const nodeVarying = varying( this ); + const nodeVarying = new VaryingNode( this ); return nodeVarying.build( builder, nodeAttribute.type ); @@ -93,7 +92,3 @@ class AttributeNode extends Node { } export default AttributeNode; - -export const attribute = ( name, nodeType ) => nodeObject( new AttributeNode( name, nodeType ) ); - -addNodeClass( AttributeNode ); diff --git a/examples/jsm/nodes/core/BypassNode.js b/examples/jsm/nodes/core/BypassNode.js index b1658fc191913c..a5e5ab944bb790 100644 --- a/examples/jsm/nodes/core/BypassNode.js +++ b/examples/jsm/nodes/core/BypassNode.js @@ -1,5 +1,4 @@ -import Node, { addNodeClass } from './Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; class BypassNode extends Node { @@ -37,9 +36,3 @@ class BypassNode extends Node { } export default BypassNode; - -export const bypass = nodeProxy( BypassNode ); - -addNodeElement( 'bypass', bypass ); - -addNodeClass( BypassNode ); diff --git a/examples/jsm/nodes/core/CacheNode.js b/examples/jsm/nodes/core/CacheNode.js index 7a084fc99d92bf..8623efdf30fd83 100644 --- a/examples/jsm/nodes/core/CacheNode.js +++ b/examples/jsm/nodes/core/CacheNode.js @@ -1,6 +1,5 @@ -import Node, { addNodeClass } from './Node.js'; +import Node from './Node.js'; import NodeCache from './NodeCache.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; class CacheNode extends Node { @@ -38,9 +37,3 @@ class CacheNode extends Node { } export default CacheNode; - -export const cache = nodeProxy( CacheNode ); - -addNodeElement( 'cache', cache ); - -addNodeClass( CacheNode ); diff --git a/examples/jsm/nodes/core/CodeNode.js b/examples/jsm/nodes/core/CodeNode.js index 2cf18442cd1872..bb571a76ac7526 100644 --- a/examples/jsm/nodes/core/CodeNode.js +++ b/examples/jsm/nodes/core/CodeNode.js @@ -1,5 +1,4 @@ -import Node, { addNodeClass } from './Node.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; class CodeNode extends Node { @@ -49,7 +48,3 @@ class CodeNode extends Node { } export default CodeNode; - -export const code = nodeProxy( CodeNode ); - -addNodeClass( CodeNode ); diff --git a/examples/jsm/nodes/core/ConstNode.js b/examples/jsm/nodes/core/ConstNode.js index 65c1d5df7b3b6d..b7069f582c8880 100644 --- a/examples/jsm/nodes/core/ConstNode.js +++ b/examples/jsm/nodes/core/ConstNode.js @@ -1,5 +1,4 @@ import InputNode from './InputNode.js'; -import { addNodeClass } from './Node.js'; class ConstNode extends InputNode { @@ -28,5 +27,3 @@ class ConstNode extends InputNode { } export default ConstNode; - -addNodeClass( ConstNode ); diff --git a/examples/jsm/nodes/core/ContextNode.js b/examples/jsm/nodes/core/ContextNode.js index 8b792c57cdb28a..869eb09c2730dd 100644 --- a/examples/jsm/nodes/core/ContextNode.js +++ b/examples/jsm/nodes/core/ContextNode.js @@ -1,5 +1,4 @@ -import Node, { addNodeClass } from './Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; class ContextNode extends Node { @@ -51,9 +50,3 @@ class ContextNode extends Node { } export default ContextNode; - -export const context = nodeProxy( ContextNode ); - -addNodeElement( 'context', context ); - -addNodeClass( ContextNode ); diff --git a/examples/jsm/nodes/core/ExpressionNode.js b/examples/jsm/nodes/core/ExpressionNode.js index ee7ce611b7f3cc..52bb63f84b71aa 100644 --- a/examples/jsm/nodes/core/ExpressionNode.js +++ b/examples/jsm/nodes/core/ExpressionNode.js @@ -1,28 +1,27 @@ -import Node, { addNodeClass } from './Node.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; class ExpressionNode extends Node { - constructor( snippet = '', nodeType = 'void' ) { + constructor( snipped = '', nodeType = 'void' ) { super( nodeType ); - this.snippet = snippet; + this.snipped = snipped; } generate( builder, output ) { const type = this.getNodeType( builder ); - const snippet = this.snippet; + const snipped = this.snipped; if ( type === 'void' ) { - builder.addFlowCode( snippet ); + builder.addFlowCode( snipped ); } else { - return builder.format( `( ${ snippet } )`, type, output ); + return builder.format( `( ${ snipped } )`, type, output ); } @@ -31,7 +30,3 @@ class ExpressionNode extends Node { } export default ExpressionNode; - -export const expression = nodeProxy( ExpressionNode ); - -addNodeClass( ExpressionNode ); diff --git a/examples/jsm/nodes/core/FunctionCallNode.js b/examples/jsm/nodes/core/FunctionCallNode.js index fc0b0c4e1633a1..1d257f9d4b4e89 100644 --- a/examples/jsm/nodes/core/FunctionCallNode.js +++ b/examples/jsm/nodes/core/FunctionCallNode.js @@ -1,6 +1,4 @@ import TempNode from './TempNode.js'; -import { addNodeClass } from './Node.js'; -import { addNodeElement, nodeArray, nodeObject, nodeObjects } from '../shadernode/ShaderNode.js'; class FunctionCallNode extends TempNode { @@ -82,15 +80,3 @@ class FunctionCallNode extends TempNode { } export default FunctionCallNode; - -export const call = ( func, ...params ) => { - - params = params.length > 1 || ( params[ 0 ] && params[ 0 ].isNode === true ) ? nodeArray( params ) : nodeObjects( params[ 0 ] ); - - return nodeObject( new FunctionCallNode( nodeObject( func ), params ) ); - -}; - -addNodeElement( 'call', call ); - -addNodeClass( FunctionCallNode ); diff --git a/examples/jsm/nodes/core/FunctionNode.js b/examples/jsm/nodes/core/FunctionNode.js index 3c762ed6741157..a7806ad88a8471 100644 --- a/examples/jsm/nodes/core/FunctionNode.js +++ b/examples/jsm/nodes/core/FunctionNode.js @@ -1,6 +1,5 @@ import CodeNode from './CodeNode.js'; -import { addNodeClass } from './Node.js'; -import { nodeObject } from '../shadernode/ShaderNode.js'; +import FunctionCallNode from './FunctionCallNode.js'; class FunctionNode extends CodeNode { @@ -42,6 +41,12 @@ class FunctionNode extends CodeNode { } + call( parameters = {} ) { + + return new FunctionCallNode( this, parameters ); + + } + generate( builder, output ) { super.generate( builder ); @@ -98,9 +103,3 @@ class FunctionNode extends CodeNode { } export default FunctionNode; - -export const func = ( code, includes ) => nodeObject( new FunctionNode( code, includes ) ); - -export const fn = ( code, includes ) => func( code, includes ).call; - -addNodeClass( FunctionNode ); diff --git a/examples/jsm/nodes/core/InputNode.js b/examples/jsm/nodes/core/InputNode.js index 511b2a02c16222..870d36e8223fd6 100644 --- a/examples/jsm/nodes/core/InputNode.js +++ b/examples/jsm/nodes/core/InputNode.js @@ -1,4 +1,4 @@ -import Node, { addNodeClass } from './Node.js'; +import Node from './Node.js'; import { getValueType, getValueFromType } from './NodeUtils.js'; class InputNode extends Node { @@ -10,7 +10,6 @@ class InputNode extends Node { this.isInputNode = true; this.value = value; - this.precision = null; } @@ -32,14 +31,6 @@ class InputNode extends Node { } - setPrecision( precision ) { - - this.precision = precision; - - return this; - - } - serialize( data ) { super.serialize( data ); @@ -51,8 +42,6 @@ class InputNode extends Node { data.valueType = getValueType( this.value ); data.nodeType = this.nodeType; - data.precision = this.precision; - } deserialize( data ) { @@ -62,8 +51,6 @@ class InputNode extends Node { this.nodeType = data.nodeType; this.value = Array.isArray( data.value ) ? getValueFromType( data.valueType, ...data.value ) : data.value; - this.precision = data.precision || null; - if ( this.value && this.value.fromArray ) this.value = this.value.fromArray( data.value ); } @@ -77,5 +64,3 @@ class InputNode extends Node { } export default InputNode; - -addNodeClass( InputNode ); diff --git a/examples/jsm/nodes/core/InstanceIndexNode.js b/examples/jsm/nodes/core/InstanceIndexNode.js index 8a86777d770c6f..0f995856b60589 100644 --- a/examples/jsm/nodes/core/InstanceIndexNode.js +++ b/examples/jsm/nodes/core/InstanceIndexNode.js @@ -1,5 +1,4 @@ -import Node, { addNodeClass } from './Node.js'; -import { nodeImmutable } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; class InstanceIndexNode extends Node { @@ -20,7 +19,3 @@ class InstanceIndexNode extends Node { } export default InstanceIndexNode; - -export const instanceIndex = nodeImmutable( InstanceIndexNode ); - -addNodeClass( InstanceIndexNode ); diff --git a/examples/jsm/nodes/core/LightingModel.js b/examples/jsm/nodes/core/LightingModel.js index 296a373e084232..4d1dc4635ac392 100644 --- a/examples/jsm/nodes/core/LightingModel.js +++ b/examples/jsm/nodes/core/LightingModel.js @@ -12,5 +12,3 @@ class LightingModel { } export default LightingModel; - -export const lightingModel = ( ...params ) => new LightingModel( ...params ); diff --git a/examples/jsm/nodes/core/Node.js b/examples/jsm/nodes/core/Node.js index f9162cb9060c9c..5692b0cbcc03b2 100644 --- a/examples/jsm/nodes/core/Node.js +++ b/examples/jsm/nodes/core/Node.js @@ -1,9 +1,7 @@ import { NodeUpdateType } from './constants.js'; -import { getNodeChildren, getCacheKey } from './NodeUtils.js'; +import { getNodesKeys, getCacheKey } from './NodeUtils.js'; import { MathUtils } from 'three'; -const NodeClasses = new Map(); - let _nodeId = 0; class Node { @@ -34,37 +32,50 @@ class Node { } - * getChildren() { + getChildren() { - const self = this; + const children = []; - for ( const { prop, childNode } of getNodeChildren( this ) ) { + for ( const property in this ) { - if ( prop.includes( '/' ) ) { + const object = this[ property ]; - const prop1 = prop.slice( 0, prop.indexOf( '/' ) ); - const prop2 = prop.slice( prop.indexOf( '/' ) + 1 ); - yield { childNode, replaceNode( node ) { self[ prop1 ][ prop2 ] = node; } }; + if ( Array.isArray( object ) === true ) { - } else { + for ( const child of object ) { - yield { childNode, replaceNode( node ) { self[ prop ] = node; } }; + if ( child && child.isNode === true ) { - } + children.push( child ); - } + } - } + } - traverse( callback, replaceNode = null ) { + } else if ( object && object.isNode === true ) { - callback( this, replaceNode ); - for ( const { childNode, replaceNode } of this.getChildren() ) { + children.push( object ); - childNode.traverse( callback, replaceNode ); + } else if ( typeof object === 'object' ) { + + for ( const property in object ) { + + const child = object[ property ]; + + if ( child && child.isNode === true ) { + + children.push( child ); + + } + + } + + } } + return children; + } getCacheKey() { @@ -104,7 +115,7 @@ class Node { const nodeProperties = builder.getNodeProperties( this ); - for ( const { childNode } of this.getChildren() ) { + for ( const childNode of this.getChildren() ) { nodeProperties[ '_node' + childNode.id ] = childNode; @@ -250,21 +261,7 @@ class Node { for ( const property of nodeKeys ) { - if ( Array.isArray( this[ property ] ) ) { - - inputNodes[ property ] = []; - - for ( const node of this[ property ] ) { - - inputNodes[ property ].push( node.toJSON( json.meta ).uuid ); - - } - - } else { - - inputNodes[ property ] = this[ property ].toJSON( json.meta ).uuid; - - } + inputNodes[ property ] = this[ property ].toJSON( json.meta ).uuid; } @@ -282,25 +279,9 @@ class Node { for ( const property in json.inputNodes ) { - if ( Array.isArray( json.inputNodes[ property ] ) ) { - - const inputArray = []; - - for ( const uuid of json.inputNodes[ property ] ) { - - inputArray.push( nodes[ uuid ] ); - - } - - this[ property ] = inputArray; - - } else { + const uuid = json.inputNodes[ property ]; - const uuid = json.inputNodes[ property ]; - - this[ property ] = nodes[ uuid ]; - - } + this[ property ] = nodes[ uuid ]; } @@ -340,7 +321,7 @@ class Node { } }; - if ( isRoot !== true ) meta.nodes[ data.uuid ] = data; + meta.nodes[ data.uuid ] = data; this.serialize( data ); @@ -385,24 +366,3 @@ class Node { } export default Node; - -export function addNodeClass( nodeClass ) { - - if ( typeof nodeClass !== 'function' || ! nodeClass.name ) throw new Error( `Node class ${ nodeClass.name } is not a class` ); - if ( NodeClasses.has( nodeClass.name ) ) throw new Error( `Redefinition of node class ${ nodeClass.name }` ); - - NodeClasses.set( nodeClass.name, nodeClass ); - -} - -export function createNodeFromType( type ) { - - const Class = NodeClasses.get( type ); - - if ( Class !== undefined ) { - - return new Class(); - - } - -}; diff --git a/examples/jsm/nodes/core/NodeBuilder.js b/examples/jsm/nodes/core/NodeBuilder.js index b174e6b6c84de1..895d09afcb634a 100644 --- a/examples/jsm/nodes/core/NodeBuilder.js +++ b/examples/jsm/nodes/core/NodeBuilder.js @@ -5,12 +5,16 @@ import NodeVar from './NodeVar.js'; import NodeCode from './NodeCode.js'; import NodeKeywords from './NodeKeywords.js'; import NodeCache from './NodeCache.js'; -import { NodeUpdateType, defaultBuildStages, shaderStages } from './constants.js'; +import { NodeUpdateType } from './constants.js'; import { REVISION, LinearEncoding, Color, Vector2, Vector3, Vector4 } from 'three'; -import { stack } from './StackNode.js'; -import { maxMipLevel } from '../utils/MaxMipLevelNode.js'; +import { mul, maxMipLevel } from '../shadernode/ShaderNodeElements.js'; + +export const defaultShaderStages = [ 'fragment', 'vertex' ]; +export const defaultBuildStages = [ 'construct', 'analyze', 'generate' ]; +export const shaderStages = [ ...defaultShaderStages, 'compute' ]; +export const vector = [ 'x', 'y', 'z', 'w' ]; const typeFromLength = new Map(); typeFromLength.set( 2, 'vec2' ); @@ -62,7 +66,7 @@ class NodeBuilder { this.context = { keywords: new NodeKeywords(), material: object.material, - getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => levelNode.mul( maxMipLevel( textureNode ) ) + getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => mul( levelNode, maxMipLevel( textureNode ) ) }; this.cache = new NodeCache(); @@ -447,12 +451,6 @@ class NodeBuilder { } - createStack() { - - return stack(); - - } - getDataFromNode( node, shaderStage = this.shaderStage ) { const cache = node.isGlobal( this ) ? this.globalCache : this.cache; diff --git a/examples/jsm/nodes/core/NodeUtils.js b/examples/jsm/nodes/core/NodeUtils.js index 03a330b38a21dc..45766f3e6caf3f 100644 --- a/examples/jsm/nodes/core/NodeUtils.js +++ b/examples/jsm/nodes/core/NodeUtils.js @@ -1,22 +1,18 @@ import { Color, Matrix3, Matrix4, Vector2, Vector3, Vector4 } from 'three'; -export function getCacheKey( object ) { +export const getCacheKey = ( object ) => { let cacheKey = '{'; if ( object.isNode === true ) { - cacheKey += `uuid:"${ object.uuid }"`; + cacheKey += `uuid:"${ object.uuid }",`; } - for ( const { prop, childNode } of getNodeChildren( object ) ) { + for ( const property of getNodesKeys( object ) ) { - // @TODO: Think about implement NodeArray and NodeObject. - - let childCacheKey = getCacheKey( childNode ); - if ( ! childCacheKey.includes( ',' ) ) childCacheKey = childCacheKey.slice( childCacheKey.indexOf( '"' ), childCacheKey.indexOf( '}' ) ); - cacheKey += `,${ prop }:${ childCacheKey }`; + cacheKey += `${ property }:${ object[ property ].getCacheKey() },`; } @@ -24,53 +20,29 @@ export function getCacheKey( object ) { return cacheKey; -} - -export function* getNodeChildren( node ) { - - for ( const property in node ) { - - const object = node[ property ]; - - if ( Array.isArray( object ) === true ) { - - for ( let i = 0; i < object.length; i++ ) { - - const child = object[ i ]; - - if ( child && child.isNode === true ) { +}; - yield { prop: property + '/' + i, childNode: child }; +export const getNodesKeys = ( object ) => { - } + const props = []; - } + for ( const name in object ) { - } else if ( object && object.isNode === true ) { + const value = object[ name ]; - yield { prop: property, childNode: object }; + if ( value && value.isNode === true ) { - } else if ( typeof object === 'object' ) { - - for ( const property2 in object ) { - - const child = object[ property2 ]; - - if ( child && child.isNode === true ) { - - yield { prop: property + '/' + property2, childNode: child }; - - } - - } + props.push( name ); } } -} + return props; + +}; -export function getValueType( value ) { +export const getValueType = ( value ) => { if ( typeof value === 'number' ) { @@ -108,9 +80,9 @@ export function getValueType( value ) { return null; -} +}; -export function getValueFromType( type, ...params ) { +export const getValueFromType = ( type, ...params ) => { const last4 = type ? type.slice( - 4 ) : undefined; @@ -150,4 +122,4 @@ export function getValueFromType( type, ...params ) { return null; -} +}; diff --git a/examples/jsm/nodes/core/PropertyNode.js b/examples/jsm/nodes/core/PropertyNode.js index fcef2ce390a09a..d765996a98b9b1 100644 --- a/examples/jsm/nodes/core/PropertyNode.js +++ b/examples/jsm/nodes/core/PropertyNode.js @@ -1,5 +1,4 @@ -import Node, { addNodeClass } from './Node.js'; -import { nodeImmutable, nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; class PropertyNode extends Node { @@ -41,13 +40,3 @@ class PropertyNode extends Node { } export default PropertyNode; - -export const property = ( name, nodeOrType ) => nodeObject( new PropertyNode( name, getConstNodeType( nodeOrType ) ) ); - -export const diffuseColor = nodeImmutable( PropertyNode, 'vec4', 'DiffuseColor' ); -export const roughness = nodeImmutable( PropertyNode, 'float', 'Roughness' ); -export const metalness = nodeImmutable( PropertyNode, 'float', 'Metalness' ); -export const specularColor = nodeImmutable( PropertyNode, 'color', 'SpecularColor' ); -export const shininess = nodeImmutable( PropertyNode, 'float', 'Shininess' ); - -addNodeClass( PropertyNode ); diff --git a/examples/jsm/nodes/core/StackNode.js b/examples/jsm/nodes/core/StackNode.js index f22d33d8021559..a2e6246958dd78 100644 --- a/examples/jsm/nodes/core/StackNode.js +++ b/examples/jsm/nodes/core/StackNode.js @@ -1,8 +1,7 @@ -import Node, { addNodeClass } from './Node.js'; -import { assign } from '../math/OperatorNode.js'; -import { bypass } from '../core/BypassNode.js'; -import { expression } from '../core/ExpressionNode.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; +import OperatorNode from '../math/OperatorNode.js'; +import BypassNode from '../core/BypassNode.js'; +import ExpressionNode from '../core/ExpressionNode.js'; class StackNode extends Node { @@ -25,7 +24,7 @@ class StackNode extends Node { add( node ) { - this.nodes.push( bypass( expression(), node ) ); + this.nodes.push( new BypassNode( new ExpressionNode(), node ) ); return this; @@ -33,7 +32,7 @@ class StackNode extends Node { assign( targetNode, sourceValue ) { - return this.add( assign( targetNode, sourceValue ) ); + return this.add( new OperatorNode( '=', targetNode, sourceValue ) ); } @@ -52,7 +51,3 @@ class StackNode extends Node { } export default StackNode; - -export const stack = nodeProxy( StackNode ); - -addNodeClass( StackNode ); diff --git a/examples/jsm/nodes/core/TempNode.js b/examples/jsm/nodes/core/TempNode.js index 6fb348853590cd..2d77db896bf785 100644 --- a/examples/jsm/nodes/core/TempNode.js +++ b/examples/jsm/nodes/core/TempNode.js @@ -1,4 +1,4 @@ -import Node, { addNodeClass } from './Node.js'; +import Node from './Node.js'; class TempNode extends Node { @@ -29,7 +29,7 @@ class TempNode extends Node { return builder.format( nodeData.propertyName, type, output ); - } else if ( builder.context.tempWrite !== false && type !== 'void' && output !== 'void' && this.hasDependencies( builder ) ) { + } else if ( builder.context.tempWrite !== false && type !== 'void ' && output !== 'void' && this.hasDependencies( builder ) ) { const snippet = super.build( builder, type ); @@ -54,5 +54,3 @@ class TempNode extends Node { } export default TempNode; - -addNodeClass( TempNode ); diff --git a/examples/jsm/nodes/core/UniformNode.js b/examples/jsm/nodes/core/UniformNode.js index db917216138e99..7bb713172ba2f5 100644 --- a/examples/jsm/nodes/core/UniformNode.js +++ b/examples/jsm/nodes/core/UniformNode.js @@ -1,6 +1,4 @@ import InputNode from './InputNode.js'; -import { addNodeClass } from './Node.js'; -import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js'; class UniformNode extends InputNode { @@ -46,16 +44,3 @@ class UniformNode extends InputNode { } export default UniformNode; - -export const uniform = ( arg1, arg2 ) => { - - const nodeType = getConstNodeType( arg2 || arg1 ); - - // @TODO: get ConstNode from .traverse() in the future - const value = ( arg1 && arg1.isNode === true ) ? ( arg1.node && arg1.node.value ) || arg1.value : arg1; - - return nodeObject( new UniformNode( value, nodeType ) ); - -}; - -addNodeClass( UniformNode ); diff --git a/examples/jsm/nodes/core/VarNode.js b/examples/jsm/nodes/core/VarNode.js index 61cef25512c041..3fe42ddbaf9b2c 100644 --- a/examples/jsm/nodes/core/VarNode.js +++ b/examples/jsm/nodes/core/VarNode.js @@ -1,5 +1,5 @@ -import Node, { addNodeClass } from './Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from './Node.js'; +import OperatorNode from '../math/OperatorNode.js'; class VarNode extends Node { @@ -12,19 +12,41 @@ class VarNode extends Node { } - assign( node ) { + op( op, ...params ) { - node.traverse( ( childNode, replaceNode ) => { + this.node = new OperatorNode( op, this.node, ...params ); - if ( replaceNode && childNode.uuid === this.uuid ) { + return this; - replaceNode( this.node ); + } - } + assign( ...params ) { - } ); - this.node = node; - return this; + return this.op( '=', ...params ); + + } + + add( ...params ) { + + return this.op( '+', ...params ); + + } + + sub( ...params ) { + + return this.op( '-', ...params ); + + } + + mul( ...params ) { + + return this.op( '*', ...params ); + + } + + div( ...params ) { + + return this.op( '/', ...params ); } @@ -79,11 +101,3 @@ class VarNode extends Node { } export default VarNode; - -export const label = nodeProxy( VarNode ); -export const temp = label; - -addNodeElement( 'label', label ); -addNodeElement( 'temp', temp ); - -addNodeClass( VarNode ); diff --git a/examples/jsm/nodes/core/VaryingNode.js b/examples/jsm/nodes/core/VaryingNode.js index e936c8336620ac..d40cf2ad352801 100644 --- a/examples/jsm/nodes/core/VaryingNode.js +++ b/examples/jsm/nodes/core/VaryingNode.js @@ -1,6 +1,5 @@ -import Node, { addNodeClass } from './Node.js'; +import Node from './Node.js'; import { NodeShaderStage } from './constants.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; class VaryingNode extends Node { @@ -61,9 +60,3 @@ class VaryingNode extends Node { } export default VaryingNode; - -export const varying = nodeProxy( VaryingNode ); - -addNodeElement( 'varying', varying ); - -addNodeClass( VaryingNode ); diff --git a/examples/jsm/nodes/core/constants.js b/examples/jsm/nodes/core/constants.js index 346013a5f7395c..454dca04621a37 100644 --- a/examples/jsm/nodes/core/constants.js +++ b/examples/jsm/nodes/core/constants.js @@ -19,8 +19,3 @@ export const NodeType = { MATRIX3: 'mat3', MATRIX4: 'mat4' }; - -export const defaultShaderStages = [ 'fragment', 'vertex' ]; -export const defaultBuildStages = [ 'construct', 'analyze', 'generate' ]; -export const shaderStages = [ ...defaultShaderStages, 'compute' ]; -export const vectorComponents = [ 'x', 'y', 'z', 'w' ]; diff --git a/examples/jsm/nodes/display/BlendModeNode.js b/examples/jsm/nodes/display/BlendModeNode.js index 56385fd45f3220..1a3c7ce0cf4221 100644 --- a/examples/jsm/nodes/display/BlendModeNode.js +++ b/examples/jsm/nodes/display/BlendModeNode.js @@ -1,11 +1,9 @@ -import TempNode from '../core/TempNode.js'; -import { EPSILON } from '../math/MathNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, ShaderNode, nodeProxy, vec3 } from '../shadernode/ShaderNode.js'; +import TempNode from '../core/Node.js'; +import { ShaderNode, EPSILON, vec3, sub, mul, div, cond, lessThan, equal, max } from '../shadernode/ShaderNodeBaseElements.js'; export const BurnNode = new ShaderNode( ( { base, blend } ) => { - const fn = ( c ) => blend[ c ].lessThan( EPSILON ).cond( blend[ c ], base[ c ].invert().div( blend[ c ] ).invert().max( 0 ) ); + const fn = ( c ) => cond( lessThan( blend[ c ], EPSILON ), blend[ c ], max( sub( 1.0, div( sub( 1.0, base[ c ] ), blend[ c ] ) ), 0 ) ); return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) ); @@ -13,7 +11,7 @@ export const BurnNode = new ShaderNode( ( { base, blend } ) => { export const DodgeNode = new ShaderNode( ( { base, blend } ) => { - const fn = ( c ) => blend[ c ].equal( 1.0 ).cond( blend[ c ], base[ c ].div( blend[ c ].invert() ).max( 0 ) ); + const fn = ( c ) => cond( equal( blend[ c ], 1.0 ), blend[ c ], max( div( base[ c ], sub( 1.0, blend[ c ] ) ), 0 ) ); return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) ); @@ -21,7 +19,7 @@ export const DodgeNode = new ShaderNode( ( { base, blend } ) => { export const ScreenNode = new ShaderNode( ( { base, blend } ) => { - const fn = ( c ) => base[ c ].invert().mul( blend[ c ].invert() ).invert(); + const fn = ( c ) => sub( 1.0, mul( sub( 1.0, base[ c ] ), sub( 1.0, blend[ c ] ) ) ); return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) ); @@ -29,7 +27,7 @@ export const ScreenNode = new ShaderNode( ( { base, blend } ) => { export const OverlayNode = new ShaderNode( ( { base, blend } ) => { - const fn = ( c ) => base[ c ].lessThan( 0.5 ).cond( base[ c ].mul( blend[ c ], 2.0 ), base[ c ].invert().mul( blend[ c ].invert() ).invert() ); + const fn = ( c ) => cond( lessThan( base[ c ], 0.5 ), mul( 2.0, base[ c ], blend[ c ] ), sub( 1.0, mul( sub( 1.0, base[ c ] ), sub( 1.0, blend[ c ] ) ) ) ); return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) ); @@ -85,15 +83,3 @@ BlendModeNode.SCREEN = 'screen'; BlendModeNode.OVERLAY = 'overlay'; export default BlendModeNode; - -export const burn = nodeProxy( BlendModeNode, BlendModeNode.BURN ); -export const dodge = nodeProxy( BlendModeNode, BlendModeNode.DODGE ); -export const overlay = nodeProxy( BlendModeNode, BlendModeNode.OVERLAY ); -export const screen = nodeProxy( BlendModeNode, BlendModeNode.SCREEN ); - -addNodeElement( 'burn', burn ); -addNodeElement( 'dodge', dodge ); -addNodeElement( 'overlay', overlay ); -addNodeElement( 'screen', screen ); - -addNodeClass( BlendModeNode ); diff --git a/examples/jsm/nodes/display/ColorAdjustmentNode.js b/examples/jsm/nodes/display/ColorAdjustmentNode.js index 0d16a13f7ccc1e..5f93761ffe2368 100644 --- a/examples/jsm/nodes/display/ColorAdjustmentNode.js +++ b/examples/jsm/nodes/display/ColorAdjustmentNode.js @@ -1,23 +1,20 @@ import TempNode from '../core/TempNode.js'; -import { dot, mix } from '../math/MathNode.js'; -import { add } from '../math/OperatorNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, ShaderNode, nodeProxy, float, vec3, mat3 } from '../shadernode/ShaderNode.js'; +import { ShaderNode, vec3, mat3, add, sub, mul, max, div, float, mix, cos, sin, atan2, sqrt, luminance } from '../shadernode/ShaderNodeBaseElements.js'; const saturationNode = new ShaderNode( ( { color, adjustment } ) => { - return luminance( color ).mix( color, adjustment ); + return mix( luminance( color ), color, adjustment ); } ); const vibranceNode = new ShaderNode( ( { color, adjustment } ) => { - const average = add( color.r, color.g, color.b ).div( 3.0 ); + const average = div( add( color.r, color.g, color.b ), 3.0 ); - const mx = color.r.max( color.g.max( color.b ) ); - const amt = mx.sub( average ).mul( adjustment ).mul( - 3.0 ); + const mx = max( color.r, max( color.g, color.b ) ); + const amt = mul( sub( mx, average ), mul( - 3.0, adjustment ) ); - return mix( color, mx, amt ); + return mix( color.rgb, vec3( mx ), amt ); } ); @@ -26,12 +23,12 @@ const hueNode = new ShaderNode( ( { color, adjustment } ) => { const RGBtoYIQ = mat3( 0.299, 0.587, 0.114, 0.595716, - 0.274453, - 0.321263, 0.211456, - 0.522591, 0.311135 ); const YIQtoRGB = mat3( 1.0, 0.9563, 0.6210, 1.0, - 0.2721, - 0.6474, 1.0, - 1.107, 1.7046 ); - const yiq = RGBtoYIQ.mul( color ); + const yiq = mul( RGBtoYIQ, color ); - const hue = yiq.z.atan2( yiq.y ).add( adjustment ); - const chroma = yiq.yz.length(); + const hue = add( atan2( yiq.z, yiq.y ), adjustment ); + const chroma = sqrt( add( mul( yiq.z, yiq.z ), mul( yiq.y, yiq.y ) ) ); - return YIQtoRGB.mul( vec3( yiq.x, chroma.mul( hue.cos() ), chroma.mul( hue.sin() ) ) ); + return mul( YIQtoRGB, vec3( yiq.x, mul( chroma, cos( hue ) ), mul( chroma, sin( hue ) ) ) ); } ); @@ -85,16 +82,3 @@ ColorAdjustmentNode.VIBRANCE = 'vibrance'; ColorAdjustmentNode.HUE = 'hue'; export default ColorAdjustmentNode; - -export const saturation = nodeProxy( ColorAdjustmentNode, ColorAdjustmentNode.SATURATION ); -export const vibrance = nodeProxy( ColorAdjustmentNode, ColorAdjustmentNode.VIBRANCE ); -export const hue = nodeProxy( ColorAdjustmentNode, ColorAdjustmentNode.HUE ); - -export const lumaCoeffs = vec3( 0.2125, 0.7154, 0.0721 ); -export const luminance = ( color, luma = lumaCoeffs ) => dot( color, luma ); - -addNodeElement( 'saturation', saturation ); -addNodeElement( 'vibrance', vibrance ); -addNodeElement( 'hue', hue ); - -addNodeClass( ColorAdjustmentNode ); diff --git a/examples/jsm/nodes/display/ColorSpaceNode.js b/examples/jsm/nodes/display/ColorSpaceNode.js index 4be871f5891934..37fda1851d60ba 100644 --- a/examples/jsm/nodes/display/ColorSpaceNode.js +++ b/examples/jsm/nodes/display/ColorSpaceNode.js @@ -1,7 +1,5 @@ -import TempNode from '../core/TempNode.js'; -import { mix } from '../math/MathNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, ShaderNode, nodeObject, vec4 } from '../shadernode/ShaderNode.js'; +import TempNode from '../core/Node.js'; +import { ShaderNode, vec3, pow, mul, sub, mix, vec4, lessThanEqual } from '../shadernode/ShaderNodeBaseElements.js'; import { LinearEncoding, sRGBEncoding } from 'three'; @@ -14,11 +12,12 @@ export const LinearToLinear = new ShaderNode( ( inputs ) => { export const LinearTosRGB = new ShaderNode( ( inputs ) => { const { value } = inputs; - const { rgb } = value; - const a = rgb.pow( 0.41666 ).mul( 1.055 ).sub( 0.055 ); - const b = rgb.mul( 12.92 ); - const factor = rgb.lessThanEqual( 0.0031308 ); + const rgb = value.rgb; + + const a = sub( mul( pow( value.rgb, vec3( 0.41666 ) ), 1.055 ), vec3( 0.055 ) ); + const b = mul( rgb, 12.92 ); + const factor = vec3( lessThanEqual( rgb, vec3( 0.0031308 ) ) ); const rgbResult = mix( a, b, factor ); @@ -65,9 +64,26 @@ class ColorSpaceNode extends TempNode { construct() { - const { method, node } = this; + const method = this.method; + const node = this.node; + + let outputNode = null; + + if ( method !== ColorSpaceNode.LINEAR_TO_LINEAR ) { + + const encodingFunctionNode = EncodingLib[ method ]; + + outputNode = encodingFunctionNode.call( { + value: node + } ); + + } else { - return EncodingLib[ method ].call( { value: node } ); + outputNode = node; + + } + + return outputNode; } @@ -77,9 +93,3 @@ ColorSpaceNode.LINEAR_TO_LINEAR = 'LinearToLinear'; ColorSpaceNode.LINEAR_TO_SRGB = 'LinearTosRGB'; export default ColorSpaceNode; - -export const colorSpace = ( node, encoding ) => nodeObject( new ColorSpaceNode( null, nodeObject( node ) ).fromEncoding( encoding ) ); - -addNodeElement( 'colorSpace', colorSpace ); - -addNodeClass( ColorSpaceNode ); diff --git a/examples/jsm/nodes/display/FrontFacingNode.js b/examples/jsm/nodes/display/FrontFacingNode.js index 762e2094dfe8ff..7e84cdcff66462 100644 --- a/examples/jsm/nodes/display/FrontFacingNode.js +++ b/examples/jsm/nodes/display/FrontFacingNode.js @@ -1,5 +1,4 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { nodeImmutable, float } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; class FrontFacingNode extends Node { @@ -20,8 +19,3 @@ class FrontFacingNode extends Node { } export default FrontFacingNode; - -export const frontFacing = nodeImmutable( FrontFacingNode ); -export const faceDirection = float( frontFacing ).mul( 2.0 ).sub( 1.0 ); - -addNodeClass( FrontFacingNode ); diff --git a/examples/jsm/nodes/display/NormalMapNode.js b/examples/jsm/nodes/display/NormalMapNode.js index 9869c69e98aef8..69cb7f6198e084 100644 --- a/examples/jsm/nodes/display/NormalMapNode.js +++ b/examples/jsm/nodes/display/NormalMapNode.js @@ -1,14 +1,5 @@ import TempNode from '../core/TempNode.js'; -import { add } from '../math/OperatorNode.js'; -import { bitangentView } from '../accessors/BitangentNode.js'; -import { modelNormalMatrix } from '../accessors/ModelNode.js'; -import { normalView } from '../accessors/NormalNode.js'; -import { positionView } from '../accessors/PositionNode.js'; -import { tangentView } from '../accessors/TangentNode.js'; -import { uv } from '../accessors/UVNode.js'; -import { faceDirection } from './FrontFacingNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { ShaderNode, nodeProxy, vec3, mat3 } from '../shadernode/ShaderNode.js'; +import { ShaderNode, positionView, normalView, uv, vec3, add, sub, mul, dFdx, dFdy, cross, max, dot, normalize, inversesqrt, faceDirection, modelNormalMatrix, TBNViewMatrix } from '../shadernode/ShaderNodeBaseElements.js'; import { TangentSpaceNormalMap, ObjectSpaceNormalMap } from 'three'; @@ -19,23 +10,23 @@ const perturbNormal2ArbNode = new ShaderNode( ( inputs ) => { const { eye_pos, surf_norm, mapN, uv } = inputs; - const q0 = eye_pos.dFdx(); - const q1 = eye_pos.dFdy(); - const st0 = uv.dFdx(); - const st1 = uv.dFdy(); + const q0 = dFdx( eye_pos.xyz ); + const q1 = dFdy( eye_pos.xyz ); + const st0 = dFdx( uv.st ); + const st1 = dFdy( uv.st ); const N = surf_norm; // normalized - const q1perp = q1.cross( N ); - const q0perp = N.cross( q0 ); + const q1perp = cross( q1, N ); + const q0perp = cross( N, q0 ); - const T = q1perp.mul( st0.x ).add( q0perp.mul( st1.x ) ); - const B = q1perp.mul( st0.y ).add( q0perp.mul( st1.y ) ); + const T = add( mul( q1perp, st0.x ), mul( q0perp, st1.x ) ); + const B = add( mul( q1perp, st0.y ), mul( q0perp, st1.y ) ); - const det = T.dot( T ).max( B.dot( B ) ); - const scale = faceDirection.mul( det.inversesqrt() ); + const det = max( dot( T, T ), dot( B, B ) ); + const scale = mul( faceDirection, inversesqrt( det ) ); - return add( T.mul( mapN.x, scale ), B.mul( mapN.y, scale ), N.mul( mapN.z ) ).normalize(); + return normalize( add( mul( T, mul( mapN.x, scale ) ), mul( B, mul( mapN.y, scale ) ), mul( N, mapN.z ) ) ); } ); @@ -56,11 +47,13 @@ class NormalMapNode extends TempNode { const { normalMapType, scaleNode } = this; - let normalMap = this.node.mul( 2.0 ).sub( 1.0 ); + const normalOP = mul( this.node, 2.0 ); + let normalMap = sub( normalOP, 1.0 ); if ( scaleNode !== null ) { - normalMap = vec3( normalMap.xy.mul( scaleNode ), normalMap.z ); + const normalMapScale = mul( normalMap.xy, scaleNode ); + normalMap = vec3( normalMapScale, normalMap.z ); } @@ -68,7 +61,7 @@ class NormalMapNode extends TempNode { if ( normalMapType === ObjectSpaceNormalMap ) { - outputNode = modelNormalMatrix.mul( normalMap ).normalize(); + outputNode = normalize( mul( modelNormalMatrix, normalMap ) ); } else if ( normalMapType === TangentSpaceNormalMap ) { @@ -76,7 +69,7 @@ class NormalMapNode extends TempNode { if ( tangent === true ) { - outputNode = TBNViewMatrix.mul( normalMap ).normalize(); + outputNode = normalize( mul( TBNViewMatrix, normalMap ) ); } else { @@ -98,9 +91,3 @@ class NormalMapNode extends TempNode { } export default NormalMapNode; - -export const normalMap = nodeProxy( NormalMapNode ); - -export const TBNViewMatrix = mat3( tangentView, bitangentView, normalView ); - -addNodeClass( NormalMapNode ); diff --git a/examples/jsm/nodes/display/PosterizeNode.js b/examples/jsm/nodes/display/PosterizeNode.js index 9b719c7bea2302..6c73e0d96d019c 100644 --- a/examples/jsm/nodes/display/PosterizeNode.js +++ b/examples/jsm/nodes/display/PosterizeNode.js @@ -1,6 +1,5 @@ -import TempNode from '../core/TempNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import TempNode from '../core/Node.js'; +import { mul, floor, reciprocal } from '../shadernode/ShaderNodeBaseElements.js'; class PosterizeNode extends TempNode { @@ -17,16 +16,10 @@ class PosterizeNode extends TempNode { const { sourceNode, stepsNode } = this; - return sourceNode.mul( stepsNode ).floor().div( stepsNode ); + return mul( floor( mul( sourceNode, stepsNode ) ), reciprocal( stepsNode ) ); } } export default PosterizeNode; - -export const posterize = nodeProxy( PosterizeNode ); - -addNodeElement( 'posterize', posterize ); - -addNodeClass( PosterizeNode ); diff --git a/examples/jsm/nodes/display/ToneMappingNode.js b/examples/jsm/nodes/display/ToneMappingNode.js index 04410f5d9309ea..db1900b12aac0c 100644 --- a/examples/jsm/nodes/display/ToneMappingNode.js +++ b/examples/jsm/nodes/display/ToneMappingNode.js @@ -1,36 +1,35 @@ -import TempNode from '../core/TempNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { ShaderNode, nodeObject, float, vec3, mat3 } from '../shadernode/ShaderNode.js'; +import TempNode from '../core/Node.js'; +import { ShaderNode, vec3, mat3, float, clamp, max, pow } from '../shadernode/ShaderNodeBaseElements.js'; import { NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping } from 'three'; // exposure only -const LinearToneMappingNode = new ShaderNode( ( { color, exposure } ) => { +export const LinearToneMappingNode = new ShaderNode( ( { color, exposure } ) => { return color.mul( exposure ); } ); // source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf -const ReinhardToneMappingNode = new ShaderNode( ( { color, exposure } ) => { +export const ReinhardToneMappingNode = new ShaderNode( ( { color, exposure } ) => { color = color.mul( exposure ); - return color.div( color.add( 1.0 ) ).clamp(); + return clamp( color.div( vec3( 1.0 ).add( color ) ) ); } ); // source: http://filmicworlds.com/blog/filmic-tonemapping-operators/ -const OptimizedCineonToneMappingNode = new ShaderNode( ( { color, exposure } ) => { +export const OptimizedCineonToneMappingNode = new ShaderNode( ( { color, exposure } ) => { // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson color = color.mul( exposure ); - color = color.sub( 0.004 ).max( 0.0 ); + color = max( vec3( 0.0 ), color.sub( 0.004 ) ); const a = color.mul( color.mul( 6.2 ).add( 0.5 ) ); const b = color.mul( color.mul( 6.2 ).add( 1.7 ) ).add( 0.06 ); - return a.div( b ).pow( 2.2 ); + return pow( a.div( b ), vec3( 2.2 ) ); } ); @@ -71,7 +70,7 @@ const ACESFilmicToneMappingNode = new ShaderNode( ( { color, exposure } ) => { color = ACESOutputMat.mul( color ); // Clamp to [0, 1] - return color.clamp(); + return clamp( color ); } ); @@ -126,7 +125,3 @@ class ToneMappingNode extends TempNode { } export default ToneMappingNode; - -export const toneMapping = ( mapping, exposure, color ) => nodeObject( new ToneMappingNode( mapping, nodeObject( exposure ), nodeObject( color ) ) ); - -addNodeClass( ToneMappingNode ); diff --git a/examples/jsm/nodes/display/ViewportNode.js b/examples/jsm/nodes/display/ViewportNode.js index 6b6213d337c2c5..bd6edd16cda610 100644 --- a/examples/jsm/nodes/display/ViewportNode.js +++ b/examples/jsm/nodes/display/ViewportNode.js @@ -1,9 +1,7 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { NodeUpdateType } from '../core/constants.js'; -import { uniform } from '../core/UniformNode.js'; -import { nodeImmutable, vec2 } from '../shadernode/ShaderNode.js'; - +import Node from '../core/Node.js'; +import { uniform, div, vec2, invert } from '../shadernode/ShaderNodeBaseElements.js'; import { Vector2 } from 'three'; +import { NodeUpdateType } from '../core/constants.js'; let resolution; @@ -64,15 +62,15 @@ class ViewportNode extends Node { const coordinateNode = vec2( new ViewportNode( ViewportNode.COORDINATE ) ); const resolutionNode = new ViewportNode( ViewportNode.RESOLUTION ); - output = coordinateNode.div( resolutionNode ); + output = div( coordinateNode, resolutionNode ); let outX = output.x; let outY = output.y; - if ( /top/i.test( scope ) && builder.isFlipY() ) outY = outY.invert(); - else if ( /bottom/i.test( scope ) && builder.isFlipY() === false ) outY = outY.invert(); + if ( /top/i.test( scope ) && builder.isFlipY() ) outY = invert( outY ); + else if ( /bottom/i.test( scope ) && builder.isFlipY() === false ) outY = invert( outY ); - if ( /right/i.test( scope ) ) outX = outX.invert(); + if ( /right/i.test( scope ) ) outX = invert( outX ); output = vec2( outX, outY ); @@ -104,12 +102,3 @@ ViewportNode.TOP_RIGHT = 'topRight'; ViewportNode.BOTTOM_RIGHT = 'bottomRight'; export default ViewportNode; - -export const viewportCoordinate = nodeImmutable( ViewportNode, ViewportNode.COORDINATE ); -export const viewportResolution = nodeImmutable( ViewportNode, ViewportNode.RESOLUTION ); -export const viewportTopLeft = nodeImmutable( ViewportNode, ViewportNode.TOP_LEFT ); -export const viewportBottomLeft = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_LEFT ); -export const viewportTopRight = nodeImmutable( ViewportNode, ViewportNode.TOP_RIGHT ); -export const viewportBottomRight = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_RIGHT ); - -addNodeClass( ViewportNode ); diff --git a/examples/jsm/nodes/fog/FogExp2Node.js b/examples/jsm/nodes/fog/FogExp2Node.js index f46e4be0d34406..596cd032064cc6 100644 --- a/examples/jsm/nodes/fog/FogExp2Node.js +++ b/examples/jsm/nodes/fog/FogExp2Node.js @@ -1,7 +1,5 @@ import FogNode from './FogNode.js'; -import { positionView } from '../accessors/PositionNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import { sub, exp, mul, negate, positionView } from '../shadernode/ShaderNodeBaseElements.js'; class FogExp2Node extends FogNode { @@ -17,19 +15,13 @@ class FogExp2Node extends FogNode { construct() { - const depthNode = positionView.z.negate(); + const depthNode = negate( positionView.z ); const densityNode = this.densityNode; - this.factorNode = densityNode.mul( densityNode, depthNode, depthNode ).negate().exp().invert(); + this.factorNode = sub( 1.0, exp( mul( negate( densityNode ), densityNode, depthNode, depthNode ) ) ); } } export default FogExp2Node; - -export const densityFog = nodeProxy( FogExp2Node ); - -addNodeElement( 'densityFog', densityFog ); - -addNodeClass( FogExp2Node ); diff --git a/examples/jsm/nodes/fog/FogNode.js b/examples/jsm/nodes/fog/FogNode.js index 481f20adb7d55e..292a1878cf5d72 100644 --- a/examples/jsm/nodes/fog/FogNode.js +++ b/examples/jsm/nodes/fog/FogNode.js @@ -1,5 +1,5 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import MathNode from '../math/MathNode.js'; class FogNode extends Node { @@ -16,7 +16,7 @@ class FogNode extends Node { mix( outputNode ) { - return outputNode.mix( this.colorNode, this ); + return new MathNode( MathNode.MIX, outputNode, this.colorNode, this ); } @@ -29,9 +29,3 @@ class FogNode extends Node { } export default FogNode; - -export const fog = nodeProxy( FogNode ); - -addNodeElement( 'fog', fog ); - -addNodeClass( FogNode ); diff --git a/examples/jsm/nodes/fog/FogRangeNode.js b/examples/jsm/nodes/fog/FogRangeNode.js index e33e368d087290..3e81a81fe6efb2 100644 --- a/examples/jsm/nodes/fog/FogRangeNode.js +++ b/examples/jsm/nodes/fog/FogRangeNode.js @@ -1,8 +1,5 @@ import FogNode from './FogNode.js'; -import { smoothstep } from '../math/MathNode.js'; -import { positionView } from '../accessors/PositionNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import { smoothstep, negate, positionView } from '../shadernode/ShaderNodeBaseElements.js'; class FogRangeNode extends FogNode { @@ -19,16 +16,10 @@ class FogRangeNode extends FogNode { construct() { - this.factorNode = smoothstep( this.nearNode, this.farNode, positionView.z.negate() ); + this.factorNode = smoothstep( this.nearNode, this.farNode, negate( positionView.z ) ); } } export default FogRangeNode; - -export const rangeFog = nodeProxy( FogRangeNode ); - -addNodeElement( 'rangeFog', rangeFog ); - -addNodeClass( FogRangeNode ); diff --git a/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js b/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js index 5db86b9b7dac1a..f8833996cd616f 100644 --- a/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +++ b/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js @@ -1,29 +1,26 @@ import F_Schlick from './F_Schlick.js'; -import { shininess, specularColor } from '../../core/PropertyNode.js'; -import { transformedNormalView } from '../../accessors/NormalNode.js'; -import { positionViewDirection } from '../../accessors/PositionNode.js'; -import { ShaderNode, float } from '../../shadernode/ShaderNode.js'; +import { ShaderNode, shininess, specularColor, float, add, clamp, dot, mul, normalize, positionViewDirection, transformedNormalView } from '../../shadernode/ShaderNodeBaseElements.js'; const G_BlinnPhong_Implicit = () => float( 0.25 ); const D_BlinnPhong = new ShaderNode( ( { dotNH } ) => { - return shininess.mul( 0.5 / Math.PI ).add( 1.0 ).mul( dotNH.pow( shininess ) ); + return shininess.mul( 1 / Math.PI ).mul( 0.5 ).add( 1.0 ).mul( dotNH.pow( shininess ) ); } ); const BRDF_BlinnPhong = new ShaderNode( ( { lightDirection } ) => { - const halfDir = lightDirection.add( positionViewDirection ).normalize(); + const halfDir = normalize( add( lightDirection, positionViewDirection ) ); - const dotNH = transformedNormalView.dot( halfDir ).clamp(); - const dotVH = positionViewDirection.dot( halfDir ).clamp(); + const dotNH = clamp( dot( transformedNormalView, halfDir ) ); + const dotVH = clamp( dot( positionViewDirection, halfDir ) ); const F = F_Schlick.call( { f0: specularColor, f90: 1.0, dotVH } ); const G = G_BlinnPhong_Implicit(); const D = D_BlinnPhong.call( { dotNH } ); - return F.mul( G ).mul( D ); + return mul( F, G, D ); } ); diff --git a/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js b/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js index cf2728078018c9..145752933bdddd 100644 --- a/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +++ b/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js @@ -1,29 +1,32 @@ import F_Schlick from './F_Schlick.js'; import V_GGX_SmithCorrelated from './V_GGX_SmithCorrelated.js'; import D_GGX from './D_GGX.js'; -import { transformedNormalView } from '../../accessors/NormalNode.js'; -import { positionViewDirection } from '../../accessors/PositionNode.js'; -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { + ShaderNode, dotNV, add, mul, clamp, dot, pow2, normalize, + transformedNormalView, positionViewDirection +} from '../../shadernode/ShaderNodeBaseElements.js'; // GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility const BRDF_GGX = new ShaderNode( ( inputs ) => { const { lightDirection, f0, f90, roughness } = inputs; - const alpha = roughness.pow2(); // UE4's roughness + const alpha = pow2( roughness ); // UE4's roughness - const halfDir = lightDirection.add( positionViewDirection ).normalize(); + const halfDir = normalize( add( lightDirection, positionViewDirection ) ); - const dotNL = transformedNormalView.dot( lightDirection ).clamp(); - const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); - const dotNH = transformedNormalView.dot( halfDir ).clamp(); - const dotVH = positionViewDirection.dot( halfDir ).clamp(); + const dotNL = clamp( dot( transformedNormalView, lightDirection ) ); + //const dotNV = clamp( dot( transformedNormalView, positionViewDirection ) ); + const dotNH = clamp( dot( transformedNormalView, halfDir ) ); + const dotVH = clamp( dot( positionViewDirection, halfDir ) ); const F = F_Schlick.call( { f0, f90, dotVH } ); + const V = V_GGX_SmithCorrelated.call( { alpha, dotNL, dotNV } ); + const D = D_GGX.call( { alpha, dotNH } ); - return F.mul( V ).mul( D ); + return mul( F, mul( V, D ) ); } ); // validated diff --git a/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js b/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js index 3b7a2bb0ce2c01..8b8ea744072e34 100644 --- a/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +++ b/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js @@ -1,8 +1,8 @@ -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { ShaderNode, mul } from '../../shadernode/ShaderNodeBaseElements.js'; const BRDF_Lambert = new ShaderNode( ( inputs ) => { - return inputs.diffuseColor.mul( 1 / Math.PI ); // punctual light + return mul( 1 / Math.PI, inputs.diffuseColor ); // punctual light } ); // validated diff --git a/examples/jsm/nodes/functions/BSDF/DFGApprox.js b/examples/jsm/nodes/functions/BSDF/DFGApprox.js index 77343b21d03efb..18d5a582092306 100644 --- a/examples/jsm/nodes/functions/BSDF/DFGApprox.js +++ b/examples/jsm/nodes/functions/BSDF/DFGApprox.js @@ -1,6 +1,6 @@ -import { transformedNormalView } from '../../accessors/NormalNode.js'; -import { positionViewDirection } from '../../accessors/PositionNode.js'; -import { ShaderNode, vec2, vec4 } from '../../shadernode/ShaderNode.js'; +import { + ShaderNode, dotNV, vec2, vec4, mul, min +} from '../../shadernode/ShaderNodeElements.js'; // Analytical approximation of the DFG LUT, one half of the // split-sum approximation used in indirect specular lighting. @@ -16,9 +16,7 @@ const DFGApprox = new ShaderNode( ( inputs ) => { const r = roughness.mul( c0 ).add( c1 ); - const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); - - const a004 = r.x.mul( r.x ).min( dotNV.mul( - 9.28 ).exp2() ).mul( r.x ).add( r.y ); + const a004 = min( mul( r.x, r.x ), dotNV.mul( - 9.28 ).exp2() ).mul( r.x ).add( r.y ); const fab = vec2( - 1.04, 1.04 ).mul( a004 ).add( r.zw ); diff --git a/examples/jsm/nodes/functions/BSDF/D_GGX.js b/examples/jsm/nodes/functions/BSDF/D_GGX.js index 4c45f0428569fb..3d4331c74407d3 100644 --- a/examples/jsm/nodes/functions/BSDF/D_GGX.js +++ b/examples/jsm/nodes/functions/BSDF/D_GGX.js @@ -1,4 +1,4 @@ -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { ShaderNode, add, sub, mul, div, pow2 } from '../../shadernode/ShaderNodeBaseElements.js'; // Microfacet Models for Refraction through Rough Surfaces - equation (33) // http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html @@ -7,11 +7,11 @@ const D_GGX = new ShaderNode( ( inputs ) => { const { alpha, dotNH } = inputs; - const a2 = alpha.pow2(); + const a2 = pow2( alpha ); - const denom = dotNH.pow2().mul( a2.invert() ).invert(); // avoid alpha = 0 with dotNH = 1 + const denom = add( mul( pow2( dotNH ), sub( a2, 1.0 ) ), 1.0 ); // avoid alpha = 0 with dotNH = 1 - return a2.div( denom.pow2() ).mul( 1 / Math.PI ); + return mul( 1 / Math.PI, div( a2, pow2( denom ) ) ); } ); // validated diff --git a/examples/jsm/nodes/functions/BSDF/F_Schlick.js b/examples/jsm/nodes/functions/BSDF/F_Schlick.js index 14f374f352c504..2ebdea59331c40 100644 --- a/examples/jsm/nodes/functions/BSDF/F_Schlick.js +++ b/examples/jsm/nodes/functions/BSDF/F_Schlick.js @@ -1,4 +1,4 @@ -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { ShaderNode, sub } from '../../shadernode/ShaderNodeBaseElements.js'; const F_Schlick = new ShaderNode( ( inputs ) => { @@ -11,7 +11,7 @@ const F_Schlick = new ShaderNode( ( inputs ) => { // https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf const fresnel = dotVH.mul( - 5.55473 ).sub( 6.98316 ).mul( dotVH ).exp2(); - return f0.mul( fresnel.invert() ).add( f90.mul( fresnel ) ); + return f0.mul( sub( 1.0, fresnel ) ).add( f90.mul( fresnel ) ); } ); // validated diff --git a/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js b/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js index a72b901b96e125..5c2341481a0dae 100644 --- a/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +++ b/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js @@ -1,6 +1,4 @@ -import { div } from '../../math/OperatorNode.js'; -import { EPSILON } from '../../math/MathNode.js'; -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { ShaderNode, add, sub, mul, div, pow2, max, sqrt, EPSILON } from '../../shadernode/ShaderNodeBaseElements.js'; // Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2 // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf @@ -8,12 +6,12 @@ const V_GGX_SmithCorrelated = new ShaderNode( ( inputs ) => { const { alpha, dotNL, dotNV } = inputs; - const a2 = alpha.pow2(); + const a2 = pow2( alpha ); - const gv = dotNL.mul( a2.add( a2.invert().mul( dotNV.pow2() ) ).sqrt() ); - const gl = dotNV.mul( a2.add( a2.invert().mul( dotNL.pow2() ) ).sqrt() ); + const gv = mul( dotNL, sqrt( add( a2, mul( sub( 1.0, a2 ), pow2( dotNV ) ) ) ) ); + const gl = mul( dotNV, sqrt( add( a2, mul( sub( 1.0, a2 ), pow2( dotNL ) ) ) ) ); - return div( 0.5, gv.add( gl ).max( EPSILON ) ); + return div( 0.5, max( add( gv, gl ), EPSILON ) ); } ); // validated diff --git a/examples/jsm/nodes/functions/PhongLightingModel.js b/examples/jsm/nodes/functions/PhongLightingModel.js index 39fcb19ed76e27..5b9f5293e9f608 100644 --- a/examples/jsm/nodes/functions/PhongLightingModel.js +++ b/examples/jsm/nodes/functions/PhongLightingModel.js @@ -1,25 +1,26 @@ import BRDF_Lambert from './BSDF/BRDF_Lambert.js'; import BRDF_BlinnPhong from './BSDF/BRDF_BlinnPhong.js'; -import { lightingModel } from '../core/LightingModel.js'; -import { diffuseColor } from '../core/PropertyNode.js'; -import { materialReflectivity } from '../accessors/MaterialNode.js'; -import { transformedNormalView } from '../accessors/NormalNode.js'; -import { ShaderNode } from '../shadernode/ShaderNode.js'; + +import { + ShaderNode, + mul, clamp, dot, transformedNormalView, + diffuseColor, materialReflectivity, lightingModel +} from '../shadernode/ShaderNodeElements.js'; const RE_Direct_BlinnPhong = new ShaderNode( ( { lightDirection, lightColor, reflectedLight } ) => { - const dotNL = transformedNormalView.dot( lightDirection ).clamp(); - const irradiance = dotNL.mul( lightColor ); + const dotNL = clamp( dot( transformedNormalView, lightDirection ) ); + const irradiance = mul( dotNL, lightColor ); - reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert.call( { diffuseColor: diffuseColor.rgb } ) ) ); + reflectedLight.directDiffuse.add( mul( irradiance, BRDF_Lambert.call( { diffuseColor: diffuseColor.rgb } ) ) ); - reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_BlinnPhong.call( { lightDirection } ) ).mul( materialReflectivity ) ); + reflectedLight.directSpecular.add( irradiance.mul( BRDF_BlinnPhong.call( { lightDirection } ) ).mul( materialReflectivity ) ); } ); const RE_IndirectDiffuse_BlinnPhong = new ShaderNode( ( { irradiance, reflectedLight } ) => { - reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert.call( { diffuseColor } ) ) ); + reflectedLight.indirectDiffuse.add( irradiance.mul( BRDF_Lambert.call( { diffuseColor } ) ) ); } ); diff --git a/examples/jsm/nodes/functions/PhysicalLightingModel.js b/examples/jsm/nodes/functions/PhysicalLightingModel.js index 5935422fe1a428..95ff5be08a4865 100644 --- a/examples/jsm/nodes/functions/PhysicalLightingModel.js +++ b/examples/jsm/nodes/functions/PhysicalLightingModel.js @@ -1,30 +1,30 @@ import BRDF_Lambert from './BSDF/BRDF_Lambert.js'; import BRDF_GGX from './BSDF/BRDF_GGX.js'; import DFGApprox from './BSDF/DFGApprox.js'; -import { lightingModel } from '../core/LightingModel.js'; -import { temp } from '../core/VarNode.js'; -import { diffuseColor, specularColor, roughness } from '../core/PropertyNode.js'; -import { transformedNormalView } from '../accessors/NormalNode.js'; -import { positionViewDirection } from '../accessors/PositionNode.js'; -import { ShaderNode, float, vec3 } from '../shadernode/ShaderNode.js'; +import { + ShaderNode, + vec3, mul, clamp, add, sub, dot, div, transformedNormalView, + pow, exp2, dotNV, + diffuseColor, specularColor, roughness, temp, lightingModel +} from '../shadernode/ShaderNodeElements.js'; // Fdez-Agüera's "Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting" // Approximates multiscattering in order to preserve energy. // http://www.jcgt.org/published/0008/01/03/ -const computeMultiscattering = ( singleScatter, multiScatter, specularF90 = float( 1 ) ) => { +const computeMultiscattering = ( singleScatter, multiScatter, specularF90 = 1 ) => { const fab = DFGApprox.call( { roughness } ); - const FssEss = specularColor.mul( fab.x ).add( specularF90.mul( fab.y ) ); + const FssEss = add( mul( specularColor, fab.x ), mul( specularF90, fab.y ) ); - const Ess = fab.x.add( fab.y ); - const Ems = Ess.invert(); + const Ess = add( fab.x, fab.y ); + const Ems = sub( 1.0, Ess ); - const Favg = specularColor.add( specularColor.invert().mul( 0.047619 ) ); // 1/21 - const Fms = FssEss.mul( Favg ).div( Ems.mul( Favg ).invert() ); + const Favg = add( specularColor, mul( sub( 1.0, specularColor ), 0.047619 ) ); // 1/21 + const Fms = div( mul( FssEss, Favg ), sub( 1.0, mul( Ems, Favg ) ) ); - singleScatter.addAssign( FssEss ); - multiScatter.addAssign( Fms.mul( Ems ) ); + singleScatter.add( FssEss ); + multiScatter.add( mul( Fms, Ems ) ); }; @@ -36,16 +36,16 @@ const RE_IndirectSpecular_Physical = new ShaderNode( ( inputs ) => { const singleScattering = temp( vec3() ); const multiScattering = temp( vec3() ); - const cosineWeightedIrradiance = iblIrradiance.mul( 1 / Math.PI ); + const cosineWeightedIrradiance = mul( iblIrradiance, 1 / Math.PI ); computeMultiscattering( singleScattering, multiScattering ); - const diffuse = diffuseColor.mul( singleScattering.add( multiScattering ).invert() ); + const diffuse = mul( diffuseColor, sub( 1.0, add( singleScattering, multiScattering ) ) ); - reflectedLight.indirectSpecular.addAssign( radiance.mul( singleScattering ) ); - reflectedLight.indirectSpecular.addAssign( multiScattering.mul( cosineWeightedIrradiance ) ); + reflectedLight.indirectSpecular.add( mul( radiance, singleScattering ) ); + reflectedLight.indirectSpecular.add( mul( multiScattering, cosineWeightedIrradiance ) ); - reflectedLight.indirectDiffuse.addAssign( diffuse.mul( cosineWeightedIrradiance ) ); + reflectedLight.indirectDiffuse.add( mul( diffuse, cosineWeightedIrradiance ) ); } ); @@ -53,7 +53,7 @@ const RE_IndirectDiffuse_Physical = new ShaderNode( ( inputs ) => { const { irradiance, reflectedLight } = inputs; - reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert.call( { diffuseColor } ) ) ); + reflectedLight.indirectDiffuse.add( mul( irradiance, BRDF_Lambert.call( { diffuseColor } ) ) ); } ); @@ -61,27 +61,25 @@ const RE_Direct_Physical = new ShaderNode( ( inputs ) => { const { lightDirection, lightColor, reflectedLight } = inputs; - const dotNL = transformedNormalView.dot( lightDirection ).clamp(); - const irradiance = dotNL.mul( lightColor ); + const dotNL = clamp( dot( transformedNormalView, lightDirection ) ); + const irradiance = mul( dotNL, lightColor ); - reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert.call( { diffuseColor: diffuseColor.rgb } ) ) ); + reflectedLight.directDiffuse.add( mul( irradiance, BRDF_Lambert.call( { diffuseColor: diffuseColor.rgb } ) ) ); - reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX.call( { lightDirection, f0: specularColor, f90: 1, roughness } ) ) ); + reflectedLight.directSpecular.add( mul( irradiance, BRDF_GGX.call( { lightDirection, f0: specularColor, f90: 1, roughness } ) ) ); } ); const RE_AmbientOcclusion_Physical = new ShaderNode( ( { ambientOcclusion, reflectedLight } ) => { - const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); + const aoNV = add( dotNV, ambientOcclusion ); + const aoExp = exp2( sub( mul( - 16.0, roughness ), 1.0 ) ); - const aoNV = dotNV.add( ambientOcclusion ); - const aoExp = roughness.mul( - 16.0 ).invert().negate().exp2(); + const aoNode = clamp( add( sub( pow( aoNV, aoExp ), 1.0 ), ambientOcclusion ) ); - const aoNode = ambientOcclusion.sub( aoNV.pow( aoExp ).invert() ).clamp(); + reflectedLight.indirectDiffuse.mul( ambientOcclusion ); - reflectedLight.indirectDiffuse.mulAssign( ambientOcclusion ); - - reflectedLight.indirectSpecular.mulAssign( aoNode ); + reflectedLight.indirectSpecular.mul( aoNode ); } ); diff --git a/examples/jsm/nodes/functions/light/getDistanceAttenuation.js b/examples/jsm/nodes/functions/light/getDistanceAttenuation.js index bfa6e436825f35..b2f4034835bfee 100644 --- a/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +++ b/examples/jsm/nodes/functions/light/getDistanceAttenuation.js @@ -1,4 +1,6 @@ -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { + ShaderNode, div, max, sub, mul, clamp, pow, pow2, pow4, cond, greaterThan +} from '../../shadernode/ShaderNodeBaseElements.js'; const getDistanceAttenuation = new ShaderNode( ( inputs ) => { @@ -7,10 +9,11 @@ const getDistanceAttenuation = new ShaderNode( ( inputs ) => { // based upon Frostbite 3 Moving to Physically-based Rendering // page 32, equation 26: E[window1] // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf - const distanceFalloff = lightDistance.pow( decayExponent ).max( 0.01 ).reciprocal(); + const distanceFalloff = div( 1.0, max( pow( lightDistance, decayExponent ), 0.01 ) ); - return cutoffDistance.greaterThan( 0 ).cond( - distanceFalloff.mul( lightDistance.div( cutoffDistance ).pow4().invert().clamp().pow2() ), + return cond( + greaterThan( cutoffDistance, 0 ), + mul( distanceFalloff, pow2( clamp( sub( 1.0, pow4( div( lightDistance, cutoffDistance ) ) ) ) ) ), distanceFalloff ); diff --git a/examples/jsm/nodes/functions/material/getGeometryRoughness.js b/examples/jsm/nodes/functions/material/getGeometryRoughness.js index d55b2b22d0589a..e2cc8b28788317 100644 --- a/examples/jsm/nodes/functions/material/getGeometryRoughness.js +++ b/examples/jsm/nodes/functions/material/getGeometryRoughness.js @@ -1,10 +1,9 @@ -import { normalGeometry } from '../../accessors/NormalNode.js'; -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { ShaderNode, max, abs, dFdx, dFdy, normalGeometry } from '../../shadernode/ShaderNodeBaseElements.js'; const getGeometryRoughness = new ShaderNode( () => { - const dxy = normalGeometry.dFdx().abs().max( normalGeometry.dFdy().abs() ); - const geometryRoughness = dxy.x.max( dxy.y ).max( dxy.z ); + const dxy = max( abs( dFdx( normalGeometry ) ), abs( dFdy( normalGeometry ) ) ); + const geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); return geometryRoughness; diff --git a/examples/jsm/nodes/functions/material/getRoughness.js b/examples/jsm/nodes/functions/material/getRoughness.js index 728d57136127aa..15cbbf02b051e6 100644 --- a/examples/jsm/nodes/functions/material/getRoughness.js +++ b/examples/jsm/nodes/functions/material/getRoughness.js @@ -1,5 +1,5 @@ import getGeometryRoughness from './getGeometryRoughness.js'; -import { ShaderNode } from '../../shadernode/ShaderNode.js'; +import { ShaderNode, add, max, min } from '../../shadernode/ShaderNodeBaseElements.js'; const getRoughness = new ShaderNode( ( inputs ) => { @@ -7,9 +7,9 @@ const getRoughness = new ShaderNode( ( inputs ) => { const geometryRoughness = getGeometryRoughness.call(); - let roughnessFactor = roughness.max( 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap. - roughnessFactor = roughnessFactor.add( geometryRoughness ); - roughnessFactor = roughnessFactor.min( 1.0 ); + let roughnessFactor = max( roughness, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap. + roughnessFactor = add( roughnessFactor, geometryRoughness ); + roughnessFactor = min( roughnessFactor, 1.0 ); return roughnessFactor; diff --git a/examples/jsm/nodes/geometry/RangeNode.js b/examples/jsm/nodes/geometry/RangeNode.js index 18683d4c37eae9..08e88a046f2645 100644 --- a/examples/jsm/nodes/geometry/RangeNode.js +++ b/examples/jsm/nodes/geometry/RangeNode.js @@ -1,7 +1,5 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { attribute } from '../core/AttributeNode.js'; -import { nodeObject, float } from '../shadernode/ShaderNode.js'; - +import Node from '../core/Node.js'; +import { attribute, float } from '../shadernode/ShaderNodeBaseElements.js'; import { MathUtils, InstancedBufferAttribute } from 'three'; class RangeNode extends Node { @@ -22,8 +20,9 @@ class RangeNode extends Node { let length = 1; if ( min.isVector2 ) length = 2; - else if ( min.isVector3 || min.isColor ) length = 3; + else if ( min.isVector3 ) length = 3; else if ( min.isVector4 ) length = 4; + else if ( min.isColor ) length = 3; return length; @@ -31,7 +30,7 @@ class RangeNode extends Node { getNodeType( builder ) { - return builder.object.isInstancedMesh === true ? builder.getTypeFromLength( this.getVectorLength() ) : 'float'; + return ( builder.object.isInstancedMesh === true ) ? builder.getTypeFromLength( this.getVectorLength() ) : 'float'; } @@ -108,7 +107,3 @@ class RangeNode extends Node { } export default RangeNode; - -export const range = ( min, max ) => nodeObject( new RangeNode( min, max ) ); - -addNodeClass( RangeNode ); diff --git a/examples/jsm/nodes/gpgpu/ComputeNode.js b/examples/jsm/nodes/gpgpu/ComputeNode.js index ed16e394e4211c..767a1e6c59c514 100644 --- a/examples/jsm/nodes/gpgpu/ComputeNode.js +++ b/examples/jsm/nodes/gpgpu/ComputeNode.js @@ -1,6 +1,5 @@ -import Node, { addNodeClass } from '../core/Node.js'; +import Node from '../core/Node.js'; import { NodeUpdateType } from '../core/constants.js'; -import { addNodeElement, nodeObject } from '../shadernode/ShaderNode.js'; class ComputeNode extends Node { @@ -64,9 +63,3 @@ class ComputeNode extends Node { } export default ComputeNode; - -export const compute = ( node, count, workgroupSize ) => nodeObject( new ComputeNode( nodeObject( node ), count, workgroupSize ) ); - -addNodeElement( 'compute', compute ); - -addNodeClass( ComputeNode ); diff --git a/examples/jsm/nodes/lighting/AONode.js b/examples/jsm/nodes/lighting/AONode.js index bc2fb12dd975cc..f95c329bee507b 100644 --- a/examples/jsm/nodes/lighting/AONode.js +++ b/examples/jsm/nodes/lighting/AONode.js @@ -1,5 +1,5 @@ import LightingNode from './LightingNode.js'; -import { addNodeClass } from '../core/Node.js'; +import { float, add, mul, sub } from '../shadernode/ShaderNodeElements.js'; class AONode extends LightingNode { @@ -14,14 +14,12 @@ class AONode extends LightingNode { construct( builder ) { const aoIntensity = 1; - const aoNode = this.aoNode.sub( 1.0 ).mul( aoIntensity ).add( 1.0 ); + const aoNode = add( mul( sub( float( this.aoNode ), 1.0 ), aoIntensity ), 1.0 ); - builder.context.ambientOcclusion.mulAssign( aoNode ); + builder.context.ambientOcclusion.mul( aoNode ); } } export default AONode; - -addNodeClass( AONode ); diff --git a/examples/jsm/nodes/lighting/AmbientLightNode.js b/examples/jsm/nodes/lighting/AmbientLightNode.js index 08d1e95228797d..73efac35a070a6 100644 --- a/examples/jsm/nodes/lighting/AmbientLightNode.js +++ b/examples/jsm/nodes/lighting/AmbientLightNode.js @@ -1,6 +1,5 @@ import AnalyticLightNode from './AnalyticLightNode.js'; -import { addLightNode } from './LightsNode.js'; -import { addNodeClass } from '../core/Node.js'; +import LightsNode from './LightsNode.js'; import { AmbientLight } from 'three'; @@ -14,14 +13,12 @@ class AmbientLightNode extends AnalyticLightNode { construct( { context } ) { - context.irradiance.addAssign( this.colorNode ); + context.irradiance.add( this.colorNode ); } } -export default AmbientLightNode; - -addLightNode( AmbientLight, AmbientLightNode ); +LightsNode.setReference( AmbientLight, AmbientLightNode ); -addNodeClass( AmbientLightNode ); +export default AmbientLightNode; diff --git a/examples/jsm/nodes/lighting/AnalyticLightNode.js b/examples/jsm/nodes/lighting/AnalyticLightNode.js index d900f1433afa08..864934440809cb 100644 --- a/examples/jsm/nodes/lighting/AnalyticLightNode.js +++ b/examples/jsm/nodes/lighting/AnalyticLightNode.js @@ -1,7 +1,6 @@ import LightingNode from './LightingNode.js'; import { NodeUpdateType } from '../core/constants.js'; -import { uniform } from '../core/UniformNode.js'; -import { addNodeClass } from '../core/Node.js'; +import { uniform } from '../shadernode/ShaderNodeElements.js'; import { Color } from 'three'; @@ -36,5 +35,3 @@ class AnalyticLightNode extends LightingNode { } export default AnalyticLightNode; - -addNodeClass( AnalyticLightNode ); diff --git a/examples/jsm/nodes/lighting/DirectionalLightNode.js b/examples/jsm/nodes/lighting/DirectionalLightNode.js index adc2873f027da2..0cead4adf32e27 100644 --- a/examples/jsm/nodes/lighting/DirectionalLightNode.js +++ b/examples/jsm/nodes/lighting/DirectionalLightNode.js @@ -1,8 +1,7 @@ import AnalyticLightNode from './AnalyticLightNode.js'; -import { addLightNode } from './LightsNode.js'; +import LightsNode from './LightsNode.js'; import getDirectionVector from '../functions/light/getDirectionVector.js'; -import { uniform } from '../core/UniformNode.js'; -import { addNodeClass } from '../core/Node.js'; +import { uniform } from '../shadernode/ShaderNodeElements.js'; import { Vector3, DirectionalLight } from 'three'; @@ -46,8 +45,6 @@ class DirectionalLightNode extends AnalyticLightNode { } -export default DirectionalLightNode; - -addLightNode( DirectionalLight, DirectionalLightNode ); +LightsNode.setReference( DirectionalLight, DirectionalLightNode ); -addNodeClass( DirectionalLightNode ); +export default DirectionalLightNode; diff --git a/examples/jsm/nodes/lighting/EnvironmentNode.js b/examples/jsm/nodes/lighting/EnvironmentNode.js index b3f5f614093e43..7f7d21a1b64bbf 100644 --- a/examples/jsm/nodes/lighting/EnvironmentNode.js +++ b/examples/jsm/nodes/lighting/EnvironmentNode.js @@ -1,14 +1,8 @@ import LightingNode from './LightingNode.js'; -import { cache } from '../core/CacheNode.js'; -import { context } from '../core/ContextNode.js'; -import { roughness } from '../core/PropertyNode.js'; -import { equirectUV } from '../utils/EquirectUVNode.js'; -import { specularMIPLevel } from '../utils/SpecularMIPLevelNode.js'; -import { cameraViewMatrix } from '../accessors/CameraNode.js'; -import { transformedNormalView, transformedNormalWorld } from '../accessors/NormalNode.js'; -import { positionViewDirection } from '../accessors/PositionNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { float, vec2 } from '../shadernode/ShaderNode.js'; +import ContextNode from '../core/ContextNode.js'; +import CacheNode from '../core/CacheNode.js'; +import SpecularMIPLevelNode from '../utils/SpecularMIPLevelNode.js'; +import { float, mul, roughness, positionViewDirection, transformedNormalView, transformedNormalWorld, cameraViewMatrix, equirectUV, vec2 } from '../shadernode/ShaderNodeElements.js'; class EnvironmentNode extends LightingNode { @@ -29,7 +23,7 @@ class EnvironmentNode extends LightingNode { let radianceTextureUVNode; let irradianceTextureUVNode; - const radianceContext = context( envNode, { + const radianceContext = new ContextNode( envNode, { getUVNode: ( textureNode ) => { let node = null; @@ -71,12 +65,12 @@ class EnvironmentNode extends LightingNode { }, getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => { - return specularMIPLevel( textureNode, levelNode ); + return new SpecularMIPLevelNode( textureNode, levelNode ); } } ); - const irradianceContext = context( envNode, { + const irradianceContext = new ContextNode( envNode, { getUVNode: ( textureNode ) => { let node = null; @@ -110,20 +104,20 @@ class EnvironmentNode extends LightingNode { }, getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => { - return specularMIPLevel( textureNode, levelNode ); + return new SpecularMIPLevelNode( textureNode, levelNode ); } } ); // - const isolateRadianceFlowContext = cache( radianceContext ); + const isolateRadianceFlowContext = new CacheNode( radianceContext ); // - builder.context.radiance.addAssign( isolateRadianceFlowContext ); + builder.context.radiance.add( isolateRadianceFlowContext ); - builder.context.iblIrradiance.addAssign( irradianceContext.mul( Math.PI ) ); + builder.context.iblIrradiance.add( mul( Math.PI, irradianceContext ) ); properties.radianceContext = isolateRadianceFlowContext; properties.irradianceContext = irradianceContext; @@ -133,5 +127,3 @@ class EnvironmentNode extends LightingNode { } export default EnvironmentNode; - -addNodeClass( EnvironmentNode ); diff --git a/examples/jsm/nodes/lighting/HemisphereLightNode.js b/examples/jsm/nodes/lighting/HemisphereLightNode.js index ade9b69d69dde9..abd7f2588e32a8 100644 --- a/examples/jsm/nodes/lighting/HemisphereLightNode.js +++ b/examples/jsm/nodes/lighting/HemisphereLightNode.js @@ -1,10 +1,7 @@ import AnalyticLightNode from './AnalyticLightNode.js'; -import { addLightNode } from './LightsNode.js'; -import { uniform } from '../core/UniformNode.js'; -import { mix } from '../math/MathNode.js'; -import { normalView } from '../accessors/NormalNode.js'; -import { objectPosition } from '../accessors/Object3DNode.js'; -import { addNodeClass } from '../core/Node.js'; +import LightsNode from './LightsNode.js'; +import Object3DNode from '../accessors/Object3DNode.js'; +import { uniform, add, mul, dot, mix, normalize, normalView } from '../shadernode/ShaderNodeElements.js'; import { Color, HemisphereLight } from 'three'; @@ -14,8 +11,8 @@ class HemisphereLightNode extends AnalyticLightNode { super( light ); - this.lightPositionNode = objectPosition; - this.lightDirectionNode = objectPosition.normalize(); + this.lightPositionNode = new Object3DNode( Object3DNode.POSITION ); + this.lightDirectionNode = normalize( this.lightPositionNode ); this.groundColorNode = uniform( new Color() ); @@ -37,19 +34,17 @@ class HemisphereLightNode extends AnalyticLightNode { const { colorNode, groundColorNode, lightDirectionNode } = this; - const dotNL = normalView.dot( lightDirectionNode ); - const hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 ); + const dotNL = dot( normalView, lightDirectionNode ); + const hemiDiffuseWeight = add( mul( 0.5, dotNL ), 0.5 ); const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight ); - builder.context.irradiance.addAssign( irradiance ); + builder.context.irradiance.add( irradiance ); } } -export default HemisphereLightNode; - -addLightNode( HemisphereLight, HemisphereLightNode ); +LightsNode.setReference( HemisphereLight, HemisphereLightNode ); -addNodeClass( HemisphereLightNode ); +export default HemisphereLightNode; diff --git a/examples/jsm/nodes/lighting/IESSpotLightNode.js b/examples/jsm/nodes/lighting/IESSpotLightNode.js index 5a3db66c12c2f2..ad27373baeeda9 100644 --- a/examples/jsm/nodes/lighting/IESSpotLightNode.js +++ b/examples/jsm/nodes/lighting/IESSpotLightNode.js @@ -1,8 +1,6 @@ import SpotLightNode from './SpotLightNode.js'; -import { addLightNode } from './LightsNode.js'; -import { texture } from '../accessors/TextureNode.js'; -import { vec2 } from '../shadernode/ShaderNode.js'; -import { addNodeClass } from '../core/Node.js'; +import LightsNode from './LightsNode.js'; +import { acos, texture, vec2 } from '../shadernode/ShaderNodeElements.js'; import IESSpotLight from '../../lights/IESSpotLight.js'; @@ -16,7 +14,7 @@ class IESSpotLightNode extends SpotLightNode { if ( iesMap && iesMap.isTexture === true ) { - const angle = angleCosine.acos().mul( 1.0 / Math.PI ); + const angle = acos( angleCosine ).mul( 1.0 / Math.PI ); spotAttenuation = texture( iesMap, vec2( angle, 0 ), 0 ).r; @@ -32,8 +30,6 @@ class IESSpotLightNode extends SpotLightNode { } -export default IESSpotLightNode; - -addLightNode( IESSpotLight, IESSpotLightNode ); +LightsNode.setReference( IESSpotLight, IESSpotLightNode ); -addNodeClass( IESSpotLightNode ); +export default IESSpotLightNode; diff --git a/examples/jsm/nodes/lighting/LightingContextNode.js b/examples/jsm/nodes/lighting/LightingContextNode.js index ef18e9e150161b..52e40057b0b965 100644 --- a/examples/jsm/nodes/lighting/LightingContextNode.js +++ b/examples/jsm/nodes/lighting/LightingContextNode.js @@ -1,8 +1,5 @@ import ContextNode from '../core/ContextNode.js'; -import { temp } from '../core/VarNode.js'; -import { add } from '../math/OperatorNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy, float, vec3 } from '../shadernode/ShaderNode.js'; +import { float, vec3, add, temp } from '../shadernode/ShaderNodeBaseElements.js'; class LightingContextNode extends ContextNode { @@ -76,9 +73,3 @@ class LightingContextNode extends ContextNode { } export default LightingContextNode; - -export const lightingContext = nodeProxy( LightingContextNode ); - -addNodeElement( 'lightingContext', lightingContext ); - -addNodeClass( LightingContextNode ); diff --git a/examples/jsm/nodes/lighting/LightingNode.js b/examples/jsm/nodes/lighting/LightingNode.js index 4c5bcfe46cd441..0d91a9c7579a03 100644 --- a/examples/jsm/nodes/lighting/LightingNode.js +++ b/examples/jsm/nodes/lighting/LightingNode.js @@ -1,4 +1,4 @@ -import Node, { addNodeClass } from '../core/Node.js'; +import Node from '../core/Node.js'; class LightingNode extends Node { @@ -17,5 +17,3 @@ class LightingNode extends Node { } export default LightingNode; - -addNodeClass( LightingNode ); diff --git a/examples/jsm/nodes/lighting/LightsNode.js b/examples/jsm/nodes/lighting/LightsNode.js index 9104ceca245a03..2a3ed0ff2d2b91 100644 --- a/examples/jsm/nodes/lighting/LightsNode.js +++ b/examples/jsm/nodes/lighting/LightsNode.js @@ -1,8 +1,7 @@ import Node from '../core/Node.js'; import AnalyticLightNode from './AnalyticLightNode.js'; -import { nodeObject, nodeProxy } from '../shadernode/ShaderNode.js'; -const LightNodes = new WeakMap(); +const references = new WeakMap(); const sortLights = ( lights ) => { @@ -80,7 +79,7 @@ class LightsNode extends Node { } - fromLights( lights = [] ) { + fromLights( lights ) { const lightNodes = []; @@ -93,9 +92,9 @@ class LightsNode extends Node { if ( lightNode === null ) { const lightClass = light.constructor; - const lightNodeClass = LightNodes.has( lightClass ) ? LightNodes.get( lightClass ) : AnalyticLightNode; + const lightNodeClass = references.has( lightClass ) ? references.get( lightClass ) : AnalyticLightNode; - lightNode = nodeObject( new lightNodeClass( light ) ); + lightNode = new lightNodeClass( light ); } @@ -110,19 +109,12 @@ class LightsNode extends Node { } -} - -export default LightsNode; - -export const lights = ( lights ) => nodeObject( new LightsNode().fromLights( lights ) ); -export const lightsWithoutWrap = nodeProxy( LightsNode ); + static setReference( lightClass, lightNodeClass ) { -export function addLightNode( lightClass, lightNodeClass ) { + references.set( lightClass, lightNodeClass ); - if ( LightNodes.has( lightClass ) ) throw new Error( `Redefinition of light node ${ lightNodeClass.name }` ); - if ( typeof lightClass !== 'function' || ! lightClass.name ) throw new Error( `Light ${ lightClass.name } is not a class` ); - if ( typeof lightNodeClass !== 'function' || ! lightNodeClass.name ) throw new Error( `Light node ${ lightNodeClass.name } is not a class` ); - - LightNodes.set( lightClass, lightNodeClass ); + } } + +export default LightsNode; diff --git a/examples/jsm/nodes/lighting/PointLightNode.js b/examples/jsm/nodes/lighting/PointLightNode.js index ba7dea123bb85e..e79d595caedc34 100644 --- a/examples/jsm/nodes/lighting/PointLightNode.js +++ b/examples/jsm/nodes/lighting/PointLightNode.js @@ -1,10 +1,7 @@ import AnalyticLightNode from './AnalyticLightNode.js'; -import { addLightNode } from './LightsNode.js'; +import LightsNode from './LightsNode.js'; import getDistanceAttenuation from '../functions/light/getDistanceAttenuation.js'; -import { uniform } from '../core/UniformNode.js'; -import { objectViewPosition } from '../accessors/Object3DNode.js'; -import { positionView } from '../accessors/PositionNode.js'; -import { addNodeClass } from '../core/Node.js'; +import { uniform, positionView, objectViewPosition } from '../shadernode/ShaderNodeElements.js'; import { PointLight } from 'three'; @@ -64,8 +61,6 @@ class PointLightNode extends AnalyticLightNode { } -export default PointLightNode; - -addLightNode( PointLight, PointLightNode ); +LightsNode.setReference( PointLight, PointLightNode ); -addNodeClass( PointLightNode ); +export default PointLightNode; diff --git a/examples/jsm/nodes/lighting/SpotLightNode.js b/examples/jsm/nodes/lighting/SpotLightNode.js index 6a4b0479d8c11a..7ae10321b426c4 100644 --- a/examples/jsm/nodes/lighting/SpotLightNode.js +++ b/examples/jsm/nodes/lighting/SpotLightNode.js @@ -1,12 +1,8 @@ import AnalyticLightNode from './AnalyticLightNode.js'; -import { addLightNode } from './LightsNode.js'; +import LightsNode from './LightsNode.js'; import getDistanceAttenuation from '../functions/light/getDistanceAttenuation.js'; import getDirectionVector from '../functions/light/getDirectionVector.js'; -import { uniform } from '../core/UniformNode.js'; -import { smoothstep } from '../math/MathNode.js'; -import { objectViewPosition } from '../accessors/Object3DNode.js'; -import { positionView } from '../accessors/PositionNode.js'; -import { addNodeClass } from '../core/Node.js'; +import { uniform, smoothstep, positionView, objectViewPosition } from '../shadernode/ShaderNodeElements.js'; import { Vector3, SpotLight } from 'three'; @@ -89,8 +85,6 @@ class SpotLightNode extends AnalyticLightNode { } -export default SpotLightNode; - -addLightNode( SpotLight, SpotLightNode ); +LightsNode.setReference( SpotLight, SpotLightNode ); -addNodeClass( SpotLightNode ); +export default SpotLightNode; diff --git a/examples/jsm/nodes/loaders/NodeLoader.js b/examples/jsm/nodes/loaders/NodeLoader.js index 946fc55ae82f49..875b9cbb0264be 100644 --- a/examples/jsm/nodes/loaders/NodeLoader.js +++ b/examples/jsm/nodes/loaders/NodeLoader.js @@ -1,5 +1,4 @@ -import { createNodeFromType } from '../core/Node.js'; -import { nodeObject } from '../shadernode/ShaderNode.js'; +import * as Nodes from '../Nodes.js'; import { FileLoader, Loader } from 'three'; class NodeLoader extends Loader { @@ -54,7 +53,7 @@ class NodeLoader extends Loader { const { uuid, type } = nodeJSON; - nodes[ uuid ] = nodeObject( createNodeFromType( type ) ); // @TODO: Maybe nodeObjectify the node in createNodeFromType? + nodes[ uuid ] = Nodes.fromType( type ); nodes[ uuid ].uuid = uuid; } @@ -80,10 +79,10 @@ class NodeLoader extends Loader { parse( json ) { - const node = nodeObject( createNodeFromType( type ) ); + const node = Nodes.fromType( json.type ); node.uuid = json.uuid; - const nodes = this.parseNodes( json.nodes ); + const nodes = this.parseNodes( json.inputNodes ); const meta = { nodes, textures: this.textures }; json.meta = meta; diff --git a/examples/jsm/nodes/loaders/NodeMaterialLoader.js b/examples/jsm/nodes/loaders/NodeMaterialLoader.js index a34bca20a5eecb..d7dbcb0a8e31a5 100644 --- a/examples/jsm/nodes/loaders/NodeMaterialLoader.js +++ b/examples/jsm/nodes/loaders/NodeMaterialLoader.js @@ -1,15 +1,31 @@ import { MaterialLoader } from 'three'; -import { createNodeMaterialFromType } from '../materials/Materials.js'; +import { + NodeMaterial, + LineBasicNodeMaterial, + MeshBasicNodeMaterial, + MeshStandardNodeMaterial, + MeshPhysicalNodeMaterial, + PointsNodeMaterial, + SpriteNodeMaterial +} from '../materials/Materials.js'; const superFromTypeFunction = MaterialLoader.createMaterialFromType; MaterialLoader.createMaterialFromType = function ( type ) { - const material = createNodeMaterialFromType( type ) + const materialLib = { + NodeMaterial, + LineBasicNodeMaterial, + MeshBasicNodeMaterial, + MeshStandardNodeMaterial, + MeshPhysicalNodeMaterial, + PointsNodeMaterial, + SpriteNodeMaterial + }; - if ( material !== undefined ) { + if ( materialLib[ type ] !== undefined ) { - return material; + return new materialLib[ type ](); } diff --git a/examples/jsm/nodes/materials/LineBasicNodeMaterial.js b/examples/jsm/nodes/materials/LineBasicNodeMaterial.js index 5d67a89d1eb29d..a68c659f5edb7a 100644 --- a/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +++ b/examples/jsm/nodes/materials/LineBasicNodeMaterial.js @@ -1,5 +1,4 @@ -import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; - +import NodeMaterial from './NodeMaterial.js'; import { LineBasicMaterial } from 'three'; const defaultValues = new LineBasicMaterial(); @@ -48,5 +47,3 @@ class LineBasicNodeMaterial extends NodeMaterial { } export default LineBasicNodeMaterial; - -addNodeMaterial( LineBasicNodeMaterial ); diff --git a/examples/jsm/nodes/materials/Materials.js b/examples/jsm/nodes/materials/Materials.js index 8453c84c182ad3..771281bb95d29e 100644 --- a/examples/jsm/nodes/materials/Materials.js +++ b/examples/jsm/nodes/materials/Materials.js @@ -1,11 +1,61 @@ -// @TODO: We can simplify "export { default as SomeNode, other, exports } from '...'" to just "export * from '...'" if we will use only named exports - -export { default as NodeMaterial, addNodeMaterial, createNodeMaterialFromType } from './NodeMaterial.js'; -export { default as LineBasicNodeMaterial } from './LineBasicNodeMaterial.js'; -export { default as MeshNormalNodeMaterial } from './MeshNormalNodeMaterial.js'; -export { default as MeshBasicNodeMaterial } from './MeshBasicNodeMaterial.js'; -export { default as MeshPhongNodeMaterial } from './MeshPhongNodeMaterial.js'; -export { default as MeshStandardNodeMaterial } from './MeshStandardNodeMaterial.js'; -export { default as MeshPhysicalNodeMaterial } from './MeshPhysicalNodeMaterial.js'; -export { default as PointsNodeMaterial } from './PointsNodeMaterial.js'; -export { default as SpriteNodeMaterial } from './SpriteNodeMaterial.js'; +import NodeMaterial from './NodeMaterial.js'; +import LineBasicNodeMaterial from './LineBasicNodeMaterial.js'; +import MeshNormalNodeMaterial from './MeshNormalNodeMaterial.js'; +import MeshBasicNodeMaterial from './MeshBasicNodeMaterial.js'; +import MeshPhongNodeMaterial from './MeshPhongNodeMaterial.js'; +import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js'; +import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js'; +import PointsNodeMaterial from './PointsNodeMaterial.js'; +import SpriteNodeMaterial from './SpriteNodeMaterial.js'; + +export { + NodeMaterial, + LineBasicNodeMaterial, + MeshNormalNodeMaterial, + MeshBasicNodeMaterial, + MeshPhongNodeMaterial, + MeshStandardNodeMaterial, + MeshPhysicalNodeMaterial, + PointsNodeMaterial, + SpriteNodeMaterial +}; + +NodeMaterial.fromMaterial = function ( material ) { + + const materialLib = { + NodeMaterial, + LineBasicNodeMaterial, + MeshNormalNodeMaterial, + MeshBasicNodeMaterial, + MeshPhongNodeMaterial, + MeshStandardNodeMaterial, + MeshPhysicalNodeMaterial, + PointsNodeMaterial, + SpriteNodeMaterial + }; + + const type = material.type.replace( 'Material', 'NodeMaterial' ); + + if ( materialLib[ type ] === undefined ) { + + if ( material.isNodeMaterial !== true ) { + + throw new Error( `NodeMaterial: Material "${ material.type }" is not compatible.` ); + + } + + return material; // is already a node material + + } + + const nodeMaterial = new materialLib[ type ](); + + for ( const key in material ) { + + nodeMaterial[ key ] = material[ key ]; + + } + + return nodeMaterial; + +}; diff --git a/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js b/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js index 4440049e9a2713..d3c4e3dc675260 100644 --- a/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +++ b/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js @@ -1,5 +1,4 @@ -import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; - +import NodeMaterial from './NodeMaterial.js'; import { MeshBasicMaterial } from 'three'; const defaultValues = new MeshBasicMaterial(); @@ -47,5 +46,3 @@ class MeshBasicNodeMaterial extends NodeMaterial { } export default MeshBasicNodeMaterial; - -addNodeMaterial( MeshBasicNodeMaterial ); diff --git a/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js b/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js index 5dccd40b809422..72a87b1b8c1b29 100644 --- a/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +++ b/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js @@ -1,11 +1,6 @@ -import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; -import { diffuseColor } from '../core/PropertyNode.js'; -import { directionToColor } from '../utils/PackingNode.js'; -import { materialOpacity } from '../accessors/MaterialNode.js'; -import { transformedNormalView } from '../accessors/NormalNode.js'; -import { float, vec4 } from '../shadernode/ShaderNode.js'; - +import NodeMaterial from './NodeMaterial.js'; import { MeshNormalMaterial } from 'three'; +import { vec4, diffuseColor, materialOpacity, transformedNormalView, directionToColor } from '../shadernode/ShaderNodeElements.js'; const defaultValues = new MeshNormalMaterial(); @@ -48,5 +43,3 @@ class MeshNormalNodeMaterial extends NodeMaterial { } export default MeshNormalNodeMaterial; - -addNodeMaterial( MeshNormalNodeMaterial ); diff --git a/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js b/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js index 6ad01c719f1874..00b3628a6778e9 100644 --- a/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +++ b/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js @@ -1,8 +1,10 @@ -import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; -import { shininess, specularColor } from '../core/PropertyNode.js'; -import { materialShininess, materialSpecularColor } from '../accessors/MaterialNode.js'; +import NodeMaterial from './NodeMaterial.js'; +import { + float, vec3, + materialShininess, materialSpecularColor, + shininess, specularColor +} from '../shadernode/ShaderNodeElements.js'; import phongLightingModel from '../functions/PhongLightingModel.js'; -import { float } from '../shadernode/ShaderNode.js'; import { MeshPhongMaterial } from 'three'; @@ -46,13 +48,13 @@ class MeshPhongNodeMaterial extends NodeMaterial { // SHININESS - const shininessNode = ( this.shininessNode ? float( this.shininessNode ) : materialShininess ).max( 1e-4 ); // to prevent pow( 0.0, 0.0 ) + const shininessNode = float( this.shininessNode || materialShininess ).max( 1e-4 ); // to prevent pow( 0.0, 0.0 ) stack.assign( shininess, shininessNode ); // SPECULAR COLOR - const specularNode = this.specularNode || materialSpecularColor; + const specularNode = vec3( this.specularNode || materialSpecularColor ); stack.assign( specularColor, specularNode ); @@ -79,5 +81,3 @@ class MeshPhongNodeMaterial extends NodeMaterial { } export default MeshPhongNodeMaterial; - -addNodeMaterial( MeshPhongNodeMaterial ); diff --git a/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js b/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js index 3b16325538b24e..83c201bfb820b0 100644 --- a/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +++ b/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js @@ -1,11 +1,10 @@ -import { addNodeMaterial } from './NodeMaterial.js'; import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js'; import { MeshPhysicalMaterial } from 'three'; const defaultValues = new MeshPhysicalMaterial(); -class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial { +export default class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial { constructor( parameters ) { @@ -69,7 +68,3 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial { } } - -export default MeshPhysicalNodeMaterial; - -addNodeMaterial( MeshPhysicalNodeMaterial ); diff --git a/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js b/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js index 8f27028c7c9a7d..e319384834748f 100644 --- a/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +++ b/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js @@ -1,16 +1,17 @@ -import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; -import { diffuseColor, metalness, roughness, specularColor } from '../core/PropertyNode.js'; -import { mix } from '../math/MathNode.js'; -import { materialRoughness, materialMetalness, materialColor } from '../accessors/MaterialNode.js'; +import NodeMaterial from './NodeMaterial.js'; +import { + float, vec3, vec4, mix, + materialRoughness, materialMetalness, materialColor, diffuseColor, + metalness, roughness, specularColor +} from '../shadernode/ShaderNodeElements.js'; import getRoughness from '../functions/material/getRoughness.js'; import physicalLightingModel from '../functions/PhysicalLightingModel.js'; -import { float, vec3, vec4 } from '../shadernode/ShaderNode.js'; import { MeshStandardMaterial } from 'three'; const defaultValues = new MeshStandardMaterial(); -class MeshStandardNodeMaterial extends NodeMaterial { +export default class MeshStandardNodeMaterial extends NodeMaterial { constructor( parameters ) { @@ -97,7 +98,3 @@ class MeshStandardNodeMaterial extends NodeMaterial { } } - -export default MeshStandardNodeMaterial; - -addNodeMaterial( MeshStandardNodeMaterial ); diff --git a/examples/jsm/nodes/materials/NodeMaterial.js b/examples/jsm/nodes/materials/NodeMaterial.js index 9032b69d8ea680..819b8235c40301 100644 --- a/examples/jsm/nodes/materials/NodeMaterial.js +++ b/examples/jsm/nodes/materials/NodeMaterial.js @@ -1,25 +1,17 @@ import { Material, ShaderMaterial, NoToneMapping } from 'three'; -import { getNodeChildren, getCacheKey } from '../core/NodeUtils.js'; -import { attribute } from '../core/AttributeNode.js'; -import { diffuseColor } from '../core/PropertyNode.js'; -import { materialNormal } from '../accessors/ExtendedMaterialNode.js'; -import { materialAlphaTest, materialColor, materialOpacity, materialEmissive } from '../accessors/MaterialNode.js'; -import { modelViewProjection } from '../accessors/ModelViewProjectionNode.js'; -import { transformedNormalView } from '../accessors/NormalNode.js'; -import { instance } from '../accessors/InstanceNode.js'; -import { positionLocal } from '../accessors/PositionNode.js'; -import { reference } from '../accessors/ReferenceNode.js'; -import { skinning } from '../accessors/SkinningNode.js'; -import { texture } from '../accessors/TextureNode.js'; -import { toneMapping } from '../display/ToneMappingNode.js'; -import { rangeFog } from '../fog/FogRangeNode.js'; -import { densityFog } from '../fog/FogExp2Node.js'; -import { lightsWithoutWrap } from '../lighting/LightsNode.js'; -import AONode from '../lighting/AONode.js'; +import { getNodesKeys, getCacheKey } from '../core/NodeUtils.js'; +import StackNode from '../core/StackNode.js'; +import LightsNode from '../lighting/LightsNode.js'; import EnvironmentNode from '../lighting/EnvironmentNode.js'; -import { float, vec3, vec4 } from '../shadernode/ShaderNode.js'; - -const NodeMaterials = new Map(); +import ToneMappingNode from '../display/ToneMappingNode.js'; +import AONode from '../lighting/AONode.js'; +import { + float, vec3, vec4, + assign, mul, bypass, attribute, context, texture, lessThanEqual, discard, + positionLocal, diffuseColor, skinning, instance, modelViewProjection, lightingContext, colorSpace, + materialAlphaTest, materialColor, materialOpacity, materialEmissive, materialNormal, transformedNormalView, + reference, rangeFog, densityFog +} from '../shadernode/ShaderNodeElements.js'; class NodeMaterial extends ShaderMaterial { @@ -54,8 +46,8 @@ class NodeMaterial extends ShaderMaterial { // < STACKS > - const vertexStack = builder.createStack(); - const fragmentStack = builder.createStack(); + const vertexStack = new StackNode(); + const fragmentStack = new StackNode(); // < VERTEX STAGE > @@ -87,19 +79,19 @@ class NodeMaterial extends ShaderMaterial { if ( this.positionNode !== null ) { - vertex = vertex.bypass( positionLocal.assign( this.positionNode ) ); + vertex = bypass( vertex, assign( positionLocal, this.positionNode ) ); } if ( ( object.instanceMatrix && object.instanceMatrix.isInstancedBufferAttribute === true ) && builder.isAvailable( 'instance' ) === true ) { - vertex = vertex.bypass( instance( object ) ); + vertex = bypass( vertex, instance( object ) ); } if ( object.isSkinnedMesh === true ) { - vertex = vertex.bypass( skinning( object ) ); + vertex = bypass( vertex, skinning( object ) ); } @@ -111,13 +103,14 @@ class NodeMaterial extends ShaderMaterial { constructDiffuseColor( builder, stack ) { - let colorNode = this.colorNode ? vec4( this.colorNode ) : materialColor; + let colorNode = vec4( this.colorNode || materialColor ); + const opacityNode = this.opacityNode ? float( this.opacityNode ) : materialOpacity; // VERTEX COLORS if ( this.vertexColors === true && builder.geometry.hasAttribute( 'color' ) ) { - colorNode = vec4( colorNode.xyz.mul( attribute( 'color' ) ), colorNode.a ); + colorNode = vec4( mul( colorNode.xyz, attribute( 'color' ) ), colorNode.a ); } @@ -127,7 +120,6 @@ class NodeMaterial extends ShaderMaterial { // OPACITY - const opacityNode = this.opacityNode ? float( this.opacityNode ) : materialOpacity; stack.assign( diffuseColor.a, diffuseColor.a.mul( opacityNode ) ); // ALPHA TEST @@ -136,7 +128,7 @@ class NodeMaterial extends ShaderMaterial { const alphaTestNode = this.alphaTestNode ? float( this.alphaTestNode ) : materialAlphaTest; - stack.add( diffuseColor.a.lessThanEqual( alphaTestNode ).discard() ); + stack.add( discard( lessThanEqual( diffuseColor.a, alphaTestNode ) ) ); } @@ -181,7 +173,7 @@ class NodeMaterial extends ShaderMaterial { if ( materialLightsNode.length > 0 ) { - lightsNode = lightsWithoutWrap( [ ...lightsNode.lightNodes, ...materialLightsNode ] ); + lightsNode = new LightsNode( [ ...lightsNode.lightNodes, ...materialLightsNode ] ); } @@ -201,16 +193,16 @@ class NodeMaterial extends ShaderMaterial { // OUTGOING LIGHT - const lights = this.lights === true || this.lightsNode !== null; + const lights = ( this.lights === true ) || this.lightsNode !== null; const lightsNode = lights ? this.constructLights( builder ) : null; const lightingModelNode = lightsNode ? this.constructLightingModel( builder ) : null; - let outgoingLightNode = diffuseColor.rgb; + let outgoingLightNode = diffuseColor.xyz; if ( lightsNode && lightsNode.hasLight !== false ) { - outgoingLightNode = lightsNode.lightingContext( lightingModelNode ); + outgoingLightNode = lightingContext( lightsNode, lightingModelNode ); } @@ -218,7 +210,7 @@ class NodeMaterial extends ShaderMaterial { if ( ( this.emissiveNode && this.emissiveNode.isNode === true ) || ( material.emissive && material.emissive.isColor === true ) ) { - outgoingLightNode = outgoingLightNode.add( this.emissiveNode ? vec3( this.emissiveNode ) : materialEmissive ); + outgoingLightNode = outgoingLightNode.add( vec3( this.emissiveNode || materialEmissive ) ); } @@ -236,13 +228,13 @@ class NodeMaterial extends ShaderMaterial { if ( ! toneMappingNode && renderer.toneMapping !== NoToneMapping ) { - toneMappingNode = toneMapping( renderer.toneMapping, reference( 'toneMappingExposure', 'float', renderer ), outgoingLight ); + toneMappingNode = new ToneMappingNode( renderer.toneMapping, reference( 'toneMappingExposure', 'float', renderer ), outgoingLight ); } if ( toneMappingNode && toneMappingNode.isNode === true ) { - outgoingLight = toneMappingNode.context( { color: outgoingLight } ); + outgoingLight = context( toneMappingNode, { color: outgoingLight } ); } @@ -252,7 +244,7 @@ class NodeMaterial extends ShaderMaterial { // ENCODING - outputNode = outputNode.colorSpace( renderer.outputEncoding ); + outputNode = colorSpace( outputNode, renderer.outputEncoding ); // FOG @@ -278,7 +270,7 @@ class NodeMaterial extends ShaderMaterial { } - if ( fogNode ) outputNode = vec4( fogNode.mix( outputNode.rgb ), outputNode.a ); + if ( fogNode ) outputNode = vec4( vec3( fogNode.mix( outputNode ) ), outputNode.w ); return outputNode; @@ -322,13 +314,13 @@ class NodeMaterial extends ShaderMaterial { } const data = Material.prototype.toJSON.call( this, meta ); - const nodeChildren = getNodeChildren( this ); + const nodeKeys = getNodesKeys( this ); data.inputNodes = {}; - for ( const { prop, childNode } of nodeChildren ) { + for ( const name of nodeKeys ) { - data.inputNodes[ prop ] = childNode.toJSON( meta ).uuid; + data.inputNodes[ name ] = this[ name ].toJSON( meta ).uuid; } @@ -366,57 +358,8 @@ class NodeMaterial extends ShaderMaterial { } - static fromMaterial( material ) { - - const type = material.type.replace( 'Material', 'NodeMaterial' ); - - const nodeMaterial = createNodeMaterialFromType( type ); - - if ( nodeMaterial === undefined ) { - - if ( material.isNodeMaterial !== true ) { - - throw new Error( `NodeMaterial: Material "${ material.type }" is not compatible.` ); - - } - - return material; // is already a node material - - } - - for ( const key in material ) { - - nodeMaterial[ key ] = material[ key ]; - - } - - return nodeMaterial; - - } + static fromMaterial( /*material*/ ) { } } export default NodeMaterial; - -export function addNodeMaterial( nodeMaterial ) { - - if ( typeof nodeMaterial !== 'function' || ! nodeMaterial.name ) throw new Error( `Node material ${ nodeMaterial.name } is not a class` ); - if ( NodeMaterials.has( nodeMaterial.name ) ) throw new Error( `Redefinition of node material ${ nodeMaterial.name }` ); - - NodeMaterials.set( nodeMaterial.name, nodeMaterial ); - -} - -export function createNodeMaterialFromType( type ) { - - const Material = NodeMaterials.get( type ); - - if ( Material !== undefined ) { - - return new Material(); - - } - -}; - -addNodeMaterial( NodeMaterial ); diff --git a/examples/jsm/nodes/materials/PointsNodeMaterial.js b/examples/jsm/nodes/materials/PointsNodeMaterial.js index 14702ab959c488..428019bcf12380 100644 --- a/examples/jsm/nodes/materials/PointsNodeMaterial.js +++ b/examples/jsm/nodes/materials/PointsNodeMaterial.js @@ -1,5 +1,4 @@ -import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; - +import NodeMaterial from './NodeMaterial.js'; import { PointsMaterial } from 'three'; const defaultValues = new PointsMaterial(); @@ -54,5 +53,3 @@ class PointsNodeMaterial extends NodeMaterial { } export default PointsNodeMaterial; - -addNodeMaterial( PointsNodeMaterial ); diff --git a/examples/jsm/nodes/materials/SpriteNodeMaterial.js b/examples/jsm/nodes/materials/SpriteNodeMaterial.js index cb0b2932634c78..4c101625f73233 100644 --- a/examples/jsm/nodes/materials/SpriteNodeMaterial.js +++ b/examples/jsm/nodes/materials/SpriteNodeMaterial.js @@ -1,12 +1,11 @@ -import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; -import { uniform } from '../core/UniformNode.js'; -import { cameraProjectionMatrix } from '../accessors/CameraNode.js'; -import { materialRotation } from '../accessors/MaterialNode.js'; -import { modelViewMatrix, modelWorldMatrix } from '../accessors/ModelNode.js'; -import { positionLocal } from '../accessors/PositionNode.js'; -import { vec2, vec3, vec4 } from '../shadernode/ShaderNode.js'; - +import NodeMaterial from './NodeMaterial.js'; import { SpriteMaterial } from 'three'; +import { + vec2, vec3, vec4, + uniform, mul, + positionLocal, cos, sin, + modelViewMatrix, cameraProjectionMatrix, modelWorldMatrix, materialRotation +} from '../shadernode/ShaderNodeElements.js'; const defaultValues = new SpriteMaterial(); @@ -46,9 +45,12 @@ class SpriteNodeMaterial extends NodeMaterial { const vertex = positionLocal; - let mvPosition = modelViewMatrix.mul( vec3( positionNode || 0 ) ); + let mvPosition = mul( modelViewMatrix, positionNode ? vec4( positionNode.xyz, 1 ) : vec4( 0, 0, 0, 1 ) ); - let scale = vec2( modelWorldMatrix[ 0 ].xyz.length(), modelWorldMatrix[ 1 ].xyz.length() ); + let scale = vec2( + vec3( modelWorldMatrix[ 0 ].x, modelWorldMatrix[ 0 ].y, modelWorldMatrix[ 0 ].z ).length(), + vec3( modelWorldMatrix[ 1 ].x, modelWorldMatrix[ 1 ].y, modelWorldMatrix[ 1 ].z ).length() + ); if ( scaleNode !== null ) { @@ -60,23 +62,20 @@ class SpriteNodeMaterial extends NodeMaterial { if ( object.center && object.center.isVector2 === true ) { - alignedPosition = alignedPosition.sub( uniform( object.center ).sub( 0.5 ) ); + alignedPosition = alignedPosition.sub( uniform( object.center ).sub( vec2( 0.5 ) ) ); } - alignedPosition = alignedPosition.mul( scale ); + alignedPosition = mul( alignedPosition, scale ); const rotation = rotationNode || materialRotation; - const cosAngle = rotation.cos(); - const sinAngle = rotation.sin(); - - const rotatedPosition = vec2( // @TODO: Maybe we can create mat2 and write something like rotationMatrix.mul( alignedPosition )? - vec2( cosAngle, sinAngle.negate() ).dot( alignedPosition ), - vec2( sinAngle, cosAngle ).dot( alignedPosition ) + const rotatedPosition = vec2( + cos( rotation ).mul( alignedPosition.x ).sub( sin( rotation ).mul( alignedPosition.y ) ), + sin( rotation ).mul( alignedPosition.x ).add( cos( rotation ).mul( alignedPosition.y ) ) ); - mvPosition = vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw ); + mvPosition = vec4( mvPosition.xy.add( rotatedPosition.xy ), mvPosition.z, mvPosition.w ); const modelViewProjection = cameraProjectionMatrix.mul( mvPosition ); @@ -106,5 +105,3 @@ class SpriteNodeMaterial extends NodeMaterial { } export default SpriteNodeMaterial; - -addNodeMaterial( SpriteNodeMaterial ); diff --git a/examples/jsm/nodes/materialx/MaterialXNodes.js b/examples/jsm/nodes/materialx/MaterialXNodes.js index 9c713bbf505dd2..1016924d417627 100644 --- a/examples/jsm/nodes/materialx/MaterialXNodes.js +++ b/examples/jsm/nodes/materialx/MaterialXNodes.js @@ -6,63 +6,54 @@ import { } from './lib/mx_noise.js'; import { mx_hsvtorgb, mx_rgbtohsv } from './lib/mx_hsv.js'; import { mx_srgb_texture_to_lin_rec709 } from './lib/mx_transform_color.js'; -import { mix, smoothstep } from '../math/MathNode.js'; -import { uv } from '../accessors/UVNode.js'; -import { float, vec2, vec4 } from '../shadernode/ShaderNode.js'; +import { nodeObject, float, vec2, vec4, add, sub, mul, mix, clamp, uv, length, smoothstep, dFdx, dFdy, sign, pow, abs, convert } from '../shadernode/ShaderNodeElements.js'; export const mx_aastep = ( threshold, value ) => { threshold = float( threshold ); value = float( value ); - const afwidth = vec2( value.dFdx(), value.dFdy() ).length().mul( 0.70710678118654757 ); + const afwidth = mul( length( vec2( dFdx( value ), dFdy( value ) ) ), 0.70710678118654757 ); - return smoothstep( threshold.sub( afwidth ), threshold.add( afwidth ), value ); + return smoothstep( sub( threshold, afwidth ), add( threshold, afwidth ), value ); }; -const _ramp = ( a, b, uv, p ) => mix( a, b, uv[ p ].clamp() ); +const _ramp = ( a, b, uv, p ) => mix( a, b, clamp( nodeObject( uv )[ p ] ) ); export const mx_ramplr = ( valuel, valuer, texcoord = uv() ) => _ramp( valuel, valuer, texcoord, 'x' ); export const mx_ramptb = ( valuet, valueb, texcoord = uv() ) => _ramp( valuet, valueb, texcoord, 'y' ); -const _split = ( a, b, center, uv, p ) => mix( a, b, mx_aastep( center, uv[ p ] ) ); +const _split = ( a, b, center, uv, p ) => mix( a, b, mx_aastep( center, nodeObject( uv )[ p ] ) ); export const mx_splitlr = ( valuel, valuer, center, texcoord = uv() ) => _split( valuel, valuer, center, texcoord, 'x' ); export const mx_splittb = ( valuet, valueb, center, texcoord = uv() ) => _split( valuet, valueb, center, texcoord, 'y' ); -export const mx_transform_uv = ( uv_scale = 1, uv_offset = 0, uv_geo = uv() ) => uv_geo.mul( uv_scale ).add( uv_offset ); +export const mx_transform_uv = ( uv_scale = 1, uv_offset = 0, uv_geo = uv() ) => add( mul( uv_geo, uv_scale ), uv_offset ); -export const mx_safepower = ( in1, in2 = 1 ) => { +export const mx_safepower = ( in1, in2 = 1 ) => mul( sign( in1 ), pow( abs( in1 ), in2 ) ); +export const mx_contrast = ( input, amount = 1, pivot = .5 ) => add( mul( sub( input, pivot ), amount ), pivot ); - in1 = float( in1 ); - - return in1.abs().pow( in2 ).mul( in1.sign() ); - -}; - -export const mx_contrast = ( input, amount = 1, pivot = .5 ) => float( input ).sub( pivot ).mul( amount ).add( pivot ); - -export const mx_noise_float = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => mx_perlin_noise_float( texcoord.convert( 'vec2|vec3' ) ).mul( amplitude ).add( pivot ); -export const mx_noise_vec2 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => mx_perlin_noise_vec2( texcoord.convert( 'vec2|vec3' ) ).mul( amplitude ).add( pivot ); -export const mx_noise_vec3 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => mx_perlin_noise_vec3( texcoord.convert( 'vec2|vec3' ) ).mul( amplitude ).add( pivot ); +export const mx_noise_float = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => add( mul( amplitude, mx_perlin_noise_float( convert( texcoord, 'vec2|vec3' ) ) ), pivot ); +export const mx_noise_vec2 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => add( mul( amplitude, mx_perlin_noise_vec2( convert( texcoord, 'vec2|vec3' ) ) ), pivot ); +export const mx_noise_vec3 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => add( mul( amplitude, mx_perlin_noise_vec3( convert( texcoord, 'vec2|vec3' ) ) ), pivot ); export const mx_noise_vec4 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => { - texcoord = texcoord.convert( 'vec2|vec3' ); // overloading type + texcoord = convert( texcoord, 'vec2|vec3' ); // overloading type - const noise_vec4 = vec4( mx_perlin_noise_vec3( texcoord ), mx_perlin_noise_float( texcoord.add( vec2( 19, 73 ) ) ) ); + const noise_vec4 = vec4( mx_perlin_noise_vec3( texcoord ), mx_perlin_noise_float( add( texcoord, vec2( 19, 73 ) ) ) ); - return noise_vec4.mul( amplitude ).add( pivot ); + return add( mul( amplitude, noise_vec4 ), pivot ); }; -export const mx_worley_noise_float = ( texcoord = uv(), jitter = 1 ) => worley_noise_float( texcoord.convert( 'vec2|vec3' ), jitter, 1 ); -export const mx_worley_noise_vec2 = ( texcoord = uv(), jitter = 1 ) => worley_noise_vec2( texcoord.convert( 'vec2|vec3' ), jitter, 1 ); -export const mx_worley_noise_vec3 = ( texcoord = uv(), jitter = 1 ) => worley_noise_vec3( texcoord.convert( 'vec2|vec3' ), jitter, 1 ); +export const mx_worley_noise_float = ( texcoord = uv(), jitter = 1 ) => worley_noise_float( convert( texcoord, 'vec2|vec3' ), jitter, 1 ); +export const mx_worley_noise_vec2 = ( texcoord = uv(), jitter = 1 ) => worley_noise_vec2( convert( texcoord, 'vec2|vec3' ), jitter, 1 ); +export const mx_worley_noise_vec3 = ( texcoord = uv(), jitter = 1 ) => worley_noise_vec3( convert( texcoord, 'vec2|vec3' ), jitter, 1 ); -export const mx_cell_noise_float = ( texcoord = uv() ) => cell_noise_float( texcoord.convert( 'vec2|vec3' ) ); +export const mx_cell_noise_float = ( texcoord = uv() ) => cell_noise_float( convert( texcoord, 'vec2|vec3' ) ); -export const mx_fractal_noise_float = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => fractal_noise_float( position, octaves, lacunarity, diminish ).mul( amplitude ); -export const mx_fractal_noise_vec2 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => fractal_noise_vec2( position, octaves, lacunarity, diminish ).mul( amplitude ); -export const mx_fractal_noise_vec3 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => fractal_noise_vec3( position, octaves, lacunarity, diminish ).mul( amplitude ); -export const mx_fractal_noise_vec4 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => fractal_noise_vec4( position, octaves, lacunarity, diminish ).mul( amplitude ); +export const mx_fractal_noise_float = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mul( fractal_noise_float( position, octaves, lacunarity, diminish ), amplitude ); +export const mx_fractal_noise_vec2 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mul( fractal_noise_vec2( position, octaves, lacunarity, diminish ), amplitude ); +export const mx_fractal_noise_vec3 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mul( fractal_noise_vec3( position, octaves, lacunarity, diminish ), amplitude ); +export const mx_fractal_noise_vec4 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mul( fractal_noise_vec4( position, octaves, lacunarity, diminish ), amplitude ); export { mx_hsvtorgb, mx_rgbtohsv, mx_srgb_texture_to_lin_rec709 }; diff --git a/examples/jsm/nodes/materialx/lib/mx_hsv.js b/examples/jsm/nodes/materialx/lib/mx_hsv.js index eda0b415ae2625..0190e600bb8bbc 100644 --- a/examples/jsm/nodes/materialx/lib/mx_hsv.js +++ b/examples/jsm/nodes/materialx/lib/mx_hsv.js @@ -1,4 +1,4 @@ -import { fn } from '../../core/FunctionNode.js'; +import { fn } from '../../Nodes.js'; // Original shader code from: // https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_hsv.glsl diff --git a/examples/jsm/nodes/materialx/lib/mx_noise.js b/examples/jsm/nodes/materialx/lib/mx_noise.js index 7063c00be35f19..5ca3a415b15935 100644 --- a/examples/jsm/nodes/materialx/lib/mx_noise.js +++ b/examples/jsm/nodes/materialx/lib/mx_noise.js @@ -1,5 +1,4 @@ -import { code } from '../../core/CodeNode.js'; -import { fn } from '../../core/FunctionNode.js'; +import { code, fn } from '../../Nodes.js'; // Original shader code from: // https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_noise.glsl diff --git a/examples/jsm/nodes/materialx/lib/mx_transform_color.js b/examples/jsm/nodes/materialx/lib/mx_transform_color.js index 9aed929d4c9424..6ca401de9eaa73 100644 --- a/examples/jsm/nodes/materialx/lib/mx_transform_color.js +++ b/examples/jsm/nodes/materialx/lib/mx_transform_color.js @@ -1,5 +1,4 @@ -import { code } from '../../core/CodeNode.js'; -import { fn } from '../../core/FunctionNode.js'; +import { code, fn } from '../../Nodes.js'; // Original shader code from: // https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_transform_color.glsl diff --git a/examples/jsm/nodes/math/CondNode.js b/examples/jsm/nodes/math/CondNode.js index 2bd1792bcc1c40..0b116475519236 100644 --- a/examples/jsm/nodes/math/CondNode.js +++ b/examples/jsm/nodes/math/CondNode.js @@ -1,7 +1,6 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { property } from '../core/PropertyNode.js'; -import { context as contextNode } from '../core/ContextNode.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import PropertyNode from '../core/PropertyNode.js'; +import ContextNode from '../core/ContextNode.js'; class CondNode extends Node { @@ -42,19 +41,19 @@ class CondNode extends Node { const context = { tempWrite: false }; const needsProperty = this.ifNode.getNodeType( builder ) !== 'void' || ( this.elseNode && this.elseNode.getNodeType( builder ) !== 'void' ); - const nodeProperty = needsProperty ? property( type ).build( builder ) : ''; + const nodeProperty = needsProperty ? new PropertyNode( type ).build( builder ) : ''; - const nodeSnippet = contextNode( this.condNode/*, context*/ ).build( builder, 'bool' ); + const nodeSnippet = new ContextNode( this.condNode/*, context*/ ).build( builder, 'bool' ); builder.addFlowCode( `if ( ${nodeSnippet} ) {\n\n\t\t`, false ); - let ifSnippet = contextNode( this.ifNode, context ).build( builder, type ); + let ifSnippet = new ContextNode( this.ifNode, context ).build( builder, type ); ifSnippet = needsProperty ? nodeProperty + ' = ' + ifSnippet + ';' : ifSnippet; builder.addFlowCode( ifSnippet + '\n\n\t}', false ); - let elseSnippet = this.elseNode ? contextNode( this.elseNode, context ).build( builder, type ) : null; + let elseSnippet = this.elseNode ? new ContextNode( this.elseNode, context ).build( builder, type ) : null; if ( elseSnippet ) { @@ -71,9 +70,3 @@ class CondNode extends Node { } export default CondNode; - -export const cond = nodeProxy( CondNode ); - -addNodeElement( 'cond', cond ); - -addNodeClass( CondNode ); diff --git a/examples/jsm/nodes/math/MathNode.js b/examples/jsm/nodes/math/MathNode.js index 160ae72fc35183..aa346e44f97c53 100644 --- a/examples/jsm/nodes/math/MathNode.js +++ b/examples/jsm/nodes/math/MathNode.js @@ -1,7 +1,7 @@ import TempNode from '../core/TempNode.js'; -import { sub, mul, div } from './OperatorNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeObject, nodeProxy, float, vec3, vec4 } from '../shadernode/ShaderNode.js'; +import ExpressionNode from '../core/ExpressionNode.js'; +import SplitNode from '../utils/SplitNode.js'; +import OperatorNode from './OperatorNode.js'; class MathNode extends TempNode { @@ -88,33 +88,29 @@ class MathNode extends TempNode { if ( builder.isMatrix( tA.getNodeType( builder ) ) ) { - tB = vec4( vec3( tB ), 0.0 ); + tB = new ExpressionNode( `${ builder.getType( 'vec4' ) }( ${ tB.build( builder, 'vec3' ) }, 0.0 )`, 'vec4' ); } else { - tA = vec4( vec3( tA ), 0.0 ); + tA = new ExpressionNode( `${ builder.getType( 'vec4' ) }( ${ tA.build( builder, 'vec3' ) }, 0.0 )`, 'vec4' ); } - const mulNode = mul( tA, tB ).xyz; + const mulNode = new SplitNode( new OperatorNode( '*', tA, tB ), 'xyz' ); - return normalize( mulNode ).build( builder, output ); + return new MathNode( MathNode.NORMALIZE, mulNode ).build( builder ); } else if ( method === MathNode.NEGATE ) { - return builder.format( '-' + a.build( builder, inputType ), type, output ); + return builder.format( '( -' + a.build( builder, inputType ) + ' )', type, output ); } else if ( method === MathNode.INVERT ) { - return sub( 1.0, a ).build( builder, output ); + return builder.format( '( 1.0 - ' + a.build( builder, inputType ) + ' )', type, output ); } else if ( method === MathNode.RECIPROCAL ) { - return div( 1.0, a ).build( builder, output ); - - } else if ( method === MathNode.DIFFERENCE ) { - - return abs( sub( a, b ) ).build( builder, output ); + return builder.format( '( 1.0 / ' + a.build( builder, inputType ) + ' )', type, output ); } else { @@ -160,8 +156,16 @@ class MathNode extends TempNode { } else { params.push( a.build( builder, inputType ) ); - if ( b !== null ) params.push( b.build( builder, inputType ) ); - if ( c !== null ) params.push( c.build( builder, inputType ) ); + + if ( c !== null ) { + + params.push( b.build( builder, inputType ), c.build( builder, inputType ) ); + + } else if ( b !== null ) { + + params.push( b.build( builder, inputType ) ); + + } } @@ -228,7 +232,6 @@ MathNode.MOD = 'mod'; MathNode.STEP = 'step'; MathNode.REFLECT = 'reflect'; MathNode.DISTANCE = 'distance'; -MathNode.DIFFERENCE = 'difference'; MathNode.DOT = 'dot'; MathNode.CROSS = 'cross'; MathNode.POW = 'pow'; @@ -243,106 +246,3 @@ MathNode.SMOOTHSTEP = 'smoothstep'; MathNode.FACEFORWARD = 'faceforward'; export default MathNode; - -export const EPSILON = float( 1e-6 ); -export const INFINITY = float( 1e6 ); - -export const radians = nodeProxy( MathNode, MathNode.RADIANS ); -export const degrees = nodeProxy( MathNode, MathNode.DEGREES ); -export const exp = nodeProxy( MathNode, MathNode.EXP ); -export const exp2 = nodeProxy( MathNode, MathNode.EXP2 ); -export const log = nodeProxy( MathNode, MathNode.LOG ); -export const log2 = nodeProxy( MathNode, MathNode.LOG2 ); -export const sqrt = nodeProxy( MathNode, MathNode.SQRT ); -export const inversesqrt = nodeProxy( MathNode, MathNode.INVERSE_SQRT ); -export const floor = nodeProxy( MathNode, MathNode.FLOOR ); -export const ceil = nodeProxy( MathNode, MathNode.CEIL ); -export const normalize = nodeProxy( MathNode, MathNode.NORMALIZE ); -export const fract = nodeProxy( MathNode, MathNode.FRACT ); -export const sin = nodeProxy( MathNode, MathNode.SIN ); -export const cos = nodeProxy( MathNode, MathNode.COS ); -export const tan = nodeProxy( MathNode, MathNode.TAN ); -export const asin = nodeProxy( MathNode, MathNode.ASIN ); -export const acos = nodeProxy( MathNode, MathNode.ACOS ); -export const atan = nodeProxy( MathNode, MathNode.ATAN ); -export const abs = nodeProxy( MathNode, MathNode.ABS ); -export const sign = nodeProxy( MathNode, MathNode.SIGN ); -export const length = nodeProxy( MathNode, MathNode.LENGTH ); -export const negate = nodeProxy( MathNode, MathNode.NEGATE ); -export const invert = nodeProxy( MathNode, MathNode.INVERT ); -export const dFdx = nodeProxy( MathNode, MathNode.DFDX ); -export const dFdy = nodeProxy( MathNode, MathNode.DFDY ); -export const round = nodeProxy( MathNode, MathNode.ROUND ); -export const reciprocal = nodeProxy( MathNode, MathNode.RECIPROCAL ); - -export const atan2 = nodeProxy( MathNode, MathNode.ATAN2 ); -export const min = nodeProxy( MathNode, MathNode.MIN ); -export const max = nodeProxy( MathNode, MathNode.MAX ); -export const mod = nodeProxy( MathNode, MathNode.MOD ); -export const step = nodeProxy( MathNode, MathNode.STEP ); -export const reflect = nodeProxy( MathNode, MathNode.REFLECT ); -export const distance = nodeProxy( MathNode, MathNode.DISTANCE ); -export const difference = nodeProxy( MathNode, MathNode.DIFFERENCE ); -export const dot = nodeProxy( MathNode, MathNode.DOT ); -export const cross = nodeProxy( MathNode, MathNode.CROSS ); -export const pow = nodeProxy( MathNode, MathNode.POW ); -export const pow2 = nodeProxy( MathNode, MathNode.POW, 2 ); -export const pow3 = nodeProxy( MathNode, MathNode.POW, 3 ); -export const pow4 = nodeProxy( MathNode, MathNode.POW, 4 ); -export const transformDirection = nodeProxy( MathNode, MathNode.TRANSFORM_DIRECTION ); - -export const mix = nodeProxy( MathNode, MathNode.MIX ); -export const clamp = ( value, low = 0, high = 1 ) => nodeObject( new MathNode( MathNode.CLAMP, nodeObject( value ), nodeObject( low ), nodeObject( high ) ) ); -export const refract = nodeProxy( MathNode, MathNode.REFRACT ); -export const smoothstep = nodeProxy( MathNode, MathNode.SMOOTHSTEP ); -export const faceforward = nodeProxy( MathNode, MathNode.FACEFORWARD ); - -addNodeElement( 'radians', radians ); -addNodeElement( 'degrees', degrees ); -addNodeElement( 'exp', exp ); -addNodeElement( 'exp2', exp2 ); -addNodeElement( 'log', log ); -addNodeElement( 'log2', log2 ); -addNodeElement( 'sqrt', sqrt ); -addNodeElement( 'inversesqrt', inversesqrt ); -addNodeElement( 'floor', floor ); -addNodeElement( 'ceil', ceil ); -addNodeElement( 'normalize', normalize ); -addNodeElement( 'fract', fract ); -addNodeElement( 'sin', sin ); -addNodeElement( 'cos', cos ); -addNodeElement( 'tan', tan ); -addNodeElement( 'asin', asin ); -addNodeElement( 'acos', acos ); -addNodeElement( 'atan', atan ); -addNodeElement( 'abs', abs ); -addNodeElement( 'sign', sign ); -addNodeElement( 'length', length ); -addNodeElement( 'negate', negate ); -addNodeElement( 'invert', invert ); -addNodeElement( 'dFdx', dFdx ); -addNodeElement( 'dFdy', dFdy ); -addNodeElement( 'round', round ); -addNodeElement( 'reciprocal', reciprocal ); -addNodeElement( 'atan2', atan2 ); -addNodeElement( 'min', min ); -addNodeElement( 'max', max ); -addNodeElement( 'mod', mod ); -addNodeElement( 'step', step ); -addNodeElement( 'reflect', reflect ); -addNodeElement( 'distance', distance ); -addNodeElement( 'dot', dot ); -addNodeElement( 'cross', cross ); -addNodeElement( 'pow', pow ); -addNodeElement( 'pow2', pow2 ); -addNodeElement( 'pow3', pow3 ); -addNodeElement( 'pow4', pow4 ); -addNodeElement( 'transformDirection', transformDirection ); -addNodeElement( 'mix', mix ); -addNodeElement( 'clamp', clamp ); -addNodeElement( 'refract', refract ); -addNodeElement( 'smoothstep', smoothstep ); -addNodeElement( 'faceforward', faceforward ); -addNodeElement( 'difference', difference ); - -addNodeClass( MathNode ); diff --git a/examples/jsm/nodes/math/OperatorNode.js b/examples/jsm/nodes/math/OperatorNode.js index f81bb608eb3bcb..555ecd5479c6eb 100644 --- a/examples/jsm/nodes/math/OperatorNode.js +++ b/examples/jsm/nodes/math/OperatorNode.js @@ -1,6 +1,4 @@ import TempNode from '../core/TempNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; class OperatorNode extends TempNode { @@ -63,7 +61,7 @@ class OperatorNode extends TempNode { } else if ( op === '<' || op === '>' || op === '<=' || op === '>=' ) { - const typeLength = output ? builder.getTypeLength( output ) : Math.max( builder.getTypeLength( typeA ), builder.getTypeLength( typeB ) ); + const typeLength = builder.getTypeLength( output ); return typeLength > 1 ? `bvec${ typeLength }` : 'bool'; @@ -225,45 +223,3 @@ class OperatorNode extends TempNode { } export default OperatorNode; - -export const add = nodeProxy( OperatorNode, '+' ); -export const sub = nodeProxy( OperatorNode, '-' ); -export const mul = nodeProxy( OperatorNode, '*' ); -export const div = nodeProxy( OperatorNode, '/' ); -export const remainder = nodeProxy( OperatorNode, '%' ); -export const equal = nodeProxy( OperatorNode, '==' ); -export const assign = nodeProxy( OperatorNode, '=' ); -export const lessThan = nodeProxy( OperatorNode, '<' ); -export const greaterThan = nodeProxy( OperatorNode, '>' ); -export const lessThanEqual = nodeProxy( OperatorNode, '<=' ); -export const greaterThanEqual = nodeProxy( OperatorNode, '>=' ); -export const and = nodeProxy( OperatorNode, '&&' ); -export const or = nodeProxy( OperatorNode, '||' ); -export const xor = nodeProxy( OperatorNode, '^^' ); -export const bitAnd = nodeProxy( OperatorNode, '&' ); -export const bitOr = nodeProxy( OperatorNode, '|' ); -export const bitXor = nodeProxy( OperatorNode, '^' ); -export const shiftLeft = nodeProxy( OperatorNode, '<<' ); -export const shiftRight = nodeProxy( OperatorNode, '>>' ); - -addNodeElement( 'add', add ); -addNodeElement( 'sub', sub ); -addNodeElement( 'mul', mul ); -addNodeElement( 'div', div ); -addNodeElement( 'remainder', remainder ); -addNodeElement( 'equal', equal ); -addNodeElement( 'assign', assign ); -addNodeElement( 'lessThan', lessThan ); -addNodeElement( 'greaterThan', greaterThan ); -addNodeElement( 'lessThanEqual', lessThanEqual ); -addNodeElement( 'greaterThanEqual', greaterThanEqual ); -addNodeElement( 'and', and ); -addNodeElement( 'or', or ); -addNodeElement( 'xor', xor ); -addNodeElement( 'bitAnd', bitAnd ); -addNodeElement( 'bitOr', bitOr ); -addNodeElement( 'bitXor', bitXor ); -addNodeElement( 'shiftLeft', shiftLeft ); -addNodeElement( 'shiftRight', shiftRight ); - -addNodeClass( OperatorNode ); diff --git a/examples/jsm/nodes/procedural/CheckerNode.js b/examples/jsm/nodes/procedural/CheckerNode.js index b4816a8053c2a1..2ffb73d639342e 100644 --- a/examples/jsm/nodes/procedural/CheckerNode.js +++ b/examples/jsm/nodes/procedural/CheckerNode.js @@ -1,17 +1,15 @@ import TempNode from '../core/TempNode.js'; -import { uv } from '../accessors/UVNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, ShaderNode, nodeProxy } from '../shadernode/ShaderNode.js'; +import { ShaderNode, uv, add, mul, floor, mod, sign } from '../shadernode/ShaderNodeBaseElements.js'; const checkerShaderNode = new ShaderNode( ( inputs ) => { - const uv = inputs.uv.mul( 2.0 ); + const uv = mul( inputs.uv, 2.0 ); - const cx = uv.x.floor(); - const cy = uv.y.floor(); - const result = cx.add( cy ).mod( 2.0 ); + const cx = floor( uv.x ); + const cy = floor( uv.y ); + const result = mod( add( cx, cy ), 2.0 ); - return result.sign(); + return sign( result ); } ); @@ -34,9 +32,3 @@ class CheckerNode extends TempNode { } export default CheckerNode; - -export const checker = nodeProxy( CheckerNode ); - -addNodeElement( 'checker', checker ); - -addNodeClass( CheckerNode ); diff --git a/examples/jsm/nodes/shadernode/ShaderNode.js b/examples/jsm/nodes/shadernode/ShaderNode.js index 8972b7281d49ff..7230844e5b3473 100644 --- a/examples/jsm/nodes/shadernode/ShaderNode.js +++ b/examples/jsm/nodes/shadernode/ShaderNode.js @@ -1,21 +1,13 @@ -import Node, { addNodeClass } from '../core/Node.js'; +import Node from '../core/Node.js'; import ArrayElementNode from '../utils/ArrayElementNode.js'; import ConvertNode from '../utils/ConvertNode.js'; import JoinNode from '../utils/JoinNode.js'; import SplitNode from '../utils/SplitNode.js'; import ConstNode from '../core/ConstNode.js'; +import StackNode from '../core/StackNode.js'; import { getValueFromType } from '../core/NodeUtils.js'; -const NodeElements = new Map(); // @TODO: Currently only a few nodes are added, probably also add others - -export function addNodeElement( name, nodeElement ) { - - if ( NodeElements.has( name ) ) throw new Error( `Redefinition of node element ${ name }` ); - if ( typeof nodeElement !== 'function' ) throw new Error( `Node element ${ name } is not a function` ); - - NodeElements.set( name, nodeElement ); - -} +import * as NodeElements from './ShaderNodeElements.js'; const shaderNodeHandler = { @@ -31,19 +23,7 @@ const shaderNodeHandler = { if ( typeof prop === 'string' && node[ prop ] === undefined ) { - if ( NodeElements.has( prop ) ) { - - const nodeElement = NodeElements.get( prop ); - - return ( ...params ) => nodeElement( nodeObj, ...params ); - - } else if ( prop.endsWith( 'Assign' ) && NodeElements.has( prop.slice( 0, prop.length - 'Assign'.length ) ) ) { - - const nodeElement = NodeElements.get( prop.slice( 0, prop.length - 'Assign'.length ) ); - - return ( ...params ) => nodeObj.assign( nodeElement( nodeObj, ...params ) ); - - } else if ( /^[xyzwrgbastpq]{1,4}$/.test( prop ) === true ) { + if ( /^[xyzwrgbastpq]{1,4}$/.test( prop ) === true ) { // accessing properties ( swizzle ) @@ -55,18 +35,18 @@ const shaderNodeHandler = { return nodeObject( new SplitNode( node, prop ) ); - } else if ( prop === 'width' || prop === 'height' ) { - - // accessing property - - return nodeObject( new SplitNode( node, prop === 'width' ? 'x' : 'y' ) ); - } else if ( /^\d+$/.test( prop ) === true ) { // accessing array return nodeObject( new ArrayElementNode( node, new ConstNode( Number( prop ), 'uint' ) ) ); + } else if ( NodeElements[ prop ] ) { + + const nodeElement = NodeElements[ prop ]; + + return ( ...params ) => nodeElement( nodeObj, ...params ); + } } @@ -187,11 +167,11 @@ class ShaderNodeInternal extends Node { } - call( inputs, stack, builder ) { + call( inputs, builder ) { inputs = nodeObjects( inputs ); - return nodeObject( this._jsFunc( inputs, stack, builder ) ); + return nodeObject( this._jsFunc( inputs, builder ) ); } @@ -205,14 +185,29 @@ class ShaderNodeInternal extends Node { construct( builder ) { - const stackNode = builder.createStack(); + const stackNode = new StackNode(); stackNode.outputNode = this.call( {}, stackNode, builder ); + return stackNode; } } +const ShaderNodeScript = function ( jsFunc ) { + + return new ShaderNodeInternal( jsFunc ); + +}; + +export const ShaderNode = new Proxy( ShaderNodeScript, shaderNodeHandler ); + +export const nodeObject = ( val ) => /* new */ ShaderNodeObject( val ); +export const nodeObjects = ( val ) => new ShaderNodeObjects( val ); +export const nodeArray = ( val ) => new ShaderNodeArray( val ); +export const nodeProxy = ( ...val ) => new ShaderNodeProxy( ...val ); +export const nodeImmutable = ( ...val ) => new ShaderNodeImmutable( ...val ); + const bools = [ false, true ]; const uints = [ 0, 1, 2, 3 ]; const ints = [ - 1, - 2 ]; @@ -231,7 +226,7 @@ const floatsCacheMap = new Map( [ ...intsCacheMap ].map( el => new ConstNode( el for ( const float of floats ) floatsCacheMap.set( float, new ConstNode( float ) ); for ( const float of floats ) floatsCacheMap.set( - float, new ConstNode( - float ) ); -const cacheMaps = { bool: boolsCacheMap, uint: uintsCacheMap, ints: intsCacheMap, float: floatsCacheMap }; +export const cacheMaps = { bool: boolsCacheMap, uint: uintsCacheMap, ints: intsCacheMap, float: floatsCacheMap }; const constNodesCacheMap = new Map( [ ...boolsCacheMap, ...floatsCacheMap ] ); @@ -253,7 +248,7 @@ const getAutoTypedConstNode = ( value ) => { }; -const ConvertType = function ( type, cacheMap = null ) { +export const ConvertType = function ( type, cacheMap = null ) { return ( ...params ) => { @@ -291,93 +286,4 @@ const ConvertType = function ( type, cacheMap = null ) { }; -// exports - -// utils - -export const getConstNodeType = ( value ) => ( value !== undefined && value !== null ) ? ( value.nodeType || value.convertTo || ( typeof value === 'string' ? value : null ) ) : null; - -// shader node base - -export function ShaderNode( jsFunc ) { - - return new Proxy( new ShaderNodeInternal( jsFunc ), shaderNodeHandler ); - -} - -export const nodeObject = ( val ) => /* new */ ShaderNodeObject( val ); -export const nodeObjects = ( val ) => new ShaderNodeObjects( val ); -export const nodeArray = ( val ) => new ShaderNodeArray( val ); -export const nodeProxy = ( ...val ) => new ShaderNodeProxy( ...val ); -export const nodeImmutable = ( ...val ) => new ShaderNodeImmutable( ...val ); - -addNodeClass( ShaderNode ); - -// types -// @TODO: Maybe export from ConstNode.js? - -export const color = new ConvertType( 'color' ); - -export const float = new ConvertType( 'float', cacheMaps.float ); -export const int = new ConvertType( 'int', cacheMaps.int ); -export const uint = new ConvertType( 'uint', cacheMaps.uint ); -export const bool = new ConvertType( 'bool', cacheMaps.bool ); - -export const vec2 = new ConvertType( 'vec2' ); -export const ivec2 = new ConvertType( 'ivec2' ); -export const uvec2 = new ConvertType( 'uvec2' ); -export const bvec2 = new ConvertType( 'bvec2' ); - -export const vec3 = new ConvertType( 'vec3' ); -export const ivec3 = new ConvertType( 'ivec3' ); -export const uvec3 = new ConvertType( 'uvec3' ); -export const bvec3 = new ConvertType( 'bvec3' ); - -export const vec4 = new ConvertType( 'vec4' ); -export const ivec4 = new ConvertType( 'ivec4' ); -export const uvec4 = new ConvertType( 'uvec4' ); -export const bvec4 = new ConvertType( 'bvec4' ); - -export const mat3 = new ConvertType( 'mat3' ); -export const imat3 = new ConvertType( 'imat3' ); -export const umat3 = new ConvertType( 'umat3' ); -export const bmat3 = new ConvertType( 'bmat3' ); - -export const mat4 = new ConvertType( 'mat4' ); -export const imat4 = new ConvertType( 'imat4' ); -export const umat4 = new ConvertType( 'umat4' ); -export const bmat4 = new ConvertType( 'bmat4' ); - -addNodeElement( 'color', color ); -addNodeElement( 'float', float ); -addNodeElement( 'int', int ); -addNodeElement( 'uint', uint ); -addNodeElement( 'bool', bool ); -addNodeElement( 'vec2', vec2 ); -addNodeElement( 'ivec2', ivec2 ); -addNodeElement( 'uvec2', uvec2 ); -addNodeElement( 'bvec2', bvec2 ); -addNodeElement( 'vec3', vec3 ); -addNodeElement( 'ivec3', ivec3 ); -addNodeElement( 'uvec3', uvec3 ); -addNodeElement( 'bvec3', bvec3 ); -addNodeElement( 'vec4', vec4 ); -addNodeElement( 'ivec4', ivec4 ); -addNodeElement( 'uvec4', uvec4 ); -addNodeElement( 'bvec4', bvec4 ); -addNodeElement( 'mat3', mat3 ); -addNodeElement( 'imat3', imat3 ); -addNodeElement( 'umat3', umat3 ); -addNodeElement( 'bmat3', bmat3 ); -addNodeElement( 'mat4', mat4 ); -addNodeElement( 'imat4', imat4 ); -addNodeElement( 'umat4', umat4 ); -addNodeElement( 'bmat4', bmat4 ); - -// basic nodes -// HACK - we cannot export them from the corresponding files because of the cyclic dependency -export const element = nodeProxy( ArrayElementNode ); -export const convert = ( node, types ) => nodeObject( new ConvertNode( nodeObject( node ), types ) ); - -addNodeElement( 'element', element ); -addNodeElement( 'convert', convert ); +export const getConstNodeType = ( value ) => value.nodeType || value.convertTo || ( typeof value === 'string' ? value : null ); diff --git a/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js b/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js new file mode 100644 index 00000000000000..c6737ce6798b40 --- /dev/null +++ b/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js @@ -0,0 +1,321 @@ +// core +//import ArrayUniformNode from '../core/ArrayUniformNode.js'; +import AttributeNode from '../core/AttributeNode.js'; +import BypassNode from '../core/BypassNode.js'; +import CacheNode from '../core/CacheNode.js'; +import CodeNode from '../core/CodeNode.js'; +import ContextNode from '../core/ContextNode.js'; +import ExpressionNode from '../core/ExpressionNode.js'; +import FunctionCallNode from '../core/FunctionCallNode.js'; +import FunctionNode from '../core/FunctionNode.js'; +import InstanceIndexNode from '../core/InstanceIndexNode.js'; +import LightingModel from '../core/LightingModel.js'; +import PropertyNode from '../core/PropertyNode.js'; +import UniformNode from '../core/UniformNode.js'; +import VarNode from '../core/VarNode.js'; +import VaryingNode from '../core/VaryingNode.js'; + +// accessors +import BitangentNode from '../accessors/BitangentNode.js'; +import BufferNode from '../accessors/BufferNode.js'; +import CameraNode from '../accessors/CameraNode.js'; +import MaterialNode from '../accessors/MaterialNode.js'; +import MaterialReferenceNode from '../accessors/MaterialReferenceNode.js'; +import ModelViewProjectionNode from '../accessors/ModelViewProjectionNode.js'; +import NormalNode from '../accessors/NormalNode.js'; +import ModelNode from '../accessors/ModelNode.js'; +import Object3DNode from '../accessors/Object3DNode.js'; +import PointUVNode from '../accessors/PointUVNode.js'; +import PositionNode from '../accessors/PositionNode.js'; +import ReferenceNode from '../accessors/ReferenceNode.js'; +import StorageBufferNode from '../accessors/StorageBufferNode.js'; +import TangentNode from '../accessors/TangentNode.js'; +import TextureNode from '../accessors/TextureNode.js'; +import UserDataNode from '../accessors/UserDataNode.js'; +import UVNode from '../accessors/UVNode.js'; + +// display +import FrontFacingNode from '../display/FrontFacingNode.js'; + +// gpgpu +import ComputeNode from '../gpgpu/ComputeNode.js'; + +// math +import MathNode from '../math/MathNode.js'; +import OperatorNode from '../math/OperatorNode.js'; +import CondNode from '../math/CondNode.js'; + +// utils +import ArrayElementNode from '../utils/ArrayElementNode.js'; +import ConvertNode from '../utils/ConvertNode.js'; +import DiscardNode from '../utils/DiscardNode.js'; +import MaxMipLevelNode from '../utils/MaxMipLevelNode.js'; + +// shader node utils +import { ShaderNode, nodeObject, nodeObjects, nodeArray, nodeProxy, nodeImmutable, ConvertType, getConstNodeType, cacheMaps } from './ShaderNode.js'; + +// shader node base + +export { ShaderNode, nodeObject, nodeObjects, nodeArray, nodeProxy, nodeImmutable }; + +export const color = new ConvertType( 'color' ); + +export const float = new ConvertType( 'float', cacheMaps.float ); +export const int = new ConvertType( 'int', cacheMaps.int ); +export const uint = new ConvertType( 'uint', cacheMaps.uint ); +export const bool = new ConvertType( 'bool', cacheMaps.bool ); + +export const vec2 = new ConvertType( 'vec2' ); +export const ivec2 = new ConvertType( 'ivec2' ); +export const uvec2 = new ConvertType( 'uvec2' ); +export const bvec2 = new ConvertType( 'bvec2' ); + +export const vec3 = new ConvertType( 'vec3' ); +export const ivec3 = new ConvertType( 'ivec3' ); +export const uvec3 = new ConvertType( 'uvec3' ); +export const bvec3 = new ConvertType( 'bvec3' ); + +export const vec4 = new ConvertType( 'vec4' ); +export const ivec4 = new ConvertType( 'ivec4' ); +export const uvec4 = new ConvertType( 'uvec4' ); +export const bvec4 = new ConvertType( 'bvec4' ); + +export const mat3 = new ConvertType( 'mat3' ); +export const imat3 = new ConvertType( 'imat3' ); +export const umat3 = new ConvertType( 'umat3' ); +export const bmat3 = new ConvertType( 'bmat3' ); + +export const mat4 = new ConvertType( 'mat4' ); +export const imat4 = new ConvertType( 'imat4' ); +export const umat4 = new ConvertType( 'umat4' ); +export const bmat4 = new ConvertType( 'bmat4' ); + +// core + +// @TODO: ArrayUniformNode + +export const func = ( code, includes ) => { + + const node = nodeObject( new FunctionNode( code, includes ) ); + + const call = node.call.bind( node ); + node.call = ( ...params ) => nodeObject( call( params.length > 1 || ( params[ 0 ] && params[ 0 ].isNode === true ) ? nodeArray( params ) : nodeObjects( params[ 0 ] ) ) ); + + return node; + +}; + +export const uniform = ( nodeOrType ) => { + + const nodeType = getConstNodeType( nodeOrType ); + + // @TODO: get ConstNode from .traverse() in the future + const value = nodeOrType.isNode === true ? ( nodeOrType.node && nodeOrType.node.value ) || nodeOrType.value : nodeOrType; + + return nodeObject( new UniformNode( value, nodeType ) ); + +}; + +export const fn = ( code, includes ) => func( code, includes ).call; + +export const attribute = ( name, nodeType ) => nodeObject( new AttributeNode( name, nodeType ) ); +export const property = ( name, nodeOrType ) => nodeObject( new PropertyNode( name, getConstNodeType( nodeOrType ) ) ); + +export const convert = ( node, types ) => nodeObject( new ConvertNode( nodeObject( node ), types ) ); +export const maxMipLevel = nodeProxy( MaxMipLevelNode ); + +export const bypass = nodeProxy( BypassNode ); +export const cache = nodeProxy( CacheNode ); +export const code = nodeProxy( CodeNode ); +export const context = nodeProxy( ContextNode ); +export const expression = nodeProxy( ExpressionNode ); +export const call = nodeProxy( FunctionCallNode ); +export const instanceIndex = nodeImmutable( InstanceIndexNode ); +export const label = nodeProxy( VarNode ); +export const temp = label; +export const varying = nodeProxy( VaryingNode ); + +// math + +export const EPSILON = float( 1e-6 ); +export const INFINITY = float( 1e6 ); + +export const cond = nodeProxy( CondNode ); + +export const add = nodeProxy( OperatorNode, '+' ); +export const sub = nodeProxy( OperatorNode, '-' ); +export const mul = nodeProxy( OperatorNode, '*' ); +export const div = nodeProxy( OperatorNode, '/' ); +export const remainder = nodeProxy( OperatorNode, '%' ); +export const equal = nodeProxy( OperatorNode, '==' ); +export const assign = nodeProxy( OperatorNode, '=' ); +export const lessThan = nodeProxy( OperatorNode, '<' ); +export const greaterThan = nodeProxy( OperatorNode, '>' ); +export const lessThanEqual = nodeProxy( OperatorNode, '<=' ); +export const greaterThanEqual = nodeProxy( OperatorNode, '>=' ); +export const and = nodeProxy( OperatorNode, '&&' ); +export const or = nodeProxy( OperatorNode, '||' ); +export const xor = nodeProxy( OperatorNode, '^^' ); +export const bitAnd = nodeProxy( OperatorNode, '&' ); +export const bitOr = nodeProxy( OperatorNode, '|' ); +export const bitXor = nodeProxy( OperatorNode, '^' ); +export const shiftLeft = nodeProxy( OperatorNode, '<<' ); +export const shiftRight = nodeProxy( OperatorNode, '>>' ); + +export const radians = nodeProxy( MathNode, MathNode.RADIANS ); +export const degrees = nodeProxy( MathNode, MathNode.DEGREES ); +export const exp = nodeProxy( MathNode, MathNode.EXP ); +export const exp2 = nodeProxy( MathNode, MathNode.EXP2 ); +export const log = nodeProxy( MathNode, MathNode.LOG ); +export const log2 = nodeProxy( MathNode, MathNode.LOG2 ); +export const sqrt = nodeProxy( MathNode, MathNode.SQRT ); +export const inversesqrt = nodeProxy( MathNode, MathNode.INVERSE_SQRT ); +export const floor = nodeProxy( MathNode, MathNode.FLOOR ); +export const ceil = nodeProxy( MathNode, MathNode.CEIL ); +export const normalize = nodeProxy( MathNode, MathNode.NORMALIZE ); +export const fract = nodeProxy( MathNode, MathNode.FRACT ); +export const sin = nodeProxy( MathNode, MathNode.SIN ); +export const cos = nodeProxy( MathNode, MathNode.COS ); +export const tan = nodeProxy( MathNode, MathNode.TAN ); +export const asin = nodeProxy( MathNode, MathNode.ASIN ); +export const acos = nodeProxy( MathNode, MathNode.ACOS ); +export const atan = nodeProxy( MathNode, MathNode.ATAN ); +export const abs = nodeProxy( MathNode, MathNode.ABS ); +export const sign = nodeProxy( MathNode, MathNode.SIGN ); +export const length = nodeProxy( MathNode, MathNode.LENGTH ); +export const negate = nodeProxy( MathNode, MathNode.NEGATE ); +export const invert = nodeProxy( MathNode, MathNode.INVERT ); +export const dFdx = nodeProxy( MathNode, MathNode.DFDX ); +export const dFdy = nodeProxy( MathNode, MathNode.DFDY ); +export const round = nodeProxy( MathNode, MathNode.ROUND ); +export const reciprocal = nodeProxy( MathNode, MathNode.RECIPROCAL ); + +export const atan2 = nodeProxy( MathNode, MathNode.ATAN2 ); +export const min = nodeProxy( MathNode, MathNode.MIN ); +export const max = nodeProxy( MathNode, MathNode.MAX ); +export const mod = nodeProxy( MathNode, MathNode.MOD ); +export const step = nodeProxy( MathNode, MathNode.STEP ); +export const reflect = nodeProxy( MathNode, MathNode.REFLECT ); +export const distance = nodeProxy( MathNode, MathNode.DISTANCE ); +export const dot = nodeProxy( MathNode, MathNode.DOT ); +export const cross = nodeProxy( MathNode, MathNode.CROSS ); +export const pow = nodeProxy( MathNode, MathNode.POW ); +export const pow2 = nodeProxy( MathNode, MathNode.POW, 2 ); +export const pow3 = nodeProxy( MathNode, MathNode.POW, 3 ); +export const pow4 = nodeProxy( MathNode, MathNode.POW, 4 ); +export const transformDirection = nodeProxy( MathNode, MathNode.TRANSFORM_DIRECTION ); + +export const mix = nodeProxy( MathNode, MathNode.MIX ); +export const clamp = ( value, low = 0, high = 1 ) => nodeObject( new MathNode( MathNode.CLAMP, nodeObject( value ), nodeObject( low ), nodeObject( high ) ) ); +export const refract = nodeProxy( MathNode, MathNode.REFRACT ); +export const smoothstep = nodeProxy( MathNode, MathNode.SMOOTHSTEP ); +export const faceforward = nodeProxy( MathNode, MathNode.FACEFORWARD ); + +// accessors + +export const buffer = ( value, nodeOrType, count ) => nodeObject( new BufferNode( value, getConstNodeType( nodeOrType ), count ) ); +export const storage = ( value, nodeOrType, count ) => nodeObject( new StorageBufferNode( value, getConstNodeType( nodeOrType ), count ) ); + +export const cameraProjectionMatrix = nodeImmutable( CameraNode, CameraNode.PROJECTION_MATRIX ); +export const cameraViewMatrix = nodeImmutable( CameraNode, CameraNode.VIEW_MATRIX ); +export const cameraNormalMatrix = nodeImmutable( CameraNode, CameraNode.NORMAL_MATRIX ); +export const cameraWorldMatrix = nodeImmutable( CameraNode, CameraNode.WORLD_MATRIX ); +export const cameraPosition = nodeImmutable( CameraNode, CameraNode.POSITION ); + +export const materialUV = nodeImmutable( MaterialNode, MaterialNode.UV ); +export const materialAlphaTest = nodeImmutable( MaterialNode, MaterialNode.ALPHA_TEST ); +export const materialColor = nodeImmutable( MaterialNode, MaterialNode.COLOR ); +export const materialShininess = nodeImmutable( MaterialNode, MaterialNode.SHININESS ); +export const materialEmissive = nodeImmutable( MaterialNode, MaterialNode.EMISSIVE ); +export const materialOpacity = nodeImmutable( MaterialNode, MaterialNode.OPACITY ); +export const materialSpecularColor = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_COLOR ); +export const materialReflectivity = nodeImmutable( MaterialNode, MaterialNode.REFLECTIVITY ); +export const materialRoughness = nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS ); +export const materialMetalness = nodeImmutable( MaterialNode, MaterialNode.METALNESS ); +export const materialRotation = nodeImmutable( MaterialNode, MaterialNode.ROTATION ); + +export const diffuseColor = nodeImmutable( PropertyNode, 'vec4', 'DiffuseColor' ); +export const roughness = nodeImmutable( PropertyNode, 'float', 'Roughness' ); +export const metalness = nodeImmutable( PropertyNode, 'float', 'Metalness' ); +export const specularColor = nodeImmutable( PropertyNode, 'color', 'SpecularColor' ); +export const shininess = nodeImmutable( PropertyNode, 'float', 'Shininess' ); + +export const reference = ( name, nodeOrType, object ) => nodeObject( new ReferenceNode( name, getConstNodeType( nodeOrType ), object ) ); +export const materialReference = ( name, nodeOrType, material ) => nodeObject( new MaterialReferenceNode( name, getConstNodeType( nodeOrType ), material ) ); +export const userData = ( name, inputType, userData ) => nodeObject( new UserDataNode( name, inputType, userData ) ); + +export const modelViewProjection = nodeProxy( ModelViewProjectionNode ); + +export const normalGeometry = nodeImmutable( NormalNode, NormalNode.GEOMETRY ); +export const normalLocal = nodeImmutable( NormalNode, NormalNode.LOCAL ); +export const normalView = nodeImmutable( NormalNode, NormalNode.VIEW ); +export const normalWorld = nodeImmutable( NormalNode, NormalNode.WORLD ); +export const transformedNormalView = nodeImmutable( VarNode, normalView, 'TransformedNormalView' ); +export const transformedNormalWorld = normalize( transformDirection( transformedNormalView, cameraViewMatrix ) ); + +export const tangentGeometry = nodeImmutable( TangentNode, TangentNode.GEOMETRY ); +export const tangentLocal = nodeImmutable( TangentNode, TangentNode.LOCAL ); +export const tangentView = nodeImmutable( TangentNode, TangentNode.VIEW ); +export const tangentWorld = nodeImmutable( TangentNode, TangentNode.WORLD ); +export const transformedTangentView = nodeImmutable( VarNode, tangentView, 'TransformedTangentView' ); +export const transformedTangentWorld = normalize( transformDirection( transformedTangentView, cameraViewMatrix ) ); + +export const bitangentGeometry = nodeImmutable( BitangentNode, BitangentNode.GEOMETRY ); +export const bitangentLocal = nodeImmutable( BitangentNode, BitangentNode.LOCAL ); +export const bitangentView = nodeImmutable( BitangentNode, BitangentNode.VIEW ); +export const bitangentWorld = nodeImmutable( BitangentNode, BitangentNode.WORLD ); +export const transformedBitangentView = normalize( mul( cross( transformedNormalView, transformedTangentView ), tangentGeometry.w ) ); +export const transformedBitangentWorld = normalize( transformDirection( transformedBitangentView, cameraViewMatrix ) ); + +export const modelDirection = nodeImmutable( ModelNode, ModelNode.DIRECTION ); +export const modelViewMatrix = nodeImmutable( ModelNode, ModelNode.VIEW_MATRIX ); +export const modelNormalMatrix = nodeImmutable( ModelNode, ModelNode.NORMAL_MATRIX ); +export const modelWorldMatrix = nodeImmutable( ModelNode, ModelNode.WORLD_MATRIX ); +export const modelPosition = nodeImmutable( ModelNode, ModelNode.POSITION ); +export const modelViewPosition = nodeImmutable( ModelNode, ModelNode.VIEW_POSITION ); + +export const objectDirection = nodeProxy( Object3DNode, Object3DNode.DIRECTION ); +export const objectViewMatrix = nodeProxy( Object3DNode, Object3DNode.VIEW_MATRIX ); +export const objectNormalMatrix = nodeProxy( Object3DNode, Object3DNode.NORMAL_MATRIX ); +export const objectWorldMatrix = nodeProxy( Object3DNode, Object3DNode.WORLD_MATRIX ); +export const objectPosition = nodeProxy( Object3DNode, Object3DNode.POSITION ); +export const objectViewPosition = nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION ); + +export const positionGeometry = nodeImmutable( PositionNode, PositionNode.GEOMETRY ); +export const positionLocal = nodeImmutable( PositionNode, PositionNode.LOCAL ); +export const positionWorld = nodeImmutable( PositionNode, PositionNode.WORLD ); +export const positionWorldDirection = nodeImmutable( PositionNode, PositionNode.WORLD_DIRECTION ); +export const positionView = nodeImmutable( PositionNode, PositionNode.VIEW ); +export const positionViewDirection = nodeImmutable( PositionNode, PositionNode.VIEW_DIRECTION ); + +export const texture = nodeProxy( TextureNode ); +export const sampler = ( texture ) => nodeObject( new ConvertNode( texture.isNode === true ? texture : new TextureNode( texture ), 'sampler' ) ); +export const uv = ( ...params ) => nodeObject( new UVNode( ...params ) ); +export const pointUV = nodeImmutable( PointUVNode ); + +// gpgpu + +export const compute = ( node, count, workgroupSize ) => nodeObject( new ComputeNode( nodeObject( node ), count, workgroupSize ) ); + +// display + +export const frontFacing = nodeImmutable( FrontFacingNode ); +export const faceDirection = sub( mul( float( frontFacing ), 2 ), 1 ); + +// lighting + +export const lightingModel = ( ...params ) => new LightingModel( ...params ); + +// utils + +export const element = nodeProxy( ArrayElementNode ); +export const discard = nodeProxy( DiscardNode ); + +// miscellaneous + +export const lumaCoeffs = vec3( 0.2125, 0.7154, 0.0721 ); + +export const luminance = ( color, luma = lumaCoeffs ) => dot( color, luma ); +export const difference = ( a, b ) => abs( sub( a, b ) ); +export const dotNV = clamp( dot( transformedNormalView, positionViewDirection ) ); +export const TBNViewMatrix = mat3( tangentView, bitangentView, normalView ); diff --git a/examples/jsm/nodes/shadernode/ShaderNodeElements.js b/examples/jsm/nodes/shadernode/ShaderNodeElements.js new file mode 100644 index 00000000000000..831da6ec553c2b --- /dev/null +++ b/examples/jsm/nodes/shadernode/ShaderNodeElements.js @@ -0,0 +1,162 @@ +// accessors +import CubeTextureNode from '../accessors/CubeTextureNode.js'; +import InstanceNode from '../accessors/InstanceNode.js'; +import ReflectVectorNode from '../accessors/ReflectVectorNode.js'; +import SkinningNode from '../accessors/SkinningNode.js'; +import ExtendedMaterialNode from '../accessors/ExtendedMaterialNode.js'; + +// display +import BlendModeNode from '../display/BlendModeNode.js'; +import ColorAdjustmentNode from '../display/ColorAdjustmentNode.js'; +import ColorSpaceNode from '../display/ColorSpaceNode.js'; +import NormalMapNode from '../display/NormalMapNode.js'; +import PosterizeNode from '../display/PosterizeNode.js'; +import ToneMappingNode from '../display/ToneMappingNode.js'; +import ViewportNode from '../display/ViewportNode.js'; + +// lighting +import LightsNode from '../lighting/LightsNode.js'; +//import LightingNode from '../lighting/LightingNode.js'; +import LightingContextNode from '../lighting/LightingContextNode.js'; + +// utils +import EquirectUVNode from '../utils/EquirectUVNode.js'; +import MatcapUVNode from '../utils/MatcapUVNode.js'; +import OscNode from '../utils/OscNode.js'; +import RemapNode from '../utils/RemapNode.js'; +import RotateUVNode from '../utils/RotateUVNode.js'; +import SpecularMIPLevelNode from '../utils/SpecularMIPLevelNode.js'; +import SpriteSheetUVNode from '../utils/SpriteSheetUVNode.js'; +import TimerNode from '../utils/TimerNode.js'; +import TriplanarTexturesNode from '../utils/TriplanarTexturesNode.js'; +import PackingNode from '../utils/PackingNode.js'; + +// geometry +import RangeNode from '../geometry/RangeNode.js'; + +// procedural +import CheckerNode from '../procedural/CheckerNode.js'; + +// fog +import FogNode from '../fog/FogNode.js'; +import FogRangeNode from '../fog/FogRangeNode.js'; +import FogExp2Node from '../fog/FogExp2Node.js'; + +// shader node utils +import { nodeObject, nodeProxy, nodeImmutable } from './ShaderNode.js'; + +// +// Node Material Shader Syntax +// + +// shader node base + +export * from './ShaderNodeBaseElements.js'; + +// functions + +export { default as BRDF_BlinnPhong } from '../functions/BSDF/BRDF_BlinnPhong.js'; +export { default as BRDF_GGX } from '../functions/BSDF/BRDF_GGX.js'; +export { default as BRDF_Lambert } from '../functions/BSDF/BRDF_Lambert.js'; +export { default as D_GGX } from '../functions/BSDF/D_GGX.js'; +export { default as DFGApprox } from '../functions/BSDF/DFGApprox.js'; +export { default as F_Schlick } from '../functions/BSDF/F_Schlick.js'; +export { default as V_GGX_SmithCorrelated } from '../functions/BSDF/V_GGX_SmithCorrelated.js'; + +export { default as getDistanceAttenuation } from '../functions/light/getDistanceAttenuation.js'; + +export { default as getGeometryRoughness } from '../functions/material/getGeometryRoughness.js'; +export { default as getRoughness } from '../functions/material/getRoughness.js'; + +export { default as phongLightingModel } from '../functions/PhongLightingModel.js'; +export { default as physicalLightingModel } from '../functions/PhysicalLightingModel.js'; + +// accessors + +export const cubeTexture = nodeProxy( CubeTextureNode ); + +export const instance = nodeProxy( InstanceNode ); + +export const reflectVector = nodeImmutable( ReflectVectorNode ); + +export const skinning = nodeProxy( SkinningNode ); + +// material + +export const materialNormal = nodeImmutable( ExtendedMaterialNode, ExtendedMaterialNode.NORMAL ); + +// display + +export const burn = nodeProxy( BlendModeNode, BlendModeNode.BURN ); +export const dodge = nodeProxy( BlendModeNode, BlendModeNode.DODGE ); +export const overlay = nodeProxy( BlendModeNode, BlendModeNode.OVERLAY ); +export const screen = nodeProxy( BlendModeNode, BlendModeNode.SCREEN ); + +export const saturation = nodeProxy( ColorAdjustmentNode, ColorAdjustmentNode.SATURATION ); +export const vibrance = nodeProxy( ColorAdjustmentNode, ColorAdjustmentNode.VIBRANCE ); +export const hue = nodeProxy( ColorAdjustmentNode, ColorAdjustmentNode.HUE ); + +export const colorSpace = ( node, encoding ) => nodeObject( new ColorSpaceNode( null, nodeObject( node ) ).fromEncoding( encoding ) ); +export const normalMap = nodeProxy( NormalMapNode ); +export const toneMapping = ( mapping, exposure, color ) => nodeObject( new ToneMappingNode( mapping, nodeObject( exposure ), nodeObject( color ) ) ); + +export const posterize = nodeProxy( PosterizeNode ); + +export const viewportCoordinate = nodeImmutable( ViewportNode, ViewportNode.COORDINATE ); +export const viewportResolution = nodeImmutable( ViewportNode, ViewportNode.RESOLUTION ); +export const viewportTopLeft = nodeImmutable( ViewportNode, ViewportNode.TOP_LEFT ); +export const viewportBottomLeft = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_LEFT ); +export const viewportTopRight = nodeImmutable( ViewportNode, ViewportNode.TOP_RIGHT ); +export const viewportBottomRight = nodeImmutable( ViewportNode, ViewportNode.BOTTOM_RIGHT ); + +// lighting + +//export const lighting = nodeProxy( LightingNode ); // abstract +//export const light; // still needs to be added +export const lights = ( lights ) => nodeObject( new LightsNode().fromLights( lights ) ); +export const lightingContext = nodeProxy( LightingContextNode ); + +// utils + +export const matcapUV = nodeImmutable( MatcapUVNode ); +export const equirectUV = nodeProxy( EquirectUVNode ); + +export const specularMIPLevel = nodeProxy( SpecularMIPLevelNode ); + +export const oscSine = nodeProxy( OscNode, OscNode.SINE ); +export const oscSquare = nodeProxy( OscNode, OscNode.SQUARE ); +export const oscTriangle = nodeProxy( OscNode, OscNode.TRIANGLE ); +export const oscSawtooth = nodeProxy( OscNode, OscNode.SAWTOOTH ); + +export const remap = nodeProxy( RemapNode, null, null, { doClamp: false } ); +export const remapClamp = nodeProxy( RemapNode ); + +export const rotateUV = nodeProxy( RotateUVNode ); + +export const spritesheetUV = nodeProxy( SpriteSheetUVNode ); + +// @TODO: add supports to use node in timeScale +export const timerLocal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.LOCAL, timeScale, value ) ); +export const timerGlobal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.GLOBAL, timeScale, value ) ); +export const timerDelta = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.DELTA, timeScale, value ) ); +export const frameId = nodeImmutable( TimerNode, TimerNode.FRAME ); + +export const triplanarTextures = nodeProxy( TriplanarTexturesNode ); +export const triplanarTexture = ( texture, ...params ) => triplanarTextures( texture, texture, texture, ...params ); + +export const directionToColor = nodeProxy( PackingNode, PackingNode.DIRECTION_TO_COLOR ); +export const colorToDirection = nodeProxy( PackingNode, PackingNode.COLOR_TO_DIRECTION ); + +// geometry + +export const range = ( min, max ) => nodeObject( new RangeNode( min, max ) ); + +// procedural + +export const checker = nodeProxy( CheckerNode ); + +// fog + +export const fog = nodeProxy( FogNode ); +export const rangeFog = nodeProxy( FogRangeNode ); +export const densityFog = nodeProxy( FogExp2Node ); diff --git a/examples/jsm/nodes/utils/ArrayElementNode.js b/examples/jsm/nodes/utils/ArrayElementNode.js index 2f42b336964683..e50ad7e907c6b5 100644 --- a/examples/jsm/nodes/utils/ArrayElementNode.js +++ b/examples/jsm/nodes/utils/ArrayElementNode.js @@ -1,6 +1,6 @@ -import Node, { addNodeClass } from '../core/Node.js'; +import TempNode from '../core/Node.js'; -class ArrayElementNode extends Node { // @TODO: If extending from TempNode it breaks webgpu_compute +class ArrayElementNode extends TempNode { constructor( node, indexNode ) { @@ -29,5 +29,3 @@ class ArrayElementNode extends Node { // @TODO: If extending from TempNode it br } export default ArrayElementNode; - -addNodeClass( ArrayElementNode ); diff --git a/examples/jsm/nodes/utils/ConvertNode.js b/examples/jsm/nodes/utils/ConvertNode.js index 3652df2acf770e..e1b85174e97526 100644 --- a/examples/jsm/nodes/utils/ConvertNode.js +++ b/examples/jsm/nodes/utils/ConvertNode.js @@ -1,4 +1,4 @@ -import Node, { addNodeClass } from '../core/Node.js'; +import Node from '../core/Node.js'; class ConvertNode extends Node { @@ -45,5 +45,3 @@ class ConvertNode extends Node { } export default ConvertNode; - -addNodeClass( ConvertNode ); diff --git a/examples/jsm/nodes/utils/DiscardNode.js b/examples/jsm/nodes/utils/DiscardNode.js index b5ef1a89fb8de1..8ca1a18df61917 100644 --- a/examples/jsm/nodes/utils/DiscardNode.js +++ b/examples/jsm/nodes/utils/DiscardNode.js @@ -1,7 +1,5 @@ import CondNode from '../math/CondNode.js'; -import { expression } from '../core/ExpressionNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import ExpressionNode from '../core/ExpressionNode.js'; let discardExpression; @@ -9,7 +7,7 @@ class DiscardNode extends CondNode { constructor( condNode ) { - discardExpression = discardExpression || expression( 'discard' ); + discardExpression = discardExpression || new ExpressionNode( 'discard' ); super( condNode, discardExpression ); @@ -18,9 +16,3 @@ class DiscardNode extends CondNode { } export default DiscardNode; - -export const discard = nodeProxy( DiscardNode ); - -addNodeElement( 'discard', discard ); - -addNodeClass( DiscardNode ); diff --git a/examples/jsm/nodes/utils/EquirectUVNode.js b/examples/jsm/nodes/utils/EquirectUVNode.js index 63fca1f88cc2e1..bf58b33d073de4 100644 --- a/examples/jsm/nodes/utils/EquirectUVNode.js +++ b/examples/jsm/nodes/utils/EquirectUVNode.js @@ -1,7 +1,5 @@ import TempNode from '../core/TempNode.js'; -import { positionWorldDirection } from '../accessors/PositionNode.js'; -import { nodeProxy, vec2 } from '../shadernode/ShaderNode.js'; -import { addNodeClass } from '../core/Node.js'; +import { nodeObject, vec2, add, mul, atan2, asin, clamp, positionWorldDirection } from '../shadernode/ShaderNodeElements.js'; class EquirectUVNode extends TempNode { @@ -15,10 +13,10 @@ class EquirectUVNode extends TempNode { construct() { - const dir = this.dirNode; + const dir = nodeObject( this.dirNode ); - const u = dir.z.atan2( dir.x ).mul( 1 / ( Math.PI * 2 ) ).add( 0.5 ); - const v = dir.y.clamp( - 1.0, 1.0 ).asin().mul( 1 / Math.PI ).add( 0.5 ); + const u = add( mul( atan2( dir.z, dir.x ), 1 / ( Math.PI * 2 ) ), 0.5 ); + const v = add( mul( asin( clamp( dir.y, - 1.0, 1.0 ) ), 1 / Math.PI ), 0.5 ); return vec2( u, v ); @@ -27,7 +25,3 @@ class EquirectUVNode extends TempNode { } export default EquirectUVNode; - -export const equirectUV = nodeProxy( EquirectUVNode ); - -addNodeClass( EquirectUVNode ); diff --git a/examples/jsm/nodes/utils/JoinNode.js b/examples/jsm/nodes/utils/JoinNode.js index 3fe906cb650838..1fdca223983a4a 100644 --- a/examples/jsm/nodes/utils/JoinNode.js +++ b/examples/jsm/nodes/utils/JoinNode.js @@ -1,5 +1,4 @@ -import { addNodeClass } from '../core/Node.js'; -import TempNode from '../core/TempNode.js'; +import TempNode from '../core/Node.js'; class JoinNode extends TempNode { @@ -47,5 +46,3 @@ class JoinNode extends TempNode { } export default JoinNode; - -addNodeClass( JoinNode ); diff --git a/examples/jsm/nodes/utils/MatcapUVNode.js b/examples/jsm/nodes/utils/MatcapUVNode.js index a2c9f39689fc64..ddc0776db6a960 100644 --- a/examples/jsm/nodes/utils/MatcapUVNode.js +++ b/examples/jsm/nodes/utils/MatcapUVNode.js @@ -1,8 +1,5 @@ import TempNode from '../core/TempNode.js'; -import { transformedNormalView } from '../accessors/NormalNode.js'; -import { positionViewDirection } from '../accessors/PositionNode.js'; -import { nodeImmutable, vec2, vec3 } from '../shadernode/ShaderNode.js'; -import { addNodeClass } from '../core/Node.js'; +import { vec2, vec3, negate, normalize, cross, dot, mul, add, transformedNormalView, positionViewDirection } from '../shadernode/ShaderNodeBaseElements.js'; class MatcapUVNode extends TempNode { @@ -14,17 +11,13 @@ class MatcapUVNode extends TempNode { construct() { - const x = vec3( positionViewDirection.z, 0, positionViewDirection.x.negate() ).normalize(); - const y = positionViewDirection.cross( x ); + const x = normalize( vec3( positionViewDirection.z, 0, negate( positionViewDirection.x ) ) ); + const y = cross( positionViewDirection, x ); - return vec2( x.dot( transformedNormalView ), y.dot( transformedNormalView ) ).mul( 0.495 ).add( 0.5 ); + return add( mul( vec2( dot( x, transformedNormalView ), dot( y, transformedNormalView ) ), 0.495 ), 0.5 ); } } export default MatcapUVNode; - -export const matcapUV = nodeImmutable( MatcapUVNode ); - -addNodeClass( MatcapUVNode ); diff --git a/examples/jsm/nodes/utils/MaxMipLevelNode.js b/examples/jsm/nodes/utils/MaxMipLevelNode.js index f3d34d5a3fefdb..871dc6b32ad783 100644 --- a/examples/jsm/nodes/utils/MaxMipLevelNode.js +++ b/examples/jsm/nodes/utils/MaxMipLevelNode.js @@ -1,7 +1,5 @@ import UniformNode from '../core/UniformNode.js'; import { NodeUpdateType } from '../core/constants.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; -import { addNodeClass } from '../core/Node.js'; class MaxMipLevelNode extends UniformNode { @@ -40,7 +38,3 @@ class MaxMipLevelNode extends UniformNode { } export default MaxMipLevelNode; - -export const maxMipLevel = nodeProxy( MaxMipLevelNode ); - -addNodeClass( MaxMipLevelNode ); diff --git a/examples/jsm/nodes/utils/OscNode.js b/examples/jsm/nodes/utils/OscNode.js index 0b577aa8eafbb7..17bce9f8cae14a 100644 --- a/examples/jsm/nodes/utils/OscNode.js +++ b/examples/jsm/nodes/utils/OscNode.js @@ -1,10 +1,10 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { timerLocal } from './TimerNode.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import TimerNode from './TimerNode.js'; +import { abs, fract, round, sin, add, sub, mul } from '../shadernode/ShaderNodeBaseElements.js'; class OscNode extends Node { - constructor( method = OscNode.SINE, timeNode = timerLocal() ) { + constructor( method = OscNode.SINE, timeNode = new TimerNode() ) { super(); @@ -28,19 +28,19 @@ class OscNode extends Node { if ( method === OscNode.SINE ) { - outputNode = timeNode.add( 0.75 ).mul( Math.PI * 2 ).sin().mul( 0.5 ).add( 0.5 ); + outputNode = add( mul( sin( mul( add( timeNode, .75 ), Math.PI * 2 ) ), .5 ), .5 ); } else if ( method === OscNode.SQUARE ) { - outputNode = timeNode.fract().round(); + outputNode = round( fract( timeNode ) ); } else if ( method === OscNode.TRIANGLE ) { - outputNode = timeNode.add( 0.5 ).fract().mul( 2 ).sub( 1 ).abs(); + outputNode = abs( sub( 1, mul( fract( add( timeNode, .5 ) ), 2 ) ) ); } else if ( method === OscNode.SAWTOOTH ) { - outputNode = timeNode.fract(); + outputNode = fract( timeNode ); } @@ -72,10 +72,3 @@ OscNode.TRIANGLE = 'triangle'; OscNode.SAWTOOTH = 'sawtooth'; export default OscNode; - -export const oscSine = nodeProxy( OscNode, OscNode.SINE ); -export const oscSquare = nodeProxy( OscNode, OscNode.SQUARE ); -export const oscTriangle = nodeProxy( OscNode, OscNode.TRIANGLE ); -export const oscSawtooth = nodeProxy( OscNode, OscNode.SAWTOOTH ); - -addNodeClass( OscNode ); diff --git a/examples/jsm/nodes/utils/PackingNode.js b/examples/jsm/nodes/utils/PackingNode.js index 784a1b2647babd..fa0b7c64d3a449 100644 --- a/examples/jsm/nodes/utils/PackingNode.js +++ b/examples/jsm/nodes/utils/PackingNode.js @@ -1,6 +1,5 @@ import TempNode from '../core/TempNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import { mul } from '../shadernode/ShaderNodeBaseElements.js'; class PackingNode extends TempNode { @@ -27,11 +26,11 @@ class PackingNode extends TempNode { if ( scope === PackingNode.DIRECTION_TO_COLOR ) { - result = node.mul( 0.5 ).add( 0.5 ); + result = mul( node, 0.5 ).add( 0.5 ); } else if ( scope === PackingNode.COLOR_TO_DIRECTION ) { - result = node.mul( 2.0 ).sub( 1 ); + result = mul( node, 2.0 ).sub( 1 ); } @@ -45,11 +44,3 @@ PackingNode.DIRECTION_TO_COLOR = 'directionToColor'; PackingNode.COLOR_TO_DIRECTION = 'colorToDirection'; export default PackingNode; - -export const directionToColor = nodeProxy( PackingNode, PackingNode.DIRECTION_TO_COLOR ); -export const colorToDirection = nodeProxy( PackingNode, PackingNode.COLOR_TO_DIRECTION ); - -addNodeElement( 'directionToColor', directionToColor ); -addNodeElement( 'colorToDirection', colorToDirection ); - -addNodeClass( PackingNode ); diff --git a/examples/jsm/nodes/utils/RemapNode.js b/examples/jsm/nodes/utils/RemapNode.js index 0cfadad94e40dd..c3b806500cb04f 100644 --- a/examples/jsm/nodes/utils/RemapNode.js +++ b/examples/jsm/nodes/utils/RemapNode.js @@ -1,5 +1,5 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import { add, sub, div, mul, clamp } from '../shadernode/ShaderNodeBaseElements.js'; class RemapNode extends Node { @@ -21,22 +21,14 @@ class RemapNode extends Node { const { node, inLowNode, inHighNode, outLowNode, outHighNode, doClamp } = this; - let t = node.sub( inLowNode ).div( inHighNode.sub( inLowNode ) ); + let t = div( sub( node, inLowNode ), sub( inHighNode, inLowNode ) ); - if ( doClamp === true ) t = t.clamp(); + if ( doClamp === true ) t = clamp( t ); - return t.mul( outHighNode.sub( outLowNode ) ).add( outLowNode ); + return add( mul( sub( outHighNode, outLowNode ), t ), outLowNode ); } } export default RemapNode; - -export const remap = nodeProxy( RemapNode, null, null, { doClamp: false } ); -export const remapClamp = nodeProxy( RemapNode ); - -addNodeElement( 'remap', remap ); -addNodeElement( 'remapClamp', remapClamp ); - -addNodeClass( RemapNode ); diff --git a/examples/jsm/nodes/utils/RotateUVNode.js b/examples/jsm/nodes/utils/RotateUVNode.js index 0aad815bc3842b..7b779cd42bc8a4 100644 --- a/examples/jsm/nodes/utils/RotateUVNode.js +++ b/examples/jsm/nodes/utils/RotateUVNode.js @@ -1,10 +1,9 @@ import TempNode from '../core/TempNode.js'; -import { addNodeClass } from '../core/Node.js'; -import { addNodeElement, nodeProxy, vec2 } from '../shadernode/ShaderNode.js'; +import { vec2, add, sub, mul, cos, sin } from '../shadernode/ShaderNodeBaseElements.js'; class RotateUVNode extends TempNode { - constructor( uvNode, rotationNode, centerNode = vec2( 0.5 ) ) { + constructor( uvNode, rotationNode, centerNode = vec2( .5 ) ) { super( 'vec2' ); @@ -18,26 +17,16 @@ class RotateUVNode extends TempNode { const { uvNode, rotationNode, centerNode } = this; - const cosAngle = rotationNode.cos(); - const sinAngle = rotationNode.sin(); + const cosAngle = cos( rotationNode ); + const sinAngle = sin( rotationNode ); - const vector = uvNode.sub( centerNode ); - - const rotatedVector = vec2( // @TODO: Maybe we can create mat2 and write something like rotationMatrix.mul( vector )? - vec2( cosAngle, sinAngle ).dot( vector ), - vec2( sinAngle.negate(), cosAngle ).dot( vector ) + return vec2( + add( add( mul( cosAngle, sub( uvNode.x, centerNode.x ) ), mul( sinAngle, sub( uvNode.y, centerNode.y ) ) ), centerNode.x ), + add( sub( mul( cosAngle, sub( uvNode.y, centerNode.y ) ), mul( sinAngle, sub( uvNode.x, centerNode.x ) ) ), centerNode.y ) ); - return rotatedVector.add( centerNode ); - } } export default RotateUVNode; - -export const rotateUV = nodeProxy( RotateUVNode ); - -addNodeElement( 'rotateUV', rotateUV ); - -addNodeClass( RotateUVNode ); diff --git a/examples/jsm/nodes/utils/SpecularMIPLevelNode.js b/examples/jsm/nodes/utils/SpecularMIPLevelNode.js index b2bebbe4c73123..ab5a47a3a1d18e 100644 --- a/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +++ b/examples/jsm/nodes/utils/SpecularMIPLevelNode.js @@ -1,6 +1,5 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { maxMipLevel } from './MaxMipLevelNode.js'; -import { nodeProxy } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import { add, mul, div, log2, clamp, maxMipLevel } from '../shadernode/ShaderNodeBaseElements.js'; class SpecularMIPLevelNode extends Node { @@ -21,17 +20,13 @@ class SpecularMIPLevelNode extends Node { const maxMIPLevelScalar = maxMipLevel( textureNode ); - const sigma = roughnessNode.mul( roughnessNode ).mul( Math.PI ).div( roughnessNode.add( 1.0 ) ); - const desiredMIPLevel = maxMIPLevelScalar.add( sigma.log2() ); + const sigma = div( mul( Math.PI, mul( roughnessNode, roughnessNode ) ), add( 1.0, roughnessNode ) ); + const desiredMIPLevel = add( maxMIPLevelScalar, log2( sigma ) ); - return desiredMIPLevel.clamp( 0.0, maxMIPLevelScalar ); + return clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar ); } } export default SpecularMIPLevelNode; - -export const specularMIPLevel = nodeProxy( SpecularMIPLevelNode ); - -addNodeClass( SpecularMIPLevelNode ); diff --git a/examples/jsm/nodes/utils/SplitNode.js b/examples/jsm/nodes/utils/SplitNode.js index d6ab3046c27671..6051c8a912ce84 100644 --- a/examples/jsm/nodes/utils/SplitNode.js +++ b/examples/jsm/nodes/utils/SplitNode.js @@ -1,7 +1,7 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { vectorComponents } from '../core/constants.js'; +import Node from '../core/Node.js'; +import { vector } from '../core/NodeBuilder.js'; -const stringVectorComponents = vectorComponents.join( '' ); +const vectorComponents = 'xyzw'; class SplitNode extends Node { @@ -20,7 +20,7 @@ class SplitNode extends Node { for ( const c of this.components ) { - vectorLength = Math.max( vectorComponents.indexOf( c ) + 1, vectorLength ); + vectorLength = Math.max( vector.indexOf( c ) + 1, vectorLength ); } @@ -57,7 +57,7 @@ class SplitNode extends Node { const nodeSnippet = node.build( builder, type ); - if ( this.components.length === nodeTypeLength && this.components === stringVectorComponents.slice( 0, this.components.length ) ) { + if ( this.components.length === nodeTypeLength && this.components === vectorComponents.slice( 0, this.components.length ) ) { // unecessary swizzle @@ -100,5 +100,3 @@ class SplitNode extends Node { } export default SplitNode; - -addNodeClass( SplitNode ); diff --git a/examples/jsm/nodes/utils/SpriteSheetUVNode.js b/examples/jsm/nodes/utils/SpriteSheetUVNode.js index 2ada59f907eb08..0cb177a641b101 100644 --- a/examples/jsm/nodes/utils/SpriteSheetUVNode.js +++ b/examples/jsm/nodes/utils/SpriteSheetUVNode.js @@ -1,10 +1,14 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { uv } from '../accessors/UVNode.js'; -import { nodeProxy, float, vec2 } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import ConstNode from '../core/ConstNode.js'; +import UVNode from '../accessors/UVNode.js'; +import MathNode from '../math/MathNode.js'; +import OperatorNode from '../math/OperatorNode.js'; +import SplitNode from '../utils/SplitNode.js'; +import JoinNode from '../utils/JoinNode.js'; class SpriteSheetUVNode extends Node { - constructor( countNode, uvNode = uv(), frameNode = float( 0 ) ) { + constructor( countNode, uvNode = new UVNode(), frameNode = new ConstNode( 0 ) ) { super( 'vec2' ); @@ -18,24 +22,35 @@ class SpriteSheetUVNode extends Node { const { frameNode, uvNode, countNode } = this; - const { width, height } = countNode; + const one = new ConstNode( 1 ); - const frameNum = frameNode.mod( width.mul( height ) ).floor(); + const width = new SplitNode( countNode, 'x' ); + const height = new SplitNode( countNode, 'y' ); - const column = frameNum.mod( width ); - const row = height.sub( frameNum.add( 1 ).div( width ).ceil() ); + const total = new OperatorNode( '*', width, height ); - const scale = countNode.reciprocal(); - const uvFrameOffset = vec2( column, row ); + const roundFrame = new MathNode( MathNode.FLOOR, new MathNode( MathNode.MOD, frameNode, total ) ); - return uvNode.add( uvFrameOffset ).mul( scale ); + const frameNum = new OperatorNode( '+', roundFrame, one ); + + const cell = new MathNode( MathNode.MOD, roundFrame, width ); + const row = new MathNode( MathNode.CEIL, new OperatorNode( '/', frameNum, width ) ); + const rowInv = new OperatorNode( '-', height, row ); + + const scale = new OperatorNode( '/', one, countNode ); + + const uvFrameOffset = new JoinNode( [ + new OperatorNode( '*', cell, new SplitNode( scale, 'x' ) ), + new OperatorNode( '*', rowInv, new SplitNode( scale, 'y' ) ) + ] ); + + const uvScale = new OperatorNode( '*', uvNode, scale ); + const uvFrame = new OperatorNode( '+', uvScale, uvFrameOffset ); + + return uvFrame; } } export default SpriteSheetUVNode; - -export const spritesheetUV = nodeProxy( SpriteSheetUVNode ); - -addNodeClass( SpriteSheetUVNode ); diff --git a/examples/jsm/nodes/utils/TimerNode.js b/examples/jsm/nodes/utils/TimerNode.js index 7870f389f4afa6..14ff0522fc6435 100644 --- a/examples/jsm/nodes/utils/TimerNode.js +++ b/examples/jsm/nodes/utils/TimerNode.js @@ -1,7 +1,5 @@ import UniformNode from '../core/UniformNode.js'; import { NodeUpdateType } from '../core/constants.js'; -import { nodeObject, nodeImmutable } from '../shadernode/ShaderNode.js'; -import { addNodeClass } from '../core/Node.js'; class TimerNode extends UniformNode { @@ -84,11 +82,3 @@ TimerNode.DELTA = 'delta'; TimerNode.FRAME = 'frame'; export default TimerNode; - -// @TODO: add support to use node in timeScale -export const timerLocal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.LOCAL, timeScale, value ) ); -export const timerGlobal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.GLOBAL, timeScale, value ) ); -export const timerDelta = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.DELTA, timeScale, value ) ); -export const frameId = nodeImmutable( TimerNode, TimerNode.FRAME ); - -addNodeClass( TimerNode ); diff --git a/examples/jsm/nodes/utils/TriplanarTexturesNode.js b/examples/jsm/nodes/utils/TriplanarTexturesNode.js index 22c6b69e5d7fba..da8133ab286183 100644 --- a/examples/jsm/nodes/utils/TriplanarTexturesNode.js +++ b/examples/jsm/nodes/utils/TriplanarTexturesNode.js @@ -1,9 +1,5 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import { add } from '../math/OperatorNode.js'; -import { normalWorld } from '../accessors/NormalNode.js'; -import { positionWorld } from '../accessors/PositionNode.js'; -import { texture } from '../accessors/TextureNode.js'; -import { addNodeElement, nodeProxy, float, vec3 } from '../shadernode/ShaderNode.js'; +import Node from '../core/Node.js'; +import { float, vec3, add, mul, div, dot, normalize, abs, texture, positionWorld, normalWorld } from '../shadernode/ShaderNodeBaseElements.js'; class TriplanarTexturesNode extends Node { @@ -29,22 +25,22 @@ class TriplanarTexturesNode extends Node { // Ref: https://github.com/keijiro/StandardTriplanar // Blending factor of triplanar mapping - let bf = normalNode.abs().normalize(); - bf = bf.div( bf.dot( vec3( 1.0 ) ) ); + let bf = normalize( abs( normalNode ) ); + bf = div( bf, dot( bf, vec3( 1.0 ) ) ); // Triplanar mapping - const tx = positionNode.yz.mul( scaleNode ); - const ty = positionNode.zx.mul( scaleNode ); - const tz = positionNode.xy.mul( scaleNode ); + const tx = mul( positionNode.yz, scaleNode ); + const ty = mul( positionNode.zx, scaleNode ); + const tz = mul( positionNode.xy, scaleNode ); // Base color const textureX = textureXNode.value; const textureY = textureYNode !== null ? textureYNode.value : textureX; const textureZ = textureZNode !== null ? textureZNode.value : textureX; - const cx = texture( textureX, tx ).mul( bf.x ); - const cy = texture( textureY, ty ).mul( bf.y ); - const cz = texture( textureZ, tz ).mul( bf.z ); + const cx = mul( texture( textureX, tx ), bf.x ); + const cy = mul( texture( textureY, ty ), bf.y ); + const cz = mul( texture( textureZ, tz ), bf.z ); return add( cx, cy, cz ); @@ -53,10 +49,3 @@ class TriplanarTexturesNode extends Node { } export default TriplanarTexturesNode; - -export const triplanarTextures = nodeProxy( TriplanarTexturesNode ); -export const triplanarTexture = ( texture, ...params ) => triplanarTextures( texture, texture, texture, ...params ); - -addNodeElement( 'triplanarTexture', triplanarTexture ); - -addNodeClass( TriplanarTexturesNode ); diff --git a/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js b/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js index bec1b28b715efe..c6ae9b39d59d99 100644 --- a/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +++ b/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js @@ -17,12 +17,6 @@ const glslMethods = { [ MathNode.ATAN2 ]: 'atan' }; -const precisionLib = { - low: 'lowp', - medium: 'mediump', - high: 'highp' -}; - function getIncludeSnippet( name ) { return `#include <${name}>`; @@ -466,45 +460,29 @@ class WebGLNodeBuilder extends NodeBuilder { const uniforms = this.uniforms[ shaderStage ]; - let output = ''; + let snippet = ''; for ( const uniform of uniforms ) { - let snippet = null; - if ( uniform.type === 'texture' ) { - snippet = `sampler2D ${uniform.name}; `; + snippet += `uniform sampler2D ${uniform.name}; `; } else if ( uniform.type === 'cubeTexture' ) { - snippet = `samplerCube ${uniform.name}; `; + snippet += `uniform samplerCube ${uniform.name}; `; } else { const vectorType = this.getVectorType( uniform.type ); - snippet = `${vectorType} ${uniform.name}; `; - - } - - const precision = uniform.node.precision; - - if ( precision !== null ) { - - snippet = 'uniform ' + precisionLib[ precision ] + ' ' + snippet; - - } else { - - snippet = 'uniform ' + snippet; + snippet += `uniform ${vectorType} ${uniform.name}; `; } - output += snippet; - } - return output; + return snippet; } diff --git a/examples/jsm/renderers/webgpu/WebGPUBackground.js b/examples/jsm/renderers/webgpu/WebGPUBackground.js index d88dab2006bf1d..ea0d79317be4c3 100644 --- a/examples/jsm/renderers/webgpu/WebGPUBackground.js +++ b/examples/jsm/renderers/webgpu/WebGPUBackground.js @@ -165,13 +165,8 @@ class WebGPUBackground { } else { colorAttachment.loadOp = GPULoadOp.Load; - colorAttachment.storeOp = GPUStoreOp.Store; - depthStencilAttachment.depthLoadOp = GPULoadOp.Load; - depthStencilAttachment.depthStoreOp = GPUStoreOp.Store; - depthStencilAttachment.stencilLoadOp = GPULoadOp.Load; - depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store; } diff --git a/examples/jsm/renderers/webgpu/WebGPURenderStates.js b/examples/jsm/renderers/webgpu/WebGPURenderStates.js index 87e81f778916ce..7bc6da4699874a 100644 --- a/examples/jsm/renderers/webgpu/WebGPURenderStates.js +++ b/examples/jsm/renderers/webgpu/WebGPURenderStates.js @@ -1,10 +1,10 @@ -import { lights } from 'three/nodes'; +import { LightsNode } from 'three/nodes'; class WebGPURenderState { constructor() { - this.lightsNode = lights( [] ); + this.lightsNode = new LightsNode(); this.lightsArray = []; diff --git a/examples/models/svg/emptyPath.svg b/examples/models/svg/emptyPath.svg deleted file mode 100644 index 1959767b08f71a..00000000000000 --- a/examples/models/svg/emptyPath.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/examples/screenshots/webgl_loader_gltf_iridescence.jpg b/examples/screenshots/webgl_loader_gltf_iridescence.jpg index 6c67327ccdcf2c75c21a8de353493b0fb8c5961b..843991597c0a46ca30f31d9e590fdbd487083c1c 100644 GIT binary patch delta 34006 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 z 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 mnfK4ENf{uHwPJ=`u_lU(}@i$pa0pgi>2oP delta 33962 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

Z9%YE7!LJ(^Tt=*1QFsoO;s_x6A9f=*i% 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 F|Jii5qRIdO diff --git a/examples/screenshots/webgl_loader_gltf_transmission.jpg b/examples/screenshots/webgl_loader_gltf_transmission.jpg index fb2ab0e20f15e324a9d32bc41e11842309060c21..e78f589f0b4190051408df0411a1494dc4bac2ca 100644 GIT binary patch delta 39756 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 delta 39957 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 delta 41104 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

@K_-SeQ%MFw{Fs;()g(!304Qtu= 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 L|A*f(|IPhBuW{wO delta 25259 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�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 diff --git a/examples/webgl_loader_ifc.html b/examples/webgl_loader_ifc.html index 718977d5f67141..fbfa1b0d7fd694 100644 --- a/examples/webgl_loader_ifc.html +++ b/examples/webgl_loader_ifc.html @@ -14,7 +14,7 @@

@@ -25,11 +25,7 @@ { "imports": { "three": "../build/three.module.js", - "three/addons/": "./jsm/", - "three/examples/jsm/utils/BufferGeometryUtils": "./jsm/utils/BufferGeometryUtils.js", - "three-mesh-bvh": "https://unpkg.com/three-mesh-bvh@0.5.23/build/index.module.js", - "web-ifc": "https://unpkg.com/web-ifc@0.0.36/web-ifc-api.js", - "web-ifc-three": "https://unpkg.com/web-ifc-three@0.0.122/IFCLoader.js" + "three/addons/": "./jsm/" } } @@ -39,12 +35,13 @@ import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; - import { IFCLoader } from 'web-ifc-three'; - import { IFCSPACE } from 'web-ifc'; + import { IFCLoader } from 'three/addons/loaders/IFCLoader.js'; let scene, camera, renderer; - async function init() { + init(); + + function init() { //Scene scene = new THREE.Scene(); @@ -76,16 +73,7 @@ //Setup IFC Loader const ifcLoader = new IFCLoader(); - await ifcLoader.ifcManager.setWasmPath( 'https://unpkg.com/web-ifc@0.0.36/', true ); - - await ifcLoader.ifcManager.parser.setupOptionalCategories( { - [ IFCSPACE ]: false, - } ); - - await ifcLoader.ifcManager.applyWebIfcConfig( { - USE_FAST_BOOLS: true - } ); - + ifcLoader.ifcManager.setWasmPath( 'jsm/loaders/ifc/' ); ifcLoader.load( 'models/ifc/rac_advanced_sample_project.ifc', function ( model ) { scene.add( model.mesh ); @@ -93,8 +81,41 @@ } ); + const highlightMaterial = new THREE.MeshPhongMaterial( { color: 0xff00ff, depthTest: false, transparent: true, opacity: 0.3 } ); + + function selectObject( event ) { + + if ( event.button != 0 ) return; + + const mouse = new THREE.Vector2(); + mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1; + mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1; + + const raycaster = new THREE.Raycaster(); + raycaster.setFromCamera( mouse, camera ); + + const intersected = raycaster.intersectObjects( scene.children, false ); + if ( intersected.length ) { + + const found = intersected[ 0 ]; + const faceIndex = found.faceIndex; + const geometry = found.object.geometry; + const id = ifcLoader.ifcManager.getExpressId( geometry, faceIndex ); + + const modelID = found.object.modelID; + ifcLoader.ifcManager.createSubset( { modelID, ids: [ id ], scene, removePrevious: true, material: highlightMaterial } ); + const props = ifcLoader.ifcManager.getItemProperties( modelID, id, true ); + console.log( props ); + renderer.render( scene, camera ); + + } + + } + + window.onpointerdown = selectObject; + //Renderer - renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setPixelRatio( window.devicePixelRatio ); document.body.appendChild( renderer.domElement ); @@ -125,8 +146,6 @@ } - init(); - diff --git a/examples/webgl_loader_svg.html b/examples/webgl_loader_svg.html index 967633b054f16e..63979a7e23dada 100644 --- a/examples/webgl_loader_svg.html +++ b/examples/webgl_loader_svg.html @@ -124,7 +124,6 @@ 'singlePointTest': 'models/svg/singlePointTest.svg', 'singlePointTest2': 'models/svg/singlePointTest2.svg', 'singlePointTest3': 'models/svg/singlePointTest3.svg', - 'emptyPath': 'models/svg/emptyPath.svg', } ).name( 'SVG File' ).onChange( update ); diff --git a/examples/webgl_materials_normalmap.html b/examples/webgl_materials_normalmap.html index ae5abdca31aafc..71b2d976c58946 100644 --- a/examples/webgl_materials_normalmap.html +++ b/examples/webgl_materials_normalmap.html @@ -133,8 +133,8 @@ const effectBleach = new ShaderPass( BleachBypassShader ); const effectColor = new ShaderPass( ColorCorrectionShader ); - const gammaCorrection = new ShaderPass( GammaCorrectionShader ); effectFXAA = new ShaderPass( FXAAShader ); + const gammaCorrection = new ShaderPass( GammaCorrectionShader ); effectFXAA.uniforms[ 'resolution' ].value.set( 1 / window.innerWidth, 1 / window.innerHeight ); @@ -148,10 +148,10 @@ composer = new EffectComposer( renderer, renderTarget ); composer.addPass( renderModel ); + composer.addPass( effectFXAA ); composer.addPass( effectBleach ); composer.addPass( effectColor ); composer.addPass( gammaCorrection ); - composer.addPass( effectFXAA ); // EVENTS diff --git a/examples/webgl_nodes_loader_gltf_iridescence.html b/examples/webgl_nodes_loader_gltf_iridescence.html index 4ff8d419734665..934eac9b6c4ced 100644 --- a/examples/webgl_nodes_loader_gltf_iridescence.html +++ b/examples/webgl_nodes_loader_gltf_iridescence.html @@ -31,7 +31,8 @@ @@ -35,13 +39,12 @@ import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; - import { IFCLoader } from 'three/addons/loaders/IFCLoader.js'; + import { IFCLoader } from 'web-ifc-three'; + import { IFCSPACE } from 'web-ifc'; let scene, camera, renderer; - init(); - - function init() { + async function init() { //Scene scene = new THREE.Scene(); @@ -73,49 +76,25 @@ //Setup IFC Loader const ifcLoader = new IFCLoader(); - ifcLoader.ifcManager.setWasmPath( 'jsm/loaders/ifc/' ); - ifcLoader.load( 'models/ifc/rac_advanced_sample_project.ifc', function ( model ) { - - scene.add( model.mesh ); - render(); + await ifcLoader.ifcManager.setWasmPath( 'https://unpkg.com/web-ifc@0.0.36/', true ); + await ifcLoader.ifcManager.parser.setupOptionalCategories( { + [ IFCSPACE ]: false, } ); - const highlightMaterial = new THREE.MeshPhongMaterial( { color: 0xff00ff, depthTest: false, transparent: true, opacity: 0.3 } ); - - function selectObject( event ) { - - if ( event.button != 0 ) return; - - const mouse = new THREE.Vector2(); - mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1; - mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1; - - const raycaster = new THREE.Raycaster(); - raycaster.setFromCamera( mouse, camera ); - - const intersected = raycaster.intersectObjects( scene.children, false ); - if ( intersected.length ) { - - const found = intersected[ 0 ]; - const faceIndex = found.faceIndex; - const geometry = found.object.geometry; - const id = ifcLoader.ifcManager.getExpressId( geometry, faceIndex ); - - const modelID = found.object.modelID; - ifcLoader.ifcManager.createSubset( { modelID, ids: [ id ], scene, removePrevious: true, material: highlightMaterial } ); - const props = ifcLoader.ifcManager.getItemProperties( modelID, id, true ); - console.log( props ); - renderer.render( scene, camera ); + await ifcLoader.ifcManager.applyWebIfcConfig( { + USE_FAST_BOOLS: true + } ); - } + ifcLoader.load( 'models/ifc/rac_advanced_sample_project.ifc', function ( model ) { - } + scene.add( model.mesh ); + render(); - window.onpointerdown = selectObject; + } ); //Renderer - renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setPixelRatio( window.devicePixelRatio ); document.body.appendChild( renderer.domElement ); @@ -146,6 +125,8 @@ } + init(); + diff --git a/examples/webgl_loader_svg.html b/examples/webgl_loader_svg.html index 63979a7e23dada..967633b054f16e 100644 --- a/examples/webgl_loader_svg.html +++ b/examples/webgl_loader_svg.html @@ -124,6 +124,7 @@ 'singlePointTest': 'models/svg/singlePointTest.svg', 'singlePointTest2': 'models/svg/singlePointTest2.svg', 'singlePointTest3': 'models/svg/singlePointTest3.svg', + 'emptyPath': 'models/svg/emptyPath.svg', } ).name( 'SVG File' ).onChange( update ); diff --git a/examples/webgl_materials_normalmap.html b/examples/webgl_materials_normalmap.html index 71b2d976c58946..ae5abdca31aafc 100644 --- a/examples/webgl_materials_normalmap.html +++ b/examples/webgl_materials_normalmap.html @@ -133,8 +133,8 @@ const effectBleach = new ShaderPass( BleachBypassShader ); const effectColor = new ShaderPass( ColorCorrectionShader ); - effectFXAA = new ShaderPass( FXAAShader ); const gammaCorrection = new ShaderPass( GammaCorrectionShader ); + effectFXAA = new ShaderPass( FXAAShader ); effectFXAA.uniforms[ 'resolution' ].value.set( 1 / window.innerWidth, 1 / window.innerHeight ); @@ -148,10 +148,10 @@ composer = new EffectComposer( renderer, renderTarget ); composer.addPass( renderModel ); - composer.addPass( effectFXAA ); composer.addPass( effectBleach ); composer.addPass( effectColor ); composer.addPass( gammaCorrection ); + composer.addPass( effectFXAA ); // EVENTS diff --git a/examples/webgl_nodes_loader_gltf_iridescence.html b/examples/webgl_nodes_loader_gltf_iridescence.html index 934eac9b6c4ced..4ff8d419734665 100644 --- a/examples/webgl_nodes_loader_gltf_iridescence.html +++ b/examples/webgl_nodes_loader_gltf_iridescence.html @@ -31,8 +31,7 @@
three.js - - See main project repository for more information and BIM tools. + IFCLoader