// Updates the animated object from controller input.
    private void UpdateHand(SixenseInput.Controller controller)
    {
        if (Hand == SixenseHands.RIGHT && vrGrabHand != null) {
            vrGrabHand.thumbInput = 0f;
            if (controller.GetButton(SixenseButtons.ONE))
                vrGrabHand.thumbInput = 0.5f;
            if (controller.GetButton(SixenseButtons.THREE))
                vrGrabHand.thumbInput = 1f;

            vrGrabHand.indexInput = controller.GetButton(SixenseButtons.BUMPER) ? 1 : 0;
            vrGrabHand.middleInput = controller.Trigger;
            vrGrabHand.ringInput = controller.Trigger;
            vrGrabHand.littleInput = controller.Trigger;
        }

        if (Hand == SixenseHands.LEFT && vrGrabHand != null) {
            vrGrabHand.thumbInput = 0f;
            if (controller.GetButton(SixenseButtons.TWO))
                vrGrabHand.thumbInput = 0.5f;
            if (controller.GetButton(SixenseButtons.FOUR))
                vrGrabHand.thumbInput = 1f;

            vrGrabHand.indexInput = controller.GetButton(SixenseButtons.BUMPER) ? 1 : 0;
            vrGrabHand.middleInput = controller.Trigger;
            vrGrabHand.ringInput = controller.Trigger;
            vrGrabHand.littleInput = controller.Trigger;
        }
    }
    // Updates the animated object from controller input.
    new protected void UpdateAnimationInput(SixenseInput.Controller controller)
    {
        // Point
        if (controller.GetButton(SixenseButtons.BUMPER))
        {
            m_animator.SetBool("Point", true);
        }
        else
        {
            m_animator.SetBool("Point", false);
        }

        // HoldBook
        if (controller.GetButton(SixenseButtons.START))
        {
            m_animator.SetBool("HoldBook", true);
        }
        else
        {
            m_animator.SetBool("HoldBook", false);
        }

        // Fist
        float fTriggerVal = controller.Trigger;
        fTriggerVal = Mathf.Lerp(m_fLastTriggerVal, fTriggerVal, 0.1f);
        m_fLastTriggerVal = fTriggerVal;

        if (fTriggerVal > 0.01f)
        {
            m_animator.SetBool("Fist", true);
        }
        else
        {
            m_animator.SetBool("Fist", false);
        }

        m_animator.SetFloat("FistAmount", fTriggerVal);

        // Idle
        if (m_animator.GetBool("Fist") == false &&
             m_animator.GetBool("HoldBook") == false &&
             m_animator.GetBool("GripBall") == false &&
             m_animator.GetBool("Point") == false)
        {
            m_animator.SetBool("Idle", true);
        }
        else
        {
            m_animator.SetBool("Idle", false);
        }
    }
    protected override void UpdateObject( SixenseInput.Controller controller )
    {
        if (controller.Enabled)
            UpdateHand(controller);

        if (!m_enabled && controller.Trigger > 0.01f) {
            m_enabled = true;

            // delta controller position is relative to this point
            m_baseControllerPosition = new Vector3( controller.Position.x * Sensitivity.x,
                                                   controller.Position.y * Sensitivity.y,
                                                   controller.Position.z * Sensitivity.z );

            // this is the new start position
            m_initialPosition = this.gameObject.transform.localPosition;
        }
        if (m_enabled && controller.GetButton(SixenseButtons.START)) {
            m_enabled = false;
        }

        if ( m_enabled ) {
            UpdatePosition( controller );
            UpdateRotation( controller );
        }
    }
	// Updates the animated object from controller input.
	protected void UpdateAnimationInput( SixenseInput.Controller controller)
	{
		// Point
		if ( Hand == SixenseHands.RIGHT ? controller.GetButton(SixenseButtons.ONE) : controller.GetButton(SixenseButtons.TWO) )
		{
			m_animator.SetBool( "Point", true );
		}
		else
		{
			m_animator.SetBool( "Point", false );
		}
		
		// Grip Ball
		if ( Hand == SixenseHands.RIGHT ? controller.GetButton(SixenseButtons.TWO) : controller.GetButton(SixenseButtons.ONE)  )
		{
			m_animator.SetBool( "GripBall", true );
		}
		else
		{
			m_animator.SetBool( "GripBall", false );
		}
				
		// Hold Book
		if ( Hand == SixenseHands.RIGHT ? controller.GetButton(SixenseButtons.THREE) : controller.GetButton(SixenseButtons.FOUR) )
		{
			m_animator.SetBool( "HoldBook", true );
		}
		else
		{
			m_animator.SetBool( "HoldBook", false );
		}
				
		// Fist
		float fTriggerVal = controller.Trigger;
		fTriggerVal = Mathf.Lerp( m_fLastTriggerVal, fTriggerVal, 0.1f );
		m_fLastTriggerVal = fTriggerVal;
		
		if ( fTriggerVal > 0.01f )
		{
			m_animator.SetBool( "Fist", true );
		}
		else
		{
			m_animator.SetBool( "Fist", false );
		}
		
		m_animator.SetFloat("FistAmount", fTriggerVal);
		
		// Idle
		if ( m_animator.GetBool("Fist") == false &&  
			 m_animator.GetBool("HoldBook") == false && 
			 m_animator.GetBool("GripBall") == false && 
			 m_animator.GetBool("Point") == false )
		{
			m_animator.SetBool("Idle", true);
		}
		else
		{
			m_animator.SetBool("Idle", false);
		}
	}
    // Updates the animated object from controller input.
    protected void UpdateAnimationInput( SixenseInput.Controller controller)
    {
        // Tools can only be used by the right hand
        if (Hand == SixenseHands.RIGHT)
        {
            if ( Hand == SixenseHands.RIGHT ? controller.GetButton(SixenseButtons.ONE) : controller.GetButton(SixenseButtons.TWO) )
            {
                if(!m_toolPressed) {
                    NextTool();
                    Debug.Log ("What");
                }

                m_toolPressed = true;
                m_animator.SetBool( "Point", true );
            }
            else
            {
                m_toolPressed = false;
                m_animator.SetBool( "Point", false );
            }
        }
        else
        {
            // Grip Ball
            if ( Hand == SixenseHands.RIGHT ? controller.GetButton(SixenseButtons.TWO) : controller.GetButton(SixenseButtons.ONE)  )
            {
                m_animator.SetBool( "GripBall", true );
            }
            else
            {
                m_animator.SetBool( "GripBall", false );
            }

            // Hold Book
            if ( Hand == SixenseHands.RIGHT ? controller.GetButton(SixenseButtons.THREE) : controller.GetButton(SixenseButtons.FOUR) )
            {
                m_animator.SetBool( "HoldBook", true );
            }
            else
            {
                m_animator.SetBool( "HoldBook", false );
            }
        }

        // Fist
        float fTriggerVal = controller.Trigger;
        if (fTriggerVal > 0.01f) {
            if (Hand == SixenseHands.RIGHT)
            {
                if(m_tool && !m_isActivating) {
                    m_tool.Activate();
                    m_isActivating = true;
                }
            }
            else
            {
                m_pickupZone.Grab();
            }
        }
        else
        {
            if (Hand == SixenseHands.RIGHT)
            {
                m_isActivating = false;
            }
            else
            {
                m_pickupZone.Drop();
            }
        }

        fTriggerVal = Mathf.Lerp( m_fLastTriggerVal, fTriggerVal, 0.1f );
        m_fLastTriggerVal = fTriggerVal;

        if ( fTriggerVal > 0.01f )
        {
            m_animator.SetBool( "Fist", true );
        }
        else
        {
            m_animator.SetBool( "Fist", false );
        }

        m_animator.SetFloat("FistAmount", fTriggerVal);

        // Idle
        if ( m_animator.GetBool("Fist") == false &&
             m_animator.GetBool("HoldBook") == false &&
             m_animator.GetBool("GripBall") == false &&
             m_animator.GetBool("Point") == false )
        {
            m_animator.SetBool("Idle", true);
        }
        else
        {
            m_animator.SetBool("Idle", false);
        }
    }
    /*void OnGUI()
    {
        if ( !m_enabled )
        {
            GUI.Box( new Rect( Screen.width / 2 - 100, Screen.height - 40, 200, 30 ),  "Press Start To Move/Rotate" );
        }
    }*/
    protected virtual void UpdateObject(  SixenseInput.Controller controller )
    {
        if ( Input.GetKeyDown (KeyCode.E) || Input.GetKeyDown (KeyCode.F) || Input.GetKeyDown (KeyCode.T)/*controller.GetButtonDown( SixenseButtons.START )*/ )
        {
            // enable position and orientation control
            m_enabled = !m_enabled;

            // delta controller position is relative to this point
            m_baseControllerPosition = new Vector3( -controller.Position.z * Sensitivity.x,
                                                   controller.Position.y * Sensitivity.y,
                                                   controller.Position.x * Sensitivity.z );

            // this is the new start position
            m_initialPosition = this.gameObject.transform.localPosition;

            gameObject.GetComponentInChildren<MeshRenderer>().enabled = m_enabled;
        }

        /*if (m_enabled && controller.GetButtonDown (SixenseButtons.JOYSTICK))
        {
            this.gameObject.transform.Translate(0.0f,controller.JoystickY,controller.JoystickX);
        }*/
        if ( m_enabled )
        {
            //Déplacement du gameObject au joystick
            m_initialPosition += new Vector3(0.0f,controller.JoystickY*0.01f,controller.JoystickX*0.01f);
            Debug.Log(new Vector3(0.0f,controller.JoystickY,controller.JoystickX));

            //Déplacement en profondeur du gameObject via RB RT
            if(controller.GetButton( SixenseButtons.BUMPER )){
               m_initialPosition += new Vector3(0.005f,0.0f,0.0f);
            }else if (controller.GetButton( SixenseButtons.TRIGGER )){
                m_initialPosition -= new Vector3(0.005f,0.0f,0.0f);
            }

            // Rotation suivant l'axe Y via les boutons 1 & 3
            if(controller.GetButton( SixenseButtons.ONE )){
                m_initialRotation.y += 0.005f;
            }else if (controller.GetButton( SixenseButtons.THREE )){
                m_initialRotation.y -= 0.005f;
            }

            // Rotation suivant l'axe Z via les boutons 2 & 4
            /*if(controller.GetButton( SixenseButtons.TWO )){
                m_initialRotation.z += 0.005f;
            }else if (controller.GetButton( SixenseButtons.FOUR )){
                m_initialRotation.z -= 0.005f;
            }*/

            // Modifie la sensibilité via les boutons 2 & 4
            if(controller.GetButton( SixenseButtons.TWO )){
                Sensitivity += new Vector3(0.00001f,0.00001f,0.00001f);
                    /*m_baseControllerPosition = new Vector3( -controller.Position.z * Sensitivity.x,
                                                      	 controller.Position.y * Sensitivity.y,
                                                      	 controller.Position.x * Sensitivity.z );*/
            }else if (controller.GetButton( SixenseButtons.FOUR )){
                if(Sensitivity.x > 0.0f){
                    Sensitivity -= new Vector3(0.00001f,0.00001f,0.00001f);
                    /*m_baseControllerPosition = new Vector3( -controller.Position.z * Sensitivity.x,
                                                       	controller.Position.y * Sensitivity.y,
                                                       	controller.Position.x * Sensitivity.z );*/
                }
            }

            UpdatePosition( controller );

            if (ActivateRotations){
                UpdateRotation( controller );
            }
        }
    }