three-stdlib 2.35.4 → 2.35.5
Sign up to get free protection for your applications and to get access to all the features.
- package/_polyfill/CapsuleGeometry.cjs +17 -20
- package/_polyfill/CapsuleGeometry.cjs.map +1 -1
- package/_polyfill/CapsuleGeometry.js +17 -20
- package/_polyfill/CapsuleGeometry.js.map +1 -1
- package/_polyfill/constants.cjs +1 -1
- package/_polyfill/constants.cjs.map +1 -1
- package/_polyfill/constants.js +1 -1
- package/_polyfill/constants.js.map +1 -1
- package/animation/AnimationClipCreator.cjs +13 -13
- package/animation/AnimationClipCreator.cjs.map +1 -1
- package/animation/AnimationClipCreator.js +13 -13
- package/animation/AnimationClipCreator.js.map +1 -1
- package/animation/CCDIKSolver.cjs +11 -11
- package/animation/CCDIKSolver.cjs.map +1 -1
- package/animation/CCDIKSolver.js +12 -12
- package/animation/CCDIKSolver.js.map +1 -1
- package/animation/MMDAnimationHelper.cjs +1 -1
- package/animation/MMDAnimationHelper.cjs.map +1 -1
- package/animation/MMDAnimationHelper.js +1 -1
- package/animation/MMDAnimationHelper.js.map +1 -1
- package/animation/MMDPhysics.cjs +4 -4
- package/animation/MMDPhysics.cjs.map +1 -1
- package/animation/MMDPhysics.js +4 -4
- package/animation/MMDPhysics.js.map +1 -1
- package/controls/ArcballControls.cjs +2 -2
- package/controls/ArcballControls.cjs.map +1 -1
- package/controls/ArcballControls.js +3 -3
- package/controls/ArcballControls.js.map +1 -1
- package/controls/FirstPersonControls.cjs +1 -1
- package/controls/FirstPersonControls.cjs.map +1 -1
- package/controls/FirstPersonControls.js +1 -1
- package/controls/FirstPersonControls.js.map +1 -1
- package/controls/OrbitControls.cjs +2 -2
- package/controls/OrbitControls.cjs.map +1 -1
- package/controls/OrbitControls.js +3 -3
- package/controls/OrbitControls.js.map +1 -1
- package/controls/PointerLockControls.cjs +2 -2
- package/controls/PointerLockControls.cjs.map +1 -1
- package/controls/PointerLockControls.js +3 -3
- package/controls/PointerLockControls.js.map +1 -1
- package/csm/CSM.cjs +4 -4
- package/csm/CSM.cjs.map +1 -1
- package/csm/CSM.js +5 -5
- package/csm/CSM.js.map +1 -1
- package/csm/CSMFrustum.cjs +1 -1
- package/csm/CSMFrustum.cjs.map +1 -1
- package/csm/CSMFrustum.js +2 -2
- package/csm/CSMFrustum.js.map +1 -1
- package/deprecated/Geometry.cjs +715 -722
- package/deprecated/Geometry.cjs.map +1 -1
- package/deprecated/Geometry.js +716 -723
- package/deprecated/Geometry.js.map +1 -1
- package/effects/AnaglyphEffect.cjs +1 -2
- package/effects/AnaglyphEffect.cjs.map +1 -1
- package/effects/AnaglyphEffect.js +2 -3
- package/effects/AnaglyphEffect.js.map +1 -1
- package/effects/OutlineEffect.cjs +1 -2
- package/effects/OutlineEffect.cjs.map +1 -1
- package/effects/OutlineEffect.js +2 -3
- package/effects/OutlineEffect.js.map +1 -1
- package/effects/ParallaxBarrierEffect.cjs +1 -2
- package/effects/ParallaxBarrierEffect.cjs.map +1 -1
- package/effects/ParallaxBarrierEffect.js +2 -3
- package/effects/ParallaxBarrierEffect.js.map +1 -1
- package/exporters/DRACOExporter.cjs +122 -133
- package/exporters/DRACOExporter.cjs.map +1 -1
- package/exporters/DRACOExporter.d.ts +21 -23
- package/exporters/DRACOExporter.js +122 -133
- package/exporters/DRACOExporter.js.map +1 -1
- package/exporters/GLTFExporter.cjs +167 -170
- package/exporters/GLTFExporter.cjs.map +1 -1
- package/exporters/GLTFExporter.js +167 -170
- package/exporters/GLTFExporter.js.map +1 -1
- package/geometries/LightningStrike.cjs +515 -524
- package/geometries/LightningStrike.cjs.map +1 -1
- package/geometries/LightningStrike.js +515 -524
- package/geometries/LightningStrike.js.map +1 -1
- package/geometries/RoundedBoxGeometry.cjs +1 -1
- package/geometries/RoundedBoxGeometry.cjs.map +1 -1
- package/geometries/RoundedBoxGeometry.js +2 -2
- package/geometries/RoundedBoxGeometry.js.map +1 -1
- package/helpers/RaycasterHelper.cjs +2 -2
- package/helpers/RaycasterHelper.cjs.map +1 -1
- package/helpers/RaycasterHelper.js +3 -3
- package/helpers/RaycasterHelper.js.map +1 -1
- package/helpers/VertexNormalsHelper.cjs +3 -3
- package/helpers/VertexNormalsHelper.cjs.map +1 -1
- package/helpers/VertexNormalsHelper.js +4 -4
- package/helpers/VertexNormalsHelper.js.map +1 -1
- package/helpers/VertexTangentsHelper.cjs +2 -2
- package/helpers/VertexTangentsHelper.cjs.map +1 -1
- package/helpers/VertexTangentsHelper.js +3 -3
- package/helpers/VertexTangentsHelper.js.map +1 -1
- package/interactive/InteractiveGroup.cjs +1 -1
- package/interactive/InteractiveGroup.cjs.map +1 -1
- package/interactive/InteractiveGroup.js +2 -2
- package/interactive/InteractiveGroup.js.map +1 -1
- package/interactive/SelectionBox.cjs +15 -15
- package/interactive/SelectionBox.cjs.map +1 -1
- package/interactive/SelectionBox.js +16 -16
- package/interactive/SelectionBox.js.map +1 -1
- package/libs/chevrotain.cjs +1 -1
- package/libs/chevrotain.cjs.map +1 -1
- package/libs/chevrotain.js +1 -1
- package/libs/chevrotain.js.map +1 -1
- package/libs/lottie.cjs +1 -1
- package/libs/lottie.cjs.map +1 -1
- package/libs/lottie.js +1 -1
- package/libs/lottie.js.map +1 -1
- package/libs/opentype.cjs +1 -1
- package/libs/opentype.cjs.map +1 -1
- package/libs/opentype.js +1 -1
- package/libs/opentype.js.map +1 -1
- package/lights/LightProbeGenerator.cjs +5 -5
- package/lights/LightProbeGenerator.cjs.map +1 -1
- package/lights/LightProbeGenerator.js +5 -5
- package/lights/LightProbeGenerator.js.map +1 -1
- package/lights/RectAreaLightUniformsLib.cjs +3 -3
- package/lights/RectAreaLightUniformsLib.cjs.map +1 -1
- package/lights/RectAreaLightUniformsLib.js +3 -3
- package/lights/RectAreaLightUniformsLib.js.map +1 -1
- package/lines/LineMaterial.cjs +1 -2
- package/lines/LineMaterial.cjs.map +1 -1
- package/lines/LineMaterial.js +2 -3
- package/lines/LineMaterial.js.map +1 -1
- package/lines/LineSegments2.cjs +13 -13
- package/lines/LineSegments2.cjs.map +1 -1
- package/lines/LineSegments2.js +14 -14
- package/lines/LineSegments2.js.map +1 -1
- package/lines/LineSegmentsGeometry.cjs +2 -2
- package/lines/LineSegmentsGeometry.cjs.map +1 -1
- package/lines/LineSegmentsGeometry.js +3 -3
- package/lines/LineSegmentsGeometry.js.map +1 -1
- package/lines/Wireframe.cjs +3 -3
- package/lines/Wireframe.cjs.map +1 -1
- package/lines/Wireframe.js +4 -4
- package/lines/Wireframe.js.map +1 -1
- package/loaders/BasisTextureLoader.cjs +435 -441
- package/loaders/BasisTextureLoader.cjs.map +1 -1
- package/loaders/BasisTextureLoader.js +435 -441
- package/loaders/BasisTextureLoader.js.map +1 -1
- package/loaders/EXRLoader.cjs +1 -2
- package/loaders/EXRLoader.cjs.map +1 -1
- package/loaders/EXRLoader.js +2 -3
- package/loaders/EXRLoader.js.map +1 -1
- package/loaders/FBXLoader.cjs +2 -2
- package/loaders/FBXLoader.cjs.map +1 -1
- package/loaders/FBXLoader.js +2 -2
- package/loaders/FBXLoader.js.map +1 -1
- package/loaders/FontLoader.cjs +2 -2
- package/loaders/FontLoader.cjs.map +1 -1
- package/loaders/FontLoader.d.ts +2 -2
- package/loaders/FontLoader.js +2 -2
- package/loaders/FontLoader.js.map +1 -1
- package/loaders/GLTFLoader.cjs +2 -2
- package/loaders/GLTFLoader.cjs.map +1 -1
- package/loaders/GLTFLoader.js +2 -2
- package/loaders/GLTFLoader.js.map +1 -1
- package/loaders/KTX2Loader.cjs +374 -377
- package/loaders/KTX2Loader.cjs.map +1 -1
- package/loaders/KTX2Loader.js +374 -377
- package/loaders/KTX2Loader.js.map +1 -1
- package/loaders/LDrawLoader.cjs +4 -5
- package/loaders/LDrawLoader.cjs.map +1 -1
- package/loaders/LDrawLoader.js +5 -6
- package/loaders/LDrawLoader.js.map +1 -1
- package/loaders/OBJLoader.cjs +5 -5
- package/loaders/OBJLoader.cjs.map +1 -1
- package/loaders/OBJLoader.js +6 -6
- package/loaders/OBJLoader.js.map +1 -1
- package/loaders/PRWMLoader.cjs +43 -46
- package/loaders/PRWMLoader.cjs.map +1 -1
- package/loaders/PRWMLoader.js +43 -46
- package/loaders/PRWMLoader.js.map +1 -1
- package/loaders/SVGLoader.cjs +1688 -1694
- package/loaders/SVGLoader.cjs.map +1 -1
- package/loaders/SVGLoader.js +1688 -1694
- package/loaders/SVGLoader.js.map +1 -1
- package/loaders/XLoader.cjs +1 -1
- package/loaders/XLoader.cjs.map +1 -1
- package/loaders/XLoader.js +1 -1
- package/loaders/XLoader.js.map +1 -1
- package/math/Capsule.cjs +3 -3
- package/math/Capsule.cjs.map +1 -1
- package/math/Capsule.js +3 -3
- package/math/Capsule.js.map +1 -1
- package/math/ColorConverter.cjs +9 -9
- package/math/ColorConverter.cjs.map +1 -1
- package/math/ColorConverter.js +9 -9
- package/math/ColorConverter.js.map +1 -1
- package/math/ConvexHull.cjs +50 -53
- package/math/ConvexHull.cjs.map +1 -1
- package/math/ConvexHull.js +50 -53
- package/math/ConvexHull.js.map +1 -1
- package/math/ImprovedNoise.cjs +1 -1
- package/math/ImprovedNoise.cjs.map +1 -1
- package/math/ImprovedNoise.js +1 -1
- package/math/ImprovedNoise.js.map +1 -1
- package/math/MeshSurfaceSampler.cjs +2 -2
- package/math/MeshSurfaceSampler.cjs.map +1 -1
- package/math/MeshSurfaceSampler.js +2 -2
- package/math/MeshSurfaceSampler.js.map +1 -1
- package/math/OBB.cjs +14 -14
- package/math/OBB.cjs.map +1 -1
- package/math/OBB.js +15 -15
- package/math/OBB.js.map +1 -1
- package/math/Octree.cjs +7 -7
- package/math/Octree.cjs.map +1 -1
- package/math/Octree.js +8 -8
- package/math/Octree.js.map +1 -1
- package/misc/ConvexObjectBreaker.cjs +268 -271
- package/misc/ConvexObjectBreaker.cjs.map +1 -1
- package/misc/ConvexObjectBreaker.js +269 -272
- package/misc/ConvexObjectBreaker.js.map +1 -1
- package/misc/Gyroscope.cjs +6 -6
- package/misc/Gyroscope.cjs.map +1 -1
- package/misc/Gyroscope.js +7 -7
- package/misc/Gyroscope.js.map +1 -1
- package/modifiers/CurveModifier.cjs +1 -1
- package/modifiers/CurveModifier.cjs.map +1 -1
- package/modifiers/CurveModifier.js +2 -2
- package/modifiers/CurveModifier.js.map +1 -1
- package/modifiers/SimplifyModifier.cjs +2 -2
- package/modifiers/SimplifyModifier.cjs.map +1 -1
- package/modifiers/SimplifyModifier.js +2 -2
- package/modifiers/SimplifyModifier.js.map +1 -1
- package/objects/BatchedMesh.cjs +2 -2
- package/objects/BatchedMesh.cjs.map +1 -1
- package/objects/BatchedMesh.js +3 -3
- package/objects/BatchedMesh.js.map +1 -1
- package/objects/GroundProjectedEnv.cjs +1 -2
- package/objects/GroundProjectedEnv.cjs.map +1 -1
- package/objects/GroundProjectedEnv.js +2 -3
- package/objects/GroundProjectedEnv.js.map +1 -1
- package/objects/Lensflare.cjs +206 -209
- package/objects/Lensflare.cjs.map +1 -1
- package/objects/Lensflare.js +206 -209
- package/objects/Lensflare.js.map +1 -1
- package/objects/Reflector.cjs +146 -154
- package/objects/Reflector.cjs.map +1 -1
- package/objects/Reflector.js +146 -154
- package/objects/Reflector.js.map +1 -1
- package/objects/ReflectorForSSRPass.cjs +180 -183
- package/objects/ReflectorForSSRPass.cjs.map +1 -1
- package/objects/ReflectorForSSRPass.js +180 -183
- package/objects/ReflectorForSSRPass.js.map +1 -1
- package/objects/Refractor.cjs +161 -164
- package/objects/Refractor.cjs.map +1 -1
- package/objects/Refractor.js +161 -164
- package/objects/Refractor.js.map +1 -1
- package/objects/ShadowMesh.cjs +1 -1
- package/objects/ShadowMesh.cjs.map +1 -1
- package/objects/ShadowMesh.js +2 -2
- package/objects/ShadowMesh.js.map +1 -1
- package/objects/Sky.cjs +32 -35
- package/objects/Sky.cjs.map +1 -1
- package/objects/Sky.d.ts +6 -100
- package/objects/Sky.js +32 -35
- package/objects/Sky.js.map +1 -1
- package/objects/Water.cjs +1 -2
- package/objects/Water.cjs.map +1 -1
- package/objects/Water.js +2 -3
- package/objects/Water.js.map +1 -1
- package/objects/Water2.cjs +140 -143
- package/objects/Water2.cjs.map +1 -1
- package/objects/Water2.js +140 -143
- package/objects/Water2.js.map +1 -1
- package/package.json +1 -1
- package/postprocessing/SAOPass.cjs +264 -267
- package/postprocessing/SAOPass.cjs.map +1 -1
- package/postprocessing/SAOPass.js +264 -267
- package/postprocessing/SAOPass.js.map +1 -1
- package/postprocessing/SSAOPass.cjs +250 -253
- package/postprocessing/SSAOPass.cjs.map +1 -1
- package/postprocessing/SSAOPass.js +250 -253
- package/postprocessing/SSAOPass.js.map +1 -1
- package/postprocessing/SSRPass.cjs +376 -379
- package/postprocessing/SSRPass.cjs.map +1 -1
- package/postprocessing/SSRPass.js +376 -379
- package/postprocessing/SSRPass.js.map +1 -1
- package/postprocessing/UnrealBloomPass.cjs +202 -205
- package/postprocessing/UnrealBloomPass.cjs.map +1 -1
- package/postprocessing/UnrealBloomPass.js +202 -205
- package/postprocessing/UnrealBloomPass.js.map +1 -1
- package/renderers/CSS2DRenderer.cjs +5 -5
- package/renderers/CSS2DRenderer.cjs.map +1 -1
- package/renderers/CSS2DRenderer.js +5 -5
- package/renderers/CSS2DRenderer.js.map +1 -1
- package/renderers/CSS3DRenderer.cjs +5 -5
- package/renderers/CSS3DRenderer.cjs.map +1 -1
- package/renderers/CSS3DRenderer.js +6 -6
- package/renderers/CSS3DRenderer.js.map +1 -1
- package/shaders/ACESFilmicToneMappingShader.cjs +46 -71
- package/shaders/ACESFilmicToneMappingShader.cjs.map +1 -1
- package/shaders/ACESFilmicToneMappingShader.js +46 -71
- package/shaders/ACESFilmicToneMappingShader.js.map +1 -1
- package/shaders/AfterimageShader.cjs +22 -41
- package/shaders/AfterimageShader.cjs.map +1 -1
- package/shaders/AfterimageShader.js +22 -41
- package/shaders/AfterimageShader.js.map +1 -1
- package/shaders/BasicShader.cjs +6 -20
- package/shaders/BasicShader.cjs.map +1 -1
- package/shaders/BasicShader.js +6 -20
- package/shaders/BasicShader.js.map +1 -1
- package/shaders/BleachBypassShader.cjs +26 -46
- package/shaders/BleachBypassShader.cjs.map +1 -1
- package/shaders/BleachBypassShader.js +26 -46
- package/shaders/BleachBypassShader.js.map +1 -1
- package/shaders/BlendShader.cjs +19 -33
- package/shaders/BlendShader.cjs.map +1 -1
- package/shaders/BlendShader.js +19 -33
- package/shaders/BlendShader.js.map +1 -1
- package/shaders/BokehShader.cjs +90 -117
- package/shaders/BokehShader.cjs.map +1 -1
- package/shaders/BokehShader.js +90 -117
- package/shaders/BokehShader.js.map +1 -1
- package/shaders/BokehShader2.cjs +232 -333
- package/shaders/BokehShader2.cjs.map +1 -1
- package/shaders/BokehShader2.js +232 -333
- package/shaders/BokehShader2.js.map +1 -1
- package/shaders/BrightnessContrastShader.cjs +22 -38
- package/shaders/BrightnessContrastShader.cjs.map +1 -1
- package/shaders/BrightnessContrastShader.js +22 -38
- package/shaders/BrightnessContrastShader.js.map +1 -1
- package/shaders/ColorCorrectionShader.cjs +21 -35
- package/shaders/ColorCorrectionShader.cjs.map +1 -1
- package/shaders/ColorCorrectionShader.js +21 -35
- package/shaders/ColorCorrectionShader.js.map +1 -1
- package/shaders/ColorifyShader.cjs +19 -34
- package/shaders/ColorifyShader.cjs.map +1 -1
- package/shaders/ColorifyShader.js +19 -34
- package/shaders/ColorifyShader.js.map +1 -1
- package/shaders/ConvolutionShader.cjs +24 -43
- package/shaders/ConvolutionShader.cjs.map +1 -1
- package/shaders/ConvolutionShader.js +24 -43
- package/shaders/ConvolutionShader.js.map +1 -1
- package/shaders/CopyShader.cjs +16 -30
- package/shaders/CopyShader.cjs.map +1 -1
- package/shaders/CopyShader.js +16 -30
- package/shaders/CopyShader.js.map +1 -1
- package/shaders/DOFMipMapShader.cjs +21 -38
- package/shaders/DOFMipMapShader.cjs.map +1 -1
- package/shaders/DOFMipMapShader.js +21 -38
- package/shaders/DOFMipMapShader.js.map +1 -1
- package/shaders/DepthLimitedBlurShader.cjs +69 -98
- package/shaders/DepthLimitedBlurShader.cjs.map +1 -1
- package/shaders/DepthLimitedBlurShader.js +69 -98
- package/shaders/DepthLimitedBlurShader.js.map +1 -1
- package/shaders/DigitalGlitch.cjs +59 -70
- package/shaders/DigitalGlitch.cjs.map +1 -1
- package/shaders/DigitalGlitch.js +59 -70
- package/shaders/DigitalGlitch.js.map +1 -1
- package/shaders/DotScreenShader.cjs +28 -49
- package/shaders/DotScreenShader.cjs.map +1 -1
- package/shaders/DotScreenShader.js +28 -49
- package/shaders/DotScreenShader.js.map +1 -1
- package/shaders/FXAAShader.cjs +1089 -1098
- package/shaders/FXAAShader.cjs.map +1 -1
- package/shaders/FXAAShader.js +1089 -1098
- package/shaders/FXAAShader.js.map +1 -1
- package/shaders/FilmShader.cjs +29 -57
- package/shaders/FilmShader.cjs.map +1 -1
- package/shaders/FilmShader.js +29 -57
- package/shaders/FilmShader.js.map +1 -1
- package/shaders/FocusShader.cjs +43 -70
- package/shaders/FocusShader.cjs.map +1 -1
- package/shaders/FocusShader.js +43 -70
- package/shaders/FocusShader.js.map +1 -1
- package/shaders/FreiChenShader.cjs +53 -74
- package/shaders/FreiChenShader.cjs.map +1 -1
- package/shaders/FreiChenShader.js +53 -74
- package/shaders/FreiChenShader.js.map +1 -1
- package/shaders/FresnelShader.cjs +35 -55
- package/shaders/FresnelShader.cjs.map +1 -1
- package/shaders/FresnelShader.js +35 -55
- package/shaders/FresnelShader.js.map +1 -1
- package/shaders/GammaCorrectionShader.cjs +19 -33
- package/shaders/GammaCorrectionShader.cjs.map +1 -1
- package/shaders/GammaCorrectionShader.js +19 -33
- package/shaders/GammaCorrectionShader.js.map +1 -1
- package/shaders/GodRaysShader.cjs +116 -193
- package/shaders/GodRaysShader.cjs.map +1 -1
- package/shaders/GodRaysShader.js +116 -193
- package/shaders/GodRaysShader.js.map +1 -1
- package/shaders/HalftoneShader.cjs +192 -270
- package/shaders/HalftoneShader.cjs.map +1 -1
- package/shaders/HalftoneShader.js +192 -270
- package/shaders/HalftoneShader.js.map +1 -1
- package/shaders/HorizontalTiltShiftShader.cjs +27 -43
- package/shaders/HorizontalTiltShiftShader.cjs.map +1 -1
- package/shaders/HorizontalTiltShiftShader.js +27 -43
- package/shaders/HorizontalTiltShiftShader.js.map +1 -1
- package/shaders/HueSaturationShader.cjs +31 -47
- package/shaders/HueSaturationShader.cjs.map +1 -1
- package/shaders/HueSaturationShader.js +31 -47
- package/shaders/HueSaturationShader.js.map +1 -1
- package/shaders/KaleidoShader.cjs +24 -37
- package/shaders/KaleidoShader.cjs.map +1 -1
- package/shaders/KaleidoShader.js +24 -37
- package/shaders/KaleidoShader.js.map +1 -1
- package/shaders/LuminosityHighPassShader.cjs +24 -43
- package/shaders/LuminosityHighPassShader.cjs.map +1 -1
- package/shaders/LuminosityHighPassShader.js +24 -43
- package/shaders/LuminosityHighPassShader.js.map +1 -1
- package/shaders/LuminosityShader.cjs +17 -34
- package/shaders/LuminosityShader.cjs.map +1 -1
- package/shaders/LuminosityShader.js +17 -34
- package/shaders/LuminosityShader.js.map +1 -1
- package/shaders/MirrorShader.cjs +26 -39
- package/shaders/MirrorShader.cjs.map +1 -1
- package/shaders/MirrorShader.js +26 -39
- package/shaders/MirrorShader.js.map +1 -1
- package/shaders/NormalMapShader.cjs +21 -36
- package/shaders/NormalMapShader.cjs.map +1 -1
- package/shaders/NormalMapShader.js +21 -36
- package/shaders/NormalMapShader.js.map +1 -1
- package/shaders/ParallaxShader.cjs +97 -147
- package/shaders/ParallaxShader.cjs.map +1 -1
- package/shaders/ParallaxShader.js +97 -147
- package/shaders/ParallaxShader.js.map +1 -1
- package/shaders/PixelShader.cjs +18 -31
- package/shaders/PixelShader.cjs.map +1 -1
- package/shaders/PixelShader.js +18 -31
- package/shaders/PixelShader.js.map +1 -1
- package/shaders/RGBShiftShader.cjs +20 -33
- package/shaders/RGBShiftShader.cjs.map +1 -1
- package/shaders/RGBShiftShader.js +20 -33
- package/shaders/RGBShiftShader.js.map +1 -1
- package/shaders/SAOShader.cjs +117 -154
- package/shaders/SAOShader.cjs.map +1 -1
- package/shaders/SAOShader.js +117 -154
- package/shaders/SAOShader.js.map +1 -1
- package/shaders/SMAAShader.cjs +270 -358
- package/shaders/SMAAShader.cjs.map +1 -1
- package/shaders/SMAAShader.js +270 -358
- package/shaders/SMAAShader.js.map +1 -1
- package/shaders/SSAOShader.cjs +142 -236
- package/shaders/SSAOShader.cjs.map +1 -1
- package/shaders/SSAOShader.js +142 -236
- package/shaders/SSAOShader.js.map +1 -1
- package/shaders/SSRShader.cjs +4 -4
- package/shaders/SSRShader.cjs.map +1 -1
- package/shaders/SSRShader.js +4 -4
- package/shaders/SSRShader.js.map +1 -1
- package/shaders/SepiaShader.cjs +20 -36
- package/shaders/SepiaShader.cjs.map +1 -1
- package/shaders/SepiaShader.js +20 -36
- package/shaders/SepiaShader.js.map +1 -1
- package/shaders/SobelOperatorShader.cjs +37 -64
- package/shaders/SobelOperatorShader.cjs.map +1 -1
- package/shaders/SobelOperatorShader.js +37 -64
- package/shaders/SobelOperatorShader.js.map +1 -1
- package/shaders/TechnicolorShader.cjs +16 -29
- package/shaders/TechnicolorShader.cjs.map +1 -1
- package/shaders/TechnicolorShader.js +16 -29
- package/shaders/TechnicolorShader.js.map +1 -1
- package/shaders/ToneMapShader.cjs +35 -55
- package/shaders/ToneMapShader.cjs.map +1 -1
- package/shaders/ToneMapShader.js +35 -55
- package/shaders/ToneMapShader.js.map +1 -1
- package/shaders/ToonShader.cjs +165 -275
- package/shaders/ToonShader.cjs.map +1 -1
- package/shaders/ToonShader.js +165 -275
- package/shaders/ToonShader.js.map +1 -1
- package/shaders/TriangleBlurShader.cjs +27 -50
- package/shaders/TriangleBlurShader.cjs.map +1 -1
- package/shaders/TriangleBlurShader.js +27 -50
- package/shaders/TriangleBlurShader.js.map +1 -1
- package/shaders/UnpackDepthRGBAShader.cjs +17 -32
- package/shaders/UnpackDepthRGBAShader.cjs.map +1 -1
- package/shaders/UnpackDepthRGBAShader.js +17 -32
- package/shaders/UnpackDepthRGBAShader.js.map +1 -1
- package/shaders/VerticalTiltShiftShader.cjs +27 -43
- package/shaders/VerticalTiltShiftShader.cjs.map +1 -1
- package/shaders/VerticalTiltShiftShader.js +27 -43
- package/shaders/VerticalTiltShiftShader.js.map +1 -1
- package/shaders/VignetteShader.cjs +27 -43
- package/shaders/VignetteShader.cjs.map +1 -1
- package/shaders/VignetteShader.js +27 -43
- package/shaders/VignetteShader.js.map +1 -1
- package/shaders/VolumeShader.cjs +213 -264
- package/shaders/VolumeShader.cjs.map +1 -1
- package/shaders/VolumeShader.js +213 -264
- package/shaders/VolumeShader.js.map +1 -1
- package/shaders/WaterRefractionShader.cjs +35 -63
- package/shaders/WaterRefractionShader.cjs.map +1 -1
- package/shaders/WaterRefractionShader.js +35 -63
- package/shaders/WaterRefractionShader.js.map +1 -1
- package/utils/GeometryCompressionUtils.cjs +1 -2
- package/utils/GeometryCompressionUtils.cjs.map +1 -1
- package/utils/GeometryCompressionUtils.js +2 -3
- package/utils/GeometryCompressionUtils.js.map +1 -1
- package/utils/RoughnessMipmapper.cjs +3 -3
- package/utils/RoughnessMipmapper.cjs.map +1 -1
- package/utils/RoughnessMipmapper.js +4 -4
- package/utils/RoughnessMipmapper.js.map +1 -1
- package/webxr/ARButton.cjs +106 -109
- package/webxr/ARButton.cjs.map +1 -1
- package/webxr/ARButton.d.ts +3 -4
- package/webxr/ARButton.js +106 -109
- package/webxr/ARButton.js.map +1 -1
- package/webxr/OculusHandPointerModel.cjs +2 -2
- package/webxr/OculusHandPointerModel.cjs.map +1 -1
- package/webxr/OculusHandPointerModel.js +2 -2
- package/webxr/OculusHandPointerModel.js.map +1 -1
- package/webxr/VRButton.cjs +95 -98
- package/webxr/VRButton.cjs.map +1 -1
- package/webxr/VRButton.d.ts +5 -6
- package/webxr/VRButton.js +95 -98
- package/webxr/VRButton.js.map +1 -1
- package/webxr/XRHandPrimitiveModel.cjs +2 -2
- package/webxr/XRHandPrimitiveModel.cjs.map +1 -1
- package/webxr/XRHandPrimitiveModel.js +3 -3
- package/webxr/XRHandPrimitiveModel.js.map +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ConvexObjectBreaker.js","sources":["../../src/misc/ConvexObjectBreaker.js"],"sourcesContent":["import { Line3, Mesh, Plane, Vector3 } from 'three'\nimport { ConvexGeometry } from '../geometries/ConvexGeometry'\n\n/**\n * @fileoverview This class can be used to subdivide a convex Geometry object into pieces.\n *\n * Usage:\n *\n * Use the function prepareBreakableObject to prepare a Mesh object to be broken.\n *\n * Then, call the various functions to subdivide the object (subdivideByImpact, cutByPlane)\n *\n * Sub-objects that are product of subdivision don't need prepareBreakableObject to be called on them.\n *\n * Requisites for the object:\n *\n * - Mesh object must have a buffer geometry and a material\n *\n * - Vertex normals must be planar (not smoothed)\n *\n * - The geometry must be convex (this is not checked in the library). You can create convex\n * geometries with ConvexGeometry. The BoxGeometry, SphereGeometry and other convex primitives\n * can also be used.\n *\n * Note: This lib adds member variables to object's userData member (see prepareBreakableObject function)\n * Use with caution and read the code when using with other libs.\n *\n * @param {double} minSizeForBreak Min size a debris can have to break.\n * @param {double} smallDelta Max distance to consider that a point belongs to a plane.\n *\n */\n\nconst _v1 = /* @__PURE__ */ new Vector3()\n\nconst ConvexObjectBreaker = /* @__PURE__ */ (() => {\n class ConvexObjectBreaker {\n constructor(minSizeForBreak = 1.4, smallDelta = 0.0001) {\n this.minSizeForBreak = minSizeForBreak\n this.smallDelta = smallDelta\n\n this.tempLine1 = new Line3()\n this.tempPlane1 = new Plane()\n this.tempPlane2 = new Plane()\n this.tempPlane_Cut = new Plane()\n this.tempCM1 = new Vector3()\n this.tempCM2 = new Vector3()\n this.tempVector3 = new Vector3()\n this.tempVector3_2 = new Vector3()\n this.tempVector3_3 = new Vector3()\n this.tempVector3_P0 = new Vector3()\n this.tempVector3_P1 = new Vector3()\n this.tempVector3_P2 = new Vector3()\n this.tempVector3_N0 = new Vector3()\n this.tempVector3_N1 = new Vector3()\n this.tempVector3_AB = new Vector3()\n this.tempVector3_CB = new Vector3()\n this.tempResultObjects = { object1: null, object2: null }\n\n this.segments = []\n const n = 30 * 30\n for (let i = 0; i < n; i++) this.segments[i] = false\n }\n\n prepareBreakableObject(object, mass, velocity, angularVelocity, breakable) {\n // object is a Object3d (normally a Mesh), must have a buffer geometry, and it must be convex.\n // Its material property is propagated to its children (sub-pieces)\n // mass must be > 0\n\n const userData = object.userData\n userData.mass = mass\n userData.velocity = velocity.clone()\n userData.angularVelocity = angularVelocity.clone()\n userData.breakable = breakable\n }\n\n /*\n * @param {int} maxRadialIterations Iterations for radial cuts.\n * @param {int} maxRandomIterations Max random iterations for not-radial cuts\n *\n * Returns the array of pieces\n */\n subdivideByImpact(object, pointOfImpact, normal, maxRadialIterations, maxRandomIterations) {\n const debris = []\n\n const tempPlane1 = this.tempPlane1\n const tempPlane2 = this.tempPlane2\n\n this.tempVector3.addVectors(pointOfImpact, normal)\n tempPlane1.setFromCoplanarPoints(pointOfImpact, object.position, this.tempVector3)\n\n const maxTotalIterations = maxRandomIterations + maxRadialIterations\n\n const scope = this\n\n function subdivideRadial(subObject, startAngle, endAngle, numIterations) {\n if (Math.random() < numIterations * 0.05 || numIterations > maxTotalIterations) {\n debris.push(subObject)\n\n return\n }\n\n let angle = Math.PI\n\n if (numIterations === 0) {\n tempPlane2.normal.copy(tempPlane1.normal)\n tempPlane2.constant = tempPlane1.constant\n } else {\n if (numIterations <= maxRadialIterations) {\n angle = (endAngle - startAngle) * (0.2 + 0.6 * Math.random()) + startAngle\n\n // Rotate tempPlane2 at impact point around normal axis and the angle\n scope.tempVector3_2\n .copy(object.position)\n .sub(pointOfImpact)\n .applyAxisAngle(normal, angle)\n .add(pointOfImpact)\n tempPlane2.setFromCoplanarPoints(pointOfImpact, scope.tempVector3, scope.tempVector3_2)\n } else {\n angle = (0.5 * (numIterations & 1) + 0.2 * (2 - Math.random())) * Math.PI\n\n // Rotate tempPlane2 at object position around normal axis and the angle\n scope.tempVector3_2\n .copy(pointOfImpact)\n .sub(subObject.position)\n .applyAxisAngle(normal, angle)\n .add(subObject.position)\n scope.tempVector3_3.copy(normal).add(subObject.position)\n tempPlane2.setFromCoplanarPoints(subObject.position, scope.tempVector3_3, scope.tempVector3_2)\n }\n }\n\n // Perform the cut\n scope.cutByPlane(subObject, tempPlane2, scope.tempResultObjects)\n\n const obj1 = scope.tempResultObjects.object1\n const obj2 = scope.tempResultObjects.object2\n\n if (obj1) {\n subdivideRadial(obj1, startAngle, angle, numIterations + 1)\n }\n\n if (obj2) {\n subdivideRadial(obj2, angle, endAngle, numIterations + 1)\n }\n }\n\n subdivideRadial(object, 0, 2 * Math.PI, 0)\n\n return debris\n }\n\n cutByPlane(object, plane, output) {\n // Returns breakable objects in output.object1 and output.object2 members, the resulting 2 pieces of the cut.\n // object2 can be null if the plane doesn't cut the object.\n // object1 can be null only in case of internal error\n // Returned value is number of pieces, 0 for error.\n\n const geometry = object.geometry\n const coords = geometry.attributes.position.array\n const normals = geometry.attributes.normal.array\n\n const numPoints = coords.length / 3\n let numFaces = numPoints / 3\n\n let indices = geometry.getIndex()\n\n if (indices) {\n indices = indices.array\n numFaces = indices.length / 3\n }\n\n function getVertexIndex(faceIdx, vert) {\n // vert = 0, 1 or 2.\n\n const idx = faceIdx * 3 + vert\n\n return indices ? indices[idx] : idx\n }\n\n const points1 = []\n const points2 = []\n\n const delta = this.smallDelta\n\n // Reset segments mark\n const numPointPairs = numPoints * numPoints\n for (let i = 0; i < numPointPairs; i++) this.segments[i] = false\n\n const p0 = this.tempVector3_P0\n const p1 = this.tempVector3_P1\n const n0 = this.tempVector3_N0\n const n1 = this.tempVector3_N1\n\n // Iterate through the faces to mark edges shared by coplanar faces\n for (let i = 0; i < numFaces - 1; i++) {\n const a1 = getVertexIndex(i, 0)\n const b1 = getVertexIndex(i, 1)\n const c1 = getVertexIndex(i, 2)\n\n // Assuming all 3 vertices have the same normal\n n0.set(normals[a1], normals[a1] + 1, normals[a1] + 2)\n\n for (let j = i + 1; j < numFaces; j++) {\n const a2 = getVertexIndex(j, 0)\n const b2 = getVertexIndex(j, 1)\n const c2 = getVertexIndex(j, 2)\n\n // Assuming all 3 vertices have the same normal\n n1.set(normals[a2], normals[a2] + 1, normals[a2] + 2)\n\n const coplanar = 1 - n0.dot(n1) < delta\n\n if (coplanar) {\n if (a1 === a2 || a1 === b2 || a1 === c2) {\n if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[a1 * numPoints + b1] = true\n this.segments[b1 * numPoints + a1] = true\n } else {\n this.segments[c1 * numPoints + a1] = true\n this.segments[a1 * numPoints + c1] = true\n }\n } else if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[c1 * numPoints + b1] = true\n this.segments[b1 * numPoints + c1] = true\n }\n }\n }\n }\n\n // Transform the plane to object local space\n const localPlane = this.tempPlane_Cut\n object.updateMatrix()\n ConvexObjectBreaker.transformPlaneToLocalSpace(plane, object.matrix, localPlane)\n\n // Iterate through the faces adding points to both pieces\n for (let i = 0; i < numFaces; i++) {\n const va = getVertexIndex(i, 0)\n const vb = getVertexIndex(i, 1)\n const vc = getVertexIndex(i, 2)\n\n for (let segment = 0; segment < 3; segment++) {\n const i0 = segment === 0 ? va : segment === 1 ? vb : vc\n const i1 = segment === 0 ? vb : segment === 1 ? vc : va\n\n const segmentState = this.segments[i0 * numPoints + i1]\n\n if (segmentState) continue // The segment already has been processed in another face\n\n // Mark segment as processed (also inverted segment)\n this.segments[i0 * numPoints + i1] = true\n this.segments[i1 * numPoints + i0] = true\n\n p0.set(coords[3 * i0], coords[3 * i0 + 1], coords[3 * i0 + 2])\n p1.set(coords[3 * i1], coords[3 * i1 + 1], coords[3 * i1 + 2])\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark0 = 0\n\n let d = localPlane.distanceToPoint(p0)\n\n if (d > delta) {\n mark0 = 2\n points2.push(p0.clone())\n } else if (d < -delta) {\n mark0 = 1\n points1.push(p0.clone())\n } else {\n mark0 = 3\n points1.push(p0.clone())\n points2.push(p0.clone())\n }\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark1 = 0\n\n d = localPlane.distanceToPoint(p1)\n\n if (d > delta) {\n mark1 = 2\n points2.push(p1.clone())\n } else if (d < -delta) {\n mark1 = 1\n points1.push(p1.clone())\n } else {\n mark1 = 3\n points1.push(p1.clone())\n points2.push(p1.clone())\n }\n\n if ((mark0 === 1 && mark1 === 2) || (mark0 === 2 && mark1 === 1)) {\n // Intersection of segment with the plane\n\n this.tempLine1.start.copy(p0)\n this.tempLine1.end.copy(p1)\n\n let intersection = new Vector3()\n intersection = localPlane.intersectLine(this.tempLine1, intersection)\n\n if (intersection === null) {\n // Shouldn't happen\n console.error('Internal error: segment does not intersect plane.')\n output.segmentedObject1 = null\n output.segmentedObject2 = null\n return 0\n }\n\n points1.push(intersection)\n points2.push(intersection.clone())\n }\n }\n }\n\n // Calculate debris mass (very fast and imprecise):\n const newMass = object.userData.mass * 0.5\n\n // Calculate debris Center of Mass (again fast and imprecise)\n this.tempCM1.set(0, 0, 0)\n let radius1 = 0\n const numPoints1 = points1.length\n\n if (numPoints1 > 0) {\n for (let i = 0; i < numPoints1; i++) this.tempCM1.add(points1[i])\n\n this.tempCM1.divideScalar(numPoints1)\n for (let i = 0; i < numPoints1; i++) {\n const p = points1[i]\n p.sub(this.tempCM1)\n radius1 = Math.max(radius1, p.x, p.y, p.z)\n }\n\n this.tempCM1.add(object.position)\n }\n\n this.tempCM2.set(0, 0, 0)\n let radius2 = 0\n const numPoints2 = points2.length\n if (numPoints2 > 0) {\n for (let i = 0; i < numPoints2; i++) this.tempCM2.add(points2[i])\n\n this.tempCM2.divideScalar(numPoints2)\n for (let i = 0; i < numPoints2; i++) {\n const p = points2[i]\n p.sub(this.tempCM2)\n radius2 = Math.max(radius2, p.x, p.y, p.z)\n }\n\n this.tempCM2.add(object.position)\n }\n\n let object1 = null\n let object2 = null\n\n let numObjects = 0\n\n if (numPoints1 > 4) {\n object1 = new Mesh(new ConvexGeometry(points1), object.material)\n object1.position.copy(this.tempCM1)\n object1.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object1,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius1 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n if (numPoints2 > 4) {\n object2 = new Mesh(new ConvexGeometry(points2), object.material)\n object2.position.copy(this.tempCM2)\n object2.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object2,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius2 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n output.object1 = object1\n output.object2 = object2\n\n return numObjects\n }\n\n static transformFreeVector(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[4] * y + e[8] * z\n v.y = e[1] * x + e[5] * y + e[9] * z\n v.z = e[2] * x + e[6] * y + e[10] * z\n\n return v\n }\n\n static transformFreeVectorInverse(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z\n v.y = e[4] * x + e[5] * y + e[6] * z\n v.z = e[8] * x + e[9] * y + e[10] * z\n\n return v\n }\n\n static transformTiedVectorInverse(v, m) {\n // input:\n // vector interpreted as a tied (ordinary) vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z - e[12]\n v.y = e[4] * x + e[5] * y + e[6] * z - e[13]\n v.z = e[8] * x + e[9] * y + e[10] * z - e[14]\n\n return v\n }\n\n static transformPlaneToLocalSpace(plane, m, resultPlane) {\n resultPlane.normal.copy(plane.normal)\n resultPlane.constant = plane.constant\n\n const referencePoint = ConvexObjectBreaker.transformTiedVectorInverse(plane.coplanarPoint(_v1), m)\n\n ConvexObjectBreaker.transformFreeVectorInverse(resultPlane.normal, m)\n\n // recalculate constant (like in setFromNormalAndCoplanarPoint)\n resultPlane.constant = -referencePoint.dot(resultPlane.normal)\n }\n }\n\n return ConvexObjectBreaker\n})()\n\nexport { ConvexObjectBreaker }\n"],"names":["ConvexObjectBreaker"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"ConvexObjectBreaker.js","sources":["../../src/misc/ConvexObjectBreaker.js"],"sourcesContent":["import { Line3, Mesh, Plane, Vector3 } from 'three'\nimport { ConvexGeometry } from '../geometries/ConvexGeometry'\n\n/**\n * @fileoverview This class can be used to subdivide a convex Geometry object into pieces.\n *\n * Usage:\n *\n * Use the function prepareBreakableObject to prepare a Mesh object to be broken.\n *\n * Then, call the various functions to subdivide the object (subdivideByImpact, cutByPlane)\n *\n * Sub-objects that are product of subdivision don't need prepareBreakableObject to be called on them.\n *\n * Requisites for the object:\n *\n * - Mesh object must have a buffer geometry and a material\n *\n * - Vertex normals must be planar (not smoothed)\n *\n * - The geometry must be convex (this is not checked in the library). You can create convex\n * geometries with ConvexGeometry. The BoxGeometry, SphereGeometry and other convex primitives\n * can also be used.\n *\n * Note: This lib adds member variables to object's userData member (see prepareBreakableObject function)\n * Use with caution and read the code when using with other libs.\n *\n * @param {double} minSizeForBreak Min size a debris can have to break.\n * @param {double} smallDelta Max distance to consider that a point belongs to a plane.\n *\n */\n\nconst _v1 = new Vector3()\n\nclass ConvexObjectBreaker {\n constructor(minSizeForBreak = 1.4, smallDelta = 0.0001) {\n this.minSizeForBreak = minSizeForBreak\n this.smallDelta = smallDelta\n\n this.tempLine1 = new Line3()\n this.tempPlane1 = new Plane()\n this.tempPlane2 = new Plane()\n this.tempPlane_Cut = new Plane()\n this.tempCM1 = new Vector3()\n this.tempCM2 = new Vector3()\n this.tempVector3 = new Vector3()\n this.tempVector3_2 = new Vector3()\n this.tempVector3_3 = new Vector3()\n this.tempVector3_P0 = new Vector3()\n this.tempVector3_P1 = new Vector3()\n this.tempVector3_P2 = new Vector3()\n this.tempVector3_N0 = new Vector3()\n this.tempVector3_N1 = new Vector3()\n this.tempVector3_AB = new Vector3()\n this.tempVector3_CB = new Vector3()\n this.tempResultObjects = { object1: null, object2: null }\n\n this.segments = []\n const n = 30 * 30\n for (let i = 0; i < n; i++) this.segments[i] = false\n }\n\n prepareBreakableObject(object, mass, velocity, angularVelocity, breakable) {\n // object is a Object3d (normally a Mesh), must have a buffer geometry, and it must be convex.\n // Its material property is propagated to its children (sub-pieces)\n // mass must be > 0\n\n const userData = object.userData\n userData.mass = mass\n userData.velocity = velocity.clone()\n userData.angularVelocity = angularVelocity.clone()\n userData.breakable = breakable\n }\n\n /*\n * @param {int} maxRadialIterations Iterations for radial cuts.\n * @param {int} maxRandomIterations Max random iterations for not-radial cuts\n *\n * Returns the array of pieces\n */\n subdivideByImpact(object, pointOfImpact, normal, maxRadialIterations, maxRandomIterations) {\n const debris = []\n\n const tempPlane1 = this.tempPlane1\n const tempPlane2 = this.tempPlane2\n\n this.tempVector3.addVectors(pointOfImpact, normal)\n tempPlane1.setFromCoplanarPoints(pointOfImpact, object.position, this.tempVector3)\n\n const maxTotalIterations = maxRandomIterations + maxRadialIterations\n\n const scope = this\n\n function subdivideRadial(subObject, startAngle, endAngle, numIterations) {\n if (Math.random() < numIterations * 0.05 || numIterations > maxTotalIterations) {\n debris.push(subObject)\n\n return\n }\n\n let angle = Math.PI\n\n if (numIterations === 0) {\n tempPlane2.normal.copy(tempPlane1.normal)\n tempPlane2.constant = tempPlane1.constant\n } else {\n if (numIterations <= maxRadialIterations) {\n angle = (endAngle - startAngle) * (0.2 + 0.6 * Math.random()) + startAngle\n\n // Rotate tempPlane2 at impact point around normal axis and the angle\n scope.tempVector3_2.copy(object.position).sub(pointOfImpact).applyAxisAngle(normal, angle).add(pointOfImpact)\n tempPlane2.setFromCoplanarPoints(pointOfImpact, scope.tempVector3, scope.tempVector3_2)\n } else {\n angle = (0.5 * (numIterations & 1) + 0.2 * (2 - Math.random())) * Math.PI\n\n // Rotate tempPlane2 at object position around normal axis and the angle\n scope.tempVector3_2\n .copy(pointOfImpact)\n .sub(subObject.position)\n .applyAxisAngle(normal, angle)\n .add(subObject.position)\n scope.tempVector3_3.copy(normal).add(subObject.position)\n tempPlane2.setFromCoplanarPoints(subObject.position, scope.tempVector3_3, scope.tempVector3_2)\n }\n }\n\n // Perform the cut\n scope.cutByPlane(subObject, tempPlane2, scope.tempResultObjects)\n\n const obj1 = scope.tempResultObjects.object1\n const obj2 = scope.tempResultObjects.object2\n\n if (obj1) {\n subdivideRadial(obj1, startAngle, angle, numIterations + 1)\n }\n\n if (obj2) {\n subdivideRadial(obj2, angle, endAngle, numIterations + 1)\n }\n }\n\n subdivideRadial(object, 0, 2 * Math.PI, 0)\n\n return debris\n }\n\n cutByPlane(object, plane, output) {\n // Returns breakable objects in output.object1 and output.object2 members, the resulting 2 pieces of the cut.\n // object2 can be null if the plane doesn't cut the object.\n // object1 can be null only in case of internal error\n // Returned value is number of pieces, 0 for error.\n\n const geometry = object.geometry\n const coords = geometry.attributes.position.array\n const normals = geometry.attributes.normal.array\n\n const numPoints = coords.length / 3\n let numFaces = numPoints / 3\n\n let indices = geometry.getIndex()\n\n if (indices) {\n indices = indices.array\n numFaces = indices.length / 3\n }\n\n function getVertexIndex(faceIdx, vert) {\n // vert = 0, 1 or 2.\n\n const idx = faceIdx * 3 + vert\n\n return indices ? indices[idx] : idx\n }\n\n const points1 = []\n const points2 = []\n\n const delta = this.smallDelta\n\n // Reset segments mark\n const numPointPairs = numPoints * numPoints\n for (let i = 0; i < numPointPairs; i++) this.segments[i] = false\n\n const p0 = this.tempVector3_P0\n const p1 = this.tempVector3_P1\n const n0 = this.tempVector3_N0\n const n1 = this.tempVector3_N1\n\n // Iterate through the faces to mark edges shared by coplanar faces\n for (let i = 0; i < numFaces - 1; i++) {\n const a1 = getVertexIndex(i, 0)\n const b1 = getVertexIndex(i, 1)\n const c1 = getVertexIndex(i, 2)\n\n // Assuming all 3 vertices have the same normal\n n0.set(normals[a1], normals[a1] + 1, normals[a1] + 2)\n\n for (let j = i + 1; j < numFaces; j++) {\n const a2 = getVertexIndex(j, 0)\n const b2 = getVertexIndex(j, 1)\n const c2 = getVertexIndex(j, 2)\n\n // Assuming all 3 vertices have the same normal\n n1.set(normals[a2], normals[a2] + 1, normals[a2] + 2)\n\n const coplanar = 1 - n0.dot(n1) < delta\n\n if (coplanar) {\n if (a1 === a2 || a1 === b2 || a1 === c2) {\n if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[a1 * numPoints + b1] = true\n this.segments[b1 * numPoints + a1] = true\n } else {\n this.segments[c1 * numPoints + a1] = true\n this.segments[a1 * numPoints + c1] = true\n }\n } else if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[c1 * numPoints + b1] = true\n this.segments[b1 * numPoints + c1] = true\n }\n }\n }\n }\n\n // Transform the plane to object local space\n const localPlane = this.tempPlane_Cut\n object.updateMatrix()\n ConvexObjectBreaker.transformPlaneToLocalSpace(plane, object.matrix, localPlane)\n\n // Iterate through the faces adding points to both pieces\n for (let i = 0; i < numFaces; i++) {\n const va = getVertexIndex(i, 0)\n const vb = getVertexIndex(i, 1)\n const vc = getVertexIndex(i, 2)\n\n for (let segment = 0; segment < 3; segment++) {\n const i0 = segment === 0 ? va : segment === 1 ? vb : vc\n const i1 = segment === 0 ? vb : segment === 1 ? vc : va\n\n const segmentState = this.segments[i0 * numPoints + i1]\n\n if (segmentState) continue // The segment already has been processed in another face\n\n // Mark segment as processed (also inverted segment)\n this.segments[i0 * numPoints + i1] = true\n this.segments[i1 * numPoints + i0] = true\n\n p0.set(coords[3 * i0], coords[3 * i0 + 1], coords[3 * i0 + 2])\n p1.set(coords[3 * i1], coords[3 * i1 + 1], coords[3 * i1 + 2])\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark0 = 0\n\n let d = localPlane.distanceToPoint(p0)\n\n if (d > delta) {\n mark0 = 2\n points2.push(p0.clone())\n } else if (d < -delta) {\n mark0 = 1\n points1.push(p0.clone())\n } else {\n mark0 = 3\n points1.push(p0.clone())\n points2.push(p0.clone())\n }\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark1 = 0\n\n d = localPlane.distanceToPoint(p1)\n\n if (d > delta) {\n mark1 = 2\n points2.push(p1.clone())\n } else if (d < -delta) {\n mark1 = 1\n points1.push(p1.clone())\n } else {\n mark1 = 3\n points1.push(p1.clone())\n points2.push(p1.clone())\n }\n\n if ((mark0 === 1 && mark1 === 2) || (mark0 === 2 && mark1 === 1)) {\n // Intersection of segment with the plane\n\n this.tempLine1.start.copy(p0)\n this.tempLine1.end.copy(p1)\n\n let intersection = new Vector3()\n intersection = localPlane.intersectLine(this.tempLine1, intersection)\n\n if (intersection === null) {\n // Shouldn't happen\n console.error('Internal error: segment does not intersect plane.')\n output.segmentedObject1 = null\n output.segmentedObject2 = null\n return 0\n }\n\n points1.push(intersection)\n points2.push(intersection.clone())\n }\n }\n }\n\n // Calculate debris mass (very fast and imprecise):\n const newMass = object.userData.mass * 0.5\n\n // Calculate debris Center of Mass (again fast and imprecise)\n this.tempCM1.set(0, 0, 0)\n let radius1 = 0\n const numPoints1 = points1.length\n\n if (numPoints1 > 0) {\n for (let i = 0; i < numPoints1; i++) this.tempCM1.add(points1[i])\n\n this.tempCM1.divideScalar(numPoints1)\n for (let i = 0; i < numPoints1; i++) {\n const p = points1[i]\n p.sub(this.tempCM1)\n radius1 = Math.max(radius1, p.x, p.y, p.z)\n }\n\n this.tempCM1.add(object.position)\n }\n\n this.tempCM2.set(0, 0, 0)\n let radius2 = 0\n const numPoints2 = points2.length\n if (numPoints2 > 0) {\n for (let i = 0; i < numPoints2; i++) this.tempCM2.add(points2[i])\n\n this.tempCM2.divideScalar(numPoints2)\n for (let i = 0; i < numPoints2; i++) {\n const p = points2[i]\n p.sub(this.tempCM2)\n radius2 = Math.max(radius2, p.x, p.y, p.z)\n }\n\n this.tempCM2.add(object.position)\n }\n\n let object1 = null\n let object2 = null\n\n let numObjects = 0\n\n if (numPoints1 > 4) {\n object1 = new Mesh(new ConvexGeometry(points1), object.material)\n object1.position.copy(this.tempCM1)\n object1.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object1,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius1 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n if (numPoints2 > 4) {\n object2 = new Mesh(new ConvexGeometry(points2), object.material)\n object2.position.copy(this.tempCM2)\n object2.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object2,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius2 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n output.object1 = object1\n output.object2 = object2\n\n return numObjects\n }\n\n static transformFreeVector(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[4] * y + e[8] * z\n v.y = e[1] * x + e[5] * y + e[9] * z\n v.z = e[2] * x + e[6] * y + e[10] * z\n\n return v\n }\n\n static transformFreeVectorInverse(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z\n v.y = e[4] * x + e[5] * y + e[6] * z\n v.z = e[8] * x + e[9] * y + e[10] * z\n\n return v\n }\n\n static transformTiedVectorInverse(v, m) {\n // input:\n // vector interpreted as a tied (ordinary) vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z - e[12]\n v.y = e[4] * x + e[5] * y + e[6] * z - e[13]\n v.z = e[8] * x + e[9] * y + e[10] * z - e[14]\n\n return v\n }\n\n static transformPlaneToLocalSpace(plane, m, resultPlane) {\n resultPlane.normal.copy(plane.normal)\n resultPlane.constant = plane.constant\n\n const referencePoint = ConvexObjectBreaker.transformTiedVectorInverse(plane.coplanarPoint(_v1), m)\n\n ConvexObjectBreaker.transformFreeVectorInverse(resultPlane.normal, m)\n\n // recalculate constant (like in setFromNormalAndCoplanarPoint)\n resultPlane.constant = -referencePoint.dot(resultPlane.normal)\n }\n}\n\nexport { ConvexObjectBreaker }\n"],"names":[],"mappings":"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"}
|
package/misc/Gyroscope.cjs
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
3
3
|
const THREE = require("three");
|
4
|
-
const _translationObject =
|
5
|
-
const _quaternionObject =
|
6
|
-
const _scaleObject =
|
7
|
-
const _translationWorld =
|
8
|
-
const _quaternionWorld =
|
9
|
-
const _scaleWorld =
|
4
|
+
const _translationObject = new THREE.Vector3();
|
5
|
+
const _quaternionObject = new THREE.Quaternion();
|
6
|
+
const _scaleObject = new THREE.Vector3();
|
7
|
+
const _translationWorld = new THREE.Vector3();
|
8
|
+
const _quaternionWorld = new THREE.Quaternion();
|
9
|
+
const _scaleWorld = new THREE.Vector3();
|
10
10
|
class Gyroscope extends THREE.Object3D {
|
11
11
|
constructor() {
|
12
12
|
super();
|
package/misc/Gyroscope.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Gyroscope.cjs","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject =
|
1
|
+
{"version":3,"file":"Gyroscope.cjs","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject = new Vector3()\nconst _quaternionObject = new Quaternion()\nconst _scaleObject = new Vector3()\n\nconst _translationWorld = new Vector3()\nconst _quaternionWorld = new Quaternion()\nconst _scaleWorld = new Vector3()\n\nclass Gyroscope extends Object3D {\n constructor() {\n super()\n }\n\n updateMatrixWorld(force) {\n this.matrixAutoUpdate && this.updateMatrix()\n\n // update matrixWorld\n\n if (this.matrixWorldNeedsUpdate || force) {\n if (this.parent !== null) {\n this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix)\n\n this.matrixWorld.decompose(_translationWorld, _quaternionWorld, _scaleWorld)\n this.matrix.decompose(_translationObject, _quaternionObject, _scaleObject)\n\n this.matrixWorld.compose(_translationWorld, _quaternionObject, _scaleWorld)\n } else {\n this.matrixWorld.copy(this.matrix)\n }\n\n this.matrixWorldNeedsUpdate = false\n\n force = true\n }\n\n // update children\n\n for (let i = 0, l = this.children.length; i < l; i++) {\n this.children[i].updateMatrixWorld(force)\n }\n }\n}\n\nexport { Gyroscope }\n"],"names":["Vector3","Quaternion","Object3D"],"mappings":";;;AAEA,MAAM,qBAAqB,IAAIA,MAAAA,QAAS;AACxC,MAAM,oBAAoB,IAAIC,MAAAA,WAAY;AAC1C,MAAM,eAAe,IAAID,MAAAA,QAAS;AAElC,MAAM,oBAAoB,IAAIA,MAAAA,QAAS;AACvC,MAAM,mBAAmB,IAAIC,MAAAA,WAAY;AACzC,MAAM,cAAc,IAAID,MAAAA,QAAS;AAEjC,MAAM,kBAAkBE,MAAAA,SAAS;AAAA,EAC/B,cAAc;AACZ,UAAO;AAAA,EACR;AAAA,EAED,kBAAkB,OAAO;AACvB,SAAK,oBAAoB,KAAK,aAAc;AAI5C,QAAI,KAAK,0BAA0B,OAAO;AACxC,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,YAAY,iBAAiB,KAAK,OAAO,aAAa,KAAK,MAAM;AAEtE,aAAK,YAAY,UAAU,mBAAmB,kBAAkB,WAAW;AAC3E,aAAK,OAAO,UAAU,oBAAoB,mBAAmB,YAAY;AAEzE,aAAK,YAAY,QAAQ,mBAAmB,mBAAmB,WAAW;AAAA,MAClF,OAAa;AACL,aAAK,YAAY,KAAK,KAAK,MAAM;AAAA,MAClC;AAED,WAAK,yBAAyB;AAE9B,cAAQ;AAAA,IACT;AAID,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,GAAG,KAAK;AACpD,WAAK,SAAS,CAAC,EAAE,kBAAkB,KAAK;AAAA,IACzC;AAAA,EACF;AACH;;"}
|
package/misc/Gyroscope.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
import {
|
2
|
-
const _translationObject =
|
3
|
-
const _quaternionObject =
|
4
|
-
const _scaleObject =
|
5
|
-
const _translationWorld =
|
6
|
-
const _quaternionWorld =
|
7
|
-
const _scaleWorld =
|
1
|
+
import { Vector3, Quaternion, Object3D } from "three";
|
2
|
+
const _translationObject = new Vector3();
|
3
|
+
const _quaternionObject = new Quaternion();
|
4
|
+
const _scaleObject = new Vector3();
|
5
|
+
const _translationWorld = new Vector3();
|
6
|
+
const _quaternionWorld = new Quaternion();
|
7
|
+
const _scaleWorld = new Vector3();
|
8
8
|
class Gyroscope extends Object3D {
|
9
9
|
constructor() {
|
10
10
|
super();
|
package/misc/Gyroscope.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Gyroscope.js","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject =
|
1
|
+
{"version":3,"file":"Gyroscope.js","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject = new Vector3()\nconst _quaternionObject = new Quaternion()\nconst _scaleObject = new Vector3()\n\nconst _translationWorld = new Vector3()\nconst _quaternionWorld = new Quaternion()\nconst _scaleWorld = new Vector3()\n\nclass Gyroscope extends Object3D {\n constructor() {\n super()\n }\n\n updateMatrixWorld(force) {\n this.matrixAutoUpdate && this.updateMatrix()\n\n // update matrixWorld\n\n if (this.matrixWorldNeedsUpdate || force) {\n if (this.parent !== null) {\n this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix)\n\n this.matrixWorld.decompose(_translationWorld, _quaternionWorld, _scaleWorld)\n this.matrix.decompose(_translationObject, _quaternionObject, _scaleObject)\n\n this.matrixWorld.compose(_translationWorld, _quaternionObject, _scaleWorld)\n } else {\n this.matrixWorld.copy(this.matrix)\n }\n\n this.matrixWorldNeedsUpdate = false\n\n force = true\n }\n\n // update children\n\n for (let i = 0, l = this.children.length; i < l; i++) {\n this.children[i].updateMatrixWorld(force)\n }\n }\n}\n\nexport { Gyroscope }\n"],"names":[],"mappings":";AAEA,MAAM,qBAAqB,IAAI,QAAS;AACxC,MAAM,oBAAoB,IAAI,WAAY;AAC1C,MAAM,eAAe,IAAI,QAAS;AAElC,MAAM,oBAAoB,IAAI,QAAS;AACvC,MAAM,mBAAmB,IAAI,WAAY;AACzC,MAAM,cAAc,IAAI,QAAS;AAEjC,MAAM,kBAAkB,SAAS;AAAA,EAC/B,cAAc;AACZ,UAAO;AAAA,EACR;AAAA,EAED,kBAAkB,OAAO;AACvB,SAAK,oBAAoB,KAAK,aAAc;AAI5C,QAAI,KAAK,0BAA0B,OAAO;AACxC,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,YAAY,iBAAiB,KAAK,OAAO,aAAa,KAAK,MAAM;AAEtE,aAAK,YAAY,UAAU,mBAAmB,kBAAkB,WAAW;AAC3E,aAAK,OAAO,UAAU,oBAAoB,mBAAmB,YAAY;AAEzE,aAAK,YAAY,QAAQ,mBAAmB,mBAAmB,WAAW;AAAA,MAClF,OAAa;AACL,aAAK,YAAY,KAAK,KAAK,MAAM;AAAA,MAClC;AAED,WAAK,yBAAyB;AAE9B,cAAQ;AAAA,IACT;AAID,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,GAAG,KAAK;AACpD,WAAK,SAAS,CAAC,EAAE,kBAAkB,KAAK;AAAA,IACzC;AAAA,EACF;AACH;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CurveModifier.cjs","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = /* @__PURE__ */ new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":["DataTexture","RGBAFormat","FloatType","RepeatWrapping","NearestFilter","Mesh","InstancedMesh","Matrix4","DynamicDrawUsage"],"mappings":";;;;;;;;;AACA,MAAM,WAAW;AACjB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AAwBV,MAAA,oBAAoB,CAAC,iBAAiB,MAAmB;AACpE,QAAM,YAAY,IAAI,aAAa,gBAAgB,iBAAiB,iBAAiB,QAAQ;AACvF,QAAA,cAAc,IAAIA,MAAY,YAAA,WAAW,eAAe,iBAAiB,gBAAgBC,kBAAYC,MAAAA,SAAS;AAEpH,cAAY,QAAQC;AACpB,cAAY,QAAQA;AACpB,cAAY,YAAYC;AACxB,cAAY,cAAc;AAEnB,SAAA;AACT;AASO,MAAM,sBAAsB,CACjC,SACA,aACA,SAAS,MACA;AACT,QAAM,iBAAiB,KAAK,MAAM,iBAAiB,iBAAiB,EAAE;AACtE,cAAY,qBAAqB,iBAAiB;AAClD,cAAY,iBAAiB;AACvB,QAAA,SAAS,YAAY,gBAAgB,cAAc;AACzD,QAAM,eAAe,YAAY,oBAAoB,gBAAgB,IAAI;AAEzE,WAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,UAAM,YAAY,KAAK,MAAM,IAAI,aAAa;AAC9C,UAAM,WAAW,IAAI;AAEjB,QAAA,KAAK,OAAO,CAAC;AACD,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AACvF,SAAA,aAAa,SAAS,CAAC;AACZ,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AACvF,SAAA,aAAa,QAAQ,CAAC;AACX,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AACvF,SAAA,aAAa,UAAU,CAAC;AACb,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AAAA,EAC9F;AAEA,UAAQ,cAAc;AACxB;AAEA,MAAM,kBAAkB,CAAC,SAAsB,OAAe,GAAW,GAAW,GAAW,MAAoB;AACjH,QAAM,QAAQ,QAAQ;AAChB,QAAA,EAAE,KAAS,IAAA;AACX,QAAA,IAAI,WAAW,gBAAgB;AACrC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACjC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACjC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACjC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACnC;AAqBa,MAAA,cAAc,CAAC,mBAAuD;AAAA,EACjF,cAAc,EAAE,OAAO,cAAc;AAAA,EACrC,YAAY,EAAE,MAAM,KAAK,OAAO,EAAE;AAAA;AAAA,EAClC,aAAa,EAAE,MAAM,KAAK,OAAO,EAAE;AAAA;AAAA,EACnC,aAAa,EAAE,MAAM,KAAK,OAAO,IAAI;AAAA,EACrC,aAAa,EAAE,MAAM,KAAK,OAAO,IAAI;AAAA,EACrC,MAAM,EAAE,MAAM,KAAK,OAAO,EAAE;AAC9B;AAMO,SAAS,aACd,UACA,UACA,iBAAiB,GACX;AACN,MAAI,SAAS;AAAM;AACnB,WAAS,OAAO;AAEP,WAAA,kBAAkB,CAAC,WAAsF;AAChH,QAAK,OAAe;AAAY;AAC9B,WAAe,aAAa;AAEvB,WAAA,OAAO,OAAO,UAAU,QAAQ;AAEjC,UAAA;AAAA;AAAA,MAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQV,iBAAiB;AAAA,0BACjB,iBAAiB;AAAA;AAAA,IAEvC,OAAO;AAAA,IAGJ,QAAQ,iCAAiC,EAAE,EAG3C,QAAQ,mCAAmC,EAAE,EAG7C,QAAQ,2BAA2B,EAAE,EAGrC;AAAA,QACC;AAAA;AAAA,QACW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAuB2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EAgBvC;AAAA,QACC;AAAA;AAAA,QACW;AAAA;AAAA,MAEb;AAAA;AAEF,WAAO,eAAe;AAAA,EAAA;AAE1B;AAKO,MAAM,KAAgC;AAAA;AAAA;AAAA;AAAA;AAAA,EAY3C,YAAY,MAAa,iBAAiB,GAAG;AAXtC;AACA;AAEA;AACA;AACA;AAOC,UAAA,QAAQ,KAAK;AACb,UAAA,eAAe,kBAAkB,cAAc;AAC/C,UAAA,WAAW,YAAY,YAAY;AAEnC,UAAA,SAAS,CAAC,UAAU;AACpB,UAAA,iBAAiBC,MAAAA,QAAQ,iBAAiBC,qBAAe;AACrD,cAAA,WAAW,MAAM,SAAS,MAAM;AACzB,qBAAA,MAAM,UAAU,UAAU,cAAc;AAAA,MACvD;AAAA,IAAA,CACD;AAEI,SAAA,aAAa,IAAI,MAAM,cAAc;AACrC,SAAA,mBAAmB,IAAI,MAAM,cAAc;AAEhD,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEO,YAAuC,OAAe,OAAqB;AAC5E,QAAA,SAAS,KAAK,WAAW;AAAQ,YAAM,MAAM,6BAA6B;AACxE,UAAA,cAAc,MAAM;AACrB,SAAA,SAAS,YAAY,QAAQ;AAC7B,SAAA,iBAAiB,KAAK,IAAI;AAC1B,SAAA,WAAW,KAAK,IAAI;AACL,wBAAA,KAAK,cAAc,OAAO,KAAK;AAAA,EACrD;AAAA,EAEO,eAAe,QAAsB;AACrC,SAAA,SAAS,WAAW,SAAS;AAAA,EACpC;AACF;AACA,MAAM,6BAA6BC,MAAAA;AAK5B,MAAM,sBAGH,KAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlD,YAAY,OAAe,YAAoB,UAAqB,UAAqB;AACvF,UAAM,OAAO,IAAID,MAAc,cAAA,UAAU,UAAU,KAAK;AACnD,SAAA,eAAe,SAASE,MAAAA,gBAAgB;AAC7C,SAAK,gBAAgB;AACrB,UAAM,MAAM,UAAU;AAdjB;AACA;AAeL,SAAK,UAAU,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC;AACtC,SAAK,aAAa,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,aAAa,OAAqB;AACxC,WAAO,gBAAgB,KAAK,iBAAiB,KAAK,WAAW,KAAK,CAAC,GAAG,KAAK,WAAW,KAAK,GAAG,KAAK,QAAQ,KAAK,CAAC;AAC5G,SAAA,SAAS,YAAY,OAAO,MAAM;AAClC,SAAA,SAAS,eAAe,cAAc;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,yBAAyB,OAAe,QAAsB;AAC9D,SAAA,QAAQ,KAAK,KAAK;AACvB,SAAK,aAAa,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,SAAS,OAAe,SAAuB;AACpD,QAAI,MAAM,OAAO;AAAG,YAAM,MAAM,6CAA6C;AACxE,SAAA,WAAW,KAAK,IAAI;AACzB,SAAK,aAAa,KAAK;AAAA,EACzB;AACF;;;;;;;"}
|
1
|
+
{"version":3,"file":"CurveModifier.cjs","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":["DataTexture","RGBAFormat","FloatType","RepeatWrapping","NearestFilter","Mesh","InstancedMesh","Matrix4","DynamicDrawUsage"],"mappings":"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"}
|
@@ -4,7 +4,7 @@ var __publicField = (obj, key, value) => {
|
|
4
4
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
5
5
|
return value;
|
6
6
|
};
|
7
|
-
import { DataTexture, RGBAFormat, FloatType, RepeatWrapping, NearestFilter, Mesh, InstancedMesh,
|
7
|
+
import { DataTexture, RGBAFormat, FloatType, RepeatWrapping, NearestFilter, Mesh, InstancedMesh, Matrix4, DynamicDrawUsage } from "three";
|
8
8
|
const CHANNELS = 4;
|
9
9
|
const TEXTURE_WIDTH = 1024;
|
10
10
|
const TEXTURE_HEIGHT = 4;
|
@@ -169,7 +169,7 @@ class Flow {
|
|
169
169
|
this.uniforms.pathOffset.value += amount;
|
170
170
|
}
|
171
171
|
}
|
172
|
-
const matrix =
|
172
|
+
const matrix = new Matrix4();
|
173
173
|
class InstancedFlow extends Flow {
|
174
174
|
/**
|
175
175
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CurveModifier.js","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = /* @__PURE__ */ new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"CurveModifier.js","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":[],"mappings":"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"}
|
@@ -8,8 +8,8 @@ var __publicField = (obj, key, value) => {
|
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
9
|
const THREE = require("three");
|
10
10
|
const BufferGeometryUtils = require("../utils/BufferGeometryUtils.cjs");
|
11
|
-
const cb =
|
12
|
-
const ab =
|
11
|
+
const cb = new THREE.Vector3();
|
12
|
+
const ab = new THREE.Vector3();
|
13
13
|
function pushIfUnique(array, object) {
|
14
14
|
if (array.indexOf(object) === -1)
|
15
15
|
array.push(object);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SimplifyModifier.cjs","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = /* @__PURE__ */ new Vector3()\nconst ab = /* @__PURE__ */ new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["Vector3","BufferGeometryUtils.mergeVertices","BufferGeometry","Float32BufferAttribute"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"SimplifyModifier.cjs","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = new Vector3()\nconst ab = new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["Vector3","BufferGeometryUtils.mergeVertices","BufferGeometry","Float32BufferAttribute"],"mappings":"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"}
|
@@ -6,8 +6,8 @@ var __publicField = (obj, key, value) => {
|
|
6
6
|
};
|
7
7
|
import { Vector3, BufferGeometry, Float32BufferAttribute } from "three";
|
8
8
|
import { mergeVertices } from "../utils/BufferGeometryUtils.js";
|
9
|
-
const cb =
|
10
|
-
const ab =
|
9
|
+
const cb = new Vector3();
|
10
|
+
const ab = new Vector3();
|
11
11
|
function pushIfUnique(array, object) {
|
12
12
|
if (array.indexOf(object) === -1)
|
13
13
|
array.push(object);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SimplifyModifier.js","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = /* @__PURE__ */ new Vector3()\nconst ab = /* @__PURE__ */ new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["BufferGeometryUtils.mergeVertices"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"SimplifyModifier.js","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = new Vector3()\nconst ab = new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["BufferGeometryUtils.mergeVertices"],"mappings":";;;;;;;;AAGA,MAAM,KAAK,IAAI;AACf,MAAM,KAAK,IAAI;AAEf,SAAS,aAAoB,OAAgB,QAAqB;AAC5D,MAAA,MAAM,QAAQ,MAAM,MAAM;AAAI,UAAM,KAAK,MAAM;AACrD;AAEA,SAAS,gBAAuB,OAAgB,QAAqB;AAC7D,QAAA,IAAI,MAAM,QAAQ,MAAM;AAC9B,MAAI,IAAI;AAAU,UAAA,OAAO,GAAG,CAAC;AAC/B;AAEA,MAAM,OAAO;AAAA,EAcX,YAAY,GAAY,IAAY;AAb7B;AACC;AAED;AACA;AAEA;AACA;AAEA,mCAAkB;AAClB,qCAAoB;AACpB,qCAAoB;AAGzB,SAAK,WAAW;AAChB,SAAK,KAAK;AAEV,SAAK,QAAQ;AACb,SAAK,YAAY;AAGjB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEO,kBAAkB,QAAsB;AAChC,iBAAA,KAAK,WAAW,MAAM;AAAA,EACrC;AAAA,EAEO,oBAAoB,GAAiB;AAC1C,UAAM,YAAY,KAAK;AACvB,UAAM,QAAQ,KAAK;AAEb,UAAA,SAAS,UAAU,QAAQ,CAAC;AAClC,QAAI,WAAW;AAAI;AACnB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,MAAM,CAAC,EAAE,UAAU,CAAC;AAAG;AAAA,IAC7B;AAEU,cAAA,OAAO,QAAQ,CAAC;AAAA,EAC5B;AACF;AAGA,MAAM,SAAS;AAAA,EAWb,YAAY,IAAY,IAAY,IAAY,GAAW,GAAW,GAAW;AAVzE;AACA;AACA;AAED;AACA;AACA;AAEA,kCAAS,IAAI;AAGlB,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,IAAI;AAET,SAAK,KAAK;AACV,SAAK,KAAK;AACV,SAAK,KAAK;AAEV,SAAK,cAAc;AAEhB,OAAA,MAAM,KAAK,IAAI;AAClB,OAAG,kBAAkB,EAAE;AACvB,OAAG,kBAAkB,EAAE;AAEpB,OAAA,MAAM,KAAK,IAAI;AAClB,OAAG,kBAAkB,EAAE;AACvB,OAAG,kBAAkB,EAAE;AAEpB,OAAA,MAAM,KAAK,IAAI;AAClB,OAAG,kBAAkB,EAAE;AACvB,OAAG,kBAAkB,EAAE;AAAA,EACzB;AAAA,EAEQ,gBAAsB;AACtB,UAAA,KAAK,KAAK,GAAG;AACb,UAAA,KAAK,KAAK,GAAG;AACb,UAAA,KAAK,KAAK,GAAG;AAEhB,OAAA,WAAW,IAAI,EAAE;AACjB,OAAA,WAAW,IAAI,EAAE;AACjB,OAAA,MAAM,EAAE,EAAE,UAAU;AAElB,SAAA,OAAO,KAAK,EAAE;AAAA,EACrB;AAAA,EAEO,UAAU,GAAoB;AACnC,WAAO,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK;AAAA,EACtD;AAAA,EAEO,cAAc,MAAc,MAAoB;AACrD,QAAI,SAAS,KAAK;AAAI,WAAK,KAAK;AAAA,aACvB,SAAS,KAAK;AAAI,WAAK,KAAK;AAAA,aAC5B,SAAS,KAAK;AAAI,WAAK,KAAK;AAErB,oBAAA,KAAK,OAAO,IAAI;AAC3B,SAAA,MAAM,KAAK,IAAI;AAEf,SAAA,oBAAoB,KAAK,EAAE;AAC3B,SAAA,GAAG,oBAAoB,IAAI;AAE3B,SAAA,oBAAoB,KAAK,EAAE;AAC3B,SAAA,GAAG,oBAAoB,IAAI;AAE3B,SAAA,oBAAoB,KAAK,EAAE;AAC3B,SAAA,GAAG,oBAAoB,IAAI;AAE3B,SAAA,GAAG,kBAAkB,KAAK,EAAE;AAC5B,SAAA,GAAG,kBAAkB,KAAK,EAAE;AAE5B,SAAA,GAAG,kBAAkB,KAAK,EAAE;AAC5B,SAAA,GAAG,kBAAkB,KAAK,EAAE;AAE5B,SAAA,GAAG,kBAAkB,KAAK,EAAE;AAC5B,SAAA,GAAG,kBAAkB,KAAK,EAAE;AAEjC,SAAK,cAAc;AAAA,EACrB;AACF;AAUA,MAAM,iBAAiB;AAAA,EACrB,cAAc;AAEN,mDAA0B,CAAC,GAAW,MAAsB;AAIlE,YAAM,aAAa,EAAE,SAAS,WAAW,EAAE,QAAQ;AACnD,UAAI,YAAY;AAEhB,YAAM,YAAY,CAAA;AAClB,UAAI,GACF,KAAK,EAAE,MAAM,QACb,MACA;AAGF,WAAK,IAAI,GAAG,IAAI,IAAI,KAAK;AAChB,eAAA,EAAE,MAAM,CAAC;AAEZ,YAAA,KAAK,UAAU,CAAC,GAAG;AACrB,oBAAU,KAAK,IAAI;AAAA,QACrB;AAAA,MACF;AAIA,WAAK,IAAI,GAAG,IAAI,IAAI,KAAK;AACvB,YAAI,eAAe;AACZ,eAAA,EAAE,MAAM,CAAC;AAEhB,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,qBAAW,UAAU,CAAC;AAEtB,gBAAM,UAAU,KAAK,OAAO,IAAI,SAAS,MAAM;AAC/C,yBAAe,KAAK,IAAI,eAAe,QAAQ,WAAW,CAAC;AAAA,QAC7D;AAEY,oBAAA,KAAK,IAAI,WAAW,YAAY;AAAA,MAC9C;AAIA,YAAM,UAAU;AACZ,UAAA,UAAU,SAAS,GAAG;AAGZ,oBAAA;AAAA,MACd;AAEM,YAAA,MAAM,aAAa,YAAY;AAE9B,aAAA;AAAA,IAAA;AAcD,mDAA0B,CAAC,MAAoB;AAQjD,UAAA,EAAE,UAAU,WAAW,GAAG;AAE5B,UAAE,mBAAmB;AACrB,UAAE,eAAe;AAEjB;AAAA,MACF;AAEA,QAAE,eAAe;AACjB,QAAE,mBAAmB;AAGrB,eAAS,IAAI,GAAG,IAAI,EAAE,UAAU,QAAQ,KAAK;AAC3C,cAAM,eAAe,KAAK,wBAAwB,GAAG,EAAE,UAAU,CAAC,CAAC;AAE/D,YAAA,CAAC,EAAE,kBAAkB;AACrB,YAAA,mBAAmB,EAAE,UAAU,CAAC;AAClC,YAAE,eAAe;AACjB,YAAE,UAAU;AACZ,YAAE,YAAY;AACd,YAAE,YAAY;AAAA,QAChB;AAEE,UAAA;AACF,UAAE,aAAa;AAEX,YAAA,eAAe,EAAE,SAAS;AAC1B,YAAA,mBAAmB,EAAE,UAAU,CAAC;AAClC,YAAE,UAAU;AAAA,QACd;AAAA,MACF;AAGE,QAAA,eAAe,EAAE,YAAY,EAAE;AAAA,IAAA;AAI3B,sCAAa,CAAC,GAAa,UAA4B;AAC7D,sBAAgB,OAAO,CAAC;AAExB,UAAI,EAAE;AAAoB,wBAAA,EAAE,GAAG,OAAO,CAAC;AACvC,UAAI,EAAE;AAAoB,wBAAA,EAAE,GAAG,OAAO,CAAC;AACvC,UAAI,EAAE;AAAoB,wBAAA,EAAE,GAAG,OAAO,CAAC;AAGvC,YAAM,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;AAC5B,UAAI,IAAI;AAER,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAK,GAAG,CAAC;AACJ,aAAA,IAAI,IAAI,KAAK,CAAC;AAEf,YAAA,CAAC,MAAM,CAAC;AAAI;AAEhB,WAAG,oBAAoB,EAAE;AACzB,WAAG,oBAAoB,EAAE;AAAA,MAC3B;AAAA,IAAA;AAGM,oCAAW,CAAC,UAAoB,OAAmB,GAAW,MAAoB;AAKxF,UAAI,CAAC,GAAG;AAED,aAAA,aAAa,GAAG,QAAQ;AAC7B;AAAA,MACF;AAEI,UAAA;AACJ,YAAM,cAAc,CAAA;AAEpB,WAAK,IAAI,GAAG,IAAI,EAAE,UAAU,QAAQ,KAAK;AACvC,oBAAY,KAAK,EAAE,UAAU,CAAC,CAAC;AAAA,MACjC;AAGA,WAAK,IAAI,EAAE,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,YAAI,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG;AAC3B,eAAK,WAAW,EAAE,MAAM,CAAC,GAAG,KAAK;AAAA,QACnC;AAAA,MACF;AAGA,WAAK,IAAI,EAAE,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,UAAE,MAAM,CAAC,EAAE,cAAc,GAAG,CAAC;AAAA,MAC/B;AAEK,WAAA,aAAa,GAAG,QAAQ;AAG7B,WAAK,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAClC,aAAA,wBAAwB,YAAY,CAAC,CAAC;AAAA,MAC7C;AAAA,IAAA;AAGM,2CAAkB,CAAC,aAA+B;AAGpD,UAAA,QAAQ,SAAS,CAAC;AAEtB,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAI,SAAS,CAAC,EAAE,eAAe,MAAM,cAAc;AACjD,kBAAQ,SAAS,CAAC;AAAA,QACpB;AAAA,MACF;AAEO,aAAA;AAAA,IAAA;AAGF,kCAAS,CAAC,UAA0B,UAAkC;AAC3E,iBAAW,SAAS;AACpB,YAAM,aAAa,SAAS;AAI5B,eAAS,QAAQ,YAAY;AAC3B,YAAI,SAAS;AAAY,mBAAS,gBAAgB,IAAI;AAAA,MACxD;AAEW,iBAAAA,cAAkC,QAAQ;AAMrD,YAAM,WAAW,CAAA;AACjB,YAAM,QAAQ,CAAA;AAIR,YAAA,oBAAoB,SAAS,aAAa,UAAU;AAE1D,eAAS,IAAI,GAAG,IAAI,kBAAkB,OAAO,KAAK;AAChD,cAAM,IAAI,IAAI,QAAA,EAAU,oBAAoB,mBAAmB,CAAC;AAEhE,cAAM,SAAS,IAAI,OAAO,GAAG,CAAC;AAC9B,iBAAS,KAAK,MAAM;AAAA,MACtB;AAIM,YAAA,YAAY,SAAS;AAE3B,UAAI,cAAc,MAAM;AACtB,iBAAS,IAAI,GAAG,IAAI,UAAU,OAAO,KAAK,GAAG;AACrC,gBAAA,IAAI,UAAU,KAAK,CAAC;AAC1B,gBAAM,IAAI,UAAU,KAAK,IAAI,CAAC;AAC9B,gBAAM,IAAI,UAAU,KAAK,IAAI,CAAC;AAE9B,gBAAM,WAAW,IAAI,SAAS,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;AAC5E,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MAAA,OACK;AACL,iBAAS,IAAI,GAAG,IAAI,kBAAkB,OAAO,KAAK,GAAG;AACnD,gBAAM,IAAI;AACV,gBAAM,IAAI,IAAI;AACd,gBAAM,IAAI,IAAI;AAEd,gBAAM,WAAW,IAAI,SAAS,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;AAC5E,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MACF;AAIA,eAAS,IAAI,GAAG,KAAK,SAAS,QAAQ,IAAI,IAAI,KAAK;AAC5C,aAAA,wBAAwB,SAAS,CAAC,CAAC;AAAA,MAC1C;AAEI,UAAA;AAEJ,UAAI,IAAI;AAER,aAAO,KAAK;AACG,qBAAA,KAAK,gBAAgB,QAAQ;AAE1C,YAAI,CAAC,YAAY;AACf,kBAAQ,IAAI,wCAAwC;AACpD;AAAA,QAAA,OACK;AACL,eAAK,SAAS,UAAU,OAAO,YAAY,WAAW,gBAA0B;AAAA,QAClF;AAAA,MACF;AAIM,YAAA,qBAAqB,IAAI;AAC/B,YAAM,WAAW,CAAA;AACjB,UAAI,QAAQ,CAAA;AAIZ,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AAClC,cAAA,SAAS,SAAS,CAAC,EAAE;AAC3B,iBAAS,KAAK,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAAA,MAC5C;AAIA,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC/B,cAAA,OAAO,MAAM,CAAC;AAEpB,cAAM,IAAI,SAAS,QAAQ,KAAK,EAAE;AAClC,cAAM,IAAI,SAAS,QAAQ,KAAK,EAAE;AAClC,cAAM,IAAI,SAAS,QAAQ,KAAK,EAAE;AAE5B,cAAA,KAAK,GAAG,GAAG,CAAC;AAAA,MACpB;AAIA,yBAAmB,aAAa,YAAY,IAAI,uBAAuB,UAAU,CAAC,CAAC;AACnF,yBAAmB,SAAS,KAAK;AAE1B,aAAA;AAAA,IAAA;AAAA,EAjSM;AAAA,EAsDP,aAAa,GAAW,UAA0B;AACxD,YAAQ,OAAO,EAAE,MAAM,WAAW,CAAC;AAE5B,WAAA,EAAE,UAAU,QAAQ;AACnB,YAAA,IAAI,EAAE,UAAU,IAAI;AACV,sBAAA,EAAE,WAAW,CAAC;AAAA,IAChC;AAEA,oBAAgB,UAAU,CAAC;AAAA,EAC7B;AAoOF;"}
|
package/objects/BatchedMesh.cjs
CHANGED
@@ -8,8 +8,8 @@ var __publicField = (obj, key, value) => {
|
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
9
|
const THREE = require("three");
|
10
10
|
const ID_ATTR_NAME = "_batch_id_";
|
11
|
-
const _identityMatrix =
|
12
|
-
const _zeroScaleMatrix =
|
11
|
+
const _identityMatrix = new THREE.Matrix4();
|
12
|
+
const _zeroScaleMatrix = new THREE.Matrix4().set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
|
13
13
|
const batchingParsVertex = (
|
14
14
|
/* glsl */
|
15
15
|
`
|