Added per dice physics properties

This commit is contained in:
Mitchell McCaffrey 2020-05-27 14:01:12 +10:00
parent d4ec013df2
commit da84f923d1
8 changed files with 61 additions and 11 deletions

View File

@ -4,7 +4,7 @@ import * as AMMO from "ammo.js";
import "babylonjs-loaders"; import "babylonjs-loaders";
import ReactResizeDetector from "react-resize-detector"; import ReactResizeDetector from "react-resize-detector";
const diceThrowSpeed = 20; const diceThrowSpeed = 2;
function DiceScene({ onSceneMount, onPointerDown, onPointerUp }) { function DiceScene({ onSceneMount, onPointerDown, onPointerUp }) {
const sceneRef = useRef(); const sceneRef = useRef();
@ -101,7 +101,7 @@ function DiceScene({ onSceneMount, onPointerDown, onPointerUp }) {
const scene = sceneRef.current; const scene = sceneRef.current;
if (selectedMesh && scene) { if (selectedMesh && scene) {
selectedMesh.physicsImpostor.applyImpulse( selectedMesh.physicsImpostor.applyImpulse(
velocity.scale(diceThrowSpeed), velocity.scale(diceThrowSpeed * selectedMesh.physicsImpostor.mass),
selectedMesh.physicsImpostor.getObjectCenter() selectedMesh.physicsImpostor.getObjectCenter()
); );
} }

View File

@ -57,7 +57,7 @@ class Dice {
return pbr; return pbr;
} }
static createInstanceFromMesh(mesh, name, scene) { static createInstanceFromMesh(mesh, name, physicalProperties, scene) {
let instance = mesh.createInstance(name); let instance = mesh.createInstance(name);
instance.position = mesh.position; instance.position = mesh.position;
for (let child of mesh.getChildTransformNodes()) { for (let child of mesh.getChildTransformNodes()) {
@ -70,13 +70,33 @@ class Dice {
instance.physicsImpostor = new BABYLON.PhysicsImpostor( instance.physicsImpostor = new BABYLON.PhysicsImpostor(
instance, instance,
BABYLON.PhysicsImpostor.ConvexHullImpostor, BABYLON.PhysicsImpostor.ConvexHullImpostor,
{ mass: 10, friction: 4 }, physicalProperties,
scene scene
); );
return instance; return instance;
} }
static getDicePhysicalProperties(diceType) {
switch (diceType) {
case "d4":
return { mass: 4, friction: 4 };
case "d6":
return { mass: 6, friction: 4 };
case "d8":
return { mass: 6.2, friction: 4 };
case "d10":
case "d100":
return { mass: 7, friction: 4 };
case "d12":
return { mass: 8, friction: 4 };
case "20":
return { mass: 10, friction: 4 };
default:
return { mass: 10, friction: 4 };
}
}
static roll(instance) { static roll(instance) {
instance.physicsImpostor.setLinearVelocity(BABYLON.Vector3.Zero()); instance.physicsImpostor.setLinearVelocity(BABYLON.Vector3.Zero());
instance.physicsImpostor.setAngularVelocity(BABYLON.Vector3.Zero()); instance.physicsImpostor.setAngularVelocity(BABYLON.Vector3.Zero());
@ -118,12 +138,13 @@ class Dice {
); );
} }
static async createInstance(mesh, scene) { static async createInstance(mesh, physicalProperties, scene) {
this.instanceCount++; this.instanceCount++;
return this.createInstanceFromMesh( return this.createInstanceFromMesh(
mesh, mesh,
`dice_instance_${this.instanceCount}`, `dice_instance_${this.instanceCount}`,
physicalProperties,
scene scene
); );
} }

View File

@ -20,7 +20,11 @@ class GalaxyDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene); this.meshes = await this.loadMeshes(this.material, scene);
} }
return Dice.createInstance(this.meshes[diceType], scene); return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
} }
} }

View File

@ -8,6 +8,11 @@ class IronDice extends Dice {
static meshes; static meshes;
static material; static material;
static getDicePhysicalProperties(diceType) {
let properties = super.getDicePhysicalProperties(diceType);
return { mass: properties.mass * 2, friction: properties.friction };
}
static async createInstance(diceType, scene) { static async createInstance(diceType, scene) {
if (!this.material) { if (!this.material) {
this.material = this.loadMaterial( this.material = this.loadMaterial(
@ -20,7 +25,11 @@ class IronDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene); this.meshes = await this.loadMeshes(this.material, scene);
} }
return Dice.createInstance(this.meshes[diceType], scene); return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
} }
} }

View File

@ -20,7 +20,11 @@ class NebulaDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene); this.meshes = await this.loadMeshes(this.material, scene);
} }
return Dice.createInstance(this.meshes[diceType], scene); return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
} }
} }

View File

@ -20,7 +20,11 @@ class SunriseDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene); this.meshes = await this.loadMeshes(this.material, scene);
} }
return Dice.createInstance(this.meshes[diceType], scene); return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
} }
} }

View File

@ -20,7 +20,11 @@ class SunsetDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene); this.meshes = await this.loadMeshes(this.material, scene);
} }
return Dice.createInstance(this.meshes[diceType], scene); return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
} }
} }

View File

@ -20,7 +20,11 @@ class WalnutDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene); this.meshes = await this.loadMeshes(this.material, scene);
} }
return Dice.createInstance(this.meshes[diceType], scene); return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
} }
} }