from UM.Scene.SceneNode import SceneNode
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.Operations.TranslateOperation import TranslateOperation
from UM.Math.Float import Float
from UM.Math.Vector import Vector
from UM.Application import Application

from PlatformPhysicsOperation import PlatformPhysicsOperation

import time
import threading

class PlatformPhysics:
    def __init__(self, controller):
        super().__init__()
        self._controller = controller
        self._controller.getScene().sceneChanged.connect(self._onSceneChanged)
        self._signal_source = None

    def _onSceneChanged(self, source):
        root = self._controller.getScene().getRoot()
        for node in BreadthFirstIterator(root):
            if node is root or type(node) is not SceneNode:
                continue

            bbox = node.getBoundingBox()
            if not Float.fuzzyCompare(bbox.bottom, 0.0):
                self._signal_source = node
                op = PlatformPhysicsOperation(node, Vector(0, -bbox.bottom, 0))
                Application.getInstance().getOperationStack().push(op)
                self._signal_source = None