diff --git a/src/components/map/dice/DiceScene.js b/src/components/map/dice/DiceScene.js index 1c51509..70a1d4f 100644 --- a/src/components/map/dice/DiceScene.js +++ b/src/components/map/dice/DiceScene.js @@ -4,7 +4,7 @@ import * as AMMO from "ammo.js"; import "babylonjs-loaders"; import ReactResizeDetector from "react-resize-detector"; -const diceThrowSpeed = 20; +const diceThrowSpeed = 2; function DiceScene({ onSceneMount, onPointerDown, onPointerUp }) { const sceneRef = useRef(); @@ -101,7 +101,7 @@ function DiceScene({ onSceneMount, onPointerDown, onPointerUp }) { const scene = sceneRef.current; if (selectedMesh && scene) { selectedMesh.physicsImpostor.applyImpulse( - velocity.scale(diceThrowSpeed), + velocity.scale(diceThrowSpeed * selectedMesh.physicsImpostor.mass), selectedMesh.physicsImpostor.getObjectCenter() ); } diff --git a/src/dice/Dice.js b/src/dice/Dice.js index 2f9dcbd..89fa803 100644 --- a/src/dice/Dice.js +++ b/src/dice/Dice.js @@ -57,7 +57,7 @@ class Dice { return pbr; } - static createInstanceFromMesh(mesh, name, scene) { + static createInstanceFromMesh(mesh, name, physicalProperties, scene) { let instance = mesh.createInstance(name); instance.position = mesh.position; for (let child of mesh.getChildTransformNodes()) { @@ -70,13 +70,33 @@ class Dice { instance.physicsImpostor = new BABYLON.PhysicsImpostor( instance, BABYLON.PhysicsImpostor.ConvexHullImpostor, - { mass: 10, friction: 4 }, + physicalProperties, scene ); 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) { instance.physicsImpostor.setLinearVelocity(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++; return this.createInstanceFromMesh( mesh, `dice_instance_${this.instanceCount}`, + physicalProperties, scene ); } diff --git a/src/dice/galaxy/GalaxyDice.js b/src/dice/galaxy/GalaxyDice.js index 3e22527..bdd0ec1 100644 --- a/src/dice/galaxy/GalaxyDice.js +++ b/src/dice/galaxy/GalaxyDice.js @@ -20,7 +20,11 @@ class GalaxyDice extends Dice { 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 + ); } } diff --git a/src/dice/iron/IronDice.js b/src/dice/iron/IronDice.js index 6a873e1..61393e9 100644 --- a/src/dice/iron/IronDice.js +++ b/src/dice/iron/IronDice.js @@ -8,6 +8,11 @@ class IronDice extends Dice { static meshes; static material; + static getDicePhysicalProperties(diceType) { + let properties = super.getDicePhysicalProperties(diceType); + return { mass: properties.mass * 2, friction: properties.friction }; + } + static async createInstance(diceType, scene) { if (!this.material) { this.material = this.loadMaterial( @@ -20,7 +25,11 @@ class IronDice extends Dice { 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 + ); } } diff --git a/src/dice/nebula/NebulaDice.js b/src/dice/nebula/NebulaDice.js index e386ed4..6e4c261 100644 --- a/src/dice/nebula/NebulaDice.js +++ b/src/dice/nebula/NebulaDice.js @@ -20,7 +20,11 @@ class NebulaDice extends Dice { 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 + ); } } diff --git a/src/dice/sunrise/SunriseDice.js b/src/dice/sunrise/SunriseDice.js index a358540..e9cd654 100644 --- a/src/dice/sunrise/SunriseDice.js +++ b/src/dice/sunrise/SunriseDice.js @@ -20,7 +20,11 @@ class SunriseDice extends Dice { 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 + ); } } diff --git a/src/dice/sunset/SunsetDice.js b/src/dice/sunset/SunsetDice.js index 6870a97..e4240d8 100644 --- a/src/dice/sunset/SunsetDice.js +++ b/src/dice/sunset/SunsetDice.js @@ -20,7 +20,11 @@ class SunsetDice extends Dice { 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 + ); } } diff --git a/src/dice/walnut/WalnutDice.js b/src/dice/walnut/WalnutDice.js index f7d635e..f17c8eb 100644 --- a/src/dice/walnut/WalnutDice.js +++ b/src/dice/walnut/WalnutDice.js @@ -20,7 +20,11 @@ class WalnutDice extends Dice { 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 + ); } }