@plastic-software/three 0.180.0 → 0.181.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +944 -487
- package/build/three.core.js +506 -327
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +436 -164
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +8 -2
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +3753 -1177
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +3752 -1176
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/DragControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/FlyControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +2 -2
- package/examples/jsm/controls/TrackballControls.js +1 -1
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +3 -3
- package/examples/jsm/exporters/USDZExporter.js +9 -2
- package/examples/jsm/geometries/DecalGeometry.js +2 -2
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +3 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/ViewHelper.js +43 -5
- package/examples/jsm/inspector/Inspector.js +427 -0
- package/examples/jsm/inspector/RendererInspector.js +415 -0
- package/examples/jsm/inspector/tabs/Console.js +204 -0
- package/examples/jsm/inspector/tabs/Parameters.js +332 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Viewer.js +166 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +170 -0
- package/examples/jsm/inspector/ui/Style.js +654 -0
- package/examples/jsm/inspector/ui/Tab.js +46 -0
- package/examples/jsm/inspector/ui/Values.js +423 -0
- package/examples/jsm/inspector/ui/utils.js +56 -0
- package/examples/jsm/interactive/HTMLMesh.js +6 -10
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +2 -2
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/FBXLoader.js +2 -2
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GLTFLoader.js +5 -3
- package/examples/jsm/loaders/KTX2Loader.js +28 -21
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +2 -2
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
- package/examples/jsm/math/ConvexHull.js +1 -1
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/SkyMesh.js +1 -1
- package/examples/jsm/objects/Water.js +3 -3
- package/examples/jsm/objects/WaterMesh.js +6 -6
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
- package/examples/jsm/renderers/SVGRenderer.js +1 -1
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +2 -2
- package/examples/jsm/shaders/GodRaysShader.js +1 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
- package/examples/jsm/shaders/SSRShader.js +1 -1
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/TSLEncoder.js +7 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
- package/examples/jsm/tsl/display/AnamorphicNode.js +2 -1
- package/examples/jsm/tsl/display/BloomNode.js +4 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +7 -0
- package/examples/jsm/tsl/display/GTAONode.js +45 -5
- package/examples/jsm/tsl/display/GaussianBlurNode.js +5 -3
- package/examples/jsm/tsl/display/OutlineNode.js +11 -0
- package/examples/jsm/tsl/display/SSGINode.js +654 -0
- package/examples/jsm/tsl/display/SSRNode.js +2 -0
- package/examples/jsm/tsl/display/SSSNode.js +488 -0
- package/examples/jsm/tsl/display/TRAANode.js +123 -6
- package/examples/jsm/tsl/display/boxBlur.js +1 -0
- package/examples/jsm/tsl/display/hashBlur.js +1 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
- package/package.json +5 -10
- package/src/Three.Core.js +3 -2
- package/src/Three.TSL.js +7 -1
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +2 -0
- package/src/animation/AnimationClip.js +3 -2
- package/src/animation/AnimationMixer.js +3 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/KeyframeTrack.js +7 -6
- package/src/animation/PropertyBinding.js +12 -11
- package/src/audio/Audio.js +10 -9
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +1 -1
- package/src/core/BufferGeometry.js +8 -8
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +3 -2
- package/src/core/Raycaster.js +2 -1
- package/src/core/RenderTarget.js +10 -1
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +268 -55
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/lib/earcut.js +7 -7
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +8 -6
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +1 -0
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +2 -1
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +2 -2
- package/src/loaders/DataTextureLoader.js +1 -1
- package/src/loaders/FileLoader.js +3 -2
- package/src/loaders/ImageBitmapLoader.js +5 -4
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +3 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +13 -13
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +3 -2
- package/src/materials/Material.js +4 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshLambertMaterial.js +2 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +2 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +1 -0
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +2 -2
- package/src/materials/nodes/Line2NodeMaterial.js +2 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/NodeMaterial.js +62 -22
- package/src/materials/nodes/manager/NodeMaterialObserver.js +2 -1
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +2 -2
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/MathUtils.js +13 -11
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +2 -2
- package/src/math/Matrix4.js +7 -7
- package/src/math/Plane.js +1 -1
- package/src/math/Quaternion.js +68 -66
- package/src/math/Spherical.js +1 -1
- package/src/nodes/Nodes.js +1 -1
- package/src/nodes/TSL.js +1 -1
- package/src/nodes/accessors/CubeTextureNode.js +3 -2
- package/src/nodes/accessors/InstanceNode.js +22 -4
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/Normal.js +5 -4
- package/src/nodes/accessors/Position.js +18 -2
- package/src/nodes/accessors/ReferenceNode.js +2 -1
- package/src/nodes/accessors/SceneNode.js +2 -1
- package/src/nodes/accessors/StorageBufferNode.js +2 -1
- package/src/nodes/accessors/StorageTextureNode.js +22 -0
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +61 -27
- package/src/nodes/code/FunctionCallNode.js +5 -4
- package/src/nodes/core/ArrayNode.js +1 -0
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +5 -10
- package/src/nodes/core/IndexNode.js +2 -2
- package/src/nodes/core/InputNode.js +2 -1
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
- package/src/nodes/core/Node.js +137 -12
- package/src/nodes/core/NodeBuilder.js +135 -21
- package/src/nodes/core/NodeFrame.js +20 -20
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUtils.js +17 -90
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +16 -14
- package/src/nodes/core/UniformNode.js +2 -1
- package/src/nodes/core/VarNode.js +70 -12
- package/src/nodes/core/VaryingNode.js +3 -2
- package/src/nodes/display/BlendModes.js +5 -4
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/NormalMapNode.js +2 -1
- package/src/nodes/display/PassNode.js +51 -10
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +2 -1
- package/src/nodes/display/ToneMappingNode.js +31 -4
- package/src/nodes/display/ToonOutlinePassNode.js +8 -0
- package/src/nodes/fog/Fog.js +3 -2
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +3 -2
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +40 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
- package/src/nodes/gpgpu/ComputeNode.js +17 -5
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +25 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
- package/src/nodes/lighting/EnvironmentNode.js +6 -6
- package/src/nodes/lighting/LightsNode.js +2 -3
- package/src/nodes/lighting/PointShadowNode.js +6 -0
- package/src/nodes/lighting/ShadowFilterNode.js +2 -0
- package/src/nodes/lighting/ShadowNode.js +75 -8
- package/src/nodes/math/ConditionalNode.js +6 -5
- package/src/nodes/math/MathNode.js +22 -4
- package/src/nodes/math/OperatorNode.js +3 -2
- package/src/nodes/pmrem/PMREMUtils.js +117 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +5 -2
- package/src/nodes/tsl/TSLCore.js +36 -15
- package/src/nodes/utils/DebugNode.js +2 -1
- package/src/nodes/utils/EventNode.js +36 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +3 -2
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +2 -1
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +12 -2
- package/src/nodes/utils/ReflectorNode.js +10 -3
- package/src/objects/Line.js +2 -1
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Skeleton.js +3 -2
- package/src/objects/SkinnedMesh.js +3 -1
- package/src/objects/Sprite.js +2 -1
- package/src/renderers/WebGLRenderer.js +49 -33
- package/src/renderers/common/Animation.js +13 -1
- package/src/renderers/common/Backend.js +93 -30
- package/src/renderers/common/Background.js +2 -1
- package/src/renderers/common/Bindings.js +56 -2
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/Geometries.js +26 -0
- package/src/renderers/common/Info.js +4 -2
- package/src/renderers/common/InspectorBase.js +146 -0
- package/src/renderers/common/PostProcessing.js +6 -25
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderObject.js +3 -1
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +436 -228
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +8 -0
- package/src/renderers/common/Sampler.js +37 -11
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +89 -35
- package/src/renderers/common/TimestampQueryPool.js +63 -1
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +7 -3
- package/src/renderers/common/extras/PMREMGenerator.js +160 -65
- package/src/renderers/common/nodes/NodeLibrary.js +4 -2
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/Nodes.js +38 -16
- package/src/renderers/shaders/DFGLUTData.js +64 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +25 -4
- package/src/renderers/webgl/WebGLCapabilities.js +2 -1
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLProgram.js +11 -10
- package/src/renderers/webgl/WebGLPrograms.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +2 -1
- package/src/renderers/webgl/WebGLState.js +15 -14
- package/src/renderers/webgl/WebGLTextures.js +18 -14
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +22 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +74 -11
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +6 -5
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +117 -16
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +42 -12
- package/src/renderers/webgpu/WebGPUBackend.js +134 -108
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -19
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
- package/src/renderers/webgpu/utils/WebGPUConstants.js +5 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +44 -16
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +146 -74
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +29 -6
- package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
- package/src/renderers/webxr/WebXRManager.js +3 -2
- package/src/textures/Source.js +2 -1
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +2 -0
- package/src/utils.js +67 -3
|
@@ -42,9 +42,7 @@ function TubePainter() {
|
|
|
42
42
|
geometry.setAttribute( 'color', colors );
|
|
43
43
|
geometry.drawRange.count = 0;
|
|
44
44
|
|
|
45
|
-
const material = new MeshStandardMaterial( {
|
|
46
|
-
vertexColors: true
|
|
47
|
-
} );
|
|
45
|
+
const material = new MeshStandardMaterial( { vertexColors: true } );
|
|
48
46
|
|
|
49
47
|
const mesh = new Mesh( geometry, material );
|
|
50
48
|
mesh.frustumCulled = false;
|
|
@@ -55,7 +53,7 @@ function TubePainter() {
|
|
|
55
53
|
|
|
56
54
|
const PI2 = Math.PI * 2;
|
|
57
55
|
|
|
58
|
-
const sides =
|
|
56
|
+
const sides = 15;
|
|
59
57
|
const array = [];
|
|
60
58
|
const radius = 0.01 * size;
|
|
61
59
|
|
|
@@ -72,33 +70,263 @@ function TubePainter() {
|
|
|
72
70
|
|
|
73
71
|
//
|
|
74
72
|
|
|
73
|
+
const vector = new Vector3();
|
|
74
|
+
|
|
75
75
|
const vector1 = new Vector3();
|
|
76
76
|
const vector2 = new Vector3();
|
|
77
77
|
const vector3 = new Vector3();
|
|
78
78
|
const vector4 = new Vector3();
|
|
79
79
|
|
|
80
|
-
const
|
|
81
|
-
|
|
80
|
+
const color1 = new Color( 0xffffff );
|
|
81
|
+
const color2 = new Color( 0xffffff );
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
let size1 = 1;
|
|
84
|
+
let size2 = 1;
|
|
84
85
|
|
|
85
|
-
|
|
86
|
+
function addCap( position, matrix, isEndCap, capSize ) {
|
|
86
87
|
|
|
87
88
|
let count = geometry.drawRange.count;
|
|
88
89
|
|
|
89
|
-
const points = getPoints(
|
|
90
|
+
const points = getPoints( capSize );
|
|
91
|
+
const sides = points.length;
|
|
92
|
+
const radius = 0.01 * capSize;
|
|
93
|
+
const latSegments = 4;
|
|
94
|
+
const directionSign = isEndCap ? - 1 : 1;
|
|
95
|
+
|
|
96
|
+
for ( let lat = 0; lat < latSegments; lat ++ ) {
|
|
97
|
+
|
|
98
|
+
const phi1 = ( lat / latSegments ) * Math.PI * 0.5;
|
|
99
|
+
const phi2 = ( ( lat + 1 ) / latSegments ) * Math.PI * 0.5;
|
|
100
|
+
|
|
101
|
+
const z1 = Math.sin( phi1 ) * radius * directionSign;
|
|
102
|
+
const r1 = Math.cos( phi1 ) * radius;
|
|
103
|
+
|
|
104
|
+
const z2 = Math.sin( phi2 ) * radius * directionSign;
|
|
105
|
+
const r2 = Math.cos( phi2 ) * radius;
|
|
106
|
+
|
|
107
|
+
for ( let i = 0; i < sides; i ++ ) {
|
|
108
|
+
|
|
109
|
+
const theta1 = ( i / sides ) * Math.PI * 2;
|
|
110
|
+
const theta2 = ( ( i + 1 ) / sides ) * Math.PI * 2;
|
|
111
|
+
|
|
112
|
+
// First ring
|
|
113
|
+
const x1 = Math.sin( theta1 ) * r1;
|
|
114
|
+
const y1 = Math.cos( theta1 ) * r1;
|
|
115
|
+
|
|
116
|
+
const x2 = Math.sin( theta2 ) * r1;
|
|
117
|
+
const y2 = Math.cos( theta2 ) * r1;
|
|
118
|
+
|
|
119
|
+
// Second ring
|
|
120
|
+
const x3 = Math.sin( theta1 ) * r2;
|
|
121
|
+
const y3 = Math.cos( theta1 ) * r2;
|
|
122
|
+
|
|
123
|
+
const x4 = Math.sin( theta2 ) * r2;
|
|
124
|
+
const y4 = Math.cos( theta2 ) * r2;
|
|
125
|
+
|
|
126
|
+
// Transform to world space
|
|
127
|
+
vector1.set( x1, y1, z1 ).applyMatrix4( matrix ).add( position );
|
|
128
|
+
vector2.set( x2, y2, z1 ).applyMatrix4( matrix ).add( position );
|
|
129
|
+
vector3.set( x3, y3, z2 ).applyMatrix4( matrix ).add( position );
|
|
130
|
+
vector4.set( x4, y4, z2 ).applyMatrix4( matrix ).add( position );
|
|
131
|
+
|
|
132
|
+
// First triangle
|
|
133
|
+
normal.set( x1, y1, z1 ).normalize().transformDirection( matrix );
|
|
134
|
+
vector.set( x2, y2, z1 ).normalize().transformDirection( matrix );
|
|
135
|
+
side.set( x3, y3, z2 ).normalize().transformDirection( matrix );
|
|
136
|
+
|
|
137
|
+
if ( isEndCap ) {
|
|
138
|
+
|
|
139
|
+
vector1.toArray( positions.array, count * 3 );
|
|
140
|
+
vector2.toArray( positions.array, ( count + 1 ) * 3 );
|
|
141
|
+
vector3.toArray( positions.array, ( count + 2 ) * 3 );
|
|
142
|
+
|
|
143
|
+
normal.toArray( normals.array, count * 3 );
|
|
144
|
+
vector.toArray( normals.array, ( count + 1 ) * 3 );
|
|
145
|
+
side.toArray( normals.array, ( count + 2 ) * 3 );
|
|
146
|
+
|
|
147
|
+
} else {
|
|
148
|
+
|
|
149
|
+
vector1.toArray( positions.array, count * 3 );
|
|
150
|
+
vector3.toArray( positions.array, ( count + 1 ) * 3 );
|
|
151
|
+
vector2.toArray( positions.array, ( count + 2 ) * 3 );
|
|
152
|
+
|
|
153
|
+
normal.toArray( normals.array, count * 3 );
|
|
154
|
+
side.toArray( normals.array, ( count + 1 ) * 3 );
|
|
155
|
+
vector.toArray( normals.array, ( count + 2 ) * 3 );
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
color1.toArray( colors.array, count * 3 );
|
|
160
|
+
color1.toArray( colors.array, ( count + 1 ) * 3 );
|
|
161
|
+
color1.toArray( colors.array, ( count + 2 ) * 3 );
|
|
162
|
+
|
|
163
|
+
count += 3;
|
|
164
|
+
|
|
165
|
+
// Second triangle
|
|
166
|
+
if ( r2 > 0.001 ) {
|
|
167
|
+
|
|
168
|
+
normal.set( x2, y2, z1 ).normalize().transformDirection( matrix );
|
|
169
|
+
vector.set( x4, y4, z2 ).normalize().transformDirection( matrix );
|
|
170
|
+
side.set( x3, y3, z2 ).normalize().transformDirection( matrix );
|
|
171
|
+
|
|
172
|
+
if ( isEndCap ) {
|
|
173
|
+
|
|
174
|
+
vector2.toArray( positions.array, count * 3 );
|
|
175
|
+
vector4.toArray( positions.array, ( count + 1 ) * 3 );
|
|
176
|
+
vector3.toArray( positions.array, ( count + 2 ) * 3 );
|
|
177
|
+
|
|
178
|
+
normal.toArray( normals.array, count * 3 );
|
|
179
|
+
vector.toArray( normals.array, ( count + 1 ) * 3 );
|
|
180
|
+
side.toArray( normals.array, ( count + 2 ) * 3 );
|
|
181
|
+
|
|
182
|
+
} else {
|
|
183
|
+
|
|
184
|
+
vector3.toArray( positions.array, count * 3 );
|
|
185
|
+
vector4.toArray( positions.array, ( count + 1 ) * 3 );
|
|
186
|
+
vector2.toArray( positions.array, ( count + 2 ) * 3 );
|
|
187
|
+
|
|
188
|
+
side.toArray( normals.array, count * 3 );
|
|
189
|
+
vector.toArray( normals.array, ( count + 1 ) * 3 );
|
|
190
|
+
normal.toArray( normals.array, ( count + 2 ) * 3 );
|
|
191
|
+
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
color1.toArray( colors.array, count * 3 );
|
|
195
|
+
color1.toArray( colors.array, ( count + 1 ) * 3 );
|
|
196
|
+
color1.toArray( colors.array, ( count + 2 ) * 3 );
|
|
197
|
+
|
|
198
|
+
count += 3;
|
|
199
|
+
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
geometry.drawRange.count = count;
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function updateEndCap( position, matrix, capSize ) {
|
|
211
|
+
|
|
212
|
+
if ( endCapStartIndex === null ) return;
|
|
213
|
+
|
|
214
|
+
const points = getPoints( capSize );
|
|
215
|
+
const sides = points.length;
|
|
216
|
+
const radius = 0.01 * capSize;
|
|
217
|
+
const latSegments = 4;
|
|
218
|
+
|
|
219
|
+
let count = endCapStartIndex;
|
|
220
|
+
|
|
221
|
+
for ( let lat = 0; lat < latSegments; lat ++ ) {
|
|
222
|
+
|
|
223
|
+
const phi1 = ( lat / latSegments ) * Math.PI * 0.5;
|
|
224
|
+
const phi2 = ( ( lat + 1 ) / latSegments ) * Math.PI * 0.5;
|
|
225
|
+
|
|
226
|
+
const z1 = - Math.sin( phi1 ) * radius;
|
|
227
|
+
const r1 = Math.cos( phi1 ) * radius;
|
|
228
|
+
|
|
229
|
+
const z2 = - Math.sin( phi2 ) * radius;
|
|
230
|
+
const r2 = Math.cos( phi2 ) * radius;
|
|
231
|
+
|
|
232
|
+
for ( let i = 0; i < sides; i ++ ) {
|
|
233
|
+
|
|
234
|
+
const theta1 = ( i / sides ) * Math.PI * 2;
|
|
235
|
+
const theta2 = ( ( i + 1 ) / sides ) * Math.PI * 2;
|
|
236
|
+
|
|
237
|
+
// First ring
|
|
238
|
+
const x1 = Math.sin( theta1 ) * r1;
|
|
239
|
+
const y1 = Math.cos( theta1 ) * r1;
|
|
240
|
+
|
|
241
|
+
const x2 = Math.sin( theta2 ) * r1;
|
|
242
|
+
const y2 = Math.cos( theta2 ) * r1;
|
|
243
|
+
|
|
244
|
+
// Second ring
|
|
245
|
+
const x3 = Math.sin( theta1 ) * r2;
|
|
246
|
+
const y3 = Math.cos( theta1 ) * r2;
|
|
247
|
+
|
|
248
|
+
const x4 = Math.sin( theta2 ) * r2;
|
|
249
|
+
const y4 = Math.cos( theta2 ) * r2;
|
|
250
|
+
|
|
251
|
+
// Transform positions to world space
|
|
252
|
+
vector1.set( x1, y1, z1 ).applyMatrix4( matrix ).add( position );
|
|
253
|
+
vector2.set( x2, y2, z1 ).applyMatrix4( matrix ).add( position );
|
|
254
|
+
vector3.set( x3, y3, z2 ).applyMatrix4( matrix ).add( position );
|
|
255
|
+
vector4.set( x4, y4, z2 ).applyMatrix4( matrix ).add( position );
|
|
256
|
+
|
|
257
|
+
// Transform normals to world space
|
|
258
|
+
normal.set( x1, y1, z1 ).normalize().transformDirection( matrix );
|
|
259
|
+
vector.set( x2, y2, z1 ).normalize().transformDirection( matrix );
|
|
260
|
+
side.set( x3, y3, z2 ).normalize().transformDirection( matrix );
|
|
261
|
+
|
|
262
|
+
// First triangle
|
|
263
|
+
vector1.toArray( positions.array, count * 3 );
|
|
264
|
+
vector2.toArray( positions.array, ( count + 1 ) * 3 );
|
|
265
|
+
vector3.toArray( positions.array, ( count + 2 ) * 3 );
|
|
266
|
+
|
|
267
|
+
normal.toArray( normals.array, count * 3 );
|
|
268
|
+
vector.toArray( normals.array, ( count + 1 ) * 3 );
|
|
269
|
+
side.toArray( normals.array, ( count + 2 ) * 3 );
|
|
270
|
+
|
|
271
|
+
color1.toArray( colors.array, count * 3 );
|
|
272
|
+
color1.toArray( colors.array, ( count + 1 ) * 3 );
|
|
273
|
+
color1.toArray( colors.array, ( count + 2 ) * 3 );
|
|
274
|
+
|
|
275
|
+
count += 3;
|
|
276
|
+
|
|
277
|
+
// Second triangle
|
|
278
|
+
if ( r2 > 0.001 ) {
|
|
279
|
+
|
|
280
|
+
normal.set( x2, y2, z1 ).normalize().transformDirection( matrix );
|
|
281
|
+
vector.set( x4, y4, z2 ).normalize().transformDirection( matrix );
|
|
282
|
+
side.set( x3, y3, z2 ).normalize().transformDirection( matrix );
|
|
283
|
+
|
|
284
|
+
vector2.toArray( positions.array, count * 3 );
|
|
285
|
+
vector4.toArray( positions.array, ( count + 1 ) * 3 );
|
|
286
|
+
vector3.toArray( positions.array, ( count + 2 ) * 3 );
|
|
287
|
+
|
|
288
|
+
normal.toArray( normals.array, count * 3 );
|
|
289
|
+
vector.toArray( normals.array, ( count + 1 ) * 3 );
|
|
290
|
+
side.toArray( normals.array, ( count + 2 ) * 3 );
|
|
291
|
+
|
|
292
|
+
color1.toArray( colors.array, count * 3 );
|
|
293
|
+
color1.toArray( colors.array, ( count + 1 ) * 3 );
|
|
294
|
+
color1.toArray( colors.array, ( count + 2 ) * 3 );
|
|
295
|
+
|
|
296
|
+
count += 3;
|
|
297
|
+
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
positions.addUpdateRange( endCapStartIndex * 3, endCapVertexCount * 3 );
|
|
305
|
+
normals.addUpdateRange( endCapStartIndex * 3, endCapVertexCount * 3 );
|
|
306
|
+
colors.addUpdateRange( endCapStartIndex * 3, endCapVertexCount * 3 );
|
|
307
|
+
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function stroke( position1, position2, matrix1, matrix2, size1, size2 ) {
|
|
311
|
+
|
|
312
|
+
if ( position1.distanceToSquared( position2 ) === 0 ) return;
|
|
313
|
+
|
|
314
|
+
let count = geometry.drawRange.count;
|
|
90
315
|
|
|
91
|
-
|
|
316
|
+
const points1 = getPoints( size1 );
|
|
317
|
+
const points2 = getPoints( size2 );
|
|
92
318
|
|
|
93
|
-
|
|
94
|
-
const vertex2 = points[ ( i + 1 ) % il ];
|
|
319
|
+
for ( let i = 0, il = points2.length; i < il; i ++ ) {
|
|
95
320
|
|
|
96
|
-
|
|
321
|
+
const vertex1_2 = points2[ i ];
|
|
322
|
+
const vertex2_2 = points2[ ( i + 1 ) % il ];
|
|
323
|
+
const vertex1_1 = points1[ i ];
|
|
324
|
+
const vertex2_1 = points1[ ( i + 1 ) % il ];
|
|
97
325
|
|
|
98
|
-
vector1.copy(
|
|
99
|
-
vector2.copy(
|
|
100
|
-
vector3.copy(
|
|
101
|
-
vector4.copy(
|
|
326
|
+
vector1.copy( vertex1_2 ).applyMatrix4( matrix2 ).add( position2 );
|
|
327
|
+
vector2.copy( vertex2_2 ).applyMatrix4( matrix2 ).add( position2 );
|
|
328
|
+
vector3.copy( vertex2_1 ).applyMatrix4( matrix1 ).add( position1 );
|
|
329
|
+
vector4.copy( vertex1_1 ).applyMatrix4( matrix1 ).add( position1 );
|
|
102
330
|
|
|
103
331
|
vector1.toArray( positions.array, ( count + 0 ) * 3 );
|
|
104
332
|
vector2.toArray( positions.array, ( count + 1 ) * 3 );
|
|
@@ -108,12 +336,10 @@ function TubePainter() {
|
|
|
108
336
|
vector3.toArray( positions.array, ( count + 4 ) * 3 );
|
|
109
337
|
vector4.toArray( positions.array, ( count + 5 ) * 3 );
|
|
110
338
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
vector3.copy( vertex2 ).applyMatrix4( matrix1 ).normalize();
|
|
116
|
-
vector4.copy( vertex1 ).applyMatrix4( matrix1 ).normalize();
|
|
339
|
+
vector1.copy( vertex1_2 ).applyMatrix4( matrix2 ).normalize();
|
|
340
|
+
vector2.copy( vertex2_2 ).applyMatrix4( matrix2 ).normalize();
|
|
341
|
+
vector3.copy( vertex2_1 ).applyMatrix4( matrix1 ).normalize();
|
|
342
|
+
vector4.copy( vertex1_1 ).applyMatrix4( matrix1 ).normalize();
|
|
117
343
|
|
|
118
344
|
vector1.toArray( normals.array, ( count + 0 ) * 3 );
|
|
119
345
|
vector2.toArray( normals.array, ( count + 1 ) * 3 );
|
|
@@ -123,15 +349,13 @@ function TubePainter() {
|
|
|
123
349
|
vector3.toArray( normals.array, ( count + 4 ) * 3 );
|
|
124
350
|
vector4.toArray( normals.array, ( count + 5 ) * 3 );
|
|
125
351
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
color.toArray( colors.array, ( count + 1 ) * 3 );
|
|
130
|
-
color.toArray( colors.array, ( count + 2 ) * 3 );
|
|
352
|
+
color2.toArray( colors.array, ( count + 0 ) * 3 );
|
|
353
|
+
color2.toArray( colors.array, ( count + 1 ) * 3 );
|
|
354
|
+
color1.toArray( colors.array, ( count + 2 ) * 3 );
|
|
131
355
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
356
|
+
color2.toArray( colors.array, ( count + 3 ) * 3 );
|
|
357
|
+
color1.toArray( colors.array, ( count + 4 ) * 3 );
|
|
358
|
+
color1.toArray( colors.array, ( count + 5 ) * 3 );
|
|
135
359
|
|
|
136
360
|
count += 6;
|
|
137
361
|
|
|
@@ -143,7 +367,9 @@ function TubePainter() {
|
|
|
143
367
|
|
|
144
368
|
//
|
|
145
369
|
|
|
146
|
-
const
|
|
370
|
+
const direction = new Vector3();
|
|
371
|
+
const normal = new Vector3();
|
|
372
|
+
const side = new Vector3();
|
|
147
373
|
|
|
148
374
|
const point1 = new Vector3();
|
|
149
375
|
const point2 = new Vector3();
|
|
@@ -151,31 +377,139 @@ function TubePainter() {
|
|
|
151
377
|
const matrix1 = new Matrix4();
|
|
152
378
|
const matrix2 = new Matrix4();
|
|
153
379
|
|
|
154
|
-
|
|
380
|
+
const lastNormal = new Vector3();
|
|
381
|
+
const prevDirection = new Vector3();
|
|
382
|
+
const rotationAxis = new Vector3();
|
|
155
383
|
|
|
156
|
-
|
|
157
|
-
|
|
384
|
+
let isFirstSegment = true;
|
|
385
|
+
|
|
386
|
+
let endCapStartIndex = null;
|
|
387
|
+
let endCapVertexCount = 0;
|
|
388
|
+
|
|
389
|
+
function calculateRMF() {
|
|
390
|
+
|
|
391
|
+
if ( isFirstSegment === true ) {
|
|
392
|
+
|
|
393
|
+
if ( Math.abs( direction.y ) < 0.99 ) {
|
|
394
|
+
|
|
395
|
+
vector.copy( direction ).multiplyScalar( direction.y );
|
|
396
|
+
normal.set( 0, 1, 0 ).sub( vector ).normalize();
|
|
397
|
+
|
|
398
|
+
} else {
|
|
399
|
+
|
|
400
|
+
vector.copy( direction ).multiplyScalar( direction.x );
|
|
401
|
+
normal.set( 1, 0, 0 ).sub( vector ).normalize();
|
|
402
|
+
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
} else {
|
|
406
|
+
|
|
407
|
+
rotationAxis.crossVectors( prevDirection, direction );
|
|
408
|
+
|
|
409
|
+
const rotAxisLength = rotationAxis.length();
|
|
410
|
+
|
|
411
|
+
if ( rotAxisLength > 0.0001 ) {
|
|
412
|
+
|
|
413
|
+
rotationAxis.divideScalar( rotAxisLength );
|
|
414
|
+
vector.addVectors( prevDirection, direction );
|
|
415
|
+
const c1 = - 2.0 / ( 1.0 + prevDirection.dot( direction ) );
|
|
416
|
+
const dot = lastNormal.dot( vector );
|
|
417
|
+
normal.copy( lastNormal ).addScaledVector( vector, c1 * dot );
|
|
418
|
+
|
|
419
|
+
} else {
|
|
420
|
+
|
|
421
|
+
normal.copy( lastNormal );
|
|
422
|
+
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
side.crossVectors( direction, normal ).normalize();
|
|
428
|
+
normal.crossVectors( side, direction ).normalize();
|
|
429
|
+
|
|
430
|
+
if ( isFirstSegment === false ) {
|
|
431
|
+
|
|
432
|
+
const smoothFactor = 0.3;
|
|
433
|
+
|
|
434
|
+
normal.lerp( lastNormal, smoothFactor ).normalize();
|
|
435
|
+
side.crossVectors( direction, normal ).normalize();
|
|
436
|
+
normal.crossVectors( side, direction ).normalize();
|
|
437
|
+
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
lastNormal.copy( normal );
|
|
441
|
+
prevDirection.copy( direction );
|
|
442
|
+
|
|
443
|
+
matrix1.makeBasis( side, normal, vector.copy( direction ).negate() );
|
|
444
|
+
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function moveTo( position ) {
|
|
158
448
|
|
|
159
449
|
point2.copy( position );
|
|
160
|
-
|
|
450
|
+
|
|
451
|
+
lastNormal.set( 0, 1, 0 );
|
|
452
|
+
|
|
453
|
+
isFirstSegment = true;
|
|
454
|
+
|
|
455
|
+
endCapStartIndex = null;
|
|
456
|
+
endCapVertexCount = 0;
|
|
161
457
|
|
|
162
458
|
}
|
|
163
459
|
|
|
164
460
|
function lineTo( position ) {
|
|
165
461
|
|
|
166
462
|
point1.copy( position );
|
|
167
|
-
matrix1.lookAt( point2, point1, up );
|
|
168
463
|
|
|
169
|
-
|
|
464
|
+
direction.subVectors( point1, point2 );
|
|
465
|
+
|
|
466
|
+
const length = direction.length();
|
|
467
|
+
|
|
468
|
+
if ( length === 0 ) return;
|
|
469
|
+
|
|
470
|
+
direction.normalize();
|
|
471
|
+
|
|
472
|
+
calculateRMF();
|
|
473
|
+
|
|
474
|
+
if ( isFirstSegment === true ) {
|
|
475
|
+
|
|
476
|
+
color2.copy( color1 );
|
|
477
|
+
size2 = size1;
|
|
478
|
+
|
|
479
|
+
matrix2.copy( matrix1 );
|
|
480
|
+
|
|
481
|
+
addCap( point2, matrix2, false, size2 );
|
|
482
|
+
|
|
483
|
+
// End cap is added immediately after start cap and updated in-place
|
|
484
|
+
endCapStartIndex = geometry.drawRange.count;
|
|
485
|
+
addCap( point1, matrix1, true, size1 );
|
|
486
|
+
endCapVertexCount = geometry.drawRange.count - endCapStartIndex;
|
|
487
|
+
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
stroke( point1, point2, matrix1, matrix2, size1, size2 );
|
|
491
|
+
|
|
492
|
+
updateEndCap( point1, matrix1, size1 );
|
|
170
493
|
|
|
171
494
|
point2.copy( point1 );
|
|
172
495
|
matrix2.copy( matrix1 );
|
|
173
496
|
|
|
497
|
+
color2.copy( color1 );
|
|
498
|
+
size2 = size1;
|
|
499
|
+
|
|
500
|
+
isFirstSegment = false;
|
|
501
|
+
|
|
174
502
|
}
|
|
175
503
|
|
|
176
504
|
function setSize( value ) {
|
|
177
505
|
|
|
178
|
-
|
|
506
|
+
size1 = value;
|
|
507
|
+
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
function setColor( value ) {
|
|
511
|
+
|
|
512
|
+
color1.copy( value );
|
|
179
513
|
|
|
180
514
|
}
|
|
181
515
|
|
|
@@ -199,7 +533,7 @@ function TubePainter() {
|
|
|
199
533
|
colors.addUpdateRange( start * 3, ( end - start ) * 3 );
|
|
200
534
|
colors.needsUpdate = true;
|
|
201
535
|
|
|
202
|
-
count =
|
|
536
|
+
count = end;
|
|
203
537
|
|
|
204
538
|
}
|
|
205
539
|
|
|
@@ -241,6 +575,15 @@ function TubePainter() {
|
|
|
241
575
|
*/
|
|
242
576
|
setSize: setSize,
|
|
243
577
|
|
|
578
|
+
/**
|
|
579
|
+
* Sets the color of newly rendered tube segments.
|
|
580
|
+
*
|
|
581
|
+
* @method
|
|
582
|
+
* @name TubePainter#setColor
|
|
583
|
+
* @param {Color} color The color.
|
|
584
|
+
*/
|
|
585
|
+
setColor: setColor,
|
|
586
|
+
|
|
244
587
|
/**
|
|
245
588
|
* Updates the internal geometry buffers so the new painted
|
|
246
589
|
* segments are rendered.
|
|
@@ -14,7 +14,7 @@ const _cb = new Vector3(), _ab = new Vector3();
|
|
|
14
14
|
* This class can be used to modify a geometry by simplifying it. A typical use
|
|
15
15
|
* case for such a modifier is automatic LOD generation.
|
|
16
16
|
*
|
|
17
|
-
* The implementation is based on [Progressive Mesh type Polygon Reduction Algorithm]
|
|
17
|
+
* The implementation is based on [Progressive Mesh type Polygon Reduction Algorithm](https://web.archive.org/web/20230610044040/http://www.melax.com/polychop/)
|
|
18
18
|
* by Stan Melax in 1998.
|
|
19
19
|
*
|
|
20
20
|
* ```js
|
|
@@ -387,6 +387,7 @@ ReflectorForSSRPass.ReflectorShader = {
|
|
|
387
387
|
* @property {number} [clipBias=0] - The clip bias.
|
|
388
388
|
* @property {Object} [shader] - Can be used to pass in a custom shader that defines how the reflective view is projected onto the reflector's geometry.
|
|
389
389
|
* @property {boolean} [useDepthTexture=true] - Whether to store depth values in a texture or not.
|
|
390
|
+
* @property {Vector2} [resolution] - Resolution for the Reflector Pass.
|
|
390
391
|
**/
|
|
391
392
|
|
|
392
393
|
export { ReflectorForSSRPass };
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from 'three';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* Represents a skydome for scene backgrounds. Based on [A Practical Analytic Model for Daylight]
|
|
11
|
+
* Represents a skydome for scene backgrounds. Based on [A Practical Analytic Model for Daylight](https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight)
|
|
12
12
|
* aka The Preetham Model, the de facto standard for analytical skydomes.
|
|
13
13
|
*
|
|
14
14
|
* Note that this class can only be used with {@link WebGLRenderer}.
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import { Fn, float, vec3, acos, add, mul, clamp, cos, dot, exp, max, mix, modelViewProjection, normalize, positionWorld, pow, smoothstep, sub, varyingProperty, vec4, uniform, cameraPosition } from 'three/tsl';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* Represents a skydome for scene backgrounds. Based on [A Practical Analytic Model for Daylight]
|
|
12
|
+
* Represents a skydome for scene backgrounds. Based on [A Practical Analytic Model for Daylight](https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight)
|
|
13
13
|
* aka The Preetham Model, the de facto standard for analytical skydomes.
|
|
14
14
|
*
|
|
15
15
|
* Note that this class can only be used with {@link WebGLRenderer}.
|
|
@@ -21,9 +21,9 @@ import {
|
|
|
21
21
|
*
|
|
22
22
|
* References:
|
|
23
23
|
*
|
|
24
|
-
* - [Flat mirror for three.js]
|
|
25
|
-
* - [An implementation of water shader based on the flat mirror]
|
|
26
|
-
* - [Water shader explanations in WebGL]
|
|
24
|
+
* - [Flat mirror for three.js](https://github.com/Slayvin)
|
|
25
|
+
* - [An implementation of water shader based on the flat mirror](https://home.adelphi.edu/~stemkoski/)
|
|
26
|
+
* - [Water shader explanations in WebGL](http://29a.ch/slides/2012/webglwater/ )
|
|
27
27
|
*
|
|
28
28
|
* @augments Mesh
|
|
29
29
|
* @three_import import { Water } from 'three/addons/objects/Water.js';
|
|
@@ -15,9 +15,9 @@ import { Fn, add, cameraPosition, div, normalize, positionWorld, sub, time, text
|
|
|
15
15
|
*
|
|
16
16
|
* References:
|
|
17
17
|
*
|
|
18
|
-
* - [Flat mirror for three.js]
|
|
19
|
-
* - [An implementation of water shader based on the flat mirror]
|
|
20
|
-
* - [Water shader explanations in WebGL]
|
|
18
|
+
* - [Flat mirror for three.js](https://github.com/Slayvin)
|
|
19
|
+
* - [An implementation of water shader based on the flat mirror](https://home.adelphi.edu/~stemkoski/)
|
|
20
|
+
* - [Water shader explanations in WebGL](http://29a.ch/slides/2012/webglwater/ )
|
|
21
21
|
*
|
|
22
22
|
* @augments Mesh
|
|
23
23
|
* @three_import import { WaterMesh } from 'three/addons/objects/WaterMesh.js';
|
|
@@ -51,7 +51,7 @@ class WaterMesh extends Mesh {
|
|
|
51
51
|
* @type {number}
|
|
52
52
|
* @default 0.5
|
|
53
53
|
*/
|
|
54
|
-
this.
|
|
54
|
+
this.resolutionScale = options.resolutionScale !== undefined ? options.resolutionScale : 0.5;
|
|
55
55
|
|
|
56
56
|
// Uniforms
|
|
57
57
|
|
|
@@ -161,7 +161,7 @@ class WaterMesh extends Mesh {
|
|
|
161
161
|
|
|
162
162
|
const mirrorSampler = reflector();
|
|
163
163
|
mirrorSampler.uvNode = mirrorSampler.uvNode.add( distortion );
|
|
164
|
-
mirrorSampler.
|
|
164
|
+
mirrorSampler.reflector.resolutionScale = this.resolutionScale;
|
|
165
165
|
|
|
166
166
|
this.add( mirrorSampler.target );
|
|
167
167
|
|
|
@@ -183,7 +183,7 @@ class WaterMesh extends Mesh {
|
|
|
183
183
|
* Constructor options of `WaterMesh`.
|
|
184
184
|
*
|
|
185
185
|
* @typedef {Object} WaterMesh~Options
|
|
186
|
-
* @property {number} [
|
|
186
|
+
* @property {number} [resolutionScale=0.5] - The resolution scale.
|
|
187
187
|
* @property {?Texture} [waterNormals=null] - The water's normal map.
|
|
188
188
|
* @property {number} [alpha=1] - The alpha value.
|
|
189
189
|
* @property {number} [size=1] - The size value.
|
|
@@ -61,7 +61,7 @@ class GlitchPass extends Pass {
|
|
|
61
61
|
// internals
|
|
62
62
|
|
|
63
63
|
this._heightMap = this._generateHeightmap( dt_size );
|
|
64
|
-
this.uniforms[ 'tDisp' ].value = this.
|
|
64
|
+
this.uniforms[ 'tDisp' ].value = this._heightMap;
|
|
65
65
|
|
|
66
66
|
this._fsQuad = new FullScreenQuad( this.material );
|
|
67
67
|
|
|
@@ -140,7 +140,7 @@ class GlitchPass extends Pass {
|
|
|
140
140
|
|
|
141
141
|
this.material.dispose();
|
|
142
142
|
|
|
143
|
-
this.
|
|
143
|
+
this._heightMap.dispose();
|
|
144
144
|
|
|
145
145
|
this._fsQuad.dispose();
|
|
146
146
|
|
|
@@ -22,7 +22,7 @@ import { LuminosityHighPassShader } from '../shaders/LuminosityHighPassShader.js
|
|
|
22
22
|
* When using this pass, tone mapping must be enabled in the renderer settings.
|
|
23
23
|
*
|
|
24
24
|
* Reference:
|
|
25
|
-
* - [Bloom in Unreal Engine]
|
|
25
|
+
* - [Bloom in Unreal Engine](https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/)
|
|
26
26
|
*
|
|
27
27
|
* ```js
|
|
28
28
|
* const resolution = new THREE.Vector2( window.innerWidth, window.innerHeight );
|
|
@@ -145,7 +145,9 @@ class UnrealBloomPass extends Pass {
|
|
|
145
145
|
// gaussian blur materials
|
|
146
146
|
|
|
147
147
|
this.separableBlurMaterials = [];
|
|
148
|
-
|
|
148
|
+
// These sizes have been changed to account for the altered coefficients-calculation to avoid blockiness,
|
|
149
|
+
// while retaining the same blur-strength. For details see https://github.com/mrdoob/three.js/pull/31528
|
|
150
|
+
const kernelSizeArray = [ 6, 10, 14, 18, 22 ];
|
|
149
151
|
resx = Math.round( this.resolution.x / 2 );
|
|
150
152
|
resy = Math.round( this.resolution.y / 2 );
|
|
151
153
|
|
|
@@ -376,10 +378,11 @@ class UnrealBloomPass extends Pass {
|
|
|
376
378
|
_getSeparableBlurMaterial( kernelRadius ) {
|
|
377
379
|
|
|
378
380
|
const coefficients = [];
|
|
381
|
+
const sigma = kernelRadius / 3;
|
|
379
382
|
|
|
380
383
|
for ( let i = 0; i < kernelRadius; i ++ ) {
|
|
381
384
|
|
|
382
|
-
coefficients.push( 0.39894 * Math.exp( - 0.5 * i * i / (
|
|
385
|
+
coefficients.push( 0.39894 * Math.exp( - 0.5 * i * i / ( sigma * sigma ) ) / sigma );
|
|
383
386
|
|
|
384
387
|
}
|
|
385
388
|
|
|
@@ -420,10 +423,9 @@ class UnrealBloomPass extends Pass {
|
|
|
420
423
|
vec2 uvOffset = direction * invSize * x;
|
|
421
424
|
vec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;
|
|
422
425
|
vec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;
|
|
423
|
-
diffuseSum += (sample1 + sample2) * w;
|
|
424
|
-
weightSum += 2.0 * w;
|
|
426
|
+
diffuseSum += ( sample1 + sample2 ) * w;
|
|
425
427
|
}
|
|
426
|
-
gl_FragColor = vec4(diffuseSum
|
|
428
|
+
gl_FragColor = vec4( diffuseSum, 1.0 );
|
|
427
429
|
}`
|
|
428
430
|
} );
|
|
429
431
|
|