UNPKG

mylingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

59 lines (47 loc) 1.84 kB
import { Cancellable } from "@lincode/promiselikes" import loadCannon from "./cannon/loadCannon" import { cannonSet } from "./cannon/cannonLoop" import scene from "../../../engine/scene" import PhysicsObjectManager from "." import PhysicsUpdate from "./PhysicsUpdate" const physicsGroups = <const>[1, 2, 4, 8, 16, 32] const physicsGroupIndexes = <const>[0, 1, 2, 3, 4, 5] export default async function ( this: PhysicsObjectManager, handle: Cancellable ) { if (handle.done) return scene.attach(this.outerObject3d) const { slipperyMaterial, defaultMaterial, world, Body, Vec3 } = await loadCannon() if (handle.done) return const body = (this.cannonBody = new Body({ mass: this._mass ?? 1, material: this._slippery ? slipperyMaterial : defaultMaterial, collisionFilterGroup: physicsGroups[this._physicsGroup ?? 0], collisionFilterMask: physicsGroupIndexes .filter((index) => !this._ignorePhysicsGroups?.includes(index)) .map((index) => physicsGroups[index]) .reduce((acc, curr) => acc + curr, 0) })) await this.physicsShape() if (handle.done) return if (this._physics === "2d") { body.angularFactor = new Vec3(0, 0, 1) body.linearFactor = new Vec3(1, 1, 0) } if (this._noTumble) body.angularFactor = new Vec3(0, 0, 0) body.position.copy(this.outerObject3d.position as any) body.quaternion.copy(this.outerObject3d.quaternion as any) this.rotationUpdate = new PhysicsUpdate() this.positionUpdate = new PhysicsUpdate() world.addBody(body) cannonSet.add(this) handle.then(() => { world.removeBody(body) cannonSet.delete(this) this.cannonBody = undefined this.rotationUpdate = undefined this.positionUpdate = undefined }) }