@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
114 lines (113 loc) • 4.25 kB
JavaScript
;
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();
}
}
}