lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
85 lines • 3.87 kB
JavaScript
import { deg2Rad } from "@lincode/math";
import { physxPtr } from "../../pointers/physxPtr";
import { assignPxTransform } from "../../engine/physx/pxMath";
import getActualScale from "../../memo/getActualScale";
import scene from "../../engine/scene";
import { actorPtrManagerMap, controllerManagerMap, managerActorMap, managerControllerMap } from "../../collections/pxCollections";
import { lazy } from "@lincode/utils";
import { increaseLoadingAssetsCount, decreaseLoadingAssetsCount } from "../../states/useLoadingAssetsCount";
import { getPhysXLoaded } from "../../states/usePhysXLoaded";
import { physicsSet } from "../../collections/physicsSet";
import createInternalSystem from "../utils/createInternalSystem";
export const importPhysX = lazy(async () => {
increaseLoadingAssetsCount();
await import("../../engine/physx");
await new Promise((resolve) => getPhysXLoaded((loaded, handle) => {
if (!loaded)
return;
handle.cancel();
resolve();
}));
decreaseLoadingAssetsCount();
});
export const configPhysicsShapeSystem = createInternalSystem("configPhysicsShapeSystem", {
effect: (self) => {
const mode = self.physics || !!self.$jointCount;
if (!mode)
return false;
physicsSet.add(self);
const { physics, pxScene, PxCapsuleControllerDesc, PxCapsuleClimbingModeEnum, PxControllerNonWalkableModeEnum, material, getPxControllerManager, controllerHitCallback, destroy } = physxPtr[0];
const ogParent = self.outerObject3d.parent;
ogParent !== scene && scene.attach(self.outerObject3d);
if (mode === "character") {
const desc = new PxCapsuleControllerDesc();
const { x, y } = getActualScale(self).multiplyScalar(0.5);
self.$capsuleHeight = y * 2;
desc.height = y * 1.2;
desc.radius = x;
Object.assign(desc.position, self.position);
desc.climbingMode = PxCapsuleClimbingModeEnum.eEASY();
desc.nonWalkableMode =
PxControllerNonWalkableModeEnum.ePREVENT_CLIMBING();
desc.slopeLimit = Math.cos(45 * deg2Rad);
desc.material = material;
desc.contactOffset = 0.1;
// desc.stepOffset = y * 0.4
// desc.maxJumpHeight = 0.1
desc.reportCallback = controllerHitCallback;
// desc.behaviorCallback = behaviorCallback.callback
const controller = (self.$controller =
getPxControllerManager().createController(desc));
destroy(desc);
self.$initActor(controller.getActor());
managerControllerMap.set(self, controller);
controllerManagerMap.set(controller, self);
return;
}
const pxTransform = assignPxTransform(self);
const isStatic = mode === "map" || mode === "static";
const actor = self.$initActor(isStatic
? physics.createRigidStatic(pxTransform)
: physics.createRigidDynamic(pxTransform));
self.$getPxShape(mode, actor);
pxScene.addActor(actor);
managerActorMap.set(self, actor);
},
cleanup: (self) => {
if (self.$controller) {
physicsSet.delete(self);
actorPtrManagerMap.delete(self.$actor.ptr);
physxPtr[0].destroy(self.$controller);
managerControllerMap.delete(self);
self.$actor = undefined;
self.$controller = undefined;
return;
}
physicsSet.delete(self);
physxPtr[0].pxScene.removeActor(self.$actor);
physxPtr[0].destroy(self.$actor);
actorPtrManagerMap.delete(self.$actor.ptr);
managerActorMap.delete(self);
self.$actor = undefined;
},
effectTicker: [importPhysX]
});
//# sourceMappingURL=configPhysicsShapeSystem.js.map