UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

114 lines (113 loc) 4.25 kB
"use strict"; import { CorePhysicsAttribute, PhysicsRBDColliderType, physicsAttribNameLive, PhysicsRBDHeightAttribute, PhysicsRBDRadiusAttribute } from "../PhysicsAttribute"; import { _getRBDFromObject } from "../PhysicsRBD"; import { touchRBDProperty } from "../../reactivity/RBDPropertyReactivity"; import { coreObjectClassFactory } from "../../geometry/CoreObjectFactory"; export var RBDCapsuleProperty = /* @__PURE__ */ ((RBDCapsuleProperty2) => { RBDCapsuleProperty2["RADIUS"] = "radius"; RBDCapsuleProperty2["HEIGHT"] = "height"; return RBDCapsuleProperty2; })(RBDCapsuleProperty || {}); const EXPECTED_TYPE = PhysicsRBDColliderType.CAPSULE; export function createPhysicsCapsule(PhysicsLib2, object) { const halfHeight = CorePhysicsAttribute.getHeight(object) * 0.5 * object.scale.y; const radius = CorePhysicsAttribute.getRadius(object) * object.scale.x; return PhysicsLib2.ColliderDesc.capsule(halfHeight, radius); } const attributeHeightLive = physicsAttribNameLive(PhysicsRBDHeightAttribute.HEIGHT); const attributeRadiusLive = physicsAttribNameLive(PhysicsRBDRadiusAttribute.RADIUS); export function currentHeight(object, collider) { const coreObjectClass = coreObjectClassFactory(object); let _currentHeight = coreObjectClass.attribValue(object, attributeHeightLive); if (_currentHeight == null) { const shape = collider.shape; _currentHeight = shape.halfHeight * 2; coreObjectClass.setAttribute(object, attributeHeightLive, _currentHeight); } return _currentHeight; } export function currentRadius(object, collider) { const coreObjectClass = coreObjectClassFactory(object); let _currentRadius = coreObjectClass.attribValue(object, attributeRadiusLive); if (_currentRadius == null) { const shape = collider.shape; _currentRadius = shape.radius; coreObjectClass.setAttribute(object, attributeRadiusLive, _currentRadius); } return _currentRadius; } export function _getPhysicsRBDCapsuleHeight(object) { const body = _getRBDFromObject(object); if (!body) { console.warn("no rbd found"); return; } const colliderType = CorePhysicsAttribute.getColliderType(object); if (colliderType == null || colliderType != EXPECTED_TYPE) { return; } const collider = body.collider(0); if (!collider) { return; } return currentHeight(object, collider); } export function _getPhysicsRBDCapsuleRadius(object) { const body = _getRBDFromObject(object); if (!body) { console.warn("no rbd found"); return; } const colliderType = CorePhysicsAttribute.getColliderType(object); if (colliderType == null || colliderType != EXPECTED_TYPE) { return; } const collider = body.collider(0); if (!collider) { return; } return currentRadius(object, collider); } export function _setPhysicsRBDCapsuleProperty(object, targetScale, lerp, updateObjectMatrix) { const body = _getRBDFromObject(object); if (!body) { console.warn("no rbd found"); return; } const colliderType = CorePhysicsAttribute.getColliderType(object); if (colliderType == null || colliderType != EXPECTED_TYPE) { return; } const collidersCount = body.numColliders(); const originalHeightAttrib = CorePhysicsAttribute.getHeight(object); const originalRadiusAttrib = CorePhysicsAttribute.getRadius(object); for (let i = 0; i < collidersCount; i++) { const collider = body.collider(i); if (!collider) { return; } let targetRadius = targetScale; if (lerp < 1) { targetRadius = lerp * targetRadius + (1 - lerp) * currentRadius(object, collider); } const radiusRatio = targetRadius / originalRadiusAttrib; const targetHeight = 0.5 * radiusRatio * originalHeightAttrib; collider.setHalfHeight(targetHeight); collider.setRadius(targetRadius); const coreObjectClass = coreObjectClassFactory(object); coreObjectClass.setAttribute(object, attributeHeightLive, targetHeight); coreObjectClass.setAttribute(object, attributeRadiusLive, targetRadius); touchRBDProperty(object, "height" /* HEIGHT */); touchRBDProperty(object, "radius" /* RADIUS */); object.scale.set(radiusRatio, radiusRatio, radiusRatio); if (updateObjectMatrix) { object.updateMatrix(); } } }