Просмотр исходного кода

Codesplit WebGL/WebGPU entrypoints (#29404)

* Codesplit WebGL/WebGPU entrypoints

* Keep src/Three.js as WebGL entrypoint

* Restore unused three.webgpu.nodes.js

* Restore duplicate entrypoint

* Remove duplicate WebGPU.Nodes artifact

* Revert "Remove duplicate WebGPU.Nodes artifact"

This reverts commit 418db9bd5ce7a78affc1b149a81f1ee6c058dbed.

* Prevent duplicate core artifacts

* Updated builds.

* Try removing builds.

* Revert "Try removing builds."

This reverts commit 880e8bbacae63e5f58fef7426e9b6f7b3d174d7c.

* Puppeteer: inject into core chunk

* Updated builds.

* Remove builds.

* Three.WebGPU: resolve conflicts

#29595

* Isolate Nodes bundles due to chunking

* WebGPU.Nodes: restore individual exports

* Revert isolation of WebGPU.Nodes build

* Isolate Nodes bundles due to chunking

* Revert "Isolate Nodes bundles due to chunking"

This reverts commit ba0c5b4d4e854bd721ee0c4694f8d152b14ff111.

* Try isolating Nodes in different order

* Cleanup

---------

Co-authored-by: Michael Herzog <michael.herzog@human-interactive.org>
Cody Bennett 1 год назад
Родитель
Сommit
84a69f582f
6 измененных файлов с 223 добавлено и 581 удалено
  1. 2 185
      src/Three.WebGPU.Nodes.js
  2. 1 185
      src/Three.WebGPU.js
  3. 178 0
      src/Three.core.js
  4. 1 177
      src/Three.js
  5. 1 0
      test/e2e/puppeteer.js
  6. 40 34
      utils/build/rollup.config.js

+ 2 - 185
src/Three.WebGPU.Nodes.js

@@ -1,170 +1,9 @@
-import { REVISION } from './constants.js';
-
-export { WebGLArrayRenderTarget } from './renderers/WebGLArrayRenderTarget.js';
-export { WebGL3DRenderTarget } from './renderers/WebGL3DRenderTarget.js';
-export { WebGLCubeRenderTarget } from './renderers/WebGLCubeRenderTarget.js';
-export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js';
-//export { WebGLRenderer } from './renderers/WebGLRenderer.js';
-//export { ShaderLib } from './renderers/shaders/ShaderLib.js';
-//export { UniformsLib } from './renderers/shaders/UniformsLib.js';
-//export { UniformsUtils } from './renderers/shaders/UniformsUtils.js';
-//export { ShaderChunk } from './renderers/shaders/ShaderChunk.js';
-export { FogExp2 } from './scenes/FogExp2.js';
-export { Fog } from './scenes/Fog.js';
-export { Scene } from './scenes/Scene.js';
-export { Sprite } from './objects/Sprite.js';
-export { LOD } from './objects/LOD.js';
-export { SkinnedMesh } from './objects/SkinnedMesh.js';
-export { Skeleton } from './objects/Skeleton.js';
-export { Bone } from './objects/Bone.js';
-export { Mesh } from './objects/Mesh.js';
-export { InstancedMesh } from './objects/InstancedMesh.js';
-export { BatchedMesh } from './objects/BatchedMesh.js';
-export { LineSegments } from './objects/LineSegments.js';
-export { LineLoop } from './objects/LineLoop.js';
-export { Line } from './objects/Line.js';
-export { Points } from './objects/Points.js';
-export { Group } from './objects/Group.js';
-export { VideoTexture } from './textures/VideoTexture.js';
-export { FramebufferTexture } from './textures/FramebufferTexture.js';
-export { Source } from './textures/Source.js';
-export { DataTexture } from './textures/DataTexture.js';
-export { DataArrayTexture } from './textures/DataArrayTexture.js';
-export { Data3DTexture } from './textures/Data3DTexture.js';
-export { CompressedTexture } from './textures/CompressedTexture.js';
-export { CompressedArrayTexture } from './textures/CompressedArrayTexture.js';
-export { CompressedCubeTexture } from './textures/CompressedCubeTexture.js';
-export { CubeTexture } from './textures/CubeTexture.js';
-export { CanvasTexture } from './textures/CanvasTexture.js';
-export { DepthTexture } from './textures/DepthTexture.js';
-export { Texture } from './textures/Texture.js';
-export * from './geometries/Geometries.js';
-export * from './materials/Materials.js';
-export { Material } from './materials/Material.js';
-export { AnimationLoader } from './loaders/AnimationLoader.js';
-export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js';
-export { CubeTextureLoader } from './loaders/CubeTextureLoader.js';
-export { DataTextureLoader } from './loaders/DataTextureLoader.js';
-export { TextureLoader } from './loaders/TextureLoader.js';
-export { ObjectLoader } from './loaders/ObjectLoader.js';
-export { MaterialLoader } from './loaders/MaterialLoader.js';
-export { BufferGeometryLoader } from './loaders/BufferGeometryLoader.js';
-export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js';
-export { ImageLoader } from './loaders/ImageLoader.js';
-export { ImageBitmapLoader } from './loaders/ImageBitmapLoader.js';
-export { FileLoader } from './loaders/FileLoader.js';
-export { Loader } from './loaders/Loader.js';
-export { LoaderUtils } from './loaders/LoaderUtils.js';
-export { Cache } from './loaders/Cache.js';
-export { AudioLoader } from './loaders/AudioLoader.js';
-export { SpotLight } from './lights/SpotLight.js';
-export { PointLight } from './lights/PointLight.js';
-export { RectAreaLight } from './lights/RectAreaLight.js';
-export { HemisphereLight } from './lights/HemisphereLight.js';
-export { DirectionalLight } from './lights/DirectionalLight.js';
-export { AmbientLight } from './lights/AmbientLight.js';
-export { Light } from './lights/Light.js';
-export { LightProbe } from './lights/LightProbe.js';
-export { StereoCamera } from './cameras/StereoCamera.js';
-export { PerspectiveCamera } from './cameras/PerspectiveCamera.js';
-export { OrthographicCamera } from './cameras/OrthographicCamera.js';
-export { CubeCamera } from './cameras/CubeCamera.js';
-export { ArrayCamera } from './cameras/ArrayCamera.js';
-export { Camera } from './cameras/Camera.js';
-export { AudioListener } from './audio/AudioListener.js';
-export { PositionalAudio } from './audio/PositionalAudio.js';
-export { AudioContext } from './audio/AudioContext.js';
-export { AudioAnalyser } from './audio/AudioAnalyser.js';
-export { Audio } from './audio/Audio.js';
-export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js';
-export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js';
-export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js';
-export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js';
-export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js';
-export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js';
-export { PropertyMixer } from './animation/PropertyMixer.js';
-export { PropertyBinding } from './animation/PropertyBinding.js';
-export { KeyframeTrack } from './animation/KeyframeTrack.js';
-export { AnimationUtils } from './animation/AnimationUtils.js';
-export { AnimationObjectGroup } from './animation/AnimationObjectGroup.js';
-export { AnimationMixer } from './animation/AnimationMixer.js';
-export { AnimationClip } from './animation/AnimationClip.js';
-export { AnimationAction } from './animation/AnimationAction.js';
-export { RenderTarget } from './core/RenderTarget.js';
-export { Uniform } from './core/Uniform.js';
-export { UniformsGroup } from './core/UniformsGroup.js';
-export { InstancedBufferGeometry } from './core/InstancedBufferGeometry.js';
-export { BufferGeometry } from './core/BufferGeometry.js';
-export { InterleavedBufferAttribute } from './core/InterleavedBufferAttribute.js';
-export { InstancedInterleavedBuffer } from './core/InstancedInterleavedBuffer.js';
-export { InterleavedBuffer } from './core/InterleavedBuffer.js';
-export { InstancedBufferAttribute } from './core/InstancedBufferAttribute.js';
-export { GLBufferAttribute } from './core/GLBufferAttribute.js';
-export * from './core/BufferAttribute.js';
-export { Object3D } from './core/Object3D.js';
-export { Raycaster } from './core/Raycaster.js';
-export { Layers } from './core/Layers.js';
-export { EventDispatcher } from './core/EventDispatcher.js';
-export { Clock } from './core/Clock.js';
-export { QuaternionLinearInterpolant } from './math/interpolants/QuaternionLinearInterpolant.js';
-export { LinearInterpolant } from './math/interpolants/LinearInterpolant.js';
-export { DiscreteInterpolant } from './math/interpolants/DiscreteInterpolant.js';
-export { CubicInterpolant } from './math/interpolants/CubicInterpolant.js';
-export { Interpolant } from './math/Interpolant.js';
-export { Triangle } from './math/Triangle.js';
-export { MathUtils } from './math/MathUtils.js';
-export { Spherical } from './math/Spherical.js';
-export { Cylindrical } from './math/Cylindrical.js';
-export { Plane } from './math/Plane.js';
-export { Frustum } from './math/Frustum.js';
-export { Sphere } from './math/Sphere.js';
-export { Ray } from './math/Ray.js';
-export { Matrix4 } from './math/Matrix4.js';
-export { Matrix3 } from './math/Matrix3.js';
-export { Matrix2 } from './math/Matrix2.js';
-export { Box3 } from './math/Box3.js';
-export { Box2 } from './math/Box2.js';
-export { Line3 } from './math/Line3.js';
-export { Euler } from './math/Euler.js';
-export { Vector4 } from './math/Vector4.js';
-export { Vector3 } from './math/Vector3.js';
-export { Vector2 } from './math/Vector2.js';
-export { Quaternion } from './math/Quaternion.js';
-export { Color } from './math/Color.js';
-export { ColorManagement } from './math/ColorManagement.js';
-export { SphericalHarmonics3 } from './math/SphericalHarmonics3.js';
-export { SpotLightHelper } from './helpers/SpotLightHelper.js';
-export { SkeletonHelper } from './helpers/SkeletonHelper.js';
-export { PointLightHelper } from './helpers/PointLightHelper.js';
-export { HemisphereLightHelper } from './helpers/HemisphereLightHelper.js';
-export { GridHelper } from './helpers/GridHelper.js';
-export { PolarGridHelper } from './helpers/PolarGridHelper.js';
-export { DirectionalLightHelper } from './helpers/DirectionalLightHelper.js';
-export { CameraHelper } from './helpers/CameraHelper.js';
-export { BoxHelper } from './helpers/BoxHelper.js';
-export { Box3Helper } from './helpers/Box3Helper.js';
-export { PlaneHelper } from './helpers/PlaneHelper.js';
-export { ArrowHelper } from './helpers/ArrowHelper.js';
-export { AxesHelper } from './helpers/AxesHelper.js';
-export * from './extras/curves/Curves.js';
-export { Shape } from './extras/core/Shape.js';
-export { Path } from './extras/core/Path.js';
-export { ShapePath } from './extras/core/ShapePath.js';
-export { CurvePath } from './extras/core/CurvePath.js';
-export { Curve } from './extras/core/Curve.js';
-export { Controls } from './extras/Controls.js';
-export { DataUtils } from './extras/DataUtils.js';
-export { ImageUtils } from './extras/ImageUtils.js';
-export { ShapeUtils } from './extras/ShapeUtils.js';
-//export { PMREMGenerator } from './extras/PMREMGenerator.js';
-//export { WebGLUtils } from './renderers/webgl/WebGLUtils.js';
-export { createCanvasElement } from './utils.js';
-export * from './constants.js';
-export * from './Three.Legacy.js';
+export * from './Three.core.js';
 
 export * from './materials/nodes/NodeMaterials.js';
 export { default as WebGPURenderer } from './renderers/webgpu/WebGPURenderer.Nodes.js';
 export { default as Lighting } from './renderers/common/Lighting.js';
+export { default as BundleGroup } from './renderers/common/BundleGroup.js';
 export { default as QuadMesh } from './renderers/common/QuadMesh.js';
 export { default as PMREMGenerator } from './renderers/common/extras/PMREMGenerator.js';
 export { default as PostProcessing } from './renderers/common/PostProcessing.js';
@@ -180,25 +19,3 @@ export { default as NodeObjectLoader } from './loaders/nodes/NodeObjectLoader.js
 export { default as NodeMaterialLoader } from './loaders/nodes/NodeMaterialLoader.js';
 export * from './nodes/Nodes.js';
 export * from './nodes/TSL.js';
-
-if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
-
-	__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {
-		revision: REVISION,
-	} } ) );
-
-}
-
-if ( typeof window !== 'undefined' ) {
-
-	if ( window.__THREE__ ) {
-
-		console.warn( 'WARNING: Multiple instances of Three.js being imported.' );
-
-	} else {
-
-		window.__THREE__ = REVISION;
-
-	}
-
-}

