private void UpdateDefaultCopyrights()

in SupportingScripts/Runtime/Scripts/MapRenderer/Copyrights/MapCopyrightLayer.cs [97:174]


        private void UpdateDefaultCopyrights(object sender, EventArgs args)
        {
            const int fontSize = 46;
            const float targetLocalSize = 0.175f;
            const float targetLocalScale = targetLocalSize / fontSize;
            var localYOffset = new Vector3(0, MapRenderer.LocalMapBaseHeight - 2 * targetLocalScale, 0);

            // Load the default font, if it hasn't already been loaded.
            if (_font == null)
            {
                _font = Resources.GetBuiltinResource<Font>("Arial.ttf");
                Debug.Assert(_font != null);
            }

            // Create the copyright game objects if they haven't already been created.
            EnsureCopyrightGameObjectSetup(ref _copyrightText1, "DefaultCopyright1", fontSize);
            EnsureCopyrightGameObjectSetup(ref _copyrightText2, "DefaultCopyright2", fontSize);

            // Sync the configurable properties.
            {
                var mapRendererGameObject = MapRenderer.gameObject;
                _copyrightText1.gameObject.layer = mapRendererGameObject.layer;
                _copyrightText1.text = MapRenderer.Copyright;
                _copyrightText1.color = _textColor;
                _copyrightText2.gameObject.layer = mapRendererGameObject.layer;
                _copyrightText2.text = MapRenderer.Copyright;
                _copyrightText2.color = _textColor;
            }

            // Update positions.
            {
                // First, determine which two sides of the map that we can see.
                var mainCamera = Camera.main;
                var cameraPosition = mainCamera == null ? Vector3.zero : mainCamera.transform.position;
                var thisTransform = transform;
                var cameraToPosition = thisTransform.position - cameraPosition;
                var transformForward = thisTransform.forward;
                var normal1Sign = Vector3.Dot(cameraToPosition, transformForward) > 0 ? -1.0f : 1.0f;
                var normal2Sign = Vector3.Dot(cameraToPosition, transform.right) > 0 ? -1.0f : 1.0f;
                var forward = transformForward * normal1Sign;
                var localForward = Vector3.forward * normal1Sign;
                var right = thisTransform.right * normal2Sign;
                var localRight = Vector3.right * normal2Sign;

                // Position the text meshes.
                UpdateTextPositionAndAlignment(
                    _copyrightText1,
                    MapRenderer.LocalMapDimension.y,
                    MapRenderer.LocalMapDimension.x,
                    new Vector3(Margin, 0, 0),
                    localForward,
                    localYOffset,
                    targetLocalScale);
                
                UpdateTextPositionAndAlignment(
                    _copyrightText2,
                    MapRenderer.LocalMapDimension.x,
                    MapRenderer.LocalMapDimension.y,
                    new Vector3(0, 0, Margin),
                    localRight,
                    localYOffset,
                    targetLocalScale);

                // Align the text meshes correctly.
                _copyrightText1.transform.rotation = Quaternion.LookRotation(-forward, transform.up);
                _copyrightText2.transform.rotation = Quaternion.LookRotation(-right, transform.up);
                
                // Enable / Disable the text depending on if the camera can see them.
                var cameraToText1Position = _copyrightText1.transform.position - cameraPosition;
                var cameraToText2Position = _copyrightText2.transform.position - cameraPosition;

                var isText1VisibleToCamera = Vector3.Dot(cameraToText1Position, -_copyrightText1.transform.forward) <= 0;
                var isText2VisibleToCamera = Vector3.Dot(cameraToText2Position, -_copyrightText2.transform.forward) <= 0;

                _copyrightText1.gameObject.SetActive(isText1VisibleToCamera);
                _copyrightText2.gameObject.SetActive(isText2VisibleToCamera);
            }
        }