freeblox/packages/engine/src/gameobjects/mesh.object.ts

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);
}
}