+ 1 - 185
src/Three.WebGPU.js

@@ -1,166 +1,4 @@
-import { REVISION } from './constants.js';
-
-export { WebGLArrayRenderTarget } from './renderers/WebGLArrayRenderTarget.js';
-export { WebGL3DRenderTarget } from './renderers/WebGL3DRenderTarget.js';
-export { WebGLCubeRenderTarget } from './renderers/WebGLCubeRenderTarget.js';
-export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js';
-//export { WebGLRenderer } from './renderers/WebGLRenderer.js';
-//export { ShaderLib } from './renderers/shaders/ShaderLib.js';
-//export { UniformsLib } from './renderers/shaders/UniformsLib.js';
-//export { UniformsUtils } from './renderers/shaders/UniformsUtils.js';
-//export { ShaderChunk } from './renderers/shaders/ShaderChunk.js';
-export { FogExp2 } from './scenes/FogExp2.js';
-export { Fog } from './scenes/Fog.js';
-export { Scene } from './scenes/Scene.js';
-export { Sprite } from './objects/Sprite.js';
-export { LOD } from './objects/LOD.js';
-export { SkinnedMesh } from './objects/SkinnedMesh.js';
-export { Skeleton } from './objects/Skeleton.js';
-export { Bone } from './objects/Bone.js';
-export { Mesh } from './objects/Mesh.js';
-export { InstancedMesh } from './objects/InstancedMesh.js';
-export { BatchedMesh } from './objects/BatchedMesh.js';
-export { LineSegments } from './objects/LineSegments.js';
-export { LineLoop } from './objects/LineLoop.js';
-export { Line } from './objects/Line.js';
-export { Points } from './objects/Points.js';
-export { Group } from './objects/Group.js';
-export { VideoTexture } from './textures/VideoTexture.js';
-export { FramebufferTexture } from './textures/FramebufferTexture.js';
-export { Source } from './textures/Source.js';
-export { DataTexture } from './textures/DataTexture.js';
-export { DataArrayTexture } from './textures/DataArrayTexture.js';
-export { Data3DTexture } from './textures/Data3DTexture.js';
-export { CompressedTexture } from './textures/CompressedTexture.js';
-export { CompressedArrayTexture } from './textures/CompressedArrayTexture.js';
-export { CompressedCubeTexture } from './textures/CompressedCubeTexture.js';
-export { CubeTexture } from './textures/CubeTexture.js';
-export { CanvasTexture } from './textures/CanvasTexture.js';
-export { DepthTexture } from './textures/DepthTexture.js';
-export { Texture } from './textures/Texture.js';
-export * from './geometries/Geometries.js';
-export * from './materials/Materials.js';
-export { Material } from './materials/Material.js';
-export { AnimationLoader } from './loaders/AnimationLoader.js';
-export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js';
-export { CubeTextureLoader } from './loaders/CubeTextureLoader.js';
-export { DataTextureLoader } from './loaders/DataTextureLoader.js';
-export { TextureLoader } from './loaders/TextureLoader.js';
-export { ObjectLoader } from './loaders/ObjectLoader.js';
-export { MaterialLoader } from './loaders/MaterialLoader.js';
-export { BufferGeometryLoader } from './loaders/BufferGeometryLoader.js';
-export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js';
-export { ImageLoader } from './loaders/ImageLoader.js';
-export { ImageBitmapLoader } from './loaders/ImageBitmapLoader.js';
-export { FileLoader } from './loaders/FileLoader.js';
-export { Loader } from './loaders/Loader.js';
-export { LoaderUtils } from './loaders/LoaderUtils.js';
-export { Cache } from './loaders/Cache.js';
-export { AudioLoader } from './loaders/AudioLoader.js';
-export { SpotLight } from './lights/SpotLight.js';
-export { PointLight } from './lights/PointLight.js';
-export { RectAreaLight } from './lights/RectAreaLight.js';
-export { HemisphereLight } from './lights/HemisphereLight.js';
-export { DirectionalLight } from './lights/DirectionalLight.js';
-export { AmbientLight } from './lights/AmbientLight.js';
-export { Light } from './lights/Light.js';
-export { LightProbe } from './lights/LightProbe.js';
-export { StereoCamera } from './cameras/StereoCamera.js';
-export { PerspectiveCamera } from './cameras/PerspectiveCamera.js';
-export { OrthographicCamera } from './cameras/OrthographicCamera.js';
-export { CubeCamera } from './cameras/CubeCamera.js';
-export { ArrayCamera } from './cameras/ArrayCamera.js';
-export { Camera } from './cameras/Camera.js';
-export { AudioListener } from './audio/AudioListener.js';
-export { PositionalAudio } from './audio/PositionalAudio.js';
-export { AudioContext } from './audio/AudioContext.js';
-export { AudioAnalyser } from './audio/AudioAnalyser.js';
-export { Audio } from './audio/Audio.js';
-export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js';
-export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js';
-export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js';
-export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js';
-export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js';
-export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js';
-export { PropertyMixer } from './animation/PropertyMixer.js';
-export { PropertyBinding } from './animation/PropertyBinding.js';
-export { KeyframeTrack } from './animation/KeyframeTrack.js';
-export { AnimationUtils } from './animation/AnimationUtils.js';
-export { AnimationObjectGroup } from './animation/AnimationObjectGroup.js';
-export { AnimationMixer } from './animation/AnimationMixer.js';
-export { AnimationClip } from './animation/AnimationClip.js';
-export { AnimationAction } from './animation/AnimationAction.js';
-export { RenderTarget } from './core/RenderTarget.js';
-export { Uniform } from './core/Uniform.js';
-export { UniformsGroup } from './core/UniformsGroup.js';
-export { InstancedBufferGeometry } from './core/InstancedBufferGeometry.js';
-export { BufferGeometry } from './core/BufferGeometry.js';
-export { InterleavedBufferAttribute } from './core/InterleavedBufferAttribute.js';
-export { InstancedInterleavedBuffer } from './core/InstancedInterleavedBuffer.js';
-export { InterleavedBuffer } from './core/InterleavedBuffer.js';
-export { InstancedBufferAttribute } from './core/InstancedBufferAttribute.js';
-export { GLBufferAttribute } from './core/GLBufferAttribute.js';
-export * from './core/BufferAttribute.js';
-export { Object3D } from './core/Object3D.js';
-export { Raycaster } from './core/Raycaster.js';
-export { Layers } from './core/Layers.js';
-export { EventDispatcher } from './core/EventDispatcher.js';
-export { Clock } from './core/Clock.js';
-export { QuaternionLinearInterpolant } from './math/interpolants/QuaternionLinearInterpolant.js';
-export { LinearInterpolant } from './math/interpolants/LinearInterpolant.js';
-export { DiscreteInterpolant } from './math/interpolants/DiscreteInterpolant.js';
-export { CubicInterpolant } from './math/interpolants/CubicInterpolant.js';
-export { Interpolant } from './math/Interpolant.js';
-export { Triangle } from './math/Triangle.js';
-export { MathUtils } from './math/MathUtils.js';
-export { Spherical } from './math/Spherical.js';
-export { Cylindrical } from './math/Cylindrical.js';
-export { Plane } from './math/Plane.js';
-export { Frustum } from './math/Frustum.js';
-export { Sphere } from './math/Sphere.js';
-export { Ray } from './math/Ray.js';
-export { Matrix4 } from './math/Matrix4.js';
-export { Matrix3 } from './math/Matrix3.js';
-export { Matrix2 } from './math/Matrix2.js';
-export { Box3 } from './math/Box3.js';
-export { Box2 } from './math/Box2.js';
-export { Line3 } from './math/Line3.js';
-export { Euler } from './math/Euler.js';
-export { Vector4 } from './math/Vector4.js';
-export { Vector3 } from './math/Vector3.js';
-export { Vector2 } from './math/Vector2.js';
-export { Quaternion } from './math/Quaternion.js';
-export { Color } from './math/Color.js';
-export { ColorManagement } from './math/ColorManagement.js';
-export { SphericalHarmonics3 } from './math/SphericalHarmonics3.js';
-export { SpotLightHelper } from './helpers/SpotLightHelper.js';
-export { SkeletonHelper } from './helpers/SkeletonHelper.js';
-export { PointLightHelper } from './helpers/PointLightHelper.js';
-export { HemisphereLightHelper } from './helpers/HemisphereLightHelper.js';
-export { GridHelper } from './helpers/GridHelper.js';
-export { PolarGridHelper } from './helpers/PolarGridHelper.js';
-export { DirectionalLightHelper } from './helpers/DirectionalLightHelper.js';
-export { CameraHelper } from './helpers/CameraHelper.js';
-export { BoxHelper } from './helpers/BoxHelper.js';
-export { Box3Helper } from './helpers/Box3Helper.js';
-export { PlaneHelper } from './helpers/PlaneHelper.js';
-export { ArrowHelper } from './helpers/ArrowHelper.js';
-export { AxesHelper } from './helpers/AxesHelper.js';
-export * from './extras/curves/Curves.js';
-export { Shape } from './extras/core/Shape.js';
-export { Path } from './extras/core/Path.js';
-export { ShapePath } from './extras/core/ShapePath.js';
-export { CurvePath } from './extras/core/CurvePath.js';
-export { Curve } from './extras/core/Curve.js';
-export { Controls } from './extras/Controls.js';
-export { DataUtils } from './extras/DataUtils.js';
-export { ImageUtils } from './extras/ImageUtils.js';
-export { ShapeUtils } from './extras/ShapeUtils.js';
-//export { PMREMGenerator } from './extras/PMREMGenerator.js';
-//export { WebGLUtils } from './renderers/webgl/WebGLUtils.js';
-export { createCanvasElement } from './utils.js';
-export * from './constants.js';
-export * from './Three.Legacy.js';
+export * from './Three.core.js';
 
 export * from './materials/nodes/NodeMaterials.js';
 export { default as WebGPURenderer } from './renderers/webgpu/WebGPURenderer.js';
