44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
import {
|
|
BufferGeometry,
|
|
Mesh,
|
|
MeshPhongMaterial,
|
|
SkinnedMesh,
|
|
Vector3,
|
|
} from 'three';
|
|
import { Brick } from '.';
|
|
import type Rapier from '@dimforge/rapier3d';
|
|
|
|
export class MeshPart extends Brick {
|
|
public objectType = 'MeshPart';
|
|
|
|
constructor(
|
|
geometry: BufferGeometry,
|
|
material = new MeshPhongMaterial(),
|
|
mesh: Mesh = new Mesh(geometry, material)
|
|
) {
|
|
super(geometry, material, mesh);
|
|
}
|
|
|
|
/** Do some surgery to convert a loaded SkinnedMesh into a game object */
|
|
static fromLoaded(loaded: SkinnedMesh) {
|
|
const newObject = new MeshPart(loaded.geometry, undefined, loaded);
|
|
newObject.mesh.material = newObject.material;
|
|
newObject.add(loaded);
|
|
return newObject;
|
|
}
|
|
|
|
protected override createCollider(
|
|
factory: typeof Rapier,
|
|
world: Rapier.World,
|
|
body?: Rapier.RigidBody
|
|
) {
|
|
const scale = this.getWorldScale(new Vector3()).divideScalar(2);
|
|
const collider = factory.ColliderDesc.cuboid(
|
|
Math.abs(scale.x),
|
|
Math.abs(scale.y),
|
|
Math.abs(scale.z)
|
|
);
|
|
return world.createCollider(collider, body);
|
|
}
|
|
}
|