@gnsx/three 0.185.16 → 0.186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +10 -82600
- package/build/three.core.js +1309 -807
- package/build/three.module.js +439 -338
- package/build/three.tsl.js +74 -44
- package/build/three.webgpu.js +6036 -2184
- package/build/three.webgpu.nodes.js +6020 -2184
- package/examples/jsm/Addons.js +6 -6
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +44 -20
- package/examples/jsm/controls/OrbitControls.js +9 -0
- package/examples/jsm/controls/TrackballControls.js +109 -4
- package/examples/jsm/csm/CSMShadowNode.js +13 -0
- package/examples/jsm/exporters/GLTFExporter.js +23 -7
- package/examples/jsm/exporters/USDZExporter.js +2 -2
- package/examples/jsm/generators/CityGenerator.js +377 -45
- package/examples/jsm/generators/ForestGenerator.js +12 -12
- package/examples/jsm/generators/TerrainGenerator.js +49 -37
- package/examples/jsm/generators/TreeGenerator.js +70 -76
- package/examples/jsm/generators/city/BenchGenerator.js +127 -0
- package/examples/jsm/generators/city/CarGenerator.js +479 -0
- package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
- package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
- package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
- package/examples/jsm/generators/city/PersonGenerator.js +447 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
- package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
- package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
- package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
- package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
- package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
- package/examples/jsm/gpgpu/CountingSort.js +271 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
- package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/examples/jsm/inspector/Extension.js +94 -0
- package/examples/jsm/inspector/Inspector.js +145 -41
- package/examples/jsm/inspector/RendererInspector.js +100 -52
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
- package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
- package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
- package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
- package/examples/jsm/inspector/tabs/Memory.js +0 -2
- package/examples/jsm/inspector/tabs/Settings.js +4 -0
- package/examples/jsm/inspector/tabs/Timeline.js +223 -171
- package/examples/jsm/inspector/tabs/Viewer.js +515 -21
- package/examples/jsm/inspector/ui/List.js +15 -9
- package/examples/jsm/inspector/ui/Profiler.js +170 -14
- package/examples/jsm/inspector/ui/Style.js +269 -23
- package/examples/jsm/inspector/ui/Tab.js +2 -0
- package/examples/jsm/inspector/ui/Values.js +14 -2
- package/examples/jsm/interactive/HTMLMesh.js +19 -3
- package/examples/jsm/lighting/LightProbeGrid.js +484 -889
- package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
- package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
- package/examples/jsm/lights/SunLight.js +95 -0
- package/examples/jsm/lights/SunLightNode.js +56 -0
- package/examples/jsm/lights/SunLightShadow.js +319 -0
- package/examples/jsm/lights/SunShadowNode.js +312 -0
- package/examples/jsm/loaders/3DMLoader.js +150 -49
- package/examples/jsm/loaders/3MFLoader.js +202 -1
- package/examples/jsm/loaders/FBXLoader.js +81 -5
- package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
- package/examples/jsm/loaders/GLTFLoader.js +79 -14
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
- package/examples/jsm/loaders/KSPLATLoader.js +463 -0
- package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/SPLATLoader.js +139 -0
- package/examples/jsm/loaders/SPZLoader.js +561 -0
- package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
- package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
- package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
- package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
- package/examples/jsm/loaders/usd/USDAParser.js +15 -2
- package/examples/jsm/loaders/usd/USDCParser.js +1 -4
- package/examples/jsm/loaders/usd/USDComposer.js +80 -42
- package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
- package/examples/jsm/misc/RollerCoaster.js +2 -2
- package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
- package/examples/jsm/misc/Sculptor.js +1679 -0
- package/examples/jsm/misc/SculptorMesh.js +1504 -0
- package/examples/jsm/misc/SculptorTools.js +1180 -0
- package/examples/jsm/misc/SculptorUtils.js +345 -0
- package/examples/jsm/misc/TubePainter.js +28 -16
- package/examples/jsm/misc/VolumeSlice.js +24 -24
- package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
- package/examples/jsm/objects/GaussianSplat.js +1039 -0
- package/examples/jsm/objects/Sky.js +66 -45
- package/examples/jsm/objects/SkyMesh.js +70 -51
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/GTAOPass.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +5 -5
- package/examples/jsm/postprocessing/SAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -2
- package/examples/jsm/postprocessing/SavePass.js +1 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
- package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +1 -1
- package/examples/jsm/shaders/FilmShader.js +2 -1
- package/examples/jsm/transpiler/AST.js +21 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
- package/examples/jsm/transpiler/TSLEncoder.js +82 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
- package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
- package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
- package/examples/jsm/tsl/display/BloomNode.js +55 -30
- package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
- package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
- package/examples/jsm/tsl/display/FSR1Node.js +8 -4
- package/examples/jsm/tsl/display/GTAONode.js +199 -86
- package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
- package/examples/jsm/tsl/display/GodraysNode.js +5 -2
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
- package/examples/jsm/tsl/display/LensflareNode.js +5 -2
- package/examples/jsm/tsl/display/OITPassNode.js +352 -0
- package/examples/jsm/tsl/display/OutlineNode.js +2 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
- package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
- package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
- package/examples/jsm/tsl/display/SMAANode.js +22 -61
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
- package/examples/jsm/tsl/display/SSAONode.js +436 -0
- package/examples/jsm/tsl/display/SSGINode.js +5 -2
- package/examples/jsm/tsl/display/SSRNode.js +7 -2
- package/examples/jsm/tsl/display/SSSNode.js +5 -2
- package/examples/jsm/tsl/display/SharpenNode.js +5 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
- package/examples/jsm/tsl/display/TAAUNode.js +22 -125
- package/examples/jsm/tsl/display/TRAANode.js +16 -142
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
- package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
- package/examples/jsm/tsl/display/hashBlur.js +3 -2
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
- package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
- package/examples/jsm/tsl/utils/Raymarching.js +5 -5
- package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
- package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
- package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
- package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
- package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
- package/package.json +9 -16
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +73 -43
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -0
- package/src/animation/AnimationClip.js +15 -2
- package/src/animation/AnimationObjectGroup.js +18 -6
- package/src/animation/AnimationUtils.js +26 -0
- package/src/animation/KeyframeTrack.js +37 -0
- package/src/constants.js +23 -1
- package/src/core/BufferAttribute.js +3 -2
- package/src/core/BufferGeometry.js +1 -1
- package/src/core/InterleavedBuffer.js +5 -1
- package/src/core/Object3D.js +40 -12
- package/src/core/Raycaster.js +4 -0
- package/src/core/RenderTarget.js +99 -9
- package/src/core/RenderTarget3D.js +12 -8
- package/src/extras/Controls.js +0 -8
- package/src/extras/PMREMGenerator.js +99 -205
- package/src/geometries/TorusGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +2 -0
- package/src/helpers/AxesHelper.js +2 -0
- package/src/helpers/Box3Helper.js +2 -0
- package/src/helpers/BoxHelper.js +2 -0
- package/src/helpers/CameraHelper.js +2 -0
- package/src/helpers/DirectionalLightHelper.js +2 -0
- package/src/helpers/GridHelper.js +2 -0
- package/src/helpers/HemisphereLightHelper.js +2 -0
- package/src/helpers/PlaneHelper.js +2 -0
- package/src/helpers/PointLightHelper.js +2 -0
- package/src/helpers/PolarGridHelper.js +2 -0
- package/src/helpers/SkeletonHelper.js +2 -0
- package/src/helpers/SpotLightHelper.js +2 -0
- package/src/lights/Light.js +0 -10
- package/src/lights/LightShadow.js +43 -12
- package/src/lights/SpotLightShadow.js +18 -0
- package/src/loaders/BufferGeometryLoader.js +5 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ObjectLoader.js +8 -5
- package/src/materials/Material.js +80 -57
- package/src/materials/MeshPhysicalMaterial.js +32 -0
- package/src/materials/nodes/Line2NodeMaterial.js +17 -8
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
- package/src/materials/nodes/NodeMaterial.js +19 -13
- package/src/materials/nodes/PointsNodeMaterial.js +2 -1
- package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
- package/src/math/Frustum.js +9 -0
- package/src/math/FrustumArray.js +1 -1
- package/src/math/MathUtils.js +5 -3
- package/src/math/Matrix4.js +2 -9
- package/src/math/Plane.js +30 -1
- package/src/math/Quaternion.js +0 -10
- package/src/math/Ray.js +95 -45
- package/src/math/Triangle.js +0 -2
- package/src/math/Vector3.js +2 -2
- package/src/math/Vector4.js +0 -4
- package/src/math/interpolants/BezierInterpolant.js +36 -23
- package/src/nodes/Nodes.js +2 -0
- package/src/nodes/TSL.js +11 -3
- package/src/nodes/accessors/Batch.js +85 -13
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/Instance.js +19 -18
- package/src/nodes/accessors/MaterialNode.js +9 -0
- package/src/nodes/accessors/ModelNode.js +85 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
- package/src/nodes/accessors/ReferenceElementNode.js +72 -0
- package/src/nodes/accessors/ReferenceNode.js +1 -70
- package/src/nodes/accessors/Skinning.js +124 -12
- package/src/nodes/accessors/StorageTextureNode.js +7 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +51 -21
- package/src/nodes/accessors/TextureSizeNode.js +4 -2
- package/src/nodes/accessors/UniformArrayNode.js +30 -5
- package/src/nodes/code/CodeNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +12 -2
- package/src/nodes/core/ArrayNode.js +2 -2
- package/src/nodes/core/ContextNode.js +57 -4
- package/src/nodes/core/IndexNode.js +69 -4
- package/src/nodes/core/InspectorNode.js +2 -2
- package/src/nodes/core/MRTNode.js +44 -2
- package/src/nodes/core/Node.js +6 -3
- package/src/nodes/core/NodeBuilder.js +65 -50
- package/src/nodes/core/NodeFrame.js +11 -3
- package/src/nodes/core/NodeUtils.js +88 -0
- package/src/nodes/core/PropertyNode.js +8 -0
- package/src/nodes/core/StackNode.js +0 -1
- package/src/nodes/core/StructNode.js +4 -3
- package/src/nodes/core/UniformGroupNode.js +3 -2
- package/src/nodes/core/UniformNode.js +26 -12
- package/src/nodes/core/VarNode.js +0 -1
- package/src/nodes/display/BumpMapNode.js +2 -2
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/PassNode.js +76 -15
- package/src/nodes/display/ScreenNode.js +22 -65
- package/src/nodes/fog/Fog.js +4 -4
- package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
- package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
- package/src/nodes/functions/BSDF/LTC.js +1 -1
- package/src/nodes/functions/PhongLightingModel.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +83 -25
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
- package/src/nodes/gpgpu/BarrierNode.js +13 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +20 -17
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
- package/src/nodes/lighting/EnvironmentNode.js +40 -4
- package/src/nodes/lighting/LightsNode.js +20 -4
- package/src/nodes/lighting/ShadowBaseNode.js +158 -1
- package/src/nodes/lighting/ShadowFilterNode.js +2 -106
- package/src/nodes/lighting/ShadowNode.js +22 -91
- package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
- package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
- package/src/nodes/materialx/MaterialXCore.js +37 -0
- package/src/nodes/materialx/MaterialXNodes.js +64 -72
- package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
- package/src/nodes/math/BitcountNode.js +24 -4
- package/src/nodes/math/MathNode.js +4 -4
- package/src/nodes/math/MathUtils.js +15 -4
- package/src/nodes/math/OperatorNode.js +2 -2
- package/src/nodes/math/PackFloatNode.js +29 -1
- package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
- package/src/nodes/math/UnpackFloatNode.js +30 -2
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +31 -74
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLCore.js +1 -31
- package/src/nodes/utils/EventNode.js +75 -0
- package/src/nodes/utils/LoopNode.js +54 -13
- package/src/nodes/utils/PostProcessingUtils.js +23 -2
- package/src/nodes/utils/RTTNode.js +97 -32
- package/src/nodes/utils/ReflectorNode.js +8 -4
- package/src/nodes/utils/RotateNode.js +85 -8
- package/src/nodes/utils/SpriteUtils.js +58 -23
- package/src/objects/BatchedMesh.js +6 -0
- package/src/objects/InstancedMesh.js +1 -1
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +12 -0
- package/src/objects/Mesh.js +12 -0
- package/src/objects/Points.js +12 -0
- package/src/objects/Sprite.js +12 -0
- package/src/renderers/WebGLRenderer.js +93 -27
- package/src/renderers/common/Animation.js +12 -2
- package/src/renderers/common/Backend.js +38 -10
- package/src/renderers/common/BindGroup.js +0 -1
- package/src/renderers/common/Bindings.js +50 -4
- package/src/renderers/common/BundleGroup.js +4 -0
- package/src/renderers/common/ClippingContext.js +11 -1
- package/src/renderers/common/Color4.js +9 -0
- package/src/renderers/common/Constants.js +0 -5
- package/src/renderers/common/DirectRenderPipeline.js +233 -0
- package/src/renderers/common/Geometries.js +24 -3
- package/src/renderers/common/Info.js +3 -3
- package/src/renderers/common/InspectorBase.js +37 -8
- package/src/renderers/common/Lighting.js +11 -4
- package/src/renderers/common/Pipelines.js +6 -4
- package/src/renderers/common/QuadMesh.js +16 -2
- package/src/renderers/common/RenderContext.js +8 -0
- package/src/renderers/common/RenderList.js +53 -19
- package/src/renderers/common/RenderLists.js +58 -11
- package/src/renderers/common/RenderObject.js +14 -0
- package/src/renderers/common/RenderObjects.js +14 -9
- package/src/renderers/common/RenderPipeline.js +52 -44
- package/src/renderers/common/Renderer.js +226 -55
- package/src/renderers/common/Storage3DTexture.js +16 -0
- package/src/renderers/common/Textures.js +3 -3
- package/src/renderers/common/XRManager.js +79 -72
- package/src/renderers/common/extras/PMREMGenerator.js +76 -144
- package/src/renderers/common/nodes/NodeManager.js +144 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
- package/src/renderers/shaders/DFGLUTData.js +2 -1
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/shaders/UniformsLib.js +16 -0
- package/src/renderers/webgl/WebGLAnimation.js +2 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLLights.js +74 -4
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLOutput.js +36 -24
- package/src/renderers/webgl/WebGLProgram.js +3 -0
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLRenderLists.js +6 -10
- package/src/renderers/webgl/WebGLShadowMap.js +47 -44
- package/src/renderers/webgl/WebGLTextures.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
- package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
- package/src/renderers/webgpu/WebGPUBackend.js +513 -145
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
- package/src/renderers/webxr/WebXRManager.js +25 -2
- package/src/scenes/Scene.js +3 -3
- package/src/textures/CompressedArrayTexture.js +16 -0
- package/src/textures/Data3DTexture.js +16 -0
- package/src/textures/DataArrayTexture.js +16 -0
- package/src/textures/DepthTexture.js +3 -3
- package/src/textures/Texture.js +3 -3
- package/src/textures/{Source.js → TextureSource.js} +39 -8
- package/src/utils.js +6 -79
- package/build/three.core.min.js +0 -6
- package/build/three.module.min.js +0 -6
- package/build/three.tsl.min.js +0 -6
- package/build/three.webgpu.min.js +0 -6
- package/build/three.webgpu.nodes.min.js +0 -6
- package/examples/jsm/libs/ecsy.module.js +0 -1792
- package/examples/jsm/loaders/LottieLoader.js +0 -130
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
Float32BufferAttribute,
|
|
5
|
-
Vector2,
|
|
6
|
-
Vector3,
|
|
7
|
-
Vector4
|
|
2
|
+
BufferAttribute,
|
|
3
|
+
BufferGeometry
|
|
8
4
|
} from '@gnsx/three';
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
const _cb = new Vector3(), _ab = new Vector3();
|
|
5
|
+
import { MeshoptSimplifier } from '../libs/meshopt_simplifier.module.js';
|
|
6
|
+
import { mergeVertices } from '../utils/BufferGeometryUtils.js';
|
|
12
7
|
|
|
13
8
|
/**
|
|
14
9
|
* This class can be used to modify a geometry by simplifying it. A typical use
|
|
15
10
|
* case for such a modifier is automatic LOD generation.
|
|
16
11
|
*
|
|
17
|
-
* The implementation is based on [
|
|
18
|
-
*
|
|
12
|
+
* The implementation is based on [meshoptimizer]{@link https://github.com/zeux/meshoptimizer}.
|
|
13
|
+
* If you only need a simplified index buffer, use {@link MeshoptSimplifier} directly.
|
|
19
14
|
*
|
|
20
15
|
* ```js
|
|
21
16
|
* const modifier = new SimplifyModifier();
|
|
22
|
-
* geometry = modifier.modify( geometry );
|
|
17
|
+
* geometry = await modifier.modify( geometry, count );
|
|
23
18
|
* ```
|
|
24
19
|
*
|
|
25
20
|
* @three_import import { SimplifyModifier } from 'three/addons/modifiers/SimplifyModifier.js';
|
|
@@ -27,206 +22,113 @@ const _cb = new Vector3(), _ab = new Vector3();
|
|
|
27
22
|
class SimplifyModifier {
|
|
28
23
|
|
|
29
24
|
/**
|
|
30
|
-
* Returns a new,
|
|
31
|
-
*
|
|
25
|
+
* Returns a new, simplified version of the given geometry. The vertex buffers
|
|
26
|
+
* of the result only contain vertices referenced by the simplified index.
|
|
32
27
|
*
|
|
28
|
+
* @async
|
|
33
29
|
* @param {BufferGeometry} geometry - The geometry to modify.
|
|
34
|
-
* @param {number} count - The number of vertices to remove.
|
|
35
|
-
* @return {BufferGeometry} A new, modified geometry.
|
|
30
|
+
* @param {number} count - The approximate number of vertices to remove.
|
|
31
|
+
* @return {Promise<BufferGeometry>} A promise that resolves with the new, modified geometry.
|
|
36
32
|
*/
|
|
37
|
-
modify( geometry, count ) {
|
|
38
|
-
|
|
39
|
-
geometry = geometry.clone();
|
|
40
|
-
|
|
41
|
-
// currently morphAttributes are not supported
|
|
42
|
-
delete geometry.morphAttributes.position;
|
|
43
|
-
delete geometry.morphAttributes.normal;
|
|
44
|
-
const attributes = geometry.attributes;
|
|
45
|
-
|
|
46
|
-
// this modifier can only process indexed and non-indexed geometries with at least a position attribute
|
|
47
|
-
|
|
48
|
-
for ( const name in attributes ) {
|
|
49
|
-
|
|
50
|
-
if ( name !== 'position' && name !== 'uv' && name !== 'normal' && name !== 'tangent' && name !== 'color' ) geometry.deleteAttribute( name );
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
geometry = BufferGeometryUtils.mergeVertices( geometry );
|
|
33
|
+
async modify( geometry, count ) {
|
|
55
34
|
|
|
56
|
-
|
|
57
|
-
// put data of original geometry in different data structures
|
|
58
|
-
//
|
|
35
|
+
await MeshoptSimplifier.ready;
|
|
59
36
|
|
|
60
|
-
|
|
61
|
-
const faces = [];
|
|
37
|
+
// non-indexed geometries must be welded so the simplifier can collapse edges
|
|
62
38
|
|
|
63
|
-
|
|
39
|
+
if ( geometry.getIndex() === null ) geometry = mergeVertices( geometry );
|
|
64
40
|
|
|
41
|
+
const index = geometry.getIndex();
|
|
65
42
|
const positionAttribute = geometry.getAttribute( 'position' );
|
|
66
|
-
const uvAttribute = geometry.getAttribute( 'uv' );
|
|
67
|
-
const normalAttribute = geometry.getAttribute( 'normal' );
|
|
68
|
-
const tangentAttribute = geometry.getAttribute( 'tangent' );
|
|
69
|
-
const colorAttribute = geometry.getAttribute( 'color' );
|
|
70
|
-
|
|
71
|
-
let t = null;
|
|
72
|
-
let v2 = null;
|
|
73
|
-
let nor = null;
|
|
74
|
-
let col = null;
|
|
75
|
-
|
|
76
|
-
for ( let i = 0; i < positionAttribute.count; i ++ ) {
|
|
77
|
-
|
|
78
|
-
const v = new Vector3().fromBufferAttribute( positionAttribute, i );
|
|
79
|
-
if ( uvAttribute ) {
|
|
80
|
-
|
|
81
|
-
v2 = new Vector2().fromBufferAttribute( uvAttribute, i );
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if ( normalAttribute ) {
|
|
86
|
-
|
|
87
|
-
nor = new Vector3().fromBufferAttribute( normalAttribute, i );
|
|
88
|
-
|
|
89
|
-
}
|
|
90
43
|
|
|
91
|
-
|
|
44
|
+
// the simplifier requires tightly packed positions
|
|
92
45
|
|
|
93
|
-
|
|
46
|
+
const positions = new Float32Array( positionAttribute.count * 3 );
|
|
94
47
|
|
|
95
|
-
|
|
48
|
+
for ( let i = 0; i < positionAttribute.count; i ++ ) {
|
|
96
49
|
|
|
97
|
-
|
|
50
|
+
positions[ i * 3 + 0 ] = positionAttribute.getX( i );
|
|
51
|
+
positions[ i * 3 + 1 ] = positionAttribute.getY( i );
|
|
52
|
+
positions[ i * 3 + 2 ] = positionAttribute.getZ( i );
|
|
98
53
|
|
|
99
|
-
|
|
54
|
+
}
|
|
100
55
|
|
|
101
|
-
|
|
56
|
+
const ratio = Math.min( 1, Math.max( 0, 1 - count / positionAttribute.count ) );
|
|
57
|
+
const targetIndexCount = Math.max( 3, Math.floor( index.count * ratio / 3 ) * 3 );
|
|
102
58
|
|
|
103
|
-
|
|
104
|
-
|
|
59
|
+
// normals and uvs, when present, contribute to the error metric so collapses
|
|
60
|
+
// that would distort shading or texture seams are penalized
|
|
105
61
|
|
|
106
|
-
|
|
62
|
+
const normalAttribute = geometry.getAttribute( 'normal' );
|
|
63
|
+
const uvAttribute = geometry.getAttribute( 'uv' );
|
|
64
|
+
const attributeStride = ( normalAttribute ? 3 : 0 ) + ( uvAttribute ? 2 : 0 );
|
|
107
65
|
|
|
108
|
-
|
|
66
|
+
let indices;
|
|
109
67
|
|
|
110
|
-
|
|
68
|
+
if ( attributeStride > 0 ) {
|
|
111
69
|
|
|
112
|
-
|
|
70
|
+
const vertexAttributes = new Float32Array( positionAttribute.count * attributeStride );
|
|
71
|
+
const attributeWeights = [];
|
|
113
72
|
|
|
114
|
-
|
|
73
|
+
if ( normalAttribute ) attributeWeights.push( 0.25, 0.25, 0.25 );
|
|
74
|
+
if ( uvAttribute ) attributeWeights.push( 0.5, 0.5 );
|
|
115
75
|
|
|
116
|
-
|
|
117
|
-
const b = index.getX( i + 1 );
|
|
118
|
-
const c = index.getX( i + 2 );
|
|
76
|
+
for ( let i = 0, o = 0; i < positionAttribute.count; i ++ ) {
|
|
119
77
|
|
|
120
|
-
|
|
121
|
-
faces.push( triangle );
|
|
78
|
+
if ( normalAttribute ) {
|
|
122
79
|
|
|
123
|
-
|
|
80
|
+
vertexAttributes[ o ++ ] = normalAttribute.getX( i );
|
|
81
|
+
vertexAttributes[ o ++ ] = normalAttribute.getY( i );
|
|
82
|
+
vertexAttributes[ o ++ ] = normalAttribute.getZ( i );
|
|
124
83
|
|
|
125
|
-
|
|
84
|
+
}
|
|
126
85
|
|
|
127
|
-
|
|
86
|
+
if ( uvAttribute ) {
|
|
128
87
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const c = i + 2;
|
|
88
|
+
vertexAttributes[ o ++ ] = uvAttribute.getX( i );
|
|
89
|
+
vertexAttributes[ o ++ ] = uvAttribute.getY( i );
|
|
132
90
|
|
|
133
|
-
|
|
134
|
-
faces.push( triangle );
|
|
91
|
+
}
|
|
135
92
|
|
|
136
93
|
}
|
|
137
94
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
// compute all edge collapse costs
|
|
95
|
+
indices = MeshoptSimplifier.simplifyWithAttributes( index.array, positions, 3, vertexAttributes, attributeStride, attributeWeights, null, targetIndexCount, 1 )[ 0 ];
|
|
141
96
|
|
|
142
|
-
|
|
97
|
+
} else {
|
|
143
98
|
|
|
144
|
-
|
|
99
|
+
indices = MeshoptSimplifier.simplify( index.array, positions, 3, targetIndexCount, 1 )[ 0 ];
|
|
145
100
|
|
|
146
101
|
}
|
|
147
102
|
|
|
148
|
-
|
|
103
|
+
// drop vertices that are no longer referenced and rebuild the attributes
|
|
149
104
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
while ( z -- ) {
|
|
153
|
-
|
|
154
|
-
nextVertex = minimumCostEdge( vertices );
|
|
155
|
-
|
|
156
|
-
if ( ! nextVertex ) {
|
|
157
|
-
|
|
158
|
-
console.log( 'THREE.SimplifyModifier: No next vertex' );
|
|
159
|
-
break;
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
collapse( vertices, faces, nextVertex, nextVertex.collapseNeighbor );
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
//
|
|
105
|
+
const [ remap, unique ] = MeshoptSimplifier.compactMesh( indices ); // rewrites indices in place
|
|
168
106
|
|
|
169
107
|
const simplifiedGeometry = new BufferGeometry();
|
|
170
|
-
const position = [];
|
|
171
|
-
const uv = [];
|
|
172
|
-
const normal = [];
|
|
173
|
-
const tangent = [];
|
|
174
|
-
const color = [];
|
|
175
|
-
|
|
176
|
-
index = [];
|
|
177
|
-
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
for ( let i = 0; i < vertices.length; i ++ ) {
|
|
181
108
|
|
|
182
|
-
|
|
183
|
-
position.push( vertex.position.x, vertex.position.y, vertex.position.z );
|
|
184
|
-
if ( vertex.uv ) {
|
|
109
|
+
for ( const name in geometry.attributes ) {
|
|
185
110
|
|
|
186
|
-
|
|
111
|
+
const attribute = geometry.getAttribute( name );
|
|
112
|
+
const itemSize = attribute.itemSize;
|
|
113
|
+
const newAttribute = new BufferAttribute( new attribute.array.constructor( unique * itemSize ), itemSize, attribute.normalized );
|
|
187
114
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if ( vertex.normal ) {
|
|
115
|
+
// scatter each vertex to its new slot; 0xffffffff marks unreferenced vertices
|
|
191
116
|
|
|
192
|
-
|
|
117
|
+
for ( let i = 0; i < remap.length; i ++ ) {
|
|
193
118
|
|
|
194
|
-
|
|
119
|
+
const target = remap[ i ];
|
|
195
120
|
|
|
196
|
-
|
|
121
|
+
if ( target === 0xffffffff ) continue;
|
|
197
122
|
|
|
198
|
-
|
|
123
|
+
for ( let k = 0; k < itemSize; k ++ ) newAttribute.setComponent( target, k, attribute.getComponent( i, k ) );
|
|
199
124
|
|
|
200
125
|
}
|
|
201
126
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
color.push( vertex.color.r, vertex.color.g, vertex.color.b );
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
// cache final index to GREATLY speed up faces reconstruction
|
|
210
|
-
vertex.id = i;
|
|
211
|
-
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
//
|
|
215
|
-
|
|
216
|
-
for ( let i = 0; i < faces.length; i ++ ) {
|
|
217
|
-
|
|
218
|
-
const face = faces[ i ];
|
|
219
|
-
index.push( face.v1.id, face.v2.id, face.v3.id );
|
|
127
|
+
simplifiedGeometry.setAttribute( name, newAttribute );
|
|
220
128
|
|
|
221
129
|
}
|
|
222
130
|
|
|
223
|
-
simplifiedGeometry.
|
|
224
|
-
if ( uv.length > 0 ) simplifiedGeometry.setAttribute( 'uv', new Float32BufferAttribute( uv, 2 ) );
|
|
225
|
-
if ( normal.length > 0 ) simplifiedGeometry.setAttribute( 'normal', new Float32BufferAttribute( normal, 3 ) );
|
|
226
|
-
if ( tangent.length > 0 ) simplifiedGeometry.setAttribute( 'tangent', new Float32BufferAttribute( tangent, 4 ) );
|
|
227
|
-
if ( color.length > 0 ) simplifiedGeometry.setAttribute( 'color', new Float32BufferAttribute( color, 3 ) );
|
|
228
|
-
|
|
229
|
-
simplifiedGeometry.setIndex( index );
|
|
131
|
+
simplifiedGeometry.setIndex( new BufferAttribute( indices, 1 ) );
|
|
230
132
|
|
|
231
133
|
return simplifiedGeometry;
|
|
232
134
|
|
|
@@ -234,399 +136,4 @@ class SimplifyModifier {
|
|
|
234
136
|
|
|
235
137
|
}
|
|
236
138
|
|
|
237
|
-
function pushIfUnique( array, object ) {
|
|
238
|
-
|
|
239
|
-
if ( array.indexOf( object ) === - 1 ) array.push( object );
|
|
240
|
-
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
function removeFromArray( array, object ) {
|
|
244
|
-
|
|
245
|
-
const k = array.indexOf( object );
|
|
246
|
-
if ( k > - 1 ) array.splice( k, 1 );
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
function computeEdgeCollapseCost( u, v ) {
|
|
251
|
-
|
|
252
|
-
// if we collapse edge uv by moving u to v then how
|
|
253
|
-
// much different will the model change, i.e. the "error".
|
|
254
|
-
|
|
255
|
-
const edgelength = v.position.distanceTo( u.position );
|
|
256
|
-
let curvature = 0;
|
|
257
|
-
|
|
258
|
-
const sideFaces = [];
|
|
259
|
-
|
|
260
|
-
// find the "sides" triangles that are on the edge uv
|
|
261
|
-
for ( let i = 0, il = u.faces.length; i < il; i ++ ) {
|
|
262
|
-
|
|
263
|
-
const face = u.faces[ i ];
|
|
264
|
-
|
|
265
|
-
if ( face.hasVertex( v ) ) {
|
|
266
|
-
|
|
267
|
-
sideFaces.push( face );
|
|
268
|
-
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// use the triangle facing most away from the sides
|
|
274
|
-
// to determine our curvature term
|
|
275
|
-
for ( let i = 0, il = u.faces.length; i < il; i ++ ) {
|
|
276
|
-
|
|
277
|
-
let minCurvature = 1;
|
|
278
|
-
const face = u.faces[ i ];
|
|
279
|
-
|
|
280
|
-
for ( let j = 0; j < sideFaces.length; j ++ ) {
|
|
281
|
-
|
|
282
|
-
const sideFace = sideFaces[ j ];
|
|
283
|
-
// use dot product of face normals.
|
|
284
|
-
const dotProd = face.normal.dot( sideFace.normal );
|
|
285
|
-
minCurvature = Math.min( minCurvature, ( 1.001 - dotProd ) / 2 );
|
|
286
|
-
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
curvature = Math.max( curvature, minCurvature );
|
|
290
|
-
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// crude approach in attempt to preserve borders
|
|
294
|
-
// though it seems not to be totally correct
|
|
295
|
-
const borders = 0;
|
|
296
|
-
|
|
297
|
-
if ( sideFaces.length < 2 ) {
|
|
298
|
-
|
|
299
|
-
// we add some arbitrary cost for borders,
|
|
300
|
-
// borders += 10;
|
|
301
|
-
curvature = 1;
|
|
302
|
-
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const amt = edgelength * curvature + borders;
|
|
306
|
-
|
|
307
|
-
return amt;
|
|
308
|
-
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
function computeEdgeCostAtVertex( v ) {
|
|
312
|
-
|
|
313
|
-
// compute the edge collapse cost for all edges that start
|
|
314
|
-
// from vertex v. Since we are only interested in reducing
|
|
315
|
-
// the object by selecting the min cost edge at each step, we
|
|
316
|
-
// only cache the cost of the least cost edge at this vertex
|
|
317
|
-
// (in member variable collapse) as well as the value of the
|
|
318
|
-
// cost (in member variable collapseCost).
|
|
319
|
-
|
|
320
|
-
if ( v.neighbors.length === 0 ) {
|
|
321
|
-
|
|
322
|
-
// collapse if no neighbors.
|
|
323
|
-
v.collapseNeighbor = null;
|
|
324
|
-
v.collapseCost = - 0.01;
|
|
325
|
-
|
|
326
|
-
return;
|
|
327
|
-
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
v.collapseCost = 100000;
|
|
331
|
-
v.collapseNeighbor = null;
|
|
332
|
-
|
|
333
|
-
// search all neighboring edges for "least cost" edge
|
|
334
|
-
for ( let i = 0; i < v.neighbors.length; i ++ ) {
|
|
335
|
-
|
|
336
|
-
const collapseCost = computeEdgeCollapseCost( v, v.neighbors[ i ] );
|
|
337
|
-
|
|
338
|
-
if ( ! v.collapseNeighbor ) {
|
|
339
|
-
|
|
340
|
-
v.collapseNeighbor = v.neighbors[ i ];
|
|
341
|
-
v.collapseCost = collapseCost;
|
|
342
|
-
v.minCost = collapseCost;
|
|
343
|
-
v.totalCost = 0;
|
|
344
|
-
v.costCount = 0;
|
|
345
|
-
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
v.costCount ++;
|
|
349
|
-
v.totalCost += collapseCost;
|
|
350
|
-
|
|
351
|
-
if ( collapseCost < v.minCost ) {
|
|
352
|
-
|
|
353
|
-
v.collapseNeighbor = v.neighbors[ i ];
|
|
354
|
-
v.minCost = collapseCost;
|
|
355
|
-
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// we average the cost of collapsing at this vertex
|
|
361
|
-
v.collapseCost = v.totalCost / v.costCount;
|
|
362
|
-
// v.collapseCost = v.minCost;
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
function removeVertex( v, vertices ) {
|
|
367
|
-
|
|
368
|
-
console.assert( v.faces.length === 0 );
|
|
369
|
-
|
|
370
|
-
while ( v.neighbors.length ) {
|
|
371
|
-
|
|
372
|
-
const n = v.neighbors.pop();
|
|
373
|
-
removeFromArray( n.neighbors, v );
|
|
374
|
-
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
removeFromArray( vertices, v );
|
|
378
|
-
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
function removeFace( f, faces ) {
|
|
382
|
-
|
|
383
|
-
removeFromArray( faces, f );
|
|
384
|
-
|
|
385
|
-
if ( f.v1 ) removeFromArray( f.v1.faces, f );
|
|
386
|
-
if ( f.v2 ) removeFromArray( f.v2.faces, f );
|
|
387
|
-
if ( f.v3 ) removeFromArray( f.v3.faces, f );
|
|
388
|
-
|
|
389
|
-
// TODO optimize this!
|
|
390
|
-
const vs = [ f.v1, f.v2, f.v3 ];
|
|
391
|
-
|
|
392
|
-
for ( let i = 0; i < 3; i ++ ) {
|
|
393
|
-
|
|
394
|
-
const v1 = vs[ i ];
|
|
395
|
-
const v2 = vs[ ( i + 1 ) % 3 ];
|
|
396
|
-
|
|
397
|
-
if ( ! v1 || ! v2 ) continue;
|
|
398
|
-
|
|
399
|
-
v1.removeIfNonNeighbor( v2 );
|
|
400
|
-
v2.removeIfNonNeighbor( v1 );
|
|
401
|
-
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
function collapse( vertices, faces, u, v ) {
|
|
407
|
-
|
|
408
|
-
// Collapse the edge uv by moving vertex u onto v
|
|
409
|
-
|
|
410
|
-
if ( ! v ) {
|
|
411
|
-
|
|
412
|
-
// u is a vertex all by itself so just delete it..
|
|
413
|
-
removeVertex( u, vertices );
|
|
414
|
-
return;
|
|
415
|
-
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
if ( v.uv ) {
|
|
419
|
-
|
|
420
|
-
u.uv.copy( v.uv );
|
|
421
|
-
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if ( v.normal ) {
|
|
425
|
-
|
|
426
|
-
v.normal.add( u.normal ).normalize();
|
|
427
|
-
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
if ( v.tangent ) {
|
|
431
|
-
|
|
432
|
-
v.tangent.add( u.tangent ).normalize();
|
|
433
|
-
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
const tmpVertices = [];
|
|
437
|
-
|
|
438
|
-
for ( let i = 0; i < u.neighbors.length; i ++ ) {
|
|
439
|
-
|
|
440
|
-
tmpVertices.push( u.neighbors[ i ] );
|
|
441
|
-
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
// delete triangles on edge uv:
|
|
446
|
-
for ( let i = u.faces.length - 1; i >= 0; i -- ) {
|
|
447
|
-
|
|
448
|
-
if ( u.faces[ i ] && u.faces[ i ].hasVertex( v ) ) {
|
|
449
|
-
|
|
450
|
-
removeFace( u.faces[ i ], faces );
|
|
451
|
-
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
// update remaining triangles to have v instead of u
|
|
457
|
-
for ( let i = u.faces.length - 1; i >= 0; i -- ) {
|
|
458
|
-
|
|
459
|
-
u.faces[ i ].replaceVertex( u, v );
|
|
460
|
-
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
removeVertex( u, vertices );
|
|
465
|
-
|
|
466
|
-
// recompute the edge collapse costs in neighborhood
|
|
467
|
-
for ( let i = 0; i < tmpVertices.length; i ++ ) {
|
|
468
|
-
|
|
469
|
-
computeEdgeCostAtVertex( tmpVertices[ i ] );
|
|
470
|
-
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
function minimumCostEdge( vertices ) {
|
|
478
|
-
|
|
479
|
-
// O(n * n) approach. TODO optimize this
|
|
480
|
-
|
|
481
|
-
let least = vertices[ 0 ];
|
|
482
|
-
|
|
483
|
-
for ( let i = 0; i < vertices.length; i ++ ) {
|
|
484
|
-
|
|
485
|
-
if ( vertices[ i ].collapseCost < least.collapseCost ) {
|
|
486
|
-
|
|
487
|
-
least = vertices[ i ];
|
|
488
|
-
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
return least;
|
|
494
|
-
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
// we use a triangle class to represent structure of face slightly differently
|
|
498
|
-
|
|
499
|
-
class Triangle {
|
|
500
|
-
|
|
501
|
-
constructor( v1, v2, v3, a, b, c ) {
|
|
502
|
-
|
|
503
|
-
this.a = a;
|
|
504
|
-
this.b = b;
|
|
505
|
-
this.c = c;
|
|
506
|
-
|
|
507
|
-
this.v1 = v1;
|
|
508
|
-
this.v2 = v2;
|
|
509
|
-
this.v3 = v3;
|
|
510
|
-
|
|
511
|
-
this.normal = new Vector3();
|
|
512
|
-
|
|
513
|
-
this.computeNormal();
|
|
514
|
-
|
|
515
|
-
v1.faces.push( this );
|
|
516
|
-
v1.addUniqueNeighbor( v2 );
|
|
517
|
-
v1.addUniqueNeighbor( v3 );
|
|
518
|
-
|
|
519
|
-
v2.faces.push( this );
|
|
520
|
-
v2.addUniqueNeighbor( v1 );
|
|
521
|
-
v2.addUniqueNeighbor( v3 );
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
v3.faces.push( this );
|
|
525
|
-
v3.addUniqueNeighbor( v1 );
|
|
526
|
-
v3.addUniqueNeighbor( v2 );
|
|
527
|
-
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
computeNormal() {
|
|
531
|
-
|
|
532
|
-
const vA = this.v1.position;
|
|
533
|
-
const vB = this.v2.position;
|
|
534
|
-
const vC = this.v3.position;
|
|
535
|
-
|
|
536
|
-
_cb.subVectors( vC, vB );
|
|
537
|
-
_ab.subVectors( vA, vB );
|
|
538
|
-
_cb.cross( _ab ).normalize();
|
|
539
|
-
|
|
540
|
-
this.normal.copy( _cb );
|
|
541
|
-
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
hasVertex( v ) {
|
|
545
|
-
|
|
546
|
-
return v === this.v1 || v === this.v2 || v === this.v3;
|
|
547
|
-
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
replaceVertex( oldv, newv ) {
|
|
551
|
-
|
|
552
|
-
if ( oldv === this.v1 ) this.v1 = newv;
|
|
553
|
-
else if ( oldv === this.v2 ) this.v2 = newv;
|
|
554
|
-
else if ( oldv === this.v3 ) this.v3 = newv;
|
|
555
|
-
|
|
556
|
-
removeFromArray( oldv.faces, this );
|
|
557
|
-
newv.faces.push( this );
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
oldv.removeIfNonNeighbor( this.v1 );
|
|
561
|
-
this.v1.removeIfNonNeighbor( oldv );
|
|
562
|
-
|
|
563
|
-
oldv.removeIfNonNeighbor( this.v2 );
|
|
564
|
-
this.v2.removeIfNonNeighbor( oldv );
|
|
565
|
-
|
|
566
|
-
oldv.removeIfNonNeighbor( this.v3 );
|
|
567
|
-
this.v3.removeIfNonNeighbor( oldv );
|
|
568
|
-
|
|
569
|
-
this.v1.addUniqueNeighbor( this.v2 );
|
|
570
|
-
this.v1.addUniqueNeighbor( this.v3 );
|
|
571
|
-
|
|
572
|
-
this.v2.addUniqueNeighbor( this.v1 );
|
|
573
|
-
this.v2.addUniqueNeighbor( this.v3 );
|
|
574
|
-
|
|
575
|
-
this.v3.addUniqueNeighbor( this.v1 );
|
|
576
|
-
this.v3.addUniqueNeighbor( this.v2 );
|
|
577
|
-
|
|
578
|
-
this.computeNormal();
|
|
579
|
-
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
class Vertex {
|
|
585
|
-
|
|
586
|
-
constructor( v, uv, normal, tangent, color ) {
|
|
587
|
-
|
|
588
|
-
this.position = v;
|
|
589
|
-
this.uv = uv;
|
|
590
|
-
this.normal = normal;
|
|
591
|
-
this.tangent = tangent;
|
|
592
|
-
this.color = color;
|
|
593
|
-
|
|
594
|
-
this.id = - 1; // external use position in vertices list (for e.g. face generation)
|
|
595
|
-
|
|
596
|
-
this.faces = []; // faces vertex is connected
|
|
597
|
-
this.neighbors = []; // neighbouring vertices aka "adjacentVertices"
|
|
598
|
-
|
|
599
|
-
// these will be computed in computeEdgeCostAtVertex()
|
|
600
|
-
this.collapseCost = 0; // cost of collapsing this vertex, the less the better. aka objdist
|
|
601
|
-
this.collapseNeighbor = null; // best candidate for collapsing
|
|
602
|
-
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
addUniqueNeighbor( vertex ) {
|
|
606
|
-
|
|
607
|
-
pushIfUnique( this.neighbors, vertex );
|
|
608
|
-
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
removeIfNonNeighbor( n ) {
|
|
612
|
-
|
|
613
|
-
const neighbors = this.neighbors;
|
|
614
|
-
const faces = this.faces;
|
|
615
|
-
|
|
616
|
-
const offset = neighbors.indexOf( n );
|
|
617
|
-
|
|
618
|
-
if ( offset === - 1 ) return;
|
|
619
|
-
|
|
620
|
-
for ( let i = 0; i < faces.length; i ++ ) {
|
|
621
|
-
|
|
622
|
-
if ( faces[ i ].hasVertex( n ) ) return;
|
|
623
|
-
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
neighbors.splice( offset, 1 );
|
|
627
|
-
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
}
|
|
631
|
-
|
|
632
139
|
export { SimplifyModifier };
|