super-three 0.144.0 → 0.147.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/README.md +1 -1
- package/build/three.cjs +735 -387
- package/build/three.js +735 -387
- package/build/three.min.js +1 -1
- package/build/three.module.js +910 -408
- package/examples/js/animation/AnimationClipCreator.js +0 -8
- package/examples/js/animation/CCDIKSolver.js +50 -67
- package/examples/js/animation/MMDAnimationHelper.js +66 -137
- package/examples/js/animation/MMDPhysics.js +70 -134
- package/examples/js/cameras/CinematicCamera.js +33 -22
- package/examples/js/controls/ArcballControls.js +138 -405
- package/examples/js/controls/DragControls.js +8 -33
- package/examples/js/controls/FirstPersonControls.js +32 -54
- package/examples/js/controls/FlyControls.js +29 -55
- package/examples/js/controls/OrbitControls.js +125 -99
- package/examples/js/controls/PointerLockControls.js +5 -14
- package/examples/js/controls/TrackballControls.js +33 -86
- package/examples/js/controls/TransformControls.js +85 -170
- package/examples/js/csm/CSM.js +4 -39
- package/examples/js/csm/CSMFrustum.js +3 -9
- package/examples/js/csm/CSMHelper.js +24 -4
- package/examples/js/csm/CSMShader.js +2 -6
- package/examples/js/curves/CurveExtras.js +27 -27
- package/examples/js/curves/NURBSCurve.js +4 -16
- package/examples/js/curves/NURBSSurface.js +3 -9
- package/examples/js/curves/NURBSUtils.js +8 -45
- package/examples/js/effects/AnaglyphEffect.js +4 -18
- package/examples/js/effects/AsciiEffect.js +32 -31
- package/examples/js/effects/OutlineEffect.js +26 -30
- package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
- package/examples/js/effects/PeppersGhostEffect.js +12 -39
- package/examples/js/effects/StereoEffect.js +0 -4
- package/examples/js/environments/RoomEnvironment.js +12 -10
- package/examples/js/exporters/ColladaExporter.js +48 -65
- package/examples/js/exporters/DRACOExporter.js +22 -22
- package/examples/js/exporters/EXRExporter.js +15 -18
- package/examples/js/exporters/GLTFExporter.js +141 -317
- package/examples/js/exporters/MMDExporter.js +5 -12
- package/examples/js/exporters/OBJExporter.js +42 -33
- package/examples/js/exporters/PLYExporter.js +38 -33
- package/examples/js/exporters/STLExporter.js +5 -7
- package/examples/js/exporters/USDZExporter.js +113 -27
- package/examples/js/geometries/BoxLineGeometry.js +0 -1
- package/examples/js/geometries/ConvexGeometry.js +11 -6
- package/examples/js/geometries/DecalGeometry.js +53 -20
- package/examples/js/geometries/LightningStrike.js +54 -67
- package/examples/js/geometries/ParametricGeometries.js +8 -7
- package/examples/js/geometries/ParametricGeometry.js +25 -12
- package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
- package/examples/js/geometries/TeapotGeometry.js +54 -50
- package/examples/js/geometries/TextGeometry.js +6 -4
- package/examples/js/helpers/LightProbeHelper.js +1 -2
- package/examples/js/helpers/OctreeHelper.js +22 -20
- package/examples/js/helpers/PositionalAudioHelper.js +8 -6
- package/examples/js/helpers/RectAreaLightHelper.js +6 -7
- package/examples/js/helpers/VertexNormalsHelper.js +15 -13
- package/examples/js/helpers/VertexTangentsHelper.js +15 -9
- package/examples/js/helpers/ViewHelper.js +31 -16
- package/examples/js/interactive/HTMLMesh.js +25 -39
- package/examples/js/interactive/InteractiveGroup.js +9 -14
- package/examples/js/interactive/SelectionBox.js +3 -70
- package/examples/js/interactive/SelectionHelper.js +0 -8
- package/examples/js/lights/LightProbeGenerator.js +32 -39
- package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
- package/examples/js/lines/LineGeometry.js +3 -5
- package/examples/js/lines/LineMaterial.js +4 -11
- package/examples/js/lines/LineSegments2.js +40 -89
- package/examples/js/lines/LineSegmentsGeometry.js +7 -28
- package/examples/js/lines/Wireframe.js +2 -7
- package/examples/js/lines/WireframeGeometry2.js +3 -1
- package/examples/js/loaders/3DMLoader.js +58 -155
- package/examples/js/loaders/3MFLoader.js +72 -106
- package/examples/js/loaders/AMFLoader.js +0 -25
- package/examples/js/loaders/BVHLoader.js +44 -43
- package/examples/js/loaders/BasisTextureLoader.js +16 -46
- package/examples/js/loaders/ColladaLoader.js +228 -359
- package/examples/js/loaders/DDSLoader.js +24 -25
- package/examples/js/loaders/DRACOLoader.js +29 -66
- package/examples/js/loaders/EXRLoader.js +67 -164
- package/examples/js/loaders/FBXLoader.js +287 -441
- package/examples/js/loaders/FontLoader.js +6 -15
- package/examples/js/loaders/GCodeLoader.js +15 -16
- package/examples/js/loaders/GLTFLoader.js +409 -706
- package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
- package/examples/js/loaders/KMZLoader.js +3 -7
- package/examples/js/loaders/KTXLoader.js +12 -30
- package/examples/js/loaders/LDrawLoader.js +178 -289
- package/examples/js/loaders/LUT3dlLoader.js +7 -11
- package/examples/js/loaders/LUTCubeLoader.js +0 -8
- package/examples/js/loaders/LWOLoader.js +59 -124
- package/examples/js/loaders/LogLuvLoader.js +27 -77
- package/examples/js/loaders/LottieLoader.js +4 -4
- package/examples/js/loaders/MD2Loader.js +26 -27
- package/examples/js/loaders/MDDLoader.js +6 -10
- package/examples/js/loaders/MMDLoader.js +180 -189
- package/examples/js/loaders/MTLLoader.js +18 -47
- package/examples/js/loaders/NRRDLoader.js +44 -84
- package/examples/js/loaders/OBJLoader.js +50 -65
- package/examples/js/loaders/PCDLoader.js +34 -29
- package/examples/js/loaders/PDBLoader.js +17 -13
- package/examples/js/loaders/PLYLoader.js +62 -48
- package/examples/js/loaders/PRWMLoader.js +11 -22
- package/examples/js/loaders/PVRLoader.js +7 -16
- package/examples/js/loaders/RGBELoader.js +36 -61
- package/examples/js/loaders/RGBMLoader.js +26 -87
- package/examples/js/loaders/STLLoader.js +20 -27
- package/examples/js/loaders/SVGLoader.js +361 -233
- package/examples/js/loaders/TDSLoader.js +81 -118
- package/examples/js/loaders/TGALoader.js +39 -41
- package/examples/js/loaders/TIFFLoader.js +0 -1
- package/examples/js/loaders/TTFLoader.js +0 -8
- package/examples/js/loaders/TiltLoader.js +14 -15
- package/examples/js/loaders/VOXLoader.js +8 -16
- package/examples/js/loaders/VRMLLoader.js +243 -340
- package/examples/js/loaders/VTKLoader.js +101 -118
- package/examples/js/loaders/XYZLoader.js +2 -4
- package/examples/js/loaders/lwo/IFFParser.js +55 -136
- package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
- package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
- package/examples/js/materials/MeshGouraudMaterial.js +15 -13
- package/examples/js/math/Capsule.js +0 -17
- package/examples/js/math/ColorConverter.js +3 -3
- package/examples/js/math/ConvexHull.js +185 -141
- package/examples/js/math/ImprovedNoise.js +1 -1
- package/examples/js/math/Lut.js +8 -15
- package/examples/js/math/MeshSurfaceSampler.js +6 -28
- package/examples/js/math/OBB.js +90 -49
- package/examples/js/math/Octree.js +2 -57
- package/examples/js/math/SimplexNoise.js +74 -88
- package/examples/js/misc/ConvexObjectBreaker.js +37 -48
- package/examples/js/misc/GPUComputationRenderer.js +26 -16
- package/examples/js/misc/Gyroscope.js +5 -9
- package/examples/js/misc/MD2Character.js +14 -23
- package/examples/js/misc/MD2CharacterComplex.js +73 -54
- package/examples/js/misc/MorphAnimMesh.js +0 -6
- package/examples/js/misc/MorphBlendMesh.js +3 -30
- package/examples/js/misc/ProgressiveLightMap.js +47 -43
- package/examples/js/misc/RollerCoaster.js +17 -24
- package/examples/js/misc/TubePainter.js +18 -12
- package/examples/js/misc/Volume.js +16 -45
- package/examples/js/misc/VolumeSlice.js +14 -24
- package/examples/js/modifiers/CurveModifier.js +19 -21
- package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
- package/examples/js/modifiers/SimplifyModifier.js +56 -59
- package/examples/js/modifiers/TessellateModifier.js +2 -9
- package/examples/js/objects/GroundProjectedEnv.js +2 -14
- package/examples/js/objects/Lensflare.js +47 -38
- package/examples/js/objects/LightningStorm.js +10 -13
- package/examples/js/objects/MarchingCubes.js +80 -59
- package/examples/js/objects/Reflector.js +22 -20
- package/examples/js/objects/ReflectorForSSRPass.js +19 -23
- package/examples/js/objects/Refractor.js +52 -30
- package/examples/js/objects/ShadowMesh.js +1 -2
- package/examples/js/objects/Sky.js +2 -7
- package/examples/js/objects/Water.js +23 -18
- package/examples/js/objects/Water2.js +20 -19
- package/examples/js/physics/AmmoPhysics.js +23 -20
- package/examples/js/physics/OimoPhysics.js +19 -17
- package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
- package/examples/js/postprocessing/AfterimagePass.js +19 -12
- package/examples/js/postprocessing/BloomPass.js +38 -17
- package/examples/js/postprocessing/BokehPass.js +29 -12
- package/examples/js/postprocessing/ClearPass.js +1 -6
- package/examples/js/postprocessing/CubeTexturePass.js +12 -9
- package/examples/js/postprocessing/DotScreenPass.js +7 -5
- package/examples/js/postprocessing/EffectComposer.js +25 -32
- package/examples/js/postprocessing/FilmPass.js +7 -5
- package/examples/js/postprocessing/GlitchPass.js +10 -11
- package/examples/js/postprocessing/HalftonePass.js +9 -9
- package/examples/js/postprocessing/LUTPass.js +2 -15
- package/examples/js/postprocessing/MaskPass.js +20 -17
- package/examples/js/postprocessing/OutlinePass.js +45 -36
- package/examples/js/postprocessing/Pass.js +11 -14
- package/examples/js/postprocessing/RenderPass.js +3 -7
- package/examples/js/postprocessing/RenderPixelatedPass.js +215 -0
- package/examples/js/postprocessing/SAOPass.js +40 -32
- package/examples/js/postprocessing/SMAAPass.js +34 -17
- package/examples/js/postprocessing/SSAARenderPass.js +14 -14
- package/examples/js/postprocessing/SSAOPass.js +56 -42
- package/examples/js/postprocessing/SSRPass.js +78 -61
- package/examples/js/postprocessing/SavePass.js +14 -6
- package/examples/js/postprocessing/ShaderPass.js +9 -8
- package/examples/js/postprocessing/TAARenderPass.js +11 -9
- package/examples/js/postprocessing/TexturePass.js +7 -4
- package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
- package/examples/js/renderers/CSS2DRenderer.js +2 -21
- package/examples/js/renderers/CSS3DRenderer.js +3 -24
- package/examples/js/renderers/Projector.js +29 -85
- package/examples/js/renderers/SVGRenderer.js +4 -50
- package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
- package/examples/js/shaders/AfterimageShader.js +3 -6
- package/examples/js/shaders/BasicShader.js +3 -6
- package/examples/js/shaders/BleachBypassShader.js +3 -6
- package/examples/js/shaders/BlendShader.js +3 -6
- package/examples/js/shaders/BokehShader.js +3 -6
- package/examples/js/shaders/BokehShader2.js +4 -13
- package/examples/js/shaders/BrightnessContrastShader.js +3 -6
- package/examples/js/shaders/ColorCorrectionShader.js +2 -6
- package/examples/js/shaders/ColorifyShader.js +2 -6
- package/examples/js/shaders/ConvolutionShader.js +5 -10
- package/examples/js/shaders/CopyShader.js +3 -6
- package/examples/js/shaders/DOFMipMapShader.js +3 -6
- package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
- package/examples/js/shaders/DigitalGlitch.js +3 -6
- package/examples/js/shaders/DotScreenShader.js +2 -6
- package/examples/js/shaders/FXAAShader.js +1 -3
- package/examples/js/shaders/FilmShader.js +3 -6
- package/examples/js/shaders/FocusShader.js +3 -6
- package/examples/js/shaders/FreiChenShader.js +2 -6
- package/examples/js/shaders/GammaCorrectionShader.js +3 -6
- package/examples/js/shaders/GodRaysShader.js +11 -24
- package/examples/js/shaders/HalftoneShader.js +3 -6
- package/examples/js/shaders/HorizontalBlurShader.js +3 -6
- package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
- package/examples/js/shaders/HueSaturationShader.js +3 -6
- package/examples/js/shaders/KaleidoShader.js +3 -6
- package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
- package/examples/js/shaders/LuminosityShader.js +3 -6
- package/examples/js/shaders/MMDToonShader.js +2 -8
- package/examples/js/shaders/MirrorShader.js +3 -6
- package/examples/js/shaders/NormalMapShader.js +2 -6
- package/examples/js/shaders/RGBShiftShader.js +3 -6
- package/examples/js/shaders/SAOShader.js +2 -6
- package/examples/js/shaders/SMAAShader.js +6 -18
- package/examples/js/shaders/SSAOShader.js +2 -6
- package/examples/js/shaders/SSRShader.js +6 -18
- package/examples/js/shaders/SepiaShader.js +3 -6
- package/examples/js/shaders/SobelOperatorShader.js +2 -6
- package/examples/js/shaders/TechnicolorShader.js +3 -6
- package/examples/js/shaders/ToneMapShader.js +3 -6
- package/examples/js/shaders/ToonShader.js +8 -24
- package/examples/js/shaders/TriangleBlurShader.js +2 -6
- package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
- package/examples/js/shaders/VelocityShader.js +126 -0
- package/examples/js/shaders/VerticalBlurShader.js +3 -6
- package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
- package/examples/js/shaders/VignetteShader.js +3 -6
- package/examples/js/shaders/VolumeShader.js +2 -6
- package/examples/js/shaders/WaterRefractionShader.js +2 -6
- package/examples/js/textures/FlakesTexture.js +0 -1
- package/examples/js/utils/BufferGeometryUtils.js +236 -170
- package/examples/js/utils/CameraUtils.js +5 -20
- package/examples/js/utils/GPUStatsPanel.js +3 -12
- package/examples/js/utils/GeometryCompressionUtils.js +19 -44
- package/examples/js/utils/GeometryUtils.js +13 -18
- package/examples/js/utils/LDrawUtils.js +8 -11
- package/examples/js/utils/PackedPhongMaterial.js +6 -4
- package/examples/js/utils/SceneUtils.js +117 -6
- package/examples/js/utils/ShadowMapViewer.js +17 -14
- package/examples/js/utils/SkeletonUtils.js +13 -27
- package/examples/js/utils/UVsDebug.js +20 -12
- package/examples/js/utils/WorkerPool.js +1 -11
- package/examples/jsm/animation/CCDIKSolver.js +27 -3
- package/examples/jsm/animation/MMDPhysics.js +25 -0
- package/examples/jsm/capabilities/WebGPU.js +3 -1
- package/examples/jsm/controls/FirstPersonControls.js +20 -20
- package/examples/jsm/controls/FlyControls.js +16 -17
- package/examples/jsm/controls/OrbitControls.js +44 -4
- package/examples/jsm/controls/TrackballControls.js +14 -2
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/csm/CSM.js +1 -0
- package/examples/jsm/csm/CSMHelper.js +30 -0
- package/examples/jsm/exporters/GLTFExporter.js +0 -79
- package/examples/jsm/exporters/USDZExporter.js +93 -1
- package/examples/jsm/helpers/OctreeHelper.js +22 -8
- package/examples/jsm/helpers/VertexNormalsHelper.js +7 -1
- package/examples/jsm/helpers/VertexTangentsHelper.js +7 -0
- package/examples/jsm/helpers/ViewHelper.js +24 -0
- package/examples/jsm/interactive/HTMLMesh.js +5 -6
- package/examples/jsm/interactive/InteractiveGroup.js +4 -2
- package/examples/jsm/libs/flow.module.js +610 -160
- package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
- package/examples/jsm/lines/LineSegments2.js +4 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -2
- package/examples/jsm/loaders/ColladaLoader.js +28 -0
- package/examples/jsm/loaders/FBXLoader.js +18 -2
- package/examples/jsm/loaders/GLTFLoader.js +269 -428
- package/examples/jsm/loaders/KTX2Loader.js +68 -29
- package/examples/jsm/loaders/LDrawLoader.js +14 -13
- package/examples/jsm/loaders/LottieLoader.js +4 -2
- package/examples/jsm/loaders/MaterialXLoader.js +728 -0
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +68 -16
- package/examples/jsm/loaders/SVGLoader.js +227 -14
- package/examples/jsm/loaders/USDZLoader.js +351 -111
- package/examples/jsm/loaders/VRMLLoader.js +13 -1
- package/examples/jsm/math/ConvexHull.js +4 -4
- package/examples/jsm/math/Octree.js +1 -1
- package/examples/jsm/node-editor/NodeEditor.js +91 -12
- package/examples/jsm/node-editor/core/BaseNode.js +10 -3
- package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +6 -9
- package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +6 -9
- package/examples/jsm/node-editor/math/AngleEditor.js +3 -3
- package/examples/jsm/node-editor/math/InvertEditor.js +2 -2
- package/examples/jsm/node-editor/scene/MeshEditor.js +11 -8
- package/examples/jsm/node-editor/utils/PreviewEditor.js +4 -0
- package/examples/jsm/nodes/Nodes.js +30 -3
- package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
- package/examples/jsm/nodes/accessors/NormalNode.js +6 -6
- package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +8 -1
- package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
- package/examples/jsm/nodes/core/AttributeNode.js +31 -8
- package/examples/jsm/nodes/core/Node.js +1 -1
- package/examples/jsm/nodes/core/NodeBuilder.js +55 -6
- package/examples/jsm/nodes/core/NodeFrame.js +2 -2
- package/examples/jsm/nodes/core/NodeVarying.js +7 -4
- package/examples/jsm/nodes/core/VaryingNode.js +6 -4
- package/examples/jsm/nodes/core/constants.js +13 -13
- package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -12
- package/examples/jsm/nodes/display/NormalMapNode.js +19 -12
- package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
- package/examples/jsm/nodes/display/ViewportNode.js +106 -0
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +5 -5
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +3 -3
- package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
- package/examples/jsm/nodes/materials/Materials.js +9 -7
- package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
- package/examples/jsm/nodes/materialx/{Disclaimer.md → DISCLAIMER.md} +1 -1
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +59 -0
- package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_hsv.js +1 -1
- package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_noise.js +13 -3
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
- package/examples/jsm/nodes/math/MathNode.js +5 -5
- package/examples/jsm/nodes/math/OperatorNode.js +16 -3
- package/examples/jsm/nodes/shadernode/ShaderNode.js +35 -20
- package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +87 -63
- package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +29 -0
- package/examples/jsm/nodes/utils/ConvertNode.js +15 -14
- package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
- package/examples/jsm/nodes/utils/JoinNode.js +8 -2
- package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
- package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
- package/examples/jsm/nodes/utils/OscNode.js +2 -2
- package/examples/jsm/nodes/utils/RemapNode.js +34 -0
- package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
- package/examples/jsm/nodes/utils/TimerNode.js +21 -1
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
- package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
- package/examples/jsm/postprocessing/BloomPass.js +22 -3
- package/examples/jsm/postprocessing/BokehPass.js +18 -4
- package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
- package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
- package/examples/jsm/postprocessing/EffectComposer.js +9 -0
- package/examples/jsm/postprocessing/FilmPass.js +8 -0
- package/examples/jsm/postprocessing/GlitchPass.js +13 -1
- package/examples/jsm/postprocessing/HalftonePass.js +8 -0
- package/examples/jsm/postprocessing/OutlinePass.js +21 -1
- package/examples/jsm/postprocessing/Pass.js +2 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
- package/examples/jsm/postprocessing/SAOPass.js +20 -0
- package/examples/jsm/postprocessing/SMAAPass.js +16 -0
- package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
- package/examples/jsm/postprocessing/SavePass.js +17 -1
- package/examples/jsm/postprocessing/ShaderPass.js +8 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
- package/examples/jsm/postprocessing/TexturePass.js +8 -0
- package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +56 -35
- package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
- package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
- package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
- package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +41 -9
- package/examples/jsm/shaders/MMDToonShader.js +0 -2
- package/examples/jsm/shaders/VelocityShader.js +128 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +174 -42
- package/examples/jsm/utils/SceneUtils.js +129 -4
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRHandMeshModel.js +8 -3
- package/package.json +13 -13
- package/src/Three.js +1 -0
- package/src/animation/PropertyBinding.js +7 -0
- package/src/audio/AudioContext.js +5 -5
- package/src/cameras/CubeCamera.js +14 -14
- package/src/constants.js +1 -1
- package/src/core/InstancedBufferGeometry.js +1 -7
- package/src/core/InterleavedBufferAttribute.js +4 -4
- package/src/extras/Earcut.js +67 -67
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/ShapeGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +9 -0
- package/src/helpers/Box3Helper.js +7 -0
- package/src/helpers/BoxHelper.js +7 -1
- package/src/helpers/DirectionalLightHelper.js +5 -1
- package/src/helpers/GridHelper.js +7 -0
- package/src/helpers/HemisphereLightHelper.js +4 -1
- package/src/helpers/PlaneHelper.js +9 -0
- package/src/helpers/PointLightHelper.js +2 -1
- package/src/helpers/PolarGridHelper.js +7 -0
- package/src/helpers/SkeletonHelper.js +7 -0
- package/src/helpers/SpotLightHelper.js +4 -2
- package/src/lights/LightShadow.js +1 -2
- package/src/lights/PointLight.js +2 -2
- package/src/lights/SpotLight.js +2 -2
- package/src/loaders/FileLoader.js +4 -1
- package/src/loaders/ObjectLoader.js +5 -1
- package/src/materials/Material.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +1 -1
- package/src/math/Color.js +5 -5
- package/src/math/Matrix3.js +53 -18
- package/src/math/Ray.js +2 -5
- package/src/math/Sphere.js +36 -21
- package/src/objects/InstancedMesh.js +7 -0
- package/src/objects/LOD.js +25 -6
- package/src/renderers/WebGL3DRenderTarget.js +1 -1
- package/src/renderers/WebGLArrayRenderTarget.js +1 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
- package/src/renderers/WebGLRenderTarget.js +1 -1
- package/src/renderers/WebGLRenderer.js +36 -62
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -4
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk.js +3 -0
- package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +0 -3
- package/src/renderers/shaders/ShaderLib.js +20 -6
- package/src/renderers/shaders/UniformsLib.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +15 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -0
- package/src/renderers/webgl/WebGLBackground.js +15 -7
- package/src/renderers/webgl/WebGLLights.js +0 -4
- package/src/renderers/webgl/WebGLMaterials.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -1
- package/src/renderers/webgl/WebGLState.js +78 -41
- package/src/renderers/webgl/WebGLTextures.js +94 -39
- package/src/renderers/webgl/WebGLUniforms.js +152 -24
- package/src/renderers/webgl/WebGLUtils.js +1 -1
- package/src/renderers/webxr/WebXRController.js +46 -13
- package/src/renderers/webxr/WebXRManager.js +70 -2
- package/src/scenes/Scene.js +8 -0
- package/src/textures/CompressedArrayTexture.js +18 -0
- package/src/textures/Texture.js +2 -1
- package/examples/js/libs/lottie_canvas.js +0 -12751
- package/examples/js/shaders/PixelShader.js +0 -51
- package/examples/jsm/shaders/PixelShader.js +0 -44
|
@@ -2,25 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
class USDZExporter {
|
|
4
4
|
|
|
5
|
-
async parse( scene
|
|
5
|
+
async parse( scene, options = {
|
|
6
|
+
ar: {
|
|
7
|
+
anchoring: {
|
|
8
|
+
type: 'plane'
|
|
9
|
+
},
|
|
10
|
+
planeAnchoring: {
|
|
11
|
+
alignment: 'horizontal'
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
} ) {
|
|
6
15
|
|
|
7
16
|
const files = {};
|
|
8
|
-
const modelFileName = 'model.usda';
|
|
17
|
+
const modelFileName = 'model.usda';
|
|
9
18
|
|
|
19
|
+
// model file should be first in USDZ archive so we init it here
|
|
10
20
|
files[ modelFileName ] = null;
|
|
11
21
|
let output = buildHeader();
|
|
22
|
+
output += buildSceneStart( options );
|
|
12
23
|
const materials = {};
|
|
13
24
|
const textures = {};
|
|
14
25
|
scene.traverseVisible( object => {
|
|
15
26
|
|
|
16
27
|
if ( object.isMesh ) {
|
|
17
28
|
|
|
18
|
-
|
|
29
|
+
const geometry = object.geometry;
|
|
30
|
+
const material = object.material;
|
|
31
|
+
if ( material.isMeshStandardMaterial ) {
|
|
19
32
|
|
|
20
|
-
const geometry = object.geometry;
|
|
21
|
-
const material = object.material;
|
|
22
33
|
const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd';
|
|
23
|
-
|
|
24
34
|
if ( ! ( geometryFileName in files ) ) {
|
|
25
35
|
|
|
26
36
|
const meshObject = buildMeshObject( geometry );
|
|
@@ -42,13 +52,17 @@
|
|
|
42
52
|
|
|
43
53
|
}
|
|
44
54
|
|
|
55
|
+
} else if ( object.isCamera ) {
|
|
56
|
+
|
|
57
|
+
output += buildCamera( object );
|
|
58
|
+
|
|
45
59
|
}
|
|
46
60
|
|
|
47
61
|
} );
|
|
62
|
+
output += buildSceneEnd();
|
|
48
63
|
output += buildMaterials( materials, textures );
|
|
49
64
|
files[ modelFileName ] = fflate.strToU8( output );
|
|
50
65
|
output = null;
|
|
51
|
-
|
|
52
66
|
for ( const id in textures ) {
|
|
53
67
|
|
|
54
68
|
const texture = textures[ id ];
|
|
@@ -58,19 +72,18 @@
|
|
|
58
72
|
const blob = await new Promise( resolve => canvas.toBlob( resolve, isRGBA ? 'image/png' : 'image/jpeg', 1 ) );
|
|
59
73
|
files[ `textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}` ] = new Uint8Array( await blob.arrayBuffer() );
|
|
60
74
|
|
|
61
|
-
}
|
|
62
|
-
// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109
|
|
75
|
+
}
|
|
63
76
|
|
|
77
|
+
// 64 byte alignment
|
|
78
|
+
// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109
|
|
64
79
|
|
|
65
80
|
let offset = 0;
|
|
66
|
-
|
|
67
81
|
for ( const filename in files ) {
|
|
68
82
|
|
|
69
83
|
const file = files[ filename ];
|
|
70
84
|
const headerSize = 34 + filename.length;
|
|
71
85
|
offset += headerSize;
|
|
72
86
|
const offsetMod64 = offset & 63;
|
|
73
|
-
|
|
74
87
|
if ( offsetMod64 !== 4 ) {
|
|
75
88
|
|
|
76
89
|
const padLength = 64 - offsetMod64;
|
|
@@ -94,7 +107,6 @@
|
|
|
94
107
|
}
|
|
95
108
|
|
|
96
109
|
}
|
|
97
|
-
|
|
98
110
|
function imageToCanvas( image, color ) {
|
|
99
111
|
|
|
100
112
|
if ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement || typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas || typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) {
|
|
@@ -105,7 +117,6 @@
|
|
|
105
117
|
canvas.height = image.height * Math.min( 1, scale );
|
|
106
118
|
const context = canvas.getContext( '2d' );
|
|
107
119
|
context.drawImage( image, 0, 0, canvas.width, canvas.height );
|
|
108
|
-
|
|
109
120
|
if ( color !== undefined ) {
|
|
110
121
|
|
|
111
122
|
const hex = parseInt( color, 16 );
|
|
@@ -114,7 +125,6 @@
|
|
|
114
125
|
const b = ( hex & 255 ) / 255;
|
|
115
126
|
const imagedata = context.getImageData( 0, 0, canvas.width, canvas.height );
|
|
116
127
|
const data = imagedata.data;
|
|
117
|
-
|
|
118
128
|
for ( let i = 0; i < data.length; i += 4 ) {
|
|
119
129
|
|
|
120
130
|
data[ i + 0 ] = data[ i + 0 ] * r;
|
|
@@ -131,11 +141,11 @@
|
|
|
131
141
|
|
|
132
142
|
}
|
|
133
143
|
|
|
134
|
-
}
|
|
144
|
+
}
|
|
135
145
|
|
|
146
|
+
//
|
|
136
147
|
|
|
137
148
|
const PRECISION = 7;
|
|
138
|
-
|
|
139
149
|
function buildHeader() {
|
|
140
150
|
|
|
141
151
|
return `#usda 1.0
|
|
@@ -147,6 +157,40 @@
|
|
|
147
157
|
upAxis = "Y"
|
|
148
158
|
)
|
|
149
159
|
|
|
160
|
+
`;
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function buildSceneStart( options ) {
|
|
165
|
+
|
|
166
|
+
return `def Xform "Root"
|
|
167
|
+
{
|
|
168
|
+
def Scope "Scenes" (
|
|
169
|
+
kind = "sceneLibrary"
|
|
170
|
+
)
|
|
171
|
+
{
|
|
172
|
+
def Xform "Scene" (
|
|
173
|
+
customData = {
|
|
174
|
+
bool preliminary_collidesWithEnvironment = 0
|
|
175
|
+
string sceneName = "Scene"
|
|
176
|
+
}
|
|
177
|
+
sceneName = "Scene"
|
|
178
|
+
)
|
|
179
|
+
{
|
|
180
|
+
token preliminary:anchoring:type = "${options.ar.anchoring.type}"
|
|
181
|
+
token preliminary:planeAnchoring:alignment = "${options.ar.planeAnchoring.alignment}"
|
|
182
|
+
|
|
183
|
+
`;
|
|
184
|
+
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function buildSceneEnd() {
|
|
188
|
+
|
|
189
|
+
return `
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
150
194
|
`;
|
|
151
195
|
|
|
152
196
|
}
|
|
@@ -157,14 +201,14 @@
|
|
|
157
201
|
output += dataToInsert;
|
|
158
202
|
return fflate.strToU8( output );
|
|
159
203
|
|
|
160
|
-
}
|
|
204
|
+
}
|
|
161
205
|
|
|
206
|
+
// Xform
|
|
162
207
|
|
|
163
208
|
function buildXform( object, geometry, material ) {
|
|
164
209
|
|
|
165
210
|
const name = 'Object_' + object.id;
|
|
166
211
|
const transform = buildMatrix( object.matrixWorld );
|
|
167
|
-
|
|
168
212
|
if ( object.matrixWorld.determinant() < 0 ) {
|
|
169
213
|
|
|
170
214
|
console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', object );
|
|
@@ -196,8 +240,9 @@
|
|
|
196
240
|
|
|
197
241
|
return `(${array[ offset + 0 ]}, ${array[ offset + 1 ]}, ${array[ offset + 2 ]}, ${array[ offset + 3 ]})`;
|
|
198
242
|
|
|
199
|
-
}
|
|
243
|
+
}
|
|
200
244
|
|
|
245
|
+
// Mesh
|
|
201
246
|
|
|
202
247
|
function buildMeshObject( geometry ) {
|
|
203
248
|
|
|
@@ -245,7 +290,6 @@ def "Geometry"
|
|
|
245
290
|
|
|
246
291
|
const index = geometry.index;
|
|
247
292
|
const array = [];
|
|
248
|
-
|
|
249
293
|
if ( index !== null ) {
|
|
250
294
|
|
|
251
295
|
for ( let i = 0; i < index.count; i ++ ) {
|
|
@@ -257,7 +301,6 @@ def "Geometry"
|
|
|
257
301
|
} else {
|
|
258
302
|
|
|
259
303
|
const length = geometry.attributes.position.count;
|
|
260
|
-
|
|
261
304
|
for ( let i = 0; i < length; i ++ ) {
|
|
262
305
|
|
|
263
306
|
array.push( i );
|
|
@@ -280,7 +323,6 @@ def "Geometry"
|
|
|
280
323
|
}
|
|
281
324
|
|
|
282
325
|
const array = [];
|
|
283
|
-
|
|
284
326
|
for ( let i = 0; i < attribute.count; i ++ ) {
|
|
285
327
|
|
|
286
328
|
const x = attribute.getX( i );
|
|
@@ -304,7 +346,6 @@ def "Geometry"
|
|
|
304
346
|
}
|
|
305
347
|
|
|
306
348
|
const array = [];
|
|
307
|
-
|
|
308
349
|
for ( let i = 0; i < attribute.count; i ++ ) {
|
|
309
350
|
|
|
310
351
|
const x = attribute.getX( i );
|
|
@@ -315,13 +356,13 @@ def "Geometry"
|
|
|
315
356
|
|
|
316
357
|
return array.join( ', ' );
|
|
317
358
|
|
|
318
|
-
}
|
|
359
|
+
}
|
|
319
360
|
|
|
361
|
+
// Materials
|
|
320
362
|
|
|
321
363
|
function buildMaterials( materials, textures ) {
|
|
322
364
|
|
|
323
365
|
const array = [];
|
|
324
|
-
|
|
325
366
|
for ( const uuid in materials ) {
|
|
326
367
|
|
|
327
368
|
const material = materials[ uuid ];
|
|
@@ -341,10 +382,10 @@ ${array.join( '' )}
|
|
|
341
382
|
function buildMaterial( material, textures ) {
|
|
342
383
|
|
|
343
384
|
// https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html
|
|
385
|
+
|
|
344
386
|
const pad = ' ';
|
|
345
387
|
const inputs = [];
|
|
346
388
|
const samplers = [];
|
|
347
|
-
|
|
348
389
|
function buildTexture( texture, mapType, color ) {
|
|
349
390
|
|
|
350
391
|
const id = texture.id + ( color ? '_' + color.getHexString() : '' );
|
|
@@ -389,7 +430,6 @@ ${array.join( '' )}
|
|
|
389
430
|
if ( material.map !== null ) {
|
|
390
431
|
|
|
391
432
|
inputs.push( `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>` );
|
|
392
|
-
|
|
393
433
|
if ( material.transparent ) {
|
|
394
434
|
|
|
395
435
|
inputs.push( `${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>` );
|
|
@@ -517,6 +557,52 @@ ${samplers.join( '\n' )}
|
|
|
517
557
|
|
|
518
558
|
}
|
|
519
559
|
|
|
560
|
+
function buildCamera( camera ) {
|
|
561
|
+
|
|
562
|
+
const name = camera.name ? camera.name : 'Camera_' + camera.id;
|
|
563
|
+
const transform = buildMatrix( camera.matrixWorld );
|
|
564
|
+
if ( camera.matrixWorld.determinant() < 0 ) {
|
|
565
|
+
|
|
566
|
+
console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', camera );
|
|
567
|
+
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
if ( camera.isOrthographicCamera ) {
|
|
571
|
+
|
|
572
|
+
return `def Camera "${name}"
|
|
573
|
+
{
|
|
574
|
+
matrix4d xformOp:transform = ${transform}
|
|
575
|
+
uniform token[] xformOpOrder = ["xformOp:transform"]
|
|
576
|
+
|
|
577
|
+
float2 clippingRange = (${camera.near.toPrecision( PRECISION )}, ${camera.far.toPrecision( PRECISION )})
|
|
578
|
+
float horizontalAperture = ${( ( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10 ).toPrecision( PRECISION )}
|
|
579
|
+
float verticalAperture = ${( ( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10 ).toPrecision( PRECISION )}
|
|
580
|
+
token projection = "orthographic"
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
`;
|
|
584
|
+
|
|
585
|
+
} else {
|
|
586
|
+
|
|
587
|
+
return `def Camera "${name}"
|
|
588
|
+
{
|
|
589
|
+
matrix4d xformOp:transform = ${transform}
|
|
590
|
+
uniform token[] xformOpOrder = ["xformOp:transform"]
|
|
591
|
+
|
|
592
|
+
float2 clippingRange = (${camera.near.toPrecision( PRECISION )}, ${camera.far.toPrecision( PRECISION )})
|
|
593
|
+
float focalLength = ${camera.getFocalLength().toPrecision( PRECISION )}
|
|
594
|
+
float focusDistance = ${camera.focus.toPrecision( PRECISION )}
|
|
595
|
+
float horizontalAperture = ${camera.getFilmWidth().toPrecision( PRECISION )}
|
|
596
|
+
token projection = "perspective"
|
|
597
|
+
float verticalAperture = ${camera.getFilmHeight().toPrecision( PRECISION )}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
`;
|
|
601
|
+
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
}
|
|
605
|
+
|
|
520
606
|
THREE.USDZExporter = USDZExporter;
|
|
521
607
|
|
|
522
608
|
} )();
|
|
@@ -4,25 +4,29 @@
|
|
|
4
4
|
|
|
5
5
|
constructor( points = [] ) {
|
|
6
6
|
|
|
7
|
-
super();
|
|
7
|
+
super();
|
|
8
|
+
|
|
9
|
+
// buffers
|
|
8
10
|
|
|
9
11
|
const vertices = [];
|
|
10
12
|
const normals = [];
|
|
11
|
-
|
|
12
13
|
if ( THREE.ConvexHull === undefined ) {
|
|
13
14
|
|
|
14
15
|
console.error( 'THREE.ConvexGeometry: ConvexGeometry relies on THREE.ConvexHull' );
|
|
15
16
|
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
const convexHull = new THREE.ConvexHull().setFromPoints( points );
|
|
19
|
+
const convexHull = new THREE.ConvexHull().setFromPoints( points );
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
// generate vertices and normals
|
|
21
22
|
|
|
23
|
+
const faces = convexHull.faces;
|
|
22
24
|
for ( let i = 0; i < faces.length; i ++ ) {
|
|
23
25
|
|
|
24
26
|
const face = faces[ i ];
|
|
25
|
-
let edge = face.edge;
|
|
27
|
+
let edge = face.edge;
|
|
28
|
+
|
|
29
|
+
// we move along a doubly-connected edge list to access all face points (see HalfEdge docs)
|
|
26
30
|
|
|
27
31
|
do {
|
|
28
32
|
|
|
@@ -33,8 +37,9 @@
|
|
|
33
37
|
|
|
34
38
|
} while ( edge !== face.edge );
|
|
35
39
|
|
|
36
|
-
}
|
|
40
|
+
}
|
|
37
41
|
|
|
42
|
+
// build geometry
|
|
38
43
|
|
|
39
44
|
this.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );
|
|
40
45
|
this.setAttribute( 'normal', new THREE.Float32BufferAttribute( normals, 3 ) );
|
|
@@ -19,35 +19,48 @@
|
|
|
19
19
|
|
|
20
20
|
constructor( mesh, position, orientation, size ) {
|
|
21
21
|
|
|
22
|
-
super();
|
|
22
|
+
super();
|
|
23
|
+
|
|
24
|
+
// buffers
|
|
23
25
|
|
|
24
26
|
const vertices = [];
|
|
25
27
|
const normals = [];
|
|
26
|
-
const uvs = [];
|
|
28
|
+
const uvs = [];
|
|
29
|
+
|
|
30
|
+
// helpers
|
|
27
31
|
|
|
28
|
-
const plane = new THREE.Vector3();
|
|
32
|
+
const plane = new THREE.Vector3();
|
|
33
|
+
|
|
34
|
+
// this matrix represents the transformation of the decal projector
|
|
29
35
|
|
|
30
36
|
const projectorMatrix = new THREE.Matrix4();
|
|
31
37
|
projectorMatrix.makeRotationFromEuler( orientation );
|
|
32
38
|
projectorMatrix.setPosition( position );
|
|
33
39
|
const projectorMatrixInverse = new THREE.Matrix4();
|
|
34
|
-
projectorMatrixInverse.copy( projectorMatrix ).invert();
|
|
40
|
+
projectorMatrixInverse.copy( projectorMatrix ).invert();
|
|
41
|
+
|
|
42
|
+
// generate buffers
|
|
35
43
|
|
|
36
|
-
generate();
|
|
44
|
+
generate();
|
|
45
|
+
|
|
46
|
+
// build geometry
|
|
37
47
|
|
|
38
48
|
this.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );
|
|
39
49
|
this.setAttribute( 'normal', new THREE.Float32BufferAttribute( normals, 3 ) );
|
|
40
50
|
this.setAttribute( 'uv', new THREE.Float32BufferAttribute( uvs, 2 ) );
|
|
41
|
-
|
|
42
51
|
function generate() {
|
|
43
52
|
|
|
44
53
|
let decalVertices = [];
|
|
45
54
|
const vertex = new THREE.Vector3();
|
|
46
|
-
const normal = new THREE.Vector3();
|
|
55
|
+
const normal = new THREE.Vector3();
|
|
56
|
+
|
|
57
|
+
// handle different geometry types
|
|
47
58
|
|
|
48
59
|
const geometry = mesh.geometry;
|
|
49
60
|
const positionAttribute = geometry.attributes.position;
|
|
50
|
-
const normalAttribute = geometry.attributes.normal;
|
|
61
|
+
const normalAttribute = geometry.attributes.normal;
|
|
62
|
+
|
|
63
|
+
// first, create an array of 'DecalVertex' objects
|
|
51
64
|
// three consecutive 'DecalVertex' objects represent a single face
|
|
52
65
|
//
|
|
53
66
|
// this data structure will be later used to perform the clipping
|
|
@@ -55,8 +68,8 @@
|
|
|
55
68
|
if ( geometry.index !== null ) {
|
|
56
69
|
|
|
57
70
|
// indexed THREE.BufferGeometry
|
|
58
|
-
const index = geometry.index;
|
|
59
71
|
|
|
72
|
+
const index = geometry.index;
|
|
60
73
|
for ( let i = 0; i < index.count; i ++ ) {
|
|
61
74
|
|
|
62
75
|
vertex.fromBufferAttribute( positionAttribute, index.getX( i ) );
|
|
@@ -68,6 +81,7 @@
|
|
|
68
81
|
} else {
|
|
69
82
|
|
|
70
83
|
// non-indexed THREE.BufferGeometry
|
|
84
|
+
|
|
71
85
|
for ( let i = 0; i < positionAttribute.count; i ++ ) {
|
|
72
86
|
|
|
73
87
|
vertex.fromBufferAttribute( positionAttribute, i );
|
|
@@ -76,23 +90,32 @@
|
|
|
76
90
|
|
|
77
91
|
}
|
|
78
92
|
|
|
79
|
-
}
|
|
93
|
+
}
|
|
80
94
|
|
|
95
|
+
// second, clip the geometry so that it doesn't extend out from the projector
|
|
81
96
|
|
|
82
97
|
decalVertices = clipGeometry( decalVertices, plane.set( 1, 0, 0 ) );
|
|
83
98
|
decalVertices = clipGeometry( decalVertices, plane.set( - 1, 0, 0 ) );
|
|
84
99
|
decalVertices = clipGeometry( decalVertices, plane.set( 0, 1, 0 ) );
|
|
85
100
|
decalVertices = clipGeometry( decalVertices, plane.set( 0, - 1, 0 ) );
|
|
86
101
|
decalVertices = clipGeometry( decalVertices, plane.set( 0, 0, 1 ) );
|
|
87
|
-
decalVertices = clipGeometry( decalVertices, plane.set( 0, 0, - 1 ) );
|
|
102
|
+
decalVertices = clipGeometry( decalVertices, plane.set( 0, 0, - 1 ) );
|
|
103
|
+
|
|
104
|
+
// third, generate final vertices, normals and uvs
|
|
88
105
|
|
|
89
106
|
for ( let i = 0; i < decalVertices.length; i ++ ) {
|
|
90
107
|
|
|
91
|
-
const decalVertex = decalVertices[ i ];
|
|
108
|
+
const decalVertex = decalVertices[ i ];
|
|
109
|
+
|
|
110
|
+
// create texture coordinates (we are still in projector space)
|
|
92
111
|
|
|
93
|
-
uvs.push( 0.5 + decalVertex.position.x / size.x, 0.5 + decalVertex.position.y / size.y );
|
|
112
|
+
uvs.push( 0.5 + decalVertex.position.x / size.x, 0.5 + decalVertex.position.y / size.y );
|
|
94
113
|
|
|
95
|
-
|
|
114
|
+
// transform the vertex back to world space
|
|
115
|
+
|
|
116
|
+
decalVertex.position.applyMatrix4( projectorMatrix );
|
|
117
|
+
|
|
118
|
+
// now create vertex and normal buffer data
|
|
96
119
|
|
|
97
120
|
vertices.push( decalVertex.position.x, decalVertex.position.y, decalVertex.position.z );
|
|
98
121
|
normals.push( decalVertex.normal.x, decalVertex.normal.y, decalVertex.normal.z );
|
|
@@ -104,6 +127,7 @@
|
|
|
104
127
|
function pushDecalVertex( decalVertices, vertex, normal ) {
|
|
105
128
|
|
|
106
129
|
// transform the vertex to world space, then to projector space
|
|
130
|
+
|
|
107
131
|
vertex.applyMatrix4( mesh.matrixWorld );
|
|
108
132
|
vertex.applyMatrix4( projectorMatrixInverse );
|
|
109
133
|
normal.transformDirection( mesh.matrixWorld );
|
|
@@ -114,7 +138,9 @@
|
|
|
114
138
|
function clipGeometry( inVertices, plane ) {
|
|
115
139
|
|
|
116
140
|
const outVertices = [];
|
|
117
|
-
const s = 0.5 * Math.abs( size.dot( plane ) );
|
|
141
|
+
const s = 0.5 * Math.abs( size.dot( plane ) );
|
|
142
|
+
|
|
143
|
+
// a single iteration clips one face,
|
|
118
144
|
// which consists of three consecutive 'DecalVertex' objects
|
|
119
145
|
|
|
120
146
|
for ( let i = 0; i < inVertices.length; i += 3 ) {
|
|
@@ -129,16 +155,18 @@
|
|
|
129
155
|
const d3 = inVertices[ i + 2 ].position.dot( plane ) - s;
|
|
130
156
|
const v1Out = d1 > 0;
|
|
131
157
|
const v2Out = d2 > 0;
|
|
132
|
-
const v3Out = d3 > 0;
|
|
158
|
+
const v3Out = d3 > 0;
|
|
133
159
|
|
|
134
|
-
|
|
160
|
+
// calculate, how many vertices of the face lie outside of the clipping plane
|
|
135
161
|
|
|
162
|
+
total = ( v1Out ? 1 : 0 ) + ( v2Out ? 1 : 0 ) + ( v3Out ? 1 : 0 );
|
|
136
163
|
switch ( total ) {
|
|
137
164
|
|
|
138
165
|
case 0:
|
|
139
166
|
{
|
|
140
167
|
|
|
141
168
|
// the entire face lies inside of the plane, no clipping needed
|
|
169
|
+
|
|
142
170
|
outVertices.push( inVertices[ i ] );
|
|
143
171
|
outVertices.push( inVertices[ i + 1 ] );
|
|
144
172
|
outVertices.push( inVertices[ i + 2 ] );
|
|
@@ -150,6 +178,7 @@
|
|
|
150
178
|
{
|
|
151
179
|
|
|
152
180
|
// one vertex lies outside of the plane, perform clipping
|
|
181
|
+
|
|
153
182
|
if ( v1Out ) {
|
|
154
183
|
|
|
155
184
|
nV1 = inVertices[ i + 1 ];
|
|
@@ -198,6 +227,7 @@
|
|
|
198
227
|
{
|
|
199
228
|
|
|
200
229
|
// two vertices lies outside of the plane, perform clipping
|
|
230
|
+
|
|
201
231
|
if ( ! v1Out ) {
|
|
202
232
|
|
|
203
233
|
nV1 = inVertices[ i ].clone();
|
|
@@ -239,6 +269,7 @@
|
|
|
239
269
|
{
|
|
240
270
|
|
|
241
271
|
// the entire face lies outside of the plane, so let's discard the corresponding vertices
|
|
272
|
+
|
|
242
273
|
break;
|
|
243
274
|
|
|
244
275
|
}
|
|
@@ -256,7 +287,9 @@
|
|
|
256
287
|
const d0 = v0.position.dot( p ) - s;
|
|
257
288
|
const d1 = v1.position.dot( p ) - s;
|
|
258
289
|
const s0 = d0 / ( d0 - d1 );
|
|
259
|
-
const v = new DecalVertex( new THREE.Vector3( v0.position.x + s0 * ( v1.position.x - v0.position.x ), v0.position.y + s0 * ( v1.position.y - v0.position.y ), v0.position.z + s0 * ( v1.position.z - v0.position.z ) ), new THREE.Vector3( v0.normal.x + s0 * ( v1.normal.x - v0.normal.x ), v0.normal.y + s0 * ( v1.normal.y - v0.normal.y ), v0.normal.z + s0 * ( v1.normal.z - v0.normal.z ) ) );
|
|
290
|
+
const v = new DecalVertex( new THREE.Vector3( v0.position.x + s0 * ( v1.position.x - v0.position.x ), v0.position.y + s0 * ( v1.position.y - v0.position.y ), v0.position.z + s0 * ( v1.position.z - v0.position.z ) ), new THREE.Vector3( v0.normal.x + s0 * ( v1.normal.x - v0.normal.x ), v0.normal.y + s0 * ( v1.normal.y - v0.normal.y ), v0.normal.z + s0 * ( v1.normal.z - v0.normal.z ) ) );
|
|
291
|
+
|
|
292
|
+
// need to clip more values (texture coordinates)? do it this way:
|
|
260
293
|
// intersectpoint.value = a.value + s * ( b.value - a.value );
|
|
261
294
|
|
|
262
295
|
return v;
|
|
@@ -265,8 +298,9 @@
|
|
|
265
298
|
|
|
266
299
|
}
|
|
267
300
|
|
|
268
|
-
}
|
|
301
|
+
}
|
|
269
302
|
|
|
303
|
+
// helper
|
|
270
304
|
|
|
271
305
|
class DecalVertex {
|
|
272
306
|
|
|
@@ -276,7 +310,6 @@
|
|
|
276
310
|
this.normal = normal;
|
|
277
311
|
|
|
278
312
|
}
|
|
279
|
-
|
|
280
313
|
clone() {
|
|
281
314
|
|
|
282
315
|
return new this.constructor( this.position.clone(), this.normal.clone() );
|