@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
|
@@ -2265,8 +2265,8 @@ class GLTFWriter {
|
|
|
2265
2265
|
if ( isOrtho ) {
|
|
2266
2266
|
|
|
2267
2267
|
cameraDef.orthographic = {
|
|
2268
|
-
xmag: camera.right
|
|
2269
|
-
ymag: camera.top
|
|
2268
|
+
xmag: camera.right,
|
|
2269
|
+
ymag: camera.top,
|
|
2270
2270
|
zfar: camera.far <= 0 ? 0.001 : camera.far,
|
|
2271
2271
|
znear: camera.near < 0 ? 0 : camera.near
|
|
2272
2272
|
};
|
|
@@ -3126,8 +3126,8 @@ class GLTFMaterialsIridescenceExtension {
|
|
|
3126
3126
|
}
|
|
3127
3127
|
|
|
3128
3128
|
extensionDef.iridescenceIor = material.iridescenceIOR;
|
|
3129
|
-
extensionDef.iridescenceThicknessMinimum = material.
|
|
3130
|
-
extensionDef.iridescenceThicknessMaximum = material.
|
|
3129
|
+
extensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessMinimum;
|
|
3130
|
+
extensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessMaximum;
|
|
3131
3131
|
|
|
3132
3132
|
if ( material.iridescenceThicknessMap ) {
|
|
3133
3133
|
|
|
@@ -143,7 +143,7 @@ export class KTX2Exporter {
|
|
|
143
143
|
* This method has two variants.
|
|
144
144
|
*
|
|
145
145
|
* - When exporting a data texture, it receives one parameter. The data or 3D data texture.
|
|
146
|
-
* - When exporting a render target
|
|
146
|
+
* - When exporting a render target, it receives two parameters. The renderer and the
|
|
147
147
|
* render target.
|
|
148
148
|
*
|
|
149
149
|
* @async
|
|
@@ -58,6 +58,7 @@ class OBJExporter {
|
|
|
58
58
|
const vertices = geometry.getAttribute( 'position' );
|
|
59
59
|
const normals = geometry.getAttribute( 'normal' );
|
|
60
60
|
const uvs = geometry.getAttribute( 'uv' );
|
|
61
|
+
const colors = geometry.getAttribute( 'color' );
|
|
61
62
|
const indices = geometry.getIndex();
|
|
62
63
|
|
|
63
64
|
// name of the mesh object
|
|
@@ -82,7 +83,19 @@ class OBJExporter {
|
|
|
82
83
|
vertex.applyMatrix4( mesh.matrixWorld );
|
|
83
84
|
|
|
84
85
|
// transform the vertex to export format
|
|
85
|
-
output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z
|
|
86
|
+
output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z;
|
|
87
|
+
|
|
88
|
+
if ( colors !== undefined ) {
|
|
89
|
+
|
|
90
|
+
color.fromBufferAttribute( colors, i );
|
|
91
|
+
|
|
92
|
+
ColorManagement.workingToColorSpace( color, SRGBColorSpace );
|
|
93
|
+
|
|
94
|
+
output += ' ' + color.r + ' ' + color.g + ' ' + color.b;
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
output += '\n';
|
|
86
99
|
|
|
87
100
|
}
|
|
88
101
|
|
|
@@ -177,6 +190,7 @@ class OBJExporter {
|
|
|
177
190
|
|
|
178
191
|
// shortcuts
|
|
179
192
|
const vertices = geometry.getAttribute( 'position' );
|
|
193
|
+
const indices = geometry.getIndex();
|
|
180
194
|
|
|
181
195
|
// name of the line object
|
|
182
196
|
output += 'o ' + line.name + '\n';
|
|
@@ -201,9 +215,23 @@ class OBJExporter {
|
|
|
201
215
|
|
|
202
216
|
output += 'l ';
|
|
203
217
|
|
|
204
|
-
|
|
218
|
+
if ( indices !== null ) {
|
|
205
219
|
|
|
206
|
-
|
|
220
|
+
for ( let i = 0, l = indices.count; i < l; i ++ ) {
|
|
221
|
+
|
|
222
|
+
const j = indices.getX( i ) + 1;
|
|
223
|
+
|
|
224
|
+
output += ( indexVertex + j ) + ' ';
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
} else {
|
|
229
|
+
|
|
230
|
+
for ( let j = 1, l = vertices.count; j <= l; j ++ ) {
|
|
231
|
+
|
|
232
|
+
output += ( indexVertex + j ) + ' ';
|
|
233
|
+
|
|
234
|
+
}
|
|
207
235
|
|
|
208
236
|
}
|
|
209
237
|
|
|
@@ -213,9 +241,24 @@ class OBJExporter {
|
|
|
213
241
|
|
|
214
242
|
if ( type === 'LineSegments' ) {
|
|
215
243
|
|
|
216
|
-
|
|
244
|
+
if ( indices !== null ) {
|
|
217
245
|
|
|
218
|
-
|
|
246
|
+
for ( let i = 0, l = indices.count - 1; i < l; i += 2 ) {
|
|
247
|
+
|
|
248
|
+
const j = indices.getX( i ) + 1;
|
|
249
|
+
const k = indices.getX( i + 1 ) + 1;
|
|
250
|
+
|
|
251
|
+
output += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\n';
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
} else {
|
|
256
|
+
|
|
257
|
+
for ( let j = 1, k = j + 1, l = vertices.count; j < l; j += 2, k = j + 1 ) {
|
|
258
|
+
|
|
259
|
+
output += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\n';
|
|
260
|
+
|
|
261
|
+
}
|
|
219
262
|
|
|
220
263
|
}
|
|
221
264
|
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
* PLY (Polygon or Stanford Triangle Format) is a file format for efficient delivery and
|
|
13
13
|
* loading of simple, static 3D content in a dense format. Both binary and ascii formats are
|
|
14
14
|
* supported. PLY can store vertex positions, colors, normals and uv coordinates. No textures
|
|
15
|
-
* or texture references are saved.
|
|
15
|
+
* or texture references are saved. Quantized attributes must be normalized.
|
|
16
16
|
*
|
|
17
17
|
* ```js
|
|
18
18
|
* const exporter = new PLYExporter();
|
|
@@ -114,33 +114,33 @@ class PLYExporter {
|
|
|
114
114
|
vertexCount += vertices.count;
|
|
115
115
|
faceCount += indices ? indices.count / 3 : vertices.count / 3;
|
|
116
116
|
|
|
117
|
-
positionType = getPlyType( vertices
|
|
117
|
+
positionType = getPlyType( vertices );
|
|
118
118
|
|
|
119
119
|
if ( normals !== undefined ) {
|
|
120
120
|
|
|
121
121
|
includeNormals = true;
|
|
122
|
-
normalType = getPlyType( normals
|
|
122
|
+
normalType = getPlyType( normals );
|
|
123
123
|
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
if ( uvs !== undefined ) {
|
|
127
127
|
|
|
128
128
|
includeUVs = true;
|
|
129
|
-
uvType = getPlyType( uvs
|
|
129
|
+
uvType = getPlyType( uvs );
|
|
130
130
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
if ( colors !== undefined ) {
|
|
134
134
|
|
|
135
135
|
includeColors = true;
|
|
136
|
-
colorType = getPlyType( colors
|
|
136
|
+
colorType = getPlyType( colors );
|
|
137
137
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
for ( const name of customAttributeNames ) {
|
|
141
141
|
|
|
142
142
|
const attr = geometry.getAttribute( name );
|
|
143
|
-
if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr
|
|
143
|
+
if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr );
|
|
144
144
|
|
|
145
145
|
}
|
|
146
146
|
|
|
@@ -153,28 +153,34 @@ class PLYExporter {
|
|
|
153
153
|
const normals = geometry.getAttribute( 'normal' );
|
|
154
154
|
const colors = geometry.getAttribute( 'color' );
|
|
155
155
|
|
|
156
|
+
if ( vertices === undefined ) {
|
|
157
|
+
|
|
158
|
+
return;
|
|
159
|
+
|
|
160
|
+
}
|
|
161
|
+
|
|
156
162
|
vertexCount += vertices.count;
|
|
157
163
|
|
|
158
|
-
positionType = getPlyType( vertices
|
|
164
|
+
positionType = getPlyType( vertices );
|
|
159
165
|
|
|
160
166
|
if ( normals !== undefined ) {
|
|
161
167
|
|
|
162
168
|
includeNormals = true;
|
|
163
|
-
normalType = getPlyType( normals
|
|
169
|
+
normalType = getPlyType( normals );
|
|
164
170
|
|
|
165
171
|
}
|
|
166
172
|
|
|
167
173
|
if ( colors !== undefined ) {
|
|
168
174
|
|
|
169
175
|
includeColors = true;
|
|
170
|
-
colorType = getPlyType( colors
|
|
176
|
+
colorType = getPlyType( colors );
|
|
171
177
|
|
|
172
178
|
}
|
|
173
179
|
|
|
174
180
|
for ( const name of customAttributeNames ) {
|
|
175
181
|
|
|
176
182
|
const attr = geometry.getAttribute( name );
|
|
177
|
-
if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr
|
|
183
|
+
if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr );
|
|
178
184
|
|
|
179
185
|
}
|
|
180
186
|
|
|
@@ -688,7 +694,11 @@ class PLYExporter {
|
|
|
688
694
|
|
|
689
695
|
}
|
|
690
696
|
|
|
691
|
-
function getPlyType(
|
|
697
|
+
function getPlyType( attribute ) {
|
|
698
|
+
|
|
699
|
+
const { array, normalized } = attribute;
|
|
700
|
+
|
|
701
|
+
if ( normalized === true ) return 'float';
|
|
692
702
|
|
|
693
703
|
if ( array instanceof Int8Array ) return 'char';
|
|
694
704
|
if ( array instanceof Uint8Array || array instanceof Uint8ClampedArray ) return 'uchar';
|
|
@@ -698,6 +708,7 @@ function getPlyType( array ) {
|
|
|
698
708
|
if ( array instanceof Uint32Array ) return 'uint';
|
|
699
709
|
if ( array instanceof Float32Array ) return 'float';
|
|
700
710
|
if ( array instanceof Float64Array ) return 'double';
|
|
711
|
+
|
|
701
712
|
return 'float';
|
|
702
713
|
|
|
703
714
|
}
|
|
@@ -564,12 +564,13 @@ function buildingColorNode( layout, seed = 0 ) {
|
|
|
564
564
|
*
|
|
565
565
|
* @param {Object} layout - The city layout.
|
|
566
566
|
* @param {number|Node<uint>} [seed=0] - A fixed seed, or {@link CityGenerator#seedNode} for a changing city.
|
|
567
|
+
* @param {Object} [options] - The features of the material, see {@link createSkyscraperMaterial}.
|
|
567
568
|
* @return {MeshStandardNodeMaterial} The building material.
|
|
568
569
|
*/
|
|
569
|
-
function createBuildingMaterial( layout, seed = 0 ) {
|
|
570
|
+
function createBuildingMaterial( layout, seed = 0, options = {} ) {
|
|
570
571
|
|
|
571
572
|
// the pick is constant across a tower, so resolve it once per vertex ( varying )
|
|
572
|
-
return createSkyscraperMaterial( varying( buildingColorNode( layout, seed ) ) );
|
|
573
|
+
return createSkyscraperMaterial( varying( buildingColorNode( layout, seed ) ), options );
|
|
573
574
|
|
|
574
575
|
}
|
|
575
576
|
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from 'three';
|
|
21
21
|
|
|
22
22
|
import { MeshStandardNodeMaterial } from 'three/webgpu';
|
|
23
|
-
import { attribute, cameraPosition, color, cross, dot, float, floor, Fn, fract, fwidth, hash as ihash, mix, mod, modelWorldMatrixInverse, mx_fractal_noise_float, normalLocal, normalWorldGeometry, positionLocal, positionWorld, select, smoothstep, step, uint, uv, varying, vec2, vec3, vec4 } from 'three/tsl';
|
|
23
|
+
import { attribute, cameraPosition, color, cross, dot, EPSILON, float, floor, Fn, fract, fwidth, hash as ihash, mix, mod, modelWorldMatrixInverse, mx_fractal_noise_float, normalLocal, normalWorldGeometry, positionLocal, positionWorld, select, smoothstep, step, uint, uv, varying, vec2, vec3, vec4 } from 'three/tsl';
|
|
24
24
|
|
|
25
25
|
import { mergeGeometries } from '../../utils/BufferGeometryUtils.js';
|
|
26
26
|
import { bumpNormal } from './CityGeneratorUtils.js';
|
|
@@ -1105,6 +1105,10 @@ function buildFinialGeometry( p ) {
|
|
|
1105
1105
|
|
|
1106
1106
|
// --- material ------------------------------------------------------------
|
|
1107
1107
|
|
|
1108
|
+
// the room behind a pane, shared by the room functions so the material carries it in one varying. flat so
|
|
1109
|
+
// floor() can't split one pane across two cell ids ( the centre is per-room )
|
|
1110
|
+
const roomCenter = /*@__PURE__*/ varying( attribute( 'roomCenter', 'vec3' ) ).setInterpolation( InterpolationSamplingType.FLAT, InterpolationSamplingMode.EITHER );
|
|
1111
|
+
|
|
1108
1112
|
// interior mapping: fakes a furnished room behind each glass pane in the fragment
|
|
1109
1113
|
// shader — no geometry, no texture. every pane carries the room it looks into ( centre +
|
|
1110
1114
|
// size, baked per window by addWindows ), so neighbouring panes share one interior. the
|
|
@@ -1112,8 +1116,6 @@ function buildFinialGeometry( p ) {
|
|
|
1112
1116
|
// it meets are shaded procedurally, keyed off a per-room hash. returns vec4( colour, lit ).
|
|
1113
1117
|
const interior = /*@__PURE__*/ Fn( () => {
|
|
1114
1118
|
|
|
1115
|
-
// flat so floor() below can't split one pane across two cell ids ( centre is per-room )
|
|
1116
|
-
const roomCenter = varying( attribute( 'roomCenter', 'vec3' ) ).setInterpolation( InterpolationSamplingType.FLAT, InterpolationSamplingMode.EITHER );
|
|
1117
1119
|
const roomSize = attribute( 'roomSize', 'vec2' );
|
|
1118
1120
|
|
|
1119
1121
|
// a per-face frame from the geometry normal ( holds on every facade, including the
|
|
@@ -1297,6 +1299,33 @@ const interior = /*@__PURE__*/ Fn( () => {
|
|
|
1297
1299
|
|
|
1298
1300
|
} );
|
|
1299
1301
|
|
|
1302
|
+
// the room of interior() seen from far away: the average colour of its plaster and its lights, without
|
|
1303
|
+
// the raymarch. the room hash matches interior(), so the same rooms are lit. returns vec4( colour, lit ).
|
|
1304
|
+
const roomAverage = /*@__PURE__*/ Fn( () => {
|
|
1305
|
+
|
|
1306
|
+
const cell = floor( roomCenter.mul( 2.0 ) );
|
|
1307
|
+
const ckey = uint( cell.x.add( 1 << 21 ) ).mul( uint( 73856093 ) )
|
|
1308
|
+
.bitXor( uint( cell.y.add( 1 << 21 ) ).mul( uint( 19349663 ) ) )
|
|
1309
|
+
.bitXor( uint( cell.z.add( 1 << 21 ) ).mul( uint( 83492791 ) ) ).toVar();
|
|
1310
|
+
const hash = ( kx, ky, kz ) => ihash( ckey.add( uint( Math.round( ( kx + ky * 7 + kz * 13 ) * 100 ) ) ) );
|
|
1311
|
+
const seed = hash( 12.9898, 78.233, 37.719 );
|
|
1312
|
+
const seed2 = hash( 39.346, 11.135, 83.155 );
|
|
1313
|
+
const lit = step( 0.8, hash( 63.21, 9.17, 51.43 ) );
|
|
1314
|
+
|
|
1315
|
+
const warmLight = mix( color( 0xffb845 ), color( 0xffe49c ), hash( 27.1, 4.9, 61.7 ) );
|
|
1316
|
+
const coolLight = mix( color( 0xdfe8ff ), color( 0x9fb6ff ), hash( 8.3, 51.2, 17.6 ) );
|
|
1317
|
+
const lightCol = select( hash( 44.7, 19.3, 6.1 ).greaterThan( 0.88 ), coolLight, warmLight );
|
|
1318
|
+
|
|
1319
|
+
// the plaster darkened by the depth falloff and the corners, plus the share of the lamp
|
|
1320
|
+
let wall = mix( color( 0x9a8b73 ), color( 0x6f7a82 ), seed );
|
|
1321
|
+
wall = mix( wall, color( 0xb9ad97 ), seed2.mul( 0.6 ) );
|
|
1322
|
+
const average = wall.mul( 0.62 ).add( lightCol.mul( lit.mul( 0.25 ) ) );
|
|
1323
|
+
|
|
1324
|
+
const warmth = mix( vec3( 1.0, 1.0, 1.0 ), lightCol, lit.mul( 0.85 ) );
|
|
1325
|
+
return vec4( average.mul( warmth ).mul( mix( float( 1.0 ), float( 1.3 ), lit ) ), lit );
|
|
1326
|
+
|
|
1327
|
+
} );
|
|
1328
|
+
|
|
1300
1329
|
// the ground-floor shops' interior mapping: the same box raymarch as interior(), but
|
|
1301
1330
|
// dressed as retail space ( tile floor, troffer-lit ceiling, stocked shelving, a sales
|
|
1302
1331
|
// counter and a window display ), so storefronts read as shops rather than living rooms.
|
|
@@ -1304,8 +1333,6 @@ const interior = /*@__PURE__*/ Fn( () => {
|
|
|
1304
1333
|
// returns vec4( colour, lit ), like interior().
|
|
1305
1334
|
const shopInterior = /*@__PURE__*/ Fn( () => {
|
|
1306
1335
|
|
|
1307
|
-
// flat for the same reason as interior(): floor() must not split a pane across cells
|
|
1308
|
-
const roomCenter = varying( attribute( 'roomCenter', 'vec3' ) ).setInterpolation( InterpolationSamplingType.FLAT, InterpolationSamplingMode.EITHER );
|
|
1309
1336
|
const roomSize = attribute( 'roomSize', 'vec2' );
|
|
1310
1337
|
|
|
1311
1338
|
// the per-face frame and the view ray in room space ( across, up, depth ), as interior()
|
|
@@ -1536,7 +1563,7 @@ const valueNoise = /*@__PURE__*/ Fn( ( [ p ] ) => {
|
|
|
1536
1563
|
const x11 = mix( corner( 0, 1, 1 ), corner( 1, 1, 1 ), u.x );
|
|
1537
1564
|
return mix( mix( x00, x10, u.y ), mix( x01, x11, u.y ), u.z ).mul( 2 ).sub( 1 );
|
|
1538
1565
|
|
|
1539
|
-
}
|
|
1566
|
+
}, { p: 'vec3', return: 'float' } );
|
|
1540
1567
|
|
|
1541
1568
|
// fractal ( fBm ) of valueNoise, octaves summed like mx_fractal_noise_float
|
|
1542
1569
|
// ( amplitude halving, frequency doubling ); unrolled for a compile-time count
|
|
@@ -1565,18 +1592,30 @@ const valueFractal = ( p, octaves ) => {
|
|
|
1565
1592
|
* what makes it compute-rasterizer friendly. `buildingBase` is the tower's flat
|
|
1566
1593
|
* masonry colour as a TSL node: pass a `uniform( Color )` for a single tower, or a
|
|
1567
1594
|
* per-fragment palette pick for a city, so the same material dresses both.
|
|
1595
|
+
*
|
|
1596
|
+
* @param {Node<vec3>} [buildingBase] - The flat masonry colour of the tower.
|
|
1597
|
+
* @param {Object} [options] - The features of the material, cheaper materials leave some out.
|
|
1598
|
+
* @param {boolean|string} [options.interiors=true] - Whether the windows show raymarched rooms, `'average'` shows the average
|
|
1599
|
+
* colour and the light of each room without the raymarch, for distant towers. `false` shows dark glass.
|
|
1600
|
+
* @param {boolean} [options.weathering=true] - Whether the surfaces are weathered by noise ( tone, soot, grime, dust ).
|
|
1601
|
+
* @param {boolean} [options.relief=true] - Whether the brickwork and the AC louvers have a bump relief.
|
|
1602
|
+
* @return {MeshStandardNodeMaterial} The facade material.
|
|
1568
1603
|
*/
|
|
1569
|
-
function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
|
|
1604
|
+
function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ), { interiors = true, weathering = true, relief = true } = {} ) {
|
|
1570
1605
|
|
|
1571
1606
|
const soot = color( 0x4a4236 );
|
|
1572
1607
|
|
|
1608
|
+
// the weathering noise, about zero on average
|
|
1609
|
+
|
|
1610
|
+
const weatherNoise = ( node ) => weathering ? node : float( 0 );
|
|
1611
|
+
|
|
1573
1612
|
// broad weathering, all driven from world position so it reads consistently
|
|
1574
1613
|
// across instanced and merged meshes: a slow tonal drift, a fine clay mottle,
|
|
1575
1614
|
// and sooty vertical streaks that pool low down
|
|
1576
1615
|
|
|
1577
|
-
const tone = varying( mx_fractal_noise_float( positionWorld.mul( 0.03 ), 2 ) ).mul( 0.18 ); // very low frequency: evaluate per-vertex and interpolate over the facade's fine tessellation
|
|
1578
|
-
const mottle = valueNoise( positionWorld.mul( 0.7 ) ).mul( 0.06 );
|
|
1579
|
-
const streak = mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.5 ), positionWorld.y.mul( 0.04 ), positionWorld.z.mul( 1.5 ) ), 2 );
|
|
1616
|
+
const tone = weathering ? varying( mx_fractal_noise_float( positionWorld.mul( 0.03 ), 2 ) ).mul( 0.18 ) : float( 0 ); // very low frequency: evaluate per-vertex and interpolate over the facade's fine tessellation
|
|
1617
|
+
const mottle = weatherNoise( valueNoise( positionWorld.mul( 0.7 ) ) ).mul( 0.06 );
|
|
1618
|
+
const streak = weathering ? weatherNoise( mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.5 ), positionWorld.y.mul( 0.04 ), positionWorld.z.mul( 1.5 ) ), 2 ) ) : float( - 1 );
|
|
1580
1619
|
const dirt = smoothstep( - 0.1, 0.45, streak ).mul( smoothstep( 210, 0, positionWorld.y ) ).mul( 0.6 );
|
|
1581
1620
|
|
|
1582
1621
|
// procedural terracotta brickwork in running bond, keyed off the BUILDING-LOCAL position
|
|
@@ -1604,8 +1643,8 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
|
|
|
1604
1643
|
// would spike where the normal flips at pier edges.
|
|
1605
1644
|
const mU = mortar / ( 2 * brickL );
|
|
1606
1645
|
const mV = mortar / ( 2 * brickH );
|
|
1607
|
-
const ddU = nrm.z.mul( fwidth( positionWorld.x ) ).add( nrm.x.mul( fwidth( positionWorld.z ) ) ).div( brickL ).clamp(
|
|
1608
|
-
const ddV = fwidth( rowCoord ).clamp(
|
|
1646
|
+
const ddU = nrm.z.mul( fwidth( positionWorld.x ) ).add( nrm.x.mul( fwidth( positionWorld.z ) ) ).div( brickL ).clamp( EPSILON, 0.5 );
|
|
1647
|
+
const ddV = fwidth( rowCoord ).clamp( EPSILON, 0.5 );
|
|
1609
1648
|
const distU = float( 0.5 ).sub( fract( colCoord ).sub( 0.5 ).abs() );
|
|
1610
1649
|
const distV = float( 0.5 ).sub( fract( rowCoord ).sub( 0.5 ).abs() );
|
|
1611
1650
|
const drawU = ddU.max( mU );
|
|
@@ -1629,7 +1668,7 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
|
|
|
1629
1668
|
const lodBevel = texel.mul( 1.5 ).max( bevel );
|
|
1630
1669
|
const brickFace = smoothstep( 0, lodBevel, distU.mul( brickL ) ).mul( smoothstep( 0, lodBevel, distV.mul( brickH ) ) ).mul( wallFacing );
|
|
1631
1670
|
const reliefHeight = brickFace.mul( 0.003 );
|
|
1632
|
-
const rough = valueNoise( positionWorld.mul( 0.5 ) ).mul( 0.08 ).add( 0.82 ).add( joint.mul( 0.12 ) );
|
|
1671
|
+
const rough = weatherNoise( valueNoise( positionWorld.mul( 0.5 ) ) ).mul( 0.08 ).add( 0.82 ).add( joint.mul( 0.12 ) );
|
|
1633
1672
|
|
|
1634
1673
|
// the merged geometry carries a per-vertex partId; this material reads it and
|
|
1635
1674
|
// branches to reproduce each zone — no per-part materials, compute-raster friendly
|
|
@@ -1657,24 +1696,27 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
|
|
|
1657
1696
|
// larger-scale grime instead of the wall's streaky soot — confined to those surfaces by a
|
|
1658
1697
|
// branch ( roofMask > 0 ), so the fractal never runs on the vertical facade
|
|
1659
1698
|
const roofMask = wallFacing.oneMinus();
|
|
1660
|
-
const roofGrime = select( roofMask.greaterThan( 0 ), smoothstep( 0.0, 0.55, valueFractal( positionWorld.mul( 0.025 ), 3 ) ).mul( 0.22 ), float( 0 ) );
|
|
1699
|
+
const roofGrime = weathering ? select( roofMask.greaterThan( 0 ), smoothstep( 0.0, 0.55, valueFractal( positionWorld.mul( 0.025 ), 3 ) ).mul( 0.22 ), float( 0 ) ) : float( 0 );
|
|
1661
1700
|
const stoneColor = mix( masonry, soot, mix( dirt, roofGrime, roofMask ) );
|
|
1662
1701
|
|
|
1663
1702
|
// glass: the interior-mapped room is the base colour; the smooth, low-roughness
|
|
1664
1703
|
// surface still lets a faint sky reflection ride over it, and lit rooms glow ( emissive ).
|
|
1665
1704
|
// shopfronts march their own retail interior ( select compiles to a branch, so only one
|
|
1666
1705
|
// raymarch runs per fragment ). toVar so the result is shared by colour and emissive
|
|
1667
|
-
|
|
1706
|
+
let room = vec4( color( 0x1d2328 ), 0 );
|
|
1707
|
+
|
|
1708
|
+
if ( interiors === true ) room = select( isShopGlass, shopInterior(), interior() ).toVar();
|
|
1709
|
+
else if ( interiors === 'average' ) room = roomAverage().toVar();
|
|
1668
1710
|
|
|
1669
1711
|
// grimy glazing: the room shows through, but muted by a dusty film and dirt pooled
|
|
1670
1712
|
// along the bottom of each pane, plus a baseline haze, so the panes read as old
|
|
1671
1713
|
// glass rather than open holes. the streaks run down the facade ( world Y barely
|
|
1672
1714
|
// scaled ); the pooled dirt uses the pane's own UV ( y = 0 at the sill ).
|
|
1673
|
-
const filmNoise = mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.3 ), positionWorld.y.mul( 0.06 ), positionWorld.z.mul( 1.3 ) ), 2 );
|
|
1715
|
+
const filmNoise = weatherNoise( mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.3 ), positionWorld.y.mul( 0.06 ), positionWorld.z.mul( 1.3 ) ), 2 ) );
|
|
1674
1716
|
const dustStreak = smoothstep( - 0.15, 0.5, filmNoise ).mul( 0.45 );
|
|
1675
1717
|
const pooled = smoothstep( 0.32, 0.0, uv().y ).mul( 0.4 );
|
|
1676
1718
|
const grime = float( 0.64 ).add( dustStreak ).add( pooled ).clamp( 0, 0.95 ); // baseline haze so the panes read as dirty glass, not open holes
|
|
1677
|
-
const glassMottle = valueFractal( positionWorld.mul( 0.3 ), 2 ).mul( 0.5 ).add( 0.5 ); // shared by the upper dirty glass and the shop glazing, so the fractal runs once
|
|
1719
|
+
const glassMottle = weatherNoise( valueFractal( positionWorld.mul( 0.3 ), 2 ) ).mul( 0.5 ).add( 0.5 ); // shared by the upper dirty glass and the shop glazing, so the fractal runs once
|
|
1678
1720
|
const dirtyGlass = mix( color( 0x13161a ), color( 0x232b31 ), glassMottle );
|
|
1679
1721
|
|
|
1680
1722
|
// dirt scatters the reflection too: rougher where grime pools at the sills, so the
|
|
@@ -1694,9 +1736,9 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
|
|
|
1694
1736
|
const acLouver = acVent.mul( acDetail );
|
|
1695
1737
|
|
|
1696
1738
|
// plastic shell: off-white, some units dingier / yellowed than others
|
|
1697
|
-
const acDinge = valueNoise( positionWorld.mul( 0.4 ) ).mul( 0.5 ).add( 0.5 ); // ~per-unit
|
|
1739
|
+
const acDinge = weatherNoise( valueNoise( positionWorld.mul( 0.4 ) ) ).mul( 0.5 ).add( 0.5 ); // ~per-unit
|
|
1698
1740
|
const acPaint = mix( color( 0xf2f1ec ), color( 0xcfccc2 ), acDinge ) // bright white → light dingy grey, both lighter than the wall
|
|
1699
|
-
.add( valueNoise( positionWorld.mul( 5 ) ).mul( 0.04 ) );
|
|
1741
|
+
.add( weatherNoise( valueNoise( positionWorld.mul( 5 ) ) ).mul( 0.04 ) );
|
|
1700
1742
|
|
|
1701
1743
|
// a darker recessed grille panel inset into the lighter cabinet, with horizontal louvers
|
|
1702
1744
|
// inside it ( the front vents ) — the white plastic reads as a thin border frame
|
|
@@ -1707,7 +1749,7 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
|
|
|
1707
1749
|
const acBody = acPaint.mul( mix( float( 1 ), acFin.mul( 0.42 ), acGrille ) ); // cabinet stays light; recessed grille goes dark grey
|
|
1708
1750
|
|
|
1709
1751
|
// grey-brown condensate grime streaking the lower edge ( plastic doesn't rust ); dirtier units streak more
|
|
1710
|
-
const acStreak = valueFractal( vec3( positionWorld.x.mul( 6 ), positionWorld.y.mul( 0.5 ), positionWorld.z.mul( 6 ) ), 3 ).mul( 0.5 ).add( 0.5 );
|
|
1752
|
+
const acStreak = weatherNoise( valueFractal( vec3( positionWorld.x.mul( 6 ), positionWorld.y.mul( 0.5 ), positionWorld.z.mul( 6 ) ), 3 ) ).mul( 0.5 ).add( 0.5 );
|
|
1711
1753
|
const acGrime = smoothstep( 0.4, 0.0, acUv.y ).mul( acStreak ).mul( acDinge.add( 0.3 ) );
|
|
1712
1754
|
const acColor = mix( acBody, color( 0x6f685a ), acGrime.mul( 0.5 ) );
|
|
1713
1755
|
|
|
@@ -1748,7 +1790,7 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
|
|
|
1748
1790
|
material.roughnessNode = select( isShopGlass, float( 0.14 ), select( isAwning, float( 0.85 ), select( isStore, float( 0.6 ), select( isGlass, glassRough, select( isOrnament, float( 0.8 ), select( isAC, acRough, rough ) ) ) ) ) ); // glass roughness rides on its grime, so dirty panes scatter the reflection
|
|
1749
1791
|
material.metalnessNode = float( 0 ); // all dielectric — stone, glass, fabric and the plastic AC shells
|
|
1750
1792
|
material.emissiveNode = select( isGlazing, room.xyz.mul( room.w ).mul( glazingEmit ), color( 0x000000 ) ); // lit rooms / shops glow through the panes
|
|
1751
|
-
material.normalNode = bumpNormal( select( isGlass.or( isFrame ).or( isOrnament ).or( isShopGlass ).or( isStore ).or( isAwning ), float( 0 ), select( isAC, acRelief, reliefHeight ) ) ); // glass / frames / ornament / storefronts stay flat; AC has its own louvers
|
|
1793
|
+
if ( relief ) material.normalNode = bumpNormal( select( isGlass.or( isFrame ).or( isOrnament ).or( isShopGlass ).or( isStore ).or( isAwning ), float( 0 ), select( isAC, acRelief, reliefHeight ) ) ); // glass / frames / ornament / storefronts stay flat; AC has its own louvers
|
|
1752
1794
|
|
|
1753
1795
|
return material;
|
|
1754
1796
|
|
|
@@ -33,14 +33,7 @@ export const getBitonicFlipIndices = /*@__PURE__*/ Fn( ( [ index, blockHeight ]
|
|
|
33
33
|
|
|
34
34
|
return idx;
|
|
35
35
|
|
|
36
|
-
} )
|
|
37
|
-
name: 'getBitonicFlipIndices',
|
|
38
|
-
type: 'uvec2',
|
|
39
|
-
inputs: [
|
|
40
|
-
{ name: 'index', type: 'uint' },
|
|
41
|
-
{ name: 'blockHeight', type: 'uint' }
|
|
42
|
-
]
|
|
43
|
-
} );
|
|
36
|
+
}, { index: 'uint', blockHeight: 'uint', return: 'uvec2' } );
|
|
44
37
|
|
|
45
38
|
/**
|
|
46
39
|
* Returns the indices that will be compared in a bitonic sort's disperse operation.
|
|
@@ -65,14 +58,7 @@ export const getBitonicDisperseIndices = /*@__PURE__*/ Fn( ( [ index, swapSpan ]
|
|
|
65
58
|
|
|
66
59
|
return idx;
|
|
67
60
|
|
|
68
|
-
} )
|
|
69
|
-
name: 'getBitonicDisperseIndices',
|
|
70
|
-
type: 'uvec2',
|
|
71
|
-
inputs: [
|
|
72
|
-
{ name: 'index', type: 'uint' },
|
|
73
|
-
{ name: 'blockHeight', type: 'uint' }
|
|
74
|
-
]
|
|
75
|
-
} );
|
|
61
|
+
}, { index: 'uint', blockHeight: 'uint', return: 'uvec2' } );
|
|
76
62
|
|
|
77
63
|
export class BitonicSort {
|
|
78
64
|
|
|
@@ -626,10 +612,24 @@ export class BitonicSort {
|
|
|
626
612
|
*/
|
|
627
613
|
computeStep( renderer ) {
|
|
628
614
|
|
|
615
|
+
renderer.compute( this._getStepNodes() );
|
|
616
|
+
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/**
|
|
620
|
+
* Get the compute shaders that execute the next step of the bitonic sort, and advance the sort past that step.
|
|
621
|
+
*
|
|
622
|
+
* @private
|
|
623
|
+
* @returns {Array<ComputeNode>} The compute shaders of the step, in dispatch order.
|
|
624
|
+
*/
|
|
625
|
+
_getStepNodes() {
|
|
626
|
+
|
|
627
|
+
const computeNodes = [];
|
|
628
|
+
|
|
629
629
|
// Swap local only runs once
|
|
630
630
|
if ( this.currentDispatch === 0 ) {
|
|
631
631
|
|
|
632
|
-
|
|
632
|
+
computeNodes.push( this.swapLocalFn );
|
|
633
633
|
|
|
634
634
|
this.globalOpsRemaining = 1;
|
|
635
635
|
this.globalOpsInSpan = 1;
|
|
@@ -638,7 +638,7 @@ export class BitonicSort {
|
|
|
638
638
|
|
|
639
639
|
const swapType = this.globalOpsRemaining === this.globalOpsInSpan ? 'Flip' : 'Disperse';
|
|
640
640
|
|
|
641
|
-
|
|
641
|
+
computeNodes.push( swapType === 'Flip' ? this.flipGlobalNodes[ this.readBufferName ] : this.disperseGlobalNodes[ this.readBufferName ] );
|
|
642
642
|
|
|
643
643
|
if ( this.readBufferName === 'Data' ) {
|
|
644
644
|
|
|
@@ -655,7 +655,7 @@ export class BitonicSort {
|
|
|
655
655
|
} else {
|
|
656
656
|
|
|
657
657
|
// Then run local disperses when we've finished all global swaps
|
|
658
|
-
|
|
658
|
+
computeNodes.push( this.disperseLocalNodes[ this.readBufferName ] );
|
|
659
659
|
|
|
660
660
|
const nextSpanGlobalOps = this.globalOpsInSpan + 1;
|
|
661
661
|
this.globalOpsInSpan = nextSpanGlobalOps;
|
|
@@ -672,13 +672,13 @@ export class BitonicSort {
|
|
|
672
672
|
// to fulfill the requirement of an in-place sort.
|
|
673
673
|
if ( this.readBufferName === 'Temp' ) {
|
|
674
674
|
|
|
675
|
-
|
|
675
|
+
computeNodes.push( this.alignFn );
|
|
676
676
|
this.readBufferName = 'Data';
|
|
677
677
|
|
|
678
678
|
}
|
|
679
679
|
|
|
680
680
|
// Just reset the algorithm information
|
|
681
|
-
|
|
681
|
+
computeNodes.push( this.resetFn );
|
|
682
682
|
|
|
683
683
|
this.currentDispatch = 0;
|
|
684
684
|
this.globalOpsRemaining = 0;
|
|
@@ -687,10 +687,12 @@ export class BitonicSort {
|
|
|
687
687
|
} else {
|
|
688
688
|
|
|
689
689
|
// Otherwise, determine what next swap span is
|
|
690
|
-
|
|
690
|
+
computeNodes.push( this.setAlgoFn );
|
|
691
691
|
|
|
692
692
|
}
|
|
693
693
|
|
|
694
|
+
return computeNodes;
|
|
695
|
+
|
|
694
696
|
}
|
|
695
697
|
|
|
696
698
|
/**
|
|
@@ -704,12 +706,17 @@ export class BitonicSort {
|
|
|
704
706
|
this.globalOpsInSpan = 0;
|
|
705
707
|
this.currentDispatch = 0;
|
|
706
708
|
|
|
709
|
+
const computeNodes = [];
|
|
710
|
+
|
|
707
711
|
for ( let i = 0; i < this.stepCount; i ++ ) {
|
|
708
712
|
|
|
709
|
-
this.
|
|
713
|
+
computeNodes.push( ...this._getStepNodes() );
|
|
710
714
|
|
|
711
715
|
}
|
|
712
716
|
|
|
717
|
+
// Dispatch the whole sort at once, so it runs in one compute pass instead of one pass per shader
|
|
718
|
+
renderer.compute( computeNodes );
|
|
719
|
+
|
|
713
720
|
}
|
|
714
721
|
|
|
715
722
|
}
|
|
@@ -29,7 +29,7 @@ class VertexTangentsHelper extends LineSegments {
|
|
|
29
29
|
*
|
|
30
30
|
* @param {Object3D} object - The object for which to visualize vertex tangents.
|
|
31
31
|
* @param {number} [size=1] - The helper's size.
|
|
32
|
-
* @param {number|Color|string} [color=
|
|
32
|
+
* @param {number|Color|string} [color=0x00ffff] - The helper's color.
|
|
33
33
|
*/
|
|
34
34
|
constructor( object, size = 1, color = 0x00ffff ) {
|
|
35
35
|
|