@@ -182,25 +20,3 @@ export { default as NodeObjectLoader } from './loaders/nodes/NodeObjectLoader.js
 export { default as NodeMaterialLoader } from './loaders/nodes/NodeMaterialLoader.js';
 export * from './nodes/Nodes.js';
 export * from './nodes/TSL.js';
-
-if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
-
-	__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {
-		revision: REVISION,
-	} } ) );
-
-}
-
-if ( typeof window !== 'undefined' ) {
-
-	if ( window.__THREE__ ) {
-
-		console.warn( 'WARNING: Multiple instances of Three.js being imported.' );
-
-	} else {
-
-		window.__THREE__ = REVISION;
-
-	}
-
-}

+ 178 - 0
src/Three.core.js

@@ -0,0 +1,178 @@
+import { REVISION } from './constants.js';
+
+export { WebGLArrayRenderTarget } from './renderers/WebGLArrayRenderTarget.js';
+export { WebGL3DRenderTarget } from './renderers/WebGL3DRenderTarget.js';
+export { WebGLCubeRenderTarget } from './renderers/WebGLCubeRenderTarget.js';
+export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js';
+export { FogExp2 } from './scenes/FogExp2.js';
+export { Fog } from './scenes/Fog.js';
+export { Scene } from './scenes/Scene.js';
+export { Sprite } from './objects/Sprite.js';
+export { LOD } from './objects/LOD.js';
+export { SkinnedMesh } from './objects/SkinnedMesh.js';
+export { Skeleton } from './objects/Skeleton.js';
+export { Bone } from './objects/Bone.js';
+export { Mesh } from './objects/Mesh.js';
+export { InstancedMesh } from './objects/InstancedMesh.js';
+export { BatchedMesh } from './objects/BatchedMesh.js';
+export { LineSegments } from './objects/LineSegments.js';
+export { LineLoop } from './objects/LineLoop.js';
+export { Line } from './objects/Line.js';
+export { Points } from './objects/Points.js';
+export { Group } from './objects/Group.js';
+export { VideoTexture } from './textures/VideoTexture.js';
+export { FramebufferTexture } from './textures/FramebufferTexture.js';
+export { Source } from './textures/Source.js';
+export { DataTexture } from './textures/DataTexture.js';
+export { DataArrayTexture } from './textures/DataArrayTexture.js';
+export { Data3DTexture } from './textures/Data3DTexture.js';
+export { CompressedTexture } from './textures/CompressedTexture.js';
+export { CompressedArrayTexture } from './textures/CompressedArrayTexture.js';
+export { CompressedCubeTexture } from './textures/CompressedCubeTexture.js';
+export { CubeTexture } from './textures/CubeTexture.js';
+export { CanvasTexture } from './textures/CanvasTexture.js';
+export { DepthTexture } from './textures/DepthTexture.js';
+export { Texture } from './textures/Texture.js';
+export * from './geometries/Geometries.js';
+export * from './materials/Materials.js';
+export { AnimationLoader } from './loaders/AnimationLoader.js';
+export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js';
+export { CubeTextureLoader } from './loaders/CubeTextureLoader.js';
+export { DataTextureLoader } from './loaders/DataTextureLoader.js';
+export { TextureLoader } from './loaders/TextureLoader.js';
+export { ObjectLoader } from './loaders/ObjectLoader.js';
+export { MaterialLoader } from './loaders/MaterialLoader.js';
+export { BufferGeometryLoader } from './loaders/BufferGeometryLoader.js';
+export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js';
+export { ImageLoader } from './loaders/ImageLoader.js';
+export { ImageBitmapLoader } from './loaders/ImageBitmapLoader.js';
+export { FileLoader } from './loaders/FileLoader.js';
+export { Loader } from './loaders/Loader.js';
+export { LoaderUtils } from './loaders/LoaderUtils.js';
+export { Cache } from './loaders/Cache.js';
+export { AudioLoader } from './loaders/AudioLoader.js';
+export { SpotLight } from './lights/SpotLight.js';
+export { PointLight } from './lights/PointLight.js';
+export { RectAreaLight } from './lights/RectAreaLight.js';
+export { HemisphereLight } from './lights/HemisphereLight.js';
+export { DirectionalLight } from './lights/DirectionalLight.js';
+export { AmbientLight } from './lights/AmbientLight.js';
+export { Light } from './lights/Light.js';
+export { LightProbe } from './lights/LightProbe.js';
+export { StereoCamera } from './cameras/StereoCamera.js';
+export { PerspectiveCamera } from './cameras/PerspectiveCamera.js';
+export { OrthographicCamera } from './cameras/OrthographicCamera.js';
+export { CubeCamera } from './cameras/CubeCamera.js';
+export { ArrayCamera } from './cameras/ArrayCamera.js';
+export { Camera } from './cameras/Camera.js';
+export { AudioListener } from './audio/AudioListener.js';
+export { PositionalAudio } from './audio/PositionalAudio.js';
+export { AudioContext } from './audio/AudioContext.js';
+export { AudioAnalyser } from './audio/AudioAnalyser.js';
+export { Audio } from './audio/Audio.js';
+export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js';
+export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js';
+export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js';
+export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js';
+export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js';
+export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js';
+export { PropertyMixer } from './animation/PropertyMixer.js';
+export { PropertyBinding } from './animation/PropertyBinding.js';
+export { KeyframeTrack } from './animation/KeyframeTrack.js';
+export { AnimationUtils } from './animation/AnimationUtils.js';
+export { AnimationObjectGroup } from './animation/AnimationObjectGroup.js';
+export { AnimationMixer } from './animation/AnimationMixer.js';
+export { AnimationClip } from './animation/AnimationClip.js';
+export { AnimationAction } from './animation/AnimationAction.js';
+export { RenderTarget } from './core/RenderTarget.js';
+export { Uniform } from './core/Uniform.js';
+export { UniformsGroup } from './core/UniformsGroup.js';
+export { InstancedBufferGeometry } from './core/InstancedBufferGeometry.js';
+export { BufferGeometry } from './core/BufferGeometry.js';
+export { InterleavedBufferAttribute } from './core/InterleavedBufferAttribute.js';
+export { InstancedInterleavedBuffer } from './core/InstancedInterleavedBuffer.js';
+export { InterleavedBuffer } from './core/InterleavedBuffer.js';
+export { InstancedBufferAttribute } from './core/InstancedBufferAttribute.js';
+export { GLBufferAttribute } from './core/GLBufferAttribute.js';
+export * from './core/BufferAttribute.js';
+export { Object3D } from './core/Object3D.js';
+export { Raycaster } from './core/Raycaster.js';
+export { Layers } from './core/Layers.js';
+export { EventDispatcher } from './core/EventDispatcher.js';
+export { Clock } from './core/Clock.js';
+export { QuaternionLinearInterpolant } from './math/interpolants/QuaternionLinearInterpolant.js';
+export { LinearInterpolant } from './math/interpolants/LinearInterpolant.js';
+export { DiscreteInterpolant } from './math/interpolants/DiscreteInterpolant.js';
+export { CubicInterpolant } from './math/interpolants/CubicInterpolant.js';
+export { Interpolant } from './math/Interpolant.js';
+export { Triangle } from './math/Triangle.js';
+export { MathUtils } from './math/MathUtils.js';
+export { Spherical } from './math/Spherical.js';
+export { Cylindrical } from './math/Cylindrical.js';
+export { Plane } from './math/Plane.js';
+export { Frustum } from './math/Frustum.js';
+export { Sphere } from './math/Sphere.js';
+export { Ray } from './math/Ray.js';
+export { Matrix4 } from './math/Matrix4.js';
+export { Matrix3 } from './math/Matrix3.js';
+export { Matrix2 } from './math/Matrix2.js';
+export { Box3 } from './math/Box3.js';
+export { Box2 } from './math/Box2.js';
+export { Line3 } from './math/Line3.js';
+export { Euler } from './math/Euler.js';
+export { Vector4 } from './math/Vector4.js';
+export { Vector3 } from './math/Vector3.js';
+export { Vector2 } from './math/Vector2.js';
+export { Quaternion } from './math/Quaternion.js';
+export { Color } from './math/Color.js';
+export { ColorManagement } from './math/ColorManagement.js';
+export { SphericalHarmonics3 } from './math/SphericalHarmonics3.js';
+export { SpotLightHelper } from './helpers/SpotLightHelper.js';
+export { SkeletonHelper } from './helpers/SkeletonHelper.js';
+export { PointLightHelper } from './helpers/PointLightHelper.js';
+export { HemisphereLightHelper } from './helpers/HemisphereLightHelper.js';
+export { GridHelper } from './helpers/GridHelper.js';
+export { PolarGridHelper } from './helpers/PolarGridHelper.js';
+export { DirectionalLightHelper } from './helpers/DirectionalLightHelper.js';
+export { CameraHelper } from './helpers/CameraHelper.js';
+export { BoxHelper } from './helpers/BoxHelper.js';
+export { Box3Helper } from './helpers/Box3Helper.js';
+export { PlaneHelper } from './helpers/PlaneHelper.js';
+export { ArrowHelper } from './helpers/ArrowHelper.js';
+export { AxesHelper } from './helpers/AxesHelper.js';
+export * from './extras/curves/Curves.js';
+export { Shape } from './extras/core/Shape.js';
+export { Path } from './extras/core/Path.js';
+export { ShapePath } from './extras/core/ShapePath.js';
+export { CurvePath } from './extras/core/CurvePath.js';
+export { Curve } from './extras/core/Curve.js';
+export { Controls } from './extras/Controls.js';
+export { DataUtils } from './extras/DataUtils.js';
+export { ImageUtils } from './extras/ImageUtils.js';
+export { ShapeUtils } from './extras/ShapeUtils.js';
+export { TextureUtils } from './extras/TextureUtils.js';
+export { createCanvasElement } from './utils.js';
+export * from './constants.js';
+export * from './Three.Legacy.js';
+
+if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
+
+	__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {
+		revision: REVISION,
+	} } ) );
+
+}
+
+if ( typeof window !== 'undefined' ) {
+
+	if ( window.__THREE__ ) {
+
+		console.warn( 'WARNING: Multiple instances of Three.js being imported.' );
+
+	} else {
+
+		window.__THREE__ = REVISION;
+
+	}
+
+}

