David Catuhe 6 yıl önce
ebeveyn
işleme
776f0e8648

+ 5 - 3
src/Cameras/arcRotateCamera.ts

@@ -9,7 +9,6 @@ import { Mesh } from "../Meshes/mesh";
 import { AutoRotationBehavior } from "../Behaviors/Cameras/autoRotationBehavior";
 import { BouncingBehavior } from "../Behaviors/Cameras/bouncingBehavior";
 import { FramingBehavior } from "../Behaviors/Cameras/framingBehavior";
-import { Collider } from "../Collisions/collider";
 import { Camera } from "./camera";
 import { TargetCamera } from "./targetCamera";
 import { ArcRotateCameraPointersInput } from "../Cameras/Inputs/arcRotateCameraPointersInput";
@@ -17,6 +16,8 @@ import { ArcRotateCameraKeyboardMoveInput } from "../Cameras/Inputs/arcRotateCam
 import { ArcRotateCameraMouseWheelInput } from "../Cameras/Inputs/arcRotateCameraMouseWheelInput";
 import { ArcRotateCameraInputsManager } from "../Cameras/arcRotateCameraInputsManager";
 
+declare type Collider = import("../Collisions/collider").Collider;
+
 Node.AddNodeConstructor("ArcRotateCamera", (name, scene) => {
     return () => new ArcRotateCamera(name, 0, 0, 1.0, Vector3.Zero(), scene);
 });
