123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- import { Logger } from "../Misc/logger.js";
- import { Observable } from "../Misc/observable.js";
- import { SceneComponentConstants } from "../sceneComponent.js";
- import { Scene } from "../scene.js";
- import { PhysicsEngine as PhysicsEngineV1 } from "./v1/physicsEngine.js";
- import { PhysicsEngine as PhysicsEngineV2 } from "./v2/physicsEngine.js";
- /**
- * Gets the current physics engine
- * @returns a IPhysicsEngine or null if none attached
- */
- Scene.prototype.getPhysicsEngine = function () {
- return this._physicsEngine;
- };
- /**
- * Enables physics to the current scene
- * @param gravity defines the scene's gravity for the physics engine
- * @param plugin defines the physics engine to be used. defaults to CannonJS.
- * @returns a boolean indicating if the physics engine was initialized
- */
- Scene.prototype.enablePhysics = function (gravity = null, plugin) {
- if (this._physicsEngine) {
- return true;
- }
- // Register the component to the scene
- let component = this._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE);
- if (!component) {
- component = new PhysicsEngineSceneComponent(this);
- this._addComponent(component);
- }
- try {
- if (!plugin || plugin?.getPluginVersion() === 1) {
- this._physicsEngine = new PhysicsEngineV1(gravity, plugin);
- }
- else if (plugin?.getPluginVersion() === 2) {
- this._physicsEngine = new PhysicsEngineV2(gravity, plugin);
- }
- else {
- throw new Error("Unsupported Physics plugin version.");
- }
- this._physicsTimeAccumulator = 0;
- return true;
- }
- catch (e) {
- Logger.Error(e.message);
- return false;
- }
- };
- /**
- * Disables and disposes the physics engine associated with the scene
- */
- Scene.prototype.disablePhysicsEngine = function () {
- if (!this._physicsEngine) {
- return;
- }
- this._physicsEngine.dispose();
- this._physicsEngine = null;
- };
- /**
- * Gets a boolean indicating if there is an active physics engine
- * @returns a boolean indicating if there is an active physics engine
- */
- Scene.prototype.isPhysicsEnabled = function () {
- return this._physicsEngine !== undefined;
- };
- /**
- * Deletes a physics compound impostor
- * @param compound defines the compound to delete
- */
- Scene.prototype.deleteCompoundImpostor = function (compound) {
- const mesh = compound.parts[0].mesh;
- if (mesh.physicsImpostor) {
- mesh.physicsImpostor.dispose( /*true*/);
- mesh.physicsImpostor = null;
- }
- };
- /**
- * @internal
- */
- Scene.prototype._advancePhysicsEngineStep = function (step) {
- if (this._physicsEngine) {
- const subTime = this._physicsEngine.getSubTimeStep();
- if (subTime > 0) {
- this._physicsTimeAccumulator += step;
- while (this._physicsTimeAccumulator > subTime) {
- this.onBeforePhysicsObservable.notifyObservers(this);
- this._physicsEngine._step(subTime / 1000);
- this.onAfterPhysicsObservable.notifyObservers(this);
- this._physicsTimeAccumulator -= subTime;
- }
- }
- else {
- this.onBeforePhysicsObservable.notifyObservers(this);
- this._physicsEngine._step(step / 1000);
- this.onAfterPhysicsObservable.notifyObservers(this);
- }
- }
- };
- /**
- * Defines the physics engine scene component responsible to manage a physics engine
- */
- export class PhysicsEngineSceneComponent {
- /**
- * Creates a new instance of the component for the given scene
- * @param scene Defines the scene to register the component in
- */
- constructor(scene) {
- /**
- * The component name helpful to identify the component in the list of scene components.
- */
- this.name = SceneComponentConstants.NAME_PHYSICSENGINE;
- this.scene = scene;
- this.scene.onBeforePhysicsObservable = new Observable();
- this.scene.onAfterPhysicsObservable = new Observable();
- // Replace the function used to get the deterministic frame time
- this.scene.getDeterministicFrameTime = () => {
- if (this.scene._physicsEngine) {
- return this.scene._physicsEngine.getTimeStep() * 1000;
- }
- return 1000.0 / 60.0;
- };
- }
- /**
- * Registers the component in a given scene
- */
- register() { }
- /**
- * Rebuilds the elements related to this component in case of
- * context lost for instance.
- */
- rebuild() {
- // Nothing to do for this component
- }
- /**
- * Disposes the component and the associated resources
- */
- dispose() {
- this.scene.onBeforePhysicsObservable.clear();
- this.scene.onAfterPhysicsObservable.clear();
- if (this.scene._physicsEngine) {
- this.scene.disablePhysicsEngine();
- }
- }
- }
- //# sourceMappingURL=joinedPhysicsEngineComponent.js.map
|