babylon.physicsEngine.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. module BABYLON {
  2. export interface IPhysicsEnginePlugin {
  3. initialize(iterations?: number);
  4. setGravity(gravity: Vector3): void;
  5. runOneStep(delta: number): void;
  6. registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any;
  7. registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any;
  8. unregisterMesh(mesh: AbstractMesh);
  9. applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void;
  10. createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean;
  11. dispose(): void;
  12. isSupported(): boolean;
  13. updateBodyPosition(mesh: AbstractMesh): void;
  14. }
  15. export interface PhysicsBodyCreationOptions {
  16. mass: number;
  17. friction: number;
  18. restitution: number;
  19. }
  20. export interface PhysicsCompoundBodyPart {
  21. mesh: Mesh;
  22. impostor: number;
  23. }
  24. export class PhysicsEngine {
  25. public gravity: Vector3;
  26. private _currentPlugin: IPhysicsEnginePlugin;
  27. constructor(plugin?: IPhysicsEnginePlugin) {
  28. this._currentPlugin = plugin || new OimoJSPlugin();
  29. }
  30. public _initialize(gravity?: Vector3) {
  31. this._currentPlugin.initialize();
  32. this._setGravity(gravity);
  33. }
  34. public _runOneStep(delta: number): void {
  35. if (delta > 0.1) {
  36. delta = 0.1;
  37. } else if (delta <= 0) {
  38. delta = 1.0 / 60.0;
  39. }
  40. this._currentPlugin.runOneStep(delta);
  41. }
  42. public _setGravity(gravity: Vector3): void {
  43. this.gravity = gravity || new Vector3(0, -9.82, 0);
  44. this._currentPlugin.setGravity(this.gravity);
  45. }
  46. public _registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any {
  47. return this._currentPlugin.registerMesh(mesh, impostor, options);
  48. }
  49. public _registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any {
  50. return this._currentPlugin.registerMeshesAsCompound(parts, options);
  51. }
  52. public _unregisterMesh(mesh: AbstractMesh): void {
  53. this._currentPlugin.unregisterMesh(mesh);
  54. }
  55. public _applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void {
  56. this._currentPlugin.applyImpulse(mesh, force, contactPoint);
  57. }
  58. public _createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean {
  59. return this._currentPlugin.createLink(mesh1, mesh2, pivot1, pivot2, options);
  60. }
  61. public _updateBodyPosition(mesh: AbstractMesh): void {
  62. this._currentPlugin.updateBodyPosition(mesh);
  63. }
  64. public dispose(): void {
  65. this._currentPlugin.dispose();
  66. }
  67. public isSupported(): boolean {
  68. return this._currentPlugin.isSupported();
  69. }
  70. // Statics
  71. public static NoImpostor = 0;
  72. public static SphereImpostor = 1;
  73. public static BoxImpostor = 2;
  74. public static PlaneImpostor = 3;
  75. public static MeshImpostor = 4;
  76. public static CapsuleImpostor = 5;
  77. public static ConeImpostor = 6;
  78. public static CylinderImpostor = 7;
  79. public static ConvexHullImpostor = 8;
  80. public static Epsilon = 0.001;
  81. }
  82. }