Repository: Itee/three-full
Branch: dev
Commit: 7061c7cd93f1
Files: 1252
Total size: 33.4 MB
Directory structure:
gitextract_80_q7e8j/
├── .gitignore
├── .npmignore
├── LICENSE.md
├── README.md
├── builds/
│ ├── Three.amd.js
│ ├── Three.cjs.js
│ ├── Three.es.js
│ ├── Three.iife.js
│ └── Three.umd.js
├── configs/
│ ├── es6.conf.js
│ ├── eslint.conf.js
│ ├── karma.units.conf.js
│ ├── rollup.conf.js
│ ├── rollup.tests.conf.js
│ └── units.conf.js
├── es6-convertor.js
├── gulpfile.js
├── package.json
├── sources/
│ ├── ImageUtils.d.ts
│ ├── PMREMGenerator.d.ts
│ ├── ShapeUtils.d.ts
│ ├── Three.d.ts
│ ├── Three.js
│ ├── WebGL.d.ts
│ ├── animation/
│ │ ├── AnimationAction.d.ts
│ │ ├── AnimationAction.js
│ │ ├── AnimationClip.d.ts
│ │ ├── AnimationClip.js
│ │ ├── AnimationClipCreator.d.ts
│ │ ├── AnimationClipCreator.js
│ │ ├── AnimationMixer.d.ts
│ │ ├── AnimationMixer.js
│ │ ├── AnimationObjectGroup.d.ts
│ │ ├── AnimationObjectGroup.js
│ │ ├── AnimationUtils.d.ts
│ │ ├── AnimationUtils.js
│ │ ├── CCDIKSolver.d.ts
│ │ ├── CCDIKSolver.js
│ │ ├── KeyframeTrack.d.ts
│ │ ├── KeyframeTrack.js
│ │ ├── MMDAnimationHelper.d.ts
│ │ ├── MMDAnimationHelper.js
│ │ ├── MMDPhysics.d.ts
│ │ ├── MMDPhysics.js
│ │ ├── PropertyBinding.d.ts
│ │ ├── PropertyBinding.js
│ │ ├── PropertyMixer.d.ts
│ │ ├── PropertyMixer.js
│ │ ├── TimelinerController.d.ts
│ │ ├── TimelinerController.js
│ │ └── tracks/
│ │ ├── BooleanKeyframeTrack.d.ts
│ │ ├── BooleanKeyframeTrack.js
│ │ ├── ColorKeyframeTrack.d.ts
│ │ ├── ColorKeyframeTrack.js
│ │ ├── NumberKeyframeTrack.d.ts
│ │ ├── NumberKeyframeTrack.js
│ │ ├── QuaternionKeyframeTrack.d.ts
│ │ ├── QuaternionKeyframeTrack.js
│ │ ├── StringKeyframeTrack.d.ts
│ │ ├── StringKeyframeTrack.js
│ │ ├── VectorKeyframeTrack.d.ts
│ │ └── VectorKeyframeTrack.js
│ ├── audio/
│ │ ├── Audio.d.ts
│ │ ├── Audio.js
│ │ ├── AudioAnalyser.d.ts
│ │ ├── AudioAnalyser.js
│ │ ├── AudioContext.d.ts
│ │ ├── AudioContext.js
│ │ ├── AudioListener.d.ts
│ │ ├── AudioListener.js
│ │ ├── PositionalAudio.d.ts
│ │ ├── PositionalAudio.js
│ │ └── VolumeSlice.js
│ ├── cameras/
│ │ ├── ArrayCamera.d.ts
│ │ ├── ArrayCamera.js
│ │ ├── Camera.d.ts
│ │ ├── Camera.js
│ │ ├── CinematicCamera.d.ts
│ │ ├── CinematicCamera.js
│ │ ├── CubeCamera.d.ts
│ │ ├── CubeCamera.js
│ │ ├── OrthographicCamera.d.ts
│ │ ├── OrthographicCamera.js
│ │ ├── PerspectiveCamera.d.ts
│ │ ├── PerspectiveCamera.js
│ │ ├── StereoCamera.d.ts
│ │ └── StereoCamera.js
│ ├── constants.d.ts
│ ├── constants.js
│ ├── controls/
│ │ ├── DeviceOrientationControls.d.ts
│ │ ├── DeviceOrientationControls.js
│ │ ├── DragControls.d.ts
│ │ ├── DragControls.js
│ │ ├── FirstPersonControls.d.ts
│ │ ├── FirstPersonControls.js
│ │ ├── FlyControls.d.ts
│ │ ├── FlyControls.js
│ │ ├── OrbitControls.d.ts
│ │ ├── OrbitControls.js
│ │ ├── PointerLockControls.d.ts
│ │ ├── PointerLockControls.js
│ │ ├── TrackballControls.d.ts
│ │ ├── TrackballControls.js
│ │ ├── TransformControls.d.ts
│ │ └── TransformControls.js
│ ├── core/
│ │ ├── BufferAttribute.d.ts
│ │ ├── BufferAttribute.js
│ │ ├── BufferGeometry.d.ts
│ │ ├── BufferGeometry.js
│ │ ├── Clock.d.ts
│ │ ├── Clock.js
│ │ ├── Curve.d.ts
│ │ ├── CurvePath.d.ts
│ │ ├── CurvePath.js
│ │ ├── DirectGeometry.d.ts
│ │ ├── DirectGeometry.js
│ │ ├── EventDispatcher.d.ts
│ │ ├── EventDispatcher.js
│ │ ├── Face3.d.ts
│ │ ├── Face3.js
│ │ ├── Font.d.ts
│ │ ├── Font.js
│ │ ├── Geometry.d.ts
│ │ ├── Geometry.js
│ │ ├── InstancedBufferAttribute.d.ts
│ │ ├── InstancedBufferAttribute.js
│ │ ├── InstancedBufferGeometry.d.ts
│ │ ├── InstancedBufferGeometry.js
│ │ ├── InstancedInterleavedBuffer.d.ts
│ │ ├── InstancedInterleavedBuffer.js
│ │ ├── InterleavedBuffer.d.ts
│ │ ├── InterleavedBuffer.js
│ │ ├── InterleavedBufferAttribute.d.ts
│ │ ├── InterleavedBufferAttribute.js
│ │ ├── Interpolations.d.ts
│ │ ├── Interpolations.js
│ │ ├── Layers.d.ts
│ │ ├── Layers.js
│ │ ├── Object3D.d.ts
│ │ ├── Object3D.js
│ │ ├── Path.d.ts
│ │ ├── Path.js
│ │ ├── Raycaster.d.ts
│ │ ├── Raycaster.js
│ │ ├── Shape.d.ts
│ │ ├── Shape.js
│ │ ├── ShapePath.d.ts
│ │ ├── ShapePath.js
│ │ ├── Uniform.d.ts
│ │ └── Uniform.js
│ ├── curves/
│ │ ├── ArcCurve.d.ts
│ │ ├── ArcCurve.js
│ │ ├── CatmullRomCurve3.d.ts
│ │ ├── CatmullRomCurve3.js
│ │ ├── CubicBezierCurve.d.ts
│ │ ├── CubicBezierCurve.js
│ │ ├── CubicBezierCurve3.d.ts
│ │ ├── CubicBezierCurve3.js
│ │ ├── Curve.js
│ │ ├── CurveExtras.d.ts
│ │ ├── CurveExtras.js
│ │ ├── Curves.d.ts
│ │ ├── EllipseCurve.d.ts
│ │ ├── EllipseCurve.js
│ │ ├── LineCurve.d.ts
│ │ ├── LineCurve.js
│ │ ├── LineCurve3.d.ts
│ │ ├── LineCurve3.js
│ │ ├── NURBSCurve.d.ts
│ │ ├── NURBSCurve.js
│ │ ├── NURBSSurface.d.ts
│ │ ├── NURBSSurface.js
│ │ ├── NURBSUtils.d.ts
│ │ ├── NURBSUtils.js
│ │ ├── QuadraticBezierCurve.d.ts
│ │ ├── QuadraticBezierCurve.js
│ │ ├── QuadraticBezierCurve3.d.ts
│ │ ├── QuadraticBezierCurve3.js
│ │ ├── SplineCurve.d.ts
│ │ └── SplineCurve.js
│ ├── effects/
│ │ ├── AnaglyphEffect.d.ts
│ │ ├── AnaglyphEffect.js
│ │ ├── AsciiEffect.d.ts
│ │ ├── AsciiEffect.js
│ │ ├── OutlineEffect.d.ts
│ │ ├── OutlineEffect.js
│ │ ├── ParallaxBarrierEffect.d.ts
│ │ ├── ParallaxBarrierEffect.js
│ │ ├── PeppersGhostEffect.d.ts
│ │ ├── PeppersGhostEffect.js
│ │ ├── StereoEffect.d.ts
│ │ └── StereoEffect.js
│ ├── exporters/
│ │ ├── ColladaExporter.d.ts
│ │ ├── ColladaExporter.js
│ │ ├── DRACOExporter.d.ts
│ │ ├── DracoExporter.js
│ │ ├── GLTFExporter.d.ts
│ │ ├── GLTFExporter.js
│ │ ├── MMDExporter.d.ts
│ │ ├── MMDExporter.js
│ │ ├── OBJExporter.d.ts
│ │ ├── OBJExporter.js
│ │ ├── PLYExporter.d.ts
│ │ ├── PLYExporter.js
│ │ ├── STLExporter.d.ts
│ │ ├── STLExporter.js
│ │ ├── TypedGeometryExporter.d.ts
│ │ └── TypedGeometryExporter.js
│ ├── fonts/
│ │ ├── LICENSE
│ │ ├── droid/
│ │ │ ├── NOTICE
│ │ │ ├── droid_sans_bold.typeface.json
│ │ │ ├── droid_sans_mono_regular.typeface.json
│ │ │ ├── droid_sans_regular.typeface.json
│ │ │ ├── droid_serif_bold.typeface.json
│ │ │ └── droid_serif_regular.typeface.json
│ │ ├── gentilis_bold.typeface.json
│ │ ├── gentilis_regular.typeface.json
│ │ ├── helvetiker_bold.typeface.json
│ │ ├── helvetiker_regular.typeface.json
│ │ ├── optimer_bold.typeface.json
│ │ └── optimer_regular.typeface.json
│ ├── geometries/
│ │ ├── BoxGeometry.d.ts
│ │ ├── BoxGeometry.js
│ │ ├── BoxLineGeometry.d.ts
│ │ ├── BoxLineGeometry.js
│ │ ├── CircleGeometry.d.ts
│ │ ├── CircleGeometry.js
│ │ ├── ConeGeometry.d.ts
│ │ ├── ConeGeometry.js
│ │ ├── ConvexGeometry.d.ts
│ │ ├── ConvexGeometry.js
│ │ ├── CylinderGeometry.d.ts
│ │ ├── CylinderGeometry.js
│ │ ├── DecalGeometry.d.ts
│ │ ├── DecalGeometry.js
│ │ ├── DodecahedronGeometry.d.ts
│ │ ├── DodecahedronGeometry.js
│ │ ├── EdgesGeometry.d.ts
│ │ ├── EdgesGeometry.js
│ │ ├── ExtrudeGeometry.d.ts
│ │ ├── ExtrudeGeometry.js
│ │ ├── Geometries.d.ts
│ │ ├── IcosahedronGeometry.d.ts
│ │ ├── IcosahedronGeometry.js
│ │ ├── LatheGeometry.d.ts
│ │ ├── LatheGeometry.js
│ │ ├── LightningStrike.d.ts
│ │ ├── LightningStrike.js
│ │ ├── OctahedronGeometry.d.ts
│ │ ├── OctahedronGeometry.js
│ │ ├── ParametricGeometries.d.ts
│ │ ├── ParametricGeometries.js
│ │ ├── ParametricGeometry.d.ts
│ │ ├── ParametricGeometry.js
│ │ ├── PlaneGeometry.d.ts
│ │ ├── PlaneGeometry.js
│ │ ├── PolyhedronGeometry.d.ts
│ │ ├── PolyhedronGeometry.js
│ │ ├── RingGeometry.d.ts
│ │ ├── RingGeometry.js
│ │ ├── ShapeGeometry.d.ts
│ │ ├── ShapeGeometry.js
│ │ ├── SphereGeometry.d.ts
│ │ ├── SphereGeometry.js
│ │ ├── TeapotBufferGeometry.d.ts
│ │ ├── TeapotBufferGeometry.js
│ │ ├── TetrahedronGeometry.d.ts
│ │ ├── TetrahedronGeometry.js
│ │ ├── TextGeometry.d.ts
│ │ ├── TextGeometry.js
│ │ ├── TorusGeometry.d.ts
│ │ ├── TorusGeometry.js
│ │ ├── TorusKnotGeometry.d.ts
│ │ ├── TorusKnotGeometry.js
│ │ ├── TubeGeometry.d.ts
│ │ ├── TubeGeometry.js
│ │ ├── WireframeGeometry.d.ts
│ │ └── WireframeGeometry.js
│ ├── helpers/
│ │ ├── ArrowHelper.d.ts
│ │ ├── ArrowHelper.js
│ │ ├── AxesHelper.d.ts
│ │ ├── AxesHelper.js
│ │ ├── Box3Helper.d.ts
│ │ ├── Box3Helper.js
│ │ ├── BoxHelper.d.ts
│ │ ├── BoxHelper.js
│ │ ├── CameraHelper.d.ts
│ │ ├── CameraHelper.js
│ │ ├── DirectionalLightHelper.d.ts
│ │ ├── DirectionalLightHelper.js
│ │ ├── FaceNormalsHelper.d.ts
│ │ ├── FaceNormalsHelper.js
│ │ ├── GridHelper.d.ts
│ │ ├── GridHelper.js
│ │ ├── HemisphereLightHelper.d.ts
│ │ ├── HemisphereLightHelper.js
│ │ ├── LightProbeHelper.d.ts
│ │ ├── LightProbeHelper.js
│ │ ├── PlaneHelper.d.ts
│ │ ├── PlaneHelper.js
│ │ ├── PointLightHelper.d.ts
│ │ ├── PointLightHelper.js
│ │ ├── PolarGridHelper.d.ts
│ │ ├── PolarGridHelper.js
│ │ ├── PositionalAudioHelper.d.ts
│ │ ├── PositionalAudioHelper.js
│ │ ├── RectAreaLightHelper.d.ts
│ │ ├── RectAreaLightHelper.js
│ │ ├── SkeletonHelper.d.ts
│ │ ├── SkeletonHelper.js
│ │ ├── SpotLightHelper.d.ts
│ │ ├── SpotLightHelper.js
│ │ ├── VertexNormalsHelper.d.ts
│ │ ├── VertexNormalsHelper.js
│ │ ├── VertexTangentsHelper.d.ts
│ │ ├── VertexTangentsHelper.js
│ │ └── WebGL.js
│ ├── interactive/
│ │ ├── SelectionBox.d.ts
│ │ ├── SelectionBox.js
│ │ ├── SelectionHelper.d.ts
│ │ └── SelectionHelper.js
│ ├── libs/
│ │ ├── ammo.js
│ │ ├── basis/
│ │ │ ├── README.md
│ │ │ ├── basis_transcoder.js
│ │ │ └── basis_transcoder.wasm
│ │ ├── dat.gui.module.js
│ │ ├── draco/
│ │ │ ├── README.md
│ │ │ ├── draco_decoder.js
│ │ │ ├── draco_decoder.wasm
│ │ │ ├── draco_encoder.js
│ │ │ ├── draco_wasm_wrapper.js
│ │ │ └── gltf/
│ │ │ ├── draco_decoder.js
│ │ │ ├── draco_decoder.wasm
│ │ │ ├── draco_encoder.js
│ │ │ └── draco_wasm_wrapper.js
│ │ ├── mmdparser.module.js
│ │ ├── motion-controllers.module.js
│ │ └── stats.module.js
│ ├── lights/
│ │ ├── AmbientLight.d.ts
│ │ ├── AmbientLight.js
│ │ ├── AmbientLightProbe.d.ts
│ │ ├── AmbientLightProbe.js
│ │ ├── DirectionalLight.d.ts
│ │ ├── DirectionalLight.js
│ │ ├── DirectionalLightShadow.d.ts
│ │ ├── DirectionalLightShadow.js
│ │ ├── HemisphereLight.d.ts
│ │ ├── HemisphereLight.js
│ │ ├── HemisphereLightProbe.d.ts
│ │ ├── HemisphereLightProbe.js
│ │ ├── Light.d.ts
│ │ ├── Light.js
│ │ ├── LightProbe.d.ts
│ │ ├── LightProbe.js
│ │ ├── LightProbeGenerator.d.ts
│ │ ├── LightProbeGenerator.js
│ │ ├── LightShadow.d.ts
│ │ ├── LightShadow.js
│ │ ├── PointLight.d.ts
│ │ ├── PointLight.js
│ │ ├── PointLightShadow.d.ts
│ │ ├── PointLightShadow.js
│ │ ├── RectAreaLight.d.ts
│ │ ├── RectAreaLight.js
│ │ ├── RectAreaLightUniformsLib.d.ts
│ │ ├── RectAreaLightUniformsLib.js
│ │ ├── SpotLight.d.ts
│ │ ├── SpotLight.js
│ │ ├── SpotLightShadow.d.ts
│ │ └── SpotLightShadow.js
│ ├── lines/
│ │ ├── Line2.d.ts
│ │ ├── Line2.js
│ │ ├── LineGeometry.d.ts
│ │ ├── LineGeometry.js
│ │ ├── LineMaterial.d.ts
│ │ ├── LineMaterial.js
│ │ ├── LineSegments2.d.ts
│ │ ├── LineSegments2.js
│ │ ├── LineSegmentsGeometry.d.ts
│ │ ├── LineSegmentsGeometry.js
│ │ ├── Wireframe.d.ts
│ │ ├── Wireframe.js
│ │ ├── WireframeGeometry2.d.ts
│ │ └── WireframeGeometry2.js
│ ├── loaders/
│ │ ├── 3MFLoader.d.ts
│ │ ├── 3MFLoader.js
│ │ ├── AMFLoader.d.ts
│ │ ├── AMFLoader.js
│ │ ├── AWDLoader.d.ts
│ │ ├── AWDLoader.js
│ │ ├── AnimationLoader.d.ts
│ │ ├── AnimationLoader.js
│ │ ├── AssimpLoader.d.ts
│ │ ├── AssimpLoader.js
│ │ ├── AudioLoader.d.ts
│ │ ├── AudioLoader.js
│ │ ├── BVHLoader.d.ts
│ │ ├── BVHLoader.js
│ │ ├── BasisTextureLoader.d.ts
│ │ ├── BasisTextureLoader.js
│ │ ├── BufferGeometryLoader.d.ts
│ │ ├── BufferGeometryLoader.js
│ │ ├── Cache.d.ts
│ │ ├── Cache.js
│ │ ├── ColladaLoader.d.ts
│ │ ├── ColladaLoader.js
│ │ ├── CompressedTextureLoader.d.ts
│ │ ├── CompressedTextureLoader.js
│ │ ├── CubeTextureLoader.d.ts
│ │ ├── CubeTextureLoader.js
│ │ ├── DDSLoader.d.ts
│ │ ├── DDSLoader.js
│ │ ├── DRACOLoader.d.ts
│ │ ├── DRACOLoader.js
│ │ ├── DataTextureLoader.d.ts
│ │ ├── DataTextureLoader.js
│ │ ├── EXRLoader.d.ts
│ │ ├── EXRLoader.js
│ │ ├── FBXLoader.d.ts
│ │ ├── FBXLoader.js
│ │ ├── FileLoader.d.ts
│ │ ├── FileLoader.js
│ │ ├── FontLoader.d.ts
│ │ ├── FontLoader.js
│ │ ├── GCodeLoader.d.ts
│ │ ├── GCodeLoader.js
│ │ ├── GLTFLoader.d.ts
│ │ ├── GLTFLoader.js
│ │ ├── HDRCubeTextureLoader.d.ts
│ │ ├── HDRCubeTextureLoader.js
│ │ ├── ImageBitmapLoader.d.ts
│ │ ├── ImageBitmapLoader.js
│ │ ├── ImageLoader.d.ts
│ │ ├── ImageLoader.js
│ │ ├── KMZLoader.d.ts
│ │ ├── KMZLoader.js
│ │ ├── KTXLoader.d.ts
│ │ ├── KTXLoader.js
│ │ ├── LDrawLoader.d.ts
│ │ ├── LDrawLoader.js
│ │ ├── LWOLoader.d.ts
│ │ ├── LWOLoader.js
│ │ ├── Loader.d.ts
│ │ ├── Loader.js
│ │ ├── LoaderUtils.d.ts
│ │ ├── LoaderUtils.js
│ │ ├── LoadingManager.d.ts
│ │ ├── LoadingManager.js
│ │ ├── MD2Loader.d.ts
│ │ ├── MD2Loader.js
│ │ ├── MMDLoader.d.ts
│ │ ├── MMDLoader.js
│ │ ├── MTLLoader.d.ts
│ │ ├── MTLLoader.js
│ │ ├── MaterialLoader.d.ts
│ │ ├── MaterialLoader.js
│ │ ├── NRRDLoader.d.ts
│ │ ├── NRRDLoader.js
│ │ ├── NodeMaterialLoader.js
│ │ ├── OBJLoader.d.ts
│ │ ├── OBJLoader.js
│ │ ├── OBJLoader2.d.ts
│ │ ├── OBJLoader2.js
│ │ ├── OBJLoader2Parallel.d.ts
│ │ ├── OBJLoader2Parallel.js
│ │ ├── ObjectLoader.d.ts
│ │ ├── ObjectLoader.js
│ │ ├── PCDLoader.d.ts
│ │ ├── PCDLoader.js
│ │ ├── PDBLoader.d.ts
│ │ ├── PDBLoader.js
│ │ ├── PLYLoader.d.ts
│ │ ├── PLYLoader.js
│ │ ├── PRWMLoader.d.ts
│ │ ├── PRWMLoader.js
│ │ ├── PVRLoader.d.ts
│ │ ├── PVRLoader.js
│ │ ├── RGBELoader.d.ts
│ │ ├── RGBELoader.js
│ │ ├── STLLoader.d.ts
│ │ ├── STLLoader.js
│ │ ├── SVGLoader.d.ts
│ │ ├── SVGLoader.js
│ │ ├── TDSLoader.d.ts
│ │ ├── TDSLoader.js
│ │ ├── TGALoader.d.ts
│ │ ├── TGALoader.js
│ │ ├── TTFLoader.d.ts
│ │ ├── TTFLoader.js
│ │ ├── TextureLoader.d.ts
│ │ ├── TextureLoader.js
│ │ ├── VRMLoader.d.ts
│ │ ├── VRMLoader.js
│ │ ├── VTKLoader.d.ts
│ │ ├── VTKLoader.js
│ │ ├── XLoader.d.ts
│ │ ├── XLoader.js
│ │ └── obj2/
│ │ ├── bridge/
│ │ │ ├── MtlObjBridge.d.ts
│ │ │ └── MtlObjBridge.js
│ │ ├── shared/
│ │ │ ├── MaterialHandler.d.ts
│ │ │ ├── MaterialHandler.js
│ │ │ ├── MeshReceiver.d.ts
│ │ │ └── MeshReceiver.js
│ │ ├── utils/
│ │ │ ├── CodeSerializer.d.ts
│ │ │ └── CodeSerializer.js
│ │ └── worker/
│ │ ├── main/
│ │ │ ├── WorkerExecutionSupport.d.ts
│ │ │ └── WorkerExecutionSupport.js
│ │ └── parallel/
│ │ ├── OBJLoader2Parser.d.ts
│ │ ├── OBJLoader2Parser.js
│ │ ├── WorkerRunner.d.ts
│ │ ├── WorkerRunner.js
│ │ └── jsm/
│ │ └── OBJLoader2Worker.js
│ ├── materials/
│ │ ├── LineBasicMaterial.d.ts
│ │ ├── LineBasicMaterial.js
│ │ ├── LineDashedMaterial.d.ts
│ │ ├── LineDashedMaterial.js
│ │ ├── Material.d.ts
│ │ ├── Material.js
│ │ ├── Materials.d.ts
│ │ ├── MeshBasicMaterial.d.ts
│ │ ├── MeshBasicMaterial.js
│ │ ├── MeshDepthMaterial.d.ts
│ │ ├── MeshDepthMaterial.js
│ │ ├── MeshDistanceMaterial.d.ts
│ │ ├── MeshDistanceMaterial.js
│ │ ├── MeshLambertMaterial.d.ts
│ │ ├── MeshLambertMaterial.js
│ │ ├── MeshMatcapMaterial.d.ts
│ │ ├── MeshMatcapMaterial.js
│ │ ├── MeshNormalMaterial.d.ts
│ │ ├── MeshNormalMaterial.js
│ │ ├── MeshPhongMaterial.d.ts
│ │ ├── MeshPhongMaterial.js
│ │ ├── MeshPhysicalMaterial.d.ts
│ │ ├── MeshPhysicalMaterial.js
│ │ ├── MeshStandardMaterial.d.ts
│ │ ├── MeshStandardMaterial.js
│ │ ├── MeshToonMaterial.d.ts
│ │ ├── MeshToonMaterial.js
│ │ ├── PointsMaterial.d.ts
│ │ ├── PointsMaterial.js
│ │ ├── RawShaderMaterial.d.ts
│ │ ├── RawShaderMaterial.js
│ │ ├── ShaderMaterial.d.ts
│ │ ├── ShaderMaterial.js
│ │ ├── ShadowMaterial.d.ts
│ │ ├── ShadowMaterial.js
│ │ ├── SpriteMaterial.d.ts
│ │ └── SpriteMaterial.js
│ ├── math/
│ │ ├── Box2.d.ts
│ │ ├── Box2.js
│ │ ├── Box3.d.ts
│ │ ├── Box3.js
│ │ ├── Color.d.ts
│ │ ├── Color.js
│ │ ├── ColorConverter.d.ts
│ │ ├── ColorConverter.js
│ │ ├── ConvexHull.d.ts
│ │ ├── ConvexHull.js
│ │ ├── Cylindrical.d.ts
│ │ ├── Cylindrical.js
│ │ ├── Euler.d.ts
│ │ ├── Euler.js
│ │ ├── Frustum.d.ts
│ │ ├── Frustum.js
│ │ ├── ImprovedNoise.d.ts
│ │ ├── ImprovedNoise.js
│ │ ├── Interpolant.d.ts
│ │ ├── Interpolant.js
│ │ ├── Line3.d.ts
│ │ ├── Line3.js
│ │ ├── Lut.d.ts
│ │ ├── Lut.js
│ │ ├── MathUtils.d.ts
│ │ ├── MathUtils.js
│ │ ├── Matrix3.d.ts
│ │ ├── Matrix3.js
│ │ ├── Matrix4.d.ts
│ │ ├── Matrix4.js
│ │ ├── MeshSurfaceSampler.d.ts
│ │ ├── MeshSurfaceSampler.js
│ │ ├── Plane.d.ts
│ │ ├── Plane.js
│ │ ├── Quaternion.d.ts
│ │ ├── Quaternion.js
│ │ ├── Ray.d.ts
│ │ ├── Ray.js
│ │ ├── SimplexNoise.d.ts
│ │ ├── SimplexNoise.js
│ │ ├── Sphere.d.ts
│ │ ├── Sphere.js
│ │ ├── Spherical.d.ts
│ │ ├── Spherical.js
│ │ ├── SphericalHarmonics3.d.ts
│ │ ├── SphericalHarmonics3.js
│ │ ├── Triangle.d.ts
│ │ ├── Triangle.js
│ │ ├── Vector2.d.ts
│ │ ├── Vector2.js
│ │ ├── Vector3.d.ts
│ │ ├── Vector3.js
│ │ ├── Vector4.d.ts
│ │ ├── Vector4.js
│ │ └── interpolants/
│ │ ├── CubicInterpolant.d.ts
│ │ ├── CubicInterpolant.js
│ │ ├── DiscreteInterpolant.d.ts
│ │ ├── DiscreteInterpolant.js
│ │ ├── LinearInterpolant.d.ts
│ │ ├── LinearInterpolant.js
│ │ ├── QuaternionLinearInterpolant.d.ts
│ │ └── QuaternionLinearInterpolant.js
│ ├── misc/
│ │ ├── ConvexObjectBreaker.d.ts
│ │ ├── Earcut.js
│ │ ├── GPUComputationRenderer.d.ts
│ │ ├── Gyroscope.d.ts
│ │ ├── MD2Character.d.ts
│ │ ├── MD2CharacterComplex.d.ts
│ │ ├── MorphAnimMesh.d.ts
│ │ ├── MorphBlendMesh.d.ts
│ │ ├── Ocean.d.ts
│ │ ├── RollerCoaster.d.ts
│ │ ├── TubePainter.d.ts
│ │ ├── TubePainter.js
│ │ ├── Volume.d.ts
│ │ ├── Volume.js
│ │ └── VolumeSlice.d.ts
│ ├── modifiers/
│ │ ├── ConvexObjectBreaker.js
│ │ ├── ExplodeModifier.d.ts
│ │ ├── ExplodeModifier.js
│ │ ├── SimplifyModifier.d.ts
│ │ ├── SimplifyModifier.js
│ │ ├── SubdivisionModifier.d.ts
│ │ ├── SubdivisionModifier.js
│ │ ├── TessellateModifier.d.ts
│ │ └── TessellateModifier.js
│ ├── nodes/
│ │ ├── Nodes.d.ts
│ │ ├── accessors/
│ │ │ ├── CameraNode.d.ts
│ │ │ ├── CameraNode.js
│ │ │ ├── ColorsNode.d.ts
│ │ │ ├── ColorsNode.js
│ │ │ ├── LightNode.d.ts
│ │ │ ├── LightNode.js
│ │ │ ├── NormalNode.d.ts
│ │ │ ├── NormalNode.js
│ │ │ ├── PositionNode.d.ts
│ │ │ ├── PositionNode.js
│ │ │ ├── ReflectNode.d.ts
│ │ │ ├── ReflectNode.js
│ │ │ ├── ResolutionNode.d.ts
│ │ │ ├── ResolutionNode.js
│ │ │ ├── ScreenUVNode.d.ts
│ │ │ ├── ScreenUVNode.js
│ │ │ ├── UVNode.d.ts
│ │ │ └── UVNode.js
│ │ ├── core/
│ │ │ ├── AttributeNode.d.ts
│ │ │ ├── AttributeNode.js
│ │ │ ├── ConstNode.d.ts
│ │ │ ├── ConstNode.js
│ │ │ ├── ExpressionNode.d.ts
│ │ │ ├── ExpressionNode.js
│ │ │ ├── FunctionCallNode.d.ts
│ │ │ ├── FunctionCallNode.js
│ │ │ ├── FunctionNode.d.ts
│ │ │ ├── FunctionNode.js
│ │ │ ├── InputNode.d.ts
│ │ │ ├── InputNode.js
│ │ │ ├── Node.d.ts
│ │ │ ├── Node.js
│ │ │ ├── NodeBuilder.d.ts
│ │ │ ├── NodeBuilder.js
│ │ │ ├── NodeFrame.d.ts
│ │ │ ├── NodeFrame.js
│ │ │ ├── NodeLib.d.ts
│ │ │ ├── NodeLib.js
│ │ │ ├── NodeUniform.d.ts
│ │ │ ├── NodeUniform.js
│ │ │ ├── NodeUtils.d.ts
│ │ │ ├── NodeUtils.js
│ │ │ ├── StructNode.d.ts
│ │ │ ├── StructNode.js
│ │ │ ├── TempNode.d.ts
│ │ │ ├── TempNode.js
│ │ │ ├── VarNode.d.ts
│ │ │ └── VarNode.js
│ │ ├── effects/
│ │ │ ├── BlurNode.d.ts
│ │ │ ├── BlurNode.js
│ │ │ ├── ColorAdjustmentNode.d.ts
│ │ │ ├── ColorAdjustmentNode.js
│ │ │ ├── LuminanceNode.d.ts
│ │ │ └── LuminanceNode.js
│ │ ├── inputs/
│ │ │ ├── BoolNode.d.ts
│ │ │ ├── BoolNode.js
│ │ │ ├── ColorNode.d.ts
│ │ │ ├── ColorNode.js
│ │ │ ├── CubeTextureNode.d.ts
│ │ │ ├── CubeTextureNode.js
│ │ │ ├── FloatNode.d.ts
│ │ │ ├── FloatNode.js
│ │ │ ├── IntNode.d.ts
│ │ │ ├── IntNode.js
│ │ │ ├── Matrix3Node.d.ts
│ │ │ ├── Matrix3Node.js
│ │ │ ├── Matrix4Node.d.ts
│ │ │ ├── Matrix4Node.js
│ │ │ ├── PropertyNode.d.ts
│ │ │ ├── PropertyNode.js
│ │ │ ├── RTTNode.d.ts
│ │ │ ├── RTTNode.js
│ │ │ ├── ReflectorNode.d.ts
│ │ │ ├── ReflectorNode.js
│ │ │ ├── ScreenNode.d.ts
│ │ │ ├── ScreenNode.js
│ │ │ ├── TextureNode.d.ts
│ │ │ ├── TextureNode.js
│ │ │ ├── Vector2Node.d.ts
│ │ │ ├── Vector2Node.js
│ │ │ ├── Vector3Node.d.ts
│ │ │ ├── Vector3Node.js
│ │ │ ├── Vector4Node.d.ts
│ │ │ └── Vector4Node.js
│ │ ├── materials/
│ │ │ ├── MeshStandardNodeMaterial.d.ts
│ │ │ ├── MeshStandardNodeMaterial.js
│ │ │ ├── NodeMaterial.d.ts
│ │ │ ├── NodeMaterial.js
│ │ │ ├── PhongNodeMaterial.d.ts
│ │ │ ├── PhongNodeMaterial.js
│ │ │ ├── SpriteNodeMaterial.d.ts
│ │ │ ├── SpriteNodeMaterial.js
│ │ │ ├── StandardNodeMaterial.d.ts
│ │ │ ├── StandardNodeMaterial.js
│ │ │ └── nodes/
│ │ │ ├── MeshStandardNode.d.ts
│ │ │ ├── MeshStandardNode.js
│ │ │ ├── PhongNode.d.ts
│ │ │ ├── PhongNode.js
│ │ │ ├── RawNode.d.ts
│ │ │ ├── RawNode.js
│ │ │ ├── SpriteNode.d.ts
│ │ │ ├── SpriteNode.js
│ │ │ ├── StandardNode.d.ts
│ │ │ └── StandardNode.js
│ │ ├── math/
│ │ │ ├── CondNode.d.ts
│ │ │ ├── CondNode.js
│ │ │ ├── MathNode.d.ts
│ │ │ ├── MathNode.js
│ │ │ ├── OperatorNode.d.ts
│ │ │ └── OperatorNode.js
│ │ ├── misc/
│ │ │ ├── BumpMapNode.d.ts
│ │ │ ├── BumpMapNode.js
│ │ │ ├── NormalMapNode.d.ts
│ │ │ ├── NormalMapNode.js
│ │ │ ├── TextureCubeNode.d.ts
│ │ │ ├── TextureCubeNode.js
│ │ │ ├── TextureCubeUVNode.d.ts
│ │ │ └── TextureCubeUVNode.js
│ │ ├── postprocessing/
│ │ │ ├── NodePass.d.ts
│ │ │ ├── NodePass.js
│ │ │ ├── NodePostProcessing.d.ts
│ │ │ └── NodePostProcessing.js
│ │ ├── procedural/
│ │ │ ├── CheckerNode.d.ts
│ │ │ ├── CheckerNode.js
│ │ │ ├── NoiseNode.d.ts
│ │ │ └── NoiseNode.js
│ │ └── utils/
│ │ ├── BypassNode.d.ts
│ │ ├── BypassNode.js
│ │ ├── ColorSpaceNode.d.ts
│ │ ├── ColorSpaceNode.js
│ │ ├── JoinNode.d.ts
│ │ ├── JoinNode.js
│ │ ├── MaxMIPLevelNode.d.ts
│ │ ├── MaxMIPLevelNode.js
│ │ ├── SpecularMIPLevelNode.d.ts
│ │ ├── SpecularMIPLevelNode.js
│ │ ├── SubSlot.d.ts
│ │ ├── SubSlotNode.js
│ │ ├── SwitchNode.d.ts
│ │ ├── SwitchNode.js
│ │ ├── TimerNode.d.ts
│ │ ├── TimerNode.js
│ │ ├── UVTransformNode.d.ts
│ │ ├── UVTransformNode.js
│ │ ├── VelocityNode.d.ts
│ │ └── VelocityNode.js
│ ├── objects/
│ │ ├── Bone.d.ts
│ │ ├── Bone.js
│ │ ├── Fire.d.ts
│ │ ├── Fire.js
│ │ ├── Group.d.ts
│ │ ├── Group.js
│ │ ├── Gyroscope.js
│ │ ├── ImmediateRenderObject.d.ts
│ │ ├── ImmediateRenderObject.js
│ │ ├── InstancedMesh.d.ts
│ │ ├── InstancedMesh.js
│ │ ├── LOD.d.ts
│ │ ├── LOD.js
│ │ ├── Lensflare.d.ts
│ │ ├── Lensflare.js
│ │ ├── LightningStorm.d.ts
│ │ ├── LightningStorm.js
│ │ ├── Line.d.ts
│ │ ├── Line.js
│ │ ├── LineLoop.d.ts
│ │ ├── LineLoop.js
│ │ ├── LineSegments.d.ts
│ │ ├── LineSegments.js
│ │ ├── MD2Character.js
│ │ ├── MD2CharacterComplex.js
│ │ ├── MarchingCubes.d.ts
│ │ ├── MarchingCubes.js
│ │ ├── Mesh.d.ts
│ │ ├── Mesh.js
│ │ ├── MorphAnimMesh.js
│ │ ├── MorphBlendMesh.js
│ │ ├── Ocean.js
│ │ ├── Points.d.ts
│ │ ├── Points.js
│ │ ├── Reflector.d.ts
│ │ ├── Reflector.js
│ │ ├── ReflectorRTT.d.ts
│ │ ├── ReflectorRTT.js
│ │ ├── Refractor.d.ts
│ │ ├── Refractor.js
│ │ ├── RollerCoaster.js
│ │ ├── ShadowMesh.d.ts
│ │ ├── ShadowMesh.js
│ │ ├── Skeleton.d.ts
│ │ ├── Skeleton.js
│ │ ├── SkinnedMesh.d.ts
│ │ ├── SkinnedMesh.js
│ │ ├── Sky.d.ts
│ │ ├── Sky.js
│ │ ├── Sprite.d.ts
│ │ ├── Sprite.js
│ │ ├── Water.d.ts
│ │ ├── Water.js
│ │ ├── Water2.d.ts
│ │ └── Water2.js
│ ├── polyfills.d.ts
│ ├── polyfills.js
│ ├── postprocessing/
│ │ ├── AdaptiveToneMappingPass.d.ts
│ │ ├── AdaptiveToneMappingPass.js
│ │ ├── AfterimagePass.d.ts
│ │ ├── AfterimagePass.js
│ │ ├── BloomPass.d.ts
│ │ ├── BloomPass.js
│ │ ├── BokehPass.d.ts
│ │ ├── BokehPass.js
│ │ ├── ClearPass.d.ts
│ │ ├── ClearPass.js
│ │ ├── CubeTexturePass.d.ts
│ │ ├── CubeTexturePass.js
│ │ ├── DotScreenPass.d.ts
│ │ ├── DotScreenPass.js
│ │ ├── EffectComposer.d.ts
│ │ ├── EffectComposer.js
│ │ ├── FilmPass.d.ts
│ │ ├── FilmPass.js
│ │ ├── GlitchPass.d.ts
│ │ ├── GlitchPass.js
│ │ ├── HalftonePass.d.ts
│ │ ├── HalftonePass.js
│ │ ├── MaskPass.d.ts
│ │ ├── MaskPass.js
│ │ ├── OutlinePass.d.ts
│ │ ├── OutlinePass.js
│ │ ├── Pass.d.ts
│ │ ├── Pass.js
│ │ ├── RenderPass.d.ts
│ │ ├── RenderPass.js
│ │ ├── SAOPass.d.ts
│ │ ├── SAOPass.js
│ │ ├── SMAAPass.d.ts
│ │ ├── SMAAPass.js
│ │ ├── SSAARenderPass.d.ts
│ │ ├── SSAARenderPass.js
│ │ ├── SSAOPass.d.ts
│ │ ├── SSAOPass.js
│ │ ├── SavePass.d.ts
│ │ ├── SavePass.js
│ │ ├── ShaderPass.d.ts
│ │ ├── ShaderPass.js
│ │ ├── TAARenderPass.d.ts
│ │ ├── TAARenderPass.js
│ │ ├── TexturePass.d.ts
│ │ ├── TexturePass.js
│ │ ├── UnrealBloomPass.d.ts
│ │ └── UnrealBloomPass.js
│ ├── renderers/
│ │ ├── CSS2DRenderer.d.ts
│ │ ├── CSS2DRenderer.js
│ │ ├── CSS3DRenderer.d.ts
│ │ ├── CSS3DRenderer.js
│ │ ├── GPUComputationRenderer.js
│ │ ├── Projector.d.ts
│ │ ├── Projector.js
│ │ ├── SVGRenderer.d.ts
│ │ ├── SVGRenderer.js
│ │ ├── WebGLCubeRenderTarget.d.ts
│ │ ├── WebGLCubeRenderTarget.js
│ │ ├── WebGLMultisampleRenderTarget.d.ts
│ │ ├── WebGLMultisampleRenderTarget.js
│ │ ├── WebGLMultiviewRenderTarget.d.ts
│ │ ├── WebGLMultiviewRenderTarget.js
│ │ ├── WebGLRenderTarget.d.ts
│ │ ├── WebGLRenderTarget.js
│ │ ├── WebGLRenderer.d.ts
│ │ ├── WebGLRenderer.js
│ │ ├── shaders/
│ │ │ ├── ShaderChunk/
│ │ │ │ ├── alphamap_fragment.glsl.js
│ │ │ │ ├── alphamap_pars_fragment.glsl.js
│ │ │ │ ├── alphatest_fragment.glsl.js
│ │ │ │ ├── aomap_fragment.glsl.js
│ │ │ │ ├── aomap_pars_fragment.glsl.js
│ │ │ │ ├── begin_vertex.glsl.js
│ │ │ │ ├── beginnormal_vertex.glsl.js
│ │ │ │ ├── bsdfs.glsl.js
│ │ │ │ ├── bumpmap_pars_fragment.glsl.js
│ │ │ │ ├── clearcoat_normal_fragment_begin.glsl.js
│ │ │ │ ├── clearcoat_normal_fragment_maps.glsl.js
│ │ │ │ ├── clearcoat_normalmap_pars_fragment.glsl.js
│ │ │ │ ├── clipping_planes_fragment.glsl.js
│ │ │ │ ├── clipping_planes_pars_fragment.glsl.js
│ │ │ │ ├── clipping_planes_pars_vertex.glsl.js
│ │ │ │ ├── clipping_planes_vertex.glsl.js
│ │ │ │ ├── color_fragment.glsl.js
│ │ │ │ ├── color_pars_fragment.glsl.js
│ │ │ │ ├── color_pars_vertex.glsl.js
│ │ │ │ ├── color_vertex.glsl.js
│ │ │ │ ├── common.glsl.js
│ │ │ │ ├── cube_uv_reflection_fragment.glsl.js
│ │ │ │ ├── default_fragment.glsl.js
│ │ │ │ ├── default_vertex.glsl.js
│ │ │ │ ├── defaultnormal_vertex.glsl.js
│ │ │ │ ├── displacementmap_pars_vertex.glsl.js
│ │ │ │ ├── displacementmap_vertex.glsl.js
│ │ │ │ ├── dithering_fragment.glsl.js
│ │ │ │ ├── dithering_pars_fragment.glsl.js
│ │ │ │ ├── emissivemap_fragment.glsl.js
│ │ │ │ ├── emissivemap_pars_fragment.glsl.js
│ │ │ │ ├── encodings_fragment.glsl.js
│ │ │ │ ├── encodings_pars_fragment.glsl.js
│ │ │ │ ├── envmap_common_pars_fragment.glsl.js
│ │ │ │ ├── envmap_fragment.glsl.js
│ │ │ │ ├── envmap_pars_fragment.glsl.js
│ │ │ │ ├── envmap_pars_vertex.glsl.js
│ │ │ │ ├── envmap_physical_pars_fragment.glsl.js
│ │ │ │ ├── envmap_vertex.glsl.js
│ │ │ │ ├── fog_fragment.glsl.js
│ │ │ │ ├── fog_pars_fragment.glsl.js
│ │ │ │ ├── fog_pars_vertex.glsl.js
│ │ │ │ ├── fog_vertex.glsl.js
│ │ │ │ ├── gradientmap_pars_fragment.glsl.js
│ │ │ │ ├── lightmap_fragment.glsl.js
│ │ │ │ ├── lightmap_pars_fragment.glsl.js
│ │ │ │ ├── lights_fragment_begin.glsl.js
│ │ │ │ ├── lights_fragment_end.glsl.js
│ │ │ │ ├── lights_fragment_maps.glsl.js
│ │ │ │ ├── lights_lambert_vertex.glsl.js
│ │ │ │ ├── lights_pars_begin.glsl.js
│ │ │ │ ├── lights_phong_fragment.glsl.js
│ │ │ │ ├── lights_phong_pars_fragment.glsl.js
│ │ │ │ ├── lights_physical_fragment.glsl.js
│ │ │ │ ├── lights_physical_pars_fragment.glsl.js
│ │ │ │ ├── lights_toon_fragment.glsl.js
│ │ │ │ ├── lights_toon_pars_fragment.glsl.js
│ │ │ │ ├── logdepthbuf_fragment.glsl.js
│ │ │ │ ├── logdepthbuf_pars_fragment.glsl.js
│ │ │ │ ├── logdepthbuf_pars_vertex.glsl.js
│ │ │ │ ├── logdepthbuf_vertex.glsl.js
│ │ │ │ ├── map_fragment.glsl.js
│ │ │ │ ├── map_pars_fragment.glsl.js
│ │ │ │ ├── map_particle_fragment.glsl.js
│ │ │ │ ├── map_particle_pars_fragment.glsl.js
│ │ │ │ ├── metalnessmap_fragment.glsl.js
│ │ │ │ ├── metalnessmap_pars_fragment.glsl.js
│ │ │ │ ├── morphnormal_vertex.glsl.js
│ │ │ │ ├── morphtarget_pars_vertex.glsl.js
│ │ │ │ ├── morphtarget_vertex.glsl.js
│ │ │ │ ├── normal_fragment_begin.glsl.js
│ │ │ │ ├── normal_fragment_maps.glsl.js
│ │ │ │ ├── normalmap_pars_fragment.glsl.js
│ │ │ │ ├── packing.glsl.js
│ │ │ │ ├── premultiplied_alpha_fragment.glsl.js
│ │ │ │ ├── project_vertex.glsl.js
│ │ │ │ ├── roughnessmap_fragment.glsl.js
│ │ │ │ ├── roughnessmap_pars_fragment.glsl.js
│ │ │ │ ├── shadowmap_pars_fragment.glsl.js
│ │ │ │ ├── shadowmap_pars_vertex.glsl.js
│ │ │ │ ├── shadowmap_vertex.glsl.js
│ │ │ │ ├── shadowmask_pars_fragment.glsl.js
│ │ │ │ ├── skinbase_vertex.glsl.js
│ │ │ │ ├── skinning_pars_vertex.glsl.js
│ │ │ │ ├── skinning_vertex.glsl.js
│ │ │ │ ├── skinnormal_vertex.glsl.js
│ │ │ │ ├── specularmap_fragment.glsl.js
│ │ │ │ ├── specularmap_pars_fragment.glsl.js
│ │ │ │ ├── tonemapping_fragment.glsl.js
│ │ │ │ ├── tonemapping_pars_fragment.glsl.js
│ │ │ │ ├── uv2_pars_fragment.glsl.js
│ │ │ │ ├── uv2_pars_vertex.glsl.js
│ │ │ │ ├── uv2_vertex.glsl.js
│ │ │ │ ├── uv_pars_fragment.glsl.js
│ │ │ │ ├── uv_pars_vertex.glsl.js
│ │ │ │ ├── uv_vertex.glsl.js
│ │ │ │ └── worldpos_vertex.glsl.js
│ │ │ ├── ShaderChunk.d.ts
│ │ │ ├── ShaderChunk.js
│ │ │ ├── ShaderLib/
│ │ │ │ ├── background_frag.glsl.js
│ │ │ │ ├── background_vert.glsl.js
│ │ │ │ ├── cube_frag.glsl.js
│ │ │ │ ├── cube_vert.glsl.js
│ │ │ │ ├── depth_frag.glsl.js
│ │ │ │ ├── depth_vert.glsl.js
│ │ │ │ ├── distanceRGBA_frag.glsl.js
│ │ │ │ ├── distanceRGBA_vert.glsl.js
│ │ │ │ ├── equirect_frag.glsl.js
│ │ │ │ ├── equirect_vert.glsl.js
│ │ │ │ ├── linedashed_frag.glsl.js
│ │ │ │ ├── linedashed_vert.glsl.js
│ │ │ │ ├── meshbasic_frag.glsl.js
│ │ │ │ ├── meshbasic_vert.glsl.js
│ │ │ │ ├── meshlambert_frag.glsl.js
│ │ │ │ ├── meshlambert_vert.glsl.js
│ │ │ │ ├── meshmatcap_frag.glsl.js
│ │ │ │ ├── meshmatcap_vert.glsl.js
│ │ │ │ ├── meshphong_frag.glsl.js
│ │ │ │ ├── meshphong_vert.glsl.js
│ │ │ │ ├── meshphysical_frag.glsl.js
│ │ │ │ ├── meshphysical_vert.glsl.js
│ │ │ │ ├── meshtoon_frag.glsl.js
│ │ │ │ ├── meshtoon_vert.glsl.js
│ │ │ │ ├── normal_frag.glsl.js
│ │ │ │ ├── normal_vert.glsl.js
│ │ │ │ ├── points_frag.glsl.js
│ │ │ │ ├── points_vert.glsl.js
│ │ │ │ ├── shadow_frag.glsl.js
│ │ │ │ ├── shadow_vert.glsl.js
│ │ │ │ ├── sprite_frag.glsl.js
│ │ │ │ ├── sprite_vert.glsl.js
│ │ │ │ ├── vsm_frag.glsl.js
│ │ │ │ └── vsm_vert.glsl.js
│ │ │ ├── ShaderLib.d.ts
│ │ │ ├── ShaderLib.js
│ │ │ ├── UniformsLib.d.ts
│ │ │ ├── UniformsLib.js
│ │ │ ├── UniformsUtils.d.ts
│ │ │ └── UniformsUtils.js
│ │ ├── webgl/
│ │ │ ├── WebGLAnimation.d.ts
│ │ │ ├── WebGLAnimation.js
│ │ │ ├── WebGLAttributes.d.ts
│ │ │ ├── WebGLAttributes.js
│ │ │ ├── WebGLBackground.d.ts
│ │ │ ├── WebGLBackground.js
│ │ │ ├── WebGLBufferRenderer.d.ts
│ │ │ ├── WebGLBufferRenderer.js
│ │ │ ├── WebGLCapabilities.d.ts
│ │ │ ├── WebGLCapabilities.js
│ │ │ ├── WebGLClipping.d.ts
│ │ │ ├── WebGLClipping.js
│ │ │ ├── WebGLExtensions.d.ts
│ │ │ ├── WebGLExtensions.js
│ │ │ ├── WebGLGeometries.d.ts
│ │ │ ├── WebGLGeometries.js
│ │ │ ├── WebGLIndexedBufferRenderer.d.ts
│ │ │ ├── WebGLIndexedBufferRenderer.js
│ │ │ ├── WebGLInfo.d.ts
│ │ │ ├── WebGLInfo.js
│ │ │ ├── WebGLLights.d.ts
│ │ │ ├── WebGLLights.js
│ │ │ ├── WebGLMorphtargets.d.ts
│ │ │ ├── WebGLMorphtargets.js
│ │ │ ├── WebGLMultiview.d.ts
│ │ │ ├── WebGLMultiview.js
│ │ │ ├── WebGLObjects.d.ts
│ │ │ ├── WebGLObjects.js
│ │ │ ├── WebGLProgram.d.ts
│ │ │ ├── WebGLProgram.js
│ │ │ ├── WebGLPrograms.d.ts
│ │ │ ├── WebGLPrograms.js
│ │ │ ├── WebGLProperties.d.ts
│ │ │ ├── WebGLProperties.js
│ │ │ ├── WebGLRenderLists.d.ts
│ │ │ ├── WebGLRenderLists.js
│ │ │ ├── WebGLRenderStates.d.ts
│ │ │ ├── WebGLRenderStates.js
│ │ │ ├── WebGLShader.d.ts
│ │ │ ├── WebGLShader.js
│ │ │ ├── WebGLShadowMap.d.ts
│ │ │ ├── WebGLShadowMap.js
│ │ │ ├── WebGLState.d.ts
│ │ │ ├── WebGLState.js
│ │ │ ├── WebGLTextures.d.ts
│ │ │ ├── WebGLTextures.js
│ │ │ ├── WebGLUniforms.d.ts
│ │ │ ├── WebGLUniforms.js
│ │ │ ├── WebGLUtils.d.ts
│ │ │ └── WebGLUtils.js
│ │ └── webxr/
│ │ ├── WebXRManager.d.ts
│ │ └── WebXRManager.js
│ ├── scenes/
│ │ ├── Fog.d.ts
│ │ ├── Fog.js
│ │ ├── FogExp2.d.ts
│ │ ├── FogExp2.js
│ │ ├── Scene.d.ts
│ │ └── Scene.js
│ ├── shaders/
│ │ ├── AfterimageShader.d.ts
│ │ ├── AfterimageShader.js
│ │ ├── BasicShader.d.ts
│ │ ├── BasicShader.js
│ │ ├── BleachBypassShader.d.ts
│ │ ├── BleachBypassShader.js
│ │ ├── BlendShader.d.ts
│ │ ├── BlendShader.js
│ │ ├── BokehShader.d.ts
│ │ ├── BokehShader.js
│ │ ├── BokehShader2.d.ts
│ │ ├── BokehShader2.js
│ │ ├── BrightnessContrastShader.d.ts
│ │ ├── BrightnessContrastShader.js
│ │ ├── ColorCorrectionShader.d.ts
│ │ ├── ColorCorrectionShader.js
│ │ ├── ColorifyShader.d.ts
│ │ ├── ColorifyShader.js
│ │ ├── ConvolutionShader.d.ts
│ │ ├── ConvolutionShader.js
│ │ ├── CopyShader.d.ts
│ │ ├── CopyShader.js
│ │ ├── DOFMipMapShader.d.ts
│ │ ├── DOFMipMapShader.js
│ │ ├── DepthLimitedBlurShader.d.ts
│ │ ├── DepthLimitedBlurShader.js
│ │ ├── DigitalGlitch.d.ts
│ │ ├── DigitalGlitch.js
│ │ ├── DotScreenShader.d.ts
│ │ ├── DotScreenShader.js
│ │ ├── FXAAShader.d.ts
│ │ ├── FXAAShader.js
│ │ ├── FilmShader.d.ts
│ │ ├── FilmShader.js
│ │ ├── FocusShader.d.ts
│ │ ├── FocusShader.js
│ │ ├── FreiChenShader.d.ts
│ │ ├── FreiChenShader.js
│ │ ├── FresnelShader.d.ts
│ │ ├── FresnelShader.js
│ │ ├── GammaCorrectionShader.d.ts
│ │ ├── GammaCorrectionShader.js
│ │ ├── GodRaysShader.d.ts
│ │ ├── GodRaysShader.js
│ │ ├── HalftoneShader.d.ts
│ │ ├── HalftoneShader.js
│ │ ├── HorizontalBlurShader.d.ts
│ │ ├── HorizontalBlurShader.js
│ │ ├── HorizontalTiltShiftShader.d.ts
│ │ ├── HorizontalTiltShiftShader.js
│ │ ├── HueSaturationShader.d.ts
│ │ ├── HueSaturationShader.js
│ │ ├── KaleidoShader.d.ts
│ │ ├── KaleidoShader.js
│ │ ├── LuminosityHighPassShader.d.ts
│ │ ├── LuminosityHighPassShader.js
│ │ ├── LuminosityShader.d.ts
│ │ ├── LuminosityShader.js
│ │ ├── MirrorShader.d.ts
│ │ ├── MirrorShader.js
│ │ ├── NormalMapShader.d.ts
│ │ ├── NormalMapShader.js
│ │ ├── OceanShaders.d.ts
│ │ ├── OceanShaders.js
│ │ ├── ParallaxShader.d.ts
│ │ ├── ParallaxShader.js
│ │ ├── PixelShader.d.ts
│ │ ├── PixelShader.js
│ │ ├── RGBShiftShader.d.ts
│ │ ├── RGBShiftShader.js
│ │ ├── SAOShader.d.ts
│ │ ├── SAOShader.js
│ │ ├── SMAAShader.d.ts
│ │ ├── SMAAShader.js
│ │ ├── SSAOShader.d.ts
│ │ ├── SSAOShader.js
│ │ ├── SepiaShader.d.ts
│ │ ├── SepiaShader.js
│ │ ├── SobelOperatorShader.d.ts
│ │ ├── SobelOperatorShader.js
│ │ ├── TechnicolorShader.d.ts
│ │ ├── TechnicolorShader.js
│ │ ├── ToneMapShader.d.ts
│ │ ├── ToneMapShader.js
│ │ ├── ToonShader.d.ts
│ │ ├── ToonShader.js
│ │ ├── TranslucentShader.d.ts
│ │ ├── TranslucentShader.js
│ │ ├── TriangleBlurShader.d.ts
│ │ ├── TriangleBlurShader.js
│ │ ├── UnpackDepthRGBAShader.d.ts
│ │ ├── UnpackDepthRGBAShader.js
│ │ ├── VerticalBlurShader.d.ts
│ │ ├── VerticalBlurShader.js
│ │ ├── VerticalTiltShiftShader.d.ts
│ │ ├── VerticalTiltShiftShader.js
│ │ ├── VignetteShader.d.ts
│ │ ├── VignetteShader.js
│ │ ├── VolumeShader.d.ts
│ │ ├── VolumeShader.js
│ │ ├── WaterRefractionShader.d.ts
│ │ └── WaterRefractionShader.js
│ ├── textures/
│ │ ├── CanvasTexture.d.ts
│ │ ├── CanvasTexture.js
│ │ ├── CompressedTexture.d.ts
│ │ ├── CompressedTexture.js
│ │ ├── CubeTexture.d.ts
│ │ ├── CubeTexture.js
│ │ ├── DataTexture.d.ts
│ │ ├── DataTexture.js
│ │ ├── DataTexture2DArray.d.ts
│ │ ├── DataTexture2DArray.js
│ │ ├── DataTexture3D.d.ts
│ │ ├── DataTexture3D.js
│ │ ├── DepthTexture.d.ts
│ │ ├── DepthTexture.js
│ │ ├── Texture.d.ts
│ │ ├── Texture.js
│ │ ├── VideoTexture.d.ts
│ │ └── VideoTexture.js
│ ├── utils/
│ │ ├── BufferGeometryUtils.d.ts
│ │ ├── BufferGeometryUtils.js
│ │ ├── GeometryCompressionUtils.d.ts
│ │ ├── GeometryCompressionUtils.js
│ │ ├── GeometryUtils.d.ts
│ │ ├── GeometryUtils.js
│ │ ├── ImageUtils.js
│ │ ├── PMREMGenerator.js
│ │ ├── RoughnessMipmapper.d.ts
│ │ ├── RoughnessMipmapper.js
│ │ ├── SceneUtils.d.ts
│ │ ├── SceneUtils.js
│ │ ├── ShadowMapViewer.d.ts
│ │ ├── ShadowMapViewer.js
│ │ ├── ShapeUtils.js
│ │ ├── SkeletonUtils.d.ts
│ │ ├── SkeletonUtils.js
│ │ ├── TypedArrayUtils.d.ts
│ │ ├── TypedArrayUtils.js
│ │ ├── UVsDebug.d.ts
│ │ └── UVsDebug.js
│ ├── utils.d.ts
│ ├── utils.js
│ ├── vr/
│ │ └── HelioWebXRPolyfill.js
│ └── webxr/
│ ├── ARButton.d.ts
│ ├── ARButton.js
│ ├── VRButton.d.ts
│ └── VRButton.js
└── utils.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
/.idea/
/node_modules/
/tests/
================================================
FILE: .npmignore
================================================
/tests
/configs
/.idea
/es6-convertor.js
/gulpfile.js
!core
================================================
FILE: LICENSE.md
================================================
### MIT License
##### Copyright (c) 2017-Present, Itee, Valcke Tristan [https://github.com/Itee](https://github.com/Itee).
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
three-full
================
[![License][license-badge]][license-badge-url]
**Deprecation note:**
> I am glad to annonce since Three release his examples files under JSM folder, this repository should be avoided. The first goal of this repository was to provided an alternative solution during this migration. From now, please consider to use Three.module.js instead even if i maintain this repository for my personal usage. Thanks for all ! Itee...
**The version 28.0.2 is now available under Three r0.113.2**
#### Extended Three JavaScript 3D library ####
Three.js come with lot of examples files, which are curently not usable as ES6 module.
The purpose of this project is to convert all examples files and includes them as part
of the library.
#### Setup ####
Assuming that npm and node are already installed.
Install:
````
npm install --save three-full
````
#### Usage ####
Like Three.js but with more, more and more available stuff.
###### Using ES6: ######
````javascript
import { WhatIWant } from 'node_modules/three-full/builds/Three.es.js'
// equivalent to
import { WhatIWant } from 'three-full'
// or directly from sources folder
import { Ocean } from 'node_modules/three-full/sources/Ocean'
````
###### Using Node/CommonJS: ######
````javascript
const Three = require('node_modules/three-full/builds/Three.cjs.js')
// equivalent to
const Three = require('three-full')
````
###### Using UMD: ######
````javascript
const Three = require('node_modules/three-full/builds/Three.umd.js')
````
###### Using AMD: ######
````javascript
require(['node_modules/three-full/builds/Three.amd.js'],
function( Three ){
//...
});
````
###### From HTML (not recommended): ######
````
Three Full Es6
````
Note: You should copy the file in right server location to serve it correctly, and use Three.iife.min.js under production ! Importing the all library in HTML page should be avoided, use a proper module bundler like webpack or rollup using es6 module syntaxe !
#### Commands ####
In case you want participate, you need to known some commands below:
Help:
````
npm run help
````
Will display all you need to known about available commands in three-full package
Patch:
````
npm run patch
````
**Important:** After installing/reinstalling node_modules/three you need to apply patch only once, for fix some examples parts.
Convert:
````
npm run convert
````
This command will convert all examples files as ES6 modules ([*](#miss)) and copy all three files at top level of the package in view to be build.
Build:
````
npm run build
````
This command will build converted sources as UMD, AMD, ES ([*](#bug)), CJS and IIFE using [Rollup](https://rollupjs.org/)
#### Missings Files ####
This is the list of unsupported part of example, which cannot/won't be converted.
* **Intermediary exporter files**
* **Curves.js**
* **Geometries.js**
* **Materials.js**
* **Nodes.js**
* **Others**
* **examples\js** //*Good job was done in JSM folder, nice*
* **examples\jsm\controls\experimental** //*Duplicate exports*
* **Specific Files**
* **examples\js\loaders\VRMLLoader**
* **examples\js\loaders\NRRDLoader**
* **examples\js\renderers\RaytracingWorker**
#### Missings Imports ####
* **Scene** Could use \_\_THREE_DEVTOOLS__
* **WebGLRenderer** Could use \_\_THREE_DEVTOOLS__
* **MMDLoader** Require MMDParser available at three/examples/jsm/libs/mmdparser.module.js
* **MMDExporter** Require MMDParser available at three/examples/jsm/libs/mmdparser.module.js
* **FBXLoader** Require Zlib.Inflate available at three/examples/jsm/libs/inflate.module.min.js
* **EXRLoader** Require Zlib.Inflate available at three/examples/jsm/libs/inflate.module.min.js
* **NRRDLoader** Require Zlib.Inflate available at three/examples/jsm/libs/inflate.module.min.js
* **VTKLoader** Require Zlib.Inflate available at three/examples/jsm/libs/inflate.module.min.js
* **TTFLoader** Require opentype available at three/examples/js/libs/opentype.min.js
* **TimelinerController** Require Timeliner available at three/examples/js/libs/timeliner_gui.min.js
#### Redirected Files ####
**All JSM files are mapped to their counter-part under sources folders except**
| Filename | New Location |
|------------------------|---------------------------------------|
| ConvexObjectBreaker | 'modifiers/ConvexObjectBreaker.js' |
| Curve | 'curves/Curve.js' |
| Earcut | 'misc/Earcut.js' |
| GPUComputationRenderer | 'renderers/GPUComputationRenderer.js' |
| Gyroscope | 'objects/Gyroscope.js' |
| ImageUtils | 'utils/ImageUtils.js' |
| MD2Character | 'objects/MD2Character.js' |
| MD2CharacterComplex | 'objects/MD2CharacterComplex.js' |
| MorphAnimMesh | 'objects/MorphAnimMesh.js' |
| MorphBlendMesh | 'objects/MorphBlendMesh.js' |
| Ocean | 'objects/Ocean.js' |
| PMREMGenerator | 'utils/PMREMGenerator.js' |
| RollerCoaster | 'objects/RollerCoaster.js' |
| ShapeUtils | 'utils/ShapeUtils.js' |
| VolumeSlice | 'audio/VolumeSlice.js' |
| WebGL | 'helpers/WebGL.js' |
#### Change log ####
##### 28.0.2:
* Fix WebGLShadowMap missing imports
##### 28.0.1:
* Fix banner deprecation warning
* Fix OBJLoader2Worker management
* Ignore XRControllerModelFactory
* Fix missing motion-controllers lib copy
* Fix multi-imports override from external file
##### 28.0.0:
* Support of Three r113.2
* Ignore experimental jsm folder
* Add eslint fix about StandardNode
* Fix SVGLoader imports
* Fix TypedArrayUtils imports
* Fix WebGLPrograms imports
##### 27.0.0:
* Support of Three r112.1
* Better redirection of TS files
* Add PMREMGenerator
* Add ShaderChunk light toon
* Add ShaderLib mesh toon
* Move WebXRManager into webxr folder
##### 26.0.0:
* Support of Three r111.0
* Remove OutlineEffect edgecase
* Remove LegacyGLTFLoader
* Remove LegacyJSONLoader
* Remove PaintViveController
* Remove ViveController
* Remove DaydreamController
* Remove GearVRController
##### 25.0.0:
* Support of Three r110.0
* Remove AssimpJSONLoader
* Remove EquirectangularToCubeGenerator
* Remove SoftwareRenderer
* Remove WebGL2Renderer
##### 24.0.0:
* Support of Three r109.0
* Add InstancedMesh
* Add WebGLMultiviewRenderTarget
* Add WebGLMultiview
* Remove EditorControls
* Remove OrthographicTrackballControls
* Remove AWDLoader
* Remove BabylonLoader
* Remove PlayCanvasLoader
##### 23.0.1:
* Fix missing branch merge
##### 23.0.0:
* Support of Three r108.0
* Add missing imports to WebGLPrograms
* Add missing libs folder
* Add PointLightShadow
* Add some ShaderChunk
* Add VSM shader
##### 22.0.0:
* Support of Three r107.0
* Fix FBXLoader imports
* Fix TypedArrayUtils imports
* Fix WebGL declaration
* Fix WebVR declaration
##### 21.0.0:
* Support of Three r106.2
* Ignore VRMLLoader due to incompatible AMD dependencies
* Add RectAreaLightUniformsLib
* Add CarControls
* Add MathNode
* Add GodRayShader
* Add OceanShader
* Add SkinShader
* Add TerrainShader
* Add ToonShader
* Add TranslucentShader
* Fix DRACOExporter name
* Fix ObjectLoader curves imports
* Fix TextureCubeUVNode imports
##### 20.0.0:
* Support of Three r105.2
* Add special treatment for HelioWebXRPolyfill
* Update Pass patch
* Add BasisTextureLoader
* Fix Lut export
* Fix NodeMaterialLoader export
* Fix SMAAShader export
* Fix WebGLDeferredRenderer export
##### 19.0.0:
* Support of Three r104
* Add LightProbeHelper
* Add AmbientLightProbe
* Add HemisphereLightProbe
* Add LightProbe
* Add LightProbeGenerator
* Add SphericalHarmonics3
##### 18.0.0:
* Support of Three r103
* Add DracoExporter
* Add LWOLoader
* Add DataTexture2DArray
* Move ImageUtils into utils folder
* Reintroduce ParametricGeometries
* Allow to remove exports from config file using negation
##### 17.2.0:
* Auto generate unit test files for karma and html
* Fix DRACOLoader, NormalNode, , Loader, Material naming (internal $1)
* Export EquirectangularToCubeGenerator
* Export cloneUniforms and mergeUniforms from UniformsUtils
* Unexport HDRLoader (Use RGBELoader instead)
##### 17.1.0:
* Add unit tests about the usability of each Three class
* Add new npm script 'test' to run unit under karma server
* Add new gulp tasks to auto-generate unit tests
* Generate an HTML report after 'npm run test'
##### 17.0.0:
* Support of Three r102
##### 16.0.1:
* Fix missing core folder due to NPM v6.8.0 [bug](https://npm.community/t/npm-pack-leaving-out-files-6-8-0-only/5382)
##### 16.0.0:
* Support of Three r101
* Add patch in BufferGeometryUtils againt for...of loop
##### 15.0.0:
* Support of Three r100
* Ignore ldraw folder
##### 14.0.0:
* Support of Three r99
* Allow new glsl support
##### 13.0.0:
* Support of Three r98
* Some trouble could come from LoaderSupport using eval (/!\)
* Ignore offscreen folder
##### 12.0.0:
* Support of Three r97
* Add cleaning step before right source files ( Remove extra blank lines and semi-colons)
* Remove some useless patch about Nodes
* Use new WebGL lib instead of Detector
##### 11.3.3:
* Fix warning for cjs build onky in debug mode and improve window global check
##### 11.3.2:
* Fix global window declaration for cjs build usage (again)
##### 11.3.1:
* Fix global window declaration for cjs build usage
##### 11.3.0:
* Fix ObjLoader2 worker code
* Build tests under a gulp task
* Allow to lint tests files
##### 11.2.0:
* Add banner management over all sources files to avoid PR on sources that are converted
##### 11.1.1:
* Fix SkeletonUtils eslint bug using replacements edge case
##### 11.1.0:
* Sources files are now linted
##### 11.0.0:
* Support of Three r96
* Update edgecase replacement for LoaderSupport
##### 10.0.0:
* Support of Three r95
* Use a generator function that iterate over all files under sources and create the rollup config to build them separatly
* Fix missing LoaderUtils import in OBJLoader2
* Fix missing TextureCubeNode import in NodeBuilder
* Fix missing _Math import in Node
* Fix missing BufferGeometryUtils import in GLTFLoader
* Fix missing BokehDepthShader import in CinematicCamera
* Fix missing UniformsUtils and HalftoneShader import in HalftonePass
* Fix missing UniformsUtils and AfterimageShader import in AfterimagePass
* Fix missing Uint8BufferAttribute, Int8BufferAttribute, Int16BufferAttribute, Int32BufferAttribute and Float32BufferAttribute import in DRACOLoader
* Ignore Nodes and THREE.Nodes intermediary files
* Move ShaderTranslucent in shader folder
##### 9.0.0:
* Support of Three r94
##### 8.0.0:
* Support of Three r93
##### 7.0.0:
* Support of Three r92
##### 6.0.0:
* Support of Three r91
* Fix DefaultLoadingManager import in OBJLoader2
* Fix ShaderLib, UniformsLib, and UniformsUtils imports in LineMaterial
* Fix DefaultLoadingManager, Uint16BufferAttribute and Uint32BufferAttribute imports in DRACOLoader
* Remove fix-camera-node task due to threejs fix
##### 5.0.7:
* Fix missings PropertyBinding imports in FBXLoader
* Fix missings PropertyBinding imports in GLTFExporter
* Fix missings AnimationClip imports in MorphAnimMesh
* Fix missings AnimationClip imports in MD2Loader
* Fix missings _Math imports in SoftwareRenderer
* Fix missings CameraNode imports in NodeMaterialLoader
* Fix missings Interpolant imports in MMDLoader
* Remove unnecessary _Math imports
##### 5.0.6:
* Add a window global variable check to avoid crach under nodejs
##### 5.0.5:
* Change default entry for main and module in package
##### 5.0.4:
* Fix #18, OBJLoader2 worker code
##### 5.0.3:
* Fix missings Geometries imports in ObjectLoader
* Fix missings Materials imports in LoaderMaterial
* Fix missings Curves imports in CurvePath
##### 5.0.2 (Thanks to Marc Bartels):
* Fix missings Loader imports in GLTFLoader
* Fix invalid module.export stuff inside Detector
##### 5.0.1 :
* Reintroduce LineSegment fix
##### 5.0.0 :
* Support of Three r90
* Move the example folder tree to source */!\ In case you're using direct source import, please check the '([Redirected Files](#redirectedFiles))' part*
* Fix Math (instead of _Math) issue
* Fix missings imports/exports
* Reintroduce RollerCoaster stuff
##### 4.2.4 :
* Fix Line/LineSegments circular dependency
( Be aware: Line constructor don't return LineSegments in case of wrong arguments, and log an error instead of a warning )
##### 4.2.3 :
* Fix Detector module.export code snippet
##### 4.2.2 :
* README.md fix wrong copy/paste
##### 4.2.1 :
* Ignore some dev files for npm
##### 4.2.0 :
* Change main entry point of package to Three.es.js
##### 4.1.1 :
* Fix NodeLib circular dependency with FunctionNode
##### 4.1.0 :
* Allow to build es module under production environment
* Fix node warning about unhandled promise rejection
* Fix rollup warning about indent option moved under output options
* Clean up sources
##### 4.0.0 :
* XLoader.js: is now ignored due to AMD module
* Add Earcut, Curves, EXRLoader, GCodeLoader, LoaderUtils
* Remove KeyframeTrackConstructor, KeyframeTrackPrototype, PathPrototype and ImageUtils
* Update imports statements
##### 3.0.0 :
* Cloth.js: is remove due to bad usage of global variable from his html example file
* Add two new fix for three package in CameraNode and NodeLib
* Fix almost all missings imports statements
* Note:
- MMDExporter and MMDLoader need external dependency from https://github.com/takahirox/mmd-parser
- FBXLoader and VTKLoader need external dependency from https://github.com/imaya/zlib.js
- TTFLoader need external dependency from https://github.com/nodebox/opentype.js
##### 2.2.0 :
* Add tests about every file to check their imports
##### 2.1.1 :
* Fix missing import statement in ShaderPass
##### 2.1.0 :
* Export and import statement support multilines
##### 2.0.0 :
* Support Three.js r88
* Reintroduce ColladaLoader in available modules
* Refactor the convert pipeline
[license-badge]: https://img.shields.io/npm/l/three.svg
[license-badge-url]: ./LICENSE.md
================================================
FILE: builds/Three.amd.js
================================================
// Made by Itee (https://github.com/Itee) with ES6 Convertor script
console.warn('[ThreeFull]: I am glad to annonce since Three release his examples files under JSM folder, this repository should be avoided. The first goal of this repository was to provided an alternative solution during this migration. From now, please consider to use Three.module.js instead even if i maintain this repository for my personal usage. Thanks for all ! Itee...');
define(['exports'], function (exports) { 'use strict';
// Polyfills
if ( Number.EPSILON === undefined ) {
Number.EPSILON = Math.pow( 2, - 52 );
}
if ( Number.isInteger === undefined ) {
// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Number.isInteger = function ( value ) {
return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;
};
}
//
if ( Math.sign === undefined ) {
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign
Math.sign = function ( x ) {
return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;
};
}
if ( 'name' in Function.prototype === false ) {
// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name
Object.defineProperty( Function.prototype, 'name', {
get: function () {
return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ];
}
} );
}
if ( Object.assign === undefined ) {
// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Object.assign = function ( target ) {
var arguments$1 = arguments;
if ( target === undefined || target === null ) {
throw new TypeError( 'Cannot convert undefined or null to object' );
}
var output = Object( target );
for ( var index = 1; index < arguments.length; index ++ ) {
var source = arguments$1[ index ];
if ( source !== undefined && source !== null ) {
for ( var nextKey in source ) {
if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {
output[ nextKey ] = source[ nextKey ];
}
}
}
}
return output;
};
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author tschw
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/
var AnimationUtils = {
// same as Array.prototype.slice, but also works on typed arrays
arraySlice: function ( array, from, to ) {
if ( AnimationUtils.isTypedArray( array ) ) {
// in ios9 array.subarray(from, undefined) will return empty array
// but array.subarray(from) or array.subarray(from, len) is correct
return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );
}
return array.slice( from, to );
},
// converts an array to a specific type
convertArray: function ( array, type, forceClone ) {
if ( ! array || // let 'undefined' and 'null' pass
! forceClone && array.constructor === type ) { return array; }
if ( typeof type.BYTES_PER_ELEMENT === 'number' ) {
return new type( array ); // create typed array
}
return Array.prototype.slice.call( array ); // create Array
},
isTypedArray: function ( object ) {
return ArrayBuffer.isView( object ) &&
! ( object instanceof DataView );
},
// returns an array by which times and values can be sorted
getKeyframeOrder: function ( times ) {
function compareTime( i, j ) {
return times[ i ] - times[ j ];
}
var n = times.length;
var result = new Array( n );
for ( var i = 0; i !== n; ++ i ) { result[ i ] = i; }
result.sort( compareTime );
return result;
},
// uses the array previously returned by 'getKeyframeOrder' to sort data
sortedArray: function ( values, stride, order ) {
var nValues = values.length;
var result = new values.constructor( nValues );
for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {
var srcOffset = order[ i ] * stride;
for ( var j = 0; j !== stride; ++ j ) {
result[ dstOffset ++ ] = values[ srcOffset + j ];
}
}
return result;
},
// function for parsing AOS keyframe formats
flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {
var i = 1, key = jsonKeys[ 0 ];
while ( key !== undefined && key[ valuePropertyName ] === undefined ) {
key = jsonKeys[ i ++ ];
}
if ( key === undefined ) { return; } // no data
var value = key[ valuePropertyName ];
if ( value === undefined ) { return; } // no data
if ( Array.isArray( value ) ) {
do {
value = key[ valuePropertyName ];
if ( value !== undefined ) {
times.push( key.time );
values.push.apply( values, value ); // push all elements
}
key = jsonKeys[ i ++ ];
} while ( key !== undefined );
} else if ( value.toArray !== undefined ) {
// ...assume Math-ish
do {
value = key[ valuePropertyName ];
if ( value !== undefined ) {
times.push( key.time );
value.toArray( values, values.length );
}
key = jsonKeys[ i ++ ];
} while ( key !== undefined );
} else {
// otherwise push as-is
do {
value = key[ valuePropertyName ];
if ( value !== undefined ) {
times.push( key.time );
values.push( value );
}
key = jsonKeys[ i ++ ];
} while ( key !== undefined );
}
},
subclip: function ( sourceClip, name, startFrame, endFrame, fps ) {
fps = fps || 30;
var clip = sourceClip.clone();
clip.name = name;
var tracks = [];
for ( var i = 0; i < clip.tracks.length; ++ i ) {
var track = clip.tracks[ i ];
var valueSize = track.getValueSize();
var times = [];
var values = [];
for ( var j = 0; j < track.times.length; ++ j ) {
var frame = track.times[ j ] * fps;
if ( frame < startFrame || frame >= endFrame ) { continue; }
times.push( track.times[ j ] );
for ( var k = 0; k < valueSize; ++ k ) {
values.push( track.values[ j * valueSize + k ] );
}
}
if ( times.length === 0 ) { continue; }
track.times = AnimationUtils.convertArray( times, track.times.constructor );
track.values = AnimationUtils.convertArray( values, track.values.constructor );
tracks.push( track );
}
clip.tracks = tracks;
// find minimum .times value across all tracks in the trimmed clip
var minStartTime = Infinity;
for ( var i = 0; i < clip.tracks.length; ++ i ) {
if ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {
minStartTime = clip.tracks[ i ].times[ 0 ];
}
}
// shift all tracks such that clip begins at t=0
for ( var i = 0; i < clip.tracks.length; ++ i ) {
clip.tracks[ i ].shift( - 1 * minStartTime );
}
clip.resetDuration();
return clip;
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var REVISION = '113';
var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };
var TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };
var CullFaceNone = 0;
var CullFaceBack = 1;
var CullFaceFront = 2;
var CullFaceFrontBack = 3;
var FrontFaceDirectionCW = 0;
var FrontFaceDirectionCCW = 1;
var BasicShadowMap = 0;
var PCFShadowMap = 1;
var PCFSoftShadowMap = 2;
var VSMShadowMap = 3;
var FrontSide = 0;
var BackSide = 1;
var DoubleSide = 2;
var FlatShading = 1;
var SmoothShading = 2;
var NoColors = 0;
var FaceColors = 1;
var VertexColors = 2;
var NoBlending = 0;
var NormalBlending = 1;
var AdditiveBlending = 2;
var SubtractiveBlending = 3;
var MultiplyBlending = 4;
var CustomBlending = 5;
var AddEquation = 100;
var SubtractEquation = 101;
var ReverseSubtractEquation = 102;
var MinEquation = 103;
var MaxEquation = 104;
var ZeroFactor = 200;
var OneFactor = 201;
var SrcColorFactor = 202;
var OneMinusSrcColorFactor = 203;
var SrcAlphaFactor = 204;
var OneMinusSrcAlphaFactor = 205;
var DstAlphaFactor = 206;
var OneMinusDstAlphaFactor = 207;
var DstColorFactor = 208;
var OneMinusDstColorFactor = 209;
var SrcAlphaSaturateFactor = 210;
var NeverDepth = 0;
var AlwaysDepth = 1;
var LessDepth = 2;
var LessEqualDepth = 3;
var EqualDepth = 4;
var GreaterEqualDepth = 5;
var GreaterDepth = 6;
var NotEqualDepth = 7;
var MultiplyOperation = 0;
var MixOperation = 1;
var AddOperation = 2;
var NoToneMapping = 0;
var LinearToneMapping = 1;
var ReinhardToneMapping = 2;
var Uncharted2ToneMapping = 3;
var CineonToneMapping = 4;
var ACESFilmicToneMapping = 5;
var UVMapping = 300;
var CubeReflectionMapping = 301;
var CubeRefractionMapping = 302;
var EquirectangularReflectionMapping = 303;
var EquirectangularRefractionMapping = 304;
var SphericalReflectionMapping = 305;
var CubeUVReflectionMapping = 306;
var CubeUVRefractionMapping = 307;
var RepeatWrapping = 1000;
var ClampToEdgeWrapping = 1001;
var MirroredRepeatWrapping = 1002;
var NearestFilter = 1003;
var NearestMipmapNearestFilter = 1004;
var NearestMipMapNearestFilter = 1004;
var NearestMipmapLinearFilter = 1005;
var NearestMipMapLinearFilter = 1005;
var LinearFilter = 1006;
var LinearMipmapNearestFilter = 1007;
var LinearMipMapNearestFilter = 1007;
var LinearMipmapLinearFilter = 1008;
var LinearMipMapLinearFilter = 1008;
var UnsignedByteType = 1009;
var ByteType = 1010;
var ShortType = 1011;
var UnsignedShortType = 1012;
var IntType = 1013;
var UnsignedIntType = 1014;
var FloatType = 1015;
var HalfFloatType = 1016;
var UnsignedShort4444Type = 1017;
var UnsignedShort5551Type = 1018;
var UnsignedShort565Type = 1019;
var UnsignedInt248Type = 1020;
var AlphaFormat = 1021;
var RGBFormat = 1022;
var RGBAFormat = 1023;
var LuminanceFormat = 1024;
var LuminanceAlphaFormat = 1025;
var RGBEFormat = RGBAFormat;
var DepthFormat = 1026;
var DepthStencilFormat = 1027;
var RedFormat = 1028;
var RedIntegerFormat = 1029;
var RGFormat = 1030;
var RGIntegerFormat = 1031;
var RGBIntegerFormat = 1032;
var RGBAIntegerFormat = 1033;
var RGB_S3TC_DXT1_Format = 33776;
var RGBA_S3TC_DXT1_Format = 33777;
var RGBA_S3TC_DXT3_Format = 33778;
var RGBA_S3TC_DXT5_Format = 33779;
var RGB_PVRTC_4BPPV1_Format = 35840;
var RGB_PVRTC_2BPPV1_Format = 35841;
var RGBA_PVRTC_4BPPV1_Format = 35842;
var RGBA_PVRTC_2BPPV1_Format = 35843;
var RGB_ETC1_Format = 36196;
var RGBA_ASTC_4x4_Format = 37808;
var RGBA_ASTC_5x4_Format = 37809;
var RGBA_ASTC_5x5_Format = 37810;
var RGBA_ASTC_6x5_Format = 37811;
var RGBA_ASTC_6x6_Format = 37812;
var RGBA_ASTC_8x5_Format = 37813;
var RGBA_ASTC_8x6_Format = 37814;
var RGBA_ASTC_8x8_Format = 37815;
var RGBA_ASTC_10x5_Format = 37816;
var RGBA_ASTC_10x6_Format = 37817;
var RGBA_ASTC_10x8_Format = 37818;
var RGBA_ASTC_10x10_Format = 37819;
var RGBA_ASTC_12x10_Format = 37820;
var RGBA_ASTC_12x12_Format = 37821;
var LoopOnce = 2200;
var LoopRepeat = 2201;
var LoopPingPong = 2202;
var InterpolateDiscrete = 2300;
var InterpolateLinear = 2301;
var InterpolateSmooth = 2302;
var ZeroCurvatureEnding = 2400;
var ZeroSlopeEnding = 2401;
var WrapAroundEnding = 2402;
var TrianglesDrawMode = 0;
var TriangleStripDrawMode = 1;
var TriangleFanDrawMode = 2;
var LinearEncoding = 3000;
var sRGBEncoding = 3001;
var GammaEncoding = 3007;
var RGBEEncoding = 3002;
var LogLuvEncoding = 3003;
var RGBM7Encoding = 3004;
var RGBM16Encoding = 3005;
var RGBDEncoding = 3006;
var BasicDepthPacking = 3200;
var RGBADepthPacking = 3201;
var TangentSpaceNormalMap = 0;
var ObjectSpaceNormalMap = 1;
var ZeroStencilOp = 0;
var KeepStencilOp = 7680;
var ReplaceStencilOp = 7681;
var IncrementStencilOp = 7682;
var DecrementStencilOp = 7683;
var IncrementWrapStencilOp = 34055;
var DecrementWrapStencilOp = 34056;
var InvertStencilOp = 5386;
var NeverStencilFunc = 512;
var LessStencilFunc = 513;
var EqualStencilFunc = 514;
var LessEqualStencilFunc = 515;
var GreaterStencilFunc = 516;
var NotEqualStencilFunc = 517;
var GreaterEqualStencilFunc = 518;
var AlwaysStencilFunc = 519;
var StaticDrawUsage = 35044;
var DynamicDrawUsage = 35048;
var StreamDrawUsage = 35040;
var StaticReadUsage = 35045;
var DynamicReadUsage = 35049;
var StreamReadUsage = 35041;
var StaticCopyUsage = 35046;
var DynamicCopyUsage = 35050;
var StreamCopyUsage = 35042;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Abstract base class of interpolants over parametric samples.
*
* The parameter domain is one dimensional, typically the time or a path
* along a curve defined by the data.
*
* The sample values can have any dimensionality and derived classes may
* apply special interpretations to the data.
*
* This class provides the interval seek in a Template Method, deferring
* the actual interpolation to derived classes.
*
* Time complexity is O(1) for linear access crossing at most two points
* and O(log N) for random access, where N is the number of positions.
*
* References:
*
* http://www.oodesign.com/template-method-pattern.html
*
* @author tschw
*/
function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
this.parameterPositions = parameterPositions;
this._cachedIndex = 0;
this.resultBuffer = resultBuffer !== undefined ?
resultBuffer : new sampleValues.constructor( sampleSize );
this.sampleValues = sampleValues;
this.valueSize = sampleSize;
}
Object.assign( Interpolant.prototype, {
evaluate: function ( t ) {
var pp = this.parameterPositions,
i1 = this._cachedIndex,
t1 = pp[ i1 ],
t0 = pp[ i1 - 1 ];
validate_interval: {
seek: {
var right;
linear_scan: {
//- See http://jsperf.com/comparison-to-undefined/3
//- slower code:
//-
//- if ( t >= t1 || t1 === undefined ) {
forward_scan: if ( ! ( t < t1 ) ) {
for ( var giveUpAt = i1 + 2; ; ) {
if ( t1 === undefined ) {
if ( t < t0 ) { break forward_scan; }
// after end
i1 = pp.length;
this._cachedIndex = i1;
return this.afterEnd_( i1 - 1, t, t0 );
}
if ( i1 === giveUpAt ) { break; } // this loop
t0 = t1;
t1 = pp[ ++ i1 ];
if ( t < t1 ) {
// we have arrived at the sought interval
break seek;
}
}
// prepare binary search on the right side of the index
right = pp.length;
break linear_scan;
}
//- slower code:
//- if ( t < t0 || t0 === undefined ) {
if ( ! ( t >= t0 ) ) {
// looping?
var t1global = pp[ 1 ];
if ( t < t1global ) {
i1 = 2; // + 1, using the scan for the details
t0 = t1global;
}
// linear reverse scan
for ( var giveUpAt = i1 - 2; ; ) {
if ( t0 === undefined ) {
// before start
this._cachedIndex = 0;
return this.beforeStart_( 0, t, t1 );
}
if ( i1 === giveUpAt ) { break; } // this loop
t1 = t0;
t0 = pp[ -- i1 - 1 ];
if ( t >= t0 ) {
// we have arrived at the sought interval
break seek;
}
}
// prepare binary search on the left side of the index
right = i1;
i1 = 0;
break linear_scan;
}
// the interval is valid
break validate_interval;
} // linear scan
// binary search
while ( i1 < right ) {
var mid = ( i1 + right ) >>> 1;
if ( t < pp[ mid ] ) {
right = mid;
} else {
i1 = mid + 1;
}
}
t1 = pp[ i1 ];
t0 = pp[ i1 - 1 ];
// check boundary cases, again
if ( t0 === undefined ) {
this._cachedIndex = 0;
return this.beforeStart_( 0, t, t1 );
}
if ( t1 === undefined ) {
i1 = pp.length;
this._cachedIndex = i1;
return this.afterEnd_( i1 - 1, t0, t );
}
} // seek
this._cachedIndex = i1;
this.intervalChanged_( i1, t0, t1 );
} // validate_interval
return this.interpolate_( i1, t0, t, t1 );
},
settings: null, // optional, subclass-specific settings structure
// Note: The indirection allows central control of many interpolants.
// --- Protected interface
DefaultSettings_: {},
getSettings_: function () {
return this.settings || this.DefaultSettings_;
},
copySampleValue_: function ( index ) {
// copies a sample value to the result buffer
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
offset = index * stride;
for ( var i = 0; i !== stride; ++ i ) {
result[ i ] = values[ offset + i ];
}
return result;
},
// Template methods for derived classes:
interpolate_: function ( /* i1, t0, t, t1 */ ) {
throw new Error( 'call to abstract method' );
// implementations shall return this.resultBuffer
},
intervalChanged_: function ( /* i1, t0, t1 */ ) {
// empty
}
} );
//!\ DECLARE ALIAS AFTER assign prototype !
Object.assign( Interpolant.prototype, {
//( 0, t, t0 ), returns this.resultBuffer
beforeStart_: Interpolant.prototype.copySampleValue_,
//( N-1, tN-1, t ), returns this.resultBuffer
afterEnd_: Interpolant.prototype.copySampleValue_,
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Fast and simple cubic spline interpolant.
*
* It was derived from a Hermitian construction setting the first derivative
* at each sample position to the linear slope between neighboring positions
* over their parameter interval.
*
* @author tschw
*/
function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
this._weightPrev = - 0;
this._offsetPrev = - 0;
this._weightNext = - 0;
this._offsetNext = - 0;
}
CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: CubicInterpolant,
DefaultSettings_: {
endingStart: ZeroCurvatureEnding,
endingEnd: ZeroCurvatureEnding
},
intervalChanged_: function ( i1, t0, t1 ) {
var pp = this.parameterPositions,
iPrev = i1 - 2,
iNext = i1 + 1,
tPrev = pp[ iPrev ],
tNext = pp[ iNext ];
if ( tPrev === undefined ) {
switch ( this.getSettings_().endingStart ) {
case ZeroSlopeEnding:
// f'(t0) = 0
iPrev = i1;
tPrev = 2 * t0 - t1;
break;
case WrapAroundEnding:
// use the other end of the curve
iPrev = pp.length - 2;
tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];
break;
default: // ZeroCurvatureEnding
// f''(t0) = 0 a.k.a. Natural Spline
iPrev = i1;
tPrev = t1;
}
}
if ( tNext === undefined ) {
switch ( this.getSettings_().endingEnd ) {
case ZeroSlopeEnding:
// f'(tN) = 0
iNext = i1;
tNext = 2 * t1 - t0;
break;
case WrapAroundEnding:
// use the other end of the curve
iNext = 1;
tNext = t1 + pp[ 1 ] - pp[ 0 ];
break;
default: // ZeroCurvatureEnding
// f''(tN) = 0, a.k.a. Natural Spline
iNext = i1 - 1;
tNext = t0;
}
}
var halfDt = ( t1 - t0 ) * 0.5,
stride = this.valueSize;
this._weightPrev = halfDt / ( t0 - tPrev );
this._weightNext = halfDt / ( tNext - t1 );
this._offsetPrev = iPrev * stride;
this._offsetNext = iNext * stride;
},
interpolate_: function ( i1, t0, t, t1 ) {
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
o1 = i1 * stride, o0 = o1 - stride,
oP = this._offsetPrev, oN = this._offsetNext,
wP = this._weightPrev, wN = this._weightNext,
p = ( t - t0 ) / ( t1 - t0 ),
pp = p * p,
ppp = pp * p;
// evaluate polynomials
var sP = - wP * ppp + 2 * wP * pp - wP * p;
var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;
var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;
var sN = wN * ppp - wN * pp;
// combine data linearly
for ( var i = 0; i !== stride; ++ i ) {
result[ i ] =
sP * values[ oP + i ] +
s0 * values[ o0 + i ] +
s1 * values[ o1 + i ] +
sN * values[ oN + i ];
}
return result;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author tschw
*/
function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
}
LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: LinearInterpolant,
interpolate_: function ( i1, t0, t, t1 ) {
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
offset1 = i1 * stride,
offset0 = offset1 - stride,
weight1 = ( t - t0 ) / ( t1 - t0 ),
weight0 = 1 - weight1;
for ( var i = 0; i !== stride; ++ i ) {
result[ i ] =
values[ offset0 + i ] * weight0 +
values[ offset1 + i ] * weight1;
}
return result;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* Interpolant that evaluates to the sample value at the position preceeding
* the parameter.
*
* @author tschw
*/
function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
}
DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: DiscreteInterpolant,
interpolate_: function ( i1 /*, t0, t, t1 */ ) {
return this.copySampleValue_( i1 - 1 );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* A timed sequence of keyframes for a specific property.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function KeyframeTrack( name, times, values, interpolation ) {
if ( name === undefined ) { throw new Error( 'KeyframeTrack: track name is undefined' ); }
if ( times === undefined || times.length === 0 ) { throw new Error( 'KeyframeTrack: no keyframes in track named ' + name ); }
this.name = name;
this.times = AnimationUtils.convertArray( times, this.TimeBufferType );
this.values = AnimationUtils.convertArray( values, this.ValueBufferType );
this.setInterpolation( interpolation || this.DefaultInterpolation );
}
// Static methods
Object.assign( KeyframeTrack, {
// Serialization (in static context, because of constructor invocation
// and automatic invocation of .toJSON):
toJSON: function ( track ) {
var trackType = track.constructor;
var json;
// derived classes can define a static toJSON method
if ( trackType.toJSON !== undefined ) {
json = trackType.toJSON( track );
} else {
// by default, we assume the data can be serialized as-is
json = {
'name': track.name,
'times': AnimationUtils.convertArray( track.times, Array ),
'values': AnimationUtils.convertArray( track.values, Array )
};
var interpolation = track.getInterpolation();
if ( interpolation !== track.DefaultInterpolation ) {
json.interpolation = interpolation;
}
}
json.type = track.ValueTypeName; // mandatory
return json;
}
} );
Object.assign( KeyframeTrack.prototype, {
constructor: KeyframeTrack,
TimeBufferType: Float32Array,
ValueBufferType: Float32Array,
DefaultInterpolation: InterpolateLinear,
InterpolantFactoryMethodDiscrete: function ( result ) {
return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );
},
InterpolantFactoryMethodLinear: function ( result ) {
return new LinearInterpolant( this.times, this.values, this.getValueSize(), result );
},
InterpolantFactoryMethodSmooth: function ( result ) {
return new CubicInterpolant( this.times, this.values, this.getValueSize(), result );
},
setInterpolation: function ( interpolation ) {
var factoryMethod;
switch ( interpolation ) {
case InterpolateDiscrete:
factoryMethod = this.InterpolantFactoryMethodDiscrete;
break;
case InterpolateLinear:
factoryMethod = this.InterpolantFactoryMethodLinear;
break;
case InterpolateSmooth:
factoryMethod = this.InterpolantFactoryMethodSmooth;
break;
}
if ( factoryMethod === undefined ) {
var message = "unsupported interpolation for " +
this.ValueTypeName + " keyframe track named " + this.name;
if ( this.createInterpolant === undefined ) {
// fall back to default, unless the default itself is messed up
if ( interpolation !== this.DefaultInterpolation ) {
this.setInterpolation( this.DefaultInterpolation );
} else {
throw new Error( message ); // fatal, in this case
}
}
console.warn( 'KeyframeTrack:', message );
return this;
}
this.createInterpolant = factoryMethod;
return this;
},
getInterpolation: function () {
switch ( this.createInterpolant ) {
case this.InterpolantFactoryMethodDiscrete:
return InterpolateDiscrete;
case this.InterpolantFactoryMethodLinear:
return InterpolateLinear;
case this.InterpolantFactoryMethodSmooth:
return InterpolateSmooth;
}
},
getValueSize: function () {
return this.values.length / this.times.length;
},
// move all keyframes either forwards or backwards in time
shift: function ( timeOffset ) {
if ( timeOffset !== 0.0 ) {
var times = this.times;
for ( var i = 0, n = times.length; i !== n; ++ i ) {
times[ i ] += timeOffset;
}
}
return this;
},
// scale all keyframe times by a factor (useful for frame <-> seconds conversions)
scale: function ( timeScale ) {
if ( timeScale !== 1.0 ) {
var times = this.times;
for ( var i = 0, n = times.length; i !== n; ++ i ) {
times[ i ] *= timeScale;
}
}
return this;
},
// removes keyframes before and after animation without changing any values within the range [startTime, endTime].
// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values
trim: function ( startTime, endTime ) {
var times = this.times,
nKeys = times.length,
from = 0,
to = nKeys - 1;
while ( from !== nKeys && times[ from ] < startTime ) {
++ from;
}
while ( to !== - 1 && times[ to ] > endTime ) {
-- to;
}
++ to; // inclusive -> exclusive bound
if ( from !== 0 || to !== nKeys ) {
// empty tracks are forbidden, so keep at least one keyframe
if ( from >= to ) { to = Math.max( to, 1 ), from = to - 1; }
var stride = this.getValueSize();
this.times = AnimationUtils.arraySlice( times, from, to );
this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );
}
return this;
},
// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable
validate: function () {
var valid = true;
var valueSize = this.getValueSize();
if ( valueSize - Math.floor( valueSize ) !== 0 ) {
console.error( 'KeyframeTrack: Invalid value size in track.', this );
valid = false;
}
var times = this.times,
values = this.values,
nKeys = times.length;
if ( nKeys === 0 ) {
console.error( 'KeyframeTrack: Track is empty.', this );
valid = false;
}
var prevTime = null;
for ( var i = 0; i !== nKeys; i ++ ) {
var currTime = times[ i ];
if ( typeof currTime === 'number' && isNaN( currTime ) ) {
console.error( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );
valid = false;
break;
}
if ( prevTime !== null && prevTime > currTime ) {
console.error( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );
valid = false;
break;
}
prevTime = currTime;
}
if ( values !== undefined ) {
if ( AnimationUtils.isTypedArray( values ) ) {
for ( var i = 0, n = values.length; i !== n; ++ i ) {
var value = values[ i ];
if ( isNaN( value ) ) {
console.error( 'KeyframeTrack: Value is not a valid number.', this, i, value );
valid = false;
break;
}
}
}
}
return valid;
},
// removes equivalent sequential keys as common in morph target sequences
// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)
optimize: function () {
// times or values may be shared with other tracks, so overwriting is unsafe
var times = AnimationUtils.arraySlice( this.times ),
values = AnimationUtils.arraySlice( this.values ),
stride = this.getValueSize(),
smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
writeIndex = 1,
lastIndex = times.length - 1;
for ( var i = 1; i < lastIndex; ++ i ) {
var keep = false;
var time = times[ i ];
var timeNext = times[ i + 1 ];
// remove adjacent keyframes scheduled at the same time
if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {
if ( ! smoothInterpolation ) {
// remove unnecessary keyframes same as their neighbors
var offset = i * stride,
offsetP = offset - stride,
offsetN = offset + stride;
for ( var j = 0; j !== stride; ++ j ) {
var value = values[ offset + j ];
if ( value !== values[ offsetP + j ] ||
value !== values[ offsetN + j ] ) {
keep = true;
break;
}
}
} else {
keep = true;
}
}
// in-place compaction
if ( keep ) {
if ( i !== writeIndex ) {
times[ writeIndex ] = times[ i ];
var readOffset = i * stride,
writeOffset = writeIndex * stride;
for ( var j = 0; j !== stride; ++ j ) {
values[ writeOffset + j ] = values[ readOffset + j ];
}
}
++ writeIndex;
}
}
// flush last keyframe (compaction looks ahead)
if ( lastIndex > 0 ) {
times[ writeIndex ] = times[ lastIndex ];
for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {
values[ writeOffset + j ] = values[ readOffset + j ];
}
++ writeIndex;
}
if ( writeIndex !== times.length ) {
this.times = AnimationUtils.arraySlice( times, 0, writeIndex );
this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );
} else {
this.times = times;
this.values = values;
}
return this;
},
clone: function () {
var times = AnimationUtils.arraySlice( this.times, 0 );
var values = AnimationUtils.arraySlice( this.values, 0 );
var TypedKeyframeTrack = this.constructor;
var track = new TypedKeyframeTrack( this.name, times, values );
// Interpolant argument to constructor is not saved, so copy the factory method directly.
track.createInterpolant = this.createInterpolant;
return track;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* A Track of Boolean keyframe values.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function BooleanKeyframeTrack( name, times, values ) {
KeyframeTrack.call( this, name, times, values );
}
BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: BooleanKeyframeTrack,
ValueTypeName: 'bool',
ValueBufferType: Array,
DefaultInterpolation: InterpolateDiscrete,
InterpolantFactoryMethodLinear: undefined,
InterpolantFactoryMethodSmooth: undefined
// Note: Actually this track could have a optimized / compressed
// representation of a single value and a custom interpolant that
// computes "firstValue ^ isOdd( index )".
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* A Track of keyframe values that represent color.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function ColorKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: ColorKeyframeTrack,
ValueTypeName: 'color'
// ValueBufferType is inherited
// DefaultInterpolation is inherited
// Note: Very basic implementation and nothing special yet.
// However, this is the place for color space parameterization.
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* A Track of numeric keyframe values.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function NumberKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: NumberKeyframeTrack,
ValueTypeName: 'number'
// ValueBufferType is inherited
// DefaultInterpolation is inherited
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
* @author thezwap
*/
var _lut = [];
for ( var i = 0; i < 256; i ++ ) {
_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );
}
var MathUtils = {
DEG2RAD: Math.PI / 180,
RAD2DEG: 180 / Math.PI,
generateUUID: function () {
// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
var d0 = Math.random() * 0xffffffff | 0;
var d1 = Math.random() * 0xffffffff | 0;
var d2 = Math.random() * 0xffffffff | 0;
var d3 = Math.random() * 0xffffffff | 0;
var uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +
_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +
_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +
_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];
// .toUpperCase() here flattens concatenated strings to save heap memory space.
return uuid.toUpperCase();
},
clamp: function ( value, min, max ) {
return Math.max( min, Math.min( max, value ) );
},
// compute euclidian modulo of m % n
// https://en.wikipedia.org/wiki/Modulo_operation
euclideanModulo: function ( n, m ) {
return ( ( n % m ) + m ) % m;
},
// Linear mapping from range to range
mapLinear: function ( x, a1, a2, b1, b2 ) {
return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );
},
// https://en.wikipedia.org/wiki/Linear_interpolation
lerp: function ( x, y, t ) {
return ( 1 - t ) * x + t * y;
},
// http://en.wikipedia.org/wiki/Smoothstep
smoothstep: function ( x, min, max ) {
if ( x <= min ) { return 0; }
if ( x >= max ) { return 1; }
x = ( x - min ) / ( max - min );
return x * x * ( 3 - 2 * x );
},
smootherstep: function ( x, min, max ) {
if ( x <= min ) { return 0; }
if ( x >= max ) { return 1; }
x = ( x - min ) / ( max - min );
return x * x * x * ( x * ( x * 6 - 15 ) + 10 );
},
// Random integer from interval
randInt: function ( low, high ) {
return low + Math.floor( Math.random() * ( high - low + 1 ) );
},
// Random float from interval
randFloat: function ( low, high ) {
return low + Math.random() * ( high - low );
},
// Random float from <-range/2, range/2> interval
randFloatSpread: function ( range ) {
return range * ( 0.5 - Math.random() );
},
degToRad: function ( degrees ) {
return degrees * MathUtils.DEG2RAD;
},
radToDeg: function ( radians ) {
return radians * MathUtils.RAD2DEG;
},
isPowerOfTwo: function ( value ) {
return ( value & ( value - 1 ) ) === 0 && value !== 0;
},
ceilPowerOfTwo: function ( value ) {
return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );
},
floorPowerOfTwo: function ( value ) {
return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );
},
setQuaternionFromProperEuler: function ( q, a, b, c, order ) {
// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles
// rotations are applied to the axes in the order specified by 'order'
// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'
// angles are in radians
var cos = Math.cos;
var sin = Math.sin;
var c2 = cos( b / 2 );
var s2 = sin( b / 2 );
var c13 = cos( ( a + c ) / 2 );
var s13 = sin( ( a + c ) / 2 );
var c1_3 = cos( ( a - c ) / 2 );
var s1_3 = sin( ( a - c ) / 2 );
var c3_1 = cos( ( c - a ) / 2 );
var s3_1 = sin( ( c - a ) / 2 );
if ( order === 'XYX' ) {
q.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );
} else if ( order === 'YZY' ) {
q.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );
} else if ( order === 'ZXZ' ) {
q.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );
} else if ( order === 'XZX' ) {
q.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );
} else if ( order === 'YXY' ) {
q.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );
} else if ( order === 'ZYZ' ) {
q.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );
} else {
console.warn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order.' );
}
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/
function Quaternion( x, y, z, w ) {
this._x = x || 0;
this._y = y || 0;
this._z = z || 0;
this._w = ( w !== undefined ) ? w : 1;
}
Object.assign( Quaternion, {
slerp: function ( qa, qb, qm, t ) {
return qm.copy( qa ).slerp( qb, t );
},
slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
// fuzz-free, array-based Quaternion SLERP operation
var x0 = src0[ srcOffset0 + 0 ],
y0 = src0[ srcOffset0 + 1 ],
z0 = src0[ srcOffset0 + 2 ],
w0 = src0[ srcOffset0 + 3 ],
x1 = src1[ srcOffset1 + 0 ],
y1 = src1[ srcOffset1 + 1 ],
z1 = src1[ srcOffset1 + 2 ],
w1 = src1[ srcOffset1 + 3 ];
if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {
var s = 1 - t,
cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
dir = ( cos >= 0 ? 1 : - 1 ),
sqrSin = 1 - cos * cos;
// Skip the Slerp for tiny steps to avoid numeric problems:
if ( sqrSin > Number.EPSILON ) {
var sin = Math.sqrt( sqrSin ),
len = Math.atan2( sin, cos * dir );
s = Math.sin( s * len ) / sin;
t = Math.sin( t * len ) / sin;
}
var tDir = t * dir;
x0 = x0 * s + x1 * tDir;
y0 = y0 * s + y1 * tDir;
z0 = z0 * s + z1 * tDir;
w0 = w0 * s + w1 * tDir;
// Normalize in case we just did a lerp:
if ( s === 1 - t ) {
var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );
x0 *= f;
y0 *= f;
z0 *= f;
w0 *= f;
}
}
dst[ dstOffset ] = x0;
dst[ dstOffset + 1 ] = y0;
dst[ dstOffset + 2 ] = z0;
dst[ dstOffset + 3 ] = w0;
}
} );
Object.defineProperties( Quaternion.prototype, {
x: {
get: function () {
return this._x;
},
set: function ( value ) {
this._x = value;
this._onChangeCallback();
}
},
y: {
get: function () {
return this._y;
},
set: function ( value ) {
this._y = value;
this._onChangeCallback();
}
},
z: {
get: function () {
return this._z;
},
set: function ( value ) {
this._z = value;
this._onChangeCallback();
}
},
w: {
get: function () {
return this._w;
},
set: function ( value ) {
this._w = value;
this._onChangeCallback();
}
}
} );
Object.assign( Quaternion.prototype, {
isQuaternion: true,
set: function ( x, y, z, w ) {
this._x = x;
this._y = y;
this._z = z;
this._w = w;
this._onChangeCallback();
return this;
},
clone: function () {
return new this.constructor( this._x, this._y, this._z, this._w );
},
copy: function ( quaternion ) {
this._x = quaternion.x;
this._y = quaternion.y;
this._z = quaternion.z;
this._w = quaternion.w;
this._onChangeCallback();
return this;
},
setFromEuler: function ( euler, update ) {
if ( ! ( euler && euler.isEuler ) ) {
throw new Error( 'Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );
}
var x = euler._x, y = euler._y, z = euler._z, order = euler.order;
// http://www.mathworks.com/matlabcentral/fileexchange/
// 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
// content/SpinCalc.m
var cos = Math.cos;
var sin = Math.sin;
var c1 = cos( x / 2 );
var c2 = cos( y / 2 );
var c3 = cos( z / 2 );
var s1 = sin( x / 2 );
var s2 = sin( y / 2 );
var s3 = sin( z / 2 );
if ( order === 'XYZ' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'YXZ' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if ( order === 'ZXY' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'ZYX' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if ( order === 'YZX' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'XZY' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
}
if ( update !== false ) { this._onChangeCallback(); }
return this;
},
setFromAxisAngle: function ( axis, angle ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
// assumes axis is normalized
var halfAngle = angle / 2, s = Math.sin( halfAngle );
this._x = axis.x * s;
this._y = axis.y * s;
this._z = axis.z * s;
this._w = Math.cos( halfAngle );
this._onChangeCallback();
return this;
},
setFromRotationMatrix: function ( m ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te = m.elements,
m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],
trace = m11 + m22 + m33,
s;
if ( trace > 0 ) {
s = 0.5 / Math.sqrt( trace + 1.0 );
this._w = 0.25 / s;
this._x = ( m32 - m23 ) * s;
this._y = ( m13 - m31 ) * s;
this._z = ( m21 - m12 ) * s;
} else if ( m11 > m22 && m11 > m33 ) {
s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
this._w = ( m32 - m23 ) / s;
this._x = 0.25 * s;
this._y = ( m12 + m21 ) / s;
this._z = ( m13 + m31 ) / s;
} else if ( m22 > m33 ) {
s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
this._w = ( m13 - m31 ) / s;
this._x = ( m12 + m21 ) / s;
this._y = 0.25 * s;
this._z = ( m23 + m32 ) / s;
} else {
s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
this._w = ( m21 - m12 ) / s;
this._x = ( m13 + m31 ) / s;
this._y = ( m23 + m32 ) / s;
this._z = 0.25 * s;
}
this._onChangeCallback();
return this;
},
setFromUnitVectors: function ( vFrom, vTo ) {
// assumes direction vectors vFrom and vTo are normalized
var EPS = 0.000001;
var r = vFrom.dot( vTo ) + 1;
if ( r < EPS ) {
r = 0;
if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
this._x = - vFrom.y;
this._y = vFrom.x;
this._z = 0;
this._w = r;
} else {
this._x = 0;
this._y = - vFrom.z;
this._z = vFrom.y;
this._w = r;
}
} else {
// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3
this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;
this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;
this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;
this._w = r;
}
return this.normalize();
},
angleTo: function ( q ) {
return 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );
},
rotateTowards: function ( q, step ) {
var angle = this.angleTo( q );
if ( angle === 0 ) { return this; }
var t = Math.min( 1, step / angle );
this.slerp( q, t );
return this;
},
inverse: function () {
// quaternion is assumed to have unit length
return this.conjugate();
},
conjugate: function () {
this._x *= - 1;
this._y *= - 1;
this._z *= - 1;
this._onChangeCallback();
return this;
},
dot: function ( v ) {
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
},
lengthSq: function () {
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
},
length: function () {
return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
},
normalize: function () {
var l = this.length();
if ( l === 0 ) {
this._x = 0;
this._y = 0;
this._z = 0;
this._w = 1;
} else {
l = 1 / l;
this._x = this._x * l;
this._y = this._y * l;
this._z = this._z * l;
this._w = this._w * l;
}
this._onChangeCallback();
return this;
},
multiply: function ( q, p ) {
if ( p !== undefined ) {
console.warn( 'Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
return this.multiplyQuaternions( q, p );
}
return this.multiplyQuaternions( this, q );
},
premultiply: function ( q ) {
return this.multiplyQuaternions( q, this );
},
multiplyQuaternions: function ( a, b ) {
// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
this._onChangeCallback();
return this;
},
slerp: function ( qb, t ) {
if ( t === 0 ) { return this; }
if ( t === 1 ) { return this.copy( qb ); }
var x = this._x, y = this._y, z = this._z, w = this._w;
// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
if ( cosHalfTheta < 0 ) {
this._w = - qb._w;
this._x = - qb._x;
this._y = - qb._y;
this._z = - qb._z;
cosHalfTheta = - cosHalfTheta;
} else {
this.copy( qb );
}
if ( cosHalfTheta >= 1.0 ) {
this._w = w;
this._x = x;
this._y = y;
this._z = z;
return this;
}
var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
if ( sqrSinHalfTheta <= Number.EPSILON ) {
var s = 1 - t;
this._w = s * w + t * this._w;
this._x = s * x + t * this._x;
this._y = s * y + t * this._y;
this._z = s * z + t * this._z;
this.normalize();
this._onChangeCallback();
return this;
}
var sinHalfTheta = Math.sqrt( sqrSinHalfTheta );
var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );
var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
this._w = ( w * ratioA + this._w * ratioB );
this._x = ( x * ratioA + this._x * ratioB );
this._y = ( y * ratioA + this._y * ratioB );
this._z = ( z * ratioA + this._z * ratioB );
this._onChangeCallback();
return this;
},
equals: function ( quaternion ) {
return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) { offset = 0; }
this._x = array[ offset ];
this._y = array[ offset + 1 ];
this._z = array[ offset + 2 ];
this._w = array[ offset + 3 ];
this._onChangeCallback();
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
array[ offset ] = this._x;
array[ offset + 1 ] = this._y;
array[ offset + 2 ] = this._z;
array[ offset + 3 ] = this._w;
return array;
},
_onChange: function ( callback ) {
this._onChangeCallback = callback;
return this;
},
_onChangeCallback: function () {}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Spherical linear unit quaternion interpolant.
*
* @author tschw
*/
function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
}
QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: QuaternionLinearInterpolant,
interpolate_: function ( i1, t0, t, t1 ) {
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
offset = i1 * stride,
alpha = ( t - t0 ) / ( t1 - t0 );
for ( var end = offset + stride; offset !== end; offset += 4 ) {
Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );
}
return result;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* A Track of quaternion keyframe values.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function QuaternionKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: QuaternionKeyframeTrack,
ValueTypeName: 'quaternion',
// ValueBufferType is inherited
DefaultInterpolation: InterpolateLinear,
InterpolantFactoryMethodLinear: function ( result ) {
return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );
},
InterpolantFactoryMethodSmooth: undefined // not yet implemented
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* A Track that interpolates Strings
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function StringKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: StringKeyframeTrack,
ValueTypeName: 'string',
ValueBufferType: Array,
DefaultInterpolation: InterpolateDiscrete,
InterpolantFactoryMethodLinear: undefined,
InterpolantFactoryMethodSmooth: undefined
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* A Track of vectored keyframe values.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function VectorKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: VectorKeyframeTrack,
ValueTypeName: 'vector'
// ValueBufferType is inherited
// DefaultInterpolation is inherited
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* Reusable set of Tracks that represent an animation.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/
function AnimationClip( name, duration, tracks ) {
this.name = name;
this.tracks = tracks;
this.duration = ( duration !== undefined ) ? duration : - 1;
this.uuid = MathUtils.generateUUID();
// this means it should figure out its duration by scanning the tracks
if ( this.duration < 0 ) {
this.resetDuration();
}
}
function getTrackTypeForValueTypeName( typeName ) {
switch ( typeName.toLowerCase() ) {
case 'scalar':
case 'double':
case 'float':
case 'number':
case 'integer':
return NumberKeyframeTrack;
case 'vector':
case 'vector2':
case 'vector3':
case 'vector4':
return VectorKeyframeTrack;
case 'color':
return ColorKeyframeTrack;
case 'quaternion':
return QuaternionKeyframeTrack;
case 'bool':
case 'boolean':
return BooleanKeyframeTrack;
case 'string':
return StringKeyframeTrack;
}
throw new Error( 'KeyframeTrack: Unsupported typeName: ' + typeName );
}
function parseKeyframeTrack( json ) {
if ( json.type === undefined ) {
throw new Error( 'KeyframeTrack: track type undefined, can not parse' );
}
var trackType = getTrackTypeForValueTypeName( json.type );
if ( json.times === undefined ) {
var times = [], values = [];
AnimationUtils.flattenJSON( json.keys, times, values, 'value' );
json.times = times;
json.values = values;
}
// derived classes can define a static parse method
if ( trackType.parse !== undefined ) {
return trackType.parse( json );
} else {
// by default, we assume a constructor compatible with the base
return new trackType( json.name, json.times, json.values, json.interpolation );
}
}
Object.assign( AnimationClip, {
parse: function ( json ) {
var tracks = [],
jsonTracks = json.tracks,
frameTime = 1.0 / ( json.fps || 1.0 );
for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {
tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );
}
return new AnimationClip( json.name, json.duration, tracks );
},
toJSON: function ( clip ) {
var tracks = [],
clipTracks = clip.tracks;
var json = {
'name': clip.name,
'duration': clip.duration,
'tracks': tracks,
'uuid': clip.uuid
};
for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {
tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );
}
return json;
},
CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {
var numMorphTargets = morphTargetSequence.length;
var tracks = [];
for ( var i = 0; i < numMorphTargets; i ++ ) {
var times = [];
var values = [];
times.push(
( i + numMorphTargets - 1 ) % numMorphTargets,
i,
( i + 1 ) % numMorphTargets );
values.push( 0, 1, 0 );
var order = AnimationUtils.getKeyframeOrder( times );
times = AnimationUtils.sortedArray( times, 1, order );
values = AnimationUtils.sortedArray( values, 1, order );
// if there is a key at the first frame, duplicate it as the
// last frame as well for perfect loop.
if ( ! noLoop && times[ 0 ] === 0 ) {
times.push( numMorphTargets );
values.push( values[ 0 ] );
}
tracks.push(
new NumberKeyframeTrack(
'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
times, values
).scale( 1.0 / fps ) );
}
return new AnimationClip( name, - 1, tracks );
},
findByName: function ( objectOrClipArray, name ) {
var clipArray = objectOrClipArray;
if ( ! Array.isArray( objectOrClipArray ) ) {
var o = objectOrClipArray;
clipArray = o.geometry && o.geometry.animations || o.animations;
}
for ( var i = 0; i < clipArray.length; i ++ ) {
if ( clipArray[ i ].name === name ) {
return clipArray[ i ];
}
}
return null;
},
CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {
var animationToMorphTargets = {};
// tested with https://regex101.com/ on trick sequences
// such flamingo_flyA_003, flamingo_run1_003, crdeath0059
var pattern = /^([\w-]*?)([\d]+)$/;
// sort morph target names into animation groups based
// patterns like Walk_001, Walk_002, Run_001, Run_002
for ( var i = 0, il = morphTargets.length; i < il; i ++ ) {
var morphTarget = morphTargets[ i ];
var parts = morphTarget.name.match( pattern );
if ( parts && parts.length > 1 ) {
var name = parts[ 1 ];
var animationMorphTargets = animationToMorphTargets[ name ];
if ( ! animationMorphTargets ) {
animationToMorphTargets[ name ] = animationMorphTargets = [];
}
animationMorphTargets.push( morphTarget );
}
}
var clips = [];
for ( var name in animationToMorphTargets ) {
clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );
}
return clips;
},
// parse the animation.hierarchy format
parseAnimation: function ( animation, bones ) {
if ( ! animation ) {
console.error( 'AnimationClip: No animation in JSONLoader data.' );
return null;
}
var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {
// only return track if there are actually keys.
if ( animationKeys.length !== 0 ) {
var times = [];
var values = [];
AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
// empty keys are filtered out, so check again
if ( times.length !== 0 ) {
destTracks.push( new trackType( trackName, times, values ) );
}
}
};
var tracks = [];
var clipName = animation.name || 'default';
// automatic length determination in AnimationClip.
var duration = animation.length || - 1;
var fps = animation.fps || 30;
var hierarchyTracks = animation.hierarchy || [];
for ( var h = 0; h < hierarchyTracks.length; h ++ ) {
var animationKeys = hierarchyTracks[ h ].keys;
// skip empty tracks
if ( ! animationKeys || animationKeys.length === 0 ) { continue; }
// process morph targets
if ( animationKeys[ 0 ].morphTargets ) {
// figure out all morph targets used in this track
var morphTargetNames = {};
for ( var k = 0; k < animationKeys.length; k ++ ) {
if ( animationKeys[ k ].morphTargets ) {
for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {
morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;
}
}
}
// create a track for each morph target with all zero
// morphTargetInfluences except for the keys in which
// the morphTarget is named.
for ( var morphTargetName in morphTargetNames ) {
var times = [];
var values = [];
for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {
var animationKey = animationKeys[ k ];
times.push( animationKey.time );
values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );
}
tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );
}
duration = morphTargetNames.length * ( fps || 1.0 );
} else {
// ...assume skeletal animation
var boneName = '.bones[' + bones[ h ].name + ']';
addNonemptyTrack(
VectorKeyframeTrack, boneName + '.position',
animationKeys, 'pos', tracks );
addNonemptyTrack(
QuaternionKeyframeTrack, boneName + '.quaternion',
animationKeys, 'rot', tracks );
addNonemptyTrack(
VectorKeyframeTrack, boneName + '.scale',
animationKeys, 'scl', tracks );
}
}
if ( tracks.length === 0 ) {
return null;
}
var clip = new AnimationClip( clipName, duration, tracks );
return clip;
}
} );
Object.assign( AnimationClip.prototype, {
resetDuration: function () {
var tracks = this.tracks, duration = 0;
for ( var i = 0, n = tracks.length; i !== n; ++ i ) {
var track = this.tracks[ i ];
duration = Math.max( duration, track.times[ track.times.length - 1 ] );
}
this.duration = duration;
return this;
},
trim: function () {
for ( var i = 0; i < this.tracks.length; i ++ ) {
this.tracks[ i ].trim( 0, this.duration );
}
return this;
},
validate: function () {
var valid = true;
for ( var i = 0; i < this.tracks.length; i ++ ) {
valid = valid && this.tracks[ i ].validate();
}
return valid;
},
optimize: function () {
for ( var i = 0; i < this.tracks.length; i ++ ) {
this.tracks[ i ].optimize();
}
return this;
},
clone: function () {
var tracks = [];
for ( var i = 0; i < this.tracks.length; i ++ ) {
tracks.push( this.tracks[ i ].clone() );
}
return new AnimationClip( this.name, this.duration, tracks );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author kile / http://kile.stravaganza.org/
* @author philogb / http://blog.thejit.org/
* @author mikael emtinger / http://gomo.se/
* @author egraether / http://egraether.com/
* @author WestLangley / http://github.com/WestLangley
*/
var _vector = new Vector3();
var _quaternion = new Quaternion();
function Vector3( x, y, z ) {
this.x = x || 0;
this.y = y || 0;
this.z = z || 0;
}
Object.assign( Vector3.prototype, {
isVector3: true,
set: function ( x, y, z ) {
this.x = x;
this.y = y;
this.z = z;
return this;
},
setScalar: function ( scalar ) {
this.x = scalar;
this.y = scalar;
this.z = scalar;
return this;
},
setX: function ( x ) {
this.x = x;
return this;
},
setY: function ( y ) {
this.y = y;
return this;
},
setZ: function ( z ) {
this.z = z;
return this;
},
setComponent: function ( index, value ) {
switch ( index ) {
case 0: this.x = value; break;
case 1: this.y = value; break;
case 2: this.z = value; break;
default: throw new Error( 'index is out of range: ' + index );
}
return this;
},
getComponent: function ( index ) {
switch ( index ) {
case 0: return this.x;
case 1: return this.y;
case 2: return this.z;
default: throw new Error( 'index is out of range: ' + index );
}
},
clone: function () {
return new this.constructor( this.x, this.y, this.z );
},
copy: function ( v ) {
this.x = v.x;
this.y = v.y;
this.z = v.z;
return this;
},
add: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
return this.addVectors( v, w );
}
this.x += v.x;
this.y += v.y;
this.z += v.z;
return this;
},
addScalar: function ( s ) {
this.x += s;
this.y += s;
this.z += s;
return this;
},
addVectors: function ( a, b ) {
this.x = a.x + b.x;
this.y = a.y + b.y;
this.z = a.z + b.z;
return this;
},
addScaledVector: function ( v, s ) {
this.x += v.x * s;
this.y += v.y * s;
this.z += v.z * s;
return this;
},
sub: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
return this.subVectors( v, w );
}
this.x -= v.x;
this.y -= v.y;
this.z -= v.z;
return this;
},
subScalar: function ( s ) {
this.x -= s;
this.y -= s;
this.z -= s;
return this;
},
subVectors: function ( a, b ) {
this.x = a.x - b.x;
this.y = a.y - b.y;
this.z = a.z - b.z;
return this;
},
multiply: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
return this.multiplyVectors( v, w );
}
this.x *= v.x;
this.y *= v.y;
this.z *= v.z;
return this;
},
multiplyScalar: function ( scalar ) {
this.x *= scalar;
this.y *= scalar;
this.z *= scalar;
return this;
},
multiplyVectors: function ( a, b ) {
this.x = a.x * b.x;
this.y = a.y * b.y;
this.z = a.z * b.z;
return this;
},
applyEuler: function ( euler ) {
if ( ! ( euler && euler.isEuler ) ) {
console.error( 'Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );
}
return this.applyQuaternion( _quaternion.setFromEuler( euler ) );
},
applyAxisAngle: function ( axis, angle ) {
return this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );
},
applyMatrix3: function ( m ) {
var x = this.x, y = this.y, z = this.z;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;
this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;
this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;
return this;
},
applyNormalMatrix: function ( m ) {
return this.applyMatrix3( m ).normalize();
},
applyMatrix4: function ( m ) {
var x = this.x, y = this.y, z = this.z;
var e = m.elements;
var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );
this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;
this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;
this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;
return this;
},
applyQuaternion: function ( q ) {
var x = this.x, y = this.y, z = this.z;
var qx = q.x, qy = q.y, qz = q.z, qw = q.w;
// calculate quat * vector
var ix = qw * x + qy * z - qz * y;
var iy = qw * y + qz * x - qx * z;
var iz = qw * z + qx * y - qy * x;
var iw = - qx * x - qy * y - qz * z;
// calculate result * inverse quat
this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;
this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;
this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;
return this;
},
project: function ( camera ) {
return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );
},
unproject: function ( camera ) {
return this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );
},
transformDirection: function ( m ) {
// input: Matrix4 affine matrix
// vector interpreted as a direction
var x = this.x, y = this.y, z = this.z;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;
this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;
this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;
return this.normalize();
},
divide: function ( v ) {
this.x /= v.x;
this.y /= v.y;
this.z /= v.z;
return this;
},
divideScalar: function ( scalar ) {
return this.multiplyScalar( 1 / scalar );
},
min: function ( v ) {
this.x = Math.min( this.x, v.x );
this.y = Math.min( this.y, v.y );
this.z = Math.min( this.z, v.z );
return this;
},
max: function ( v ) {
this.x = Math.max( this.x, v.x );
this.y = Math.max( this.y, v.y );
this.z = Math.max( this.z, v.z );
return this;
},
clamp: function ( min, max ) {
// assumes min < max, componentwise
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
this.z = Math.max( min.z, Math.min( max.z, this.z ) );
return this;
},
clampScalar: function ( minVal, maxVal ) {
this.x = Math.max( minVal, Math.min( maxVal, this.x ) );
this.y = Math.max( minVal, Math.min( maxVal, this.y ) );
this.z = Math.max( minVal, Math.min( maxVal, this.z ) );
return this;
},
clampLength: function ( min, max ) {
var length = this.length();
return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
},
floor: function () {
this.x = Math.floor( this.x );
this.y = Math.floor( this.y );
this.z = Math.floor( this.z );
return this;
},
ceil: function () {
this.x = Math.ceil( this.x );
this.y = Math.ceil( this.y );
this.z = Math.ceil( this.z );
return this;
},
round: function () {
this.x = Math.round( this.x );
this.y = Math.round( this.y );
this.z = Math.round( this.z );
return this;
},
roundToZero: function () {
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
return this;
},
negate: function () {
this.x = - this.x;
this.y = - this.y;
this.z = - this.z;
return this;
},
dot: function ( v ) {
return this.x * v.x + this.y * v.y + this.z * v.z;
},
// TODO lengthSquared?
lengthSq: function () {
return this.x * this.x + this.y * this.y + this.z * this.z;
},
length: function () {
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
},
manhattanLength: function () {
return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
},
normalize: function () {
return this.divideScalar( this.length() || 1 );
},
setLength: function ( length ) {
return this.normalize().multiplyScalar( length );
},
lerp: function ( v, alpha ) {
this.x += ( v.x - this.x ) * alpha;
this.y += ( v.y - this.y ) * alpha;
this.z += ( v.z - this.z ) * alpha;
return this;
},
lerpVectors: function ( v1, v2, alpha ) {
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
},
cross: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
return this.crossVectors( v, w );
}
return this.crossVectors( this, v );
},
crossVectors: function ( a, b ) {
var ax = a.x, ay = a.y, az = a.z;
var bx = b.x, by = b.y, bz = b.z;
this.x = ay * bz - az * by;
this.y = az * bx - ax * bz;
this.z = ax * by - ay * bx;
return this;
},
projectOnVector: function ( v ) {
var denominator = v.lengthSq();
if ( denominator === 0 ) { return this.set( 0, 0, 0 ); }
var scalar = v.dot( this ) / denominator;
return this.copy( v ).multiplyScalar( scalar );
},
projectOnPlane: function ( planeNormal ) {
_vector.copy( this ).projectOnVector( planeNormal );
return this.sub( _vector );
},
reflect: function ( normal ) {
// reflect incident vector off plane orthogonal to normal
// normal is assumed to have unit length
return this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );
},
angleTo: function ( v ) {
var denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );
if ( denominator === 0 ) { return Math.PI / 2; }
var theta = this.dot( v ) / denominator;
// clamp, to handle numerical problems
return Math.acos( MathUtils.clamp( theta, - 1, 1 ) );
},
distanceTo: function ( v ) {
return Math.sqrt( this.distanceToSquared( v ) );
},
distanceToSquared: function ( v ) {
var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;
return dx * dx + dy * dy + dz * dz;
},
manhattanDistanceTo: function ( v ) {
return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );
},
setFromSpherical: function ( s ) {
return this.setFromSphericalCoords( s.radius, s.phi, s.theta );
},
setFromSphericalCoords: function ( radius, phi, theta ) {
var sinPhiRadius = Math.sin( phi ) * radius;
this.x = sinPhiRadius * Math.sin( theta );
this.y = Math.cos( phi ) * radius;
this.z = sinPhiRadius * Math.cos( theta );
return this;
},
setFromCylindrical: function ( c ) {
return this.setFromCylindricalCoords( c.radius, c.theta, c.y );
},
setFromCylindricalCoords: function ( radius, theta, y ) {
this.x = radius * Math.sin( theta );
this.y = y;
this.z = radius * Math.cos( theta );
return this;
},
setFromMatrixPosition: function ( m ) {
var e = m.elements;
this.x = e[ 12 ];
this.y = e[ 13 ];
this.z = e[ 14 ];
return this;
},
setFromMatrixScale: function ( m ) {
var sx = this.setFromMatrixColumn( m, 0 ).length();
var sy = this.setFromMatrixColumn( m, 1 ).length();
var sz = this.setFromMatrixColumn( m, 2 ).length();
this.x = sx;
this.y = sy;
this.z = sz;
return this;
},
setFromMatrixColumn: function ( m, index ) {
return this.fromArray( m.elements, index * 4 );
},
setFromMatrix3Column: function ( m, index ) {
return this.fromArray( m.elements, index * 3 );
},
equals: function ( v ) {
return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) { offset = 0; }
this.x = array[ offset ];
this.y = array[ offset + 1 ];
this.z = array[ offset + 2 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
array[ offset ] = this.x;
array[ offset + 1 ] = this.y;
array[ offset + 2 ] = this.z;
return array;
},
fromBufferAttribute: function ( attribute, index, offset ) {
if ( offset !== undefined ) {
console.warn( 'Vector3: offset has been removed from .fromBufferAttribute().' );
}
this.x = attribute.getX( index );
this.y = attribute.getY( index );
this.z = attribute.getZ( index );
return this;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* Creator of typical test AnimationClips / KeyframeTracks
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/
var AnimationClipCreator = function () {};
AnimationClipCreator.CreateRotationAnimation = function ( period, axis ) {
var times = [ 0, period ], values = [ 0, 360 ];
axis = axis || 'x';
var trackName = '.rotation[' + axis + ']';
var track = new NumberKeyframeTrack( trackName, times, values );
return new AnimationClip( null, period, [ track ] );
};
AnimationClipCreator.CreateScaleAxisAnimation = function ( period, axis ) {
var times = [ 0, period ], values = [ 0, 1 ];
axis = axis || 'x';
var trackName = '.scale[' + axis + ']';
var track = new NumberKeyframeTrack( trackName, times, values );
return new AnimationClip( null, period, [ track ] );
};
AnimationClipCreator.CreateShakeAnimation = function ( duration, shakeScale ) {
var times = [], values = [], tmp = new Vector3();
for ( var i = 0; i < duration * 10; i ++ ) {
times.push( i / 10 );
tmp.set( Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0 ).
multiply( shakeScale ).
toArray( values, values.length );
}
var trackName = '.position';
var track = new VectorKeyframeTrack( trackName, times, values );
return new AnimationClip( null, duration, [ track ] );
};
AnimationClipCreator.CreatePulsationAnimation = function ( duration, pulseScale ) {
var times = [], values = [], tmp = new Vector3();
for ( var i = 0; i < duration * 10; i ++ ) {
times.push( i / 10 );
var scaleFactor = Math.random() * pulseScale;
tmp.set( scaleFactor, scaleFactor, scaleFactor ).
toArray( values, values.length );
}
var trackName = '.scale';
var track = new VectorKeyframeTrack( trackName, times, values );
return new AnimationClip( null, duration, [ track ] );
};
AnimationClipCreator.CreateVisibilityAnimation = function ( duration ) {
var times = [ 0, duration / 2, duration ], values = [ true, false, true ];
var trackName = '.visible';
var track = new BooleanKeyframeTrack( trackName, times, values );
return new AnimationClip( null, duration, [ track ] );
};
AnimationClipCreator.CreateMaterialColorAnimation = function ( duration, colors ) {
var times = [], values = [],
timeStep = duration / colors.length;
for ( var i = 0; i <= colors.length; i ++ ) {
times.push( i * timeStep );
values.push( colors[ i % colors.length ] );
}
var trackName = '.material[0].color';
var track = new ColorKeyframeTrack( trackName, times, values );
return new AnimationClip( null, duration, [ track ] );
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author philogb / http://blog.thejit.org/
* @author mikael emtinger / http://gomo.se/
* @author egraether / http://egraether.com/
* @author WestLangley / http://github.com/WestLangley
*/
function Vector4( x, y, z, w ) {
this.x = x || 0;
this.y = y || 0;
this.z = z || 0;
this.w = ( w !== undefined ) ? w : 1;
}
Object.defineProperties( Vector4.prototype, {
"width": {
get: function () {
return this.z;
},
set: function ( value ) {
this.z = value;
}
},
"height": {
get: function () {
return this.w;
},
set: function ( value ) {
this.w = value;
}
}
} );
Object.assign( Vector4.prototype, {
isVector4: true,
set: function ( x, y, z, w ) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
return this;
},
setScalar: function ( scalar ) {
this.x = scalar;
this.y = scalar;
this.z = scalar;
this.w = scalar;
return this;
},
setX: function ( x ) {
this.x = x;
return this;
},
setY: function ( y ) {
this.y = y;
return this;
},
setZ: function ( z ) {
this.z = z;
return this;
},
setW: function ( w ) {
this.w = w;
return this;
},
setComponent: function ( index, value ) {
switch ( index ) {
case 0: this.x = value; break;
case 1: this.y = value; break;
case 2: this.z = value; break;
case 3: this.w = value; break;
default: throw new Error( 'index is out of range: ' + index );
}
return this;
},
getComponent: function ( index ) {
switch ( index ) {
case 0: return this.x;
case 1: return this.y;
case 2: return this.z;
case 3: return this.w;
default: throw new Error( 'index is out of range: ' + index );
}
},
clone: function () {
return new this.constructor( this.x, this.y, this.z, this.w );
},
copy: function ( v ) {
this.x = v.x;
this.y = v.y;
this.z = v.z;
this.w = ( v.w !== undefined ) ? v.w : 1;
return this;
},
add: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
return this.addVectors( v, w );
}
this.x += v.x;
this.y += v.y;
this.z += v.z;
this.w += v.w;
return this;
},
addScalar: function ( s ) {
this.x += s;
this.y += s;
this.z += s;
this.w += s;
return this;
},
addVectors: function ( a, b ) {
this.x = a.x + b.x;
this.y = a.y + b.y;
this.z = a.z + b.z;
this.w = a.w + b.w;
return this;
},
addScaledVector: function ( v, s ) {
this.x += v.x * s;
this.y += v.y * s;
this.z += v.z * s;
this.w += v.w * s;
return this;
},
sub: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
return this.subVectors( v, w );
}
this.x -= v.x;
this.y -= v.y;
this.z -= v.z;
this.w -= v.w;
return this;
},
subScalar: function ( s ) {
this.x -= s;
this.y -= s;
this.z -= s;
this.w -= s;
return this;
},
subVectors: function ( a, b ) {
this.x = a.x - b.x;
this.y = a.y - b.y;
this.z = a.z - b.z;
this.w = a.w - b.w;
return this;
},
multiplyScalar: function ( scalar ) {
this.x *= scalar;
this.y *= scalar;
this.z *= scalar;
this.w *= scalar;
return this;
},
applyMatrix4: function ( m ) {
var x = this.x, y = this.y, z = this.z, w = this.w;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;
this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;
this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;
this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;
return this;
},
divideScalar: function ( scalar ) {
return this.multiplyScalar( 1 / scalar );
},
setAxisAngleFromQuaternion: function ( q ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
// q is assumed to be normalized
this.w = 2 * Math.acos( q.w );
var s = Math.sqrt( 1 - q.w * q.w );
if ( s < 0.0001 ) {
this.x = 1;
this.y = 0;
this.z = 0;
} else {
this.x = q.x / s;
this.y = q.y / s;
this.z = q.z / s;
}
return this;
},
setAxisAngleFromRotationMatrix: function ( m ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var angle, x, y, z, // variables for result
epsilon = 0.01, // margin to allow for rounding errors
epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees
te = m.elements,
m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
if ( ( Math.abs( m12 - m21 ) < epsilon ) &&
( Math.abs( m13 - m31 ) < epsilon ) &&
( Math.abs( m23 - m32 ) < epsilon ) ) {
// singularity found
// first check for identity matrix which must have +1 for all terms
// in leading diagonal and zero in other terms
if ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&
( Math.abs( m13 + m31 ) < epsilon2 ) &&
( Math.abs( m23 + m32 ) < epsilon2 ) &&
( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {
// this singularity is identity matrix so angle = 0
this.set( 1, 0, 0, 0 );
return this; // zero angle, arbitrary axis
}
// otherwise this singularity is angle = 180
angle = Math.PI;
var xx = ( m11 + 1 ) / 2;
var yy = ( m22 + 1 ) / 2;
var zz = ( m33 + 1 ) / 2;
var xy = ( m12 + m21 ) / 4;
var xz = ( m13 + m31 ) / 4;
var yz = ( m23 + m32 ) / 4;
if ( ( xx > yy ) && ( xx > zz ) ) {
// m11 is the largest diagonal term
if ( xx < epsilon ) {
x = 0;
y = 0.707106781;
z = 0.707106781;
} else {
x = Math.sqrt( xx );
y = xy / x;
z = xz / x;
}
} else if ( yy > zz ) {
// m22 is the largest diagonal term
if ( yy < epsilon ) {
x = 0.707106781;
y = 0;
z = 0.707106781;
} else {
y = Math.sqrt( yy );
x = xy / y;
z = yz / y;
}
} else {
// m33 is the largest diagonal term so base result on this
if ( zz < epsilon ) {
x = 0.707106781;
y = 0.707106781;
z = 0;
} else {
z = Math.sqrt( zz );
x = xz / z;
y = yz / z;
}
}
this.set( x, y, z, angle );
return this; // return 180 deg rotation
}
// as we have reached here there are no singularities so we can handle normally
var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +
( m13 - m31 ) * ( m13 - m31 ) +
( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize
if ( Math.abs( s ) < 0.001 ) { s = 1; }
// prevent divide by zero, should not happen if matrix is orthogonal and should be
// caught by singularity test above, but I've left it in just in case
this.x = ( m32 - m23 ) / s;
this.y = ( m13 - m31 ) / s;
this.z = ( m21 - m12 ) / s;
this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );
return this;
},
min: function ( v ) {
this.x = Math.min( this.x, v.x );
this.y = Math.min( this.y, v.y );
this.z = Math.min( this.z, v.z );
this.w = Math.min( this.w, v.w );
return this;
},
max: function ( v ) {
this.x = Math.max( this.x, v.x );
this.y = Math.max( this.y, v.y );
this.z = Math.max( this.z, v.z );
this.w = Math.max( this.w, v.w );
return this;
},
clamp: function ( min, max ) {
// assumes min < max, componentwise
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
this.z = Math.max( min.z, Math.min( max.z, this.z ) );
this.w = Math.max( min.w, Math.min( max.w, this.w ) );
return this;
},
clampScalar: function ( minVal, maxVal ) {
this.x = Math.max( minVal, Math.min( maxVal, this.x ) );
this.y = Math.max( minVal, Math.min( maxVal, this.y ) );
this.z = Math.max( minVal, Math.min( maxVal, this.z ) );
this.w = Math.max( minVal, Math.min( maxVal, this.w ) );
return this;
},
clampLength: function ( min, max ) {
var length = this.length();
return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
},
floor: function () {
this.x = Math.floor( this.x );
this.y = Math.floor( this.y );
this.z = Math.floor( this.z );
this.w = Math.floor( this.w );
return this;
},
ceil: function () {
this.x = Math.ceil( this.x );
this.y = Math.ceil( this.y );
this.z = Math.ceil( this.z );
this.w = Math.ceil( this.w );
return this;
},
round: function () {
this.x = Math.round( this.x );
this.y = Math.round( this.y );
this.z = Math.round( this.z );
this.w = Math.round( this.w );
return this;
},
roundToZero: function () {
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );
return this;
},
negate: function () {
this.x = - this.x;
this.y = - this.y;
this.z = - this.z;
this.w = - this.w;
return this;
},
dot: function ( v ) {
return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
},
lengthSq: function () {
return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
},
length: function () {
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
},
manhattanLength: function () {
return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );
},
normalize: function () {
return this.divideScalar( this.length() || 1 );
},
setLength: function ( length ) {
return this.normalize().multiplyScalar( length );
},
lerp: function ( v, alpha ) {
this.x += ( v.x - this.x ) * alpha;
this.y += ( v.y - this.y ) * alpha;
this.z += ( v.z - this.z ) * alpha;
this.w += ( v.w - this.w ) * alpha;
return this;
},
lerpVectors: function ( v1, v2, alpha ) {
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
},
equals: function ( v ) {
return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) { offset = 0; }
this.x = array[ offset ];
this.y = array[ offset + 1 ];
this.z = array[ offset + 2 ];
this.w = array[ offset + 3 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
array[ offset ] = this.x;
array[ offset + 1 ] = this.y;
array[ offset + 2 ] = this.z;
array[ offset + 3 ] = this.w;
return array;
},
fromBufferAttribute: function ( attribute, index, offset ) {
if ( offset !== undefined ) {
console.warn( 'Vector4: offset has been removed from .fromBufferAttribute().' );
}
this.x = attribute.getX( index );
this.y = attribute.getY( index );
this.z = attribute.getZ( index );
this.w = attribute.getW( index );
return this;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author philogb / http://blog.thejit.org/
* @author egraether / http://egraether.com/
* @author zz85 / http://www.lab4games.net/zz85/blog
*/
function Vector2( x, y ) {
this.x = x || 0;
this.y = y || 0;
}
Object.defineProperties( Vector2.prototype, {
"width": {
get: function () {
return this.x;
},
set: function ( value ) {
this.x = value;
}
},
"height": {
get: function () {
return this.y;
},
set: function ( value ) {
this.y = value;
}
}
} );
Object.assign( Vector2.prototype, {
isVector2: true,
set: function ( x, y ) {
this.x = x;
this.y = y;
return this;
},
setScalar: function ( scalar ) {
this.x = scalar;
this.y = scalar;
return this;
},
setX: function ( x ) {
this.x = x;
return this;
},
setY: function ( y ) {
this.y = y;
return this;
},
setComponent: function ( index, value ) {
switch ( index ) {
case 0: this.x = value; break;
case 1: this.y = value; break;
default: throw new Error( 'index is out of range: ' + index );
}
return this;
},
getComponent: function ( index ) {
switch ( index ) {
case 0: return this.x;
case 1: return this.y;
default: throw new Error( 'index is out of range: ' + index );
}
},
clone: function () {
return new this.constructor( this.x, this.y );
},
copy: function ( v ) {
this.x = v.x;
this.y = v.y;
return this;
},
add: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
return this.addVectors( v, w );
}
this.x += v.x;
this.y += v.y;
return this;
},
addScalar: function ( s ) {
this.x += s;
this.y += s;
return this;
},
addVectors: function ( a, b ) {
this.x = a.x + b.x;
this.y = a.y + b.y;
return this;
},
addScaledVector: function ( v, s ) {
this.x += v.x * s;
this.y += v.y * s;
return this;
},
sub: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
return this.subVectors( v, w );
}
this.x -= v.x;
this.y -= v.y;
return this;
},
subScalar: function ( s ) {
this.x -= s;
this.y -= s;
return this;
},
subVectors: function ( a, b ) {
this.x = a.x - b.x;
this.y = a.y - b.y;
return this;
},
multiply: function ( v ) {
this.x *= v.x;
this.y *= v.y;
return this;
},
multiplyScalar: function ( scalar ) {
this.x *= scalar;
this.y *= scalar;
return this;
},
divide: function ( v ) {
this.x /= v.x;
this.y /= v.y;
return this;
},
divideScalar: function ( scalar ) {
return this.multiplyScalar( 1 / scalar );
},
applyMatrix3: function ( m ) {
var x = this.x, y = this.y;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];
this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];
return this;
},
min: function ( v ) {
this.x = Math.min( this.x, v.x );
this.y = Math.min( this.y, v.y );
return this;
},
max: function ( v ) {
this.x = Math.max( this.x, v.x );
this.y = Math.max( this.y, v.y );
return this;
},
clamp: function ( min, max ) {
// assumes min < max, componentwise
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
return this;
},
clampScalar: function ( minVal, maxVal ) {
this.x = Math.max( minVal, Math.min( maxVal, this.x ) );
this.y = Math.max( minVal, Math.min( maxVal, this.y ) );
return this;
},
clampLength: function ( min, max ) {
var length = this.length();
return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
},
floor: function () {
this.x = Math.floor( this.x );
this.y = Math.floor( this.y );
return this;
},
ceil: function () {
this.x = Math.ceil( this.x );
this.y = Math.ceil( this.y );
return this;
},
round: function () {
this.x = Math.round( this.x );
this.y = Math.round( this.y );
return this;
},
roundToZero: function () {
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
return this;
},
negate: function () {
this.x = - this.x;
this.y = - this.y;
return this;
},
dot: function ( v ) {
return this.x * v.x + this.y * v.y;
},
cross: function ( v ) {
return this.x * v.y - this.y * v.x;
},
lengthSq: function () {
return this.x * this.x + this.y * this.y;
},
length: function () {
return Math.sqrt( this.x * this.x + this.y * this.y );
},
manhattanLength: function () {
return Math.abs( this.x ) + Math.abs( this.y );
},
normalize: function () {
return this.divideScalar( this.length() || 1 );
},
angle: function () {
// computes the angle in radians with respect to the positive x-axis
var angle = Math.atan2( this.y, this.x );
if ( angle < 0 ) { angle += 2 * Math.PI; }
return angle;
},
distanceTo: function ( v ) {
return Math.sqrt( this.distanceToSquared( v ) );
},
distanceToSquared: function ( v ) {
var dx = this.x - v.x, dy = this.y - v.y;
return dx * dx + dy * dy;
},
manhattanDistanceTo: function ( v ) {
return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );
},
setLength: function ( length ) {
return this.normalize().multiplyScalar( length );
},
lerp: function ( v, alpha ) {
this.x += ( v.x - this.x ) * alpha;
this.y += ( v.y - this.y ) * alpha;
return this;
},
lerpVectors: function ( v1, v2, alpha ) {
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
},
equals: function ( v ) {
return ( ( v.x === this.x ) && ( v.y === this.y ) );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) { offset = 0; }
this.x = array[ offset ];
this.y = array[ offset + 1 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
array[ offset ] = this.x;
array[ offset + 1 ] = this.y;
return array;
},
fromBufferAttribute: function ( attribute, index, offset ) {
if ( offset !== undefined ) {
console.warn( 'Vector2: offset has been removed from .fromBufferAttribute().' );
}
this.x = attribute.getX( index );
this.y = attribute.getY( index );
return this;
},
rotateAround: function ( center, angle ) {
var c = Math.cos( angle ), s = Math.sin( angle );
var x = this.x - center.x;
var y = this.y - center.y;
this.x = x * c - y * s + center.x;
this.y = x * s + y * c + center.y;
return this;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
*/
var _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };
var _hslA = { h: 0, s: 0, l: 0 };
var _hslB = { h: 0, s: 0, l: 0 };
function Color( r, g, b ) {
if ( g === undefined && b === undefined ) {
// r is Color, hex or string
return this.set( r );
}
return this.setRGB( r, g, b );
}
function hue2rgb( p, q, t ) {
if ( t < 0 ) { t += 1; }
if ( t > 1 ) { t -= 1; }
if ( t < 1 / 6 ) { return p + ( q - p ) * 6 * t; }
if ( t < 1 / 2 ) { return q; }
if ( t < 2 / 3 ) { return p + ( q - p ) * 6 * ( 2 / 3 - t ); }
return p;
}
function SRGBToLinear( c ) {
return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );
}
function LinearToSRGB( c ) {
return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;
}
Object.assign( Color.prototype, {
isColor: true,
r: 1, g: 1, b: 1,
set: function ( value ) {
if ( value && value.isColor ) {
this.copy( value );
} else if ( typeof value === 'number' ) {
this.setHex( value );
} else if ( typeof value === 'string' ) {
this.setStyle( value );
}
return this;
},
setScalar: function ( scalar ) {
this.r = scalar;
this.g = scalar;
this.b = scalar;
return this;
},
setHex: function ( hex ) {
hex = Math.floor( hex );
this.r = ( hex >> 16 & 255 ) / 255;
this.g = ( hex >> 8 & 255 ) / 255;
this.b = ( hex & 255 ) / 255;
return this;
},
setRGB: function ( r, g, b ) {
this.r = r;
this.g = g;
this.b = b;
return this;
},
setHSL: function ( h, s, l ) {
// h,s,l ranges are in 0.0 - 1.0
h = MathUtils.euclideanModulo( h, 1 );
s = MathUtils.clamp( s, 0, 1 );
l = MathUtils.clamp( l, 0, 1 );
if ( s === 0 ) {
this.r = this.g = this.b = l;
} else {
var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );
var q = ( 2 * l ) - p;
this.r = hue2rgb( q, p, h + 1 / 3 );
this.g = hue2rgb( q, p, h );
this.b = hue2rgb( q, p, h - 1 / 3 );
}
return this;
},
setStyle: function ( style ) {
function handleAlpha( string ) {
if ( string === undefined ) { return; }
if ( parseFloat( string ) < 1 ) {
console.warn( 'Color: Alpha component of ' + style + ' will be ignored.' );
}
}
var m;
if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) {
// rgb / hsl
var color;
var name = m[ 1 ];
var components = m[ 2 ];
switch ( name ) {
case 'rgb':
case 'rgba':
if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
// rgb(255,0,0) rgba(255,0,0,0.5)
this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;
this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;
this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;
handleAlpha( color[ 5 ] );
return this;
}
if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;
this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;
this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;
handleAlpha( color[ 5 ] );
return this;
}
break;
case 'hsl':
case 'hsla':
if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
// hsl(120,50%,50%) hsla(120,50%,50%,0.5)
var h = parseFloat( color[ 1 ] ) / 360;
var s = parseInt( color[ 2 ], 10 ) / 100;
var l = parseInt( color[ 3 ], 10 ) / 100;
handleAlpha( color[ 5 ] );
return this.setHSL( h, s, l );
}
break;
}
} else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) {
// hex color
var hex = m[ 1 ];
var size = hex.length;
if ( size === 3 ) {
// #ff0
this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;
this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;
this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;
return this;
} else if ( size === 6 ) {
// #ff0000
this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;
this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;
this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;
return this;
}
}
if ( style && style.length > 0 ) {
return this.setColorName( style );
}
return this;
},
setColorName: function ( style ) {
// color keywords
var hex = _colorKeywords[ style ];
if ( hex !== undefined ) {
// red
this.setHex( hex );
} else {
// unknown color
console.warn( 'Color: Unknown color ' + style );
}
return this;
},
clone: function () {
return new this.constructor( this.r, this.g, this.b );
},
copy: function ( color ) {
this.r = color.r;
this.g = color.g;
this.b = color.b;
return this;
},
copyGammaToLinear: function ( color, gammaFactor ) {
if ( gammaFactor === undefined ) { gammaFactor = 2.0; }
this.r = Math.pow( color.r, gammaFactor );
this.g = Math.pow( color.g, gammaFactor );
this.b = Math.pow( color.b, gammaFactor );
return this;
},
copyLinearToGamma: function ( color, gammaFactor ) {
if ( gammaFactor === undefined ) { gammaFactor = 2.0; }
var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;
this.r = Math.pow( color.r, safeInverse );
this.g = Math.pow( color.g, safeInverse );
this.b = Math.pow( color.b, safeInverse );
return this;
},
convertGammaToLinear: function ( gammaFactor ) {
this.copyGammaToLinear( this, gammaFactor );
return this;
},
convertLinearToGamma: function ( gammaFactor ) {
this.copyLinearToGamma( this, gammaFactor );
return this;
},
copySRGBToLinear: function ( color ) {
this.r = SRGBToLinear( color.r );
this.g = SRGBToLinear( color.g );
this.b = SRGBToLinear( color.b );
return this;
},
copyLinearToSRGB: function ( color ) {
this.r = LinearToSRGB( color.r );
this.g = LinearToSRGB( color.g );
this.b = LinearToSRGB( color.b );
return this;
},
convertSRGBToLinear: function () {
this.copySRGBToLinear( this );
return this;
},
convertLinearToSRGB: function () {
this.copyLinearToSRGB( this );
return this;
},
getHex: function () {
return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;
},
getHexString: function () {
return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );
},
getHSL: function ( target ) {
// h,s,l ranges are in 0.0 - 1.0
if ( target === undefined ) {
console.warn( 'Color: .getHSL() target is now required' );
target = { h: 0, s: 0, l: 0 };
}
var r = this.r, g = this.g, b = this.b;
var max = Math.max( r, g, b );
var min = Math.min( r, g, b );
var hue, saturation;
var lightness = ( min + max ) / 2.0;
if ( min === max ) {
hue = 0;
saturation = 0;
} else {
var delta = max - min;
saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );
switch ( max ) {
case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;
case g: hue = ( b - r ) / delta + 2; break;
case b: hue = ( r - g ) / delta + 4; break;
}
hue /= 6;
}
target.h = hue;
target.s = saturation;
target.l = lightness;
return target;
},
getStyle: function () {
return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
},
offsetHSL: function ( h, s, l ) {
this.getHSL( _hslA );
_hslA.h += h; _hslA.s += s; _hslA.l += l;
this.setHSL( _hslA.h, _hslA.s, _hslA.l );
return this;
},
add: function ( color ) {
this.r += color.r;
this.g += color.g;
this.b += color.b;
return this;
},
addColors: function ( color1, color2 ) {
this.r = color1.r + color2.r;
this.g = color1.g + color2.g;
this.b = color1.b + color2.b;
return this;
},
addScalar: function ( s ) {
this.r += s;
this.g += s;
this.b += s;
return this;
},
sub: function ( color ) {
this.r = Math.max( 0, this.r - color.r );
this.g = Math.max( 0, this.g - color.g );
this.b = Math.max( 0, this.b - color.b );
return this;
},
multiply: function ( color ) {
this.r *= color.r;
this.g *= color.g;
this.b *= color.b;
return this;
},
multiplyScalar: function ( s ) {
this.r *= s;
this.g *= s;
this.b *= s;
return this;
},
lerp: function ( color, alpha ) {
this.r += ( color.r - this.r ) * alpha;
this.g += ( color.g - this.g ) * alpha;
this.b += ( color.b - this.b ) * alpha;
return this;
},
lerpHSL: function ( color, alpha ) {
this.getHSL( _hslA );
color.getHSL( _hslB );
var h = MathUtils.lerp( _hslA.h, _hslB.h, alpha );
var s = MathUtils.lerp( _hslA.s, _hslB.s, alpha );
var l = MathUtils.lerp( _hslA.l, _hslB.l, alpha );
this.setHSL( h, s, l );
return this;
},
equals: function ( c ) {
return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) { offset = 0; }
this.r = array[ offset ];
this.g = array[ offset + 1 ];
this.b = array[ offset + 2 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
array[ offset ] = this.r;
array[ offset + 1 ] = this.g;
array[ offset + 2 ] = this.b;
return array;
},
toJSON: function () {
return this.getHex();
}
} );
Color.NAMES = _colorKeywords;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
*/
var _vector$1 = new Vector3();
function BufferAttribute( array, itemSize, normalized ) {
if ( Array.isArray( array ) ) {
throw new TypeError( 'BufferAttribute: array should be a Typed Array.' );
}
this.name = '';
this.array = array;
this.itemSize = itemSize;
this.count = array !== undefined ? array.length / itemSize : 0;
this.normalized = normalized === true;
this.usage = StaticDrawUsage;
this.updateRange = { offset: 0, count: - 1 };
this.version = 0;
}
Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', {
set: function ( value ) {
if ( value === true ) { this.version ++; }
}
} );
Object.assign( BufferAttribute.prototype, {
isBufferAttribute: true,
onUploadCallback: function () {},
setUsage: function ( value ) {
this.usage = value;
return this;
},
copy: function ( source ) {
this.name = source.name;
this.array = new source.array.constructor( source.array );
this.itemSize = source.itemSize;
this.count = source.count;
this.normalized = source.normalized;
this.usage = source.usage;
return this;
},
copyAt: function ( index1, attribute, index2 ) {
index1 *= this.itemSize;
index2 *= attribute.itemSize;
for ( var i = 0, l = this.itemSize; i < l; i ++ ) {
this.array[ index1 + i ] = attribute.array[ index2 + i ];
}
return this;
},
copyArray: function ( array ) {
this.array.set( array );
return this;
},
copyColorsArray: function ( colors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = colors.length; i < l; i ++ ) {
var color = colors[ i ];
if ( color === undefined ) {
console.warn( 'BufferAttribute.copyColorsArray(): color is undefined', i );
color = new Color();
}
array[ offset ++ ] = color.r;
array[ offset ++ ] = color.g;
array[ offset ++ ] = color.b;
}
return this;
},
copyVector2sArray: function ( vectors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
var vector = vectors[ i ];
if ( vector === undefined ) {
console.warn( 'BufferAttribute.copyVector2sArray(): vector is undefined', i );
vector = new Vector2();
}
array[ offset ++ ] = vector.x;
array[ offset ++ ] = vector.y;
}
return this;
},
copyVector3sArray: function ( vectors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
var vector = vectors[ i ];
if ( vector === undefined ) {
console.warn( 'BufferAttribute.copyVector3sArray(): vector is undefined', i );
vector = new Vector3();
}
array[ offset ++ ] = vector.x;
array[ offset ++ ] = vector.y;
array[ offset ++ ] = vector.z;
}
return this;
},
copyVector4sArray: function ( vectors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
var vector = vectors[ i ];
if ( vector === undefined ) {
console.warn( 'BufferAttribute.copyVector4sArray(): vector is undefined', i );
vector = new Vector4();
}
array[ offset ++ ] = vector.x;
array[ offset ++ ] = vector.y;
array[ offset ++ ] = vector.z;
array[ offset ++ ] = vector.w;
}
return this;
},
applyMatrix3: function ( m ) {
for ( var i = 0, l = this.count; i < l; i ++ ) {
_vector$1.x = this.getX( i );
_vector$1.y = this.getY( i );
_vector$1.z = this.getZ( i );
_vector$1.applyMatrix3( m );
this.setXYZ( i, _vector$1.x, _vector$1.y, _vector$1.z );
}
return this;
},
applyMatrix4: function ( m ) {
for ( var i = 0, l = this.count; i < l; i ++ ) {
_vector$1.x = this.getX( i );
_vector$1.y = this.getY( i );
_vector$1.z = this.getZ( i );
_vector$1.applyMatrix4( m );
this.setXYZ( i, _vector$1.x, _vector$1.y, _vector$1.z );
}
return this;
},
applyNormalMatrix: function ( m ) {
for ( var i = 0, l = this.count; i < l; i ++ ) {
_vector$1.x = this.getX( i );
_vector$1.y = this.getY( i );
_vector$1.z = this.getZ( i );
_vector$1.applyNormalMatrix( m );
this.setXYZ( i, _vector$1.x, _vector$1.y, _vector$1.z );
}
return this;
},
transformDirection: function ( m ) {
for ( var i = 0, l = this.count; i < l; i ++ ) {
_vector$1.x = this.getX( i );
_vector$1.y = this.getY( i );
_vector$1.z = this.getZ( i );
_vector$1.transformDirection( m );
this.setXYZ( i, _vector$1.x, _vector$1.y, _vector$1.z );
}
return this;
},
set: function ( value, offset ) {
if ( offset === undefined ) { offset = 0; }
this.array.set( value, offset );
return this;
},
getX: function ( index ) {
return this.array[ index * this.itemSize ];
},
setX: function ( index, x ) {
this.array[ index * this.itemSize ] = x;
return this;
},
getY: function ( index ) {
return this.array[ index * this.itemSize + 1 ];
},
setY: function ( index, y ) {
this.array[ index * this.itemSize + 1 ] = y;
return this;
},
getZ: function ( index ) {
return this.array[ index * this.itemSize + 2 ];
},
setZ: function ( index, z ) {
this.array[ index * this.itemSize + 2 ] = z;
return this;
},
getW: function ( index ) {
return this.array[ index * this.itemSize + 3 ];
},
setW: function ( index, w ) {
this.array[ index * this.itemSize + 3 ] = w;
return this;
},
setXY: function ( index, x, y ) {
index *= this.itemSize;
this.array[ index + 0 ] = x;
this.array[ index + 1 ] = y;
return this;
},
setXYZ: function ( index, x, y, z ) {
index *= this.itemSize;
this.array[ index + 0 ] = x;
this.array[ index + 1 ] = y;
this.array[ index + 2 ] = z;
return this;
},
setXYZW: function ( index, x, y, z, w ) {
index *= this.itemSize;
this.array[ index + 0 ] = x;
this.array[ index + 1 ] = y;
this.array[ index + 2 ] = z;
this.array[ index + 3 ] = w;
return this;
},
onUpload: function ( callback ) {
this.onUploadCallback = callback;
return this;
},
clone: function () {
return new this.constructor( this.array, this.itemSize ).copy( this );
},
toJSON: function () {
return {
itemSize: this.itemSize,
type: this.array.constructor.name,
array: Array.prototype.slice.call( this.array ),
normalized: this.normalized
};
}
} );
//
function Int8BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );
}
Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Int8BufferAttribute.prototype.constructor = Int8BufferAttribute;
function Uint8BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );
}
Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;
function Uint8ClampedBufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );
}
Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;
function Int16BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );
}
Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Int16BufferAttribute.prototype.constructor = Int16BufferAttribute;
function Uint16BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );
}
Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;
function Int32BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );
}
Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Int32BufferAttribute.prototype.constructor = Int32BufferAttribute;
function Uint32BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );
}
Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;
function Float32BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );
}
Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Float32BufferAttribute.prototype.constructor = Float32BufferAttribute;
function Float64BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );
}
Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Float64BufferAttribute.prototype.constructor = Float64BufferAttribute;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var _points = [
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3()
];
var _vector$2 = new Vector3();
var _box = new Box3();
// triangle centered vertices
var _v0 = new Vector3();
var _v1 = new Vector3();
var _v2 = new Vector3();
// triangle edge vectors
var _f0 = new Vector3();
var _f1 = new Vector3();
var _f2 = new Vector3();
var _center = new Vector3();
var _extents = new Vector3();
var _triangleNormal = new Vector3();
var _testAxis = new Vector3();
/**
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/
function Box3( min, max ) {
this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );
this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );
}
Object.assign( Box3.prototype, {
isBox3: true,
set: function ( min, max ) {
this.min.copy( min );
this.max.copy( max );
return this;
},
setFromArray: function ( array ) {
var minX = + Infinity;
var minY = + Infinity;
var minZ = + Infinity;
var maxX = - Infinity;
var maxY = - Infinity;
var maxZ = - Infinity;
for ( var i = 0, l = array.length; i < l; i += 3 ) {
var x = array[ i ];
var y = array[ i + 1 ];
var z = array[ i + 2 ];
if ( x < minX ) { minX = x; }
if ( y < minY ) { minY = y; }
if ( z < minZ ) { minZ = z; }
if ( x > maxX ) { maxX = x; }
if ( y > maxY ) { maxY = y; }
if ( z > maxZ ) { maxZ = z; }
}
this.min.set( minX, minY, minZ );
this.max.set( maxX, maxY, maxZ );
return this;
},
setFromBufferAttribute: function ( attribute ) {
var minX = + Infinity;
var minY = + Infinity;
var minZ = + Infinity;
var maxX = - Infinity;
var maxY = - Infinity;
var maxZ = - Infinity;
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
var x = attribute.getX( i );
var y = attribute.getY( i );
var z = attribute.getZ( i );
if ( x < minX ) { minX = x; }
if ( y < minY ) { minY = y; }
if ( z < minZ ) { minZ = z; }
if ( x > maxX ) { maxX = x; }
if ( y > maxY ) { maxY = y; }
if ( z > maxZ ) { maxZ = z; }
}
this.min.set( minX, minY, minZ );
this.max.set( maxX, maxY, maxZ );
return this;
},
setFromPoints: function ( points ) {
this.makeEmpty();
for ( var i = 0, il = points.length; i < il; i ++ ) {
this.expandByPoint( points[ i ] );
}
return this;
},
setFromCenterAndSize: function ( center, size ) {
var halfSize = _vector$2.copy( size ).multiplyScalar( 0.5 );
this.min.copy( center ).sub( halfSize );
this.max.copy( center ).add( halfSize );
return this;
},
setFromObject: function ( object ) {
this.makeEmpty();
return this.expandByObject( object );
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( box ) {
this.min.copy( box.min );
this.max.copy( box.max );
return this;
},
makeEmpty: function () {
this.min.x = this.min.y = this.min.z = + Infinity;
this.max.x = this.max.y = this.max.z = - Infinity;
return this;
},
isEmpty: function () {
// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );
},
getCenter: function ( target ) {
if ( target === undefined ) {
console.warn( 'Box3: .getCenter() target is now required' );
target = new Vector3();
}
return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
},
getSize: function ( target ) {
if ( target === undefined ) {
console.warn( 'Box3: .getSize() target is now required' );
target = new Vector3();
}
return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );
},
expandByPoint: function ( point ) {
this.min.min( point );
this.max.max( point );
return this;
},
expandByVector: function ( vector ) {
this.min.sub( vector );
this.max.add( vector );
return this;
},
expandByScalar: function ( scalar ) {
this.min.addScalar( - scalar );
this.max.addScalar( scalar );
return this;
},
expandByObject: function ( object ) {
// Computes the world-axis-aligned bounding box of an object (including its children),
// accounting for both the object's, and children's, world transforms
object.updateWorldMatrix( false, false );
var geometry = object.geometry;
if ( geometry !== undefined ) {
if ( geometry.boundingBox === null ) {
geometry.computeBoundingBox();
}
_box.copy( geometry.boundingBox );
_box.applyMatrix4( object.matrixWorld );
this.expandByPoint( _box.min );
this.expandByPoint( _box.max );
}
var children = object.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
this.expandByObject( children[ i ] );
}
return this;
},
containsPoint: function ( point ) {
return point.x < this.min.x || point.x > this.max.x ||
point.y < this.min.y || point.y > this.max.y ||
point.z < this.min.z || point.z > this.max.z ? false : true;
},
containsBox: function ( box ) {
return this.min.x <= box.min.x && box.max.x <= this.max.x &&
this.min.y <= box.min.y && box.max.y <= this.max.y &&
this.min.z <= box.min.z && box.max.z <= this.max.z;
},
getParameter: function ( point, target ) {
// This can potentially have a divide by zero if the box
// has a size dimension of 0.
if ( target === undefined ) {
console.warn( 'Box3: .getParameter() target is now required' );
target = new Vector3();
}
return target.set(
( point.x - this.min.x ) / ( this.max.x - this.min.x ),
( point.y - this.min.y ) / ( this.max.y - this.min.y ),
( point.z - this.min.z ) / ( this.max.z - this.min.z )
);
},
intersectsBox: function ( box ) {
// using 6 splitting planes to rule out intersections.
return box.max.x < this.min.x || box.min.x > this.max.x ||
box.max.y < this.min.y || box.min.y > this.max.y ||
box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
},
intersectsSphere: function ( sphere ) {
// Find the point on the AABB closest to the sphere center.
this.clampPoint( sphere.center, _vector$2 );
// If that point is inside the sphere, the AABB and sphere intersect.
return _vector$2.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );
},
intersectsPlane: function ( plane ) {
// We compute the minimum and maximum dot product values. If those values
// are on the same side (back or front) of the plane, then there is no intersection.
var min, max;
if ( plane.normal.x > 0 ) {
min = plane.normal.x * this.min.x;
max = plane.normal.x * this.max.x;
} else {
min = plane.normal.x * this.max.x;
max = plane.normal.x * this.min.x;
}
if ( plane.normal.y > 0 ) {
min += plane.normal.y * this.min.y;
max += plane.normal.y * this.max.y;
} else {
min += plane.normal.y * this.max.y;
max += plane.normal.y * this.min.y;
}
if ( plane.normal.z > 0 ) {
min += plane.normal.z * this.min.z;
max += plane.normal.z * this.max.z;
} else {
min += plane.normal.z * this.max.z;
max += plane.normal.z * this.min.z;
}
return ( min <= - plane.constant && max >= - plane.constant );
},
intersectsTriangle: function ( triangle ) {
if ( this.isEmpty() ) {
return false;
}
// compute box center and extents
this.getCenter( _center );
_extents.subVectors( this.max, _center );
// translate triangle to aabb origin
_v0.subVectors( triangle.a, _center );
_v1.subVectors( triangle.b, _center );
_v2.subVectors( triangle.c, _center );
// compute edge vectors for triangle
_f0.subVectors( _v1, _v0 );
_f1.subVectors( _v2, _v1 );
_f2.subVectors( _v0, _v2 );
// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
var axes = [
0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,
_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,
- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0
];
if ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {
return false;
}
// test 3 face normals from the aabb
axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];
if ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {
return false;
}
// finally testing the face normal of the triangle
// use already existing triangle edge vectors here
_triangleNormal.crossVectors( _f0, _f1 );
axes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];
return satForAxes( axes, _v0, _v1, _v2, _extents );
},
clampPoint: function ( point, target ) {
if ( target === undefined ) {
console.warn( 'Box3: .clampPoint() target is now required' );
target = new Vector3();
}
return target.copy( point ).clamp( this.min, this.max );
},
distanceToPoint: function ( point ) {
var clampedPoint = _vector$2.copy( point ).clamp( this.min, this.max );
return clampedPoint.sub( point ).length();
},
getBoundingSphere: function ( target ) {
if ( target === undefined ) {
console.error( 'Box3: .getBoundingSphere() target is now required' );
//target = new Sphere(); // removed to avoid cyclic dependency
}
this.getCenter( target.center );
target.radius = this.getSize( _vector$2 ).length() * 0.5;
return target;
},
intersect: function ( box ) {
this.min.max( box.min );
this.max.min( box.max );
// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.
if ( this.isEmpty() ) { this.makeEmpty(); }
return this;
},
union: function ( box ) {
this.min.min( box.min );
this.max.max( box.max );
return this;
},
applyMatrix4: function ( matrix ) {
// transform of empty box is an empty box.
if ( this.isEmpty() ) { return this; }
// NOTE: I am using a binary pattern to specify all 2^3 combinations below
_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000
_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001
_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010
_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011
_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100
_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101
_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110
_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111
this.setFromPoints( _points );
return this;
},
translate: function ( offset ) {
this.min.add( offset );
this.max.add( offset );
return this;
},
equals: function ( box ) {
return box.min.equals( this.min ) && box.max.equals( this.max );
}
} );
function satForAxes( axes, v0, v1, v2, extents ) {
var i, j;
for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {
_testAxis.fromArray( axes, i );
// project the aabb onto the seperating axis
var r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );
// project all 3 vertices of the triangle onto the seperating axis
var p0 = v0.dot( _testAxis );
var p1 = v1.dot( _testAxis );
var p2 = v2.dot( _testAxis );
// actual test, basically see if either of the most extreme of the triangle points intersects r
if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {
// points of the projected triangle are outside the projected half-length of the aabb
// the axis is seperating and we can exit
return false;
}
}
return true;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* https://github.com/mrdoob/eventdispatcher.js/
*/
function EventDispatcher() {}
Object.assign( EventDispatcher.prototype, {
addEventListener: function ( type, listener ) {
if ( this._listeners === undefined ) { this._listeners = {}; }
var listeners = this._listeners;
if ( listeners[ type ] === undefined ) {
listeners[ type ] = [];
}
if ( listeners[ type ].indexOf( listener ) === - 1 ) {
listeners[ type ].push( listener );
}
},
hasEventListener: function ( type, listener ) {
if ( this._listeners === undefined ) { return false; }
var listeners = this._listeners;
return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;
},
removeEventListener: function ( type, listener ) {
if ( this._listeners === undefined ) { return; }
var listeners = this._listeners;
var listenerArray = listeners[ type ];
if ( listenerArray !== undefined ) {
var index = listenerArray.indexOf( listener );
if ( index !== - 1 ) {
listenerArray.splice( index, 1 );
}
}
},
dispatchEvent: function ( event ) {
if ( this._listeners === undefined ) { return; }
var listeners = this._listeners;
var listenerArray = listeners[ event.type ];
if ( listenerArray !== undefined ) {
event.target = this;
var array = listenerArray.slice( 0 );
for ( var i = 0, l = array.length; i < l; i ++ ) {
array[ i ].call( this, event );
}
}
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var _box$1 = new Box3();
/**
* @author bhouston / http://clara.io
* @author mrdoob / http://mrdoob.com/
*/
function Sphere( center, radius ) {
this.center = ( center !== undefined ) ? center : new Vector3();
this.radius = ( radius !== undefined ) ? radius : 0;
}
Object.assign( Sphere.prototype, {
set: function ( center, radius ) {
this.center.copy( center );
this.radius = radius;
return this;
},
setFromPoints: function ( points, optionalCenter ) {
var center = this.center;
if ( optionalCenter !== undefined ) {
center.copy( optionalCenter );
} else {
_box$1.setFromPoints( points ).getCenter( center );
}
var maxRadiusSq = 0;
for ( var i = 0, il = points.length; i < il; i ++ ) {
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );
}
this.radius = Math.sqrt( maxRadiusSq );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( sphere ) {
this.center.copy( sphere.center );
this.radius = sphere.radius;
return this;
},
empty: function () {
return ( this.radius <= 0 );
},
containsPoint: function ( point ) {
return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );
},
distanceToPoint: function ( point ) {
return ( point.distanceTo( this.center ) - this.radius );
},
intersectsSphere: function ( sphere ) {
var radiusSum = this.radius + sphere.radius;
return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );
},
intersectsBox: function ( box ) {
return box.intersectsSphere( this );
},
intersectsPlane: function ( plane ) {
return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;
},
clampPoint: function ( point, target ) {
var deltaLengthSq = this.center.distanceToSquared( point );
if ( target === undefined ) {
console.warn( 'Sphere: .clampPoint() target is now required' );
target = new Vector3();
}
target.copy( point );
if ( deltaLengthSq > ( this.radius * this.radius ) ) {
target.sub( this.center ).normalize();
target.multiplyScalar( this.radius ).add( this.center );
}
return target;
},
getBoundingBox: function ( target ) {
if ( target === undefined ) {
console.warn( 'Sphere: .getBoundingBox() target is now required' );
target = new Box3();
}
target.set( this.center, this.center );
target.expandByScalar( this.radius );
return target;
},
applyMatrix4: function ( matrix ) {
this.center.applyMatrix4( matrix );
this.radius = this.radius * matrix.getMaxScaleOnAxis();
return this;
},
translate: function ( offset ) {
this.center.add( offset );
return this;
},
equals: function ( sphere ) {
return sphere.center.equals( this.center ) && ( sphere.radius === this.radius );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
*/
function DirectGeometry() {
this.vertices = [];
this.normals = [];
this.colors = [];
this.uvs = [];
this.uvs2 = [];
this.groups = [];
this.morphTargets = {};
this.skinWeights = [];
this.skinIndices = [];
// this.lineDistances = [];
this.boundingBox = null;
this.boundingSphere = null;
// update flags
this.verticesNeedUpdate = false;
this.normalsNeedUpdate = false;
this.colorsNeedUpdate = false;
this.uvsNeedUpdate = false;
this.groupsNeedUpdate = false;
}
Object.assign( DirectGeometry.prototype, {
computeGroups: function ( geometry ) {
var group;
var groups = [];
var materialIndex = undefined;
var faces = geometry.faces;
for ( var i = 0; i < faces.length; i ++ ) {
var face = faces[ i ];
// materials
if ( face.materialIndex !== materialIndex ) {
materialIndex = face.materialIndex;
if ( group !== undefined ) {
group.count = ( i * 3 ) - group.start;
groups.push( group );
}
group = {
start: i * 3,
materialIndex: materialIndex
};
}
}
if ( group !== undefined ) {
group.count = ( i * 3 ) - group.start;
groups.push( group );
}
this.groups = groups;
},
fromGeometry: function ( geometry ) {
var faces = geometry.faces;
var vertices = geometry.vertices;
var faceVertexUvs = geometry.faceVertexUvs;
var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;
var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;
// morphs
var morphTargets = geometry.morphTargets;
var morphTargetsLength = morphTargets.length;
var morphTargetsPosition;
if ( morphTargetsLength > 0 ) {
morphTargetsPosition = [];
for ( var i = 0; i < morphTargetsLength; i ++ ) {
morphTargetsPosition[ i ] = {
name: morphTargets[ i ].name,
data: []
};
}
this.morphTargets.position = morphTargetsPosition;
}
var morphNormals = geometry.morphNormals;
var morphNormalsLength = morphNormals.length;
var morphTargetsNormal;
if ( morphNormalsLength > 0 ) {
morphTargetsNormal = [];
for ( var i = 0; i < morphNormalsLength; i ++ ) {
morphTargetsNormal[ i ] = {
name: morphNormals[ i ].name,
data: []
};
}
this.morphTargets.normal = morphTargetsNormal;
}
// skins
var skinIndices = geometry.skinIndices;
var skinWeights = geometry.skinWeights;
var hasSkinIndices = skinIndices.length === vertices.length;
var hasSkinWeights = skinWeights.length === vertices.length;
//
if ( vertices.length > 0 && faces.length === 0 ) {
console.error( 'DirectGeometry: Faceless geometries are not supported.' );
}
for ( var i = 0; i < faces.length; i ++ ) {
var face = faces[ i ];
this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );
var vertexNormals = face.vertexNormals;
if ( vertexNormals.length === 3 ) {
this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );
} else {
var normal = face.normal;
this.normals.push( normal, normal, normal );
}
var vertexColors = face.vertexColors;
if ( vertexColors.length === 3 ) {
this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );
} else {
var color = face.color;
this.colors.push( color, color, color );
}
if ( hasFaceVertexUv === true ) {
var vertexUvs = faceVertexUvs[ 0 ][ i ];
if ( vertexUvs !== undefined ) {
this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
} else {
console.warn( 'DirectGeometry.fromGeometry(): Undefined vertexUv ', i );
this.uvs.push( new Vector2(), new Vector2(), new Vector2() );
}
}
if ( hasFaceVertexUv2 === true ) {
var vertexUvs = faceVertexUvs[ 1 ][ i ];
if ( vertexUvs !== undefined ) {
this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
} else {
console.warn( 'DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );
this.uvs2.push( new Vector2(), new Vector2(), new Vector2() );
}
}
// morphs
for ( var j = 0; j < morphTargetsLength; j ++ ) {
var morphTarget = morphTargets[ j ].vertices;
morphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );
}
for ( var j = 0; j < morphNormalsLength; j ++ ) {
var morphNormal = morphNormals[ j ].vertexNormals[ i ];
morphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c );
}
// skins
if ( hasSkinIndices ) {
this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );
}
if ( hasSkinWeights ) {
this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );
}
}
this.computeGroups( geometry );
this.verticesNeedUpdate = geometry.verticesNeedUpdate;
this.normalsNeedUpdate = geometry.normalsNeedUpdate;
this.colorsNeedUpdate = geometry.colorsNeedUpdate;
this.uvsNeedUpdate = geometry.uvsNeedUpdate;
this.groupsNeedUpdate = geometry.groupsNeedUpdate;
if ( geometry.boundingSphere !== null ) {
this.boundingSphere = geometry.boundingSphere.clone();
}
if ( geometry.boundingBox !== null ) {
this.boundingBox = geometry.boundingBox.clone();
}
return this;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var _v1$1 = new Vector3();
var _m1 = new Matrix4();
var _zero = new Vector3( 0, 0, 0 );
var _one = new Vector3( 1, 1, 1 );
var _x = new Vector3();
var _y = new Vector3();
var _z = new Vector3();
/**
* @author mrdoob / http://mrdoob.com/
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author philogb / http://blog.thejit.org/
* @author jordi_ros / http://plattsoft.com
* @author D1plo1d / http://github.com/D1plo1d
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author timknip / http://www.floorplanner.com/
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/
function Matrix4() {
this.elements = [
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
];
if ( arguments.length > 0 ) {
console.error( 'Matrix4: the constructor no longer reads arguments. use .set() instead.' );
}
}
Object.assign( Matrix4.prototype, {
isMatrix4: true,
set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {
var te = this.elements;
te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;
te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;
te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;
te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;
return this;
},
identity: function () {
this.set(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
return this;
},
clone: function () {
return new Matrix4().fromArray( this.elements );
},
copy: function ( m ) {
var te = this.elements;
var me = m.elements;
te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];
te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];
te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];
te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];
return this;
},
copyPosition: function ( m ) {
var te = this.elements, me = m.elements;
te[ 12 ] = me[ 12 ];
te[ 13 ] = me[ 13 ];
te[ 14 ] = me[ 14 ];
return this;
},
extractBasis: function ( xAxis, yAxis, zAxis ) {
xAxis.setFromMatrixColumn( this, 0 );
yAxis.setFromMatrixColumn( this, 1 );
zAxis.setFromMatrixColumn( this, 2 );
return this;
},
makeBasis: function ( xAxis, yAxis, zAxis ) {
this.set(
xAxis.x, yAxis.x, zAxis.x, 0,
xAxis.y, yAxis.y, zAxis.y, 0,
xAxis.z, yAxis.z, zAxis.z, 0,
0, 0, 0, 1
);
return this;
},
extractRotation: function ( m ) {
// this method does not support reflection matrices
var te = this.elements;
var me = m.elements;
var scaleX = 1 / _v1$1.setFromMatrixColumn( m, 0 ).length();
var scaleY = 1 / _v1$1.setFromMatrixColumn( m, 1 ).length();
var scaleZ = 1 / _v1$1.setFromMatrixColumn( m, 2 ).length();
te[ 0 ] = me[ 0 ] * scaleX;
te[ 1 ] = me[ 1 ] * scaleX;
te[ 2 ] = me[ 2 ] * scaleX;
te[ 3 ] = 0;
te[ 4 ] = me[ 4 ] * scaleY;
te[ 5 ] = me[ 5 ] * scaleY;
te[ 6 ] = me[ 6 ] * scaleY;
te[ 7 ] = 0;
te[ 8 ] = me[ 8 ] * scaleZ;
te[ 9 ] = me[ 9 ] * scaleZ;
te[ 10 ] = me[ 10 ] * scaleZ;
te[ 11 ] = 0;
te[ 12 ] = 0;
te[ 13 ] = 0;
te[ 14 ] = 0;
te[ 15 ] = 1;
return this;
},
makeRotationFromEuler: function ( euler ) {
if ( ! ( euler && euler.isEuler ) ) {
console.error( 'Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );
}
var te = this.elements;
var x = euler.x, y = euler.y, z = euler.z;
var a = Math.cos( x ), b = Math.sin( x );
var c = Math.cos( y ), d = Math.sin( y );
var e = Math.cos( z ), f = Math.sin( z );
if ( euler.order === 'XYZ' ) {
var ae = a * e, af = a * f, be = b * e, bf = b * f;
te[ 0 ] = c * e;
te[ 4 ] = - c * f;
te[ 8 ] = d;
te[ 1 ] = af + be * d;
te[ 5 ] = ae - bf * d;
te[ 9 ] = - b * c;
te[ 2 ] = bf - ae * d;
te[ 6 ] = be + af * d;
te[ 10 ] = a * c;
} else if ( euler.order === 'YXZ' ) {
var ce = c * e, cf = c * f, de = d * e, df = d * f;
te[ 0 ] = ce + df * b;
te[ 4 ] = de * b - cf;
te[ 8 ] = a * d;
te[ 1 ] = a * f;
te[ 5 ] = a * e;
te[ 9 ] = - b;
te[ 2 ] = cf * b - de;
te[ 6 ] = df + ce * b;
te[ 10 ] = a * c;
} else if ( euler.order === 'ZXY' ) {
var ce = c * e, cf = c * f, de = d * e, df = d * f;
te[ 0 ] = ce - df * b;
te[ 4 ] = - a * f;
te[ 8 ] = de + cf * b;
te[ 1 ] = cf + de * b;
te[ 5 ] = a * e;
te[ 9 ] = df - ce * b;
te[ 2 ] = - a * d;
te[ 6 ] = b;
te[ 10 ] = a * c;
} else if ( euler.order === 'ZYX' ) {
var ae = a * e, af = a * f, be = b * e, bf = b * f;
te[ 0 ] = c * e;
te[ 4 ] = be * d - af;
te[ 8 ] = ae * d + bf;
te[ 1 ] = c * f;
te[ 5 ] = bf * d + ae;
te[ 9 ] = af * d - be;
te[ 2 ] = - d;
te[ 6 ] = b * c;
te[ 10 ] = a * c;
} else if ( euler.order === 'YZX' ) {
var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
te[ 0 ] = c * e;
te[ 4 ] = bd - ac * f;
te[ 8 ] = bc * f + ad;
te[ 1 ] = f;
te[ 5 ] = a * e;
te[ 9 ] = - b * e;
te[ 2 ] = - d * e;
te[ 6 ] = ad * f + bc;
te[ 10 ] = ac - bd * f;
} else if ( euler.order === 'XZY' ) {
var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
te[ 0 ] = c * e;
te[ 4 ] = - f;
te[ 8 ] = d * e;
te[ 1 ] = ac * f + bd;
te[ 5 ] = a * e;
te[ 9 ] = ad * f - bc;
te[ 2 ] = bc * f - ad;
te[ 6 ] = b * e;
te[ 10 ] = bd * f + ac;
}
// bottom row
te[ 3 ] = 0;
te[ 7 ] = 0;
te[ 11 ] = 0;
// last column
te[ 12 ] = 0;
te[ 13 ] = 0;
te[ 14 ] = 0;
te[ 15 ] = 1;
return this;
},
makeRotationFromQuaternion: function ( q ) {
return this.compose( _zero, q, _one );
},
lookAt: function ( eye, target, up ) {
var te = this.elements;
_z.subVectors( eye, target );
if ( _z.lengthSq() === 0 ) {
// eye and target are in the same position
_z.z = 1;
}
_z.normalize();
_x.crossVectors( up, _z );
if ( _x.lengthSq() === 0 ) {
// up and z are parallel
if ( Math.abs( up.z ) === 1 ) {
_z.x += 0.0001;
} else {
_z.z += 0.0001;
}
_z.normalize();
_x.crossVectors( up, _z );
}
_x.normalize();
_y.crossVectors( _z, _x );
te[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;
te[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;
te[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;
return this;
},
multiply: function ( m, n ) {
if ( n !== undefined ) {
console.warn( 'Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );
return this.multiplyMatrices( m, n );
}
return this.multiplyMatrices( this, m );
},
premultiply: function ( m ) {
return this.multiplyMatrices( m, this );
},
multiplyMatrices: function ( a, b ) {
var ae = a.elements;
var be = b.elements;
var te = this.elements;
var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];
var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];
var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];
var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];
var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];
var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];
var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];
var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];
te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
return this;
},
multiplyScalar: function ( s ) {
var te = this.elements;
te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;
te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;
te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;
te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;
return this;
},
determinant: function () {
var te = this.elements;
var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];
var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];
var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];
var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];
//TODO: make this more efficient
//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
return (
n41 * (
+ n14 * n23 * n32
- n13 * n24 * n32
- n14 * n22 * n33
+ n12 * n24 * n33
+ n13 * n22 * n34
- n12 * n23 * n34
) +
n42 * (
+ n11 * n23 * n34
- n11 * n24 * n33
+ n14 * n21 * n33
- n13 * n21 * n34
+ n13 * n24 * n31
- n14 * n23 * n31
) +
n43 * (
+ n11 * n24 * n32
- n11 * n22 * n34
- n14 * n21 * n32
+ n12 * n21 * n34
+ n14 * n22 * n31
- n12 * n24 * n31
) +
n44 * (
- n13 * n22 * n31
- n11 * n23 * n32
+ n11 * n22 * n33
+ n13 * n21 * n32
- n12 * n21 * n33
+ n12 * n23 * n31
)
);
},
transpose: function () {
var te = this.elements;
var tmp;
tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;
tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;
tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;
tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;
tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;
tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;
return this;
},
setPosition: function ( x, y, z ) {
var te = this.elements;
if ( x.isVector3 ) {
te[ 12 ] = x.x;
te[ 13 ] = x.y;
te[ 14 ] = x.z;
} else {
te[ 12 ] = x;
te[ 13 ] = y;
te[ 14 ] = z;
}
return this;
},
getInverse: function ( m, throwOnDegenerate ) {
// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
var te = this.elements,
me = m.elements,
n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],
n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],
n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],
n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],
t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
if ( det === 0 ) {
var msg = "Matrix4: .getInverse() can't invert matrix, determinant is 0";
if ( throwOnDegenerate === true ) {
throw new Error( msg );
} else {
console.warn( msg );
}
return this.identity();
}
var detInv = 1 / det;
te[ 0 ] = t11 * detInv;
te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
te[ 4 ] = t12 * detInv;
te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
te[ 8 ] = t13 * detInv;
te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
te[ 12 ] = t14 * detInv;
te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
return this;
},
scale: function ( v ) {
var te = this.elements;
var x = v.x, y = v.y, z = v.z;
te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;
te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;
te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;
te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;
return this;
},
getMaxScaleOnAxis: function () {
var te = this.elements;
var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];
var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];
var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];
return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );
},
makeTranslation: function ( x, y, z ) {
this.set(
1, 0, 0, x,
0, 1, 0, y,
0, 0, 1, z,
0, 0, 0, 1
);
return this;
},
makeRotationX: function ( theta ) {
var c = Math.cos( theta ), s = Math.sin( theta );
this.set(
1, 0, 0, 0,
0, c, - s, 0,
0, s, c, 0,
0, 0, 0, 1
);
return this;
},
makeRotationY: function ( theta ) {
var c = Math.cos( theta ), s = Math.sin( theta );
this.set(
c, 0, s, 0,
0, 1, 0, 0,
- s, 0, c, 0,
0, 0, 0, 1
);
return this;
},
makeRotationZ: function ( theta ) {
var c = Math.cos( theta ), s = Math.sin( theta );
this.set(
c, - s, 0, 0,
s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
return this;
},
makeRotationAxis: function ( axis, angle ) {
// Based on http://www.gamedev.net/reference/articles/article1199.asp
var c = Math.cos( angle );
var s = Math.sin( angle );
var t = 1 - c;
var x = axis.x, y = axis.y, z = axis.z;
var tx = t * x, ty = t * y;
this.set(
tx * x + c, tx * y - s * z, tx * z + s * y, 0,
tx * y + s * z, ty * y + c, ty * z - s * x, 0,
tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
0, 0, 0, 1
);
return this;
},
makeScale: function ( x, y, z ) {
this.set(
x, 0, 0, 0,
0, y, 0, 0,
0, 0, z, 0,
0, 0, 0, 1
);
return this;
},
makeShear: function ( x, y, z ) {
this.set(
1, y, z, 0,
x, 1, z, 0,
x, y, 1, 0,
0, 0, 0, 1
);
return this;
},
compose: function ( position, quaternion, scale ) {
var te = this.elements;
var x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;
var x2 = x + x, y2 = y + y, z2 = z + z;
var xx = x * x2, xy = x * y2, xz = x * z2;
var yy = y * y2, yz = y * z2, zz = z * z2;
var wx = w * x2, wy = w * y2, wz = w * z2;
var sx = scale.x, sy = scale.y, sz = scale.z;
te[ 0 ] = ( 1 - ( yy + zz ) ) * sx;
te[ 1 ] = ( xy + wz ) * sx;
te[ 2 ] = ( xz - wy ) * sx;
te[ 3 ] = 0;
te[ 4 ] = ( xy - wz ) * sy;
te[ 5 ] = ( 1 - ( xx + zz ) ) * sy;
te[ 6 ] = ( yz + wx ) * sy;
te[ 7 ] = 0;
te[ 8 ] = ( xz + wy ) * sz;
te[ 9 ] = ( yz - wx ) * sz;
te[ 10 ] = ( 1 - ( xx + yy ) ) * sz;
te[ 11 ] = 0;
te[ 12 ] = position.x;
te[ 13 ] = position.y;
te[ 14 ] = position.z;
te[ 15 ] = 1;
return this;
},
decompose: function ( position, quaternion, scale ) {
var te = this.elements;
var sx = _v1$1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();
var sy = _v1$1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
var sz = _v1$1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();
// if determine is negative, we need to invert one scale
var det = this.determinant();
if ( det < 0 ) { sx = - sx; }
position.x = te[ 12 ];
position.y = te[ 13 ];
position.z = te[ 14 ];
// scale the rotation part
_m1.copy( this );
var invSX = 1 / sx;
var invSY = 1 / sy;
var invSZ = 1 / sz;
_m1.elements[ 0 ] *= invSX;
_m1.elements[ 1 ] *= invSX;
_m1.elements[ 2 ] *= invSX;
_m1.elements[ 4 ] *= invSY;
_m1.elements[ 5 ] *= invSY;
_m1.elements[ 6 ] *= invSY;
_m1.elements[ 8 ] *= invSZ;
_m1.elements[ 9 ] *= invSZ;
_m1.elements[ 10 ] *= invSZ;
quaternion.setFromRotationMatrix( _m1 );
scale.x = sx;
scale.y = sy;
scale.z = sz;
return this;
},
makePerspective: function ( left, right, top, bottom, near, far ) {
if ( far === undefined ) {
console.warn( 'Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );
}
var te = this.elements;
var x = 2 * near / ( right - left );
var y = 2 * near / ( top - bottom );
var a = ( right + left ) / ( right - left );
var b = ( top + bottom ) / ( top - bottom );
var c = - ( far + near ) / ( far - near );
var d = - 2 * far * near / ( far - near );
te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0;
te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0;
te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d;
te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0;
return this;
},
makeOrthographic: function ( left, right, top, bottom, near, far ) {
var te = this.elements;
var w = 1.0 / ( right - left );
var h = 1.0 / ( top - bottom );
var p = 1.0 / ( far - near );
var x = ( right + left ) * w;
var y = ( top + bottom ) * h;
var z = ( far + near ) * p;
te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x;
te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y;
te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z;
te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1;
return this;
},
equals: function ( matrix ) {
var te = this.elements;
var me = matrix.elements;
for ( var i = 0; i < 16; i ++ ) {
if ( te[ i ] !== me[ i ] ) { return false; }
}
return true;
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) { offset = 0; }
for ( var i = 0; i < 16; i ++ ) {
this.elements[ i ] = array[ i + offset ];
}
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
var te = this.elements;
array[ offset ] = te[ 0 ];
array[ offset + 1 ] = te[ 1 ];
array[ offset + 2 ] = te[ 2 ];
array[ offset + 3 ] = te[ 3 ];
array[ offset + 4 ] = te[ 4 ];
array[ offset + 5 ] = te[ 5 ];
array[ offset + 6 ] = te[ 6 ];
array[ offset + 7 ] = te[ 7 ];
array[ offset + 8 ] = te[ 8 ];
array[ offset + 9 ] = te[ 9 ];
array[ offset + 10 ] = te[ 10 ];
array[ offset + 11 ] = te[ 11 ];
array[ offset + 12 ] = te[ 12 ];
array[ offset + 13 ] = te[ 13 ];
array[ offset + 14 ] = te[ 14 ];
array[ offset + 15 ] = te[ 15 ];
return array;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/
var _matrix = new Matrix4();
var _quaternion$1 = new Quaternion();
function Euler( x, y, z, order ) {
this._x = x || 0;
this._y = y || 0;
this._z = z || 0;
this._order = order || Euler.DefaultOrder;
}
Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
Euler.DefaultOrder = 'XYZ';
Object.defineProperties( Euler.prototype, {
x: {
get: function () {
return this._x;
},
set: function ( value ) {
this._x = value;
this._onChangeCallback();
}
},
y: {
get: function () {
return this._y;
},
set: function ( value ) {
this._y = value;
this._onChangeCallback();
}
},
z: {
get: function () {
return this._z;
},
set: function ( value ) {
this._z = value;
this._onChangeCallback();
}
},
order: {
get: function () {
return this._order;
},
set: function ( value ) {
this._order = value;
this._onChangeCallback();
}
}
} );
Object.assign( Euler.prototype, {
isEuler: true,
set: function ( x, y, z, order ) {
this._x = x;
this._y = y;
this._z = z;
this._order = order || this._order;
this._onChangeCallback();
return this;
},
clone: function () {
return new this.constructor( this._x, this._y, this._z, this._order );
},
copy: function ( euler ) {
this._x = euler._x;
this._y = euler._y;
this._z = euler._z;
this._order = euler._order;
this._onChangeCallback();
return this;
},
setFromRotationMatrix: function ( m, order, update ) {
var clamp = MathUtils.clamp;
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te = m.elements;
var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];
var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];
var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
order = order || this._order;
if ( order === 'XYZ' ) {
this._y = Math.asin( clamp( m13, - 1, 1 ) );
if ( Math.abs( m13 ) < 0.9999999 ) {
this._x = Math.atan2( - m23, m33 );
this._z = Math.atan2( - m12, m11 );
} else {
this._x = Math.atan2( m32, m22 );
this._z = 0;
}
} else if ( order === 'YXZ' ) {
this._x = Math.asin( - clamp( m23, - 1, 1 ) );
if ( Math.abs( m23 ) < 0.9999999 ) {
this._y = Math.atan2( m13, m33 );
this._z = Math.atan2( m21, m22 );
} else {
this._y = Math.atan2( - m31, m11 );
this._z = 0;
}
} else if ( order === 'ZXY' ) {
this._x = Math.asin( clamp( m32, - 1, 1 ) );
if ( Math.abs( m32 ) < 0.9999999 ) {
this._y = Math.atan2( - m31, m33 );
this._z = Math.atan2( - m12, m22 );
} else {
this._y = 0;
this._z = Math.atan2( m21, m11 );
}
} else if ( order === 'ZYX' ) {
this._y = Math.asin( - clamp( m31, - 1, 1 ) );
if ( Math.abs( m31 ) < 0.9999999 ) {
this._x = Math.atan2( m32, m33 );
this._z = Math.atan2( m21, m11 );
} else {
this._x = 0;
this._z = Math.atan2( - m12, m22 );
}
} else if ( order === 'YZX' ) {
this._z = Math.asin( clamp( m21, - 1, 1 ) );
if ( Math.abs( m21 ) < 0.9999999 ) {
this._x = Math.atan2( - m23, m22 );
this._y = Math.atan2( - m31, m11 );
} else {
this._x = 0;
this._y = Math.atan2( m13, m33 );
}
} else if ( order === 'XZY' ) {
this._z = Math.asin( - clamp( m12, - 1, 1 ) );
if ( Math.abs( m12 ) < 0.9999999 ) {
this._x = Math.atan2( m32, m22 );
this._y = Math.atan2( m13, m11 );
} else {
this._x = Math.atan2( - m23, m33 );
this._y = 0;
}
} else {
console.warn( 'Euler: .setFromRotationMatrix() given unsupported order: ' + order );
}
this._order = order;
if ( update !== false ) { this._onChangeCallback(); }
return this;
},
setFromQuaternion: function ( q, order, update ) {
_matrix.makeRotationFromQuaternion( q );
return this.setFromRotationMatrix( _matrix, order, update );
},
setFromVector3: function ( v, order ) {
return this.set( v.x, v.y, v.z, order || this._order );
},
reorder: function ( newOrder ) {
// WARNING: this discards revolution information -bhouston
_quaternion$1.setFromEuler( this );
return this.setFromQuaternion( _quaternion$1, newOrder );
},
equals: function ( euler ) {
return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );
},
fromArray: function ( array ) {
this._x = array[ 0 ];
this._y = array[ 1 ];
this._z = array[ 2 ];
if ( array[ 3 ] !== undefined ) { this._order = array[ 3 ]; }
this._onChangeCallback();
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
array[ offset ] = this._x;
array[ offset + 1 ] = this._y;
array[ offset + 2 ] = this._z;
array[ offset + 3 ] = this._order;
return array;
},
toVector3: function ( optionalResult ) {
if ( optionalResult ) {
return optionalResult.set( this._x, this._y, this._z );
} else {
return new Vector3( this._x, this._y, this._z );
}
},
_onChange: function ( callback ) {
this._onChangeCallback = callback;
return this;
},
_onChangeCallback: function () {}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
*/
function Layers() {
this.mask = 1 | 0;
}
Object.assign( Layers.prototype, {
set: function ( channel ) {
this.mask = 1 << channel | 0;
},
enable: function ( channel ) {
this.mask |= 1 << channel | 0;
},
enableAll: function () {
this.mask = 0xffffffff | 0;
},
toggle: function ( channel ) {
this.mask ^= 1 << channel | 0;
},
disable: function ( channel ) {
this.mask &= ~ ( 1 << channel | 0 );
},
disableAll: function () {
this.mask = 0;
},
test: function ( layers ) {
return ( this.mask & layers.mask ) !== 0;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
* @author tschw
*/
function Matrix3() {
this.elements = [
1, 0, 0,
0, 1, 0,
0, 0, 1
];
if ( arguments.length > 0 ) {
console.error( 'Matrix3: the constructor no longer reads arguments. use .set() instead.' );
}
}
Object.assign( Matrix3.prototype, {
isMatrix3: true,
set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
var te = this.elements;
te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;
te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;
te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;
return this;
},
identity: function () {
this.set(
1, 0, 0,
0, 1, 0,
0, 0, 1
);
return this;
},
clone: function () {
return new this.constructor().fromArray( this.elements );
},
copy: function ( m ) {
var te = this.elements;
var me = m.elements;
te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];
te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];
te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];
return this;
},
setFromMatrix4: function ( m ) {
var me = m.elements;
this.set(
me[ 0 ], me[ 4 ], me[ 8 ],
me[ 1 ], me[ 5 ], me[ 9 ],
me[ 2 ], me[ 6 ], me[ 10 ]
);
return this;
},
multiply: function ( m ) {
return this.multiplyMatrices( this, m );
},
premultiply: function ( m ) {
return this.multiplyMatrices( m, this );
},
multiplyMatrices: function ( a, b ) {
var ae = a.elements;
var be = b.elements;
var te = this.elements;
var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];
var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];
var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];
var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];
var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];
var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];
te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;
te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;
te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;
te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;
te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;
te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;
te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;
te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;
te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;
return this;
},
multiplyScalar: function ( s ) {
var te = this.elements;
te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;
te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;
te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;
return this;
},
determinant: function () {
var te = this.elements;
var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],
d = te[ 3 ], e = te[ 4 ], f = te[ 5 ],
g = te[ 6 ], h = te[ 7 ], i = te[ 8 ];
return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
},
getInverse: function ( matrix, throwOnDegenerate ) {
if ( matrix && matrix.isMatrix4 ) {
console.error( "Matrix3: .getInverse() no longer takes a Matrix4 argument." );
}
var me = matrix.elements,
te = this.elements,
n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],
n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],
n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],
t11 = n33 * n22 - n32 * n23,
t12 = n32 * n13 - n33 * n12,
t13 = n23 * n12 - n22 * n13,
det = n11 * t11 + n21 * t12 + n31 * t13;
if ( det === 0 ) {
var msg = "Matrix3: .getInverse() can't invert matrix, determinant is 0";
if ( throwOnDegenerate === true ) {
throw new Error( msg );
} else {
console.warn( msg );
}
return this.identity();
}
var detInv = 1 / det;
te[ 0 ] = t11 * detInv;
te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;
te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;
te[ 3 ] = t12 * detInv;
te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;
te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;
te[ 6 ] = t13 * detInv;
te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;
te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;
return this;
},
transpose: function () {
var tmp, m = this.elements;
tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;
tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;
tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;
return this;
},
getNormalMatrix: function ( matrix4 ) {
return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();
},
transposeIntoArray: function ( r ) {
var m = this.elements;
r[ 0 ] = m[ 0 ];
r[ 1 ] = m[ 3 ];
r[ 2 ] = m[ 6 ];
r[ 3 ] = m[ 1 ];
r[ 4 ] = m[ 4 ];
r[ 5 ] = m[ 7 ];
r[ 6 ] = m[ 2 ];
r[ 7 ] = m[ 5 ];
r[ 8 ] = m[ 8 ];
return this;
},
setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) {
var c = Math.cos( rotation );
var s = Math.sin( rotation );
this.set(
sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,
- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,
0, 0, 1
);
},
scale: function ( sx, sy ) {
var te = this.elements;
te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;
te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;
return this;
},
rotate: function ( theta ) {
var c = Math.cos( theta );
var s = Math.sin( theta );
var te = this.elements;
var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];
var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];
te[ 0 ] = c * a11 + s * a21;
te[ 3 ] = c * a12 + s * a22;
te[ 6 ] = c * a13 + s * a23;
te[ 1 ] = - s * a11 + c * a21;
te[ 4 ] = - s * a12 + c * a22;
te[ 7 ] = - s * a13 + c * a23;
return this;
},
translate: function ( tx, ty ) {
var te = this.elements;
te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];
te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];
return this;
},
equals: function ( matrix ) {
var te = this.elements;
var me = matrix.elements;
for ( var i = 0; i < 9; i ++ ) {
if ( te[ i ] !== me[ i ] ) { return false; }
}
return true;
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) { offset = 0; }
for ( var i = 0; i < 9; i ++ ) {
this.elements[ i ] = array[ i + offset ];
}
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) { array = []; }
if ( offset === undefined ) { offset = 0; }
var te = this.elements;
array[ offset ] = te[ 0 ];
array[ offset + 1 ] = te[ 1 ];
array[ offset + 2 ] = te[ 2 ];
array[ offset + 3 ] = te[ 3 ];
array[ offset + 4 ] = te[ 4 ];
array[ offset + 5 ] = te[ 5 ];
array[ offset + 6 ] = te[ 6 ];
array[ offset + 7 ] = te[ 7 ];
array[ offset + 8 ] = te[ 8 ];
return array;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var _object3DId = 0;
var _v1$2 = new Vector3();
var _q1 = new Quaternion();
var _m1$1 = new Matrix4();
var _target = new Vector3();
var _position = new Vector3();
var _scale = new Vector3();
var _quaternion$2 = new Quaternion();
var _xAxis = new Vector3( 1, 0, 0 );
var _yAxis = new Vector3( 0, 1, 0 );
var _zAxis = new Vector3( 0, 0, 1 );
var _addedEvent = { type: 'added' };
var _removedEvent = { type: 'removed' };
/**
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author elephantatwork / www.elephantatwork.ch
*/
function Object3D() {
Object.defineProperty( this, 'id', { value: _object3DId ++ } );
this.uuid = MathUtils.generateUUID();
this.name = '';
this.type = 'Object3D';
this.parent = null;
this.children = [];
this.up = Object3D.DefaultUp.clone();
var position = new Vector3();
var rotation = new Euler();
var quaternion = new Quaternion();
var scale = new Vector3( 1, 1, 1 );
function onRotationChange() {
quaternion.setFromEuler( rotation, false );
}
function onQuaternionChange() {
rotation.setFromQuaternion( quaternion, undefined, false );
}
rotation._onChange( onRotationChange );
quaternion._onChange( onQuaternionChange );
Object.defineProperties( this, {
position: {
configurable: true,
enumerable: true,
value: position
},
rotation: {
configurable: true,
enumerable: true,
value: rotation
},
quaternion: {
configurable: true,
enumerable: true,
value: quaternion
},
scale: {
configurable: true,
enumerable: true,
value: scale
},
modelViewMatrix: {
value: new Matrix4()
},
normalMatrix: {
value: new Matrix3()
}
} );
this.matrix = new Matrix4();
this.matrixWorld = new Matrix4();
this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;
this.matrixWorldNeedsUpdate = false;
this.layers = new Layers();
this.visible = true;
this.castShadow = false;
this.receiveShadow = false;
this.frustumCulled = true;
this.renderOrder = 0;
this.userData = {};
}
Object3D.DefaultUp = new Vector3( 0, 1, 0 );
Object3D.DefaultMatrixAutoUpdate = true;
Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: Object3D,
isObject3D: true,
onBeforeRender: function () {},
onAfterRender: function () {},
applyMatrix4: function ( matrix ) {
if ( this.matrixAutoUpdate ) { this.updateMatrix(); }
this.matrix.premultiply( matrix );
this.matrix.decompose( this.position, this.quaternion, this.scale );
},
applyQuaternion: function ( q ) {
this.quaternion.premultiply( q );
return this;
},
setRotationFromAxisAngle: function ( axis, angle ) {
// assumes axis is normalized
this.quaternion.setFromAxisAngle( axis, angle );
},
setRotationFromEuler: function ( euler ) {
this.quaternion.setFromEuler( euler, true );
},
setRotationFromMatrix: function ( m ) {
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
this.quaternion.setFromRotationMatrix( m );
},
setRotationFromQuaternion: function ( q ) {
// assumes q is normalized
this.quaternion.copy( q );
},
rotateOnAxis: function ( axis, angle ) {
// rotate object on axis in object space
// axis is assumed to be normalized
_q1.setFromAxisAngle( axis, angle );
this.quaternion.multiply( _q1 );
return this;
},
rotateOnWorldAxis: function ( axis, angle ) {
// rotate object on axis in world space
// axis is assumed to be normalized
// method assumes no rotated parent
_q1.setFromAxisAngle( axis, angle );
this.quaternion.premultiply( _q1 );
return this;
},
rotateX: function ( angle ) {
return this.rotateOnAxis( _xAxis, angle );
},
rotateY: function ( angle ) {
return this.rotateOnAxis( _yAxis, angle );
},
rotateZ: function ( angle ) {
return this.rotateOnAxis( _zAxis, angle );
},
translateOnAxis: function ( axis, distance ) {
// translate object by distance along axis in object space
// axis is assumed to be normalized
_v1$2.copy( axis ).applyQuaternion( this.quaternion );
this.position.add( _v1$2.multiplyScalar( distance ) );
return this;
},
translateX: function ( distance ) {
return this.translateOnAxis( _xAxis, distance );
},
translateY: function ( distance ) {
return this.translateOnAxis( _yAxis, distance );
},
translateZ: function ( distance ) {
return this.translateOnAxis( _zAxis, distance );
},
localToWorld: function ( vector ) {
return vector.applyMatrix4( this.matrixWorld );
},
worldToLocal: function ( vector ) {
return vector.applyMatrix4( _m1$1.getInverse( this.matrixWorld ) );
},
lookAt: function ( x, y, z ) {
// This method does not support objects having non-uniformly-scaled parent(s)
if ( x.isVector3 ) {
_target.copy( x );
} else {
_target.set( x, y, z );
}
var parent = this.parent;
this.updateWorldMatrix( true, false );
_position.setFromMatrixPosition( this.matrixWorld );
if ( this.isCamera || this.isLight ) {
_m1$1.lookAt( _position, _target, this.up );
} else {
_m1$1.lookAt( _target, _position, this.up );
}
this.quaternion.setFromRotationMatrix( _m1$1 );
if ( parent ) {
_m1$1.extractRotation( parent.matrixWorld );
_q1.setFromRotationMatrix( _m1$1 );
this.quaternion.premultiply( _q1.inverse() );
}
},
add: function ( object ) {
var arguments$1 = arguments;
if ( arguments.length > 1 ) {
for ( var i = 0; i < arguments.length; i ++ ) {
this.add( arguments$1[ i ] );
}
return this;
}
if ( object === this ) {
console.error( "Object3D.add: object can't be added as a child of itself.", object );
return this;
}
if ( ( object && object.isObject3D ) ) {
if ( object.parent !== null ) {
object.parent.remove( object );
}
object.parent = this;
this.children.push( object );
object.dispatchEvent( _addedEvent );
} else {
console.error( "Object3D.add: object not an instance of Object3D.", object );
}
return this;
},
remove: function ( object ) {
var arguments$1 = arguments;
if ( arguments.length > 1 ) {
for ( var i = 0; i < arguments.length; i ++ ) {
this.remove( arguments$1[ i ] );
}
return this;
}
var index = this.children.indexOf( object );
if ( index !== - 1 ) {
object.parent = null;
this.children.splice( index, 1 );
object.dispatchEvent( _removedEvent );
}
return this;
},
attach: function ( object ) {
// adds object as a child of this, while maintaining the object's world transform
this.updateWorldMatrix( true, false );
_m1$1.getInverse( this.matrixWorld );
if ( object.parent !== null ) {
object.parent.updateWorldMatrix( true, false );
_m1$1.multiply( object.parent.matrixWorld );
}
object.applyMatrix4( _m1$1 );
object.updateWorldMatrix( false, false );
this.add( object );
return this;
},
getObjectById: function ( id ) {
return this.getObjectByProperty( 'id', id );
},
getObjectByName: function ( name ) {
return this.getObjectByProperty( 'name', name );
},
getObjectByProperty: function ( name, value ) {
if ( this[ name ] === value ) { return this; }
for ( var i = 0, l = this.children.length; i < l; i ++ ) {
var child = this.children[ i ];
var object = child.getObjectByProperty( name, value );
if ( object !== undefined ) {
return object;
}
}
return undefined;
},
getWorldPosition: function ( target ) {
if ( target === undefined ) {
console.warn( 'Object3D: .getWorldPosition() target is now required' );
target = new Vector3();
}
this.updateMatrixWorld( true );
return target.setFromMatrixPosition( this.matrixWorld );
},
getWorldQuaternion: function ( target ) {
if ( target === undefined ) {
console.warn( 'Object3D: .getWorldQuaternion() target is now required' );
target = new Quaternion();
}
this.updateMatrixWorld( true );
this.matrixWorld.decompose( _position, target, _scale );
return target;
},
getWorldScale: function ( target ) {
if ( target === undefined ) {
console.warn( 'Object3D: .getWorldScale() target is now required' );
target = new Vector3();
}
this.updateMatrixWorld( true );
this.matrixWorld.decompose( _position, _quaternion$2, target );
return target;
},
getWorldDirection: function ( target ) {
if ( target === undefined ) {
console.warn( 'Object3D: .getWorldDirection() target is now required' );
target = new Vector3();
}
this.updateMatrixWorld( true );
var e = this.matrixWorld.elements;
return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();
},
raycast: function () {},
traverse: function ( callback ) {
callback( this );
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].traverse( callback );
}
},
traverseVisible: function ( callback ) {
if ( this.visible === false ) { return; }
callback( this );
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].traverseVisible( callback );
}
},
traverseAncestors: function ( callback ) {
var parent = this.parent;
if ( parent !== null ) {
callback( parent );
parent.traverseAncestors( callback );
}
},
updateMatrix: function () {
this.matrix.compose( this.position, this.quaternion, this.scale );
this.matrixWorldNeedsUpdate = true;
},
updateMatrixWorld: function ( force ) {
if ( this.matrixAutoUpdate ) { this.updateMatrix(); }
if ( this.matrixWorldNeedsUpdate || force ) {
if ( this.parent === null ) {
this.matrixWorld.copy( this.matrix );
} else {
this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
}
this.matrixWorldNeedsUpdate = false;
force = true;
}
// update children
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].updateMatrixWorld( force );
}
},
updateWorldMatrix: function ( updateParents, updateChildren ) {
var parent = this.parent;
if ( updateParents === true && parent !== null ) {
parent.updateWorldMatrix( true, false );
}
if ( this.matrixAutoUpdate ) { this.updateMatrix(); }
if ( this.parent === null ) {
this.matrixWorld.copy( this.matrix );
} else {
this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
}
// update children
if ( updateChildren === true ) {
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].updateWorldMatrix( false, true );
}
}
},
toJSON: function ( meta ) {
// meta is a string when called from JSON.stringify
var isRootObject = ( meta === undefined || typeof meta === 'string' );
var output = {};
// meta is a hash used to collect geometries, materials.
// not providing it implies that this is the root object
// being serialized.
if ( isRootObject ) {
// initialize meta obj
meta = {
geometries: {},
materials: {},
textures: {},
images: {},
shapes: {}
};
output.metadata = {
version: 4.5,
type: 'Object',
generator: 'Object3D.toJSON'
};
}
// standard Object3D serialization
var object = {};
object.uuid = this.uuid;
object.type = this.type;
if ( this.name !== '' ) { object.name = this.name; }
if ( this.castShadow === true ) { object.castShadow = true; }
if ( this.receiveShadow === true ) { object.receiveShadow = true; }
if ( this.visible === false ) { object.visible = false; }
if ( this.frustumCulled === false ) { object.frustumCulled = false; }
if ( this.renderOrder !== 0 ) { object.renderOrder = this.renderOrder; }
if ( JSON.stringify( this.userData ) !== '{}' ) { object.userData = this.userData; }
object.layers = this.layers.mask;
object.matrix = this.matrix.toArray();
if ( this.matrixAutoUpdate === false ) { object.matrixAutoUpdate = false; }
// object specific properties
if ( this.isInstancedMesh ) {
object.type = 'InstancedMesh';
object.count = this.count;
object.instanceMatrix = this.instanceMatrix.toJSON();
}
//
function serialize( library, element ) {
if ( library[ element.uuid ] === undefined ) {
library[ element.uuid ] = element.toJSON( meta );
}
return element.uuid;
}
if ( this.isMesh || this.isLine || this.isPoints ) {
object.geometry = serialize( meta.geometries, this.geometry );
var parameters = this.geometry.parameters;
if ( parameters !== undefined && parameters.shapes !== undefined ) {
var shapes = parameters.shapes;
if ( Array.isArray( shapes ) ) {
for ( var i = 0, l = shapes.length; i < l; i ++ ) {
var shape = shapes[ i ];
serialize( meta.shapes, shape );
}
} else {
serialize( meta.shapes, shapes );
}
}
}
if ( this.material !== undefined ) {
if ( Array.isArray( this.material ) ) {
var uuids = [];
for ( var i = 0, l = this.material.length; i < l; i ++ ) {
uuids.push( serialize( meta.materials, this.material[ i ] ) );
}
object.material = uuids;
} else {
object.material = serialize( meta.materials, this.material );
}
}
//
if ( this.children.length > 0 ) {
object.children = [];
for ( var i = 0; i < this.children.length; i ++ ) {
object.children.push( this.children[ i ].toJSON( meta ).object );
}
}
if ( isRootObject ) {
var geometries = extractFromCache( meta.geometries );
var materials = extractFromCache( meta.materials );
var textures = extractFromCache( meta.textures );
var images = extractFromCache( meta.images );
var shapes = extractFromCache( meta.shapes );
if ( geometries.length > 0 ) { output.geometries = geometries; }
if ( materials.length > 0 ) { output.materials = materials; }
if ( textures.length > 0 ) { output.textures = textures; }
if ( images.length > 0 ) { output.images = images; }
if ( shapes.length > 0 ) { output.shapes = shapes; }
}
output.object = object;
return output;
// extract data from the cache hash
// remove metadata on each item
// and return as array
function extractFromCache( cache ) {
var values = [];
for ( var key in cache ) {
var data = cache[ key ];
delete data.metadata;
values.push( data );
}
return values;
}
},
clone: function ( recursive ) {
return new this.constructor().copy( this, recursive );
},
copy: function ( source, recursive ) {
if ( recursive === undefined ) { recursive = true; }
this.name = source.name;
this.up.copy( source.up );
this.position.copy( source.position );
this.quaternion.copy( source.quaternion );
this.scale.copy( source.scale );
this.matrix.copy( source.matrix );
this.matrixWorld.copy( source.matrixWorld );
this.matrixAutoUpdate = source.matrixAutoUpdate;
this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
this.layers.mask = source.layers.mask;
this.visible = source.visible;
this.castShadow = source.castShadow;
this.receiveShadow = source.receiveShadow;
this.frustumCulled = source.frustumCulled;
this.renderOrder = source.renderOrder;
this.userData = JSON.parse( JSON.stringify( source.userData ) );
if ( recursive === true ) {
for ( var i = 0; i < source.children.length; i ++ ) {
var child = source.children[ i ];
this.add( child.clone() );
}
}
return this;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WARNING: This file was auto-generated, any change will be overridden in next release. Please use configs/es6.conf.js then run "npm run convert". //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
*/
function arrayMin( array ) {
if ( array.length === 0 ) { return Infinity; }
var min = array[ 0 ];
for ( var i = 1, l = array.length; i < l; ++ i ) {
if ( array[ i ] < min ) { min = array[ i ]; }
}
return min;
}
function arrayMax( array ) {
if ( array.length === 0 ) { return - Infinity; }
var max = array[ 0 ];
for ( var i = 1, l = array.length; i < l; ++ i ) {
if ( array[ i ] > max ) { max = array[ i ]; }
}
return max;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
var _bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id
var _m1$2 = new Matrix4();
var _obj = new Object3D();
var _offset = new Vector3();
var _box$2 = new Box3();
var _boxMorphTargets = new Box3();
var _vector$3 = new Vector3();
function BufferGeometry() {
Object.defineProperty( this, 'id', { value: _bufferGeometryId += 2 } );
this.uuid = MathUtils.generateUUID();
this.name = '';
this.type = 'BufferGeometry';
this.index = null;
this.attributes = {};
this.morphAttributes = {};
this.morphTargetsRelative = false;
this.groups = [];
this.boundingBox = null;
this.boundingSphere = null;
this.drawRange = { start: 0, count: Infinity };
this.userData = {};
}
BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: BufferGeometry,
isBufferGeometry: true,
getIndex: function () {
return this.index;
},
setIndex: function ( index ) {
if ( Array.isArray( index ) ) {
this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );
} else {
this.index = index;
}
},
getAttribute: function ( name ) {
return this.attributes[ name ];
},
setAttribute: function ( name, attribute ) {
this.attributes[ name ] = attribute;
return this;
},
deleteAttribute: function ( name ) {
delete this.attributes[ name ];
return this;
},
addGroup: function ( start, count, materialIndex ) {
this.groups.push( {
start: start,
count: count,
materialIndex: materialIndex !== undefined ? materialIndex : 0
} );
},
clearGroups: function () {
this.groups = [];
},
setDrawRange: function ( start, count ) {
this.drawRange.start = start;
this.drawRange.count = count;
},
applyMatrix4: function ( matrix ) {
var position = this.attributes.position;
if ( position !== undefined ) {
position.applyMatrix4( matrix );
position.needsUpdate = true;
}
var normal = this.attributes.normal;
if ( normal !== undefined ) {
var normalMatrix = new Matrix3().getNormalMatrix( matrix );
normal.applyNormalMatrix( normalMatrix );
normal.needsUpdate = true;
}
var tangent = this.attributes.tangent;
if ( tangent !== undefined ) {
tangent.transformDirection( matrix );
tangent.needsUpdate = true;
}
if ( this.boundingBox !== null ) {
this.computeBoundingBox();
}
if ( this.boundingSphere !== null ) {
this.computeBoundingSphere();
}
return this;
},
rotateX: function ( angle ) {
// rotate geometry around world x-axis
_m1$2.makeRotationX( angle );
this.applyMatrix4( _m1$2 );
return this;
},
rotateY: function ( angle ) {
// rotate geometry around world y-axis
_m1$2.makeRotationY( angle );
this.applyMatrix4( _m1$2 );
return this;
},
rotateZ: function ( angle ) {
// rotate geometry around world z-axis
_m1$2.makeRotationZ( angle );
this.applyMatrix4( _m1$2 );
return this;
},
translate: function ( x, y, z ) {
// translate geometry
_m1$2.makeTranslation( x, y, z );
this.applyMatrix4( _m1$2 );
return this;
},
scale: function ( x, y, z ) {
// scale geometry
_m1$2.makeScale( x, y, z );
this.applyMatrix4( _m1$2 );
return this;
},
lookAt: function ( vector ) {
_obj.lookAt( vector );
_obj.updateMatrix();
this.applyMatrix4( _obj.matrix );
return this;
},
center: function () {
this.computeBoundingBox();
this.boundingBox.getCenter( _offset ).negate();
this.translate( _offset.x, _offset.y, _offset.z );
return this;
},
setFromObject: function ( object ) {
// console.log( 'BufferGeometry.setFromObject(). Converting', object, this );
var geometry = object.geometry;
if ( object.isPoints || object.isLine ) {
var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );
var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );
this.setAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );
this.setAttribute( 'color', colors.copyColorsArray( geometry.colors ) );
if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {
var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );
this.setAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );
}
if ( geometry.boundingSphere !== null ) {
this.boundingSphere = geometry.boundingSphere.clone();
}
if ( geometry.boundingBox !== null ) {
this.boundingBox = geometry.boundingBox.clone();
}
} else if ( object.isMesh ) {
if ( geometry && geometry.isGeometry ) {
this.fromGeometry( geometry );
}
}
return this;
},
setFromPoints: function ( points ) {
var position = [];
for ( var i = 0, l = points.length; i < l; i ++ ) {
var point = points[ i ];
position.push( point.x, point.y, point.z || 0 );
}
this.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );
return this;
},
updateFromObject: function ( object ) {
var geometry = object.geometry;
if ( object.isMesh ) {
var direct = geometry.__directGeometry;
if ( geometry.elementsNeedUpdate === true ) {
direct = undefined;
geometry.elementsNeedUpdate = false;
}
if ( direct === undefined ) {
return this.fromGeometry( geometry );
}
direct.verticesNeedUpdate = geometry.verticesNeedUpdate;
direct.normalsNeedUpdate = geometry.normalsNeedUpdate;
direct.colorsNeedUpdate = geometry.colorsNeedUpdate;
direct.uvsNeedUpdate = geometry.uvsNeedUpdate;
direct.groupsNeedUpdate = geometry.groupsNeedUpdate;
geometry.verticesNeedUpdate = false;
geometry.normalsNeedUpdate = false;
geometry.colorsNeedUpdate = false;
geometry.uvsNeedUpdate = false;
geometry.groupsNeedUpdate = false;
geometry = direct;
}
var attribute;
if ( geometry.verticesNeedUpdate === true ) {
attribute = this.attributes.position;
if ( attribute !== undefined ) {
attribute.copyVector3sArray( geometry.vertices );
attribute.needsUpdate = true;
}
geometry.verticesNeedUpdate = false;
}
if ( geometry.normalsNeedUpdate === true ) {
attribute = this.attributes.normal;
if ( attribute !== undefined ) {
attribute.copyVector3sArray( geometry.normals );
attribute.needsUpdate = true;
}
geometry.normalsNeedUpdate = false;
}
if ( geometry.colorsNeedUpdate === true ) {
attribute = this.attributes.color;
if ( attribute !== undefined ) {
attribute.copyColorsArray( geometry.colors );
attribute.needsUpdate = true;
}
geometry.colorsNeedUpdate = false;
}
if ( geometry.uvsNeedUpdate ) {
attribute = this.attributes.uv;
if ( attribute !== undefined ) {
attribute.copyVector2sArray( geometry.uvs );
attribute.needsUpdate = true;
}
geometry.uvsNeedUpdate = false;
}
if ( geometry.lineDistancesNeedUpdate ) {
attribute = this.attributes.lineDistance;
if ( attribute !== undefined ) {
attribute.copyArray( geometry.lineDistances );
attribute.needsUpdate = true;
}
geometry.lineDistancesNeedUpdate = false;
}
if ( geometry.groupsNeedUpdate ) {
geometry.computeGroups( object.geometry );
this.groups = geometry.groups;
geometry.groupsNeedUpdate = false;
}
return this;
},
fromGeometry: function ( geometry ) {
geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );
return this.fromDirectGeometry( geometry.__directGeometry );
},
fromDirectGeometry: function ( geometry ) {
var positions = new Float32Array( geometry.vertices.length * 3 );
this.setAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );
if ( geometry.normals.length > 0 ) {
var normals = new Float32Array( geometry.normals.length * 3 );
this.setAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );
}
if ( geometry.colors.length > 0 ) {
var colors = new Float32Array( geometry.colors.length * 3 );
this.setAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );
}
if ( geometry.uvs.length > 0 ) {
var uvs = new Float32Array( geometry.uvs.length * 2 );
this.setAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );
}
if ( geometry.uvs2.length > 0 ) {
var uvs2 = new Float32Array( geometry.uvs2.length * 2 );
this.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );
}
// groups
this.groups = geometry.groups;
// morphs
for ( var name in geometry.morphTargets ) {
var array = [];
var morphTargets = geometry.morphTargets[ name ];
for ( var i = 0, l = morphTargets.length; i < l; i ++ ) {
var morphTarget = morphTargets[ i ];
var attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 );
attribute.name = morphTarget.name;
array.push( attribute.copyVector3sArray( morphTarget.data ) );
}
this.morphAttributes[ name ] = array;
}
// skinning
if ( geometry.skinIndices.length > 0 ) {
var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );
this.setAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );
}
if ( geometry.skinWeights.length > 0 ) {
var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );
this.setAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );
}
//
if ( geometry.boundingSphere !== null ) {
this.boundingSphere = geometry.boundingSphere.clone();
}
if ( geometry.boundingBox !== null ) {
this.boundingBox = geometry.boundingBox.clone();
}
return this;
},
computeBoundingBox: function () {
if ( this.boundingBox === null ) {
this.boundingBox = new Box3();
}
var position = this.attributes.position;
var morphAttributesPosition = this.morphAttributes.position;
if ( position !== undefined ) {
this.boundingBox.setFromBufferAttribute( position );
// process morph attributes if present
if ( morphAttributesPosition ) {
for ( var i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {
var morphAttribute = morphAttributesPosition[ i ];
_box$2.setFromBufferAttribute( morphAttribute );
if ( this.morphTargetsRelative ) {
_vector$3.addVectors( this.boundingBox.min, _box$2.min );
this.boundingBox.expandByPoint( _vector$3 );
_vector$3.addVectors( this.boundingBox.max, _box$2.max );
this.boundingBox.expandByPoint( _vector$3 );
} else {
this.boundingBox.expandByPoint( _box$2.min );
this.boundingBox.expandByPoint( _box$2.max );
}
}
}
} else {
this.boundingBox.makeEmpty();
}
if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {
console.error( 'BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this );
}
},
computeBoundingSphere: function () {
if ( this.boundingSphere === null ) {
this.boundingSphere = new Sphere();
}
var position = this.attributes.position;
var morphAttributesPosition = this.morphAttributes.position;
if ( position ) {
// first, find the center of the bounding sphere
var center = this.boundingSphere.center;
_box$2.setFromBufferAttribute( position );
// process morph attributes if present
if ( morphAttributesPosition ) {
for ( var i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {
var morphAttribute = morphAttributesPosition[ i ];
_boxMorphTargets.setFromBufferAttribute( morphAttribute );
if ( this.morphTargetsRelative ) {
_vector$3.addVectors( _box$2.min, _boxMorphTargets.min );
_box$2.expandByPoint( _vector$3 );
_vector$3.addVectors( _box$2.max, _boxMorphTargets.max );
_box$2.expandByPoint( _vector$3 );
} else {
_box$2.expandByPoint( _boxMorphTargets.min );
_box$2.expandByPoint( _boxMorphTargets.max );
}
}
}
_box$2.getCenter( center );
// second, try to find a boundingSphere with a radius smaller than the
// boundingSphere of the boundingBox: sqrt(3) smaller in the best case
var maxRadiusSq = 0;
for ( var i = 0, il = position.count; i < il; i ++ ) {
_vector$3.fromBufferAttribute( position, i );
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$3 ) );
}
// process morph attributes if present
if ( morphAttributesPosition ) {
for ( var i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {
var morphAttribute = morphAttributesPosition[ i ];
var morphTargetsRelative = this.morphTargetsRelative;
for ( var j = 0, jl = morphAttribute.count; j < jl; j ++ ) {
_vector$3.fromBufferAttribute( morphAttribute, j );
if ( morphTargetsRelative ) {
_offset.fromBufferAttribute( position, j );
_vector$3.add( _offset );
}
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$3 ) );
}
}
}
this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
if ( isNaN( this.boundingSphere.radius ) ) {
console.error( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this );
}
}
},
computeFaceNormals: function () {
// backwards compatibility
},
computeVertexNormals: function () {
var index = this.index;
var attributes = this.attributes;
if ( attributes.position ) {
var positions = attributes.position.array;
if ( attributes.normal === undefined ) {
this.setAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );
} else {
// reset existing normals to zero
var array = attributes.normal.array;
for ( var i = 0, il = array.length; i < il; i ++ ) {
array[ i ] = 0;
}
}
var normals = attributes.normal.array;
var vA, vB, vC;
var pA = new Vector3(), pB = new Vector3(), pC = new Vector3();
var cb = new Vector3(), ab = new Vector3();
// indexed elements
if ( index ) {
var indices = index.array;
for ( var i = 0, il = index.count; i < il; i += 3 ) {
vA = indices[ i + 0 ] * 3;
vB = indices[ i + 1 ] * 3;
vC = indices[ i + 2 ] * 3;
pA.fromArray( positions, vA );
pB.fromArray( positions, vB );
pC.fromArray( positions, vC );
cb.subVectors( pC, pB );
ab.subVectors( pA, pB );
cb.cross( ab );
normals[ vA ] += cb.x;
normals[ vA + 1 ] += cb.y;
normals[ vA + 2 ] += cb.z;
normals[ vB ] += cb.x;
normals[ vB + 1 ] += cb.y;
normals[ vB + 2 ] += cb.z;
normals[ vC ] += cb.x;
normals[ vC + 1 ] += cb.y;
normals[ vC + 2 ] += cb.z;
}
} else {
// non-indexed elements (unconnected triangle soup)
for ( var i = 0, il = positions.length; i < il; i += 9 ) {
pA.fromArray( positions, i );
pB.fromArray( positions, i + 3 );
pC.fromArray( positions, i + 6 );
cb.subVectors( pC, pB );
ab.subVectors( pA, pB );
cb.cross( ab );
normals[ i ] = cb.x;
normals[ i + 1 ] = cb.y;
normals[ i + 2 ] = cb.z;
normals[ i + 3 ] = cb.x;
normals[ i + 4 ] = cb.y;
normals[ i + 5 ] = cb.z;
normals[ i + 6 ] = cb.x;
normals[ i + 7 ] = cb.y;
normals[ i + 8 ] = cb.z;
}
}
this.normalizeNormals();
attributes.normal.needsUpdate = true;
}
},
merge: function ( geometry, offset ) {
if ( ! ( geometry && geometry.isBufferGeometry ) ) {
console.error( 'BufferGeometry.merge(): geometry not an instance of BufferGeometry.', geometry );
return;
}
if ( offset === undefined ) {
offset = 0;
console.warn(
'BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '
+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'
);
}
var attributes = this.attributes;
for ( var key in attributes ) {
if ( geometry.attributes[ key ] === undefined ) { continue; }
var attribute1 = attributes[ key ];
var attributeArray1 = attribute1.array;
var attribute2 = geometry.attributes[ key ];
var attributeArray2 = attribute2.array;
var attributeOffset = attribute2.itemSize * offset;
var length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );
for ( var i = 0, j = attributeOffset; i < length; i ++, j ++ ) {
attributeArray1[ j ] = attributeArray2[ i ];
}
}
return this;
},
normalizeNormals: function () {
var normals = this.attributes.normal;
for ( var i = 0, il = normals.count; i < il; i ++ ) {
_vector$3.x = normals.getX( i );
_vector$3.y = normals.getY( i );
_vector$3.z = normals.getZ( i );
_vector$3.normalize();
normals.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );
}
},
toNonIndexed: function () {
function convertBufferAttribute( attribute, indices ) {
var array = attribute.array;
var itemSize = attribute.itemSize;
var array2 = new array.constructor( indices.length * itemSize );
var index = 0, index2 = 0;
for ( var i = 0, l = indices.length; i < l; i ++ ) {
index = indices[ i ] * itemSize;
for ( var j = 0; j < itemSize; j ++ ) {
array2[ index2 ++ ] = array[ index ++ ];
}
}
return new BufferAttribute( array2, itemSize );
}
//
if ( this.index === null ) {
console.warn( 'BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );
return this;
}
var geometry2 = new BufferGeometry();
var indices = this.index.array;
var attributes = this.attributes;
// attributes
for ( var name in attributes ) {
var attribute = attributes[ name ];
var newAttribute = convertBufferAttribute( attribute, indices );
geometry2.setAttribute( name, newAttribute );
}
// morph attributes
var morphAttributes = this.morphAttributes;
for ( name in morphAttributes ) {
var morphArray = [];
var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes
for ( var i = 0, il = morphAttribute.length; i < il; i ++ ) {
var attribute = morphAttribute[ i ];
var newAttribute = convertBufferAttribute( attribute, indices );
morphArray.push( newAttribute );
}
geometry2.morphAttributes[ name ] = morphArray;
}
geometry2.morphTargetsRelative = this.morphTargetsRelative;
// groups
var groups = this.groups;
for ( var i = 0, l = groups.length; i < l; i ++ ) {
var group = groups[ i ];
geometry2.addGroup( group.start, group.count, group.materialIndex );
}
return geometry2;
},
toJSON: function () {
var data = {
metadata: {
version: 4.5,
type: 'BufferGeometry',
generator: 'BufferGeometry.toJSON'
}
};
// standard BufferGeometry serialization
data.uuid = this.uuid;
data.type = this.type;
if ( this.name !== '' ) { data.name = this.name; }
if ( Object.keys( this.userData ).length > 0 ) { data.userData = this.userData; }
if ( this.parameters !== undefined ) {
var parameters = this.parameters;
for ( var key in parameters ) {
if ( parameters[ key ] !== undefined ) { data[ key ] = parameters[ key ]; }
}
return data;
}
data.data = { attributes: {} };
var index = this.index;
if ( index !== null ) {
data.data.index = {
type: index.array.constructor.name,
array: Array.prototype.slice.call( index.array )
};
}
var attributes = this.attributes;
for ( var key in attributes ) {
var attribute = attributes[ key ];
var attributeData = attribute.toJSON();
if ( attribute.name !== '' ) { attributeData.name = attribute.name; }
data.data.attributes[ key ] = attributeData;
}
var morphAttributes = {};
var hasMorphAttributes = false;
for ( var key in this.morphAttributes ) {
var attributeArray = this.morphAttributes[ key ];
var array = [];
for ( var i = 0, il = attributeArray.length; i < il; i ++ ) {
var attribute = attributeArray[ i ];
var attributeData = attribute.toJSON();
if ( attribute.name !== '' ) { attributeData.name = attribute.name; }
array.push( attributeData );
}
if ( array.length > 0 ) {
morphAttributes[ key ] = array;
hasMorphAttributes = true;
}
}
if ( hasMorphAttributes ) {
data.data.morphAttributes = morphAttributes;
data.data.morphTargetsRelative = this.morphTargetsRelative;
}
var groups = this.groups;
if ( groups.length > 0 ) {
data.data.groups = JSON.parse( JSON.stringify( groups ) );
}
var boundingSphere = this.boundingSphere;
if ( boundingSphere !== null ) {
data.data.boundingSphere = {
center: boundingSphere.center.toArray(),
radius: boundingSphere.radius
};
}
return data;
},
clone: function () {
/*
// Handle primitives
var parameters = this.parameters;
if ( parameters !== undefined ) {
var values = [];
for ( var key in parameters ) {
values.push( parameters[ key ] );
}
var geometry = Object.create( this.constructor.prototype );
this.constructor.apply( geometry, values );
return geometry;
}
return new this.constructor().copy( this );
*/
return new BufferGeometry().copy( this );
},
copy: function ( source ) {
var name, i, l;
// reset
this.index = null;
this.attributes = {};
this.morphAttributes = {};
this.groups = [];
this.boundingBox = null;
this.boundingSphere = null;
// name
this.name = source.name;
// index
var index = source.index;
if ( index !== null ) {
this.setIndex( index.clone() );
}
// attributes
var attributes = source.attributes;
for ( name in attributes ) {
var attribute = attributes[ name ];
this.setAttribute( name, attribute.clone() );
}
// morph attributes
var morphAttributes = source.morphAttributes;
for ( name in morphAttributes ) {
var array = [];
var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes
for ( i = 0, l = morphAttribute.length; i < l; i ++ ) {
array.push( morphAttribute[ i ].clone() );
}
this.morphAttributes[ name ] = array;
}
this.morphTargetsRelative = source.morphTargetsRelative;
// groups
var groups = source.groups;
for ( i = 0, l = groups.length; i < l; i ++ ) {
var group = groups[ i ];
this.addGroup( group.start, group.count, group.materialIndex );
}
// bounding box
var boundingBox = source.boundingBox;
if ( boundingBox !== null ) {
this.boundingBox = boundingBox.clone();
}
// bounding sphere
var boundingSphere = source.boundingSphere;
if ( boundingSphere !== null ) {
this.boundingSphere = boundingSphere.clone();
}
// draw range
this.drawRange.start = source.drawRange.start;
this.drawRange.count = source.drawRange.count;
// user data
this.userData = source.userData;
return this;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var _vector$4 = new Vector3();
var _segCenter = new Vector3();
var _segDir = new Vector3();
var _diff = new Vector3();
var _edge1 = new Vector3();
var _edge2 = new Vector3();
var _normal = new Vector3();
/**
* @author bhouston / http://clara.io
*/
function Ray( origin, direction ) {
this.origin = ( origin !== undefined ) ? origin : new Vector3();
this.direction = ( direction !== undefined ) ? direction : new Vector3( 0, 0, - 1 );
}
Object.assign( Ray.prototype, {
set: function ( origin, direction ) {
this.origin.copy( origin );
this.direction.copy( direction );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( ray ) {
this.origin.copy( ray.origin );
this.direction.copy( ray.direction );
return this;
},
at: function ( t, target ) {
if ( target === undefined ) {
console.warn( 'Ray: .at() target is now required' );
target = new Vector3();
}
return target.copy( this.direction ).multiplyScalar( t ).add( this.origin );
},
lookAt: function ( v ) {
this.direction.copy( v ).sub( this.origin ).normalize();
return this;
},
recast: function ( t ) {
this.origin.copy( this.at( t, _vector$4 ) );
return this;
},
closestPointToPoint: function ( point, target ) {
if ( target === undefined ) {
console.warn( 'Ray: .closestPointToPoint() target is now required' );
target = new Vector3();
}
target.subVectors( point, this.origin );
var directionDistance = target.dot( this.direction );
if ( directionDistance < 0 ) {
return target.copy( this.origin );
}
return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
},
distanceToPoint: function ( point ) {
return Math.sqrt( this.distanceSqToPoint( point ) );
},
distanceSqToPoint: function ( point ) {
var directionDistance = _vector$4.subVectors( point, this.origin ).dot( this.direction );
// point behind the ray
if ( directionDistance < 0 ) {
return this.origin.distanceToSquared( point );
}
_vector$4.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
return _vector$4.distanceToSquared( point );
},
distanceSqToSegment: function ( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {
// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h
// It returns the min distance between the ray and the segment
// defined by v0 and v1
// It can also set two optional targets :
// - The closest point on the ray
// - The closest point on the segment
_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );
_segDir.copy( v1 ).sub( v0 ).normalize();
_diff.copy( this.origin ).sub( _segCenter );
var segExtent = v0.distanceTo( v1 ) * 0.5;
var a01 = - this.direction.dot( _segDir );
var b0 = _diff.dot( this.direction );
var b1 = - _diff.dot( _segDir );
var c = _diff.lengthSq();
var det = Math.abs( 1 - a01 * a01 );
var s0, s1, sqrDist, extDet;
if ( det > 0 ) {
// The ray and segment are not parallel.
s0 = a01 * b1 - b0;
s1 = a01 * b0 - b1;
extDet = segExtent * det;
if ( s0 >= 0 ) {
if ( s1 >= - extDet ) {
if ( s1 <= extDet ) {
// region 0
// Minimum at interior points of ray and segment.
var invDet = 1 / det;
s0 *= invDet;
s1 *= invDet;
sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;
} else {
// region 1
s1 = segExtent;
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
} else {
// region 5
s1 = - segExtent;
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
} else {
if ( s1 <= - extDet ) {
// region 4
s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );
s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
} else if ( s1 <= extDet ) {
// region 3
s0 = 0;
s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );
sqrDist = s1 * ( s1 + 2 * b1 ) + c;
} else {
// region 2
s0 = Math.max( 0, - ( a01 * segExtent + b0 ) );
s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
}
} else {
// Ray and segment are parallel.
s1 = ( a01 > 0 ) ? - segExtent : segExtent;
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
if ( optionalPointOnRay ) {
optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );
}
if ( optionalPointOnSegment ) {
optionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );
}
return sqrDist;
},
intersectSphere: function ( sphere, target ) {
_vector$4.subVectors( sphere.center, this.origin );
var tca = _vector$4.dot( this.direction );
var d2 = _vector$4.dot( _vector$4 ) - tca * tca;
var radius2 = sphere.radius * sphere.radius;
if ( d2 > radius2 ) { return null; }
var thc = Math.sqrt( radius2 - d2 );
// t0 = first intersect point - entrance on front of sphere
var t0 = tca - thc;
// t1 = second intersect point - exit point on back of sphere
var t1 = tca + thc;
// test to see if both t0 and t1 are behind the ray - if so, return null
if ( t0 < 0 && t1 < 0 ) { return null; }
// test to see if t0 is behind the ray:
// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,
// in order to always return an intersect point that is in front of the ray.
if ( t0 < 0 ) { return this.at( t1, target ); }
// else t0 is in front of the ray, so return the first collision point scaled by t0
return this.at( t0, target );
},
intersectsSphere: function ( sphere ) {
return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );
},
distanceToPlane: function ( plane ) {
var denominator = plane.normal.dot( this.direction );
if ( denominator === 0 ) {
// line is coplanar, return origin
if ( plane.distanceToPoint( this.origin ) === 0 ) {
return 0;
}
// Null is preferable to undefined since undefined means.... it is undefined
return null;
}
var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;
// Return if the ray never intersects the plane
return t >= 0 ? t : null;
},
intersectPlane: function ( plane, target ) {
var t = this.distanceToPlane( plane );
if ( t === null ) {
return null;
}
return this.at( t, target );
},
intersectsPlane: function ( plane ) {
// check if the ray lies on the plane first
var distToPoint = plane.distanceToPoint( this.origin );
if ( distToPoint === 0 ) {
return true;
}
var denominator = plane.normal.dot( this.direction );
if ( denominator * distToPoint < 0 ) {
return true;
}
// ray origin is behind the plane (and is pointing behind it)
return false;
},
intersectBox: function ( box, target ) {
var tmin, tmax, tymin, tymax, tzmin, tzmax;
var invdirx = 1 / this.direction.x,
invdiry = 1 / this.direction.y,
invdirz = 1 / this.direction.z;
var origin = this.origin;
if ( invdirx >= 0 ) {
tmin = ( box.min.x - origin.x ) * invdirx;
tmax = ( box.max.x - origin.x ) * invdirx;
} else {
tmin = ( box.max.x - origin.x ) * invdirx;
tmax = ( box.min.x - origin.x ) * invdirx;
}
if ( invdiry >= 0 ) {
tymin = ( box.min.y - origin.y ) * invdiry;
tymax = ( box.max.y - origin.y ) * invdiry;
} else {
tymin = ( box.max.y - origin.y ) * invdiry;
tymax = ( box.min.y - origin.y ) * invdiry;
}
if ( ( tmin > tymax ) || ( tymin > tmax ) ) { return null; }
// These lines also handle the case where tmin or tmax is NaN
// (result of 0 * Infinity). x !== x returns true if x is NaN
if ( tymin > tmin || tmin !== tmin ) { tmin = tymin; }
if ( tymax < tmax || tmax !== tmax ) { tmax = tymax; }
if ( invdirz >= 0 ) {
tzmin = ( box.min.z - origin.z ) * invdirz;
tzmax = ( box.max.z - origin.z ) * invdirz;
} else {
tzmin = ( box.max.z - origin.z ) * invdirz;
tzmax = ( box.min.z - origin.z ) * invdirz;
}
if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) { return null; }
if ( tzmin > tmin || tmin !== tmin ) { tmin = tzmin; }
if ( tzmax < tmax || tmax !== tmax ) { tmax = tzmax; }
//return point closest to the ray (positive side)
if ( tmax < 0 ) { return null; }
return this.at( tmin >= 0 ? tmin : tmax, target );
},
intersectsBox: function ( box ) {
return this.intersectBox( box, _vector$4 ) !== null;
},
intersectTriangle: function ( a, b, c, backfaceCulling, target ) {
// Compute the offset origin, edges, and normal.
// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
_edge1.subVectors( b, a );
_edge2.subVectors( c, a );
_normal.crossVectors( _edge1, _edge2 );
// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
var DdN = this.direction.dot( _normal );
var sign;
if ( DdN > 0 ) {
if ( backfaceCulling ) { return null; }
sign = 1;
} else if ( DdN < 0 ) {
sign = - 1;
DdN = - DdN;
} else {
return null;
}
_diff.subVectors( this.origin, a );
var DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );
// b1 < 0, no intersection
if ( DdQxE2 < 0 ) {
return null;
}
var DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );
// b2 < 0, no intersection
if ( DdE1xQ < 0 ) {
return null;
}
// b1+b2 > 1, no intersection
if ( DdQxE2 + DdE1xQ > DdN ) {
return null;
}
// Line intersects triangle, check if ray does.
var QdN = - sign * _diff.dot( _normal );
// t < 0, no intersection
if ( QdN < 0 ) {
return null;
}
// Ray intersects triangle.
return this.at( QdN / DdN, target );
},
applyMatrix4: function ( matrix4 ) {
this.origin.applyMatrix4( matrix4 );
this.direction.transformDirection( matrix4 );
return this;
},
equals: function ( ray ) {
return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
var materialId = 0;
function Material() {
Object.defineProperty( this, 'id', { value: materialId ++ } );
this.uuid = MathUtils.generateUUID();
this.name = '';
this.type = 'Material';
this.fog = true;
this.blending = NormalBlending;
this.side = FrontSide;
this.flatShading = false;
this.vertexTangents = false;
this.vertexColors = NoColors; // NoColors, VertexColors, FaceColors
this.opacity = 1;
this.transparent = false;
this.blendSrc = SrcAlphaFactor;
this.blendDst = OneMinusSrcAlphaFactor;
this.blendEquation = AddEquation;
this.blendSrcAlpha = null;
this.blendDstAlpha = null;
this.blendEquationAlpha = null;
this.depthFunc = LessEqualDepth;
this.depthTest = true;
this.depthWrite = true;
this.stencilWriteMask = 0xff;
this.stencilFunc = AlwaysStencilFunc;
this.stencilRef = 0;
this.stencilFuncMask = 0xff;
this.stencilFail = KeepStencilOp;
this.stencilZFail = KeepStencilOp;
this.stencilZPass = KeepStencilOp;
this.stencilWrite = false;
this.clippingPlanes = null;
this.clipIntersection = false;
this.clipShadows = false;
this.shadowSide = null;
this.colorWrite = true;
this.precision = null; // override the renderer's default precision for this material
this.polygonOffset = false;
this.polygonOffsetFactor = 0;
this.polygonOffsetUnits = 0;
this.dithering = false;
this.alphaTest = 0;
this.premultipliedAlpha = false;
this.visible = true;
this.toneMapped = true;
this.userData = {};
this.version = 0;
}
Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: Material,
isMaterial: true,
onBeforeCompile: function () {},
setValues: function ( values ) {
if ( values === undefined ) { return; }
for ( var key in values ) {
var newValue = values[ key ];
if ( newValue === undefined ) {
console.warn( "Material: '" + key + "' parameter is undefined." );
continue;
}
// for backward compatability if shading is set in the constructor
if ( key === 'shading' ) {
console.warn( '' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
this.flatShading = ( newValue === FlatShading ) ? true : false;
continue;
}
var currentValue = this[ key ];
if ( currentValue === undefined ) {
console.warn( "" + this.type + ": '" + key + "' is not a property of this material." );
continue;
}
if ( currentValue && currentValue.isColor ) {
currentValue.set( newValue );
} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {
currentValue.copy( newValue );
} else {
this[ key ] = newValue;
}
}
},
toJSON: function ( meta ) {
var isRoot = ( meta === undefined || typeof meta === 'string' );
if ( isRoot ) {
meta = {
textures: {},
images: {}
};
}
var data = {
metadata: {
version: 4.5,
type: 'Material',
generator: 'Material.toJSON'
}
};
// standard Material serialization
data.uuid = this.uuid;
data.type = this.type;
if ( this.name !== '' ) { data.name = this.name; }
if ( this.color && this.color.isColor ) { data.color = this.color.getHex(); }
if ( this.roughness !== undefined ) { data.roughness = this.roughness; }
if ( this.metalness !== undefined ) { data.metalness = this.metalness; }
if ( this.sheen && this.sheen.isColor ) { data.sheen = this.sheen.getHex(); }
if ( this.emissive && this.emissive.isColor ) { data.emissive = this.emissive.getHex(); }
if ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) { data.emissiveIntensity = this.emissiveIntensity; }
if ( this.specular && this.specular.isColor ) { data.specular = this.specular.getHex(); }
if ( this.shininess !== undefined ) { data.shininess = this.shininess; }
if ( this.clearcoat !== undefined ) { data.clearcoat = this.clearcoat; }
if ( this.clearcoatRoughness !== undefined ) { data.clearcoatRoughness = this.clearcoatRoughness; }
if ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {
data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;
data.clearcoatNormalScale = this.clearcoatNormalScale.toArray();
}
if ( this.map && this.map.isTexture ) { data.map = this.map.toJSON( meta ).uuid; }
if ( this.matcap && this.matcap.isTexture ) { data.matcap = this.matcap.toJSON( meta ).uuid; }
if ( this.alphaMap && this.alphaMap.isTexture ) { data.alphaMap = this.alphaMap.toJSON( meta ).uuid; }
if ( this.lightMap && this.lightMap.isTexture ) { data.lightMap = this.lightMap.toJSON( meta ).uuid; }
if ( this.aoMap && this.aoMap.isTexture ) {
data.aoMap = this.aoMap.toJSON( meta ).uuid;
data.aoMapIntensity = this.aoMapIntensity;
}
if ( this.bumpMap && this.bumpMap.isTexture ) {
data.bumpMap = this.bumpMap.toJSON( meta ).uuid;
data.bumpScale = this.bumpScale;
}
if ( this.normalMap && this.normalMap.isTexture ) {
data.normalMap = this.normalMap.toJSON( meta ).uuid;
data.normalMapType = this.normalMapType;
data.normalScale = this.normalScale.toArray();
}
if ( this.displacementMap && this.displacementMap.isTexture ) {
data.displacementMap = this.displacementMap.toJSON( meta ).uuid;
data.displacementScale = this.displacementScale;
data.displacementBias = this.displacementBias;
}
if ( this.roughnessMap && this.roughnessMap.isTexture ) { data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; }
if ( this.metalnessMap && this.metalnessMap.isTexture ) { data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; }
if ( this.emissiveMap && this.emissiveMap.isTexture ) { data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; }
if ( this.specularMap && this.specularMap.isTexture ) { data.specularMap = this.specularMap.toJSON( meta ).uuid; }
if ( this.envMap && this.envMap.isTexture ) {
data.envMap = this.envMap.toJSON( meta ).uuid;
data.reflectivity = this.reflectivity; // Scale behind envMap
data.refractionRatio = this.refractionRatio;
if ( this.combine !== undefined ) { data.combine = this.combine; }
if ( this.envMapIntensity !== undefined ) { data.envMapIntensity = this.envMapIntensity; }
}
if ( this.gradientMap && this.gradientMap.isTexture ) {
data.gradientMap = this.gradientMap.toJSON( meta ).uuid;
}
if ( this.size !== undefined ) { data.size = this.size; }
if ( this.sizeAttenuation !== undefined ) { data.sizeAttenuation = this.sizeAttenuation; }
if ( this.blending !== NormalBlending ) { data.blending = this.blending; }
if ( this.flatShading === true ) { data.flatShading = this.flatShading; }
if ( this.side !== FrontSide ) { data.side = this.side; }
if ( this.vertexColors !== NoColors ) { data.vertexColors = this.vertexColors; }
if ( this.opacity < 1 ) { data.opacity = this.opacity; }
if ( this.transparent === true ) { data.transparent = this.transparent; }
data.depthFunc = this.depthFunc;
data.depthTest = this.depthTest;
data.depthWrite = this.depthWrite;
data.stencilWrite = this.stencilWrite;
data.stencilWriteMask = this.stencilWriteMask;
data.stencilFunc = this.stencilFunc;
data.stencilRef = this.stencilRef;
data.stencilFuncMask = this.stencilFuncMask;
data.stencilFail = this.stencilFail;
data.stencilZFail = this.stencilZFail;
data.stencilZPass = this.stencilZPass;
// rotation (SpriteMaterial)
if ( this.rotation && this.rotation !== 0 ) { data.rotation = this.rotation; }
if ( this.polygonOffset === true ) { data.polygonOffset = true; }
if ( this.polygonOffsetFactor !== 0 ) { data.polygonOffsetFactor = this.polygonOffsetFactor; }
if ( this.polygonOffsetUnits !== 0 ) { data.polygonOffsetUnits = this.polygonOffsetUnits; }
if ( this.linewidth && this.linewidth !== 1 ) { data.linewidth = this.linewidth; }
if ( this.dashSize !== undefined ) { data.dashSize = this.dashSize; }
if ( this.gapSize !== undefined ) { data.gapSize = this.gapSize; }
if ( this.scale !== undefined ) { data.scale = this.scale; }
if ( this.dithering === true ) { data.dithering = true; }
if ( this.alphaTest > 0 ) { data.alphaTest = this.alphaTest; }
if ( this.premultipliedAlpha === true ) { data.premultipliedAlpha = this.premultipliedAlpha; }
if ( this.wireframe === true ) { data.wireframe = this.wireframe; }
if ( this.wireframeLinewidth > 1 ) { data.wireframeLinewidth = this.wireframeLinewidth; }
if ( this.wireframeLinecap !== 'round' ) { data.wireframeLinecap = this.wireframeLinecap; }
if ( this.wireframeLinejoin !== 'round' ) { data.wireframeLinejoin = this.wireframeLinejoin; }
if ( this.morphTargets === true ) { data.morphTargets = true; }
if ( this.morphNormals === true ) { data.morphNormals = true; }
if ( this.skinning === true ) { data.skinning = true; }
if ( this.visible === false ) { data.visible = false; }
if ( this.toneMapped === false ) { data.toneMapped = false; }
if ( JSON.stringify( this.userData ) !== '{}' ) { data.userData = this.userData; }
// TODO: Copied from Object3D.toJSON
function extractFromCache( cache ) {
var values = [];
for ( var key in cache ) {
var data = cache[ key ];
delete data.metadata;
values.push( data );
}
return values;
}
if ( isRoot ) {
var textures = extractFromCache( meta.textures );
var images = extractFromCache( meta.images );
if ( textures.length > 0 ) { data.textures = textures; }
if ( images.length > 0 ) { data.images = images; }
}
return data;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( source ) {
this.name = source.name;
this.fog = source.fog;
this.blending = source.blending;
this.side = source.side;
this.flatShading = source.flatShading;
this.vertexTangents = source.vertexTangents;
this.vertexColors = source.vertexColors;
this.opacity = source.opacity;
this.transparent = source.transparent;
this.blendSrc = source.blendSrc;
this.blendDst = source.blendDst;
this.blendEquation = source.blendEquation;
this.blendSrcAlpha = source.blendSrcAlpha;
this.blendDstAlpha = source.blendDstAlpha;
this.blendEquationAlpha = source.blendEquationAlpha;
this.depthFunc = source.depthFunc;
this.depthTest = source.depthTest;
this.depthWrite = source.depthWrite;
this.stencilWriteMask = source.stencilWriteMask;
this.stencilFunc = source.stencilFunc;
this.stencilRef = source.stencilRef;
this.stencilFuncMask = source.stencilFuncMask;
this.stencilFail = source.stencilFail;
this.stencilZFail = source.stencilZFail;
this.stencilZPass = source.stencilZPass;
this.stencilWrite = source.stencilWrite;
var srcPlanes = source.clippingPlanes,
dstPlanes = null;
if ( srcPlanes !== null ) {
var n = srcPlanes.length;
dstPlanes = new Array( n );
for ( var i = 0; i !== n; ++ i )
{ dstPlanes[ i ] = srcPlanes[ i ].clone(); }
}
this.clippingPlanes = dstPlanes;
this.clipIntersection = source.clipIntersection;
this.clipShadows = source.clipShadows;
this.shadowSide = source.shadowSide;
this.colorWrite = source.colorWrite;
this.precision = source.precision;
this.polygonOffset = source.polygonOffset;
this.polygonOffsetFactor = source.polygonOffsetFactor;
this.polygonOffsetUnits = source.polygonOffsetUnits;
this.dithering = source.dithering;
this.alphaTest = source.alphaTest;
this.premultipliedAlpha = source.premultipliedAlpha;
this.visible = source.visible;
this.toneMapped = source.toneMapped;
this.userData = JSON.parse( JSON.stringify( source.userData ) );
return this;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
}
} );
Object.defineProperty( Material.prototype, 'needsUpdate', {
set: function ( value ) {
if ( value === true ) { this.version ++; }
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: ,
* opacity: ,
*
* linewidth: ,
* linecap: "round",
* linejoin: "round"
* }
*/
function LineBasicMaterial( parameters ) {
Material.call( this );
this.type = 'LineBasicMaterial';
this.color = new Color( 0xffffff );
this.linewidth = 1;
this.linecap = 'round';
this.linejoin = 'round';
this.setValues( parameters );
}
LineBasicMaterial.prototype = Object.create( Material.prototype );
LineBasicMaterial.prototype.constructor = LineBasicMaterial;
LineBasicMaterial.prototype.isLineBasicMaterial = true;
LineBasicMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.linewidth = source.linewidth;
this.linecap = source.linecap;
this.linejoin = source.linejoin;
return this;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
*/
var _start = new Vector3();
var _end = new Vector3();
var _inverseMatrix = new Matrix4();
var _ray = new Ray();
var _sphere = new Sphere();
function Line( geometry, material, mode ) {
if ( mode === 1 ) {
console.error( 'Line: parameter LinePieces no longer supported. Use LineSegments instead.' );
}
Object3D.call( this );
this.type = 'Line';
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
this.material = material !== undefined ? material : new LineBasicMaterial();
}
Line.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Line,
isLine: true,
computeLineDistances: function () {
var geometry = this.geometry;
if ( geometry.isBufferGeometry ) {
// we assume non-indexed geometry
if ( geometry.index === null ) {
var positionAttribute = geometry.attributes.position;
var lineDistances = [ 0 ];
for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) {
_start.fromBufferAttribute( positionAttribute, i - 1 );
_end.fromBufferAttribute( positionAttribute, i );
lineDistances[ i ] = lineDistances[ i - 1 ];
lineDistances[ i ] += _start.distanceTo( _end );
}
geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );
} else {
console.warn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );
}
} else if ( geometry.isGeometry ) {
var vertices = geometry.vertices;
var lineDistances = geometry.lineDistances;
lineDistances[ 0 ] = 0;
for ( var i = 1, l = vertices.length; i < l; i ++ ) {
lineDistances[ i ] = lineDistances[ i - 1 ];
lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );
}
}
return this;
},
raycast: function ( raycaster, intersects ) {
var precision = raycaster.linePrecision;
var geometry = this.geometry;
var matrixWorld = this.matrixWorld;
// Checking boundingSphere distance to ray
if ( geometry.boundingSphere === null ) { geometry.computeBoundingSphere(); }
_sphere.copy( geometry.boundingSphere );
_sphere.applyMatrix4( matrixWorld );
_sphere.radius += precision;
if ( raycaster.ray.intersectsSphere( _sphere ) === false ) { return; }
//
_inverseMatrix.getInverse( matrixWorld );
_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );
var localPrecision = precision / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );
var localPrecisionSq = localPrecision * localPrecision;
var vStart = new Vector3();
var vEnd = new Vector3();
var interSegment = new Vector3();
var interRay = new Vector3();
var step = ( this && this.isLineSegments ) ? 2 : 1;
if ( geometry.isBufferGeometry ) {
var index = geometry.index;
var attributes = geometry.attributes;
var positions = attributes.position.array;
if ( index !== null ) {
var indices = index.array;
for ( var i = 0, l = indices.length - 1; i < l; i += step ) {
var a = indices[ i ];
var b = indices[ i + 1 ];
vStart.fromArray( positions, a * 3 );
vEnd.fromArray( positions, b * 3 );
var distSq = _ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
if ( distSq > localPrecisionSq ) { continue; }
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
var distance = raycaster.ray.origin.distanceTo( interRay );
if ( distance < raycaster.near || distance > raycaster.far ) { continue; }
intersects.push( {
distance: distance,
// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
index: i,
face: null,
faceIndex: null,
object: this
} );
}
} else {
for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {
vStart.fromArray( positions, 3 * i );
vEnd.fromArray( positions, 3 * i + 3 );
var distSq = _ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
if ( distSq > localPrecisionSq ) { continue; }
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
var distance = raycaster.ray.origin.distanceTo( interRay );
if ( distance < raycaster.near || distance > raycaster.far ) { continue; }
intersects.push( {
distance: distance,
// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
index: i,
face: null,
faceIndex: null,
object: this
} );
}
}
} else if ( geometry.isGeometry ) {
var vertices = geometry.vertices;
var nbVertices = vertices.length;
for ( var i = 0; i < nbVertices - 1; i += step ) {
var distSq = _ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );
if ( distSq > localPrecisionSq ) { continue; }
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
var distance = raycaster.ray.origin.distanceTo( interRay );
if ( distance < raycaster.near || distance > raycaster.far ) { continue; }
intersects.push( {
distance: distance,
// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
index: i,
face: null,
faceIndex: null,
object: this
} );
}
}
},
clone: function () {
return new this.constructor( this.geometry, this.material ).copy( this );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author bhouston / http://clara.io
*/
var _vector1 = new Vector3();
var _vector2 = new Vector3();
var _normalMatrix = new Matrix3();
function Plane( normal, constant ) {
// normal is assumed to be normalized
this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );
this.constant = ( constant !== undefined ) ? constant : 0;
}
Object.assign( Plane.prototype, {
isPlane: true,
set: function ( normal, constant ) {
this.normal.copy( normal );
this.constant = constant;
return this;
},
setComponents: function ( x, y, z, w ) {
this.normal.set( x, y, z );
this.constant = w;
return this;
},
setFromNormalAndCoplanarPoint: function ( normal, point ) {
this.normal.copy( normal );
this.constant = - point.dot( this.normal );
return this;
},
setFromCoplanarPoints: function ( a, b, c ) {
var normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();
// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
this.setFromNormalAndCoplanarPoint( normal, a );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( plane ) {
this.normal.copy( plane.normal );
this.constant = plane.constant;
return this;
},
normalize: function () {
// Note: will lead to a divide by zero if the plane is invalid.
var inverseNormalLength = 1.0 / this.normal.length();
this.normal.multiplyScalar( inverseNormalLength );
this.constant *= inverseNormalLength;
return this;
},
negate: function () {
this.constant *= - 1;
this.normal.negate();
return this;
},
distanceToPoint: function ( point ) {
return this.normal.dot( point ) + this.constant;
},
distanceToSphere: function ( sphere ) {
return this.distanceToPoint( sphere.center ) - sphere.radius;
},
projectPoint: function ( point, target ) {
if ( target === undefined ) {
console.warn( 'Plane: .projectPoint() target is now required' );
target = new Vector3();
}
return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );
},
intersectLine: function ( line, target ) {
if ( target === undefined ) {
console.warn( 'Plane: .intersectLine() target is now required' );
target = new Vector3();
}
var direction = line.delta( _vector1 );
var denominator = this.normal.dot( direction );
if ( denominator === 0 ) {
// line is coplanar, return origin
if ( this.distanceToPoint( line.start ) === 0 ) {
return target.copy( line.start );
}
// Unsure if this is the correct method to handle this case.
return undefined;
}
var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;
if ( t < 0 || t > 1 ) {
return undefined;
}
return target.copy( direction ).multiplyScalar( t ).add( line.start );
},
intersectsLine: function ( line ) {
// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
var startSign = this.distanceToPoint( line.start );
var endSign = this.distanceToPoint( line.end );
return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );
},
intersectsBox: function ( box ) {
return box.intersectsPlane( this );
},
intersectsSphere: function ( sphere ) {
return sphere.intersectsPlane( this );
},
coplanarPoint: function ( target ) {
if ( target === undefined ) {
console.warn( 'Plane: .coplanarPoint() target is now required' );
target = new Vector3();
}
return target.copy( this.normal ).multiplyScalar( - this.constant );
},
applyMatrix4: function ( matrix, optionalNormalMatrix ) {
var normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );
var referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );
var normal = this.normal.applyMatrix3( normalMatrix ).normalize();
this.constant = - referencePoint.dot( normal );
return this;
},
translate: function ( offset ) {
this.constant -= offset.dot( this.normal );
return this;
},
equals: function ( plane ) {
return plane.normal.equals( this.normal ) && ( plane.constant === this.constant );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author bhouston / http://clara.io
* @author mrdoob / http://mrdoob.com/
*/
var _v0$1 = new Vector3();
var _v1$3 = new Vector3();
var _v2$1 = new Vector3();
var _v3 = new Vector3();
var _vab = new Vector3();
var _vac = new Vector3();
var _vbc = new Vector3();
var _vap = new Vector3();
var _vbp = new Vector3();
var _vcp = new Vector3();
function Triangle( a, b, c ) {
this.a = ( a !== undefined ) ? a : new Vector3();
this.b = ( b !== undefined ) ? b : new Vector3();
this.c = ( c !== undefined ) ? c : new Vector3();
}
Object.assign( Triangle, {
getNormal: function ( a, b, c, target ) {
if ( target === undefined ) {
console.warn( 'Triangle: .getNormal() target is now required' );
target = new Vector3();
}
target.subVectors( c, b );
_v0$1.subVectors( a, b );
target.cross( _v0$1 );
var targetLengthSq = target.lengthSq();
if ( targetLengthSq > 0 ) {
return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );
}
return target.set( 0, 0, 0 );
},
// static/instance method to calculate barycentric coordinates
// based on: http://www.blackpawn.com/texts/pointinpoly/default.html
getBarycoord: function ( point, a, b, c, target ) {
_v0$1.subVectors( c, a );
_v1$3.subVectors( b, a );
_v2$1.subVectors( point, a );
var dot00 = _v0$1.dot( _v0$1 );
var dot01 = _v0$1.dot( _v1$3 );
var dot02 = _v0$1.dot( _v2$1 );
var dot11 = _v1$3.dot( _v1$3 );
var dot12 = _v1$3.dot( _v2$1 );
var denom = ( dot00 * dot11 - dot01 * dot01 );
if ( target === undefined ) {
console.warn( 'Triangle: .getBarycoord() target is now required' );
target = new Vector3();
}
// collinear or singular triangle
if ( denom === 0 ) {
// arbitrary location outside of triangle?
// not sure if this is the best idea, maybe should be returning undefined
return target.set( - 2, - 1, - 1 );
}
var invDenom = 1 / denom;
var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
// barycentric coordinates must always sum to 1
return target.set( 1 - u - v, v, u );
},
containsPoint: function ( point, a, b, c ) {
Triangle.getBarycoord( point, a, b, c, _v3 );
return ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );
},
getUV: function ( point, p1, p2, p3, uv1, uv2, uv3, target ) {
this.getBarycoord( point, p1, p2, p3, _v3 );
target.set( 0, 0 );
target.addScaledVector( uv1, _v3.x );
target.addScaledVector( uv2, _v3.y );
target.addScaledVector( uv3, _v3.z );
return target;
},
isFrontFacing: function ( a, b, c, direction ) {
_v0$1.subVectors( c, b );
_v1$3.subVectors( a, b );
// strictly front facing
return ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;
}
} );
Object.assign( Triangle.prototype, {
set: function ( a, b, c ) {
this.a.copy( a );
this.b.copy( b );
this.c.copy( c );
return this;
},
setFromPointsAndIndices: function ( points, i0, i1, i2 ) {
this.a.copy( points[ i0 ] );
this.b.copy( points[ i1 ] );
this.c.copy( points[ i2 ] );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( triangle ) {
this.a.copy( triangle.a );
this.b.copy( triangle.b );
this.c.copy( triangle.c );
return this;
},
getArea: function () {
_v0$1.subVectors( this.c, this.b );
_v1$3.subVectors( this.a, this.b );
return _v0$1.cross( _v1$3 ).length() * 0.5;
},
getMidpoint: function ( target ) {
if ( target === undefined ) {
console.warn( 'Triangle: .getMidpoint() target is now required' );
target = new Vector3();
}
return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );
},
getNormal: function ( target ) {
return Triangle.getNormal( this.a, this.b, this.c, target );
},
getPlane: function ( target ) {
if ( target === undefined ) {
console.warn( 'Triangle: .getPlane() target is now required' );
target = new Plane();
}
return target.setFromCoplanarPoints( this.a, this.b, this.c );
},
getBarycoord: function ( point, target ) {
return Triangle.getBarycoord( point, this.a, this.b, this.c, target );
},
getUV: function ( point, uv1, uv2, uv3, target ) {
return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );
},
containsPoint: function ( point ) {
return Triangle.containsPoint( point, this.a, this.b, this.c );
},
isFrontFacing: function ( direction ) {
return Triangle.isFrontFacing( this.a, this.b, this.c, direction );
},
intersectsBox: function ( box ) {
return box.intersectsTriangle( this );
},
closestPointToPoint: function ( p, target ) {
if ( target === undefined ) {
console.warn( 'Triangle: .closestPointToPoint() target is now required' );
target = new Vector3();
}
var a = this.a, b = this.b, c = this.c;
var v, w;
// algorithm thanks to Real-Time Collision Detection by Christer Ericson,
// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,
// under the accompanying license; see chapter 5.1.5 for detailed explanation.
// basically, we're distinguishing which of the voronoi regions of the triangle
// the point lies in with the minimum amount of redundant computation.
_vab.subVectors( b, a );
_vac.subVectors( c, a );
_vap.subVectors( p, a );
var d1 = _vab.dot( _vap );
var d2 = _vac.dot( _vap );
if ( d1 <= 0 && d2 <= 0 ) {
// vertex region of A; barycentric coords (1, 0, 0)
return target.copy( a );
}
_vbp.subVectors( p, b );
var d3 = _vab.dot( _vbp );
var d4 = _vac.dot( _vbp );
if ( d3 >= 0 && d4 <= d3 ) {
// vertex region of B; barycentric coords (0, 1, 0)
return target.copy( b );
}
var vc = d1 * d4 - d3 * d2;
if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {
v = d1 / ( d1 - d3 );
// edge region of AB; barycentric coords (1-v, v, 0)
return target.copy( a ).addScaledVector( _vab, v );
}
_vcp.subVectors( p, c );
var d5 = _vab.dot( _vcp );
var d6 = _vac.dot( _vcp );
if ( d6 >= 0 && d5 <= d6 ) {
// vertex region of C; barycentric coords (0, 0, 1)
return target.copy( c );
}
var vb = d5 * d2 - d1 * d6;
if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {
w = d2 / ( d2 - d6 );
// edge region of AC; barycentric coords (1-w, 0, w)
return target.copy( a ).addScaledVector( _vac, w );
}
var va = d3 * d6 - d5 * d4;
if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {
_vbc.subVectors( c, b );
w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );
// edge region of BC; barycentric coords (0, 1-w, w)
return target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC
}
// face region
var denom = 1 / ( va + vb + vc );
// u = va * denom
v = vb * denom;
w = vc * denom;
return target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );
},
equals: function ( triangle ) {
return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
function Face3( a, b, c, normal, color, materialIndex ) {
this.a = a;
this.b = b;
this.c = c;
this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();
this.vertexNormals = Array.isArray( normal ) ? normal : [];
this.color = ( color && color.isColor ) ? color : new Color();
this.vertexColors = Array.isArray( color ) ? color : [];
this.materialIndex = materialIndex !== undefined ? materialIndex : 0;
}
Object.assign( Face3.prototype, {
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( source ) {
this.a = source.a;
this.b = source.b;
this.c = source.c;
this.normal.copy( source.normal );
this.color.copy( source.color );
this.materialIndex = source.materialIndex;
for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {
this.vertexNormals[ i ] = source.vertexNormals[ i ].clone();
}
for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {
this.vertexColors[ i ] = source.vertexColors[ i ].clone();
}
return this;
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: ,
* opacity: ,
* map: new Texture( ),
*
* lightMap: new Texture( ),
* lightMapIntensity:
*
* aoMap: new Texture( ),
* aoMapIntensity:
*
* specularMap: new Texture( ),
*
* alphaMap: new Texture( ),
*
* envMap: new CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: Multiply,
* reflectivity: ,
* refractionRatio: ,
*
* depthTest: ,
* depthWrite: ,
*
* wireframe: ,
* wireframeLinewidth: ,
*
* skinning: ,
* morphTargets:
* }
*/
function MeshBasicMaterial( parameters ) {
Material.call( this );
this.type = 'MeshBasicMaterial';
this.color = new Color( 0xffffff ); // emissive
this.map = null;
this.lightMap = null;
this.lightMapIntensity = 1.0;
this.aoMap = null;
this.aoMapIntensity = 1.0;
this.specularMap = null;
this.alphaMap = null;
this.envMap = null;
this.combine = MultiplyOperation;
this.reflectivity = 1;
this.refractionRatio = 0.98;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.wireframeLinecap = 'round';
this.wireframeLinejoin = 'round';
this.skinning = false;
this.morphTargets = false;
this.setValues( parameters );
}
MeshBasicMaterial.prototype = Object.create( Material.prototype );
MeshBasicMaterial.prototype.constructor = MeshBasicMaterial;
MeshBasicMaterial.prototype.isMeshBasicMaterial = true;
MeshBasicMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.map = source.map;
this.lightMap = source.lightMap;
this.lightMapIntensity = source.lightMapIntensity;
this.aoMap = source.aoMap;
this.aoMapIntensity = source.aoMapIntensity;
this.specularMap = source.specularMap;
this.alphaMap = source.alphaMap;
this.envMap = source.envMap;
this.combine = source.combine;
this.reflectivity = source.reflectivity;
this.refractionRatio = source.refractionRatio;
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
this.wireframeLinecap = source.wireframeLinecap;
this.wireframeLinejoin = source.wireframeLinejoin;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
return this;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author jonobr1 / http://jonobr1.com/
*/
var _inverseMatrix$1 = new Matrix4();
var _ray$1 = new Ray();
var _sphere$1 = new Sphere();
var _vA = new Vector3();
var _vB = new Vector3();
var _vC = new Vector3();
var _tempA = new Vector3();
var _tempB = new Vector3();
var _tempC = new Vector3();
var _morphA = new Vector3();
var _morphB = new Vector3();
var _morphC = new Vector3();
var _uvA = new Vector2();
var _uvB = new Vector2();
var _uvC = new Vector2();
var _intersectionPoint = new Vector3();
var _intersectionPointWorld = new Vector3();
function Mesh( geometry, material ) {
Object3D.call( this );
this.type = 'Mesh';
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
this.material = material !== undefined ? material : new MeshBasicMaterial();
this.updateMorphTargets();
}
Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Mesh,
isMesh: true,
copy: function ( source ) {
Object3D.prototype.copy.call( this, source );
if ( source.morphTargetInfluences !== undefined ) {
this.morphTargetInfluences = source.morphTargetInfluences.slice();
}
if ( source.morphTargetDictionary !== undefined ) {
this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );
}
return this;
},
updateMorphTargets: function () {
var geometry = this.geometry;
var m, ml, name;
if ( geometry.isBufferGeometry ) {
var morphAttributes = geometry.morphAttributes;
var keys = Object.keys( morphAttributes );
if ( keys.length > 0 ) {
var morphAttribute = morphAttributes[ keys[ 0 ] ];
if ( morphAttribute !== undefined ) {
this.morphTargetInfluences = [];
this.morphTargetDictionary = {};
for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {
name = morphAttribute[ m ].name || String( m );
this.morphTargetInfluences.push( 0 );
this.morphTargetDictionary[ name ] = m;
}
}
}
} else {
var morphTargets = geometry.morphTargets;
if ( morphTargets !== undefined && morphTargets.length > 0 ) {
console.error( 'Mesh.updateMorphTargets() no longer supports Geometry. Use BufferGeometry instead.' );
}
}
},
raycast: function ( raycaster, intersects ) {
var geometry = this.geometry;
var material = this.material;
var matrixWorld = this.matrixWorld;
if ( material === undefined ) { return; }
// Checking boundingSphere distance to ray
if ( geometry.boundingSphere === null ) { geometry.computeBoundingSphere(); }
_sphere$1.copy( geometry.boundingSphere );
_sphere$1.applyMatrix4( matrixWorld );
if ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) { return; }
//
_inverseMatrix$1.getInverse( matrixWorld );
_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );
// Check boundingBox before continuing
if ( geometry.boundingBox !== null ) {
if ( _ray$1.intersectsBox( geometry.boundingBox ) === false ) { return; }
}
var intersection;
if ( geometry.isBufferGeometry ) {
var a, b, c;
var index = geometry.index;
var position = geometry.attributes.position;
var morphPosition = geometry.morphAttributes.position;
var morphTargetsRelative = geometry.morphTargetsRelative;
var uv = geometry.attributes.uv;
var uv2 = geometry.attributes.uv2;
var groups = geometry.groups;
var drawRange = geometry.drawRange;
var i, j, il, jl;
var group, groupMaterial;
var start, end;
if ( index !== null ) {
// indexed buffer geometry
if ( Array.isArray( material ) ) {
for ( i = 0, il = groups.length; i < il; i ++ ) {
group = groups[ i ];
groupMaterial = material[ group.materialIndex ];
start = Math.max( group.start, drawRange.start );
end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );
for ( j = start, jl = end; j < jl; j += 3 ) {
a = index.getX( j );
b = index.getX( j + 1 );
c = index.getX( j + 2 );
intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$1, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
if ( intersection ) {
intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics
intersection.face.materialIndex = group.materialIndex;
intersects.push( intersection );
}
}
}
} else {
start = Math.max( 0, drawRange.start );
end = Math.min( index.count, ( drawRange.start + drawRange.count ) );
for ( i = start, il = end; i < il; i += 3 ) {
a = index.getX( i );
b = index.getX( i + 1 );
c = index.getX( i + 2 );
intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$1, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
if ( intersection ) {
intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics
intersects.push( intersection );
}
}
}
} else if ( position !== undefined ) {
// non-indexed buffer geometry
if ( Array.isArray( material ) ) {
for ( i = 0, il = groups.length; i < il; i ++ ) {
group = groups[ i ];
groupMaterial = material[ group.materialIndex ];
start = Math.max( group.start, drawRange.start );
end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );
for ( j = start, jl = end; j < jl; j += 3 ) {
a = j;
b = j + 1;
c = j + 2;
intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$1, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
if ( intersection ) {
intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics
intersection.face.materialIndex = group.materialIndex;
intersects.push( intersection );
}
}
}
} else {
start = Math.max( 0, drawRange.start );
end = Math.min( position.count, ( drawRange.start + drawRange.count ) );
for ( i = start, il = end; i < il; i += 3 ) {
a = i;
b = i + 1;
c = i + 2;
intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$1, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
if ( intersection ) {
intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics
intersects.push( intersection );
}
}
}
}
} else if ( geometry.isGeometry ) {
var fvA, fvB, fvC;
var isMultiMaterial = Array.isArray( material );
var vertices = geometry.vertices;
var faces = geometry.faces;
var uvs;
var faceVertexUvs = geometry.faceVertexUvs[ 0 ];
if ( faceVertexUvs.length > 0 ) { uvs = faceVertexUvs; }
for ( var f = 0, fl = faces.length; f < fl; f ++ ) {
var face = faces[ f ];
var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;
if ( faceMaterial === undefined ) { continue; }
fvA = vertices[ face.a ];
fvB = vertices[ face.b ];
fvC = vertices[ face.c ];
intersection = checkIntersection( this, faceMaterial, raycaster, _ray$1, fvA, fvB, fvC, _intersectionPoint );
if ( intersection ) {
if ( uvs && uvs[ f ] ) {
var uvs_f = uvs[ f ];
_uvA.copy( uvs_f[ 0 ] );
_uvB.copy( uvs_f[ 1 ] );
_uvC.copy( uvs_f[ 2 ] );
intersection.uv = Triangle.getUV( _intersectionPoint, fvA, fvB, fvC, _uvA, _uvB, _uvC, new Vector2() );
}
intersection.face = face;
intersection.faceIndex = f;
intersects.push( intersection );
}
}
}
},
clone: function () {
return new this.constructor( this.geometry, this.material ).copy( this );
}
} );
function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {
var intersect;
if ( material.side === BackSide ) {
intersect = ray.intersectTriangle( pC, pB, pA, true, point );
} else {
intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );
}
if ( intersect === null ) { return null; }
_intersectionPointWorld.copy( point );
_intersectionPointWorld.applyMatrix4( object.matrixWorld );
var distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );
if ( distance < raycaster.near || distance > raycaster.far ) { return null; }
return {
distance: distance,
point: _intersectionPointWorld.clone(),
object: object
};
}
function checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {
_vA.fromBufferAttribute( position, a );
_vB.fromBufferAttribute( position, b );
_vC.fromBufferAttribute( position, c );
var morphInfluences = object.morphTargetInfluences;
if ( material.morphTargets && morphPosition && morphInfluences ) {
_morphA.set( 0, 0, 0 );
_morphB.set( 0, 0, 0 );
_morphC.set( 0, 0, 0 );
for ( var i = 0, il = morphPosition.length; i < il; i ++ ) {
var influence = morphInfluences[ i ];
var morphAttribute = morphPosition[ i ];
if ( influence === 0 ) { continue; }
_tempA.fromBufferAttribute( morphAttribute, a );
_tempB.fromBufferAttribute( morphAttribute, b );
_tempC.fromBufferAttribute( morphAttribute, c );
if ( morphTargetsRelative ) {
_morphA.addScaledVector( _tempA, influence );
_morphB.addScaledVector( _tempB, influence );
_morphC.addScaledVector( _tempC, influence );
} else {
_morphA.addScaledVector( _tempA.sub( _vA ), influence );
_morphB.addScaledVector( _tempB.sub( _vB ), influence );
_morphC.addScaledVector( _tempC.sub( _vC ), influence );
}
}
_vA.add( _morphA );
_vB.add( _morphB );
_vC.add( _morphC );
}
var intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );
if ( intersection ) {
if ( uv ) {
_uvA.fromBufferAttribute( uv, a );
_uvB.fromBufferAttribute( uv, b );
_uvC.fromBufferAttribute( uv, c );
intersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );
}
if ( uv2 ) {
_uvA.fromBufferAttribute( uv2, a );
_uvB.fromBufferAttribute( uv2, b );
_uvC.fromBufferAttribute( uv2, c );
intersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );
}
var face = new Face3( a, b, c );
Triangle.getNormal( _vA, _vB, _vC, face.normal );
intersection.face = face;
}
return intersection;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author kile / http://kile.stravaganza.org/
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author bhouston / http://clara.io
*/
var _geometryId = 0; // Geometry uses even numbers as Id
var _m1$3 = new Matrix4();
var _obj$1 = new Object3D();
var _offset$1 = new Vector3();
function Geometry() {
Object.defineProperty( this, 'id', { value: _geometryId += 2 } );
this.uuid = MathUtils.generateUUID();
this.name = '';
this.type = 'Geometry';
this.vertices = [];
this.colors = [];
this.faces = [];
this.faceVertexUvs = [[]];
this.morphTargets = [];
this.morphNormals = [];
this.skinWeights = [];
this.skinIndices = [];
this.lineDistances = [];
this.boundingBox = null;
this.boundingSphere = null;
// update flags
this.elementsNeedUpdate = false;
this.verticesNeedUpdate = false;
this.uvsNeedUpdate = false;
this.normalsNeedUpdate = false;
this.colorsNeedUpdate = false;
this.lineDistancesNeedUpdate = false;
this.groupsNeedUpdate = false;
}
Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: Geometry,
isGeometry: true,
applyMatrix4: function ( matrix ) {
var normalMatrix = new Matrix3().getNormalMatrix( matrix );
for ( var i = 0, il = this.vertices.length; i < il; i ++ ) {
var vertex = this.vertices[ i ];
vertex.applyMatrix4( matrix );
}
for ( var i = 0, il = this.faces.length; i < il; i ++ ) {
var face = this.faces[ i ];
face.normal.applyMatrix3( normalMatrix ).normalize();
for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();
}
}
if ( this.boundingBox !== null ) {
this.computeBoundingBox();
}
if ( this.boundingSphere !== null ) {
this.computeBoundingSphere();
}
this.verticesNeedUpdate = true;
this.normalsNeedUpdate = true;
return this;
},
rotateX: function ( angle ) {
// rotate geometry around world x-axis
_m1$3.makeRotationX( angle );
this.applyMatrix4( _m1$3 );
return this;
},
rotateY: function ( angle ) {
// rotate geometry around world y-axis
_m1$3.makeRotationY( angle );
this.applyMatrix4( _m1$3 );
return this;
},
rotateZ: function ( angle ) {
// rotate geometry around world z-axis
_m1$3.makeRotationZ( angle );
this.applyMatrix4( _m1$3 );
return this;
},
translate: function ( x, y, z ) {
// translate geometry
_m1$3.makeTranslation( x, y, z );
this.applyMatrix4( _m1$3 );
return this;
},
scale: function ( x, y, z ) {
// scale geometry
_m1$3.makeScale( x, y, z );
this.applyMatrix4( _m1$3 );
return this;
},
lookAt: function ( vector ) {
_obj$1.lookAt( vector );
_obj$1.updateMatrix();
this.applyMatrix4( _obj$1.matrix );
return this;
},
fromBufferGeometry: function ( geometry ) {
var scope = this;
var indices = geometry.index !== null ? geometry.index.array : undefined;
var attributes = geometry.attributes;
if ( attributes.position === undefined ) {
console.error( 'Geometry.fromBufferGeometry(): Position attribute required for conversion.' );
return this;
}
var positions = attributes.position.array;
var normals = attributes.normal !== undefined ? attributes.normal.array : undefined;
var colors = attributes.color !== undefined ? attributes.color.array : undefined;
var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;
var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;
if ( uvs2 !== undefined ) { this.faceVertexUvs[ 1 ] = []; }
for ( var i = 0; i < positions.length; i += 3 ) {
scope.vertices.push( new Vector3().fromArray( positions, i ) );
if ( colors !== undefined ) {
scope.colors.push( new Color().fromArray( colors, i ) );
}
}
function addFace( a, b, c, materialIndex ) {
var vertexColors = ( colors === undefined ) ? [] : [
scope.colors[ a ].clone(),
scope.colors[ b ].clone(),
scope.colors[ c ].clone() ];
var vertexNormals = ( normals === undefined ) ? [] : [
new Vector3().fromArray( normals, a * 3 ),
new Vector3().fromArray( normals, b * 3 ),
new Vector3().fromArray( normals, c * 3 )
];
var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );
scope.faces.push( face );
if ( uvs !== undefined ) {
scope.faceVertexUvs[ 0 ].push( [
new Vector2().fromArray( uvs, a * 2 ),
new Vector2().fromArray( uvs, b * 2 ),
new Vector2().fromArray( uvs, c * 2 )
] );
}
if ( uvs2 !== undefined ) {
scope.faceVertexUvs[ 1 ].push( [
new Vector2().fromArray( uvs2, a * 2 ),
new Vector2().fromArray( uvs2, b * 2 ),
new Vector2().fromArray( uvs2, c * 2 )
] );
}
}
var groups = geometry.groups;
if ( groups.length > 0 ) {
for ( var i = 0; i < groups.length; i ++ ) {
var group = groups[ i ];
var start = group.start;
var count = group.count;
for ( var j = start, jl = start + count; j < jl; j += 3 ) {
if ( indices !== undefined ) {
addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );
} else {
addFace( j, j + 1, j + 2, group.materialIndex );
}
}
}
} else {
if ( indices !== undefined ) {
for ( var i = 0; i < indices.length; i += 3 ) {
addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
}
} else {
for ( var i = 0; i < positions.length / 3; i += 3 ) {
addFace( i, i + 1, i + 2 );
}
}
}
this.computeFaceNormals();
if ( geometry.boundingBox !== null ) {
this.boundingBox = geometry.boundingBox.clone();
}
if ( geometry.boundingSphere !== null ) {
this.boundingSphere = geometry.boundingSphere.clone();
}
return this;
},
center: function () {
this.computeBoundingBox();
this.boundingBox.getCenter( _offset$1 ).negate();
this.translate( _offset$1.x, _offset$1.y, _offset$1.z );
return this;
},
normalize: function () {
this.computeBoundingSphere();
var center = this.boundingSphere.center;
var radius = this.boundingSphere.radius;
var s = radius === 0 ? 1 : 1.0 / radius;
var matrix = new Matrix4();
matrix.set(
s, 0, 0, - s * center.x,
0, s, 0, - s * center.y,
0, 0, s, - s * center.z,
0, 0, 0, 1
);
this.applyMatrix4( matrix );
return this;
},
computeFaceNormals: function () {
var cb = new Vector3(), ab = new Vector3();
for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {
var face = this.faces[ f ];
var vA = this.vertices[ face.a ];
var vB = this.vertices[ face.b ];
var vC = this.vertices[ face.c ];
cb.subVectors( vC, vB );
ab.subVectors( vA, vB );
cb.cross( ab );
cb.normalize();
face.normal.copy( cb );
}
},
computeVertexNormals: function ( areaWeighted ) {
if ( areaWeighted === undefined ) { areaWeighted = true; }
var v, vl, f, fl, face, vertices;
vertices = new Array( this.vertices.length );
for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
vertices[ v ] = new Vector3();
}
if ( areaWeighted ) {
// vertex normals weighted by triangle areas
// http://www.iquilezles.org/www/articles/normals/normals.htm
var vA, vB, vC;
var cb = new Vector3(), ab = new Vector3();
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
vA = this.vertices[ face.a ];
vB = this.vertices[ face.b ];
vC = this.vertices[ face.c ];
cb.subVectors( vC, vB );
ab.subVectors( vA, vB );
cb.cross( ab );
vertices[ face.a ].add( cb );
vertices[ face.b ].add( cb );
vertices[ face.c ].add( cb );
}
} else {
this.computeFaceNormals();
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
vertices[ face.a ].add( face.normal );
vertices[ face.b ].add( face.normal );
vertices[ face.c ].add( face.normal );
}
}
for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
vertices[ v ].normalize();
}
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
var vertexNormals = face.vertexNormals;
if ( vertexNormals.length === 3 ) {
vertexNormals[ 0 ].copy( vertices[ face.a ] );
vertexNormals[ 1 ].copy( vertices[ face.b ] );
vertexNormals[ 2 ].copy( vertices[ face.c ] );
} else {
vertexNormals[ 0 ] = vertices[ face.a ].clone();
vertexNormals[ 1 ] = vertices[ face.b ].clone();
vertexNormals[ 2 ] = vertices[ face.c ].clone();
}
}
if ( this.faces.length > 0 ) {
this.normalsNeedUpdate = true;
}
},
computeFlatVertexNormals: function () {
var f, fl, face;
this.computeFaceNormals();
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
var vertexNormals = face.vertexNormals;
if ( vertexNormals.length === 3 ) {
vertexNormals[ 0 ].copy( face.normal );
vertexNormals[ 1 ].copy( face.normal );
vertexNormals[ 2 ].copy( face.normal );
} else {
vertexNormals[ 0 ] = face.normal.clone();
vertexNormals[ 1 ] = face.normal.clone();
vertexNormals[ 2 ] = face.normal.clone();
}
}
if ( this.faces.length > 0 ) {
this.normalsNeedUpdate = true;
}
},
computeMorphNormals: function () {
var i, il, f, fl, face;
// save original normals
// - create temp variables on first access
// otherwise just copy (for faster repeated calls)
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
if ( ! face.__originalFaceNormal ) {
face.__originalFaceNormal = face.normal.clone();
} else {
face.__originalFaceNormal.copy( face.normal );
}
if ( ! face.__originalVertexNormals ) { face.__originalVertexNormals = []; }
for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {
if ( ! face.__originalVertexNormals[ i ] ) {
face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();
} else {
face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );
}
}
}
// use temp geometry to compute face and vertex normals for each morph
var tmpGeo = new Geometry();
tmpGeo.faces = this.faces;
for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {
// create on first access
if ( ! this.morphNormals[ i ] ) {
this.morphNormals[ i ] = {};
this.morphNormals[ i ].faceNormals = [];
this.morphNormals[ i ].vertexNormals = [];
var dstNormalsFace = this.morphNormals[ i ].faceNormals;
var dstNormalsVertex = this.morphNormals[ i ].vertexNormals;
var faceNormal, vertexNormals;
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
faceNormal = new Vector3();
vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };
dstNormalsFace.push( faceNormal );
dstNormalsVertex.push( vertexNormals );
}
}
var morphNormals = this.morphNormals[ i ];
// set vertices to morph target
tmpGeo.vertices = this.morphTargets[ i ].vertices;
// compute morph normals
tmpGeo.computeFaceNormals();
tmpGeo.computeVertexNormals();
// store morph normals
var faceNormal, vertexNormals;
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
faceNormal = morphNormals.faceNormals[ f ];
vertexNormals = morphNormals.vertexNormals[ f ];
faceNormal.copy( face.normal );
vertexNormals.a.copy( face.vertexNormals[ 0 ] );
vertexNormals.b.copy( face.vertexNormals[ 1 ] );
vertexNormals.c.copy( face.vertexNormals[ 2 ] );
}
}
// restore original normals
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
face.normal = face.__originalFaceNormal;
face.vertexNormals = face.__originalVertexNormals;
}
},
computeBoundingBox: function () {
if ( this.boundingBox === null ) {
this.boundingBox = new Box3();
}
this.boundingBox.setFromPoints( this.vertices );
},
computeBoundingSphere: function () {
if ( this.boundingSphere === null ) {
this.boundingSphere = new Sphere();
}
this.boundingSphere.setFromPoints( this.vertices );
},
merge: function ( geometry, matrix, materialIndexOffset ) {
if ( ! ( geometry && geometry.isGeometry ) ) {
console.error( 'Geometry.merge(): geometry not an instance of Geometry.', geometry );
return;
}
var normalMatrix,
vertexOffset = this.vertices.length,
vertices1 = this.vertices,
vertices2 = geometry.vertices,
faces1 = this.faces,
faces2 = geometry.faces,
colors1 = this.colors,
colors2 = geometry.colors;
if ( materialIndexOffset === undefined ) { materialIndexOffset = 0; }
if ( matrix !== undefined ) {
normalMatrix = new Matrix3().getNormalMatrix( matrix );
}
// vertices
for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
var vertex = vertices2[ i ];
var vertexCopy = vertex.clone();
if ( matrix !== undefined ) { vertexCopy.applyMatrix4( matrix ); }
vertices1.push( vertexCopy );
}
// colors
for ( var i = 0, il = colors2.length; i < il; i ++ ) {
colors1.push( colors2[ i ].clone() );
}
// faces
for ( i = 0, il = faces2.length; i < il; i ++ ) {
var face = faces2[ i ], faceCopy, normal, color,
faceVertexNormals = face.vertexNormals,
faceVertexColors = face.vertexColors;
faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
faceCopy.normal.copy( face.normal );
if ( normalMatrix !== undefined ) {
faceCopy.normal.applyMatrix3( normalMatrix ).normalize();
}
for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
normal = faceVertexNormals[ j ].clone();
if ( normalMatrix !== undefined ) {
normal.applyMatrix3( normalMatrix ).normalize();
}
faceCopy.vertexNormals.push( normal );
}
faceCopy.color.copy( face.color );
for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
color = faceVertexColors[ j ];
faceCopy.vertexColors.push( color.clone() );
}
faceCopy.materialIndex = face.materialIndex + materialIndexOffset;
faces1.push( faceCopy );
}
// uvs
for ( var i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
var faceVertexUvs2 = geometry.faceVertexUvs[ i ];
if ( this.faceVertexUvs[ i ] === undefined ) { this.faceVertexUvs[ i ] = []; }
for ( var j = 0, jl = faceVertexUvs2.length; j < jl; j ++ ) {
var uvs2 = faceVertexUvs2[ j ], uvsCopy = [];
for ( var k = 0, kl = uvs2.length; k < kl; k ++ ) {
uvsCopy.push( uvs2[ k ].clone() );
}
this.faceVertexUvs[ i ].push( uvsCopy );
}
}
},
mergeMesh: function ( mesh ) {
if ( ! ( mesh && mesh.isMesh ) ) {
console.error( 'Geometry.mergeMesh(): mesh not an instance of Mesh.', mesh );
return;
}
if ( mesh.matrixAutoUpdate ) { mesh.updateMatrix(); }
this.merge( mesh.geometry, mesh.matrix );
},
/*
* Checks for duplicate vertices with hashmap.
* Duplicated vertices are removed
* and faces' vertices are updated.
*/
mergeVertices: function () {
var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)
var unique = [], changes = [];
var v, key;
var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001
var precision = Math.pow( 10, precisionPoints );
var i, il, face;
var indices, j, jl;
for ( i = 0, il = this.vertices.length; i < il; i ++ ) {
v = this.vertices[ i ];
key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );
if ( verticesMap[ key ] === undefined ) {
verticesMap[ key ] = i;
unique.push( this.vertices[ i ] );
changes[ i ] = unique.length - 1;
} else {
//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
changes[ i ] = changes[ verticesMap[ key ] ];
}
}
// if faces are completely degenerate after merging vertices, we
// have to remove them from the geometry.
var faceIndicesToRemove = [];
for ( i = 0, il = this.faces.length; i < il; i ++ ) {
face = this.faces[ i ];
face.a = changes[ face.a ];
face.b = changes[ face.b ];
face.c = changes[ face.c ];
indices = [ face.a, face.b, face.c ];
// if any duplicate vertices are found in a Face3
// we have to remove the face as nothing can be saved
for ( var n = 0; n < 3; n ++ ) {
if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {
faceIndicesToRemove.push( i );
break;
}
}
}
for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {
var idx = faceIndicesToRemove[ i ];
this.faces.splice( idx, 1 );
for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {
this.faceVertexUvs[ j ].splice( idx, 1 );
}
}
// Use unique set of vertices
var diff = this.vertices.length - unique.length;
this.vertices = unique;
return diff;
},
setFromPoints: function ( points ) {
this.vertices = [];
for ( var i = 0, l = points.length; i < l; i ++ ) {
var point = points[ i ];
this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );
}
return this;
},
sortFacesByMaterialIndex: function () {
var faces = this.faces;
var length = faces.length;
// tag faces
for ( var i = 0; i < length; i ++ ) {
faces[ i ]._id = i;
}
// sort faces
function materialIndexSort( a, b ) {
return a.materialIndex - b.materialIndex;
}
faces.sort( materialIndexSort );
// sort uvs
var uvs1 = this.faceVertexUvs[ 0 ];
var uvs2 = this.faceVertexUvs[ 1 ];
var newUvs1, newUvs2;
if ( uvs1 && uvs1.length === length ) { newUvs1 = []; }
if ( uvs2 && uvs2.length === length ) { newUvs2 = []; }
for ( var i = 0; i < length; i ++ ) {
var id = faces[ i ]._id;
if ( newUvs1 ) { newUvs1.push( uvs1[ id ] ); }
if ( newUvs2 ) { newUvs2.push( uvs2[ id ] ); }
}
if ( newUvs1 ) { this.faceVertexUvs[ 0 ] = newUvs1; }
if ( newUvs2 ) { this.faceVertexUvs[ 1 ] = newUvs2; }
},
toJSON: function () {
var data = {
metadata: {
version: 4.5,
type: 'Geometry',
generator: 'Geometry.toJSON'
}
};
// standard Geometry serialization
data.uuid = this.uuid;
data.type = this.type;
if ( this.name !== '' ) { data.name = this.name; }
if ( this.parameters !== undefined ) {
var parameters = this.parameters;
for ( var key in parameters ) {
if ( parameters[ key ] !== undefined ) { data[ key ] = parameters[ key ]; }
}
return data;
}
var vertices = [];
for ( var i = 0; i < this.vertices.length; i ++ ) {
var vertex = this.vertices[ i ];
vertices.push( vertex.x, vertex.y, vertex.z );
}
var faces = [];
var normals = [];
var normalsHash = {};
var colors = [];
var colorsHash = {};
var uvs = [];
var uvsHash = {};
for ( var i = 0; i < this.faces.length; i ++ ) {
var face = this.faces[ i ];
var hasMaterial = true;
var hasFaceUv = false; // deprecated
var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;
var hasFaceNormal = face.normal.length() > 0;
var hasFaceVertexNormal = face.vertexNormals.length > 0;
var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;
var hasFaceVertexColor = face.vertexColors.length > 0;
var faceType = 0;
faceType = setBit( faceType, 0, 0 ); // isQuad
faceType = setBit( faceType, 1, hasMaterial );
faceType = setBit( faceType, 2, hasFaceUv );
faceType = setBit( faceType, 3, hasFaceVertexUv );
faceType = setBit( faceType, 4, hasFaceNormal );
faceType = setBit( faceType, 5, hasFaceVertexNormal );
faceType = setBit( faceType, 6, hasFaceColor );
faceType = setBit( faceType, 7, hasFaceVertexColor );
faces.push( faceType );
faces.push( face.a, face.b, face.c );
faces.push( face.materialIndex );
if ( hasFaceVertexUv ) {
var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];
faces.push(
getUvIndex( faceVertexUvs[ 0 ] ),
getUvIndex( faceVertexUvs[ 1 ] ),
getUvIndex( faceVertexUvs[ 2 ] )
);
}
if ( hasFaceNormal ) {
faces.push( getNormalIndex( face.normal ) );
}
if ( hasFaceVertexNormal ) {
var vertexNormals = face.vertexNormals;
faces.push(
getNormalIndex( vertexNormals[ 0 ] ),
getNormalIndex( vertexNormals[ 1 ] ),
getNormalIndex( vertexNormals[ 2 ] )
);
}
if ( hasFaceColor ) {
faces.push( getColorIndex( face.color ) );
}
if ( hasFaceVertexColor ) {
var vertexColors = face.vertexColors;
faces.push(
getColorIndex( vertexColors[ 0 ] ),
getColorIndex( vertexColors[ 1 ] ),
getColorIndex( vertexColors[ 2 ] )
);
}
}
function setBit( value, position, enabled ) {
return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );
}
function getNormalIndex( normal ) {
var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
if ( normalsHash[ hash ] !== undefined ) {
return normalsHash[ hash ];
}
normalsHash[ hash ] = normals.length / 3;
normals.push( normal.x, normal.y, normal.z );
return normalsHash[ hash ];
}
function getColorIndex( color ) {
var hash = color.r.toString() + color.g.toString() + color.b.toString();
if ( colorsHash[ hash ] !== undefined ) {
return colorsHash[ hash ];
}
colorsHash[ hash ] = colors.length;
colors.push( color.getHex() );
return colorsHash[ hash ];
}
function getUvIndex( uv ) {
var hash = uv.x.toString() + uv.y.toString();
if ( uvsHash[ hash ] !== undefined ) {
return uvsHash[ hash ];
}
uvsHash[ hash ] = uvs.length / 2;
uvs.push( uv.x, uv.y );
return uvsHash[ hash ];
}
data.data = {};
data.data.vertices = vertices;
data.data.normals = normals;
if ( colors.length > 0 ) { data.data.colors = colors; }
if ( uvs.length > 0 ) { data.data.uvs = [ uvs ]; } // temporal backward compatibility
data.data.faces = faces;
return data;
},
clone: function () {
/*
// Handle primitives
var parameters = this.parameters;
if ( parameters !== undefined ) {
var values = [];
for ( var key in parameters ) {
values.push( parameters[ key ] );
}
var geometry = Object.create( this.constructor.prototype );
this.constructor.apply( geometry, values );
return geometry;
}
return new this.constructor().copy( this );
*/
return new Geometry().copy( this );
},
copy: function ( source ) {
var i, il, j, jl, k, kl;
// reset
this.vertices = [];
this.colors = [];
this.faces = [];
this.faceVertexUvs = [[]];
this.morphTargets = [];
this.morphNormals = [];
this.skinWeights = [];
this.skinIndices = [];
this.lineDistances = [];
this.boundingBox = null;
this.boundingSphere = null;
// name
this.name = source.name;
// vertices
var vertices = source.vertices;
for ( i = 0, il = vertices.length; i < il; i ++ ) {
this.vertices.push( vertices[ i ].clone() );
}
// colors
var colors = source.colors;
for ( i = 0, il = colors.length; i < il; i ++ ) {
this.colors.push( colors[ i ].clone() );
}
// faces
var faces = source.faces;
for ( i = 0, il = faces.length; i < il; i ++ ) {
this.faces.push( faces[ i ].clone() );
}
// face vertex uvs
for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {
var faceVertexUvs = source.faceVertexUvs[ i ];
if ( this.faceVertexUvs[ i ] === undefined ) {
this.faceVertexUvs[ i ] = [];
}
for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {
var uvs = faceVertexUvs[ j ], uvsCopy = [];
for ( k = 0, kl = uvs.length; k < kl; k ++ ) {
var uv = uvs[ k ];
uvsCopy.push( uv.clone() );
}
this.faceVertexUvs[ i ].push( uvsCopy );
}
}
// morph targets
var morphTargets = source.morphTargets;
for ( i = 0, il = morphTargets.length; i < il; i ++ ) {
var morphTarget = {};
morphTarget.name = morphTargets[ i ].name;
// vertices
if ( morphTargets[ i ].vertices !== undefined ) {
morphTarget.vertices = [];
for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {
morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );
}
}
// normals
if ( morphTargets[ i ].normals !== undefined ) {
morphTarget.normals = [];
for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {
morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );
}
}
this.morphTargets.push( morphTarget );
}
// morph normals
var morphNormals = source.morphNormals;
for ( i = 0, il = morphNormals.length; i < il; i ++ ) {
var morphNormal = {};
// vertex normals
if ( morphNormals[ i ].vertexNormals !== undefined ) {
morphNormal.vertexNormals = [];
for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {
var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];
var destVertexNormal = {};
destVertexNormal.a = srcVertexNormal.a.clone();
destVertexNormal.b = srcVertexNormal.b.clone();
destVertexNormal.c = srcVertexNormal.c.clone();
morphNormal.vertexNormals.push( destVertexNormal );
}
}
// face normals
if ( morphNormals[ i ].faceNormals !== undefined ) {
morphNormal.faceNormals = [];
for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {
morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );
}
}
this.morphNormals.push( morphNormal );
}
// skin weights
var skinWeights = source.skinWeights;
for ( i = 0, il = skinWeights.length; i < il; i ++ ) {
this.skinWeights.push( skinWeights[ i ].clone() );
}
// skin indices
var skinIndices = source.skinIndices;
for ( i = 0, il = skinIndices.length; i < il; i ++ ) {
this.skinIndices.push( skinIndices[ i ].clone() );
}
// line distances
var lineDistances = source.lineDistances;
for ( i = 0, il = lineDistances.length; i < il; i ++ ) {
this.lineDistances.push( lineDistances[ i ] );
}
// bounding box
var boundingBox = source.boundingBox;
if ( boundingBox !== null ) {
this.boundingBox = boundingBox.clone();
}
// bounding sphere
var boundingSphere = source.boundingSphere;
if ( boundingSphere !== null ) {
this.boundingSphere = boundingSphere.clone();
}
// update flags
this.elementsNeedUpdate = source.elementsNeedUpdate;
this.verticesNeedUpdate = source.verticesNeedUpdate;
this.uvsNeedUpdate = source.uvsNeedUpdate;
this.normalsNeedUpdate = source.normalsNeedUpdate;
this.colorsNeedUpdate = source.colorsNeedUpdate;
this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;
this.groupsNeedUpdate = source.groupsNeedUpdate;
return this;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
}
} );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author mrdoob / http://mrdoob.com/
* @author benaadams / https://twitter.com/ben_a_adams
* @author Mugen87 / https://github.com/Mugen87
*/
// SphereGeometry
function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
Geometry.call( this );
this.type = 'SphereGeometry';
this.parameters = {
radius: radius,
widthSegments: widthSegments,
heightSegments: heightSegments,
phiStart: phiStart,
phiLength: phiLength,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );
this.mergeVertices();
}
SphereGeometry.prototype = Object.create( Geometry.prototype );
SphereGeometry.prototype.constructor = SphereGeometry;
// SphereBufferGeometry
function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
BufferGeometry.call( this );
this.type = 'SphereBufferGeometry';
this.parameters = {
radius: radius,
widthSegments: widthSegments,
heightSegments: heightSegments,
phiStart: phiStart,
phiLength: phiLength,
thetaStart: thetaStart,
thetaLength: thetaLength
};
radius = radius || 1;
widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );
heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );
phiStart = phiStart !== undefined ? phiStart : 0;
phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;
thetaStart = thetaStart !== undefined ? thetaStart : 0;
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;
var thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );
var ix, iy;
var index = 0;
var grid = [];
var vertex = new Vector3();
var normal = new Vector3();
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// generate vertices, normals and uvs
for ( iy = 0; iy <= heightSegments; iy ++ ) {
var verticesRow = [];
var v = iy / heightSegments;
// special case for the poles
var uOffset = 0;
if ( iy == 0 && thetaStart == 0 ) {
uOffset = 0.5 / widthSegments;
} else if ( iy == heightSegments && thetaEnd == Math.PI ) {
uOffset = - 0.5 / widthSegments;
}
for ( ix = 0; ix <= widthSegments; ix ++ ) {
var u = ix / widthSegments;
// vertex
vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
vertex.y = radius * Math.cos( thetaStart + v * thetaLength );
vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
vertices.push( vertex.x, vertex.y, vertex.z );
// normal
normal.copy( vertex ).normalize();
normals.push( normal.x, normal.y, normal.z );
// uv
uvs.push( u + uOffset, 1 - v );
verticesRow.push( index ++ );
}
grid.push( verticesRow );
}
// indices
for ( iy = 0; iy < heightSegments; iy ++ ) {
for ( ix = 0; ix < widthSegments; ix ++ ) {
var a = grid[ iy ][ ix + 1 ];
var b = grid[ iy ][ ix ];
var c = grid[ iy + 1 ][ ix ];
var d = grid[ iy + 1 ][ ix + 1 ];
if ( iy !== 0 || thetaStart > 0 ) { indices.push( a, b, d ); }
if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) { indices.push( b, c, d ); }
}
}
// build geometry
this.setIndex( indices );
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
}
SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
SphereBufferGeometry.prototype.constructor = SphereBufferGeometry;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @author takahiro / https://github.com/takahirox
*
* CCD Algorithm
* - https://sites.google.com/site/auraliusproject/ccd-algorithm
*
* // ik parameter example
* //
* // target, effector, index in links are bone index in skeleton.bones.
* // the bones relation should be
* // <-- parent child -->
* // links[ n ], links[ n - 1 ], ..., links[ 0 ], effector
* iks = [ {
* target: 1,
* effector: 2,
* links: [ { index: 5, limitation: new Vector3( 1, 0, 0 ) }, { index: 4, enabled: false }, { index : 3 } ],
* iteration: 10,
* minAngle: 0.0,
* maxAngle: 1.0,
* } ];
*/
var CCDIKSolver = ( function () {
/**
* @param {SkinnedMesh} mesh
* @param {Array