@@ -949,13 +950,14 @@ export class ArcRotateCamera extends TargetCamera {
 
         target.addToRef(this._computationVector, this._newPosition);
         if (this.getScene().collisionsEnabled && this.checkCollisions) {
+            const coordinator = this.getScene().collisionCoordinator;
             if (!this._collider) {
-                this._collider = new Collider();
+                this._collider = coordinator.createCollider();
             }
             this._collider._radius = this.collisionRadius;
             this._newPosition.subtractToRef(this.position, this._collisionVelocity);
             this._collisionTriggered = true;
-            this.getScene().collisionCoordinator.getNewPosition(this.position, this._collisionVelocity, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);
+            coordinator.getNewPosition(this.position, this._collisionVelocity, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);
         } else {
             this.position.copyFrom(this._newPosition);
 

+ 6 - 3
src/Cameras/flyCamera.ts

@@ -4,11 +4,13 @@ import { Scene } from "../scene";
 import { Vector3, Quaternion } from "../Maths/math";
 import { Engine } from "../Engines/engine";
 import { AbstractMesh } from "../Meshes/abstractMesh";
-import { Collider } from "../Collisions/collider";
 import { TargetCamera } from "./targetCamera";
 import { FlyCameraInputsManager } from "./flyCameraInputsManager";
 import { FlyCameraMouseInput } from "../Cameras/Inputs/flyCameraMouseInput";
 import { FlyCameraKeyboardInput } from "../Cameras/Inputs/flyCameraKeyboardInput";
+
+declare type Collider = import("../Collisions/collider").Collider;
+
 /**
  * This is a flying camera, designed for 3D movement and rotation in all directions,
  * such as in a 3D Space Shooter or a Flight Simulator.
@@ -318,9 +320,10 @@ export class FlyCamera extends TargetCamera {
 
         globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);
         this._oldPosition.addInPlace(this.ellipsoidOffset);
+        let coordinator = this.getScene().collisionCoordinator;
 
         if (!this._collider) {
-            this._collider = new Collider();
+            this._collider = coordinator.createCollider();
         }
 
         this._collider._radius = this.ellipsoid;
@@ -335,7 +338,7 @@ export class FlyCamera extends TargetCamera {
             actualDisplacement = displacement.add(this.getScene().gravity);
         }
 
-        this.getScene().collisionCoordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);
+        coordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);
     }
 
     /** @hidden */

+ 5 - 3
src/Cameras/freeCamera.ts

@@ -2,7 +2,6 @@ import { Nullable } from "../types";
 import { serializeAsVector3, serialize } from "../Misc/decorators";
 import { Vector3, Vector2 } from "../Maths/math";
 import { AbstractMesh } from "../Meshes/abstractMesh";
-import { Collider } from "../Collisions/collider";
 import { Scene } from "../scene";
 import { Engine } from "../Engines/engine";
 import { TargetCamera } from "./targetCamera";
@@ -10,6 +9,8 @@ import { FreeCameraInputsManager } from "./freeCameraInputsManager";
 import { FreeCameraMouseInput } from "../Cameras/Inputs/freeCameraMouseInput";
 import { FreeCameraKeyboardMoveInput } from "../Cameras/Inputs/freeCameraKeyboardMoveInput";
 
+declare type Collider = import("../Collisions/collider").Collider;
+
 /**
  * This represents a free type of camera. It can be useful in First Person Shooter game for instance.
  * Please consider using the new UniversalCamera instead as it adds more functionality like the gamepad.
@@ -229,8 +230,9 @@ export class FreeCamera extends TargetCamera {
         globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);
         this._oldPosition.addInPlace(this.ellipsoidOffset);
 
+        let coordinator = this.getScene().collisionCoordinator;
         if (!this._collider) {
-            this._collider = new Collider();
+            this._collider = coordinator.createCollider();
         }
 
         this._collider._radius = this.ellipsoid;
@@ -245,7 +247,7 @@ export class FreeCamera extends TargetCamera {
             actualDisplacement = displacement.add(this.getScene().gravity);
         }
 
-        this.getScene().collisionCoordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);
+        coordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);
 
     }
 

+ 10 - 23
src/Collisions/collisionCoordinator.ts

@@ -3,26 +3,17 @@ import { Scene } from "../scene";
 import { Vector3 } from "../Maths/math";
 import { Engine } from "../Engines/engine";
 import { Collider } from "./collider";
-import { Geometry } from "../Meshes/geometry";
 import { AbstractMesh } from "../Meshes/abstractMesh";
 
 /** @hidden */
 export interface ICollisionCoordinator {
+    createCollider(): Collider;
     getNewPosition(position: Vector3, displacement: Vector3, collider: Collider, maximumRetry: number, excludedMesh: Nullable<AbstractMesh>, onNewPosition: (collisionIndex: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh>) => void, collisionIndex: number): void;
     init(scene: Scene): void;
-    destroy(): void;
-
-    //Update meshes and geometries
-    onMeshAdded(mesh: AbstractMesh): void;
-    onMeshUpdated(mesh: AbstractMesh): void;
-    onMeshRemoved(mesh: AbstractMesh): void;
-    onGeometryAdded(geometry: Geometry): void;
-    onGeometryUpdated(geometry: Geometry): void;
-    onGeometryDeleted(geometry: Geometry): void;
 }
 
 /** @hidden */
-export class CollisionCoordinatorLegacy implements ICollisionCoordinator {
+export class DefaultCollisionCoordinator implements ICollisionCoordinator {
 
     private _scene: Scene;
 
@@ -45,22 +36,14 @@ export class CollisionCoordinatorLegacy implements ICollisionCoordinator {
         onNewPosition(collisionIndex, this._finalPosition, collider.collidedMesh);
     }
 
-    public init(scene: Scene): void {
-        this._scene = scene;
+    public createCollider(): Collider {
+        return new Collider();
     }
 
-    public destroy(): void {
-        //Legacy need no destruction method.
+    public init(scene: Scene): void {
+        this._scene = scene;
     }
 
-    //No update in legacy mode
-    public onMeshAdded(mesh: AbstractMesh) { }
-    public onMeshUpdated(mesh: AbstractMesh) { }
-    public onMeshRemoved(mesh: AbstractMesh) { }
-    public onGeometryAdded(geometry: Geometry) { }
-    public onGeometryUpdated(geometry: Geometry) { }
-    public onGeometryDeleted(geometry: Geometry) { }
-
     private _collideWithWorld(position: Vector3, velocity: Vector3, collider: Collider, maximumRetry: number, finalPosition: Vector3, excludedMesh: Nullable<AbstractMesh> = null): void {
         var closeDistance = Engine.CollisionsEpsilon * 10.0;
 
@@ -100,3 +83,7 @@ export class CollisionCoordinatorLegacy implements ICollisionCoordinator {
         this._collideWithWorld(position, velocity, collider, maximumRetry, finalPosition, excludedMesh);
     }
 }
+
+Scene.CollisionCoordinatorFactory = () => {
+    return new DefaultCollisionCoordinator();
+};

+ 2 - 1
src/Culling/Octrees/octreeSceneComponent.ts

@@ -3,12 +3,13 @@ import { Scene } from "../../scene";
 import { Vector3 } from "../../Maths/math";
 import { SubMesh } from "../../Meshes/subMesh";
 import { AbstractMesh } from "../../Meshes/abstractMesh";
-import { Collider } from "../../Collisions/collider";
 import { Ray } from "../../Culling/ray";
 import { SceneComponentConstants } from "../../sceneComponent";
 
 import { Octree } from "./octree";
 
+declare type Collider = import("../../Collisions/collider").Collider;
+
 declare module "../../scene" {
     export interface Scene {
         /**

+ 2 - 2
src/Culling/boundingInfo.ts

@@ -2,11 +2,11 @@ import { DeepImmutable } from "../types";
 import { ArrayTools } from "../Misc/arrayTools";
 import { Matrix, Vector3, Plane } from "../Maths/math";
 import { Constants } from "../Engines/constants";
-import { Collider } from "../Collisions/collider";
-
 import { BoundingBox } from "./boundingBox";
 import { BoundingSphere } from "./boundingSphere";
 
+declare type Collider = import("../Collisions/collider").Collider;
+
 const _result0 = { min: 0, max: 0 };
 const _result1 = { min: 0, max: 0 };
 const computeBoxExtents = (axis: DeepImmutable<Vector3>, box: DeepImmutable<BoundingBox>, result: { min: number, max: number }) => {

+ 5 - 3
src/Meshes/abstractMesh.ts

@@ -12,7 +12,6 @@ import { TransformNode } from "../Meshes/transformNode";
 import { SubMesh } from "../Meshes/subMesh";
 import { PickingInfo } from "../Collisions/pickingInfo";
 import { IntersectionInfo } from "../Collisions/intersectionInfo";
-import { Collider } from "../Collisions/collider";
 import { Ray } from "../Culling/ray";
 import { ICullable, BoundingInfo } from "../Culling/boundingInfo";
 import { Material } from "../Materials/material";
@@ -24,6 +23,8 @@ import { SolidParticle } from "../Particles/solidParticle";
 import { Constants } from "../Engines/constants";
 import { AbstractActionManager } from '../Actions/abstractActionManager';
 
+declare type Collider = import("../Collisions/collider").Collider;
+
 /** @hidden */
 class _FacetDataStorage {
     // facetData private properties
@@ -1324,14 +1325,15 @@ export class AbstractMesh extends TransformNode implements IDisposable, ICullabl
         var globalPosition = this.getAbsolutePosition();
 
         globalPosition.addToRef(this.ellipsoidOffset, this._oldPositionForCollisions);
+        let coordinator = this.getScene().collisionCoordinator;
 
         if (!this._collider) {
-            this._collider = new Collider();
+            this._collider = coordinator.createCollider();
         }
 
         this._collider._radius = this.ellipsoid;
 
-        this.getScene().collisionCoordinator.getNewPosition(this._oldPositionForCollisions, displacement, this._collider, 3, this, this._onCollisionPositionChange, this.uniqueId);
+        coordinator.getNewPosition(this._oldPositionForCollisions, displacement, this._collider, 3, this, this._onCollisionPositionChange, this.uniqueId);
         return this;
     }
 

+ 1 - 1
src/Meshes/subMesh.ts

@@ -3,13 +3,13 @@ import { Nullable, IndicesArray, DeepImmutable } from "../types";
 import { Matrix, Vector3, Plane } from "../Maths/math";
 import { Engine } from "../Engines/engine";
 import { VertexBuffer } from "./buffer";
-import { Collider } from "../Collisions/collider";
 import { IntersectionInfo } from "../Collisions/intersectionInfo";
 import { Ray } from "../Culling/ray";
 import { ICullable, BoundingInfo } from "../Culling/boundingInfo";
 import { Effect } from "../Materials/effect";
 import { Constants } from "../Engines/constants";
 
+declare type Collider = import("../Collisions/collider").Collider;
 declare type Material = import("../Materials/material").Material;
 declare type MaterialDefines = import("../Materials/materialDefines").MaterialDefines;
 declare type MultiMaterial = import("../Materials/multiMaterial").MultiMaterial;

+ 23 - 45
src/scene.ts

@@ -32,8 +32,7 @@ import { Animatable } from "./Animations/animatable";
 import { AnimationPropertiesOverride } from "./Animations/animationPropertiesOverride";
 import { Light } from "./Lights/light";
 import { PickingInfo } from "./Collisions/pickingInfo";
-import { Collider } from "./Collisions/collider";
-import { ICollisionCoordinator, CollisionCoordinatorLegacy } from "./Collisions/collisionCoordinator";
+import { ICollisionCoordinator } from "./Collisions/collisionCoordinator";
 import { PointerEventTypes, PointerInfoPre, PointerInfo } from "./Events/pointerEvents";
 import { KeyboardInfoPre, KeyboardInfo, KeyboardEventTypes } from "./Events/keyboardEvents";
 import { ActionEvent } from "./Actions/actionEvent";
@@ -52,6 +51,8 @@ import { Logger } from "./Misc/logger";
 import { EngineStore } from "./Engines/engineStore";
 import { AbstractActionManager } from './Actions/abstractActionManager';
 
+declare type Collider = import("./Collisions/collider").Collider;
+
 /**
  * Define an interface for all classes that will hold resources
  */
@@ -152,7 +153,15 @@ export class Scene extends AbstractScene implements IAnimatable {
      * @returns The default material
      */
     public static DefaultMaterialFactory(scene: Scene): Material {
-        throw "Import StandardMaterial or Fill DefaultMaterialFactory static property on scene before relying on default material creation.";
+        throw "Import StandardMaterial or set DefaultMaterialFactory static property on scene before relying on default material creation.";
+    }
+
+    /**
+     * Factory used to create the a collision coordinator.
+     * @returns The collision coordinator
+     */
+    public static CollisionCoordinatorFactory(): ICollisionCoordinator {
+        throw "Import DefaultCollisionCoordinator or set CollisionCoordinatorFactory static property on scene to enable collisions.";
     }
 
     // Members
@@ -924,8 +933,18 @@ export class Scene extends AbstractScene implements IAnimatable {
     */
     public collisionsEnabled = true;
 
+    private _collisionCoordinator: ICollisionCoordinator;
+
     /** @hidden */
-    public collisionCoordinator: ICollisionCoordinator;
+    public get collisionCoordinator(): ICollisionCoordinator {
+        if (!this._collisionCoordinator) {
+            this._collisionCoordinator = Scene.CollisionCoordinatorFactory();
+            this._collisionCoordinator.init(this);
+        }
+
+        return this._collisionCoordinator;
+    }
+
     /**
      * Defines the gravity applied to this scene (used only for collisions)
      * @see http://doc.babylonjs.com/babylon101/cameras,_mesh_collisions_and_gravity
@@ -1305,9 +1324,6 @@ export class Scene extends AbstractScene implements IAnimatable {
             this.attachControl();
         }
 
-        //collision coordinator initialization. For now legacy per default.
-        this.workerCollisions = false; //(!!Worker && (!!CollisionWorker || WorkerIncluded));
-
         // Uniform Buffer
         this._createUbo();
 
@@ -1369,30 +1385,6 @@ export class Scene extends AbstractScene implements IAnimatable {
         this.getCollidingSubMeshCandidates = this._getDefaultSubMeshCandidates.bind(this);
     }
 
-    public set workerCollisions(enabled: boolean) {
-        if (!CollisionCoordinatorLegacy) {
-            return;
-        }
-
-        if (this.collisionCoordinator) {
-            this.collisionCoordinator.destroy();
-        }
-
-        this.collisionCoordinator = new CollisionCoordinatorLegacy();
-
-        this.collisionCoordinator.init(this);
-    }
-
-    /**
-     * Gets a boolean indicating if collisions are processed on a web worker
-     * @see http://doc.babylonjs.com/babylon101/cameras,_mesh_collisions_and_gravity#web-worker-based-collision-system-since-21
-     */
-    public get workerCollisions(): boolean {
-        // Worker has been deprecated.
-        // Keep for back compat.
-        return false;
-    }
-
     /**
      * Gets the mesh that is currently under the pointer
      */
@@ -3061,10 +3053,6 @@ export class Scene extends AbstractScene implements IAnimatable {
     public addMesh(newMesh: AbstractMesh, recursive = false) {
         this.meshes.push(newMesh);
 
-        //notify the collision coordinator
-        if (this.collisionCoordinator) {
-            this.collisionCoordinator.onMeshAdded(newMesh);
-        }
         newMesh._resyncLightSources();
 
         this.onNewMeshAddedObservable.notifyObservers(newMesh);
@@ -3725,11 +3713,6 @@ export class Scene extends AbstractScene implements IAnimatable {
 
         this.addGeometry(geometry);
 
-        //notify the collision coordinator
-        if (this.collisionCoordinator) {
-            this.collisionCoordinator.onGeometryAdded(geometry);
-        }
-
         this.onNewGeometryAddedObservable.notifyObservers(geometry);
 
         return true;
@@ -3766,11 +3749,6 @@ export class Scene extends AbstractScene implements IAnimatable {
 
         this.geometries.pop();
 
-        //notify the collision coordinator
-        if (this.collisionCoordinator) {
-            this.collisionCoordinator.onGeometryDeleted(geometry);
-        }
-
         this.onGeometryRemovedObservable.notifyObservers(geometry);
         return true;
     }