+ 1 - 177
src/Three.js

@@ -1,185 +1,9 @@
-import { REVISION } from './constants.js';
+export * from './Three.core.js';
 
-export { WebGLArrayRenderTarget } from './renderers/WebGLArrayRenderTarget.js';
-export { WebGL3DRenderTarget } from './renderers/WebGL3DRenderTarget.js';
-export { WebGLCubeRenderTarget } from './renderers/WebGLCubeRenderTarget.js';
-export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js';
 export { WebGLRenderer } from './renderers/WebGLRenderer.js';
 export { ShaderLib } from './renderers/shaders/ShaderLib.js';
 export { UniformsLib } from './renderers/shaders/UniformsLib.js';
 export { UniformsUtils } from './renderers/shaders/UniformsUtils.js';
 export { ShaderChunk } from './renderers/shaders/ShaderChunk.js';
-export { FogExp2 } from './scenes/FogExp2.js';
-export { Fog } from './scenes/Fog.js';
-export { Scene } from './scenes/Scene.js';
-export { Sprite } from './objects/Sprite.js';
-export { LOD } from './objects/LOD.js';
-export { SkinnedMesh } from './objects/SkinnedMesh.js';
-export { Skeleton } from './objects/Skeleton.js';
-export { Bone } from './objects/Bone.js';
-export { Mesh } from './objects/Mesh.js';
-export { InstancedMesh } from './objects/InstancedMesh.js';
-export { BatchedMesh } from './objects/BatchedMesh.js';
-export { LineSegments } from './objects/LineSegments.js';
-export { LineLoop } from './objects/LineLoop.js';
-export { Line } from './objects/Line.js';
-export { Points } from './objects/Points.js';
-export { Group } from './objects/Group.js';
-export { VideoTexture } from './textures/VideoTexture.js';
-export { FramebufferTexture } from './textures/FramebufferTexture.js';
-export { Source } from './textures/Source.js';
-export { DataTexture } from './textures/DataTexture.js';
-export { DataArrayTexture } from './textures/DataArrayTexture.js';
-export { Data3DTexture } from './textures/Data3DTexture.js';
-export { CompressedTexture } from './textures/CompressedTexture.js';
-export { CompressedArrayTexture } from './textures/CompressedArrayTexture.js';
-export { CompressedCubeTexture } from './textures/CompressedCubeTexture.js';
-export { CubeTexture } from './textures/CubeTexture.js';
-export { CanvasTexture } from './textures/CanvasTexture.js';
-export { DepthTexture } from './textures/DepthTexture.js';
-export { Texture } from './textures/Texture.js';
-export * from './geometries/Geometries.js';
-export * from './materials/Materials.js';
-export { AnimationLoader } from './loaders/AnimationLoader.js';
-export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js';
-export { CubeTextureLoader } from './loaders/CubeTextureLoader.js';
-export { DataTextureLoader } from './loaders/DataTextureLoader.js';
-export { TextureLoader } from './loaders/TextureLoader.js';
-export { ObjectLoader } from './loaders/ObjectLoader.js';
-export { MaterialLoader } from './loaders/MaterialLoader.js';
-export { BufferGeometryLoader } from './loaders/BufferGeometryLoader.js';
-export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js';
-export { ImageLoader } from './loaders/ImageLoader.js';
-export { ImageBitmapLoader } from './loaders/ImageBitmapLoader.js';
-export { FileLoader } from './loaders/FileLoader.js';
-export { Loader } from './loaders/Loader.js';
-export { LoaderUtils } from './loaders/LoaderUtils.js';
-export { Cache } from './loaders/Cache.js';
-export { AudioLoader } from './loaders/AudioLoader.js';
-export { SpotLight } from './lights/SpotLight.js';
-export { PointLight } from './lights/PointLight.js';
-export { RectAreaLight } from './lights/RectAreaLight.js';
-export { HemisphereLight } from './lights/HemisphereLight.js';
-export { DirectionalLight } from './lights/DirectionalLight.js';
-export { AmbientLight } from './lights/AmbientLight.js';
-export { Light } from './lights/Light.js';
-export { LightProbe } from './lights/LightProbe.js';
-export { StereoCamera } from './cameras/StereoCamera.js';
-export { PerspectiveCamera } from './cameras/PerspectiveCamera.js';
-export { OrthographicCamera } from './cameras/OrthographicCamera.js';
-export { CubeCamera } from './cameras/CubeCamera.js';
-export { ArrayCamera } from './cameras/ArrayCamera.js';
-export { Camera } from './cameras/Camera.js';
-export { AudioListener } from './audio/AudioListener.js';
-export { PositionalAudio } from './audio/PositionalAudio.js';
-export { AudioContext } from './audio/AudioContext.js';
-export { AudioAnalyser } from './audio/AudioAnalyser.js';
-export { Audio } from './audio/Audio.js';
-export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js';
-export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js';
-export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js';
-export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js';
-export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js';
-export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js';
-export { PropertyMixer } from './animation/PropertyMixer.js';
-export { PropertyBinding } from './animation/PropertyBinding.js';
-export { KeyframeTrack } from './animation/KeyframeTrack.js';
-export { AnimationUtils } from './animation/AnimationUtils.js';
-export { AnimationObjectGroup } from './animation/AnimationObjectGroup.js';
-export { AnimationMixer } from './animation/AnimationMixer.js';
-export { AnimationClip } from './animation/AnimationClip.js';
-export { AnimationAction } from './animation/AnimationAction.js';
-export { RenderTarget } from './core/RenderTarget.js';
-export { Uniform } from './core/Uniform.js';
-export { UniformsGroup } from './core/UniformsGroup.js';
-export { InstancedBufferGeometry } from './core/InstancedBufferGeometry.js';
-export { BufferGeometry } from './core/BufferGeometry.js';
-export { InterleavedBufferAttribute } from './core/InterleavedBufferAttribute.js';
-export { InstancedInterleavedBuffer } from './core/InstancedInterleavedBuffer.js';
-export { InterleavedBuffer } from './core/InterleavedBuffer.js';
-export { InstancedBufferAttribute } from './core/InstancedBufferAttribute.js';
-export { GLBufferAttribute } from './core/GLBufferAttribute.js';
-export * from './core/BufferAttribute.js';
-export { Object3D } from './core/Object3D.js';
-export { Raycaster } from './core/Raycaster.js';
-export { Layers } from './core/Layers.js';
-export { EventDispatcher } from './core/EventDispatcher.js';
-export { Clock } from './core/Clock.js';
-export { QuaternionLinearInterpolant } from './math/interpolants/QuaternionLinearInterpolant.js';
-export { LinearInterpolant } from './math/interpolants/LinearInterpolant.js';
-export { DiscreteInterpolant } from './math/interpolants/DiscreteInterpolant.js';
-export { CubicInterpolant } from './math/interpolants/CubicInterpolant.js';
-export { Interpolant } from './math/Interpolant.js';
-export { Triangle } from './math/Triangle.js';
-export { MathUtils } from './math/MathUtils.js';
-export { Spherical } from './math/Spherical.js';
-export { Cylindrical } from './math/Cylindrical.js';
-export { Plane } from './math/Plane.js';
-export { Frustum } from './math/Frustum.js';
-export { Sphere } from './math/Sphere.js';
-export { Ray } from './math/Ray.js';
-export { Matrix4 } from './math/Matrix4.js';
-export { Matrix3 } from './math/Matrix3.js';
-export { Matrix2 } from './math/Matrix2.js';
-export { Box3 } from './math/Box3.js';
-export { Box2 } from './math/Box2.js';
-export { Line3 } from './math/Line3.js';
-export { Euler } from './math/Euler.js';
-export { Vector4 } from './math/Vector4.js';
-export { Vector3 } from './math/Vector3.js';
-export { Vector2 } from './math/Vector2.js';
-export { Quaternion } from './math/Quaternion.js';
-export { Color } from './math/Color.js';
-export { ColorManagement } from './math/ColorManagement.js';
-export { SphericalHarmonics3 } from './math/SphericalHarmonics3.js';
-export { SpotLightHelper } from './helpers/SpotLightHelper.js';
-export { SkeletonHelper } from './helpers/SkeletonHelper.js';
-export { PointLightHelper } from './helpers/PointLightHelper.js';
-export { HemisphereLightHelper } from './helpers/HemisphereLightHelper.js';
-export { GridHelper } from './helpers/GridHelper.js';
-export { PolarGridHelper } from './helpers/PolarGridHelper.js';
-export { DirectionalLightHelper } from './helpers/DirectionalLightHelper.js';
-export { CameraHelper } from './helpers/CameraHelper.js';
-export { BoxHelper } from './helpers/BoxHelper.js';
-export { Box3Helper } from './helpers/Box3Helper.js';
-export { PlaneHelper } from './helpers/PlaneHelper.js';
-export { ArrowHelper } from './helpers/ArrowHelper.js';
-export { AxesHelper } from './helpers/AxesHelper.js';
-export * from './extras/curves/Curves.js';
-export { Shape } from './extras/core/Shape.js';
-export { Path } from './extras/core/Path.js';
-export { ShapePath } from './extras/core/ShapePath.js';
-export { CurvePath } from './extras/core/CurvePath.js';
-export { Curve } from './extras/core/Curve.js';
-export { Controls } from './extras/Controls.js';
-export { DataUtils } from './extras/DataUtils.js';
-export { ImageUtils } from './extras/ImageUtils.js';
-export { ShapeUtils } from './extras/ShapeUtils.js';
-export { TextureUtils } from './extras/TextureUtils.js';
 export { PMREMGenerator } from './extras/PMREMGenerator.js';
 export { WebGLUtils } from './renderers/webgl/WebGLUtils.js';
