void CShadowController::Tick(float deltaTime) {
	if (m_enable) {
		ComputeShadowControllerBull(m_pObject->GetObject(), m_shadow, m_secondsToArrival, deltaTime);
		m_secondsToArrival -= deltaTime;
		if (m_secondsToArrival < 0) m_secondsToArrival = 0;
	} else {
		m_shadow.lastPosition.setZero();
	}
}
// UNEXPOSED
void CShadowController::Tick(float deltaTime) {
	if (m_enable) {
		if (IsPhysicallyControlled()) {
			ComputeShadowControllerBull(m_pObject->GetObject(), m_shadow, m_secondsToArrival, deltaTime);
			m_secondsToArrival -= deltaTime;
			if (m_secondsToArrival < 0) m_secondsToArrival = 0;
		} else {
			// TODO: Need to use secondsToArrival

			btTransform target(m_shadow.targetRotation, m_shadow.targetPosition);
			target *= ((btMassCenterMotionState *)m_pObject->GetObject()->getMotionState())->m_centerOfMassOffset;
			m_pObject->GetObject()->setWorldTransform(target);
		}
	} else {
		m_shadow.lastPosition.setZero();
	}

	m_ticksSinceUpdate++;
}
float ComputeShadowControllerHL(CPhysicsObject *pObject, const hlshadowcontrol_params_t &params, float secondsToArrival, float dt) {
	shadowcontrol_params_t bullParams;
	ConvertShadowControllerToBull(params, bullParams);
	return ComputeShadowControllerBull(pObject->GetObject(), bullParams, secondsToArrival, dt);
}