@dimforge/rapier2d
Version:
2-dimensional physics engine in Rust - official JS bindings.
118 lines (103 loc) • 3.33 kB
text/typescript
import {Collider, ColliderHandle} from "./collider";
import {Vector, VectorOps, scratchBuffer} from "../math";
import {
RawFeatureType,
RawPointColliderProjection,
RawPointProjection,
} from "../raw";
import {FeatureType} from "./feature";
import {ColliderSet} from "./collider_set";
/**
* The projection of a point on a collider.
*/
export class PointProjection {
/**
* The projection of the point on the collider.
*/
point: Vector;
/**
* Is the point inside of the collider?
*/
isInside: boolean;
constructor(point: Vector, isInside: boolean) {
this.point = point;
this.isInside = isInside;
}
/**
* @param raw - The raw projection returned by the WASM query. It is freed by this method.
* @param target - If provided, this object is populated and returned instead of
* allocating a new one.
*/
public static fromBuffer(
raw: RawPointProjection,
target?: PointProjection,
): PointProjection {
if (!raw) return null;
raw.point(scratchBuffer);
target ??= new PointProjection(VectorOps.zeros(), false);
target.point = VectorOps.fromBuffer(scratchBuffer, target.point);
target.isInside = raw.isInside();
raw.free();
return target;
}
}
/**
* The projection of a point on a collider (includes the collider handle).
*/
export class PointColliderProjection {
/**
* The collider hit by the ray.
*/
collider: Collider;
/**
* The projection of the point on the collider.
*/
point: Vector;
/**
* Is the point inside of the collider?
*/
isInside: boolean;
/**
* The type of the geometric feature the point was projected on.
*/
featureType = FeatureType.Unknown;
/**
* The id of the geometric feature the point was projected on.
*/
featureId: number | undefined = undefined;
constructor(
collider: Collider,
point: Vector,
isInside: boolean,
featureType?: FeatureType,
featureId?: number,
) {
this.collider = collider;
this.point = point;
this.isInside = isInside;
if (featureId !== undefined) this.featureId = featureId;
if (featureType !== undefined) this.featureType = featureType;
}
/**
* @param colliderSet - The set the projected-on collider belongs to.
* @param raw - The raw projection returned by the WASM query. It is freed by this method.
* @param target - If provided, this object is populated and returned instead of
* allocating a new one.
*/
public static fromBuffer(
colliderSet: ColliderSet,
raw: RawPointColliderProjection,
target?: PointColliderProjection,
): PointColliderProjection {
if (!raw) return null;
raw.point(scratchBuffer);
target ??= new PointColliderProjection(null, VectorOps.zeros(), false);
target.collider = colliderSet.get(raw.colliderHandle());
target.point = VectorOps.fromBuffer(scratchBuffer, target.point);
target.isInside = raw.isInside();
target.featureType = raw.featureType() as number as FeatureType;
target.featureId = raw.featureId();
raw.free();
return target;
}
}