three-stdlib 2.25.0 → 2.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/controls/OrbitControls.d.ts +1 -0
- package/index.cjs +116465 -611
- package/index.js +116101 -263
- package/package.json +17 -4
- package/_polyfill/CapsuleGeometry.cjs +0 -22
- package/_polyfill/CapsuleGeometry.js +0 -22
- package/_polyfill/CompressedArrayTexture.cjs +0 -12
- package/_polyfill/CompressedArrayTexture.js +0 -12
- package/_polyfill/Data3DTexture.cjs +0 -17
- package/_polyfill/Data3DTexture.js +0 -17
- package/animation/AnimationClipCreator.cjs +0 -56
- package/animation/AnimationClipCreator.js +0 -56
- package/animation/CCDIKSolver.cjs +0 -269
- package/animation/CCDIKSolver.js +0 -269
- package/animation/MMDAnimationHelper.cjs +0 -688
- package/animation/MMDAnimationHelper.js +0 -688
- package/animation/MMDPhysics.cjs +0 -830
- package/animation/MMDPhysics.js +0 -830
- package/cameras/CinematicCamera.cjs +0 -131
- package/cameras/CinematicCamera.js +0 -131
- package/controls/ArcballControls.cjs +0 -2033
- package/controls/ArcballControls.js +0 -2033
- package/controls/DeviceOrientationControls.cjs +0 -85
- package/controls/DeviceOrientationControls.js +0 -85
- package/controls/DragControls.cjs +0 -182
- package/controls/DragControls.js +0 -182
- package/controls/FirstPersonControls.cjs +0 -229
- package/controls/FirstPersonControls.js +0 -229
- package/controls/FlyControls.cjs +0 -248
- package/controls/FlyControls.js +0 -248
- package/controls/OrbitControls.cjs +0 -791
- package/controls/OrbitControls.js +0 -791
- package/controls/PointerLockControls.cjs +0 -103
- package/controls/PointerLockControls.js +0 -103
- package/controls/TrackballControls.cjs +0 -502
- package/controls/TrackballControls.js +0 -502
- package/controls/TransformControls.cjs +0 -1089
- package/controls/TransformControls.js +0 -1089
- package/controls/experimental/CameraControls.cjs +0 -736
- package/controls/experimental/CameraControls.js +0 -736
- package/csm/CSM.cjs +0 -244
- package/csm/CSM.js +0 -244
- package/csm/CSMFrustum.cjs +0 -75
- package/csm/CSMFrustum.js +0 -75
- package/csm/CSMHelper.cjs +0 -114
- package/csm/CSMHelper.js +0 -114
- package/csm/CSMShader.cjs +0 -261
- package/csm/CSMShader.js +0 -261
- package/curves/CurveExtras.cjs +0 -214
- package/curves/CurveExtras.js +0 -214
- package/curves/NURBSCurve.cjs +0 -35
- package/curves/NURBSCurve.js +0 -35
- package/curves/NURBSSurface.cjs +0 -28
- package/curves/NURBSSurface.js +0 -28
- package/curves/NURBSUtils.cjs +0 -226
- package/curves/NURBSUtils.js +0 -226
- package/deprecated/Geometry.cjs +0 -971
- package/deprecated/Geometry.js +0 -971
- package/effects/AnaglyphEffect.cjs +0 -102
- package/effects/AnaglyphEffect.js +0 -102
- package/effects/AsciiEffect.cjs +0 -155
- package/effects/AsciiEffect.js +0 -155
- package/effects/OutlineEffect.cjs +0 -275
- package/effects/OutlineEffect.js +0 -275
- package/effects/ParallaxBarrierEffect.cjs +0 -65
- package/effects/ParallaxBarrierEffect.js +0 -65
- package/effects/PeppersGhostEffect.cjs +0 -88
- package/effects/PeppersGhostEffect.js +0 -88
- package/effects/StereoEffect.cjs +0 -35
- package/effects/StereoEffect.js +0 -35
- package/environments/RoomEnvironment.cjs +0 -95
- package/environments/RoomEnvironment.js +0 -78
- package/exporters/ColladaExporter.cjs +0 -331
- package/exporters/ColladaExporter.js +0 -331
- package/exporters/DRACOExporter.cjs +0 -141
- package/exporters/DRACOExporter.js +0 -141
- package/exporters/GLTFExporter.cjs +0 -1909
- package/exporters/GLTFExporter.js +0 -1909
- package/exporters/MMDExporter.cjs +0 -131
- package/exporters/MMDExporter.js +0 -131
- package/exporters/OBJExporter.cjs +0 -181
- package/exporters/OBJExporter.js +0 -181
- package/exporters/PLYExporter.cjs +0 -280
- package/exporters/PLYExporter.js +0 -280
- package/exporters/STLExporter.cjs +0 -146
- package/exporters/STLExporter.js +0 -146
- package/exporters/USDZExporter.cjs +0 -340
- package/exporters/USDZExporter.js +0 -340
- package/geometries/BoxLineGeometry.cjs +0 -45
- package/geometries/BoxLineGeometry.js +0 -45
- package/geometries/ConvexGeometry.cjs +0 -26
- package/geometries/ConvexGeometry.js +0 -26
- package/geometries/DecalGeometry.cjs +0 -184
- package/geometries/DecalGeometry.js +0 -184
- package/geometries/LightningStrike.cjs +0 -553
- package/geometries/LightningStrike.js +0 -553
- package/geometries/ParametricGeometries.cjs +0 -130
- package/geometries/ParametricGeometries.js +0 -130
- package/geometries/ParametricGeometry.cjs +0 -63
- package/geometries/ParametricGeometry.js +0 -63
- package/geometries/RoundedBoxGeometry.cjs +0 -91
- package/geometries/RoundedBoxGeometry.js +0 -91
- package/geometries/TeapotGeometry.cjs +0 -1563
- package/geometries/TeapotGeometry.js +0 -1563
- package/geometries/TextGeometry.cjs +0 -27
- package/geometries/TextGeometry.js +0 -27
- package/helpers/LightProbeHelper.cjs +0 -73
- package/helpers/LightProbeHelper.js +0 -73
- package/helpers/PositionalAudioHelper.cjs +0 -68
- package/helpers/PositionalAudioHelper.js +0 -68
- package/helpers/RectAreaLightHelper.cjs +0 -44
- package/helpers/RectAreaLightHelper.js +0 -44
- package/helpers/VertexNormalsHelper.cjs +0 -47
- package/helpers/VertexNormalsHelper.js +0 -47
- package/helpers/VertexTangentsHelper.cjs +0 -43
- package/helpers/VertexTangentsHelper.js +0 -43
- package/interactive/HTMLMesh.cjs +0 -325
- package/interactive/HTMLMesh.js +0 -325
- package/interactive/InteractiveGroup.cjs +0 -68
- package/interactive/InteractiveGroup.js +0 -68
- package/interactive/SelectionBox.cjs +0 -134
- package/interactive/SelectionBox.js +0 -134
- package/interactive/SelectionHelper.cjs +0 -51
- package/interactive/SelectionHelper.js +0 -51
- package/libs/MeshoptDecoder.cjs +0 -221
- package/libs/MeshoptDecoder.js +0 -221
- package/libs/MotionControllers.cjs +0 -325
- package/libs/MotionControllers.js +0 -325
- package/lights/LightProbeGenerator.cjs +0 -145
- package/lights/LightProbeGenerator.js +0 -145
- package/lights/RectAreaLightUniformsLib.cjs +0 -32846
- package/lights/RectAreaLightUniformsLib.js +0 -32846
- package/lines/Line2.cjs +0 -13
- package/lines/Line2.js +0 -13
- package/lines/LineGeometry.cjs +0 -44
- package/lines/LineGeometry.js +0 -44
- package/lines/LineMaterial.cjs +0 -547
- package/lines/LineMaterial.js +0 -547
- package/lines/LineSegments2.cjs +0 -203
- package/lines/LineSegments2.js +0 -203
- package/lines/LineSegmentsGeometry.cjs +0 -124
- package/lines/LineSegmentsGeometry.js +0 -124
- package/lines/Wireframe.cjs +0 -32
- package/lines/Wireframe.js +0 -32
- package/lines/WireframeGeometry2.cjs +0 -13
- package/lines/WireframeGeometry2.js +0 -13
- package/loaders/3DMLoader.cjs +0 -803
- package/loaders/3DMLoader.js +0 -803
- package/loaders/3MFLoader.cjs +0 -854
- package/loaders/3MFLoader.js +0 -854
- package/loaders/AMFLoader.cjs +0 -284
- package/loaders/AMFLoader.js +0 -284
- package/loaders/AssimpLoader.cjs +0 -1434
- package/loaders/AssimpLoader.js +0 -1434
- package/loaders/BVHLoader.cjs +0 -207
- package/loaders/BVHLoader.js +0 -207
- package/loaders/BasisTextureLoader.cjs +0 -489
- package/loaders/BasisTextureLoader.js +0 -489
- package/loaders/ColladaLoader.cjs +0 -2405
- package/loaders/ColladaLoader.js +0 -2405
- package/loaders/DDSLoader.cjs +0 -148
- package/loaders/DDSLoader.js +0 -148
- package/loaders/DRACOLoader.cjs +0 -341
- package/loaders/DRACOLoader.js +0 -341
- package/loaders/EXRLoader.cjs +0 -1356
- package/loaders/EXRLoader.js +0 -1356
- package/loaders/FBXLoader.cjs +0 -2457
- package/loaders/FBXLoader.js +0 -2457
- package/loaders/FontLoader.cjs +0 -123
- package/loaders/FontLoader.js +0 -123
- package/loaders/GCodeLoader.cjs +0 -141
- package/loaders/GCodeLoader.js +0 -141
- package/loaders/GLTFLoader.cjs +0 -2504
- package/loaders/GLTFLoader.js +0 -2504
- package/loaders/HDRCubeTextureLoader.cjs +0 -75
- package/loaders/HDRCubeTextureLoader.js +0 -75
- package/loaders/KMZLoader.cjs +0 -75
- package/loaders/KMZLoader.js +0 -75
- package/loaders/KTX2Loader.cjs +0 -480
- package/loaders/KTX2Loader.js +0 -480
- package/loaders/KTXLoader.cjs +0 -93
- package/loaders/KTXLoader.js +0 -93
- package/loaders/LDrawLoader.cjs +0 -1424
- package/loaders/LDrawLoader.js +0 -1424
- package/loaders/LUT3dlLoader.cjs +0 -103
- package/loaders/LUT3dlLoader.js +0 -103
- package/loaders/LUTCubeLoader.cjs +0 -107
- package/loaders/LUTCubeLoader.js +0 -107
- package/loaders/LWOLoader.cjs +0 -645
- package/loaders/LWOLoader.js +0 -645
- package/loaders/LottieLoader.cjs +0 -47
- package/loaders/LottieLoader.js +0 -47
- package/loaders/MD2Loader.cjs +0 -359
- package/loaders/MD2Loader.js +0 -359
- package/loaders/MDDLoader.cjs +0 -58
- package/loaders/MDDLoader.js +0 -58
- package/loaders/MMDLoader.cjs +0 -1121
- package/loaders/MMDLoader.js +0 -1121
- package/loaders/MTLLoader.cjs +0 -304
- package/loaders/MTLLoader.js +0 -304
- package/loaders/NRRDLoader.cjs +0 -401
- package/loaders/NRRDLoader.js +0 -401
- package/loaders/OBJLoader.cjs +0 -487
- package/loaders/OBJLoader.js +0 -487
- package/loaders/PCDLoader.cjs +0 -248
- package/loaders/PCDLoader.js +0 -248
- package/loaders/PDBLoader.cjs +0 -247
- package/loaders/PDBLoader.js +0 -247
- package/loaders/PLYLoader.cjs +0 -317
- package/loaders/PLYLoader.js +0 -317
- package/loaders/PRWMLoader.cjs +0 -160
- package/loaders/PRWMLoader.js +0 -160
- package/loaders/PVRLoader.cjs +0 -131
- package/loaders/PVRLoader.js +0 -131
- package/loaders/RGBELoader.cjs +0 -252
- package/loaders/RGBELoader.js +0 -252
- package/loaders/RGBMLoader.cjs +0 -1004
- package/loaders/RGBMLoader.js +0 -1004
- package/loaders/STLLoader.cjs +0 -190
- package/loaders/STLLoader.js +0 -190
- package/loaders/SVGLoader.cjs +0 -1712
- package/loaders/SVGLoader.js +0 -1712
- package/loaders/TDSLoader.cjs +0 -650
- package/loaders/TDSLoader.js +0 -650
- package/loaders/TGALoader.cjs +0 -285
- package/loaders/TGALoader.js +0 -285
- package/loaders/TTFLoader.cjs +0 -131
- package/loaders/TTFLoader.js +0 -131
- package/loaders/TiltLoader.cjs +0 -375
- package/loaders/TiltLoader.js +0 -375
- package/loaders/VOXLoader.cjs +0 -432
- package/loaders/VOXLoader.js +0 -432
- package/loaders/VRMLLoader.cjs +0 -2105
- package/loaders/VRMLLoader.js +0 -2105
- package/loaders/VRMLoader.cjs +0 -38
- package/loaders/VRMLoader.js +0 -38
- package/loaders/VTKLoader.cjs +0 -648
- package/loaders/VTKLoader.js +0 -648
- package/loaders/XLoader.cjs +0 -1258
- package/loaders/XLoader.js +0 -1258
- package/loaders/XYZLoader.cjs +0 -60
- package/loaders/XYZLoader.js +0 -60
- package/loaders/lwo/IFFParser.cjs +0 -743
- package/loaders/lwo/IFFParser.js +0 -743
- package/loaders/lwo/LWO2Parser.cjs +0 -312
- package/loaders/lwo/LWO2Parser.js +0 -312
- package/loaders/lwo/LWO3Parser.cjs +0 -282
- package/loaders/lwo/LWO3Parser.js +0 -282
- package/math/Capsule.cjs +0 -98
- package/math/Capsule.js +0 -98
- package/math/ColorConverter.cjs +0 -42
- package/math/ColorConverter.js +0 -42
- package/math/ConvexHull.cjs +0 -596
- package/math/ConvexHull.js +0 -596
- package/math/ImprovedNoise.cjs +0 -304
- package/math/ImprovedNoise.js +0 -304
- package/math/Lut.cjs +0 -137
- package/math/Lut.js +0 -137
- package/math/MeshSurfaceSampler.cjs +0 -103
- package/math/MeshSurfaceSampler.js +0 -103
- package/math/OBB.cjs +0 -242
- package/math/OBB.js +0 -242
- package/math/Octree.cjs +0 -273
- package/math/Octree.js +0 -273
- package/math/SimplexNoise.cjs +0 -440
- package/math/SimplexNoise.js +0 -440
- package/misc/ConvexObjectBreaker.cjs +0 -292
- package/misc/ConvexObjectBreaker.js +0 -292
- package/misc/GPUComputationRenderer.cjs +0 -205
- package/misc/GPUComputationRenderer.js +0 -205
- package/misc/Gyroscope.cjs +0 -33
- package/misc/Gyroscope.js +0 -33
- package/misc/MD2Character.cjs +0 -167
- package/misc/MD2Character.js +0 -167
- package/misc/MD2CharacterComplex.cjs +0 -332
- package/misc/MD2CharacterComplex.js +0 -332
- package/misc/MorphAnimMesh.cjs +0 -40
- package/misc/MorphAnimMesh.js +0 -40
- package/misc/MorphBlendMesh.cjs +0 -179
- package/misc/MorphBlendMesh.js +0 -179
- package/misc/ProgressiveLightmap.cjs +0 -186
- package/misc/ProgressiveLightmap.js +0 -186
- package/misc/RollerCoaster.cjs +0 -353
- package/misc/RollerCoaster.js +0 -353
- package/misc/Timer.cjs +0 -101
- package/misc/Timer.js +0 -101
- package/misc/TubePainter.cjs +0 -123
- package/misc/TubePainter.js +0 -123
- package/misc/Volume.cjs +0 -305
- package/misc/Volume.js +0 -305
- package/misc/VolumeSlice.cjs +0 -114
- package/misc/VolumeSlice.js +0 -114
- package/misc/WebGL.cjs +0 -74
- package/misc/WebGL.js +0 -74
- package/modifiers/CurveModifier.cjs +0 -232
- package/modifiers/CurveModifier.js +0 -232
- package/modifiers/EdgeSplitModifier.cjs +0 -167
- package/modifiers/EdgeSplitModifier.js +0 -168
- package/modifiers/SimplifyModifier.cjs +0 -301
- package/modifiers/SimplifyModifier.js +0 -301
- package/modifiers/TessellateModifier.cjs +0 -214
- package/modifiers/TessellateModifier.js +0 -214
- package/objects/GroundProjectedEnv.cjs +0 -134
- package/objects/GroundProjectedEnv.js +0 -134
- package/objects/Lensflare.cjs +0 -291
- package/objects/Lensflare.js +0 -291
- package/objects/LightningStorm.cjs +0 -110
- package/objects/LightningStorm.js +0 -110
- package/objects/MarchingCubes.cjs +0 -4809
- package/objects/MarchingCubes.js +0 -4809
- package/objects/Reflector.cjs +0 -202
- package/objects/Reflector.js +0 -202
- package/objects/ReflectorForSSRPass.cjs +0 -260
- package/objects/ReflectorForSSRPass.js +0 -260
- package/objects/ReflectorRTT.cjs +0 -10
- package/objects/ReflectorRTT.js +0 -10
- package/objects/Refractor.cjs +0 -215
- package/objects/Refractor.js +0 -215
- package/objects/ShadowMesh.cjs +0 -45
- package/objects/ShadowMesh.js +0 -45
- package/objects/Sky.cjs +0 -200
- package/objects/Sky.js +0 -200
- package/objects/Water.cjs +0 -242
- package/objects/Water.js +0 -242
- package/objects/Water2.cjs +0 -256
- package/objects/Water2.js +0 -256
- package/physics/AmmoPhysics.cjs +0 -166
- package/physics/AmmoPhysics.js +0 -166
- package/postprocessing/AdaptiveToneMappingPass.cjs +0 -218
- package/postprocessing/AdaptiveToneMappingPass.js +0 -218
- package/postprocessing/AfterimagePass.cjs +0 -68
- package/postprocessing/AfterimagePass.js +0 -68
- package/postprocessing/BloomPass.cjs +0 -109
- package/postprocessing/BloomPass.js +0 -109
- package/postprocessing/BokehPass.cjs +0 -90
- package/postprocessing/BokehPass.js +0 -90
- package/postprocessing/ClearPass.cjs +0 -36
- package/postprocessing/ClearPass.js +0 -36
- package/postprocessing/CubeTexturePass.cjs +0 -53
- package/postprocessing/CubeTexturePass.js +0 -53
- package/postprocessing/DotScreenPass.cjs +0 -49
- package/postprocessing/DotScreenPass.js +0 -49
- package/postprocessing/EffectComposer.cjs +0 -157
- package/postprocessing/EffectComposer.js +0 -157
- package/postprocessing/FilmPass.cjs +0 -51
- package/postprocessing/FilmPass.js +0 -51
- package/postprocessing/GlitchPass.cjs +0 -84
- package/postprocessing/GlitchPass.js +0 -84
- package/postprocessing/HalftonePass.cjs +0 -53
- package/postprocessing/HalftonePass.js +0 -53
- package/postprocessing/LUTPass.cjs +0 -142
- package/postprocessing/LUTPass.js +0 -142
- package/postprocessing/MaskPass.cjs +0 -69
- package/postprocessing/MaskPass.js +0 -69
- package/postprocessing/OutlinePass.cjs +0 -479
- package/postprocessing/OutlinePass.js +0 -479
- package/postprocessing/Pass.cjs +0 -48
- package/postprocessing/Pass.js +0 -48
- package/postprocessing/RenderPass.cjs +0 -59
- package/postprocessing/RenderPass.js +0 -59
- package/postprocessing/RenderPixelatedPass.cjs +0 -199
- package/postprocessing/RenderPixelatedPass.js +0 -199
- package/postprocessing/SAOPass.cjs +0 -288
- package/postprocessing/SAOPass.js +0 -288
- package/postprocessing/SMAAPass.cjs +0 -112
- package/postprocessing/SMAAPass.js +0 -112
- package/postprocessing/SSAARenderPass.cjs +0 -189
- package/postprocessing/SSAARenderPass.js +0 -189
- package/postprocessing/SSAOPass.cjs +0 -272
- package/postprocessing/SSAOPass.js +0 -272
- package/postprocessing/SSRPass.cjs +0 -411
- package/postprocessing/SSRPass.js +0 -411
- package/postprocessing/SavePass.cjs +0 -38
- package/postprocessing/SavePass.js +0 -38
- package/postprocessing/ShaderPass.cjs +0 -49
- package/postprocessing/ShaderPass.js +0 -49
- package/postprocessing/TAARenderPass.cjs +0 -174
- package/postprocessing/TAARenderPass.js +0 -174
- package/postprocessing/TexturePass.cjs +0 -42
- package/postprocessing/TexturePass.js +0 -42
- package/postprocessing/UnrealBloomPass.cjs +0 -277
- package/postprocessing/UnrealBloomPass.js +0 -277
- package/postprocessing/WaterPass.cjs +0 -72
- package/postprocessing/WaterPass.js +0 -72
- package/renderers/CSS2DRenderer.cjs +0 -122
- package/renderers/CSS2DRenderer.js +0 -122
- package/renderers/CSS3DRenderer.cjs +0 -167
- package/renderers/CSS3DRenderer.js +0 -167
- package/renderers/Projector.cjs +0 -499
- package/renderers/Projector.js +0 -499
- package/renderers/SVGRenderer.cjs +0 -311
- package/renderers/SVGRenderer.js +0 -311
- package/shaders/ACESFilmicToneMappingShader.cjs +0 -55
- package/shaders/ACESFilmicToneMappingShader.js +0 -55
- package/shaders/AfterimageShader.cjs +0 -32
- package/shaders/AfterimageShader.js +0 -32
- package/shaders/BasicShader.cjs +0 -12
- package/shaders/BasicShader.js +0 -12
- package/shaders/BleachBypassShader.cjs +0 -35
- package/shaders/BleachBypassShader.js +0 -35
- package/shaders/BlendShader.cjs +0 -30
- package/shaders/BlendShader.js +0 -30
- package/shaders/BokehShader.cjs +0 -109
- package/shaders/BokehShader.js +0 -109
- package/shaders/BokehShader2.cjs +0 -269
- package/shaders/BokehShader2.js +0 -269
- package/shaders/BrightnessContrastShader.cjs +0 -32
- package/shaders/BrightnessContrastShader.js +0 -32
- package/shaders/ColorCorrectionShader.cjs +0 -30
- package/shaders/ColorCorrectionShader.js +0 -30
- package/shaders/ColorifyShader.cjs +0 -28
- package/shaders/ColorifyShader.js +0 -28
- package/shaders/ConvolutionShader.cjs +0 -55
- package/shaders/ConvolutionShader.js +0 -55
- package/shaders/CopyShader.cjs +0 -25
- package/shaders/CopyShader.js +0 -25
- package/shaders/DOFMipMapShader.cjs +0 -32
- package/shaders/DOFMipMapShader.js +0 -32
- package/shaders/DepthLimitedBlurShader.cjs +0 -114
- package/shaders/DepthLimitedBlurShader.js +0 -114
- package/shaders/DigitalGlitch.cjs +0 -85
- package/shaders/DigitalGlitch.js +0 -85
- package/shaders/DotScreenShader.cjs +0 -39
- package/shaders/DotScreenShader.js +0 -39
- package/shaders/FXAAShader.cjs +0 -1098
- package/shaders/FXAAShader.js +0 -1098
- package/shaders/FilmShader.cjs +0 -53
- package/shaders/FilmShader.js +0 -53
- package/shaders/FocusShader.cjs +0 -55
- package/shaders/FocusShader.js +0 -55
- package/shaders/FreiChenShader.cjs +0 -64
- package/shaders/FreiChenShader.js +0 -64
- package/shaders/FresnelShader.cjs +0 -47
- package/shaders/FresnelShader.js +0 -47
- package/shaders/GammaCorrectionShader.cjs +0 -23
- package/shaders/GammaCorrectionShader.js +0 -23
- package/shaders/GodRaysShader.cjs +0 -183
- package/shaders/GodRaysShader.js +0 -183
- package/shaders/HalftoneShader.cjs +0 -228
- package/shaders/HalftoneShader.js +0 -228
- package/shaders/HorizontalBlurShader.cjs +0 -49
- package/shaders/HorizontalBlurShader.js +0 -49
- package/shaders/HorizontalTiltShiftShader.cjs +0 -37
- package/shaders/HorizontalTiltShiftShader.js +0 -37
- package/shaders/HueSaturationShader.cjs +0 -43
- package/shaders/HueSaturationShader.js +0 -43
- package/shaders/KaleidoShader.cjs +0 -34
- package/shaders/KaleidoShader.js +0 -34
- package/shaders/LuminosityHighPassShader.cjs +0 -37
- package/shaders/LuminosityHighPassShader.js +0 -37
- package/shaders/LuminosityShader.cjs +0 -25
- package/shaders/LuminosityShader.js +0 -25
- package/shaders/MirrorShader.cjs +0 -35
- package/shaders/MirrorShader.js +0 -35
- package/shaders/NormalMapShader.cjs +0 -31
- package/shaders/NormalMapShader.js +0 -31
- package/shaders/ParallaxShader.cjs +0 -133
- package/shaders/ParallaxShader.js +0 -133
- package/shaders/PixelShader.cjs +0 -28
- package/shaders/PixelShader.js +0 -28
- package/shaders/RGBShiftShader.cjs +0 -30
- package/shaders/RGBShiftShader.js +0 -30
- package/shaders/SAOShader.cjs +0 -144
- package/shaders/SAOShader.js +0 -144
- package/shaders/SMAAShader.cjs +0 -358
- package/shaders/SMAAShader.js +0 -358
- package/shaders/SSAOShader.cjs +0 -182
- package/shaders/SSAOShader.js +0 -182
- package/shaders/SSRShader.cjs +0 -342
- package/shaders/SSRShader.js +0 -342
- package/shaders/SepiaShader.cjs +0 -29
- package/shaders/SepiaShader.js +0 -29
- package/shaders/SobelOperatorShader.cjs +0 -54
- package/shaders/SobelOperatorShader.js +0 -54
- package/shaders/SubsurfaceScatteringShader.cjs +0 -98
- package/shaders/SubsurfaceScatteringShader.js +0 -98
- package/shaders/TechnicolorShader.cjs +0 -24
- package/shaders/TechnicolorShader.js +0 -24
- package/shaders/ToneMapShader.cjs +0 -51
- package/shaders/ToneMapShader.js +0 -51
- package/shaders/ToonShader.cjs +0 -188
- package/shaders/ToonShader.js +0 -188
- package/shaders/TriangleBlurShader.cjs +0 -37
- package/shaders/TriangleBlurShader.js +0 -37
- package/shaders/UnpackDepthRGBAShader.cjs +0 -26
- package/shaders/UnpackDepthRGBAShader.js +0 -26
- package/shaders/VerticalBlurShader.cjs +0 -50
- package/shaders/VerticalBlurShader.js +0 -50
- package/shaders/VerticalTiltShiftShader.cjs +0 -37
- package/shaders/VerticalTiltShiftShader.js +0 -37
- package/shaders/VignetteShader.cjs +0 -38
- package/shaders/VignetteShader.js +0 -38
- package/shaders/VolumeShader.cjs +0 -225
- package/shaders/VolumeShader.js +0 -225
- package/shaders/WaterRefractionShader.cjs +0 -59
- package/shaders/WaterRefractionShader.js +0 -59
- package/shaders/types.cjs +0 -1
- package/shaders/types.js +0 -1
- package/textures/FlakesTexture.cjs +0 -30
- package/textures/FlakesTexture.js +0 -30
- package/types/helpers.cjs +0 -4
- package/types/helpers.js +0 -4
- package/utils/BufferGeometryUtils.cjs +0 -636
- package/utils/BufferGeometryUtils.js +0 -636
- package/utils/GeometryCompressionUtils.cjs +0 -573
- package/utils/GeometryCompressionUtils.js +0 -573
- package/utils/GeometryUtils.cjs +0 -109
- package/utils/GeometryUtils.js +0 -109
- package/utils/RoughnessMipmapper.cjs +0 -223
- package/utils/RoughnessMipmapper.js +0 -223
- package/utils/SceneUtils.cjs +0 -36
- package/utils/SceneUtils.js +0 -36
- package/utils/ShadowMapViewer.cjs +0 -111
- package/utils/ShadowMapViewer.js +0 -111
- package/utils/SkeletonUtils.cjs +0 -211
- package/utils/SkeletonUtils.js +0 -211
- package/utils/UVsDebug.cjs +0 -80
- package/utils/UVsDebug.js +0 -80
- package/utils/WorkerPool.cjs +0 -62
- package/utils/WorkerPool.js +0 -62
- package/webxr/ARButton.cjs +0 -119
- package/webxr/ARButton.js +0 -119
- package/webxr/OculusHandModel.cjs +0 -82
- package/webxr/OculusHandModel.js +0 -82
- package/webxr/OculusHandPointerModel.cjs +0 -241
- package/webxr/OculusHandPointerModel.js +0 -224
- package/webxr/Text2D.cjs +0 -48
- package/webxr/Text2D.js +0 -31
- package/webxr/VRButton.cjs +0 -111
- package/webxr/VRButton.js +0 -111
- package/webxr/XRControllerModelFactory.cjs +0 -174
- package/webxr/XRControllerModelFactory.js +0 -174
- package/webxr/XREstimatedLight.cjs +0 -126
- package/webxr/XREstimatedLight.js +0 -126
- package/webxr/XRHandMeshModel.cjs +0 -82
- package/webxr/XRHandMeshModel.js +0 -82
- package/webxr/XRHandModelFactory.cjs +0 -61
- package/webxr/XRHandModelFactory.js +0 -61
- package/webxr/XRHandPrimitiveModel.cjs +0 -68
- package/webxr/XRHandPrimitiveModel.js +0 -68
package/loaders/VRMLLoader.js
DELETED
|
@@ -1,2105 +0,0 @@
|
|
|
1
|
-
import { Loader, LoaderUtils, FileLoader, Scene, Object3D, Group, Vector3, SphereGeometry, MeshBasicMaterial, BackSide, Mesh, PointsMaterial, Points, LineBasicMaterial, LineSegments, FrontSide, DoubleSide, MeshPhongMaterial, Color, RepeatWrapping, ClampToEdgeWrapping, DataTexture, Vector2, BufferGeometry, Float32BufferAttribute, BoxGeometry, ConeGeometry, CylinderGeometry, Quaternion, ShapeUtils, BufferAttribute, TextureLoader } from "three";
|
|
2
|
-
import { createToken, Lexer, CstParser } from "chevrotain";
|
|
3
|
-
class VRMLLoader extends Loader {
|
|
4
|
-
constructor(manager) {
|
|
5
|
-
super(manager);
|
|
6
|
-
}
|
|
7
|
-
load(url, onLoad, onProgress, onError) {
|
|
8
|
-
const scope = this;
|
|
9
|
-
const path = scope.path === "" ? LoaderUtils.extractUrlBase(url) : scope.path;
|
|
10
|
-
const loader = new FileLoader(scope.manager);
|
|
11
|
-
loader.setPath(scope.path);
|
|
12
|
-
loader.setRequestHeader(scope.requestHeader);
|
|
13
|
-
loader.setWithCredentials(scope.withCredentials);
|
|
14
|
-
loader.load(
|
|
15
|
-
url,
|
|
16
|
-
function(text) {
|
|
17
|
-
try {
|
|
18
|
-
onLoad(scope.parse(text, path));
|
|
19
|
-
} catch (e) {
|
|
20
|
-
if (onError) {
|
|
21
|
-
onError(e);
|
|
22
|
-
} else {
|
|
23
|
-
console.error(e);
|
|
24
|
-
}
|
|
25
|
-
scope.manager.itemError(url);
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
onProgress,
|
|
29
|
-
onError
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
parse(data, path) {
|
|
33
|
-
const nodeMap = {};
|
|
34
|
-
function generateVRMLTree(data2) {
|
|
35
|
-
const tokenData = createTokens();
|
|
36
|
-
const lexer = new VRMLLexer(tokenData.tokens);
|
|
37
|
-
const parser = new VRMLParser(tokenData.tokenVocabulary);
|
|
38
|
-
const visitor = createVisitor(parser.getBaseCstVisitorConstructor());
|
|
39
|
-
const lexingResult = lexer.lex(data2);
|
|
40
|
-
parser.input = lexingResult.tokens;
|
|
41
|
-
const cstOutput = parser.vrml();
|
|
42
|
-
if (parser.errors.length > 0) {
|
|
43
|
-
console.error(parser.errors);
|
|
44
|
-
throw Error("THREE.VRMLLoader: Parsing errors detected.");
|
|
45
|
-
}
|
|
46
|
-
const ast = visitor.visit(cstOutput);
|
|
47
|
-
return ast;
|
|
48
|
-
}
|
|
49
|
-
function createTokens() {
|
|
50
|
-
const RouteIdentifier = createToken({
|
|
51
|
-
name: "RouteIdentifier",
|
|
52
|
-
pattern: /[^\x30-\x39\0-\x20\x22\x27\x23\x2b\x2c\x2d\x2e\x5b\x5d\x5c\x7b\x7d][^\0-\x20\x22\x27\x23\x2b\x2c\x2d\x2e\x5b\x5d\x5c\x7b\x7d]*[\.][^\x30-\x39\0-\x20\x22\x27\x23\x2b\x2c\x2d\x2e\x5b\x5d\x5c\x7b\x7d][^\0-\x20\x22\x27\x23\x2b\x2c\x2d\x2e\x5b\x5d\x5c\x7b\x7d]*/
|
|
53
|
-
});
|
|
54
|
-
const Identifier = createToken({
|
|
55
|
-
name: "Identifier",
|
|
56
|
-
pattern: /[^\x30-\x39\0-\x20\x22\x27\x23\x2b\x2c\x2d\x2e\x5b\x5d\x5c\x7b\x7d][^\0-\x20\x22\x27\x23\x2b\x2c\x2d\x2e\x5b\x5d\x5c\x7b\x7d]*/,
|
|
57
|
-
longer_alt: RouteIdentifier
|
|
58
|
-
});
|
|
59
|
-
const nodeTypes = [
|
|
60
|
-
"Anchor",
|
|
61
|
-
"Billboard",
|
|
62
|
-
"Collision",
|
|
63
|
-
"Group",
|
|
64
|
-
"Transform",
|
|
65
|
-
// grouping nodes
|
|
66
|
-
"Inline",
|
|
67
|
-
"LOD",
|
|
68
|
-
"Switch",
|
|
69
|
-
// special groups
|
|
70
|
-
"AudioClip",
|
|
71
|
-
"DirectionalLight",
|
|
72
|
-
"PointLight",
|
|
73
|
-
"Script",
|
|
74
|
-
"Shape",
|
|
75
|
-
"Sound",
|
|
76
|
-
"SpotLight",
|
|
77
|
-
"WorldInfo",
|
|
78
|
-
// common nodes
|
|
79
|
-
"CylinderSensor",
|
|
80
|
-
"PlaneSensor",
|
|
81
|
-
"ProximitySensor",
|
|
82
|
-
"SphereSensor",
|
|
83
|
-
"TimeSensor",
|
|
84
|
-
"TouchSensor",
|
|
85
|
-
"VisibilitySensor",
|
|
86
|
-
// sensors
|
|
87
|
-
"Box",
|
|
88
|
-
"Cone",
|
|
89
|
-
"Cylinder",
|
|
90
|
-
"ElevationGrid",
|
|
91
|
-
"Extrusion",
|
|
92
|
-
"IndexedFaceSet",
|
|
93
|
-
"IndexedLineSet",
|
|
94
|
-
"PointSet",
|
|
95
|
-
"Sphere",
|
|
96
|
-
// geometries
|
|
97
|
-
"Color",
|
|
98
|
-
"Coordinate",
|
|
99
|
-
"Normal",
|
|
100
|
-
"TextureCoordinate",
|
|
101
|
-
// geometric properties
|
|
102
|
-
"Appearance",
|
|
103
|
-
"FontStyle",
|
|
104
|
-
"ImageTexture",
|
|
105
|
-
"Material",
|
|
106
|
-
"MovieTexture",
|
|
107
|
-
"PixelTexture",
|
|
108
|
-
"TextureTransform",
|
|
109
|
-
// appearance
|
|
110
|
-
"ColorInterpolator",
|
|
111
|
-
"CoordinateInterpolator",
|
|
112
|
-
"NormalInterpolator",
|
|
113
|
-
"OrientationInterpolator",
|
|
114
|
-
"PositionInterpolator",
|
|
115
|
-
"ScalarInterpolator",
|
|
116
|
-
// interpolators
|
|
117
|
-
"Background",
|
|
118
|
-
"Fog",
|
|
119
|
-
"NavigationInfo",
|
|
120
|
-
"Viewpoint",
|
|
121
|
-
// bindable nodes
|
|
122
|
-
"Text"
|
|
123
|
-
// Text must be placed at the end of the regex so there are no matches for TextureTransform and TextureCoordinate
|
|
124
|
-
];
|
|
125
|
-
const Version = createToken({
|
|
126
|
-
name: "Version",
|
|
127
|
-
pattern: /#VRML.*/,
|
|
128
|
-
longer_alt: Identifier
|
|
129
|
-
});
|
|
130
|
-
const NodeName = createToken({
|
|
131
|
-
name: "NodeName",
|
|
132
|
-
pattern: new RegExp(nodeTypes.join("|")),
|
|
133
|
-
longer_alt: Identifier
|
|
134
|
-
});
|
|
135
|
-
const DEF = createToken({
|
|
136
|
-
name: "DEF",
|
|
137
|
-
pattern: /DEF/,
|
|
138
|
-
longer_alt: Identifier
|
|
139
|
-
});
|
|
140
|
-
const USE = createToken({
|
|
141
|
-
name: "USE",
|
|
142
|
-
pattern: /USE/,
|
|
143
|
-
longer_alt: Identifier
|
|
144
|
-
});
|
|
145
|
-
const ROUTE = createToken({
|
|
146
|
-
name: "ROUTE",
|
|
147
|
-
pattern: /ROUTE/,
|
|
148
|
-
longer_alt: Identifier
|
|
149
|
-
});
|
|
150
|
-
const TO = createToken({
|
|
151
|
-
name: "TO",
|
|
152
|
-
pattern: /TO/,
|
|
153
|
-
longer_alt: Identifier
|
|
154
|
-
});
|
|
155
|
-
const StringLiteral = createToken({
|
|
156
|
-
name: "StringLiteral",
|
|
157
|
-
pattern: /"(?:[^\\"\n\r]|\\[bfnrtv"\\/]|\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])*"/
|
|
158
|
-
});
|
|
159
|
-
const HexLiteral = createToken({ name: "HexLiteral", pattern: /0[xX][0-9a-fA-F]+/ });
|
|
160
|
-
const NumberLiteral = createToken({ name: "NumberLiteral", pattern: /[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/ });
|
|
161
|
-
const TrueLiteral = createToken({ name: "TrueLiteral", pattern: /TRUE/ });
|
|
162
|
-
const FalseLiteral = createToken({ name: "FalseLiteral", pattern: /FALSE/ });
|
|
163
|
-
const NullLiteral = createToken({ name: "NullLiteral", pattern: /NULL/ });
|
|
164
|
-
const LSquare = createToken({ name: "LSquare", pattern: /\[/ });
|
|
165
|
-
const RSquare = createToken({ name: "RSquare", pattern: /]/ });
|
|
166
|
-
const LCurly = createToken({ name: "LCurly", pattern: /{/ });
|
|
167
|
-
const RCurly = createToken({ name: "RCurly", pattern: /}/ });
|
|
168
|
-
const Comment = createToken({
|
|
169
|
-
name: "Comment",
|
|
170
|
-
pattern: /#.*/,
|
|
171
|
-
group: Lexer.SKIPPED
|
|
172
|
-
});
|
|
173
|
-
const WhiteSpace = createToken({
|
|
174
|
-
name: "WhiteSpace",
|
|
175
|
-
pattern: /[ ,\s]/,
|
|
176
|
-
group: Lexer.SKIPPED
|
|
177
|
-
});
|
|
178
|
-
const tokens = [
|
|
179
|
-
WhiteSpace,
|
|
180
|
-
// keywords appear before the Identifier
|
|
181
|
-
NodeName,
|
|
182
|
-
DEF,
|
|
183
|
-
USE,
|
|
184
|
-
ROUTE,
|
|
185
|
-
TO,
|
|
186
|
-
TrueLiteral,
|
|
187
|
-
FalseLiteral,
|
|
188
|
-
NullLiteral,
|
|
189
|
-
// the Identifier must appear after the keywords because all keywords are valid identifiers
|
|
190
|
-
Version,
|
|
191
|
-
Identifier,
|
|
192
|
-
RouteIdentifier,
|
|
193
|
-
StringLiteral,
|
|
194
|
-
HexLiteral,
|
|
195
|
-
NumberLiteral,
|
|
196
|
-
LSquare,
|
|
197
|
-
RSquare,
|
|
198
|
-
LCurly,
|
|
199
|
-
RCurly,
|
|
200
|
-
Comment
|
|
201
|
-
];
|
|
202
|
-
const tokenVocabulary = {};
|
|
203
|
-
for (let i = 0, l = tokens.length; i < l; i++) {
|
|
204
|
-
const token = tokens[i];
|
|
205
|
-
tokenVocabulary[token.name] = token;
|
|
206
|
-
}
|
|
207
|
-
return { tokens, tokenVocabulary };
|
|
208
|
-
}
|
|
209
|
-
function createVisitor(BaseVRMLVisitor) {
|
|
210
|
-
function VRMLToASTVisitor() {
|
|
211
|
-
BaseVRMLVisitor.call(this);
|
|
212
|
-
this.validateVisitor();
|
|
213
|
-
}
|
|
214
|
-
VRMLToASTVisitor.prototype = Object.assign(Object.create(BaseVRMLVisitor.prototype), {
|
|
215
|
-
constructor: VRMLToASTVisitor,
|
|
216
|
-
vrml: function(ctx) {
|
|
217
|
-
const data2 = {
|
|
218
|
-
version: this.visit(ctx.version),
|
|
219
|
-
nodes: [],
|
|
220
|
-
routes: []
|
|
221
|
-
};
|
|
222
|
-
for (let i = 0, l = ctx.node.length; i < l; i++) {
|
|
223
|
-
const node = ctx.node[i];
|
|
224
|
-
data2.nodes.push(this.visit(node));
|
|
225
|
-
}
|
|
226
|
-
if (ctx.route) {
|
|
227
|
-
for (let i = 0, l = ctx.route.length; i < l; i++) {
|
|
228
|
-
const route = ctx.route[i];
|
|
229
|
-
data2.routes.push(this.visit(route));
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return data2;
|
|
233
|
-
},
|
|
234
|
-
version: function(ctx) {
|
|
235
|
-
return ctx.Version[0].image;
|
|
236
|
-
},
|
|
237
|
-
node: function(ctx) {
|
|
238
|
-
const data2 = {
|
|
239
|
-
name: ctx.NodeName[0].image,
|
|
240
|
-
fields: []
|
|
241
|
-
};
|
|
242
|
-
if (ctx.field) {
|
|
243
|
-
for (let i = 0, l = ctx.field.length; i < l; i++) {
|
|
244
|
-
const field = ctx.field[i];
|
|
245
|
-
data2.fields.push(this.visit(field));
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
if (ctx.def) {
|
|
249
|
-
data2.DEF = this.visit(ctx.def[0]);
|
|
250
|
-
}
|
|
251
|
-
return data2;
|
|
252
|
-
},
|
|
253
|
-
field: function(ctx) {
|
|
254
|
-
const data2 = {
|
|
255
|
-
name: ctx.Identifier[0].image,
|
|
256
|
-
type: null,
|
|
257
|
-
values: null
|
|
258
|
-
};
|
|
259
|
-
let result;
|
|
260
|
-
if (ctx.singleFieldValue) {
|
|
261
|
-
result = this.visit(ctx.singleFieldValue[0]);
|
|
262
|
-
}
|
|
263
|
-
if (ctx.multiFieldValue) {
|
|
264
|
-
result = this.visit(ctx.multiFieldValue[0]);
|
|
265
|
-
}
|
|
266
|
-
data2.type = result.type;
|
|
267
|
-
data2.values = result.values;
|
|
268
|
-
return data2;
|
|
269
|
-
},
|
|
270
|
-
def: function(ctx) {
|
|
271
|
-
return (ctx.Identifier || ctx.NodeName)[0].image;
|
|
272
|
-
},
|
|
273
|
-
use: function(ctx) {
|
|
274
|
-
return { USE: (ctx.Identifier || ctx.NodeName)[0].image };
|
|
275
|
-
},
|
|
276
|
-
singleFieldValue: function(ctx) {
|
|
277
|
-
return processField(this, ctx);
|
|
278
|
-
},
|
|
279
|
-
multiFieldValue: function(ctx) {
|
|
280
|
-
return processField(this, ctx);
|
|
281
|
-
},
|
|
282
|
-
route: function(ctx) {
|
|
283
|
-
const data2 = {
|
|
284
|
-
FROM: ctx.RouteIdentifier[0].image,
|
|
285
|
-
TO: ctx.RouteIdentifier[1].image
|
|
286
|
-
};
|
|
287
|
-
return data2;
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
function processField(scope, ctx) {
|
|
291
|
-
const field = {
|
|
292
|
-
type: null,
|
|
293
|
-
values: []
|
|
294
|
-
};
|
|
295
|
-
if (ctx.node) {
|
|
296
|
-
field.type = "node";
|
|
297
|
-
for (let i = 0, l = ctx.node.length; i < l; i++) {
|
|
298
|
-
const node = ctx.node[i];
|
|
299
|
-
field.values.push(scope.visit(node));
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
if (ctx.use) {
|
|
303
|
-
field.type = "use";
|
|
304
|
-
for (let i = 0, l = ctx.use.length; i < l; i++) {
|
|
305
|
-
const use = ctx.use[i];
|
|
306
|
-
field.values.push(scope.visit(use));
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
if (ctx.StringLiteral) {
|
|
310
|
-
field.type = "string";
|
|
311
|
-
for (let i = 0, l = ctx.StringLiteral.length; i < l; i++) {
|
|
312
|
-
const stringLiteral = ctx.StringLiteral[i];
|
|
313
|
-
field.values.push(stringLiteral.image.replace(/'|"/g, ""));
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
if (ctx.NumberLiteral) {
|
|
317
|
-
field.type = "number";
|
|
318
|
-
for (let i = 0, l = ctx.NumberLiteral.length; i < l; i++) {
|
|
319
|
-
const numberLiteral = ctx.NumberLiteral[i];
|
|
320
|
-
field.values.push(parseFloat(numberLiteral.image));
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
if (ctx.HexLiteral) {
|
|
324
|
-
field.type = "hex";
|
|
325
|
-
for (let i = 0, l = ctx.HexLiteral.length; i < l; i++) {
|
|
326
|
-
const hexLiteral = ctx.HexLiteral[i];
|
|
327
|
-
field.values.push(hexLiteral.image);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
if (ctx.TrueLiteral) {
|
|
331
|
-
field.type = "boolean";
|
|
332
|
-
for (let i = 0, l = ctx.TrueLiteral.length; i < l; i++) {
|
|
333
|
-
const trueLiteral = ctx.TrueLiteral[i];
|
|
334
|
-
if (trueLiteral.image === "TRUE")
|
|
335
|
-
field.values.push(true);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
if (ctx.FalseLiteral) {
|
|
339
|
-
field.type = "boolean";
|
|
340
|
-
for (let i = 0, l = ctx.FalseLiteral.length; i < l; i++) {
|
|
341
|
-
const falseLiteral = ctx.FalseLiteral[i];
|
|
342
|
-
if (falseLiteral.image === "FALSE")
|
|
343
|
-
field.values.push(false);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
if (ctx.NullLiteral) {
|
|
347
|
-
field.type = "null";
|
|
348
|
-
ctx.NullLiteral.forEach(function() {
|
|
349
|
-
field.values.push(null);
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
return field;
|
|
353
|
-
}
|
|
354
|
-
return new VRMLToASTVisitor();
|
|
355
|
-
}
|
|
356
|
-
function parseTree(tree2) {
|
|
357
|
-
const nodes = tree2.nodes;
|
|
358
|
-
const scene2 = new Scene();
|
|
359
|
-
for (let i = 0, l = nodes.length; i < l; i++) {
|
|
360
|
-
const node = nodes[i];
|
|
361
|
-
buildNodeMap(node);
|
|
362
|
-
}
|
|
363
|
-
for (let i = 0, l = nodes.length; i < l; i++) {
|
|
364
|
-
const node = nodes[i];
|
|
365
|
-
const object = getNode(node);
|
|
366
|
-
if (object instanceof Object3D)
|
|
367
|
-
scene2.add(object);
|
|
368
|
-
if (node.name === "WorldInfo")
|
|
369
|
-
scene2.userData.worldInfo = object;
|
|
370
|
-
}
|
|
371
|
-
return scene2;
|
|
372
|
-
}
|
|
373
|
-
function buildNodeMap(node) {
|
|
374
|
-
if (node.DEF) {
|
|
375
|
-
nodeMap[node.DEF] = node;
|
|
376
|
-
}
|
|
377
|
-
const fields = node.fields;
|
|
378
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
379
|
-
const field = fields[i];
|
|
380
|
-
if (field.type === "node") {
|
|
381
|
-
const fieldValues = field.values;
|
|
382
|
-
for (let j = 0, jl = fieldValues.length; j < jl; j++) {
|
|
383
|
-
buildNodeMap(fieldValues[j]);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
function getNode(node) {
|
|
389
|
-
if (node.USE) {
|
|
390
|
-
return resolveUSE(node.USE);
|
|
391
|
-
}
|
|
392
|
-
if (node.build !== void 0)
|
|
393
|
-
return node.build;
|
|
394
|
-
node.build = buildNode(node);
|
|
395
|
-
return node.build;
|
|
396
|
-
}
|
|
397
|
-
function buildNode(node) {
|
|
398
|
-
const nodeName = node.name;
|
|
399
|
-
let build;
|
|
400
|
-
switch (nodeName) {
|
|
401
|
-
case "Group":
|
|
402
|
-
case "Transform":
|
|
403
|
-
case "Collision":
|
|
404
|
-
build = buildGroupingNode(node);
|
|
405
|
-
break;
|
|
406
|
-
case "Background":
|
|
407
|
-
build = buildBackgroundNode(node);
|
|
408
|
-
break;
|
|
409
|
-
case "Shape":
|
|
410
|
-
build = buildShapeNode(node);
|
|
411
|
-
break;
|
|
412
|
-
case "Appearance":
|
|
413
|
-
build = buildAppearanceNode(node);
|
|
414
|
-
break;
|
|
415
|
-
case "Material":
|
|
416
|
-
build = buildMaterialNode(node);
|
|
417
|
-
break;
|
|
418
|
-
case "ImageTexture":
|
|
419
|
-
build = buildImageTextureNode(node);
|
|
420
|
-
break;
|
|
421
|
-
case "PixelTexture":
|
|
422
|
-
build = buildPixelTextureNode(node);
|
|
423
|
-
break;
|
|
424
|
-
case "TextureTransform":
|
|
425
|
-
build = buildTextureTransformNode(node);
|
|
426
|
-
break;
|
|
427
|
-
case "IndexedFaceSet":
|
|
428
|
-
build = buildIndexedFaceSetNode(node);
|
|
429
|
-
break;
|
|
430
|
-
case "IndexedLineSet":
|
|
431
|
-
build = buildIndexedLineSetNode(node);
|
|
432
|
-
break;
|
|
433
|
-
case "PointSet":
|
|
434
|
-
build = buildPointSetNode(node);
|
|
435
|
-
break;
|
|
436
|
-
case "Box":
|
|
437
|
-
build = buildBoxNode(node);
|
|
438
|
-
break;
|
|
439
|
-
case "Cone":
|
|
440
|
-
build = buildConeNode(node);
|
|
441
|
-
break;
|
|
442
|
-
case "Cylinder":
|
|
443
|
-
build = buildCylinderNode(node);
|
|
444
|
-
break;
|
|
445
|
-
case "Sphere":
|
|
446
|
-
build = buildSphereNode(node);
|
|
447
|
-
break;
|
|
448
|
-
case "ElevationGrid":
|
|
449
|
-
build = buildElevationGridNode(node);
|
|
450
|
-
break;
|
|
451
|
-
case "Extrusion":
|
|
452
|
-
build = buildExtrusionNode(node);
|
|
453
|
-
break;
|
|
454
|
-
case "Color":
|
|
455
|
-
case "Coordinate":
|
|
456
|
-
case "Normal":
|
|
457
|
-
case "TextureCoordinate":
|
|
458
|
-
build = buildGeometricNode(node);
|
|
459
|
-
break;
|
|
460
|
-
case "WorldInfo":
|
|
461
|
-
build = buildWorldInfoNode(node);
|
|
462
|
-
break;
|
|
463
|
-
case "Anchor":
|
|
464
|
-
case "Billboard":
|
|
465
|
-
case "Inline":
|
|
466
|
-
case "LOD":
|
|
467
|
-
case "Switch":
|
|
468
|
-
case "AudioClip":
|
|
469
|
-
case "DirectionalLight":
|
|
470
|
-
case "PointLight":
|
|
471
|
-
case "Script":
|
|
472
|
-
case "Sound":
|
|
473
|
-
case "SpotLight":
|
|
474
|
-
case "CylinderSensor":
|
|
475
|
-
case "PlaneSensor":
|
|
476
|
-
case "ProximitySensor":
|
|
477
|
-
case "SphereSensor":
|
|
478
|
-
case "TimeSensor":
|
|
479
|
-
case "TouchSensor":
|
|
480
|
-
case "VisibilitySensor":
|
|
481
|
-
case "Text":
|
|
482
|
-
case "FontStyle":
|
|
483
|
-
case "MovieTexture":
|
|
484
|
-
case "ColorInterpolator":
|
|
485
|
-
case "CoordinateInterpolator":
|
|
486
|
-
case "NormalInterpolator":
|
|
487
|
-
case "OrientationInterpolator":
|
|
488
|
-
case "PositionInterpolator":
|
|
489
|
-
case "ScalarInterpolator":
|
|
490
|
-
case "Fog":
|
|
491
|
-
case "NavigationInfo":
|
|
492
|
-
case "Viewpoint":
|
|
493
|
-
break;
|
|
494
|
-
default:
|
|
495
|
-
console.warn("THREE.VRMLLoader: Unknown node:", nodeName);
|
|
496
|
-
break;
|
|
497
|
-
}
|
|
498
|
-
if (build !== void 0 && node.DEF !== void 0 && build.hasOwnProperty("name") === true) {
|
|
499
|
-
build.name = node.DEF;
|
|
500
|
-
}
|
|
501
|
-
return build;
|
|
502
|
-
}
|
|
503
|
-
function buildGroupingNode(node) {
|
|
504
|
-
const object = new Group();
|
|
505
|
-
const fields = node.fields;
|
|
506
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
507
|
-
const field = fields[i];
|
|
508
|
-
const fieldName = field.name;
|
|
509
|
-
const fieldValues = field.values;
|
|
510
|
-
switch (fieldName) {
|
|
511
|
-
case "bboxCenter":
|
|
512
|
-
break;
|
|
513
|
-
case "bboxSize":
|
|
514
|
-
break;
|
|
515
|
-
case "center":
|
|
516
|
-
break;
|
|
517
|
-
case "children":
|
|
518
|
-
parseFieldChildren(fieldValues, object);
|
|
519
|
-
break;
|
|
520
|
-
case "collide":
|
|
521
|
-
break;
|
|
522
|
-
case "rotation":
|
|
523
|
-
const axis = new Vector3(fieldValues[0], fieldValues[1], fieldValues[2]);
|
|
524
|
-
const angle = fieldValues[3];
|
|
525
|
-
object.quaternion.setFromAxisAngle(axis, angle);
|
|
526
|
-
break;
|
|
527
|
-
case "scale":
|
|
528
|
-
object.scale.set(fieldValues[0], fieldValues[1], fieldValues[2]);
|
|
529
|
-
break;
|
|
530
|
-
case "scaleOrientation":
|
|
531
|
-
break;
|
|
532
|
-
case "translation":
|
|
533
|
-
object.position.set(fieldValues[0], fieldValues[1], fieldValues[2]);
|
|
534
|
-
break;
|
|
535
|
-
case "proxy":
|
|
536
|
-
break;
|
|
537
|
-
default:
|
|
538
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
539
|
-
break;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
return object;
|
|
543
|
-
}
|
|
544
|
-
function buildBackgroundNode(node) {
|
|
545
|
-
const group = new Group();
|
|
546
|
-
let groundAngle, groundColor;
|
|
547
|
-
let skyAngle, skyColor;
|
|
548
|
-
const fields = node.fields;
|
|
549
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
550
|
-
const field = fields[i];
|
|
551
|
-
const fieldName = field.name;
|
|
552
|
-
const fieldValues = field.values;
|
|
553
|
-
switch (fieldName) {
|
|
554
|
-
case "groundAngle":
|
|
555
|
-
groundAngle = fieldValues;
|
|
556
|
-
break;
|
|
557
|
-
case "groundColor":
|
|
558
|
-
groundColor = fieldValues;
|
|
559
|
-
break;
|
|
560
|
-
case "backUrl":
|
|
561
|
-
break;
|
|
562
|
-
case "bottomUrl":
|
|
563
|
-
break;
|
|
564
|
-
case "frontUrl":
|
|
565
|
-
break;
|
|
566
|
-
case "leftUrl":
|
|
567
|
-
break;
|
|
568
|
-
case "rightUrl":
|
|
569
|
-
break;
|
|
570
|
-
case "topUrl":
|
|
571
|
-
break;
|
|
572
|
-
case "skyAngle":
|
|
573
|
-
skyAngle = fieldValues;
|
|
574
|
-
break;
|
|
575
|
-
case "skyColor":
|
|
576
|
-
skyColor = fieldValues;
|
|
577
|
-
break;
|
|
578
|
-
default:
|
|
579
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
580
|
-
break;
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
const radius = 1e4;
|
|
584
|
-
if (skyColor) {
|
|
585
|
-
const skyGeometry = new SphereGeometry(radius, 32, 16);
|
|
586
|
-
const skyMaterial = new MeshBasicMaterial({ fog: false, side: BackSide, depthWrite: false, depthTest: false });
|
|
587
|
-
if (skyColor.length > 3) {
|
|
588
|
-
paintFaces(skyGeometry, radius, skyAngle, toColorArray(skyColor), true);
|
|
589
|
-
skyMaterial.vertexColors = true;
|
|
590
|
-
} else {
|
|
591
|
-
skyMaterial.color.setRGB(skyColor[0], skyColor[1], skyColor[2]);
|
|
592
|
-
}
|
|
593
|
-
const sky = new Mesh(skyGeometry, skyMaterial);
|
|
594
|
-
group.add(sky);
|
|
595
|
-
}
|
|
596
|
-
if (groundColor) {
|
|
597
|
-
if (groundColor.length > 0) {
|
|
598
|
-
const groundGeometry = new SphereGeometry(radius, 32, 16, 0, 2 * Math.PI, 0.5 * Math.PI, 1.5 * Math.PI);
|
|
599
|
-
const groundMaterial = new MeshBasicMaterial({
|
|
600
|
-
fog: false,
|
|
601
|
-
side: BackSide,
|
|
602
|
-
vertexColors: true,
|
|
603
|
-
depthWrite: false,
|
|
604
|
-
depthTest: false
|
|
605
|
-
});
|
|
606
|
-
paintFaces(groundGeometry, radius, groundAngle, toColorArray(groundColor), false);
|
|
607
|
-
const ground = new Mesh(groundGeometry, groundMaterial);
|
|
608
|
-
group.add(ground);
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
group.renderOrder = -Infinity;
|
|
612
|
-
return group;
|
|
613
|
-
}
|
|
614
|
-
function buildShapeNode(node) {
|
|
615
|
-
const fields = node.fields;
|
|
616
|
-
let material = new MeshBasicMaterial({ color: 0 });
|
|
617
|
-
let geometry;
|
|
618
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
619
|
-
const field = fields[i];
|
|
620
|
-
const fieldName = field.name;
|
|
621
|
-
const fieldValues = field.values;
|
|
622
|
-
switch (fieldName) {
|
|
623
|
-
case "appearance":
|
|
624
|
-
if (fieldValues[0] !== null) {
|
|
625
|
-
material = getNode(fieldValues[0]);
|
|
626
|
-
}
|
|
627
|
-
break;
|
|
628
|
-
case "geometry":
|
|
629
|
-
if (fieldValues[0] !== null) {
|
|
630
|
-
geometry = getNode(fieldValues[0]);
|
|
631
|
-
}
|
|
632
|
-
break;
|
|
633
|
-
default:
|
|
634
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
635
|
-
break;
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
let object;
|
|
639
|
-
if (geometry && geometry.attributes.position) {
|
|
640
|
-
const type = geometry._type;
|
|
641
|
-
if (type === "points") {
|
|
642
|
-
const pointsMaterial = new PointsMaterial({ color: 16777215 });
|
|
643
|
-
if (geometry.attributes.color !== void 0) {
|
|
644
|
-
pointsMaterial.vertexColors = true;
|
|
645
|
-
} else {
|
|
646
|
-
if (material.isMeshPhongMaterial) {
|
|
647
|
-
pointsMaterial.color.copy(material.emissive);
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
object = new Points(geometry, pointsMaterial);
|
|
651
|
-
} else if (type === "line") {
|
|
652
|
-
const lineMaterial = new LineBasicMaterial({ color: 16777215 });
|
|
653
|
-
if (geometry.attributes.color !== void 0) {
|
|
654
|
-
lineMaterial.vertexColors = true;
|
|
655
|
-
} else {
|
|
656
|
-
if (material.isMeshPhongMaterial) {
|
|
657
|
-
lineMaterial.color.copy(material.emissive);
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
object = new LineSegments(geometry, lineMaterial);
|
|
661
|
-
} else {
|
|
662
|
-
if (geometry._solid !== void 0) {
|
|
663
|
-
material.side = geometry._solid ? FrontSide : DoubleSide;
|
|
664
|
-
}
|
|
665
|
-
if (geometry.attributes.color !== void 0) {
|
|
666
|
-
material.vertexColors = true;
|
|
667
|
-
}
|
|
668
|
-
object = new Mesh(geometry, material);
|
|
669
|
-
}
|
|
670
|
-
} else {
|
|
671
|
-
object = new Object3D();
|
|
672
|
-
object.visible = false;
|
|
673
|
-
}
|
|
674
|
-
return object;
|
|
675
|
-
}
|
|
676
|
-
function buildAppearanceNode(node) {
|
|
677
|
-
let material = new MeshPhongMaterial();
|
|
678
|
-
let transformData;
|
|
679
|
-
const fields = node.fields;
|
|
680
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
681
|
-
const field = fields[i];
|
|
682
|
-
const fieldName = field.name;
|
|
683
|
-
const fieldValues = field.values;
|
|
684
|
-
switch (fieldName) {
|
|
685
|
-
case "material":
|
|
686
|
-
if (fieldValues[0] !== null) {
|
|
687
|
-
const materialData = getNode(fieldValues[0]);
|
|
688
|
-
if (materialData.diffuseColor)
|
|
689
|
-
material.color.copy(materialData.diffuseColor);
|
|
690
|
-
if (materialData.emissiveColor)
|
|
691
|
-
material.emissive.copy(materialData.emissiveColor);
|
|
692
|
-
if (materialData.shininess)
|
|
693
|
-
material.shininess = materialData.shininess;
|
|
694
|
-
if (materialData.specularColor)
|
|
695
|
-
material.specular.copy(materialData.specularColor);
|
|
696
|
-
if (materialData.transparency)
|
|
697
|
-
material.opacity = 1 - materialData.transparency;
|
|
698
|
-
if (materialData.transparency > 0)
|
|
699
|
-
material.transparent = true;
|
|
700
|
-
} else {
|
|
701
|
-
material = new MeshBasicMaterial({ color: 0 });
|
|
702
|
-
}
|
|
703
|
-
break;
|
|
704
|
-
case "texture":
|
|
705
|
-
const textureNode = fieldValues[0];
|
|
706
|
-
if (textureNode !== null) {
|
|
707
|
-
if (textureNode.name === "ImageTexture" || textureNode.name === "PixelTexture") {
|
|
708
|
-
material.map = getNode(textureNode);
|
|
709
|
-
} else {
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
break;
|
|
713
|
-
case "textureTransform":
|
|
714
|
-
if (fieldValues[0] !== null) {
|
|
715
|
-
transformData = getNode(fieldValues[0]);
|
|
716
|
-
}
|
|
717
|
-
break;
|
|
718
|
-
default:
|
|
719
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
if (material.map) {
|
|
724
|
-
if (material.map.__type) {
|
|
725
|
-
switch (material.map.__type) {
|
|
726
|
-
case TEXTURE_TYPE.INTENSITY_ALPHA:
|
|
727
|
-
material.opacity = 1;
|
|
728
|
-
break;
|
|
729
|
-
case TEXTURE_TYPE.RGB:
|
|
730
|
-
material.color.set(16777215);
|
|
731
|
-
break;
|
|
732
|
-
case TEXTURE_TYPE.RGBA:
|
|
733
|
-
material.color.set(16777215);
|
|
734
|
-
material.opacity = 1;
|
|
735
|
-
break;
|
|
736
|
-
default:
|
|
737
|
-
}
|
|
738
|
-
delete material.map.__type;
|
|
739
|
-
}
|
|
740
|
-
if (transformData) {
|
|
741
|
-
material.map.center.copy(transformData.center);
|
|
742
|
-
material.map.rotation = transformData.rotation;
|
|
743
|
-
material.map.repeat.copy(transformData.scale);
|
|
744
|
-
material.map.offset.copy(transformData.translation);
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
return material;
|
|
748
|
-
}
|
|
749
|
-
function buildMaterialNode(node) {
|
|
750
|
-
const materialData = {};
|
|
751
|
-
const fields = node.fields;
|
|
752
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
753
|
-
const field = fields[i];
|
|
754
|
-
const fieldName = field.name;
|
|
755
|
-
const fieldValues = field.values;
|
|
756
|
-
switch (fieldName) {
|
|
757
|
-
case "ambientIntensity":
|
|
758
|
-
break;
|
|
759
|
-
case "diffuseColor":
|
|
760
|
-
materialData.diffuseColor = new Color(fieldValues[0], fieldValues[1], fieldValues[2]);
|
|
761
|
-
break;
|
|
762
|
-
case "emissiveColor":
|
|
763
|
-
materialData.emissiveColor = new Color(fieldValues[0], fieldValues[1], fieldValues[2]);
|
|
764
|
-
break;
|
|
765
|
-
case "shininess":
|
|
766
|
-
materialData.shininess = fieldValues[0];
|
|
767
|
-
break;
|
|
768
|
-
case "specularColor":
|
|
769
|
-
materialData.emissiveColor = new Color(fieldValues[0], fieldValues[1], fieldValues[2]);
|
|
770
|
-
break;
|
|
771
|
-
case "transparency":
|
|
772
|
-
materialData.transparency = fieldValues[0];
|
|
773
|
-
break;
|
|
774
|
-
default:
|
|
775
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
776
|
-
break;
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
return materialData;
|
|
780
|
-
}
|
|
781
|
-
function parseHexColor(hex, textureType, color) {
|
|
782
|
-
let value;
|
|
783
|
-
switch (textureType) {
|
|
784
|
-
case TEXTURE_TYPE.INTENSITY:
|
|
785
|
-
value = parseInt(hex);
|
|
786
|
-
color.r = value;
|
|
787
|
-
color.g = value;
|
|
788
|
-
color.b = value;
|
|
789
|
-
color.a = 1;
|
|
790
|
-
break;
|
|
791
|
-
case TEXTURE_TYPE.INTENSITY_ALPHA:
|
|
792
|
-
value = parseInt("0x" + hex.substring(2, 4));
|
|
793
|
-
color.r = value;
|
|
794
|
-
color.g = value;
|
|
795
|
-
color.b = value;
|
|
796
|
-
color.a = parseInt("0x" + hex.substring(4, 6));
|
|
797
|
-
break;
|
|
798
|
-
case TEXTURE_TYPE.RGB:
|
|
799
|
-
color.r = parseInt("0x" + hex.substring(2, 4));
|
|
800
|
-
color.g = parseInt("0x" + hex.substring(4, 6));
|
|
801
|
-
color.b = parseInt("0x" + hex.substring(6, 8));
|
|
802
|
-
color.a = 1;
|
|
803
|
-
break;
|
|
804
|
-
case TEXTURE_TYPE.RGBA:
|
|
805
|
-
color.r = parseInt("0x" + hex.substring(2, 4));
|
|
806
|
-
color.g = parseInt("0x" + hex.substring(4, 6));
|
|
807
|
-
color.b = parseInt("0x" + hex.substring(6, 8));
|
|
808
|
-
color.a = parseInt("0x" + hex.substring(8, 10));
|
|
809
|
-
break;
|
|
810
|
-
default:
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
function getTextureType(num_components) {
|
|
814
|
-
let type;
|
|
815
|
-
switch (num_components) {
|
|
816
|
-
case 1:
|
|
817
|
-
type = TEXTURE_TYPE.INTENSITY;
|
|
818
|
-
break;
|
|
819
|
-
case 2:
|
|
820
|
-
type = TEXTURE_TYPE.INTENSITY_ALPHA;
|
|
821
|
-
break;
|
|
822
|
-
case 3:
|
|
823
|
-
type = TEXTURE_TYPE.RGB;
|
|
824
|
-
break;
|
|
825
|
-
case 4:
|
|
826
|
-
type = TEXTURE_TYPE.RGBA;
|
|
827
|
-
break;
|
|
828
|
-
default:
|
|
829
|
-
}
|
|
830
|
-
return type;
|
|
831
|
-
}
|
|
832
|
-
function buildPixelTextureNode(node) {
|
|
833
|
-
let texture;
|
|
834
|
-
let wrapS = RepeatWrapping;
|
|
835
|
-
let wrapT = RepeatWrapping;
|
|
836
|
-
const fields = node.fields;
|
|
837
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
838
|
-
const field = fields[i];
|
|
839
|
-
const fieldName = field.name;
|
|
840
|
-
const fieldValues = field.values;
|
|
841
|
-
switch (fieldName) {
|
|
842
|
-
case "image":
|
|
843
|
-
const width = fieldValues[0];
|
|
844
|
-
const height = fieldValues[1];
|
|
845
|
-
const num_components = fieldValues[2];
|
|
846
|
-
const textureType = getTextureType(num_components);
|
|
847
|
-
const data2 = new Uint8Array(4 * width * height);
|
|
848
|
-
const color = { r: 0, g: 0, b: 0, a: 0 };
|
|
849
|
-
for (let j = 3, k = 0, jl = fieldValues.length; j < jl; j++, k++) {
|
|
850
|
-
parseHexColor(fieldValues[j], textureType, color);
|
|
851
|
-
const stride = k * 4;
|
|
852
|
-
data2[stride + 0] = color.r;
|
|
853
|
-
data2[stride + 1] = color.g;
|
|
854
|
-
data2[stride + 2] = color.b;
|
|
855
|
-
data2[stride + 3] = color.a;
|
|
856
|
-
}
|
|
857
|
-
texture = new DataTexture(data2, width, height);
|
|
858
|
-
texture.needsUpdate = true;
|
|
859
|
-
texture.__type = textureType;
|
|
860
|
-
break;
|
|
861
|
-
case "repeatS":
|
|
862
|
-
if (fieldValues[0] === false)
|
|
863
|
-
wrapS = ClampToEdgeWrapping;
|
|
864
|
-
break;
|
|
865
|
-
case "repeatT":
|
|
866
|
-
if (fieldValues[0] === false)
|
|
867
|
-
wrapT = ClampToEdgeWrapping;
|
|
868
|
-
break;
|
|
869
|
-
default:
|
|
870
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
871
|
-
break;
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
if (texture) {
|
|
875
|
-
texture.wrapS = wrapS;
|
|
876
|
-
texture.wrapT = wrapT;
|
|
877
|
-
}
|
|
878
|
-
return texture;
|
|
879
|
-
}
|
|
880
|
-
function buildImageTextureNode(node) {
|
|
881
|
-
let texture;
|
|
882
|
-
let wrapS = RepeatWrapping;
|
|
883
|
-
let wrapT = RepeatWrapping;
|
|
884
|
-
const fields = node.fields;
|
|
885
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
886
|
-
const field = fields[i];
|
|
887
|
-
const fieldName = field.name;
|
|
888
|
-
const fieldValues = field.values;
|
|
889
|
-
switch (fieldName) {
|
|
890
|
-
case "url":
|
|
891
|
-
const url = fieldValues[0];
|
|
892
|
-
if (url)
|
|
893
|
-
texture = textureLoader.load(url);
|
|
894
|
-
break;
|
|
895
|
-
case "repeatS":
|
|
896
|
-
if (fieldValues[0] === false)
|
|
897
|
-
wrapS = ClampToEdgeWrapping;
|
|
898
|
-
break;
|
|
899
|
-
case "repeatT":
|
|
900
|
-
if (fieldValues[0] === false)
|
|
901
|
-
wrapT = ClampToEdgeWrapping;
|
|
902
|
-
break;
|
|
903
|
-
default:
|
|
904
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
905
|
-
break;
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
if (texture) {
|
|
909
|
-
texture.wrapS = wrapS;
|
|
910
|
-
texture.wrapT = wrapT;
|
|
911
|
-
}
|
|
912
|
-
return texture;
|
|
913
|
-
}
|
|
914
|
-
function buildTextureTransformNode(node) {
|
|
915
|
-
const transformData = {
|
|
916
|
-
center: new Vector2(),
|
|
917
|
-
rotation: new Vector2(),
|
|
918
|
-
scale: new Vector2(),
|
|
919
|
-
translation: new Vector2()
|
|
920
|
-
};
|
|
921
|
-
const fields = node.fields;
|
|
922
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
923
|
-
const field = fields[i];
|
|
924
|
-
const fieldName = field.name;
|
|
925
|
-
const fieldValues = field.values;
|
|
926
|
-
switch (fieldName) {
|
|
927
|
-
case "center":
|
|
928
|
-
transformData.center.set(fieldValues[0], fieldValues[1]);
|
|
929
|
-
break;
|
|
930
|
-
case "rotation":
|
|
931
|
-
transformData.rotation = fieldValues[0];
|
|
932
|
-
break;
|
|
933
|
-
case "scale":
|
|
934
|
-
transformData.scale.set(fieldValues[0], fieldValues[1]);
|
|
935
|
-
break;
|
|
936
|
-
case "translation":
|
|
937
|
-
transformData.translation.set(fieldValues[0], fieldValues[1]);
|
|
938
|
-
break;
|
|
939
|
-
default:
|
|
940
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
941
|
-
break;
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
return transformData;
|
|
945
|
-
}
|
|
946
|
-
function buildGeometricNode(node) {
|
|
947
|
-
return node.fields[0].values;
|
|
948
|
-
}
|
|
949
|
-
function buildWorldInfoNode(node) {
|
|
950
|
-
const worldInfo = {};
|
|
951
|
-
const fields = node.fields;
|
|
952
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
953
|
-
const field = fields[i];
|
|
954
|
-
const fieldName = field.name;
|
|
955
|
-
const fieldValues = field.values;
|
|
956
|
-
switch (fieldName) {
|
|
957
|
-
case "title":
|
|
958
|
-
worldInfo.title = fieldValues[0];
|
|
959
|
-
break;
|
|
960
|
-
case "info":
|
|
961
|
-
worldInfo.info = fieldValues;
|
|
962
|
-
break;
|
|
963
|
-
default:
|
|
964
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
965
|
-
break;
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
|
-
return worldInfo;
|
|
969
|
-
}
|
|
970
|
-
function buildIndexedFaceSetNode(node) {
|
|
971
|
-
let color, coord, normal, texCoord;
|
|
972
|
-
let ccw = true, solid = true, creaseAngle = 0;
|
|
973
|
-
let colorIndex, coordIndex, normalIndex, texCoordIndex;
|
|
974
|
-
let colorPerVertex = true, normalPerVertex = true;
|
|
975
|
-
const fields = node.fields;
|
|
976
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
977
|
-
const field = fields[i];
|
|
978
|
-
const fieldName = field.name;
|
|
979
|
-
const fieldValues = field.values;
|
|
980
|
-
switch (fieldName) {
|
|
981
|
-
case "color":
|
|
982
|
-
const colorNode = fieldValues[0];
|
|
983
|
-
if (colorNode !== null) {
|
|
984
|
-
color = getNode(colorNode);
|
|
985
|
-
}
|
|
986
|
-
break;
|
|
987
|
-
case "coord":
|
|
988
|
-
const coordNode = fieldValues[0];
|
|
989
|
-
if (coordNode !== null) {
|
|
990
|
-
coord = getNode(coordNode);
|
|
991
|
-
}
|
|
992
|
-
break;
|
|
993
|
-
case "normal":
|
|
994
|
-
const normalNode = fieldValues[0];
|
|
995
|
-
if (normalNode !== null) {
|
|
996
|
-
normal = getNode(normalNode);
|
|
997
|
-
}
|
|
998
|
-
break;
|
|
999
|
-
case "texCoord":
|
|
1000
|
-
const texCoordNode = fieldValues[0];
|
|
1001
|
-
if (texCoordNode !== null) {
|
|
1002
|
-
texCoord = getNode(texCoordNode);
|
|
1003
|
-
}
|
|
1004
|
-
break;
|
|
1005
|
-
case "ccw":
|
|
1006
|
-
ccw = fieldValues[0];
|
|
1007
|
-
break;
|
|
1008
|
-
case "colorIndex":
|
|
1009
|
-
colorIndex = fieldValues;
|
|
1010
|
-
break;
|
|
1011
|
-
case "colorPerVertex":
|
|
1012
|
-
colorPerVertex = fieldValues[0];
|
|
1013
|
-
break;
|
|
1014
|
-
case "convex":
|
|
1015
|
-
break;
|
|
1016
|
-
case "coordIndex":
|
|
1017
|
-
coordIndex = fieldValues;
|
|
1018
|
-
break;
|
|
1019
|
-
case "creaseAngle":
|
|
1020
|
-
creaseAngle = fieldValues[0];
|
|
1021
|
-
break;
|
|
1022
|
-
case "normalIndex":
|
|
1023
|
-
normalIndex = fieldValues;
|
|
1024
|
-
break;
|
|
1025
|
-
case "normalPerVertex":
|
|
1026
|
-
normalPerVertex = fieldValues[0];
|
|
1027
|
-
break;
|
|
1028
|
-
case "solid":
|
|
1029
|
-
solid = fieldValues[0];
|
|
1030
|
-
break;
|
|
1031
|
-
case "texCoordIndex":
|
|
1032
|
-
texCoordIndex = fieldValues;
|
|
1033
|
-
break;
|
|
1034
|
-
default:
|
|
1035
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1036
|
-
break;
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
if (coordIndex === void 0) {
|
|
1040
|
-
console.warn("THREE.VRMLLoader: Missing coordIndex.");
|
|
1041
|
-
return new BufferGeometry();
|
|
1042
|
-
}
|
|
1043
|
-
const triangulatedCoordIndex = triangulateFaceIndex(coordIndex, ccw);
|
|
1044
|
-
let colorAttribute;
|
|
1045
|
-
let normalAttribute;
|
|
1046
|
-
let uvAttribute;
|
|
1047
|
-
if (color) {
|
|
1048
|
-
if (colorPerVertex === true) {
|
|
1049
|
-
if (colorIndex && colorIndex.length > 0) {
|
|
1050
|
-
const triangulatedColorIndex = triangulateFaceIndex(colorIndex, ccw);
|
|
1051
|
-
colorAttribute = computeAttributeFromIndexedData(triangulatedCoordIndex, triangulatedColorIndex, color, 3);
|
|
1052
|
-
} else {
|
|
1053
|
-
colorAttribute = toNonIndexedAttribute(triangulatedCoordIndex, new Float32BufferAttribute(color, 3));
|
|
1054
|
-
}
|
|
1055
|
-
} else {
|
|
1056
|
-
if (colorIndex && colorIndex.length > 0) {
|
|
1057
|
-
const flattenFaceColors = flattenData(color, colorIndex);
|
|
1058
|
-
const triangulatedFaceColors = triangulateFaceData(flattenFaceColors, coordIndex);
|
|
1059
|
-
colorAttribute = computeAttributeFromFaceData(triangulatedCoordIndex, triangulatedFaceColors);
|
|
1060
|
-
} else {
|
|
1061
|
-
const triangulatedFaceColors = triangulateFaceData(color, coordIndex);
|
|
1062
|
-
colorAttribute = computeAttributeFromFaceData(triangulatedCoordIndex, triangulatedFaceColors);
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
if (normal) {
|
|
1067
|
-
if (normalPerVertex === true) {
|
|
1068
|
-
if (normalIndex && normalIndex.length > 0) {
|
|
1069
|
-
const triangulatedNormalIndex = triangulateFaceIndex(normalIndex, ccw);
|
|
1070
|
-
normalAttribute = computeAttributeFromIndexedData(
|
|
1071
|
-
triangulatedCoordIndex,
|
|
1072
|
-
triangulatedNormalIndex,
|
|
1073
|
-
normal,
|
|
1074
|
-
3
|
|
1075
|
-
);
|
|
1076
|
-
} else {
|
|
1077
|
-
normalAttribute = toNonIndexedAttribute(triangulatedCoordIndex, new Float32BufferAttribute(normal, 3));
|
|
1078
|
-
}
|
|
1079
|
-
} else {
|
|
1080
|
-
if (normalIndex && normalIndex.length > 0) {
|
|
1081
|
-
const flattenFaceNormals = flattenData(normal, normalIndex);
|
|
1082
|
-
const triangulatedFaceNormals = triangulateFaceData(flattenFaceNormals, coordIndex);
|
|
1083
|
-
normalAttribute = computeAttributeFromFaceData(triangulatedCoordIndex, triangulatedFaceNormals);
|
|
1084
|
-
} else {
|
|
1085
|
-
const triangulatedFaceNormals = triangulateFaceData(normal, coordIndex);
|
|
1086
|
-
normalAttribute = computeAttributeFromFaceData(triangulatedCoordIndex, triangulatedFaceNormals);
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
|
-
} else {
|
|
1090
|
-
normalAttribute = computeNormalAttribute(triangulatedCoordIndex, coord, creaseAngle);
|
|
1091
|
-
}
|
|
1092
|
-
if (texCoord) {
|
|
1093
|
-
if (texCoordIndex && texCoordIndex.length > 0) {
|
|
1094
|
-
const triangulatedTexCoordIndex = triangulateFaceIndex(texCoordIndex, ccw);
|
|
1095
|
-
uvAttribute = computeAttributeFromIndexedData(triangulatedCoordIndex, triangulatedTexCoordIndex, texCoord, 2);
|
|
1096
|
-
} else {
|
|
1097
|
-
uvAttribute = toNonIndexedAttribute(triangulatedCoordIndex, new Float32BufferAttribute(texCoord, 2));
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
const geometry = new BufferGeometry();
|
|
1101
|
-
const positionAttribute = toNonIndexedAttribute(triangulatedCoordIndex, new Float32BufferAttribute(coord, 3));
|
|
1102
|
-
geometry.setAttribute("position", positionAttribute);
|
|
1103
|
-
geometry.setAttribute("normal", normalAttribute);
|
|
1104
|
-
if (colorAttribute)
|
|
1105
|
-
geometry.setAttribute("color", colorAttribute);
|
|
1106
|
-
if (uvAttribute)
|
|
1107
|
-
geometry.setAttribute("uv", uvAttribute);
|
|
1108
|
-
geometry._solid = solid;
|
|
1109
|
-
geometry._type = "mesh";
|
|
1110
|
-
return geometry;
|
|
1111
|
-
}
|
|
1112
|
-
function buildIndexedLineSetNode(node) {
|
|
1113
|
-
let color, coord;
|
|
1114
|
-
let colorIndex, coordIndex;
|
|
1115
|
-
let colorPerVertex = true;
|
|
1116
|
-
const fields = node.fields;
|
|
1117
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1118
|
-
const field = fields[i];
|
|
1119
|
-
const fieldName = field.name;
|
|
1120
|
-
const fieldValues = field.values;
|
|
1121
|
-
switch (fieldName) {
|
|
1122
|
-
case "color":
|
|
1123
|
-
const colorNode = fieldValues[0];
|
|
1124
|
-
if (colorNode !== null) {
|
|
1125
|
-
color = getNode(colorNode);
|
|
1126
|
-
}
|
|
1127
|
-
break;
|
|
1128
|
-
case "coord":
|
|
1129
|
-
const coordNode = fieldValues[0];
|
|
1130
|
-
if (coordNode !== null) {
|
|
1131
|
-
coord = getNode(coordNode);
|
|
1132
|
-
}
|
|
1133
|
-
break;
|
|
1134
|
-
case "colorIndex":
|
|
1135
|
-
colorIndex = fieldValues;
|
|
1136
|
-
break;
|
|
1137
|
-
case "colorPerVertex":
|
|
1138
|
-
colorPerVertex = fieldValues[0];
|
|
1139
|
-
break;
|
|
1140
|
-
case "coordIndex":
|
|
1141
|
-
coordIndex = fieldValues;
|
|
1142
|
-
break;
|
|
1143
|
-
default:
|
|
1144
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1145
|
-
break;
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
let colorAttribute;
|
|
1149
|
-
const expandedLineIndex = expandLineIndex(coordIndex);
|
|
1150
|
-
if (color) {
|
|
1151
|
-
if (colorPerVertex === true) {
|
|
1152
|
-
if (colorIndex.length > 0) {
|
|
1153
|
-
const expandedColorIndex = expandLineIndex(colorIndex);
|
|
1154
|
-
colorAttribute = computeAttributeFromIndexedData(expandedLineIndex, expandedColorIndex, color, 3);
|
|
1155
|
-
} else {
|
|
1156
|
-
colorAttribute = toNonIndexedAttribute(expandedLineIndex, new Float32BufferAttribute(color, 3));
|
|
1157
|
-
}
|
|
1158
|
-
} else {
|
|
1159
|
-
if (colorIndex.length > 0) {
|
|
1160
|
-
const flattenLineColors = flattenData(color, colorIndex);
|
|
1161
|
-
const expandedLineColors = expandLineData(flattenLineColors, coordIndex);
|
|
1162
|
-
colorAttribute = computeAttributeFromLineData(expandedLineIndex, expandedLineColors);
|
|
1163
|
-
} else {
|
|
1164
|
-
const expandedLineColors = expandLineData(color, coordIndex);
|
|
1165
|
-
colorAttribute = computeAttributeFromLineData(expandedLineIndex, expandedLineColors);
|
|
1166
|
-
}
|
|
1167
|
-
}
|
|
1168
|
-
}
|
|
1169
|
-
const geometry = new BufferGeometry();
|
|
1170
|
-
const positionAttribute = toNonIndexedAttribute(expandedLineIndex, new Float32BufferAttribute(coord, 3));
|
|
1171
|
-
geometry.setAttribute("position", positionAttribute);
|
|
1172
|
-
if (colorAttribute)
|
|
1173
|
-
geometry.setAttribute("color", colorAttribute);
|
|
1174
|
-
geometry._type = "line";
|
|
1175
|
-
return geometry;
|
|
1176
|
-
}
|
|
1177
|
-
function buildPointSetNode(node) {
|
|
1178
|
-
let color, coord;
|
|
1179
|
-
const fields = node.fields;
|
|
1180
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1181
|
-
const field = fields[i];
|
|
1182
|
-
const fieldName = field.name;
|
|
1183
|
-
const fieldValues = field.values;
|
|
1184
|
-
switch (fieldName) {
|
|
1185
|
-
case "color":
|
|
1186
|
-
const colorNode = fieldValues[0];
|
|
1187
|
-
if (colorNode !== null) {
|
|
1188
|
-
color = getNode(colorNode);
|
|
1189
|
-
}
|
|
1190
|
-
break;
|
|
1191
|
-
case "coord":
|
|
1192
|
-
const coordNode = fieldValues[0];
|
|
1193
|
-
if (coordNode !== null) {
|
|
1194
|
-
coord = getNode(coordNode);
|
|
1195
|
-
}
|
|
1196
|
-
break;
|
|
1197
|
-
default:
|
|
1198
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1199
|
-
break;
|
|
1200
|
-
}
|
|
1201
|
-
}
|
|
1202
|
-
const geometry = new BufferGeometry();
|
|
1203
|
-
geometry.setAttribute("position", new Float32BufferAttribute(coord, 3));
|
|
1204
|
-
if (color)
|
|
1205
|
-
geometry.setAttribute("color", new Float32BufferAttribute(color, 3));
|
|
1206
|
-
geometry._type = "points";
|
|
1207
|
-
return geometry;
|
|
1208
|
-
}
|
|
1209
|
-
function buildBoxNode(node) {
|
|
1210
|
-
const size = new Vector3(2, 2, 2);
|
|
1211
|
-
const fields = node.fields;
|
|
1212
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1213
|
-
const field = fields[i];
|
|
1214
|
-
const fieldName = field.name;
|
|
1215
|
-
const fieldValues = field.values;
|
|
1216
|
-
switch (fieldName) {
|
|
1217
|
-
case "size":
|
|
1218
|
-
size.x = fieldValues[0];
|
|
1219
|
-
size.y = fieldValues[1];
|
|
1220
|
-
size.z = fieldValues[2];
|
|
1221
|
-
break;
|
|
1222
|
-
default:
|
|
1223
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1224
|
-
break;
|
|
1225
|
-
}
|
|
1226
|
-
}
|
|
1227
|
-
const geometry = new BoxGeometry(size.x, size.y, size.z);
|
|
1228
|
-
return geometry;
|
|
1229
|
-
}
|
|
1230
|
-
function buildConeNode(node) {
|
|
1231
|
-
let radius = 1, height = 2, openEnded = false;
|
|
1232
|
-
const fields = node.fields;
|
|
1233
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1234
|
-
const field = fields[i];
|
|
1235
|
-
const fieldName = field.name;
|
|
1236
|
-
const fieldValues = field.values;
|
|
1237
|
-
switch (fieldName) {
|
|
1238
|
-
case "bottom":
|
|
1239
|
-
openEnded = !fieldValues[0];
|
|
1240
|
-
break;
|
|
1241
|
-
case "bottomRadius":
|
|
1242
|
-
radius = fieldValues[0];
|
|
1243
|
-
break;
|
|
1244
|
-
case "height":
|
|
1245
|
-
height = fieldValues[0];
|
|
1246
|
-
break;
|
|
1247
|
-
case "side":
|
|
1248
|
-
break;
|
|
1249
|
-
default:
|
|
1250
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1251
|
-
break;
|
|
1252
|
-
}
|
|
1253
|
-
}
|
|
1254
|
-
const geometry = new ConeGeometry(radius, height, 16, 1, openEnded);
|
|
1255
|
-
return geometry;
|
|
1256
|
-
}
|
|
1257
|
-
function buildCylinderNode(node) {
|
|
1258
|
-
let radius = 1, height = 2;
|
|
1259
|
-
const fields = node.fields;
|
|
1260
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1261
|
-
const field = fields[i];
|
|
1262
|
-
const fieldName = field.name;
|
|
1263
|
-
const fieldValues = field.values;
|
|
1264
|
-
switch (fieldName) {
|
|
1265
|
-
case "bottom":
|
|
1266
|
-
break;
|
|
1267
|
-
case "radius":
|
|
1268
|
-
radius = fieldValues[0];
|
|
1269
|
-
break;
|
|
1270
|
-
case "height":
|
|
1271
|
-
height = fieldValues[0];
|
|
1272
|
-
break;
|
|
1273
|
-
case "side":
|
|
1274
|
-
break;
|
|
1275
|
-
case "top":
|
|
1276
|
-
break;
|
|
1277
|
-
default:
|
|
1278
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1279
|
-
break;
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
|
-
const geometry = new CylinderGeometry(radius, radius, height, 16, 1);
|
|
1283
|
-
return geometry;
|
|
1284
|
-
}
|
|
1285
|
-
function buildSphereNode(node) {
|
|
1286
|
-
let radius = 1;
|
|
1287
|
-
const fields = node.fields;
|
|
1288
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1289
|
-
const field = fields[i];
|
|
1290
|
-
const fieldName = field.name;
|
|
1291
|
-
const fieldValues = field.values;
|
|
1292
|
-
switch (fieldName) {
|
|
1293
|
-
case "radius":
|
|
1294
|
-
radius = fieldValues[0];
|
|
1295
|
-
break;
|
|
1296
|
-
default:
|
|
1297
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1298
|
-
break;
|
|
1299
|
-
}
|
|
1300
|
-
}
|
|
1301
|
-
const geometry = new SphereGeometry(radius, 16, 16);
|
|
1302
|
-
return geometry;
|
|
1303
|
-
}
|
|
1304
|
-
function buildElevationGridNode(node) {
|
|
1305
|
-
let color;
|
|
1306
|
-
let normal;
|
|
1307
|
-
let texCoord;
|
|
1308
|
-
let height;
|
|
1309
|
-
let colorPerVertex = true;
|
|
1310
|
-
let normalPerVertex = true;
|
|
1311
|
-
let solid = true;
|
|
1312
|
-
let ccw = true;
|
|
1313
|
-
let creaseAngle = 0;
|
|
1314
|
-
let xDimension = 2;
|
|
1315
|
-
let zDimension = 2;
|
|
1316
|
-
let xSpacing = 1;
|
|
1317
|
-
let zSpacing = 1;
|
|
1318
|
-
const fields = node.fields;
|
|
1319
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1320
|
-
const field = fields[i];
|
|
1321
|
-
const fieldName = field.name;
|
|
1322
|
-
const fieldValues = field.values;
|
|
1323
|
-
switch (fieldName) {
|
|
1324
|
-
case "color":
|
|
1325
|
-
const colorNode = fieldValues[0];
|
|
1326
|
-
if (colorNode !== null) {
|
|
1327
|
-
color = getNode(colorNode);
|
|
1328
|
-
}
|
|
1329
|
-
break;
|
|
1330
|
-
case "normal":
|
|
1331
|
-
const normalNode = fieldValues[0];
|
|
1332
|
-
if (normalNode !== null) {
|
|
1333
|
-
normal = getNode(normalNode);
|
|
1334
|
-
}
|
|
1335
|
-
break;
|
|
1336
|
-
case "texCoord":
|
|
1337
|
-
const texCoordNode = fieldValues[0];
|
|
1338
|
-
if (texCoordNode !== null) {
|
|
1339
|
-
texCoord = getNode(texCoordNode);
|
|
1340
|
-
}
|
|
1341
|
-
break;
|
|
1342
|
-
case "height":
|
|
1343
|
-
height = fieldValues;
|
|
1344
|
-
break;
|
|
1345
|
-
case "ccw":
|
|
1346
|
-
ccw = fieldValues[0];
|
|
1347
|
-
break;
|
|
1348
|
-
case "colorPerVertex":
|
|
1349
|
-
colorPerVertex = fieldValues[0];
|
|
1350
|
-
break;
|
|
1351
|
-
case "creaseAngle":
|
|
1352
|
-
creaseAngle = fieldValues[0];
|
|
1353
|
-
break;
|
|
1354
|
-
case "normalPerVertex":
|
|
1355
|
-
normalPerVertex = fieldValues[0];
|
|
1356
|
-
break;
|
|
1357
|
-
case "solid":
|
|
1358
|
-
solid = fieldValues[0];
|
|
1359
|
-
break;
|
|
1360
|
-
case "xDimension":
|
|
1361
|
-
xDimension = fieldValues[0];
|
|
1362
|
-
break;
|
|
1363
|
-
case "xSpacing":
|
|
1364
|
-
xSpacing = fieldValues[0];
|
|
1365
|
-
break;
|
|
1366
|
-
case "zDimension":
|
|
1367
|
-
zDimension = fieldValues[0];
|
|
1368
|
-
break;
|
|
1369
|
-
case "zSpacing":
|
|
1370
|
-
zSpacing = fieldValues[0];
|
|
1371
|
-
break;
|
|
1372
|
-
default:
|
|
1373
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1374
|
-
break;
|
|
1375
|
-
}
|
|
1376
|
-
}
|
|
1377
|
-
const vertices = [];
|
|
1378
|
-
const normals = [];
|
|
1379
|
-
const colors = [];
|
|
1380
|
-
const uvs = [];
|
|
1381
|
-
for (let i = 0; i < zDimension; i++) {
|
|
1382
|
-
for (let j = 0; j < xDimension; j++) {
|
|
1383
|
-
const index = i * xDimension + j;
|
|
1384
|
-
const x = xSpacing * i;
|
|
1385
|
-
const y = height[index];
|
|
1386
|
-
const z = zSpacing * j;
|
|
1387
|
-
vertices.push(x, y, z);
|
|
1388
|
-
if (color && colorPerVertex === true) {
|
|
1389
|
-
const r = color[index * 3 + 0];
|
|
1390
|
-
const g = color[index * 3 + 1];
|
|
1391
|
-
const b = color[index * 3 + 2];
|
|
1392
|
-
colors.push(r, g, b);
|
|
1393
|
-
}
|
|
1394
|
-
if (normal && normalPerVertex === true) {
|
|
1395
|
-
const xn = normal[index * 3 + 0];
|
|
1396
|
-
const yn = normal[index * 3 + 1];
|
|
1397
|
-
const zn = normal[index * 3 + 2];
|
|
1398
|
-
normals.push(xn, yn, zn);
|
|
1399
|
-
}
|
|
1400
|
-
if (texCoord) {
|
|
1401
|
-
const s = texCoord[index * 2 + 0];
|
|
1402
|
-
const t = texCoord[index * 2 + 1];
|
|
1403
|
-
uvs.push(s, t);
|
|
1404
|
-
} else {
|
|
1405
|
-
uvs.push(i / (xDimension - 1), j / (zDimension - 1));
|
|
1406
|
-
}
|
|
1407
|
-
}
|
|
1408
|
-
}
|
|
1409
|
-
const indices = [];
|
|
1410
|
-
for (let i = 0; i < xDimension - 1; i++) {
|
|
1411
|
-
for (let j = 0; j < zDimension - 1; j++) {
|
|
1412
|
-
const a = i + j * xDimension;
|
|
1413
|
-
const b = i + (j + 1) * xDimension;
|
|
1414
|
-
const c = i + 1 + (j + 1) * xDimension;
|
|
1415
|
-
const d = i + 1 + j * xDimension;
|
|
1416
|
-
if (ccw === true) {
|
|
1417
|
-
indices.push(a, c, b);
|
|
1418
|
-
indices.push(c, a, d);
|
|
1419
|
-
} else {
|
|
1420
|
-
indices.push(a, b, c);
|
|
1421
|
-
indices.push(c, d, a);
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
|
-
}
|
|
1425
|
-
const positionAttribute = toNonIndexedAttribute(indices, new Float32BufferAttribute(vertices, 3));
|
|
1426
|
-
const uvAttribute = toNonIndexedAttribute(indices, new Float32BufferAttribute(uvs, 2));
|
|
1427
|
-
let colorAttribute;
|
|
1428
|
-
let normalAttribute;
|
|
1429
|
-
if (color) {
|
|
1430
|
-
if (colorPerVertex === false) {
|
|
1431
|
-
for (let i = 0; i < xDimension - 1; i++) {
|
|
1432
|
-
for (let j = 0; j < zDimension - 1; j++) {
|
|
1433
|
-
const index = i + j * (xDimension - 1);
|
|
1434
|
-
const r = color[index * 3 + 0];
|
|
1435
|
-
const g = color[index * 3 + 1];
|
|
1436
|
-
const b = color[index * 3 + 2];
|
|
1437
|
-
colors.push(r, g, b);
|
|
1438
|
-
colors.push(r, g, b);
|
|
1439
|
-
colors.push(r, g, b);
|
|
1440
|
-
colors.push(r, g, b);
|
|
1441
|
-
colors.push(r, g, b);
|
|
1442
|
-
colors.push(r, g, b);
|
|
1443
|
-
}
|
|
1444
|
-
}
|
|
1445
|
-
colorAttribute = new Float32BufferAttribute(colors, 3);
|
|
1446
|
-
} else {
|
|
1447
|
-
colorAttribute = toNonIndexedAttribute(indices, new Float32BufferAttribute(colors, 3));
|
|
1448
|
-
}
|
|
1449
|
-
}
|
|
1450
|
-
if (normal) {
|
|
1451
|
-
if (normalPerVertex === false) {
|
|
1452
|
-
for (let i = 0; i < xDimension - 1; i++) {
|
|
1453
|
-
for (let j = 0; j < zDimension - 1; j++) {
|
|
1454
|
-
const index = i + j * (xDimension - 1);
|
|
1455
|
-
const xn = normal[index * 3 + 0];
|
|
1456
|
-
const yn = normal[index * 3 + 1];
|
|
1457
|
-
const zn = normal[index * 3 + 2];
|
|
1458
|
-
normals.push(xn, yn, zn);
|
|
1459
|
-
normals.push(xn, yn, zn);
|
|
1460
|
-
normals.push(xn, yn, zn);
|
|
1461
|
-
normals.push(xn, yn, zn);
|
|
1462
|
-
normals.push(xn, yn, zn);
|
|
1463
|
-
normals.push(xn, yn, zn);
|
|
1464
|
-
}
|
|
1465
|
-
}
|
|
1466
|
-
normalAttribute = new Float32BufferAttribute(normals, 3);
|
|
1467
|
-
} else {
|
|
1468
|
-
normalAttribute = toNonIndexedAttribute(indices, new Float32BufferAttribute(normals, 3));
|
|
1469
|
-
}
|
|
1470
|
-
} else {
|
|
1471
|
-
normalAttribute = computeNormalAttribute(indices, vertices, creaseAngle);
|
|
1472
|
-
}
|
|
1473
|
-
const geometry = new BufferGeometry();
|
|
1474
|
-
geometry.setAttribute("position", positionAttribute);
|
|
1475
|
-
geometry.setAttribute("normal", normalAttribute);
|
|
1476
|
-
geometry.setAttribute("uv", uvAttribute);
|
|
1477
|
-
if (colorAttribute)
|
|
1478
|
-
geometry.setAttribute("color", colorAttribute);
|
|
1479
|
-
geometry._solid = solid;
|
|
1480
|
-
geometry._type = "mesh";
|
|
1481
|
-
return geometry;
|
|
1482
|
-
}
|
|
1483
|
-
function buildExtrusionNode(node) {
|
|
1484
|
-
let crossSection = [1, 1, 1, -1, -1, -1, -1, 1, 1, 1];
|
|
1485
|
-
let spine = [0, 0, 0, 0, 1, 0];
|
|
1486
|
-
let scale;
|
|
1487
|
-
let orientation;
|
|
1488
|
-
let beginCap = true;
|
|
1489
|
-
let ccw = true;
|
|
1490
|
-
let creaseAngle = 0;
|
|
1491
|
-
let endCap = true;
|
|
1492
|
-
let solid = true;
|
|
1493
|
-
const fields = node.fields;
|
|
1494
|
-
for (let i = 0, l = fields.length; i < l; i++) {
|
|
1495
|
-
const field = fields[i];
|
|
1496
|
-
const fieldName = field.name;
|
|
1497
|
-
const fieldValues = field.values;
|
|
1498
|
-
switch (fieldName) {
|
|
1499
|
-
case "beginCap":
|
|
1500
|
-
beginCap = fieldValues[0];
|
|
1501
|
-
break;
|
|
1502
|
-
case "ccw":
|
|
1503
|
-
ccw = fieldValues[0];
|
|
1504
|
-
break;
|
|
1505
|
-
case "convex":
|
|
1506
|
-
break;
|
|
1507
|
-
case "creaseAngle":
|
|
1508
|
-
creaseAngle = fieldValues[0];
|
|
1509
|
-
break;
|
|
1510
|
-
case "crossSection":
|
|
1511
|
-
crossSection = fieldValues;
|
|
1512
|
-
break;
|
|
1513
|
-
case "endCap":
|
|
1514
|
-
endCap = fieldValues[0];
|
|
1515
|
-
break;
|
|
1516
|
-
case "orientation":
|
|
1517
|
-
orientation = fieldValues;
|
|
1518
|
-
break;
|
|
1519
|
-
case "scale":
|
|
1520
|
-
scale = fieldValues;
|
|
1521
|
-
break;
|
|
1522
|
-
case "solid":
|
|
1523
|
-
solid = fieldValues[0];
|
|
1524
|
-
break;
|
|
1525
|
-
case "spine":
|
|
1526
|
-
spine = fieldValues;
|
|
1527
|
-
break;
|
|
1528
|
-
default:
|
|
1529
|
-
console.warn("THREE.VRMLLoader: Unknown field:", fieldName);
|
|
1530
|
-
break;
|
|
1531
|
-
}
|
|
1532
|
-
}
|
|
1533
|
-
const crossSectionClosed = crossSection[0] === crossSection[crossSection.length - 2] && crossSection[1] === crossSection[crossSection.length - 1];
|
|
1534
|
-
const vertices = [];
|
|
1535
|
-
const spineVector = new Vector3();
|
|
1536
|
-
const scaling = new Vector3();
|
|
1537
|
-
const axis = new Vector3();
|
|
1538
|
-
const vertex = new Vector3();
|
|
1539
|
-
const quaternion = new Quaternion();
|
|
1540
|
-
for (let i = 0, j = 0, o = 0, il = spine.length; i < il; i += 3, j += 2, o += 4) {
|
|
1541
|
-
spineVector.fromArray(spine, i);
|
|
1542
|
-
scaling.x = scale ? scale[j + 0] : 1;
|
|
1543
|
-
scaling.y = 1;
|
|
1544
|
-
scaling.z = scale ? scale[j + 1] : 1;
|
|
1545
|
-
axis.x = orientation ? orientation[o + 0] : 0;
|
|
1546
|
-
axis.y = orientation ? orientation[o + 1] : 0;
|
|
1547
|
-
axis.z = orientation ? orientation[o + 2] : 1;
|
|
1548
|
-
const angle = orientation ? orientation[o + 3] : 0;
|
|
1549
|
-
for (let k = 0, kl = crossSection.length; k < kl; k += 2) {
|
|
1550
|
-
vertex.x = crossSection[k + 0];
|
|
1551
|
-
vertex.y = 0;
|
|
1552
|
-
vertex.z = crossSection[k + 1];
|
|
1553
|
-
vertex.multiply(scaling);
|
|
1554
|
-
quaternion.setFromAxisAngle(axis, angle);
|
|
1555
|
-
vertex.applyQuaternion(quaternion);
|
|
1556
|
-
vertex.add(spineVector);
|
|
1557
|
-
vertices.push(vertex.x, vertex.y, vertex.z);
|
|
1558
|
-
}
|
|
1559
|
-
}
|
|
1560
|
-
const indices = [];
|
|
1561
|
-
const spineCount = spine.length / 3;
|
|
1562
|
-
const crossSectionCount = crossSection.length / 2;
|
|
1563
|
-
for (let i = 0; i < spineCount - 1; i++) {
|
|
1564
|
-
for (let j = 0; j < crossSectionCount - 1; j++) {
|
|
1565
|
-
const a = j + i * crossSectionCount;
|
|
1566
|
-
let b = j + 1 + i * crossSectionCount;
|
|
1567
|
-
const c = j + (i + 1) * crossSectionCount;
|
|
1568
|
-
let d = j + 1 + (i + 1) * crossSectionCount;
|
|
1569
|
-
if (j === crossSectionCount - 2 && crossSectionClosed === true) {
|
|
1570
|
-
b = i * crossSectionCount;
|
|
1571
|
-
d = (i + 1) * crossSectionCount;
|
|
1572
|
-
}
|
|
1573
|
-
if (ccw === true) {
|
|
1574
|
-
indices.push(a, b, c);
|
|
1575
|
-
indices.push(c, b, d);
|
|
1576
|
-
} else {
|
|
1577
|
-
indices.push(a, c, b);
|
|
1578
|
-
indices.push(c, d, b);
|
|
1579
|
-
}
|
|
1580
|
-
}
|
|
1581
|
-
}
|
|
1582
|
-
if (beginCap === true || endCap === true) {
|
|
1583
|
-
const contour = [];
|
|
1584
|
-
for (let i = 0, l = crossSection.length; i < l; i += 2) {
|
|
1585
|
-
contour.push(new Vector2(crossSection[i], crossSection[i + 1]));
|
|
1586
|
-
}
|
|
1587
|
-
const faces = ShapeUtils.triangulateShape(contour, []);
|
|
1588
|
-
const capIndices = [];
|
|
1589
|
-
for (let i = 0, l = faces.length; i < l; i++) {
|
|
1590
|
-
const face = faces[i];
|
|
1591
|
-
capIndices.push(face[0], face[1], face[2]);
|
|
1592
|
-
}
|
|
1593
|
-
if (beginCap === true) {
|
|
1594
|
-
for (let i = 0, l = capIndices.length; i < l; i += 3) {
|
|
1595
|
-
if (ccw === true) {
|
|
1596
|
-
indices.push(capIndices[i + 0], capIndices[i + 1], capIndices[i + 2]);
|
|
1597
|
-
} else {
|
|
1598
|
-
indices.push(capIndices[i + 0], capIndices[i + 2], capIndices[i + 1]);
|
|
1599
|
-
}
|
|
1600
|
-
}
|
|
1601
|
-
}
|
|
1602
|
-
if (endCap === true) {
|
|
1603
|
-
const indexOffset = crossSectionCount * (spineCount - 1);
|
|
1604
|
-
for (let i = 0, l = capIndices.length; i < l; i += 3) {
|
|
1605
|
-
if (ccw === true) {
|
|
1606
|
-
indices.push(
|
|
1607
|
-
indexOffset + capIndices[i + 0],
|
|
1608
|
-
indexOffset + capIndices[i + 2],
|
|
1609
|
-
indexOffset + capIndices[i + 1]
|
|
1610
|
-
);
|
|
1611
|
-
} else {
|
|
1612
|
-
indices.push(
|
|
1613
|
-
indexOffset + capIndices[i + 0],
|
|
1614
|
-
indexOffset + capIndices[i + 1],
|
|
1615
|
-
indexOffset + capIndices[i + 2]
|
|
1616
|
-
);
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
}
|
|
1620
|
-
}
|
|
1621
|
-
const positionAttribute = toNonIndexedAttribute(indices, new Float32BufferAttribute(vertices, 3));
|
|
1622
|
-
const normalAttribute = computeNormalAttribute(indices, vertices, creaseAngle);
|
|
1623
|
-
const geometry = new BufferGeometry();
|
|
1624
|
-
geometry.setAttribute("position", positionAttribute);
|
|
1625
|
-
geometry.setAttribute("normal", normalAttribute);
|
|
1626
|
-
geometry._solid = solid;
|
|
1627
|
-
geometry._type = "mesh";
|
|
1628
|
-
return geometry;
|
|
1629
|
-
}
|
|
1630
|
-
function resolveUSE(identifier) {
|
|
1631
|
-
const node = nodeMap[identifier];
|
|
1632
|
-
const build = getNode(node);
|
|
1633
|
-
return build.isObject3D || build.isMaterial ? build.clone() : build;
|
|
1634
|
-
}
|
|
1635
|
-
function parseFieldChildren(children, owner) {
|
|
1636
|
-
for (let i = 0, l = children.length; i < l; i++) {
|
|
1637
|
-
const object = getNode(children[i]);
|
|
1638
|
-
if (object instanceof Object3D)
|
|
1639
|
-
owner.add(object);
|
|
1640
|
-
}
|
|
1641
|
-
}
|
|
1642
|
-
function triangulateFaceIndex(index, ccw) {
|
|
1643
|
-
const indices = [];
|
|
1644
|
-
let start = 0;
|
|
1645
|
-
for (let i = 0, l = index.length; i < l; i++) {
|
|
1646
|
-
const i1 = index[start];
|
|
1647
|
-
const i2 = index[i + (ccw ? 1 : 2)];
|
|
1648
|
-
const i3 = index[i + (ccw ? 2 : 1)];
|
|
1649
|
-
indices.push(i1, i2, i3);
|
|
1650
|
-
if (index[i + 3] === -1 || i + 3 >= l) {
|
|
1651
|
-
i += 3;
|
|
1652
|
-
start = i + 1;
|
|
1653
|
-
}
|
|
1654
|
-
}
|
|
1655
|
-
return indices;
|
|
1656
|
-
}
|
|
1657
|
-
function triangulateFaceData(data2, index) {
|
|
1658
|
-
const triangulatedData = [];
|
|
1659
|
-
let start = 0;
|
|
1660
|
-
for (let i = 0, l = index.length; i < l; i++) {
|
|
1661
|
-
const stride = start * 3;
|
|
1662
|
-
const x = data2[stride];
|
|
1663
|
-
const y = data2[stride + 1];
|
|
1664
|
-
const z = data2[stride + 2];
|
|
1665
|
-
triangulatedData.push(x, y, z);
|
|
1666
|
-
if (index[i + 3] === -1 || i + 3 >= l) {
|
|
1667
|
-
i += 3;
|
|
1668
|
-
start++;
|
|
1669
|
-
}
|
|
1670
|
-
}
|
|
1671
|
-
return triangulatedData;
|
|
1672
|
-
}
|
|
1673
|
-
function flattenData(data2, index) {
|
|
1674
|
-
const flattenData2 = [];
|
|
1675
|
-
for (let i = 0, l = index.length; i < l; i++) {
|
|
1676
|
-
const i1 = index[i];
|
|
1677
|
-
const stride = i1 * 3;
|
|
1678
|
-
const x = data2[stride];
|
|
1679
|
-
const y = data2[stride + 1];
|
|
1680
|
-
const z = data2[stride + 2];
|
|
1681
|
-
flattenData2.push(x, y, z);
|
|
1682
|
-
}
|
|
1683
|
-
return flattenData2;
|
|
1684
|
-
}
|
|
1685
|
-
function expandLineIndex(index) {
|
|
1686
|
-
const indices = [];
|
|
1687
|
-
for (let i = 0, l = index.length; i < l; i++) {
|
|
1688
|
-
const i1 = index[i];
|
|
1689
|
-
const i2 = index[i + 1];
|
|
1690
|
-
indices.push(i1, i2);
|
|
1691
|
-
if (index[i + 2] === -1 || i + 2 >= l) {
|
|
1692
|
-
i += 2;
|
|
1693
|
-
}
|
|
1694
|
-
}
|
|
1695
|
-
return indices;
|
|
1696
|
-
}
|
|
1697
|
-
function expandLineData(data2, index) {
|
|
1698
|
-
const triangulatedData = [];
|
|
1699
|
-
let start = 0;
|
|
1700
|
-
for (let i = 0, l = index.length; i < l; i++) {
|
|
1701
|
-
const stride = start * 3;
|
|
1702
|
-
const x = data2[stride];
|
|
1703
|
-
const y = data2[stride + 1];
|
|
1704
|
-
const z = data2[stride + 2];
|
|
1705
|
-
triangulatedData.push(x, y, z);
|
|
1706
|
-
if (index[i + 2] === -1 || i + 2 >= l) {
|
|
1707
|
-
i += 2;
|
|
1708
|
-
start++;
|
|
1709
|
-
}
|
|
1710
|
-
}
|
|
1711
|
-
return triangulatedData;
|
|
1712
|
-
}
|
|
1713
|
-
const vA = new Vector3();
|
|
1714
|
-
const vB = new Vector3();
|
|
1715
|
-
const vC = new Vector3();
|
|
1716
|
-
const uvA = new Vector2();
|
|
1717
|
-
const uvB = new Vector2();
|
|
1718
|
-
const uvC = new Vector2();
|
|
1719
|
-
function computeAttributeFromIndexedData(coordIndex, index, data2, itemSize) {
|
|
1720
|
-
const array = [];
|
|
1721
|
-
for (let i = 0, l = coordIndex.length; i < l; i += 3) {
|
|
1722
|
-
const a = index[i];
|
|
1723
|
-
const b = index[i + 1];
|
|
1724
|
-
const c = index[i + 2];
|
|
1725
|
-
if (itemSize === 2) {
|
|
1726
|
-
uvA.fromArray(data2, a * itemSize);
|
|
1727
|
-
uvB.fromArray(data2, b * itemSize);
|
|
1728
|
-
uvC.fromArray(data2, c * itemSize);
|
|
1729
|
-
array.push(uvA.x, uvA.y);
|
|
1730
|
-
array.push(uvB.x, uvB.y);
|
|
1731
|
-
array.push(uvC.x, uvC.y);
|
|
1732
|
-
} else {
|
|
1733
|
-
vA.fromArray(data2, a * itemSize);
|
|
1734
|
-
vB.fromArray(data2, b * itemSize);
|
|
1735
|
-
vC.fromArray(data2, c * itemSize);
|
|
1736
|
-
array.push(vA.x, vA.y, vA.z);
|
|
1737
|
-
array.push(vB.x, vB.y, vB.z);
|
|
1738
|
-
array.push(vC.x, vC.y, vC.z);
|
|
1739
|
-
}
|
|
1740
|
-
}
|
|
1741
|
-
return new Float32BufferAttribute(array, itemSize);
|
|
1742
|
-
}
|
|
1743
|
-
function computeAttributeFromFaceData(index, faceData) {
|
|
1744
|
-
const array = [];
|
|
1745
|
-
for (let i = 0, j = 0, l = index.length; i < l; i += 3, j++) {
|
|
1746
|
-
vA.fromArray(faceData, j * 3);
|
|
1747
|
-
array.push(vA.x, vA.y, vA.z);
|
|
1748
|
-
array.push(vA.x, vA.y, vA.z);
|
|
1749
|
-
array.push(vA.x, vA.y, vA.z);
|
|
1750
|
-
}
|
|
1751
|
-
return new Float32BufferAttribute(array, 3);
|
|
1752
|
-
}
|
|
1753
|
-
function computeAttributeFromLineData(index, lineData) {
|
|
1754
|
-
const array = [];
|
|
1755
|
-
for (let i = 0, j = 0, l = index.length; i < l; i += 2, j++) {
|
|
1756
|
-
vA.fromArray(lineData, j * 3);
|
|
1757
|
-
array.push(vA.x, vA.y, vA.z);
|
|
1758
|
-
array.push(vA.x, vA.y, vA.z);
|
|
1759
|
-
}
|
|
1760
|
-
return new Float32BufferAttribute(array, 3);
|
|
1761
|
-
}
|
|
1762
|
-
function toNonIndexedAttribute(indices, attribute) {
|
|
1763
|
-
const array = attribute.array;
|
|
1764
|
-
const itemSize = attribute.itemSize;
|
|
1765
|
-
const array2 = new array.constructor(indices.length * itemSize);
|
|
1766
|
-
let index = 0, index2 = 0;
|
|
1767
|
-
for (let i = 0, l = indices.length; i < l; i++) {
|
|
1768
|
-
index = indices[i] * itemSize;
|
|
1769
|
-
for (let j = 0; j < itemSize; j++) {
|
|
1770
|
-
array2[index2++] = array[index++];
|
|
1771
|
-
}
|
|
1772
|
-
}
|
|
1773
|
-
return new Float32BufferAttribute(array2, itemSize);
|
|
1774
|
-
}
|
|
1775
|
-
const ab = new Vector3();
|
|
1776
|
-
const cb = new Vector3();
|
|
1777
|
-
function computeNormalAttribute(index, coord, creaseAngle) {
|
|
1778
|
-
const faces = [];
|
|
1779
|
-
const vertexNormals = {};
|
|
1780
|
-
for (let i = 0, l = index.length; i < l; i += 3) {
|
|
1781
|
-
const a = index[i];
|
|
1782
|
-
const b = index[i + 1];
|
|
1783
|
-
const c = index[i + 2];
|
|
1784
|
-
const face = new Face(a, b, c);
|
|
1785
|
-
vA.fromArray(coord, a * 3);
|
|
1786
|
-
vB.fromArray(coord, b * 3);
|
|
1787
|
-
vC.fromArray(coord, c * 3);
|
|
1788
|
-
cb.subVectors(vC, vB);
|
|
1789
|
-
ab.subVectors(vA, vB);
|
|
1790
|
-
cb.cross(ab);
|
|
1791
|
-
cb.normalize();
|
|
1792
|
-
face.normal.copy(cb);
|
|
1793
|
-
if (vertexNormals[a] === void 0)
|
|
1794
|
-
vertexNormals[a] = [];
|
|
1795
|
-
if (vertexNormals[b] === void 0)
|
|
1796
|
-
vertexNormals[b] = [];
|
|
1797
|
-
if (vertexNormals[c] === void 0)
|
|
1798
|
-
vertexNormals[c] = [];
|
|
1799
|
-
vertexNormals[a].push(face.normal);
|
|
1800
|
-
vertexNormals[b].push(face.normal);
|
|
1801
|
-
vertexNormals[c].push(face.normal);
|
|
1802
|
-
faces.push(face);
|
|
1803
|
-
}
|
|
1804
|
-
const normals = [];
|
|
1805
|
-
for (let i = 0, l = faces.length; i < l; i++) {
|
|
1806
|
-
const face = faces[i];
|
|
1807
|
-
const nA = weightedNormal(vertexNormals[face.a], face.normal, creaseAngle);
|
|
1808
|
-
const nB = weightedNormal(vertexNormals[face.b], face.normal, creaseAngle);
|
|
1809
|
-
const nC = weightedNormal(vertexNormals[face.c], face.normal, creaseAngle);
|
|
1810
|
-
vA.fromArray(coord, face.a * 3);
|
|
1811
|
-
vB.fromArray(coord, face.b * 3);
|
|
1812
|
-
vC.fromArray(coord, face.c * 3);
|
|
1813
|
-
normals.push(nA.x, nA.y, nA.z);
|
|
1814
|
-
normals.push(nB.x, nB.y, nB.z);
|
|
1815
|
-
normals.push(nC.x, nC.y, nC.z);
|
|
1816
|
-
}
|
|
1817
|
-
return new Float32BufferAttribute(normals, 3);
|
|
1818
|
-
}
|
|
1819
|
-
function weightedNormal(normals, vector, creaseAngle) {
|
|
1820
|
-
const normal = new Vector3();
|
|
1821
|
-
if (creaseAngle === 0) {
|
|
1822
|
-
normal.copy(vector);
|
|
1823
|
-
} else {
|
|
1824
|
-
for (let i = 0, l = normals.length; i < l; i++) {
|
|
1825
|
-
if (normals[i].angleTo(vector) < creaseAngle) {
|
|
1826
|
-
normal.add(normals[i]);
|
|
1827
|
-
}
|
|
1828
|
-
}
|
|
1829
|
-
}
|
|
1830
|
-
return normal.normalize();
|
|
1831
|
-
}
|
|
1832
|
-
function toColorArray(colors) {
|
|
1833
|
-
const array = [];
|
|
1834
|
-
for (let i = 0, l = colors.length; i < l; i += 3) {
|
|
1835
|
-
array.push(new Color(colors[i], colors[i + 1], colors[i + 2]));
|
|
1836
|
-
}
|
|
1837
|
-
return array;
|
|
1838
|
-
}
|
|
1839
|
-
function paintFaces(geometry, radius, angles, colors, topDown) {
|
|
1840
|
-
const thresholds = [];
|
|
1841
|
-
const startAngle = topDown === true ? 0 : Math.PI;
|
|
1842
|
-
for (let i = 0, l = colors.length; i < l; i++) {
|
|
1843
|
-
let angle = i === 0 ? 0 : angles[i - 1];
|
|
1844
|
-
angle = topDown === true ? angle : startAngle - angle;
|
|
1845
|
-
const point = new Vector3();
|
|
1846
|
-
point.setFromSphericalCoords(radius, angle, 0);
|
|
1847
|
-
thresholds.push(point);
|
|
1848
|
-
}
|
|
1849
|
-
const indices = geometry.index;
|
|
1850
|
-
const positionAttribute = geometry.attributes.position;
|
|
1851
|
-
const colorAttribute = new BufferAttribute(new Float32Array(geometry.attributes.position.count * 3), 3);
|
|
1852
|
-
const position = new Vector3();
|
|
1853
|
-
const color = new Color();
|
|
1854
|
-
for (let i = 0; i < indices.count; i++) {
|
|
1855
|
-
const index = indices.getX(i);
|
|
1856
|
-
position.fromBufferAttribute(positionAttribute, index);
|
|
1857
|
-
let thresholdIndexA, thresholdIndexB;
|
|
1858
|
-
let t = 1;
|
|
1859
|
-
for (let j = 1; j < thresholds.length; j++) {
|
|
1860
|
-
thresholdIndexA = j - 1;
|
|
1861
|
-
thresholdIndexB = j;
|
|
1862
|
-
const thresholdA = thresholds[thresholdIndexA];
|
|
1863
|
-
const thresholdB = thresholds[thresholdIndexB];
|
|
1864
|
-
if (topDown === true) {
|
|
1865
|
-
if (position.y <= thresholdA.y && position.y > thresholdB.y) {
|
|
1866
|
-
t = Math.abs(thresholdA.y - position.y) / Math.abs(thresholdA.y - thresholdB.y);
|
|
1867
|
-
break;
|
|
1868
|
-
}
|
|
1869
|
-
} else {
|
|
1870
|
-
if (position.y >= thresholdA.y && position.y < thresholdB.y) {
|
|
1871
|
-
t = Math.abs(thresholdA.y - position.y) / Math.abs(thresholdA.y - thresholdB.y);
|
|
1872
|
-
break;
|
|
1873
|
-
}
|
|
1874
|
-
}
|
|
1875
|
-
}
|
|
1876
|
-
const colorA = colors[thresholdIndexA];
|
|
1877
|
-
const colorB = colors[thresholdIndexB];
|
|
1878
|
-
color.copy(colorA).lerp(colorB, t);
|
|
1879
|
-
colorAttribute.setXYZ(index, color.r, color.g, color.b);
|
|
1880
|
-
}
|
|
1881
|
-
geometry.setAttribute("color", colorAttribute);
|
|
1882
|
-
}
|
|
1883
|
-
const textureLoader = new TextureLoader(this.manager);
|
|
1884
|
-
textureLoader.setPath(this.resourcePath || path).setCrossOrigin(this.crossOrigin);
|
|
1885
|
-
if (data.indexOf("#VRML V2.0") === -1) {
|
|
1886
|
-
throw Error("THREE.VRMLLexer: Version of VRML asset not supported.");
|
|
1887
|
-
}
|
|
1888
|
-
const tree = generateVRMLTree(data);
|
|
1889
|
-
const scene = parseTree(tree);
|
|
1890
|
-
return scene;
|
|
1891
|
-
}
|
|
1892
|
-
}
|
|
1893
|
-
class VRMLLexer {
|
|
1894
|
-
constructor(tokens) {
|
|
1895
|
-
this.lexer = new Lexer(tokens);
|
|
1896
|
-
}
|
|
1897
|
-
lex(inputText) {
|
|
1898
|
-
const lexingResult = this.lexer.tokenize(inputText);
|
|
1899
|
-
if (lexingResult.errors.length > 0) {
|
|
1900
|
-
console.error(lexingResult.errors);
|
|
1901
|
-
throw Error("THREE.VRMLLexer: Lexing errors detected.");
|
|
1902
|
-
}
|
|
1903
|
-
return lexingResult;
|
|
1904
|
-
}
|
|
1905
|
-
}
|
|
1906
|
-
class VRMLParser extends CstParser {
|
|
1907
|
-
constructor(tokenVocabulary) {
|
|
1908
|
-
super(tokenVocabulary);
|
|
1909
|
-
const $ = this;
|
|
1910
|
-
const Version = tokenVocabulary["Version"];
|
|
1911
|
-
const LCurly = tokenVocabulary["LCurly"];
|
|
1912
|
-
const RCurly = tokenVocabulary["RCurly"];
|
|
1913
|
-
const LSquare = tokenVocabulary["LSquare"];
|
|
1914
|
-
const RSquare = tokenVocabulary["RSquare"];
|
|
1915
|
-
const Identifier = tokenVocabulary["Identifier"];
|
|
1916
|
-
const RouteIdentifier = tokenVocabulary["RouteIdentifier"];
|
|
1917
|
-
const StringLiteral = tokenVocabulary["StringLiteral"];
|
|
1918
|
-
const HexLiteral = tokenVocabulary["HexLiteral"];
|
|
1919
|
-
const NumberLiteral = tokenVocabulary["NumberLiteral"];
|
|
1920
|
-
const TrueLiteral = tokenVocabulary["TrueLiteral"];
|
|
1921
|
-
const FalseLiteral = tokenVocabulary["FalseLiteral"];
|
|
1922
|
-
const NullLiteral = tokenVocabulary["NullLiteral"];
|
|
1923
|
-
const DEF = tokenVocabulary["DEF"];
|
|
1924
|
-
const USE = tokenVocabulary["USE"];
|
|
1925
|
-
const ROUTE = tokenVocabulary["ROUTE"];
|
|
1926
|
-
const TO = tokenVocabulary["TO"];
|
|
1927
|
-
const NodeName = tokenVocabulary["NodeName"];
|
|
1928
|
-
$.RULE("vrml", function() {
|
|
1929
|
-
$.SUBRULE($.version);
|
|
1930
|
-
$.AT_LEAST_ONE(function() {
|
|
1931
|
-
$.SUBRULE($.node);
|
|
1932
|
-
});
|
|
1933
|
-
$.MANY(function() {
|
|
1934
|
-
$.SUBRULE($.route);
|
|
1935
|
-
});
|
|
1936
|
-
});
|
|
1937
|
-
$.RULE("version", function() {
|
|
1938
|
-
$.CONSUME(Version);
|
|
1939
|
-
});
|
|
1940
|
-
$.RULE("node", function() {
|
|
1941
|
-
$.OPTION(function() {
|
|
1942
|
-
$.SUBRULE($.def);
|
|
1943
|
-
});
|
|
1944
|
-
$.CONSUME(NodeName);
|
|
1945
|
-
$.CONSUME(LCurly);
|
|
1946
|
-
$.MANY(function() {
|
|
1947
|
-
$.SUBRULE($.field);
|
|
1948
|
-
});
|
|
1949
|
-
$.CONSUME(RCurly);
|
|
1950
|
-
});
|
|
1951
|
-
$.RULE("field", function() {
|
|
1952
|
-
$.CONSUME(Identifier);
|
|
1953
|
-
$.OR2([
|
|
1954
|
-
{
|
|
1955
|
-
ALT: function() {
|
|
1956
|
-
$.SUBRULE($.singleFieldValue);
|
|
1957
|
-
}
|
|
1958
|
-
},
|
|
1959
|
-
{
|
|
1960
|
-
ALT: function() {
|
|
1961
|
-
$.SUBRULE($.multiFieldValue);
|
|
1962
|
-
}
|
|
1963
|
-
}
|
|
1964
|
-
]);
|
|
1965
|
-
});
|
|
1966
|
-
$.RULE("def", function() {
|
|
1967
|
-
$.CONSUME(DEF);
|
|
1968
|
-
$.OR([
|
|
1969
|
-
{
|
|
1970
|
-
ALT: function() {
|
|
1971
|
-
$.CONSUME(Identifier);
|
|
1972
|
-
}
|
|
1973
|
-
},
|
|
1974
|
-
{
|
|
1975
|
-
ALT: function() {
|
|
1976
|
-
$.CONSUME(NodeName);
|
|
1977
|
-
}
|
|
1978
|
-
}
|
|
1979
|
-
]);
|
|
1980
|
-
});
|
|
1981
|
-
$.RULE("use", function() {
|
|
1982
|
-
$.CONSUME(USE);
|
|
1983
|
-
$.OR([
|
|
1984
|
-
{
|
|
1985
|
-
ALT: function() {
|
|
1986
|
-
$.CONSUME(Identifier);
|
|
1987
|
-
}
|
|
1988
|
-
},
|
|
1989
|
-
{
|
|
1990
|
-
ALT: function() {
|
|
1991
|
-
$.CONSUME(NodeName);
|
|
1992
|
-
}
|
|
1993
|
-
}
|
|
1994
|
-
]);
|
|
1995
|
-
});
|
|
1996
|
-
$.RULE("singleFieldValue", function() {
|
|
1997
|
-
$.AT_LEAST_ONE(function() {
|
|
1998
|
-
$.OR([
|
|
1999
|
-
{
|
|
2000
|
-
ALT: function() {
|
|
2001
|
-
$.SUBRULE($.node);
|
|
2002
|
-
}
|
|
2003
|
-
},
|
|
2004
|
-
{
|
|
2005
|
-
ALT: function() {
|
|
2006
|
-
$.SUBRULE($.use);
|
|
2007
|
-
}
|
|
2008
|
-
},
|
|
2009
|
-
{
|
|
2010
|
-
ALT: function() {
|
|
2011
|
-
$.CONSUME(StringLiteral);
|
|
2012
|
-
}
|
|
2013
|
-
},
|
|
2014
|
-
{
|
|
2015
|
-
ALT: function() {
|
|
2016
|
-
$.CONSUME(HexLiteral);
|
|
2017
|
-
}
|
|
2018
|
-
},
|
|
2019
|
-
{
|
|
2020
|
-
ALT: function() {
|
|
2021
|
-
$.CONSUME(NumberLiteral);
|
|
2022
|
-
}
|
|
2023
|
-
},
|
|
2024
|
-
{
|
|
2025
|
-
ALT: function() {
|
|
2026
|
-
$.CONSUME(TrueLiteral);
|
|
2027
|
-
}
|
|
2028
|
-
},
|
|
2029
|
-
{
|
|
2030
|
-
ALT: function() {
|
|
2031
|
-
$.CONSUME(FalseLiteral);
|
|
2032
|
-
}
|
|
2033
|
-
},
|
|
2034
|
-
{
|
|
2035
|
-
ALT: function() {
|
|
2036
|
-
$.CONSUME(NullLiteral);
|
|
2037
|
-
}
|
|
2038
|
-
}
|
|
2039
|
-
]);
|
|
2040
|
-
});
|
|
2041
|
-
});
|
|
2042
|
-
$.RULE("multiFieldValue", function() {
|
|
2043
|
-
$.CONSUME(LSquare);
|
|
2044
|
-
$.MANY(function() {
|
|
2045
|
-
$.OR([
|
|
2046
|
-
{
|
|
2047
|
-
ALT: function() {
|
|
2048
|
-
$.SUBRULE($.node);
|
|
2049
|
-
}
|
|
2050
|
-
},
|
|
2051
|
-
{
|
|
2052
|
-
ALT: function() {
|
|
2053
|
-
$.SUBRULE($.use);
|
|
2054
|
-
}
|
|
2055
|
-
},
|
|
2056
|
-
{
|
|
2057
|
-
ALT: function() {
|
|
2058
|
-
$.CONSUME(StringLiteral);
|
|
2059
|
-
}
|
|
2060
|
-
},
|
|
2061
|
-
{
|
|
2062
|
-
ALT: function() {
|
|
2063
|
-
$.CONSUME(HexLiteral);
|
|
2064
|
-
}
|
|
2065
|
-
},
|
|
2066
|
-
{
|
|
2067
|
-
ALT: function() {
|
|
2068
|
-
$.CONSUME(NumberLiteral);
|
|
2069
|
-
}
|
|
2070
|
-
},
|
|
2071
|
-
{
|
|
2072
|
-
ALT: function() {
|
|
2073
|
-
$.CONSUME(NullLiteral);
|
|
2074
|
-
}
|
|
2075
|
-
}
|
|
2076
|
-
]);
|
|
2077
|
-
});
|
|
2078
|
-
$.CONSUME(RSquare);
|
|
2079
|
-
});
|
|
2080
|
-
$.RULE("route", function() {
|
|
2081
|
-
$.CONSUME(ROUTE);
|
|
2082
|
-
$.CONSUME(RouteIdentifier);
|
|
2083
|
-
$.CONSUME(TO);
|
|
2084
|
-
$.CONSUME2(RouteIdentifier);
|
|
2085
|
-
});
|
|
2086
|
-
this.performSelfAnalysis();
|
|
2087
|
-
}
|
|
2088
|
-
}
|
|
2089
|
-
class Face {
|
|
2090
|
-
constructor(a, b, c) {
|
|
2091
|
-
this.a = a;
|
|
2092
|
-
this.b = b;
|
|
2093
|
-
this.c = c;
|
|
2094
|
-
this.normal = new Vector3();
|
|
2095
|
-
}
|
|
2096
|
-
}
|
|
2097
|
-
const TEXTURE_TYPE = {
|
|
2098
|
-
INTENSITY: 1,
|
|
2099
|
-
INTENSITY_ALPHA: 2,
|
|
2100
|
-
RGB: 3,
|
|
2101
|
-
RGBA: 4
|
|
2102
|
-
};
|
|
2103
|
-
export {
|
|
2104
|
-
VRMLLoader
|
|
2105
|
-
};
|