Sfoglia il codice sorgente

Merge branch 'master' of https://github.com/BabylonJS/Babylon.js into master

David Catuhe 4 anni fa
parent
commit
125873f03c

+ 49 - 45
inspector/src/components/actionTabs/tabs/tools/gltfComponent.tsx

@@ -9,8 +9,8 @@ import { MessageLineComponent } from "../../lines/messageLineComponent";
 import { faCheck, faTimesCircle } from "@fortawesome/free-solid-svg-icons";
 import { TextLineComponent } from "../../lines/textLineComponent";
 import { GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from "babylonjs-loaders/glTF/index";
-import { Nullable } from 'babylonjs/types';
-import { Observer } from 'babylonjs/Misc/observable';
+import { Nullable } from "babylonjs/types";
+import { Observer } from "babylonjs/Misc/observable";
 import { IGLTFValidationResults } from "babylonjs-gltf2interface";
 
 interface IGLTFComponentProps {
@@ -69,14 +69,8 @@ export class GLTFComponent extends React.Component<IGLTFComponentProps> {
 
         return (
             <LineContainerComponent globalState={this.props.globalState} title="GLTF VALIDATION" closed={!issues.numErrors && !issues.numWarnings}>
-                {
-                    issues.numErrors !== 0 &&
-                    <MessageLineComponent text="Your file has some validation issues" icon={faTimesCircle} color="Red" />
-                }
-                {
-                    issues.numErrors === 0 &&
-                    <MessageLineComponent text="Your file is a valid glTF file" icon={faCheck} color="Green" />
-                }
+                {issues.numErrors !== 0 && <MessageLineComponent text="Your file has some validation issues" icon={faTimesCircle} color="Red" />}
+                {issues.numErrors === 0 && <MessageLineComponent text="Your file is a valid glTF file" icon={faCheck} color="Green" />}
                 <TextLineComponent label="Errors" value={issues.numErrors.toString()} />
                 <TextLineComponent label="Warnings" value={issues.numWarnings.toString()} />
                 <TextLineComponent label="Infos" value={issues.numInfos.toString()} />
@@ -90,16 +84,29 @@ export class GLTFComponent extends React.Component<IGLTFComponentProps> {
         const extensionStates = this.props.globalState.glTFLoaderExtensionDefaults;
         const loaderState = this.props.globalState.glTFLoaderDefaults;
 
-        var animationStartMode = [
-            { label: "None", value: GLTFLoaderAnimationStartMode.NONE },
-            { label: "First", value: GLTFLoaderAnimationStartMode.FIRST },
-            { label: "ALL", value: GLTFLoaderAnimationStartMode.ALL }
-        ];
+        var animationStartMode =
+            (typeof GLTFLoaderAnimationStartMode !== "undefined"
+                ? [
+                      { label: "None", value: GLTFLoaderAnimationStartMode.NONE },
+                      { label: "First", value: GLTFLoaderAnimationStartMode.FIRST },
+                      { label: "ALL", value: GLTFLoaderAnimationStartMode.ALL },
+                  ]
+                : [
+                    { label: "None", value: 0 },
+                    { label: "First", value: 1 },
+                    { label: "ALL", value: 2 },
+                ]);
 
-        var coordinateSystemMode = [
-            { label: "Auto", value: GLTFLoaderCoordinateSystemMode.AUTO },
-            { label: "Right handed", value: GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED }
-        ];
+        var coordinateSystemMode =
+            typeof GLTFLoaderCoordinateSystemMode !== "undefined"
+                ? [
+                      { label: "Auto", value: GLTFLoaderCoordinateSystemMode.AUTO },
+                      { label: "Right handed", value: GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED },
+                  ]
+                : [
+                    { label: "Auto", value: 0 },
+                    { label: "Right handed", value: 1 },
+                ];
 
         return (
             <div>
@@ -116,35 +123,32 @@ export class GLTFComponent extends React.Component<IGLTFComponentProps> {
                     <MessageLineComponent text="You need to reload your file to see these changes" />
                 </LineContainerComponent>
                 <LineContainerComponent globalState={this.props.globalState} title="GLTF EXTENSIONS" closed={true}>
-                    <CheckBoxLineComponent label="MSFT_lod" isSelected={() => extensionStates["MSFT_lod"].enabled} onSelect={(value) => extensionStates["MSFT_lod"].enabled = value} />
+                    <CheckBoxLineComponent label="MSFT_lod" isSelected={() => extensionStates["MSFT_lod"].enabled} onSelect={(value) => (extensionStates["MSFT_lod"].enabled = value)} />
                     <FloatLineComponent label="Maximum LODs" target={extensionStates["MSFT_lod"]} propertyName="maxLODsToLoad" additionalClass="gltf-extension-property" isInteger={true} />
-                    <CheckBoxLineComponent label="MSFT_minecraftMesh" isSelected={() => extensionStates["MSFT_minecraftMesh"].enabled} onSelect={(value) => extensionStates["MSFT_minecraftMesh"].enabled = value} />
-                    <CheckBoxLineComponent label="MSFT_sRGBFactors" isSelected={() => extensionStates["MSFT_sRGBFactors"].enabled} onSelect={(value) => extensionStates["MSFT_sRGBFactors"].enabled = value} />
-                    <CheckBoxLineComponent label="MSFT_audio_emitter" isSelected={() => extensionStates["MSFT_audio_emitter"].enabled} onSelect={(value) => extensionStates["MSFT_audio_emitter"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_xmp" isSelected={() => extensionStates["KHR_xmp"].enabled} onSelect={(value) => extensionStates["KHR_xmp"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_draco_mesh_compression" isSelected={() => extensionStates["KHR_draco_mesh_compression"].enabled} onSelect={(value) => extensionStates["KHR_draco_mesh_compression"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_mesh_quantization" isSelected={() => extensionStates["KHR_mesh_quantization"].enabled} onSelect={(value) => extensionStates["KHR_mesh_quantization"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_pbrSpecularGloss..." isSelected={() => extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled} onSelect={(value) => extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_clearcoat" isSelected={() => extensionStates["KHR_materials_clearcoat"].enabled} onSelect={(value) => extensionStates["KHR_materials_clearcoat"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_ior" isSelected={() => extensionStates["KHR_materials_ior"].enabled} onSelect={(value) => extensionStates["KHR_materials_ior"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_sheen" isSelected={() => extensionStates["KHR_materials_sheen"].enabled} onSelect={(value) => extensionStates["KHR_materials_sheen"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_specular" isSelected={() => extensionStates["KHR_materials_specular"].enabled} onSelect={(value) => extensionStates["KHR_materials_specular"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_unlit" isSelected={() => extensionStates["KHR_materials_unlit"].enabled} onSelect={(value) => extensionStates["KHR_materials_unlit"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_variants" isSelected={() => extensionStates["KHR_materials_variants"].enabled} onSelect={(value) => extensionStates["KHR_materials_variants"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_materials_transmission" isSelected={() => extensionStates["KHR_materials_transmission"].enabled} onSelect={(value) => extensionStates["KHR_materials_transmission"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_lights_punctual" isSelected={() => extensionStates["KHR_lights_punctual"].enabled} onSelect={(value) => extensionStates["KHR_lights_punctual"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_texture_basisu" isSelected={() => extensionStates["KHR_texture_basisu"].enabled} onSelect={(value) => extensionStates["KHR_texture_basisu"].enabled = value} />
-                    <CheckBoxLineComponent label="KHR_texture_transform" isSelected={() => extensionStates["KHR_texture_transform"].enabled} onSelect={(value) => extensionStates["KHR_texture_transform"].enabled = value} />
-                    <CheckBoxLineComponent label="EXT_lights_image_based" isSelected={() => extensionStates["EXT_lights_image_based"].enabled} onSelect={(value) => extensionStates["EXT_lights_image_based"].enabled = value} />
-                    <CheckBoxLineComponent label="EXT_mesh_gpu_instancing" isSelected={() => extensionStates["EXT_mesh_gpu_instancing"].enabled} onSelect={(value) => extensionStates["EXT_mesh_gpu_instancing"].enabled = value} />
-                    <CheckBoxLineComponent label="EXT_texture_webp" isSelected={() => extensionStates["EXT_texture_webp"].enabled} onSelect={(value) => extensionStates["EXT_texture_webp"].enabled = value} />
+                    <CheckBoxLineComponent label="MSFT_minecraftMesh" isSelected={() => extensionStates["MSFT_minecraftMesh"].enabled} onSelect={(value) => (extensionStates["MSFT_minecraftMesh"].enabled = value)} />
+                    <CheckBoxLineComponent label="MSFT_sRGBFactors" isSelected={() => extensionStates["MSFT_sRGBFactors"].enabled} onSelect={(value) => (extensionStates["MSFT_sRGBFactors"].enabled = value)} />
+                    <CheckBoxLineComponent label="MSFT_audio_emitter" isSelected={() => extensionStates["MSFT_audio_emitter"].enabled} onSelect={(value) => (extensionStates["MSFT_audio_emitter"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_xmp" isSelected={() => extensionStates["KHR_xmp"].enabled} onSelect={(value) => (extensionStates["KHR_xmp"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_draco_mesh_compression" isSelected={() => extensionStates["KHR_draco_mesh_compression"].enabled} onSelect={(value) => (extensionStates["KHR_draco_mesh_compression"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_mesh_quantization" isSelected={() => extensionStates["KHR_mesh_quantization"].enabled} onSelect={(value) => (extensionStates["KHR_mesh_quantization"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_pbrSpecularGloss..." isSelected={() => extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled} onSelect={(value) => (extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_clearcoat" isSelected={() => extensionStates["KHR_materials_clearcoat"].enabled} onSelect={(value) => (extensionStates["KHR_materials_clearcoat"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_ior" isSelected={() => extensionStates["KHR_materials_ior"].enabled} onSelect={(value) => (extensionStates["KHR_materials_ior"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_sheen" isSelected={() => extensionStates["KHR_materials_sheen"].enabled} onSelect={(value) => (extensionStates["KHR_materials_sheen"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_specular" isSelected={() => extensionStates["KHR_materials_specular"].enabled} onSelect={(value) => (extensionStates["KHR_materials_specular"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_unlit" isSelected={() => extensionStates["KHR_materials_unlit"].enabled} onSelect={(value) => (extensionStates["KHR_materials_unlit"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_variants" isSelected={() => extensionStates["KHR_materials_variants"].enabled} onSelect={(value) => (extensionStates["KHR_materials_variants"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_materials_transmission" isSelected={() => extensionStates["KHR_materials_transmission"].enabled} onSelect={(value) => (extensionStates["KHR_materials_transmission"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_lights_punctual" isSelected={() => extensionStates["KHR_lights_punctual"].enabled} onSelect={(value) => (extensionStates["KHR_lights_punctual"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_texture_basisu" isSelected={() => extensionStates["KHR_texture_basisu"].enabled} onSelect={(value) => (extensionStates["KHR_texture_basisu"].enabled = value)} />
+                    <CheckBoxLineComponent label="KHR_texture_transform" isSelected={() => extensionStates["KHR_texture_transform"].enabled} onSelect={(value) => (extensionStates["KHR_texture_transform"].enabled = value)} />
+                    <CheckBoxLineComponent label="EXT_lights_image_based" isSelected={() => extensionStates["EXT_lights_image_based"].enabled} onSelect={(value) => (extensionStates["EXT_lights_image_based"].enabled = value)} />
+                    <CheckBoxLineComponent label="EXT_mesh_gpu_instancing" isSelected={() => extensionStates["EXT_mesh_gpu_instancing"].enabled} onSelect={(value) => (extensionStates["EXT_mesh_gpu_instancing"].enabled = value)} />
+                    <CheckBoxLineComponent label="EXT_texture_webp" isSelected={() => extensionStates["EXT_texture_webp"].enabled} onSelect={(value) => (extensionStates["EXT_texture_webp"].enabled = value)} />
                     <MessageLineComponent text="You need to reload your file to see these changes" />
                 </LineContainerComponent>
-                {
-                    loaderState["validate"] && this.props.globalState.validationResults &&
-                    this.renderValidation()
-                }
+                {loaderState["validate"] && this.props.globalState.validationResults && this.renderValidation()}
             </div>
         );
     }
-}
+}

+ 43 - 43
inspector/src/components/globalState.ts

@@ -1,4 +1,4 @@
-import { GLTFFileLoader, IGLTFLoaderExtension, GLTFLoaderAnimationStartMode, GLTFLoaderCoordinateSystemMode } from "babylonjs-loaders/glTF/index";
+import { GLTFLoaderAnimationStartMode, GLTFLoaderCoordinateSystemMode } from "babylonjs-loaders/glTF/index";
 import { IGLTFValidationResults } from "babylonjs-gltf2interface";
 
 import { Nullable } from "babylonjs/types";
@@ -10,8 +10,8 @@ import { Camera } from "babylonjs/Cameras/camera";
 import { LightGizmo } from "babylonjs/Gizmos/lightGizmo";
 import { CameraGizmo } from "babylonjs/Gizmos/cameraGizmo";
 import { PropertyChangedEvent } from "./propertyChangedEvent";
-import { ReplayRecorder } from './replayRecorder';
-import { DataStorage } from 'babylonjs/Misc/dataStorage';
+import { ReplayRecorder } from "./replayRecorder";
+import { DataStorage } from "babylonjs/Misc/dataStorage";
 
 export class GlobalState {
     public onSelectionChangedObservable: Observable<any>;
@@ -26,45 +26,45 @@ export class GlobalState {
     public validationResults: Nullable<IGLTFValidationResults> = null;
     public onValidationResultsUpdatedObservable = new Observable<Nullable<IGLTFValidationResults>>();
 
-    public onExtensionLoadedObservable: Observable<IGLTFLoaderExtension>;
+    public onExtensionLoadedObservable: Observable<import("babylonjs-loaders/glTF/index").IGLTFLoaderExtension>;
 
     public glTFLoaderExtensionDefaults: { [name: string]: { [key: string]: any } } = {
-        "MSFT_lod": { enabled: true, maxLODsToLoad: 10 },
-        "MSFT_minecraftMesh": { enabled: true },
-        "MSFT_sRGBFactors": { enabled: true },
-        "MSFT_audio_emitter": { enabled: true },
-        "KHR_xmp": { enabled: true },
-        "KHR_draco_mesh_compression": { enabled: true },
-        "KHR_mesh_quantization": { enabled: true },
-        "KHR_materials_pbrSpecularGlossiness": { enabled: true },
-        "KHR_materials_clearcoat": { enabled: true },
-        "KHR_materials_ior": { enabled: true },
-        "KHR_materials_sheen": { enabled: true },
-        "KHR_materials_specular": { enabled: true },
-        "KHR_materials_unlit": { enabled: true },
-        "KHR_materials_variants": { enabled: true },
-        "KHR_materials_transmission": { enabled: true },
-        "KHR_lights_punctual": { enabled: true },
-        "KHR_texture_basisu": { enabled: true },
-        "KHR_texture_transform": { enabled: true },
-        "EXT_lights_image_based": { enabled: true },
-        "EXT_mesh_gpu_instancing": { enabled: true },
-        "EXT_texture_webp": { enabled: true },
+        MSFT_lod: { enabled: true, maxLODsToLoad: 10 },
+        MSFT_minecraftMesh: { enabled: true },
+        MSFT_sRGBFactors: { enabled: true },
+        MSFT_audio_emitter: { enabled: true },
+        KHR_xmp: { enabled: true },
+        KHR_draco_mesh_compression: { enabled: true },
+        KHR_mesh_quantization: { enabled: true },
+        KHR_materials_pbrSpecularGlossiness: { enabled: true },
+        KHR_materials_clearcoat: { enabled: true },
+        KHR_materials_ior: { enabled: true },
+        KHR_materials_sheen: { enabled: true },
+        KHR_materials_specular: { enabled: true },
+        KHR_materials_unlit: { enabled: true },
+        KHR_materials_variants: { enabled: true },
+        KHR_materials_transmission: { enabled: true },
+        KHR_lights_punctual: { enabled: true },
+        KHR_texture_basisu: { enabled: true },
+        KHR_texture_transform: { enabled: true },
+        EXT_lights_image_based: { enabled: true },
+        EXT_mesh_gpu_instancing: { enabled: true },
+        EXT_texture_webp: { enabled: true },
     };
 
     public glTFLoaderDefaults: { [key: string]: any } = {
-        "animationStartMode": GLTFLoaderAnimationStartMode.FIRST,
-        "capturePerformanceCounters": false,
-        "compileMaterials": false,
-        "compileShadowGenerators": false,
-        "coordinateSystemMode": GLTFLoaderCoordinateSystemMode.AUTO,
-        "loggingEnabled": false,
-        "transparencyAsCoverage": false,
-        "useClipPlane": false,
-        "validate": true,
+        animationStartMode: typeof GLTFLoaderAnimationStartMode !== 'undefined' ? GLTFLoaderAnimationStartMode.FIRST : 1 ,
+        capturePerformanceCounters: false,
+        compileMaterials: false,
+        compileShadowGenerators: false,
+        coordinateSystemMode: typeof GLTFLoaderCoordinateSystemMode !== 'undefined' ? GLTFLoaderCoordinateSystemMode.AUTO : 0,
+        loggingEnabled: false,
+        transparencyAsCoverage: false,
+        useClipPlane: false,
+        validate: true,
     };
 
-    public glTFLoaderExtensions: { [key: string]: IGLTFLoaderExtension } = {};
+    public glTFLoaderExtensions: { [key: string]: import("babylonjs-loaders/glTF/index").IGLTFLoaderExtension } = {};
 
     public blockMutationUpdates = false;
     public selectedLineContainerTitles: Array<string> = [];
@@ -107,12 +107,12 @@ export class GlobalState {
     public init(propertyChangedObservable: Observable<PropertyChangedEvent>) {
         this.onPropertyChangedObservable = propertyChangedObservable;
 
-        this.onNewSceneObservable.add(scene => {
+        this.onNewSceneObservable.add((scene) => {
             this.recorder.cancel();
         });
     }
 
-    public prepareGLTFPlugin(loader: GLTFFileLoader) {
+    public prepareGLTFPlugin(loader: import("babylonjs-loaders/glTF/index").GLTFFileLoader) {
         this.glTFLoaderExtensions = {};
         var loaderState = this.glTFLoaderDefaults;
         if (loaderState !== undefined) {
@@ -121,7 +121,7 @@ export class GlobalState {
             }
         }
 
-        loader.onExtensionLoadedObservable.add((extension: IGLTFLoaderExtension) => {
+        loader.onExtensionLoadedObservable.add((extension: import("babylonjs-loaders/glTF/index").IGLTFLoaderExtension) => {
             var extensionState = this.glTFLoaderExtensionDefaults[extension.name];
             if (extensionState !== undefined) {
                 for (const key in extensionState) {
@@ -153,11 +153,11 @@ export class GlobalState {
     public enableLightGizmo(light: Light, enable = true) {
         if (enable) {
             if (!light.reservedDataStore) {
-                light.reservedDataStore = {}
+                light.reservedDataStore = {};
             }
             if (!light.reservedDataStore.lightGizmo) {
                 light.reservedDataStore.lightGizmo = new LightGizmo();
-                this.lightGizmos.push(light.reservedDataStore.lightGizmo)
+                this.lightGizmos.push(light.reservedDataStore.lightGizmo);
                 light.reservedDataStore.lightGizmo.light = light;
                 light.reservedDataStore.lightGizmo.material.reservedDataStore = { hidden: true };
             }
@@ -172,11 +172,11 @@ export class GlobalState {
     public enableCameraGizmo(camera: Camera, enable = true) {
         if (enable) {
             if (!camera.reservedDataStore) {
-                camera.reservedDataStore = {}
+                camera.reservedDataStore = {};
             }
             if (!camera.reservedDataStore.cameraGizmo) {
                 camera.reservedDataStore.cameraGizmo = new CameraGizmo();
-                this.cameraGizmos.push(camera.reservedDataStore.cameraGizmo)
+                this.cameraGizmos.push(camera.reservedDataStore.cameraGizmo);
                 camera.reservedDataStore.cameraGizmo.camera = camera;
                 camera.reservedDataStore.cameraGizmo.material.reservedDataStore = { hidden: true };
             }
@@ -186,4 +186,4 @@ export class GlobalState {
             camera.reservedDataStore.cameraGizmo = null;
         }
     }
-}
+}

+ 1 - 2
inspector/src/inspector.ts

@@ -13,7 +13,6 @@ import { SceneExplorerComponent } from "./components/sceneExplorer/sceneExplorer
 import { EmbedHostComponent } from "./components/embedHost/embedHostComponent";
 import { PropertyChangedEvent } from "./components/propertyChangedEvent";
 import { GlobalState } from "./components/globalState";
-import { GLTFFileLoader } from "babylonjs-loaders/glTF/index";
 
 interface IInternalInspectorOptions extends IInspectorOptions {
     popup: boolean;
@@ -335,7 +334,7 @@ export class Inspector {
     public static EarlyAttachToLoader() {
         if (!this._GlobalState.onPluginActivatedObserver) {
             this._GlobalState.onPluginActivatedObserver = SceneLoader.OnPluginActivatedObservable.add((rawLoader) => {
-                const loader = rawLoader as GLTFFileLoader;
+                const loader = rawLoader as import("babylonjs-loaders/glTF/index").GLTFFileLoader;
                 if (loader.name === "gltf") {
                     this._GlobalState.prepareGLTFPlugin(loader);
                 }

+ 65 - 63
src/Maths/math.path.ts

@@ -1,7 +1,7 @@
-import { DeepImmutable, Nullable } from '../types';
-import { Scalar } from './math.scalar';
-import { Vector2, Vector3, Quaternion, Matrix } from './math.vector';
-import { Epsilon } from './math.constants';
+import { DeepImmutable, Nullable } from "../types";
+import { Scalar } from "./math.scalar";
+import { Vector2, Vector3, Quaternion, Matrix } from "./math.vector";
+import { Epsilon } from "./math.constants";
 
 /**
  * Defines potential orientation for back face culling
@@ -12,7 +12,7 @@ export enum Orientation {
      */
     CW = 0,
     /** Counter clockwise */
-    CCW = 1
+    CCW = 1,
 }
 
 /** Class used to represent a Bezier curve */
@@ -27,7 +27,6 @@ export class BezierCurve {
      * @returns the interpolated value
      */
     public static Interpolate(t: number, x1: number, y1: number, x2: number, y2: number): number {
-
         // Extract X (which is equal to time here)
         var f0 = 1 - 3 * x2 + 3 * x1;
         var f1 = 3 * x2 - 6 * x1;
@@ -42,13 +41,10 @@ export class BezierCurve {
             var slope = 1.0 / (3.0 * f0 * refinedT2 + 2.0 * f1 * refinedT + f2);
             refinedT -= (x - t) * slope;
             refinedT = Math.min(1, Math.max(0, refinedT));
-
         }
 
         // Resolve cubic bezier for the given x
-        return 3 * Math.pow(1 - refinedT, 2) * refinedT * y1 +
-            3 * (1 - refinedT) * Math.pow(refinedT, 2) * y2 +
-            Math.pow(refinedT, 3);
+        return 3 * Math.pow(1 - refinedT, 2) * refinedT * y1 + 3 * (1 - refinedT) * Math.pow(refinedT, 2) * y2 + Math.pow(refinedT, 3);
     }
 }
 
@@ -64,7 +60,9 @@ export class Angle {
      */
     constructor(radians: number) {
         this._radians = radians;
-        if (this._radians < 0.0) { this._radians += (2.0 * Math.PI); }
+        if (this._radians < 0.0) {
+            this._radians += 2.0 * Math.PI;
+        }
     }
 
     /**
@@ -72,7 +70,7 @@ export class Angle {
      * @returns the Angle value in degrees (float)
      */
     public degrees() {
-        return this._radians * 180.0 / Math.PI;
+        return (this._radians * 180.0) / Math.PI;
     }
 
     /**
@@ -109,7 +107,7 @@ export class Angle {
      * @returns a new Angle
      */
     public static FromDegrees(degrees: number): Angle {
-        return new Angle(degrees * Math.PI / 180.0);
+        return new Angle((degrees * Math.PI) / 180.0);
     }
 }
 
@@ -150,17 +148,14 @@ export class Arc2 {
         /** Defines the mid point of the arc */
         public midPoint: Vector2,
         /** Defines the end point of the arc */
-        public endPoint: Vector2) {
-
+        public endPoint: Vector2
+    ) {
         var temp = Math.pow(midPoint.x, 2) + Math.pow(midPoint.y, 2);
-        var startToMid = (Math.pow(startPoint.x, 2) + Math.pow(startPoint.y, 2) - temp) / 2.;
-        var midToEnd = (temp - Math.pow(endPoint.x, 2) - Math.pow(endPoint.y, 2)) / 2.;
+        var startToMid = (Math.pow(startPoint.x, 2) + Math.pow(startPoint.y, 2) - temp) / 2;
+        var midToEnd = (temp - Math.pow(endPoint.x, 2) - Math.pow(endPoint.y, 2)) / 2;
         var det = (startPoint.x - midPoint.x) * (midPoint.y - endPoint.y) - (midPoint.x - endPoint.x) * (startPoint.y - midPoint.y);
 
-        this.centerPoint = new Vector2(
-            (startToMid * (midPoint.y - endPoint.y) - midToEnd * (startPoint.y - midPoint.y)) / det,
-            ((startPoint.x - midPoint.x) * midToEnd - (midPoint.x - endPoint.x) * startToMid) / det
-        );
+        this.centerPoint = new Vector2((startToMid * (midPoint.y - endPoint.y) - midToEnd * (startPoint.y - midPoint.y)) / det, ((startPoint.x - midPoint.x) * midToEnd - (midPoint.x - endPoint.x) * startToMid) / det);
 
         this.radius = this.centerPoint.subtract(this.startPoint).length();
 
@@ -171,12 +166,20 @@ export class Arc2 {
         var a3 = Angle.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees();
 
         // angles correction
-        if (a2 - a1 > +180.0) { a2 -= 360.0; }
-        if (a2 - a1 < -180.0) { a2 += 360.0; }
-        if (a3 - a2 > +180.0) { a3 -= 360.0; }
-        if (a3 - a2 < -180.0) { a3 += 360.0; }
+        if (a2 - a1 > +180.0) {
+            a2 -= 360.0;
+        }
+        if (a2 - a1 < -180.0) {
+            a2 += 360.0;
+        }
+        if (a3 - a2 > +180.0) {
+            a3 -= 360.0;
+        }
+        if (a3 - a2 < -180.0) {
+            a3 += 360.0;
+        }
 
-        this.orientation = (a2 - a1) < 0 ? Orientation.CW : Orientation.CCW;
+        this.orientation = a2 - a1 < 0 ? Orientation.CW : Orientation.CCW;
         this.angle = Angle.FromDegrees(this.orientation === Orientation.CW ? a1 - a3 : a3 - a1);
     }
 }
@@ -239,7 +242,9 @@ export class Path2 {
         var arc = new Arc2(startPoint, midPoint, endPoint);
 
         var increment = arc.angle.radians() / numberOfSegments;
-        if (arc.orientation === Orientation.CW) { increment *= -1; }
+        if (arc.orientation === Orientation.CW) {
+            increment *= -1;
+        }
         var currentAngle = arc.startAngle.radians() + increment;
 
         for (var i = 0; i < numberOfSegments; i++) {
@@ -268,7 +273,7 @@ export class Path2 {
         if (this.closed) {
             var lastPoint = this._points[this._points.length - 1];
             var firstPoint = this._points[0];
-            result += (firstPoint.subtract(lastPoint).length());
+            result += firstPoint.subtract(lastPoint).length();
         }
         return result;
     }
@@ -301,15 +306,12 @@ export class Path2 {
             var b = this._points[j];
             var bToA = b.subtract(a);
 
-            var nextOffset = (bToA.length() + previousOffset);
+            var nextOffset = bToA.length() + previousOffset;
             if (lengthPosition >= previousOffset && lengthPosition <= nextOffset) {
                 var dir = bToA.normalize();
                 var localOffset = lengthPosition - previousOffset;
 
-                return new Vector2(
-                    a.x + (dir.x * localOffset),
-                    a.y + (dir.y * localOffset)
-                );
+                return new Vector2(a.x + dir.x * localOffset, a.y + dir.y * localOffset);
             }
             previousOffset = nextOffset;
         }
@@ -354,14 +356,14 @@ export class Path3D {
     };
 
     /**
-    * new Path3D(path, normal, raw)
-    * Creates a Path3D. A Path3D is a logical math object, so not a mesh.
-    * please read the description in the tutorial : https://doc.babylonjs.com/how_to/how_to_use_path3d
-    * @param path an array of Vector3, the curve axis of the Path3D
-    * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal.
-    * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed.
-    * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path.
-    */
+     * new Path3D(path, normal, raw)
+     * Creates a Path3D. A Path3D is a logical math object, so not a mesh.
+     * please read the description in the tutorial : https://doc.babylonjs.com/how_to/how_to_use_path3d
+     * @param path an array of Vector3, the curve axis of the Path3D
+     * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal.
+     * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed.
+     * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path.
+     */
     constructor(
         /**
          * an array of Vector3, the curve axis of the Path3D
@@ -517,7 +519,7 @@ export class Path3D {
             let point = this._curve[i + 0];
             let tangent = this._curve[i + 1].subtract(point).normalize();
             let subLength = this._distances[i + 1] - this._distances[i + 0];
-            let subPosition = Math.min(Math.max(Vector3.Dot(tangent, target.subtract(point).normalize()), 0.0) * Vector3.Distance(point, target) / subLength, 1.0);
+            let subPosition = Math.min((Math.max(Vector3.Dot(tangent, target.subtract(point).normalize()), 0.0) * Vector3.Distance(point, target)) / subLength, 1.0);
             let distance = Vector3.Distance(point.add(tangent.scale(subPosition * subLength)), target);
 
             if (distance < smallestDistance) {
@@ -536,10 +538,10 @@ export class Path3D {
      */
     public slice(start: number = 0.0, end: number = 1.0) {
         if (start < 0.0) {
-            start = 1 - (start * -1.0) % 1.0;
+            start = 1 - ((start * -1.0) % 1.0);
         }
         if (end < 0.0) {
-            end = 1 - (end * -1.0) % 1.0;
+            end = 1 - ((end * -1.0) % 1.0);
         }
         if (start > end) {
             let _start = start;
@@ -586,7 +588,11 @@ export class Path3D {
 
     // private function compute() : computes tangents, normals and binormals
     private _compute(firstNormal: Nullable<Vector3>, alignTangentsWithPath = false): void {
-        var l = this._curve.length;
+        const l = this._curve.length;
+
+        if (l < 2) {
+            return;
+        }
 
         // first and last tangents
         this._tangents[0] = this._getFirstNonNullVector(0);
@@ -612,12 +618,12 @@ export class Path3D {
         this._distances[0] = 0.0;
 
         // normals and binormals : next points
-        var prev: Vector3;        // previous vector (segment)
-        var cur: Vector3;         // current vector (segment)
-        var curTang: Vector3;     // current tangent
+        var prev: Vector3; // previous vector (segment)
+        var cur: Vector3; // current vector (segment)
+        var curTang: Vector3; // current tangent
         // previous normal
-        var prevNor: Vector3;    // previous normal
-        var prevBinor: Vector3;   // previous binormal
+        var prevNor: Vector3; // previous normal
+        var prevBinor: Vector3; // previous binormal
 
         for (var i = 1; i < l; i++) {
             // tangents
@@ -686,21 +692,18 @@ export class Path3D {
 
         if (va === undefined || va === null) {
             var point: Vector3;
-            if (!Scalar.WithinEpsilon(Math.abs(vt.y) / tgl, 1.0, Epsilon)) {     // search for a point in the plane
+            if (!Scalar.WithinEpsilon(Math.abs(vt.y) / tgl, 1.0, Epsilon)) {
+                // search for a point in the plane
                 point = new Vector3(0.0, -1.0, 0.0);
-            }
-            else if (!Scalar.WithinEpsilon(Math.abs(vt.x) / tgl, 1.0, Epsilon)) {
+            } else if (!Scalar.WithinEpsilon(Math.abs(vt.x) / tgl, 1.0, Epsilon)) {
                 point = new Vector3(1.0, 0.0, 0.0);
-            }
-            else if (!Scalar.WithinEpsilon(Math.abs(vt.z) / tgl, 1.0, Epsilon)) {
+            } else if (!Scalar.WithinEpsilon(Math.abs(vt.z) / tgl, 1.0, Epsilon)) {
                 point = new Vector3(0.0, 0.0, 1.0);
-            }
-            else {
+            } else {
                 point = Vector3.Zero();
             }
             normal0 = Vector3.Cross(vt, point);
-        }
-        else {
+        } else {
             normal0 = Vector3.Cross(vt, va);
             Vector3.CrossToRef(normal0, vt, normal0);
         }
@@ -893,8 +896,7 @@ export class Curve3 {
                 }
             }
             catmullRom.push(catmullRom[0]);
-        }
-        else {
+        } else {
             var totalPoints = new Array<Vector3>();
             totalPoints.push(points[0].clone());
             Array.prototype.push.apply(totalPoints, points);
@@ -958,8 +960,8 @@ export class Curve3 {
     private _computeLength(path: DeepImmutable<Vector3[]>): number {
         var l = 0;
         for (var i = 1; i < path.length; i++) {
-            l += (path[i].subtract(path[i - 1])).length();
+            l += path[i].subtract(path[i - 1]).length();
         }
         return l;
     }
-}
+}