@unikia/upe-renderer 0.186.110 → 0.187.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -7
- package/UPSTREAM.md +4 -4
- package/build/three.core.js +853 -277
- package/build/three.module.js +1098 -1280
- package/build/three.tsl.js +41938 -686
- package/build/three.webgpu.js +10604 -49055
- package/build/three.webgpu.nodes.js +9249 -5788
- package/examples/jsm/Addons.js +2 -0
- package/examples/jsm/animation/CCDIKSolver.js +17 -5
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +27 -14
- package/examples/jsm/csm/CSMShader.js +74 -3
- package/examples/jsm/curves/CurveExtras.js +4 -4
- package/examples/jsm/curves/NURBSCurve.js +14 -0
- package/examples/jsm/exporters/EXRExporter.js +673 -16
- package/examples/jsm/exporters/GLTFExporter.js +4 -4
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/OBJExporter.js +48 -5
- package/examples/jsm/exporters/PLYExporter.js +22 -11
- package/examples/jsm/generators/CityGenerator.js +3 -2
- package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
- package/examples/jsm/gpgpu/BitonicSort.js +30 -23
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
- package/examples/jsm/inspector/Extension.js +1 -1
- package/examples/jsm/inspector/Inspector.js +6 -46
- package/examples/jsm/inspector/RendererInspector.js +43 -8
- package/examples/jsm/inspector/Storage.js +49 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
- package/examples/jsm/inspector/tabs/Parameters.js +5 -1
- package/examples/jsm/inspector/tabs/Performance.js +22 -7
- package/examples/jsm/inspector/tabs/Settings.js +1 -1
- package/examples/jsm/inspector/tabs/Timeline.js +83 -7
- package/examples/jsm/inspector/tabs/Viewer.js +25 -10
- package/examples/jsm/inspector/ui/Profiler.js +1 -1
- package/examples/jsm/inspector/ui/Style.js +21 -53
- package/examples/jsm/inspector/ui/Values.js +28 -3
- package/examples/jsm/libs/fflate.module.js +83 -56
- package/examples/jsm/libs/mikktspace.README.md +27 -0
- package/examples/jsm/libs/mikktspace.module.js +721 -109
- package/examples/jsm/lighting/ClusteredLighting.js +100 -2
- package/examples/jsm/lighting/LightMapper.js +295 -0
- package/examples/jsm/lighting/LightProbeGrid.js +242 -139
- package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
- package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
- package/examples/jsm/lights/SunLight.js +9 -4
- package/examples/jsm/lights/SunLightNode.js +3 -3
- package/examples/jsm/lines/LineMaterial.js +26 -10
- package/examples/jsm/loaders/3DMLoader.js +10 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +2 -0
- package/examples/jsm/loaders/BVHLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +8 -0
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +5 -1
- package/examples/jsm/loaders/EXRLoader.js +120 -104
- package/examples/jsm/loaders/FBXLoader.js +4 -0
- package/examples/jsm/loaders/FontLoader.js +2 -0
- package/examples/jsm/loaders/GCodeLoader.js +5 -9
- package/examples/jsm/loaders/GLTFLoader.js +112 -31
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
- package/examples/jsm/loaders/IESLoader.js +46 -12
- package/examples/jsm/loaders/JXLLoader.js +159 -0
- package/examples/jsm/loaders/KMZLoader.js +6 -0
- package/examples/jsm/loaders/KSPLATLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +49 -4
- package/examples/jsm/loaders/KTXLoader.js +5 -3
- package/examples/jsm/loaders/LDrawLoader.js +15 -22
- package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
- package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
- package/examples/jsm/loaders/LUTImageLoader.js +2 -0
- package/examples/jsm/loaders/LWOLoader.js +6 -0
- package/examples/jsm/loaders/MD2Loader.js +2 -0
- package/examples/jsm/loaders/MDDLoader.js +4 -0
- package/examples/jsm/loaders/MTLLoader.js +8 -0
- package/examples/jsm/loaders/MaterialXLoader.js +57 -5
- package/examples/jsm/loaders/NRRDLoader.js +4 -2
- package/examples/jsm/loaders/OBJLoader.js +10 -4
- package/examples/jsm/loaders/PCDLoader.js +6 -2
- package/examples/jsm/loaders/PDBLoader.js +5 -3
- package/examples/jsm/loaders/PLYLoader.js +39 -15
- package/examples/jsm/loaders/PVRLoader.js +2 -2
- package/examples/jsm/loaders/SPLATLoader.js +2 -0
- package/examples/jsm/loaders/SPZLoader.js +2 -0
- package/examples/jsm/loaders/STLLoader.js +3 -1
- package/examples/jsm/loaders/SVGLoader.js +27 -49
- package/examples/jsm/loaders/TDSLoader.js +4 -0
- package/examples/jsm/loaders/TGALoader.js +6 -5
- package/examples/jsm/loaders/TTFLoader.js +2 -0
- package/examples/jsm/loaders/USDLoader.js +14 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
- package/examples/jsm/loaders/VOXLoader.js +3 -0
- package/examples/jsm/loaders/VRMLLoader.js +4 -0
- package/examples/jsm/loaders/VTKLoader.js +2 -0
- package/examples/jsm/loaders/XYZLoader.js +2 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
- package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
- package/examples/jsm/loaders/usd/USDAParser.js +56 -47
- package/examples/jsm/loaders/usd/USDComposer.js +25 -30
- package/examples/jsm/math/ColorConverter.js +7 -3
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/OBB.js +3 -3
- package/examples/jsm/math/Octree.js +20 -17
- package/examples/jsm/objects/GaussianSplat.js +5 -4
- package/examples/jsm/objects/Reflector.js +5 -0
- package/examples/jsm/objects/SkyMesh.js +14 -7
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +2 -2
- package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
- package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
- package/examples/jsm/postprocessing/BokehPass.js +1 -1
- package/examples/jsm/postprocessing/GTAOPass.js +26 -18
- package/examples/jsm/renderers/SVGRenderer.js +3 -2
- package/examples/jsm/shaders/GTAOShader.js +7 -4
- package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
- package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
- package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
- package/examples/jsm/tsl/display/FSR1Node.js +3 -3
- package/examples/jsm/tsl/display/FXAANode.js +3 -10
- package/examples/jsm/tsl/display/FilmNode.js +3 -3
- package/examples/jsm/tsl/display/GTAONode.js +33 -25
- package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
- package/examples/jsm/tsl/display/GodraysNode.js +5 -19
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
- package/examples/jsm/tsl/display/OITPassNode.js +0 -11
- package/examples/jsm/tsl/display/OutlineNode.js +107 -5
- package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
- package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAONode.js +6 -20
- package/examples/jsm/tsl/display/SSGINode.js +36 -29
- package/examples/jsm/tsl/display/SSRNode.js +135 -63
- package/examples/jsm/tsl/display/SSSNode.js +6 -20
- package/examples/jsm/tsl/display/SharpenNode.js +3 -3
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/TAAUNode.js +10 -42
- package/examples/jsm/tsl/display/TRAANode.js +11 -43
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
- package/examples/jsm/tsl/display/TransitionNode.js +3 -3
- package/examples/jsm/tsl/display/lensDirt.js +30 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
- package/examples/jsm/tsl/utils/Raymarching.js +1 -1
- package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
- package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
- package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
- package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
- package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -1
- package/examples/jsm/utils/SceneUtils.js +1 -1
- package/examples/jsm/utils/unwrapUVs.js +865 -0
- package/examples/jsm/webxr/XREstimatedLight.js +11 -4
- package/package.json +3 -3
- package/src/Three.TSL.js +2 -683
- package/src/Three.WebGPU.Nodes.js +2 -1
- package/src/Three.WebGPU.js +2 -1
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationUtils.js +1 -3
- package/src/animation/KeyframeTrack.js +19 -0
- package/src/cameras/ArrayCamera.js +12 -0
- package/src/cameras/CubeCamera.js +3 -3
- package/src/constants.js +1 -9
- package/src/core/BufferAttribute.js +57 -21
- package/src/core/BufferGeometry.js +5 -13
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +28 -18
- package/src/core/InterleavedBufferAttribute.js +54 -20
- package/src/core/Object3D.js +19 -9
- package/src/core/Raycaster.js +2 -0
- package/src/core/RenderTarget.js +11 -5
- package/src/core/UniformsGroup.js +7 -3
- package/src/extras/PMREMGenerator.js +392 -685
- package/src/extras/core/Curve.js +4 -0
- package/src/extras/core/CurvePath.js +13 -0
- package/src/extras/core/ShapePath.js +1 -1
- package/src/geometries/EdgesGeometry.js +12 -10
- package/src/geometries/LatheGeometry.js +2 -0
- package/src/helpers/PolarGridHelper.js +1 -1
- package/src/lights/Light.js +11 -0
- package/src/lights/LightProbe.js +2 -0
- package/src/lights/LightShadow.js +2 -0
- package/src/loaders/AnimationLoader.js +2 -0
- package/src/loaders/AudioLoader.js +2 -0
- package/src/loaders/BufferGeometryLoader.js +2 -0
- package/src/loaders/CompressedTextureLoader.js +2 -0
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/DataTextureLoader.js +2 -0
- package/src/loaders/FileLoader.js +2 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ImageLoader.js +1 -0
- package/src/loaders/Loader.js +47 -0
- package/src/loaders/MaterialLoader.js +2 -0
- package/src/loaders/ObjectLoader.js +27 -8
- package/src/loaders/TextureLoader.js +5 -3
- package/src/loaders/nodes/NodeLoader.js +2 -0
- package/src/materials/Material.js +21 -2
- package/src/materials/MeshDepthMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +1 -1
- package/src/materials/MeshMatcapMaterial.js +1 -1
- package/src/materials/MeshNormalMaterial.js +1 -1
- package/src/materials/MeshPhongMaterial.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +90 -11
- package/src/materials/MeshStandardMaterial.js +1 -1
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +32 -10
- package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
- package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
- package/src/materials/nodes/NodeMaterial.js +36 -16
- package/src/materials/nodes/NodeMaterialInstance.js +193 -0
- package/src/materials/nodes/NodeMaterials.js +1 -0
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
- package/src/math/Box3.js +2 -2
- package/src/math/Color.js +8 -8
- package/src/math/ColorManagement.js +2 -21
- package/src/math/FrustumArray.js +12 -0
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +2 -4
- package/src/math/MathUtils.js +33 -46
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +1 -1
- package/src/math/Matrix4.js +1 -1
- package/src/math/Triangle.js +2 -1
- package/src/math/Vector2.js +1 -1
- package/src/math/Vector3.js +1 -1
- package/src/math/Vector4.js +1 -1
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +2 -0
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/Batch.js +29 -23
- package/src/nodes/accessors/BufferAttributeNode.js +21 -1
- package/src/nodes/accessors/BuiltinNode.js +6 -0
- package/src/nodes/accessors/Camera.js +100 -93
- package/src/nodes/accessors/ClippingNode.js +17 -6
- package/src/nodes/accessors/CubeTextureNode.js +12 -24
- package/src/nodes/accessors/Instance.js +198 -160
- package/src/nodes/accessors/Lights.js +19 -6
- package/src/nodes/accessors/MaterialNode.js +33 -4
- package/src/nodes/accessors/Morph.js +81 -22
- package/src/nodes/accessors/Normal.js +0 -42
- package/src/nodes/accessors/Object3DNode.js +6 -0
- package/src/nodes/accessors/PointUVNode.js +6 -0
- package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
- package/src/nodes/accessors/ReferenceNode.js +6 -0
- package/src/nodes/accessors/Skinning.js +57 -52
- package/src/nodes/accessors/StorageBufferNode.js +3 -12
- package/src/nodes/accessors/TextureBicubic.js +30 -27
- package/src/nodes/accessors/TextureNode.js +164 -78
- package/src/nodes/accessors/TextureSizeNode.js +6 -0
- package/src/nodes/accessors/UniformArrayNode.js +8 -15
- package/src/nodes/accessors/VelocityNode.js +13 -8
- package/src/nodes/code/CodeNode.js +6 -0
- package/src/nodes/code/ExpressionNode.js +6 -0
- package/src/nodes/code/FunctionCallNode.js +3 -3
- package/src/nodes/code/FunctionNode.js +15 -13
- package/src/nodes/core/ArrayNode.js +3 -3
- package/src/nodes/core/AssignNode.js +10 -9
- package/src/nodes/core/AttributeNode.js +39 -0
- package/src/nodes/core/BypassNode.js +6 -0
- package/src/nodes/core/ConstNode.js +31 -1
- package/src/nodes/core/ContextNode.js +11 -6
- package/src/nodes/core/IndexNode.js +6 -0
- package/src/nodes/core/InputNode.js +6 -0
- package/src/nodes/core/InspectorNode.js +17 -31
- package/src/nodes/core/IsolateNode.js +8 -0
- package/src/nodes/core/Node.js +367 -67
- package/src/nodes/core/NodeBuilder.js +664 -222
- package/src/nodes/core/NodeUtils.js +25 -0
- package/src/nodes/core/NodeVar.js +10 -1
- package/src/nodes/core/OutputStructNode.js +6 -0
- package/src/nodes/core/OverrideContextNode.js +38 -37
- package/src/nodes/core/PropertyNode.js +14 -0
- package/src/nodes/core/StackNode.js +33 -21
- package/src/nodes/core/StructNode.js +6 -0
- package/src/nodes/core/StructTypeNode.js +6 -0
- package/src/nodes/core/SubBuildNode.js +8 -0
- package/src/nodes/core/TempNode.js +10 -35
- package/src/nodes/core/UniformGroupNode.js +6 -0
- package/src/nodes/core/VarNode.js +43 -135
- package/src/nodes/core/VaryingNode.js +33 -2
- package/src/nodes/display/BlendModes.js +5 -40
- package/src/nodes/display/BumpMapNode.js +17 -7
- package/src/nodes/display/ColorAdjustment.js +22 -10
- package/src/nodes/display/ColorSpaceFunctions.js +2 -14
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +6 -0
- package/src/nodes/display/NormalMapNode.js +3 -3
- package/src/nodes/display/PassNode.js +75 -16
- package/src/nodes/display/RenderOutputNode.js +22 -5
- package/src/nodes/display/ScreenNode.js +6 -0
- package/src/nodes/display/ToneMappingFunctions.js +9 -51
- package/src/nodes/display/ToneMappingNode.js +3 -3
- package/src/nodes/display/ToonOutlinePassNode.js +66 -2
- package/src/nodes/display/ViewportDepthNode.js +34 -4
- package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
- package/src/nodes/functions/BSDF/D_GGX.js +1 -8
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
- package/src/nodes/functions/BSDF/LTC.js +20 -47
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
- package/src/nodes/functions/PhysicalLightingModel.js +84 -51
- package/src/nodes/functions/VolumetricLightingModel.js +1 -1
- package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
- package/src/nodes/functions/material/getRoughness.js +3 -1
- package/src/nodes/geometry/RangeNode.js +52 -69
- package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
- package/src/nodes/gpgpu/BarrierNode.js +6 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
- package/src/nodes/gpgpu/ComputeNode.js +6 -0
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
- package/src/nodes/lighting/AnalyticLightNode.js +7 -14
- package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
- package/src/nodes/lighting/EnvironmentNode.js +58 -8
- package/src/nodes/lighting/IESSpotLightNode.js +19 -4
- package/src/nodes/lighting/LightProbeNode.js +2 -1
- package/src/nodes/lighting/LightUtils.js +2 -2
- package/src/nodes/lighting/LightingNode.js +6 -0
- package/src/nodes/lighting/LightsNode.js +26 -32
- package/src/nodes/lighting/PointShadowNode.js +92 -48
- package/src/nodes/lighting/ProjectorLightNode.js +1 -1
- package/src/nodes/lighting/RectAreaLightNode.js +13 -14
- package/src/nodes/lighting/ShadowBaseNode.js +9 -17
- package/src/nodes/lighting/ShadowFilterNode.js +26 -3
- package/src/nodes/lighting/ShadowNode.js +13 -11
- package/src/nodes/materialx/MaterialXColor.js +2 -14
- package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
- package/src/nodes/materialx/MaterialXNodes.js +8 -11
- package/src/nodes/materialx/MaterialXNoise.js +195 -454
- package/src/nodes/math/BitcastNode.js +5 -5
- package/src/nodes/math/BitcountNode.js +18 -46
- package/src/nodes/math/ConditionalNode.js +92 -22
- package/src/nodes/math/Hash.js +1 -1
- package/src/nodes/math/MathNode.js +86 -64
- package/src/nodes/math/MathUtils.js +2 -2
- package/src/nodes/math/OperatorNode.js +42 -59
- package/src/nodes/math/PackFloatNode.js +9 -9
- package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
- package/src/nodes/math/TriNoise3D.js +3 -23
- package/src/nodes/math/UnpackFloatNode.js +9 -9
- package/src/nodes/pmrem/PMREMNode.js +38 -75
- package/src/nodes/pmrem/PMREMUtils.js +108 -272
- package/src/nodes/procedural/Checker.js +1 -1
- package/src/nodes/tsl/TSLCore.js +199 -74
- package/src/nodes/utils/ArrayElementNode.js +19 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +2 -2
- package/src/nodes/utils/EventNode.js +6 -0
- package/src/nodes/utils/FlipNode.js +3 -3
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +14 -9
- package/src/nodes/utils/MemberNode.js +18 -0
- package/src/nodes/utils/PostProcessingUtils.js +20 -25
- package/src/nodes/utils/RTTNode.js +2 -0
- package/src/nodes/utils/ReflectorNode.js +24 -0
- package/src/nodes/utils/RotateNode.js +3 -3
- package/src/nodes/utils/SampleNode.js +6 -0
- package/src/nodes/utils/SetNode.js +3 -3
- package/src/nodes/utils/SplitNode.js +6 -0
- package/src/nodes/utils/UVUtils.js +2 -2
- package/src/objects/BatchedMesh.js +146 -15
- package/src/objects/InstancedMesh.js +12 -4
- package/src/objects/Line.js +20 -0
- package/src/objects/Mesh.js +8 -0
- package/src/objects/Points.js +20 -0
- package/src/objects/Skeleton.js +26 -0
- package/src/objects/SkinnedMesh.js +3 -3
- package/src/objects/Sprite.js +10 -0
- package/src/renderers/WebGLRenderer.js +104 -70
- package/src/renderers/common/Animation.js +5 -1
- package/src/renderers/common/Attributes.js +67 -57
- package/src/renderers/common/Backend.js +78 -3
- package/src/renderers/common/BindGroup.js +11 -0
- package/src/renderers/common/Binding.js +0 -11
- package/src/renderers/common/Bindings.js +116 -10
- package/src/renderers/common/Buffer.js +1 -1
- package/src/renderers/common/ClippingContext.js +12 -1
- package/src/renderers/common/ComputePipeline.js +17 -1
- package/src/renderers/common/DirectRenderPipeline.js +7 -3
- package/src/renderers/common/Geometries.js +170 -132
- package/src/renderers/common/Info.js +1 -1
- package/src/renderers/common/InspectorBase.js +5 -5
- package/src/renderers/common/Lighting.js +59 -0
- package/src/renderers/common/Pipelines.js +26 -12
- package/src/renderers/common/ProgrammableStage.js +1 -17
- package/src/renderers/common/RenderContext.js +21 -0
- package/src/renderers/common/RenderContexts.js +13 -4
- package/src/renderers/common/RenderObject.js +111 -35
- package/src/renderers/common/RenderObjects.js +37 -19
- package/src/renderers/common/Renderer.js +537 -295
- package/src/renderers/common/RendererUtils.js +15 -0
- package/src/renderers/common/StandardDrawingPipeline.js +343 -0
- package/src/renderers/common/Storage3DTexture.js +11 -0
- package/src/renderers/common/StorageArrayTexture.js +10 -0
- package/src/renderers/common/StorageTexture.js +0 -9
- package/src/renderers/common/Textures.js +144 -37
- package/src/renderers/common/UniformsGroup.js +19 -0
- package/src/renderers/common/XRManager.js +10 -91
- package/src/renderers/common/extras/PMREMGenerator.js +298 -576
- package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
- package/src/renderers/common/nodes/NodeLibrary.js +11 -35
- package/src/renderers/common/nodes/NodeManager.js +80 -31
- package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
- package/src/renderers/common/nodes/NodeSampler.js +14 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
- package/src/renderers/shaders/ShaderLib.js +3 -0
- package/src/renderers/shaders/UniformsLib.js +4 -5
- package/src/renderers/webgl/WebGLBackground.js +3 -3
- package/src/renderers/webgl/WebGLBindingStates.js +4 -2
- package/src/renderers/webgl/WebGLCapabilities.js +7 -1
- package/src/renderers/webgl/WebGLEnvironments.js +2 -2
- package/src/renderers/webgl/WebGLGeometries.js +42 -14
- package/src/renderers/webgl/WebGLMaterials.js +15 -2
- package/src/renderers/webgl/WebGLOutput.js +37 -1
- package/src/renderers/webgl/WebGLProgram.js +13 -54
- package/src/renderers/webgl/WebGLPrograms.js +22 -8
- package/src/renderers/webgl/WebGLRenderStates.js +11 -8
- package/src/renderers/webgl/WebGLShadowMap.js +6 -4
- package/src/renderers/webgl/WebGLState.js +10 -6
- package/src/renderers/webgl/WebGLTextures.js +129 -77
- package/src/renderers/webgl/WebGLUniforms.js +44 -6
- package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
- package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
- package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
- package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
- package/src/renderers/webgpu/WebGPUBackend.js +140 -82
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
- package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
- package/src/renderers/webxr/WebXRController.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +5 -90
- package/src/scenes/Scene.js +4 -4
- package/src/textures/CompressedTexture.js +2 -2
- package/src/textures/DepthTexture.js +2 -2
- package/src/textures/FramebufferTexture.js +11 -0
- package/src/textures/Texture.js +29 -1
- package/src/textures/TextureSource.js +1 -1
- package/src/upe.js +1 -1
- package/src/utils.js +4 -4
- package/examples/jsm/libs/surfaceNet.js +0 -201
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { Box3, StorageBufferAttribute, Vector4 } from 'three/webgpu';
|
|
2
|
+
import { vec2, storage, uniform, uniformArray } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
import { MeshoptClusterizer } from '../libs/meshopt_clusterizer.module.js';
|
|
5
|
+
import { MeshoptSimplifier } from '../libs/meshopt_simplifier.module.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Utilities to process geometries into clusters (meshlets) of 64 triangles with a chain of simplified
|
|
9
|
+
* levels of detail, used by the meshlet drawing pipelines.
|
|
10
|
+
*
|
|
11
|
+
* @module MeshletGeometryUtils
|
|
12
|
+
* @three_import import * as MeshletGeometryUtils from 'three/addons/utils/MeshletGeometryUtils.js';
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The number of triangles of a meshlet. Meshlets are padded with degenerate triangles to this size.
|
|
17
|
+
*
|
|
18
|
+
* @type {number}
|
|
19
|
+
* @constant
|
|
20
|
+
*/
|
|
21
|
+
export const MESHLET_SIZE = 64;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Resolves when the meshoptimizer modules are ready to process geometries.
|
|
25
|
+
*
|
|
26
|
+
* @type {Promise}
|
|
27
|
+
*/
|
|
28
|
+
export const ready = Promise.all( [ MeshoptClusterizer.ready, MeshoptSimplifier.ready ] );
|
|
29
|
+
|
|
30
|
+
// simplified levels of detail. levels beyond the first may collapse edges across attribute seams
|
|
31
|
+
// ( Permissive ): faceted geometries like buildings have seams at every hard edge, which would
|
|
32
|
+
// otherwise block the simplification. small disconnected parts are removed if the error allows it ( Prune )
|
|
33
|
+
|
|
34
|
+
const LOD_TARGETS = [
|
|
35
|
+
{ ratio: 1.0, error: 0.0, weights: [ 0.25, 0.25, 0.25, 0.5, 0.5 ], flags: [] },
|
|
36
|
+
{ ratio: 0.55, error: 0.004, weights: [ 0.2, 0.2, 0.2, 0.35, 0.35 ], flags: [ 'RegularizeLight', 'Permissive', 'Prune' ] },
|
|
37
|
+
{ ratio: 0.25, error: 0.015, weights: [ 0.12, 0.12, 0.12, 0.2, 0.2 ], flags: [ 'RegularizeLight', 'Permissive', 'Prune' ] },
|
|
38
|
+
{ ratio: 0.1, error: 0.05, weights: [ 0.08, 0.08, 0.08, 0.12, 0.12 ], flags: [ 'RegularizeLight', 'Permissive', 'Prune' ] },
|
|
39
|
+
{ ratio: 0.04, error: 0.14, weights: [ 0.04, 0.04, 0.04, 0.06, 0.06 ], flags: [ 'Regularize', 'Permissive', 'Prune' ] },
|
|
40
|
+
{ ratio: 0.015, error: 0.3, weights: [ 0.02, 0.02, 0.02, 0.03, 0.03 ], flags: [ 'Regularize', 'Permissive', 'Prune' ] }
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The maximum number of levels of detail of a geometry.
|
|
45
|
+
*
|
|
46
|
+
* @type {number}
|
|
47
|
+
* @constant
|
|
48
|
+
*/
|
|
49
|
+
export const MAX_LODS = LOD_TARGETS.length;
|
|
50
|
+
|
|
51
|
+
// a level which removes less than 15% of the triangles of the previous level is simplified again without
|
|
52
|
+
// preserving the topology, allowing a larger error
|
|
53
|
+
|
|
54
|
+
const MIN_LOD_REDUCTION = 0.85;
|
|
55
|
+
const SLOPPY_ERROR_SCALE = 4;
|
|
56
|
+
|
|
57
|
+
// the clusters are drawn by pulling the vertices with their global index, so the vertices per cluster are
|
|
58
|
+
// not limited by a local vertex buffer. faceted geometries share few vertices between triangles, a limit of
|
|
59
|
+
// 64 vertices would end meshlets at ~32 triangles and pad the rest with degenerate triangles
|
|
60
|
+
|
|
61
|
+
const MAX_MESHLET_VERTICES = MESHLET_SIZE * 3;
|
|
62
|
+
|
|
63
|
+
// returns the components of a vec4 node used by an attribute of the given item size
|
|
64
|
+
|
|
65
|
+
const swizzle = ( node, itemSize ) => itemSize === 1 ? node.x : itemSize === 2 ? node.xy : itemSize === 3 ? node.xyz : node;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Builds meshlets of 64 triangles and a chain of simplified levels of detail for the given geometry.
|
|
69
|
+
* Identical vertices are welded first and all levels index the same vertices. The vertex data is
|
|
70
|
+
* interleaved into one storage buffer and accessed through the returned functions.
|
|
71
|
+
*
|
|
72
|
+
* @param {BufferGeometry} geometry - The geometry, with position and normal attributes.
|
|
73
|
+
* @param {?Object} [group=null] - An optional material group whose triangles are processed independently.
|
|
74
|
+
* @return {Object} The meshlet data.
|
|
75
|
+
*/
|
|
76
|
+
export function createMeshlets( geometry, group = null ) {
|
|
77
|
+
|
|
78
|
+
const positionAttribute = geometry.attributes.position;
|
|
79
|
+
const normalAttribute = geometry.attributes.normal;
|
|
80
|
+
const uvAttribute = geometry.attributes.uv;
|
|
81
|
+
const sourceCount = positionAttribute.count;
|
|
82
|
+
const indexCount = geometry.index !== null ? geometry.index.count : sourceCount;
|
|
83
|
+
const start = group !== null ? group.start : 0;
|
|
84
|
+
const count = group !== null ? Math.floor( Math.min( group.count, indexCount - start ) / 3 ) * 3 : indexCount;
|
|
85
|
+
const referenced = group !== null ? new Uint8Array( sourceCount ) : null;
|
|
86
|
+
|
|
87
|
+
if ( referenced !== null ) {
|
|
88
|
+
|
|
89
|
+
for ( let i = start; i < start + count; i ++ ) referenced[ geometry.index !== null ? geometry.index.getX( i ) : i ] = 1;
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// other attributes are reconstructed per fragment as well, e.g. for custom material nodes
|
|
94
|
+
|
|
95
|
+
const extras = Object.keys( geometry.attributes )
|
|
96
|
+
.filter( ( name ) => name !== 'position' && name !== 'normal' && name !== 'uv' && geometry.attributes[ name ].isInstancedBufferAttribute !== true && geometry.attributes[ name ].itemSize <= 4 )
|
|
97
|
+
.map( ( name ) => ( { name, attribute: geometry.attributes[ name ] } ) );
|
|
98
|
+
|
|
99
|
+
// weld identical vertices, so the clusters share vertices and the simplifier can collapse edges —
|
|
100
|
+
// non-indexed geometries would otherwise produce clusters of ~21 triangles and no levels of detail
|
|
101
|
+
|
|
102
|
+
// the vertices are compared by their values, hashed by the bits of the values ( -0 is stored as 0 )
|
|
103
|
+
|
|
104
|
+
const keyAttributes = [ positionAttribute, normalAttribute ];
|
|
105
|
+
|
|
106
|
+
if ( uvAttribute !== undefined ) keyAttributes.push( uvAttribute );
|
|
107
|
+
|
|
108
|
+
for ( const { attribute } of extras ) keyAttributes.push( attribute );
|
|
109
|
+
|
|
110
|
+
const keySize = keyAttributes.reduce( ( size, attribute ) => size + attribute.itemSize, 0 );
|
|
111
|
+
const keys = new Float32Array( sourceCount * keySize );
|
|
112
|
+
const keyBits = new Uint32Array( keys.buffer );
|
|
113
|
+
|
|
114
|
+
const tableSize = 2 ** Math.ceil( Math.log2( sourceCount * 2 + 1 ) );
|
|
115
|
+
const table = new Int32Array( tableSize ).fill( - 1 );
|
|
116
|
+
|
|
117
|
+
const remap = new Uint32Array( sourceCount );
|
|
118
|
+
const sources = [];
|
|
119
|
+
|
|
120
|
+
for ( let i = 0; i < sourceCount; i ++ ) {
|
|
121
|
+
|
|
122
|
+
if ( referenced !== null && referenced[ i ] === 0 ) continue;
|
|
123
|
+
|
|
124
|
+
const offset = i * keySize;
|
|
125
|
+
|
|
126
|
+
let k = offset;
|
|
127
|
+
|
|
128
|
+
for ( const attribute of keyAttributes ) {
|
|
129
|
+
|
|
130
|
+
for ( let c = 0; c < attribute.itemSize; c ++ ) keys[ k ++ ] = attribute.getComponent( i, c ) + 0;
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
let hash = 2166136261;
|
|
135
|
+
|
|
136
|
+
for ( let c = offset; c < k; c ++ ) hash = Math.imul( hash ^ keyBits[ c ], 16777619 );
|
|
137
|
+
|
|
138
|
+
let slot = ( hash >>> 0 ) & ( tableSize - 1 );
|
|
139
|
+
let index = - 1;
|
|
140
|
+
|
|
141
|
+
while ( table[ slot ] !== - 1 ) {
|
|
142
|
+
|
|
143
|
+
const other = sources[ table[ slot ] ] * keySize;
|
|
144
|
+
|
|
145
|
+
let c = 0;
|
|
146
|
+
|
|
147
|
+
while ( c < keySize && keys[ other + c ] === keys[ offset + c ] ) c ++;
|
|
148
|
+
|
|
149
|
+
if ( c === keySize ) {
|
|
150
|
+
|
|
151
|
+
index = table[ slot ];
|
|
152
|
+
break;
|
|
153
|
+
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
slot = ( slot + 1 ) & ( tableSize - 1 );
|
|
157
|
+
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if ( index === - 1 ) {
|
|
161
|
+
|
|
162
|
+
index = sources.length;
|
|
163
|
+
sources.push( i );
|
|
164
|
+
table[ slot ] = index;
|
|
165
|
+
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
remap[ i ] = index;
|
|
169
|
+
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const vertexCount = sources.length;
|
|
173
|
+
|
|
174
|
+
const positions = new Float32Array( vertexCount * 3 );
|
|
175
|
+
const simplifierAttributes = new Float32Array( vertexCount * 5 );
|
|
176
|
+
|
|
177
|
+
// all vertex data is interleaved into one buffer to stay within the storage buffer limit per shader stage:
|
|
178
|
+
// [ position.xyz, uv.x ], [ normal.xyz, uv.y ] and one vec4 per other attribute
|
|
179
|
+
|
|
180
|
+
const stride = 2 + extras.length;
|
|
181
|
+
const vertexArray = new Float32Array( vertexCount * stride * 4 );
|
|
182
|
+
|
|
183
|
+
for ( let i = 0; i < vertexCount; i ++ ) {
|
|
184
|
+
|
|
185
|
+
const source = sources[ i ];
|
|
186
|
+
|
|
187
|
+
for ( let e = 0; e < extras.length; e ++ ) {
|
|
188
|
+
|
|
189
|
+
const attribute = extras[ e ].attribute;
|
|
190
|
+
|
|
191
|
+
for ( let c = 0; c < attribute.itemSize; c ++ ) vertexArray[ ( i * stride + 2 + e ) * 4 + c ] = attribute.getComponent( source, c );
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const x = positionAttribute.getX( source ), y = positionAttribute.getY( source ), z = positionAttribute.getZ( source );
|
|
196
|
+
const nx = normalAttribute.getX( source ), ny = normalAttribute.getY( source ), nz = normalAttribute.getZ( source );
|
|
197
|
+
const u = uvAttribute !== undefined ? uvAttribute.getX( source ) : 0;
|
|
198
|
+
const v = uvAttribute !== undefined ? uvAttribute.getY( source ) : 0;
|
|
199
|
+
|
|
200
|
+
positions[ i * 3 + 0 ] = x;
|
|
201
|
+
positions[ i * 3 + 1 ] = y;
|
|
202
|
+
positions[ i * 3 + 2 ] = z;
|
|
203
|
+
|
|
204
|
+
simplifierAttributes[ i * 5 + 0 ] = nx;
|
|
205
|
+
simplifierAttributes[ i * 5 + 1 ] = ny;
|
|
206
|
+
simplifierAttributes[ i * 5 + 2 ] = nz;
|
|
207
|
+
simplifierAttributes[ i * 5 + 3 ] = u;
|
|
208
|
+
simplifierAttributes[ i * 5 + 4 ] = v;
|
|
209
|
+
|
|
210
|
+
vertexArray.set( [ x, y, z, u, nx, ny, nz, v ], i * stride * 4 );
|
|
211
|
+
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const sourceIndices = new Uint32Array( count );
|
|
215
|
+
|
|
216
|
+
for ( let i = 0; i < sourceIndices.length; i ++ ) {
|
|
217
|
+
|
|
218
|
+
sourceIndices[ i ] = remap[ geometry.index !== null ? geometry.index.getX( start + i ) : start + i ];
|
|
219
|
+
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const sourceScale = MeshoptSimplifier.getScale( positions, 3 );
|
|
223
|
+
|
|
224
|
+
const lods = [];
|
|
225
|
+
|
|
226
|
+
let indices = sourceIndices;
|
|
227
|
+
let previousError = 0;
|
|
228
|
+
let totalChunks = 0;
|
|
229
|
+
|
|
230
|
+
for ( let i = 0; i < LOD_TARGETS.length; i ++ ) {
|
|
231
|
+
|
|
232
|
+
let error = 0;
|
|
233
|
+
|
|
234
|
+
if ( i > 0 ) {
|
|
235
|
+
|
|
236
|
+
const target = LOD_TARGETS[ i ];
|
|
237
|
+
// pruning can reduce a level below the target of the next one
|
|
238
|
+
|
|
239
|
+
const targetIndexCount = Math.min( indices.length, Math.max( 3, Math.floor( sourceIndices.length * target.ratio / 3 ) * 3 ) );
|
|
240
|
+
let simplified = MeshoptSimplifier.simplifyWithAttributes( indices, positions, 3, simplifierAttributes, 5, target.weights, null, targetIndexCount, target.error, target.flags );
|
|
241
|
+
|
|
242
|
+
// if the topology blocks the simplification, the level is simplified without preserving it. the
|
|
243
|
+
// error of the level grows accordingly, so the level is only selected if it isn't noticeable
|
|
244
|
+
|
|
245
|
+
if ( indices.length > targetIndexCount && simplified[ 0 ].length > indices.length * MIN_LOD_REDUCTION ) {
|
|
246
|
+
|
|
247
|
+
const sloppy = MeshoptSimplifier.simplifySloppy( indices, positions, 3, null, targetIndexCount, target.error * SLOPPY_ERROR_SCALE );
|
|
248
|
+
|
|
249
|
+
if ( sloppy[ 0 ].length >= 3 && sloppy[ 0 ].length < simplified[ 0 ].length ) simplified = sloppy;
|
|
250
|
+
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if ( simplified[ 0 ].length >= 3 ) {
|
|
254
|
+
|
|
255
|
+
indices = simplified[ 0 ];
|
|
256
|
+
error = previousError + simplified[ 1 ] * sourceScale;
|
|
257
|
+
|
|
258
|
+
} else {
|
|
259
|
+
|
|
260
|
+
error = previousError;
|
|
261
|
+
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
previousError = error;
|
|
267
|
+
|
|
268
|
+
const meshlets = MeshoptClusterizer.buildMeshlets( indices, positions, 3, MAX_MESHLET_VERTICES, MESHLET_SIZE, 0.25 );
|
|
269
|
+
|
|
270
|
+
const bounds = MeshoptClusterizer.computeMeshletBounds( meshlets, positions, 3 );
|
|
271
|
+
|
|
272
|
+
lods.push( { meshlets, bounds, error, numChunks: meshlets.meshletCount, numTriangles: meshlets.meshletCount * MESHLET_SIZE } );
|
|
273
|
+
|
|
274
|
+
totalChunks += meshlets.meshletCount;
|
|
275
|
+
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const totalTriangles = totalChunks * MESHLET_SIZE;
|
|
279
|
+
|
|
280
|
+
const indexArray = new Uint32Array( totalTriangles * 3 );
|
|
281
|
+
// the bounding sphere and the normal cone of each cluster, interleaved to save storage buffer bindings
|
|
282
|
+
|
|
283
|
+
const chunkArray = new Float32Array( totalChunks * 8 );
|
|
284
|
+
|
|
285
|
+
let chunkOffset = 0;
|
|
286
|
+
let triangleOffset = 0;
|
|
287
|
+
|
|
288
|
+
for ( const lod of lods ) {
|
|
289
|
+
|
|
290
|
+
lod.chunkStart = chunkOffset;
|
|
291
|
+
lod.triangleStart = triangleOffset;
|
|
292
|
+
|
|
293
|
+
for ( let m = 0; m < lod.numChunks; m ++ ) {
|
|
294
|
+
|
|
295
|
+
const meshlet = MeshoptClusterizer.extractMeshlet( lod.meshlets, m );
|
|
296
|
+
const meshletTriangles = meshlet.triangles.length / 3;
|
|
297
|
+
|
|
298
|
+
// pad to exactly 64 triangles with degenerate triangles
|
|
299
|
+
|
|
300
|
+
for ( let t = 0; t < MESHLET_SIZE; t ++ ) {
|
|
301
|
+
|
|
302
|
+
const triangle = triangleOffset + m * MESHLET_SIZE + t;
|
|
303
|
+
|
|
304
|
+
for ( let k = 0; k < 3; k ++ ) {
|
|
305
|
+
|
|
306
|
+
indexArray[ triangle * 3 + k ] = t < meshletTriangles ? meshlet.vertices[ meshlet.triangles[ t * 3 + k ] ] : meshlet.vertices[ 0 ];
|
|
307
|
+
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const bound = lod.bounds[ m ];
|
|
313
|
+
|
|
314
|
+
chunkArray[ chunkOffset * 8 + 0 ] = bound.centerX;
|
|
315
|
+
chunkArray[ chunkOffset * 8 + 1 ] = bound.centerY;
|
|
316
|
+
chunkArray[ chunkOffset * 8 + 2 ] = bound.centerZ;
|
|
317
|
+
chunkArray[ chunkOffset * 8 + 3 ] = bound.radius;
|
|
318
|
+
|
|
319
|
+
// the normal cone of the triangles, the cutoff is 1 if the cone is too wide to cull the cluster
|
|
320
|
+
|
|
321
|
+
chunkArray[ chunkOffset * 8 + 4 ] = bound.coneAxisX;
|
|
322
|
+
chunkArray[ chunkOffset * 8 + 5 ] = bound.coneAxisY;
|
|
323
|
+
chunkArray[ chunkOffset * 8 + 6 ] = bound.coneAxisZ;
|
|
324
|
+
chunkArray[ chunkOffset * 8 + 7 ] = bound.coneCutoff;
|
|
325
|
+
|
|
326
|
+
chunkOffset ++;
|
|
327
|
+
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
triangleOffset += lod.numTriangles;
|
|
331
|
+
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
|
|
335
|
+
if ( geometry.boundingBox === null ) geometry.computeBoundingBox();
|
|
336
|
+
|
|
337
|
+
// the bounding sphere of a group is centered like the sphere of the geometry, so the groups of an object share
|
|
338
|
+
// the bounds of their instances, and only its radius is fitted to the triangles of the group
|
|
339
|
+
|
|
340
|
+
const boundingBox = group !== null ? new Box3().setFromArray( positions ) : geometry.boundingBox.clone();
|
|
341
|
+
const boundingSphere = geometry.boundingSphere.clone();
|
|
342
|
+
|
|
343
|
+
if ( group !== null ) {
|
|
344
|
+
|
|
345
|
+
const center = boundingSphere.center;
|
|
346
|
+
|
|
347
|
+
let radiusSq = 0;
|
|
348
|
+
|
|
349
|
+
for ( let i = 0; i < positions.length; i += 3 ) {
|
|
350
|
+
|
|
351
|
+
const dx = positions[ i ] - center.x, dy = positions[ i + 1 ] - center.y, dz = positions[ i + 2 ] - center.z;
|
|
352
|
+
|
|
353
|
+
radiusSq = Math.max( radiusSq, dx * dx + dy * dy + dz * dz );
|
|
354
|
+
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
boundingSphere.radius = Math.sqrt( radiusSq );
|
|
358
|
+
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// per-geometry values are uniforms, so the batches of all geometries share their shaders and pipelines
|
|
362
|
+
|
|
363
|
+
const vertexBuffer = storage( new StorageBufferAttribute( vertexArray, 4 ), 'vec4', vertexCount * stride ).toReadOnly();
|
|
364
|
+
const strideNode = uniform( stride, 'uint' );
|
|
365
|
+
const element = ( vertex, offset ) => vertexBuffer.element( vertex.mul( strideNode ).add( offset ) );
|
|
366
|
+
|
|
367
|
+
const chunkBuffer = storage( new StorageBufferAttribute( chunkArray, 4 ), 'vec4', totalChunks * 2 ).toReadOnly();
|
|
368
|
+
|
|
369
|
+
const lodOffsets = LOD_TARGETS.map( ( target, i ) => {
|
|
370
|
+
|
|
371
|
+
const lod = lods[ i ];
|
|
372
|
+
|
|
373
|
+
return lod !== undefined ? new Vector4( lod.triangleStart, lod.numTriangles, lod.chunkStart, lod.error ) : new Vector4();
|
|
374
|
+
|
|
375
|
+
} );
|
|
376
|
+
|
|
377
|
+
const attributes = new Map( extras.map( ( { name, attribute }, e ) => [ name, { offset: 2 + e, itemSize: attribute.itemSize } ] ) );
|
|
378
|
+
|
|
379
|
+
const instancedAttributes = Object.keys( geometry.attributes )
|
|
380
|
+
.filter( ( name ) => geometry.attributes[ name ].isInstancedBufferAttribute === true && geometry.attributes[ name ].itemSize <= 4 )
|
|
381
|
+
.map( ( name ) => ( { name, itemSize: geometry.attributes[ name ].itemSize } ) );
|
|
382
|
+
|
|
383
|
+
// geometries with the same layout of the vertex data and the instanced attributes can share a draw
|
|
384
|
+
|
|
385
|
+
const layoutKey = extras.map( ( { name, attribute } ) => name + ':' + attribute.itemSize ).join( ',' ) + '|' +
|
|
386
|
+
instancedAttributes.map( ( { name, itemSize } ) => name + ':' + itemSize ).join( ',' );
|
|
387
|
+
|
|
388
|
+
return {
|
|
389
|
+
position: ( vertex ) => element( vertex, 0 ).xyz,
|
|
390
|
+
normal: ( vertex ) => element( vertex, 1 ).xyz,
|
|
391
|
+
uv: ( vertex ) => vec2( element( vertex, 0 ).w, element( vertex, 1 ).w ),
|
|
392
|
+
hasAttribute: ( name ) => attributes.has( name ),
|
|
393
|
+
attribute: ( name, vertex ) => swizzle( element( vertex, attributes.get( name ).offset ), attributes.get( name ).itemSize ),
|
|
394
|
+
indexBuffer: storage( new StorageBufferAttribute( indexArray, 1 ), 'uint', totalTriangles * 3 ).toReadOnly(),
|
|
395
|
+
chunkBounds: ( chunk ) => chunkBuffer.element( chunk.mul( 2 ) ),
|
|
396
|
+
chunkCone: ( chunk ) => chunkBuffer.element( chunk.mul( 2 ).add( 1 ) ),
|
|
397
|
+
chunkArray,
|
|
398
|
+
chunkCount: totalChunks,
|
|
399
|
+
lodOffsets: uniformArray( lodOffsets, 'vec4' ),
|
|
400
|
+
lodOffsetValues: lodOffsets,
|
|
401
|
+
lodTriangleEnds: lods.map( ( lod ) => lod.triangleStart + lod.numTriangles ),
|
|
402
|
+
lodCount: lods.length,
|
|
403
|
+
maxChunks: lods[ 0 ].numChunks,
|
|
404
|
+
instancedAttributes,
|
|
405
|
+
// the raw data, for pools of the data of several geometries: the interleaved vertices ( vec4 elements, stride
|
|
406
|
+
// elements per vertex ), the vertex indices of the triangles and the offsets of the other attributes
|
|
407
|
+
vertexArray,
|
|
408
|
+
stride,
|
|
409
|
+
indexArray,
|
|
410
|
+
attributeLayout: attributes,
|
|
411
|
+
layoutKey,
|
|
412
|
+
geometry,
|
|
413
|
+
boundingSphere,
|
|
414
|
+
boundingBox
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
}
|
|
@@ -103,7 +103,7 @@ function createMeshesFromMultiMaterialMesh( mesh ) {
|
|
|
103
103
|
const type = attribute.array.constructor;
|
|
104
104
|
|
|
105
105
|
const newArray = new type( newLength );
|
|
106
|
-
const newAttribute = new BufferAttribute( newArray, itemSize );
|
|
106
|
+
const newAttribute = new BufferAttribute( newArray, itemSize, attribute.normalized );
|
|
107
107
|
|
|
108
108
|
for ( let k = start, n = 0; k < end; k ++, n ++ ) {
|
|
109
109
|
|