class_name Dice extends RigidBody3D var previous_position: Vector3 var previous_rotation: Vector3 var is_moving := false @export var configuration: DiceConfiguration func _ready() -> void: %DiceFaceFront.configuration = configuration.front_face %DiceFaceBack.configuration = configuration.back_face %DiceFaceTop.configuration = configuration.top_face %DiceFaceBottom.configuration = configuration.bottom_face %DiceFaceLeft.configuration = configuration.left_face %DiceFaceRight.configuration = configuration.right_face func roll(direction := Vector3(1.0, 1.0, 1.0), strength: float = 20) -> void: var position_impulse := Vector3( [-1, 1].pick_random(), randf_range(0.5, 1.0), [-1, 1].pick_random() ) apply_central_impulse(position_impulse.normalized() * direction * strength) var rotation_impulse := Vector3( [-1, 1].pick_random(), [-1, 1].pick_random(), [-1, 1].pick_random() ) apply_torque_impulse(rotation_impulse) func get_top() -> DiceFace: var top := -pow(2, 8) var face: DiceFace for node: DiceFace in $Faces.get_children(): if top < node.global_transform.origin.y: top = node.global_transform.origin.y face = node return face func _physics_process(_delta: float) -> void: is_moving = not previous_position == global_position and not previous_rotation == rotation previous_position = global_position previous_rotation = rotation