-export { createCanvasElement } from './utils.js';
-export * from './constants.js';
-export * from './Three.Legacy.js';
-
-if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
-
-	__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {
-		revision: REVISION,
-	} } ) );
-
-}
-
-if ( typeof window !== 'undefined' ) {
-
-	if ( window.__THREE__ ) {
-
-		console.warn( 'WARNING: Multiple instances of Three.js being imported.' );
-
-	} else {
-
-		window.__THREE__ = REVISION;
-
-	}
-
-}

+ 1 - 0
test/e2e/puppeteer.js

@@ -295,6 +295,7 @@ async function main() {
 	const injection = await fs.readFile( 'test/e2e/deterministic-injection.js', 'utf8' );
 
 	const builds = {
+		'three.core.js': buildInjection( await fs.readFile( 'build/three.core.js', 'utf8' ) ),
 		'three.module.js': buildInjection( await fs.readFile( 'build/three.module.js', 'utf8' ) ),
 		'three.webgpu.js': buildInjection( await fs.readFile( 'build/three.webgpu.js', 'utf8' ) )
 	};

+ 40 - 34
utils/build/rollup.config.js

@@ -60,81 +60,87 @@ function header() {
 
 }
 
+/**
+ * @type {Array<import('rollup').RollupOptions>}
+ */
 const builds = [
 	{
-		input: 'src/Three.js',
+		input: {
+			'three.core.js': 'src/Three.core.js',
+			'three.webgpu.nodes.js': 'src/Three.WebGPU.Nodes.js',
+		},
 		plugins: [
 			glsl(),
 			header()
 		],
+		preserveEntrySignatures: 'allow-extension',
 		output: [
 			{
 				format: 'esm',
-				file: 'build/three.module.js'
+				dir: 'build',
+				minifyInternalExports: false,
+				entryFileNames: '[name]',
 			}
 		]
 	},
 	{
-		input: 'src/Three.WebGPU.js',
-		plugins: [
-			header()
-		],
-		output: [
-			{
-				format: 'esm',
-				file: 'build/three.webgpu.js'
-			}
-		]
-	},
-	{
-		input: 'src/Three.WebGPU.Nodes.js',
+		input: {
+			'three.core.js': 'src/Three.core.js',
+			'three.module.js': 'src/Three.js',
+			'three.webgpu.js': 'src/Three.WebGPU.js',
+		},
 		plugins: [
+			glsl(),
 			header()
 		],
+		preserveEntrySignatures: 'allow-extension',
 		output: [
 			{
 				format: 'esm',
-				file: 'build/three.webgpu.nodes.js'
+				dir: 'build',
+				minifyInternalExports: false,
+				entryFileNames: '[name]',
 			}
 		]
 	},
 	{
-		input: 'src/Three.js',
+		input: {
+			'three.core.min.js': 'src/Three.core.js',
+			'three.webgpu.nodes.min.js': 'src/Three.WebGPU.Nodes.js',
+		},
 		plugins: [
 			glsl(),
 			header(),
 			terser()
 		],
+		preserveEntrySignatures: 'allow-extension',
 		output: [
 			{
 				format: 'esm',
-				file: 'build/three.module.min.js'
+				dir: 'build',
+				minifyInternalExports: false,
+				entryFileNames: '[name]',
 			}
 		]
 	},
 	{
-		input: 'src/Three.WebGPU.js',
-		plugins: [
-			header(),
-			terser()
-		],
-		output: [
-			{
-				format: 'esm',
-				file: 'build/three.webgpu.min.js'
-			}
-		]
-	},
-	{
-		input: 'src/Three.WebGPU.Nodes.js',
+		input: {
+			'three.core.min.js': 'src/Three.core.js',
+			'three.module.min.js': 'src/Three.js',
+			'three.webgpu.min.js': 'src/Three.WebGPU.js',
+		},
 		plugins: [
+			glsl(),
 			header(),
 			terser()
 		],
+		preserveEntrySignatures: 'allow-extension',
 		output: [
 			{
 				format: 'esm',
-				file: 'build/three.webgpu.nodes.min.js'
+				dir: 'build',
+				minifyInternalExports: false,
+				entryFileNames: '[name]',
 			}
 		]
 	},
@@ -155,4 +161,4 @@ const builds = [
 	}
 ];
 
-export default ( args ) => args.configOnlyModule ? builds.slice( 0, 3 ) : builds;
+export default ( args ) => args.configOnlyModule ? builds.slice( 0, 4 ) : builds;

粤ICP备19079148号