/// <summary>
        /// Intialise une nouvelle interface de calque.
        /// </summary>
        public void Initialize(GameObject layerObj_, bool isReference_, bool isPermanent_, bool isMoveable_)
        {
            LayerObj_ = layerObj_;

            IsReference_ = isReference_;
            IsPermanent_ = isPermanent_;
            IsMoveable_  = isMoveable_;

            // Objets enfants
            var bodyLandscapeObjUIBL_ = BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>();

            bodyLandscapeObjUIBL_.DrawUI += Draw;
            bodyLandscapeObjUIBL_.ForceDraw();

            var layerNameObjT_ = LayerNameObj_.GetComponentInChildren <Text>();

            layerNameObjT_.text = $"Layer-{layerObj_.transform.GetSiblingIndex():D3}";

            SetupButton();

            if (isReference_)
            {
                if (ReferenceLayerObj_ != null)
                {
                    Remove(ReferenceLayerObj_);
                }

                ReferenceLayerObj_ = gameObject;
            }
        }
        /// <summary>
        /// Intialise un nouvel objet d'interface de maillage.
        /// </summary>
        /// <param name="meshWorkerObj_">Le travailleur du maillage.</param>
        /// <param name="layerWorkerObj_">Le travailleur de calques du maillage.</param>
        /// <param name="isReference_">Indique si l'objet est une référence.</param>
        public void Initialize(GameObject meshWorkerObj_, GameObject layerWorkerObj_, bool isReference_, bool isPermanent_, bool isMoveable_)
        {
            MeshWorkerObj_  = meshWorkerObj_;
            LayerWorkerObj_ = layerWorkerObj_;
            IsReference_    = isReference_;
            IsPermanent_    = isPermanent_;
            IsMoveable_     = isMoveable_;
            IsInitialized   = true;

            name = $"UIObject-{transform.GetSiblingIndex():D3}";
            ObjectNameObj_.GetComponent <Text>().text = $"Object-{transform.GetSiblingIndex():D3}";

            SetupButton();

            BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>().ForceDraw();

            if (isReference_)
            {
                if (ReferenceObjectObj_ != null)
                {
                    Remove(ReferenceObjectObj_);
                }

                ReferenceObjectObj_ = gameObject;

                var WorkerObjAFCW_ = WorkerObj_.GetComponent <AugmentedFaceCreatorWorker>();
                WorkerObjAFCW_.SetupLights(meshWorkerObj_);
            }

            var bodyLandscapeObjUIBL_ = BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>();

            bodyLandscapeObjUIBL_.DrawUI += Draw;
            bodyLandscapeObjUIBL_.ForceDraw();
        }
        /// <summary>
        /// Ajoute une interface de calque à partir d'une image.
        /// </summary>
        /// <param name="texture_">Texture du calque.</param>
        public void AddLayer(Texture2D texture_, bool isReference_, bool isPermanent_, bool isMoveable_)
        {
            var LayerWorkerObjAFCLW_ = LayerWorkerObj_.GetComponent <AugmentedFaceCreatorLayerWorker>();

            if (!LayerWorkerObjAFCLW_.CanAddLayer_)
            {
                return;
            }

            var layerCameraAFCC_ = AugmentedFaceCreatorWorker.LayerCameraPivotObj_.GetComponent <AugmentedFaceCreatorCamera>();

            var bodyLandscapeObjAFCBL_ = BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>();

            bodyLandscapeObjAFCBL_.Focus(MeshWorkerObj_, LayerWorkerObj_);

            var layerObj_ = LayerWorkerObjAFCLW_.AddLayer(layerSupportPrefab_, texture_);

            layerObj_.transform.localPosition = layerCameraAFCC_.Forward_ * ((layerObj_.transform.GetSiblingIndex() + 1) * LayerWorkerObjAFCLW_.LayerOffset_ + layerCameraAFCC_.ClippingPlane_.near_);

            if (isReference_)
            {
                layerObj_.layer = 8;
            }

            var uiLayerObj_ = Instantiate(uiLayerPrefab_, Vector3.zero, Quaternion.identity, UILayersContentObj_.transform);

            uiLayerObj_.name = $"UILayer-{uiLayerObj_.transform.GetSiblingIndex() - 1}";

            var uiLayerObjUIAFCL_ = uiLayerObj_.GetComponent <UIAugmentedFaceCreatorLayer>();

            uiLayerObjUIAFCL_.Initialize(layerObj_, isReference_, isPermanent_, isMoveable_);
        }
        /// <summary>
        /// Configure la gestion des boutons.
        /// </summary>
        private void SetupButton()
        {
            var bodyLandscapeObjAFCBL_ = BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>();
            var uiObjectObjUIAFCO_     = ObjectObj_.GetComponent <UIAugmentedFaceCreatorObject>();
            var uiObjectObjSR_         = uiObjectObjUIAFCO_.UILayersObj_.GetComponent <ScrollRect>();;
            var uit_ = GetComponent <UITouch>();
            var buttonRemoveLayerObjB_  = ButtonRemoveLayerObj_.GetComponent <Button>();
            var buttonHideLayerObjB_    = ButtonHideLayerObj_.GetComponent <Button>();
            var buttonMoveForwardObjB_  = ButtonMoveForwardObj_.GetComponent <Button>();
            var buttonMoveBackwardObjB_ = ButtonMoveBackwardObj_.GetComponent <Button>();

            uit_.BeginDrag += e_ =>
            {
                UISelection.NoSelect_ = true;
                uiObjectObjSR_.OnBeginDrag(e_);
            };

            uit_.Drag += e_ =>
            {
                uiObjectObjSR_.OnDrag(e_);
            };

            uit_.EndDrag += e_ =>
            {
                UISelection.NoSelect_ = false;
                uiObjectObjSR_.OnEndDrag(e_);
            };

            uit_.Click += (obj_, clickCount, touchCount) =>
            {
                UISelection.Select(obj_);
            };

            buttonRemoveLayerObjB_.onClick.AddListener(() =>
            {
                Remove();
            });

            buttonHideLayerObjB_.onClick.AddListener(() =>
            {
                ShowHide();
            });

            buttonMoveForwardObjB_.onClick.AddListener(() =>
            {
                MoveForwardLayer();
            });

            buttonMoveBackwardObjB_.onClick.AddListener(() =>
            {
                MoveBackwardLayer();
            });
        }
        /// <summary>
        /// Configure la gestion des boutons.
        /// </summary>
        private void SetupButton()
        {
            var bodyLandscapeUIAFCBL_ = BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>();
            var bodyLandscapeSR_      = bodyLandscapeUIAFCBL_.ScrollViewObjectsObj_.GetComponent <ScrollRect>();
            var uit_ = GetComponent <UITouch>();
            var i_   = GetComponent <Image>();
            var buttonRemoveObjectObjB_ = ButtonRemoveObjectObj_.GetComponent <Button>();
            var buttonHideObjectObjB_   = ButtonHideObjectObj_.GetComponent <Button>();
            var buttonAddLayerObjB_     = ButtonAddLayerObj_.GetComponent <Button>();

            uit_.BeginDrag += e_ =>
            {
                UISelection.NoSelect_ = true;
                bodyLandscapeSR_.OnBeginDrag(e_);
            };

            uit_.Drag += e_ =>
            {
                bodyLandscapeSR_.OnDrag(e_);
            };

            uit_.EndDrag += e_ =>
            {
                UISelection.NoSelect_ = false;
                bodyLandscapeSR_.OnEndDrag(e_);
            };

            uit_.Click += (obj_, clickCount, touchCount) =>
            {
                UISelection.Select(obj_);
            };

            buttonRemoveObjectObjB_.onClick.AddListener((UnityEngine.Events.UnityAction)(() =>
            {
                if (!IsPermanent_)
                {
                    Remove();
                }
            }));

            buttonHideObjectObjB_.onClick.AddListener(() =>
            {
                ShowHide();
            });

            buttonAddLayerObjB_.onClick.AddListener(() =>
            {
                AddLayer(texture_ => { });
            });
        }
        /// <summary>
        /// Dessine l'interface utilisateur.
        /// </summary>
        private void Draw(float scale_)
        {
            // Composants
            var bodyLandscapeObjUIBL_ = BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>();
            var rt_                      = GetComponent <RectTransform>();
            var nameObjRT_               = LayerNameObj_.GetComponent <RectTransform>();
            var nameObjT_                = LayerNameObj_.GetComponentInChildren <Text>();
            var buttonRemoveObjRT_       = ButtonRemoveLayerObj_.GetComponent <RectTransform>();
            var buttonHideObjRT_         = ButtonHideLayerObj_.GetComponent <RectTransform>();
            var buttonMoveForwardObjRT_  = ButtonMoveForwardObj_.GetComponent <RectTransform>();
            var buttonMoveBackwardObjRT_ = ButtonMoveBackwardObj_.GetComponent <RectTransform>();

            // Constantes
            if (scale_ > 0)
            {
                scaledTouchSurfaceSize_ = touchSurfaceSize_ * scale_;
                scaledMarginSize_       = marginSize_ * scale_;
                scaledBodyFontSize_     = Mathf.RoundToInt(bodyfontSize_ * scale_);
            }

            // Logiques
            var height_ = 0f;

            //// Nom du calque.
            var layerNameWidth_ = bodyLandscapeObjUIBL_.ScaledRightPanelWidth_ - scaledTouchSurfaceSize_.x * 2f - scaledMarginSize_ * 4f - bodyLandscapeObjUIBL_.ScaledMarginSize_ * 2f;

            nameObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, layerNameWidth_);
            nameObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            nameObjRT_.anchoredPosition = new Vector2(scaledMarginSize_, 0f);

            nameObjT_.fontSize = scaledBodyFontSize_;

            //// Bouton de suppresion
            buttonRemoveObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
            buttonRemoveObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            buttonRemoveObjRT_.anchoredPosition = new Vector2(0f, 0f);

            //// Bouton de masquage
            buttonHideObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
            buttonHideObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            buttonHideObjRT_.anchoredPosition = new Vector2(scaledTouchSurfaceSize_.x * -1f, 0f);

            //// Première ligne
            height_ += scaledTouchSurfaceSize_.y;

            //// Bouton de déplacement en avant
            buttonMoveForwardObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
            buttonMoveForwardObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            buttonMoveForwardObjRT_.anchoredPosition = new Vector2(0f, (scaledTouchSurfaceSize_.y + scaledMarginSize_) * -1f);

            //// Bouton de déplacement en arrière
            buttonMoveBackwardObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
            buttonMoveBackwardObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            buttonMoveBackwardObjRT_.anchoredPosition = new Vector2(scaledTouchSurfaceSize_.x + scaledMarginSize_, (scaledTouchSurfaceSize_.y + scaledMarginSize_) * -1f);

            //// Deuxième ligne
            height_ += scaledMarginSize_ + scaledTouchSurfaceSize_.y;

            //// Ce panneau
            rt_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, bodyLandscapeObjUIBL_.ScaledRightPanelWidth_ - bodyLandscapeObjUIBL_.ScaledMarginSize_ * 2f - scaledMarginSize_ * 2f);
            rt_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height_);
        }
        /// <summary>
        /// Dessine l'interface utilisateur.
        /// </summary>
        private void Draw(float scale_)
        {
            // Composants
            var bodyLandscapeObjUIBL_ = BodyLandscapeObj_.GetComponent <UIAugmentedFaceCreatorBodyLandscape>();
            var rt_ = GetComponent <RectTransform>();
            var objectNameObjRT_                 = ObjectNameObj_.GetComponent <RectTransform>();
            var objectNameObjT_                  = ObjectNameObj_.GetComponentInChildren <Text>();
            var removeObjectObjRT_               = ButtonRemoveObjectObj_.GetComponent <RectTransform>();
            var hideObjectObjRT_                 = ButtonHideObjectObj_.GetComponent <RectTransform>();
            var addLayerObjRT_                   = ButtonAddLayerObj_.GetComponent <RectTransform>();
            var dropdownAnchorObjRT_             = DropdownAnchorObj_.GetComponent <RectTransform>();
            var dropdownAnchorObjD_              = DropdownAnchorObj_.GetComponent <Dropdown>();
            var dropdownAnchorLabelObjT_         = DropdownAnchorObj_.transform.Find("Label").GetComponent <Text>();
            var dropdownAnchorArrowObjRT_        = DropdownAnchorObj_.transform.Find("Arrow").GetComponent <RectTransform>();
            var dropdownAnchorTemplateItemObjRT_ = DropdownAnchorObj_.transform.Find("Template").Find("Viewport").Find("Content").Find("Item").GetComponent <RectTransform>();
            var dropdownAnchorTemplateLabelObjT_ = DropdownAnchorObj_.transform.Find("Template").Find("Viewport").Find("Content").Find("Item").Find("Item Label").GetComponent <Text>();
            var layersObjRT_         = UILayersObj_.GetComponent <RectTransform>();
            var layersContentObjVLG_ = UILayersContentObj_.GetComponent <VerticalLayoutGroup>();

            // Constantes
            if (scale_ > 0)
            {
                scaledTouchSurfaceSize_ = touchSurfaceSize_ * scale_;
                scaledMarginSize_       = marginSize_ * scale_;
                scaledBodyFontSize_     = Mathf.RoundToInt(bodyfontSize_ * scale_);
            }

            // Logiques
            var height_ = 0f;

            //// Nom de l'objet
            var objectNameObjWidth_ = bodyLandscapeObjUIBL_.ScaledRightPanelWidth_ - scaledTouchSurfaceSize_.x * 2f - scaledMarginSize_ * 3f - bodyLandscapeObjUIBL_.ScaledMarginSize_ * 2f;

            objectNameObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, objectNameObjWidth_);
            objectNameObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            objectNameObjRT_.anchoredPosition = new Vector2(scaledMarginSize_, scaledMarginSize_ * -1f);

            objectNameObjT_.fontSize = scaledBodyFontSize_;

            //// Bouton de suppresion
            removeObjectObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
            removeObjectObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            removeObjectObjRT_.anchoredPosition = new Vector2(scaledMarginSize_ * -1, scaledMarginSize_ * -1f);

            //// Bouton de masquage
            hideObjectObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
            hideObjectObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            hideObjectObjRT_.anchoredPosition = new Vector2((scaledTouchSurfaceSize_.x + scaledMarginSize_) * -1, scaledMarginSize_ * -1f);

            //// Première ligne
            height_ += Mathf.Abs(scaledMarginSize_ + scaledTouchSurfaceSize_.y);

            //// Bouton d'ajout de calques
            var secondLineOffset_ = (scaledTouchSurfaceSize_.y + scaledMarginSize_ * 2f) * -1f;

            addLayerObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
            addLayerObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
            addLayerObjRT_.anchoredPosition = new Vector2(scaledMarginSize_, secondLineOffset_);

            //// Dropdown des ancres

            if (!IsReference_ && ReferenceObjectObj_ != null)
            {
                dropdownAnchorObjRT_.offsetMin = new Vector2(scaledTouchSurfaceSize_.x + scaledMarginSize_ * 2f, 0f);
                dropdownAnchorObjRT_.offsetMax = new Vector2(scaledMarginSize_ * -1f, secondLineOffset_);
                dropdownAnchorObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);

                dropdownAnchorLabelObjT_.fontSize = scaledBodyFontSize_;

                dropdownAnchorArrowObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scaledTouchSurfaceSize_.x);
                dropdownAnchorArrowObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);
                dropdownAnchorArrowObjRT_.anchoredPosition = Vector2.zero;

                dropdownAnchorTemplateItemObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y);

                dropdownAnchorTemplateLabelObjT_.fontSize = scaledBodyFontSize_;

                var anchorsNames_ = ReferenceObjectObj_?.GetComponent <UIAugmentedFaceCreatorObject>()?.MeshWorkerObj_?.GetComponent <AugmentedFaceCreatorMeshWorker>()?.GetAnchorNames_();

                if (anchorsNames_ != null)
                {
                    dropdownAnchorObjD_.ClearOptions();
                    dropdownAnchorObjD_.AddOptions(anchorsNames_);
                }

                dropdownAnchorObjD_.onValueChanged.AddListener(value_ =>
                {
                    AnchorIndex_ = value_;
                });
            }

            DropdownAnchorObj_.SetActive(!IsReference_);

            //// Deuxième ligne
            height_ += Mathf.Abs(scaledMarginSize_ + scaledTouchSurfaceSize_.y);

            //// Liste des calques
            var layersObjOffset_ = (scaledTouchSurfaceSize_.y * 2f + scaledMarginSize_ * 3f) * -1f;

            layersObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, bodyLandscapeObjUIBL_.ScaledRightPanelWidth_ - bodyLandscapeObjUIBL_.ScaledMarginSize_ * 2f - scaledMarginSize_ * 2f);
            layersObjRT_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scaledTouchSurfaceSize_.y * 2f + scaledMarginSize_ * 1f);
            layersObjRT_.anchoredPosition = new Vector2(scaledMarginSize_, layersObjOffset_);
            layersContentObjVLG_.spacing  = scaledMarginSize_;

            //// Troisième ligne
            height_ += Mathf.Abs(scaledMarginSize_ + scaledTouchSurfaceSize_.y * 2f + scaledMarginSize_ * 1f);

            //// Quatrième ligne (marge)
            height_ += Mathf.Abs(scaledMarginSize_);

            //// Ce panneau
            rt_.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, bodyLandscapeObjUIBL_.ScaledRightPanelWidth_ - bodyLandscapeObjUIBL_.ScaledMarginSize_ * 2f);
            rt_.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height_);
        }