/// <summary>Gets a displayable character as a surrogate pair from this font.</summary>
        /// <param name="lowCharacter">The low surrogate character to display.</param>
        /// <param name="highCharacter">The high surrogate character to display.</param>
        /// <param name="style">The style of the character.</param>
        /// <returns>The displayable character.</returns>
        public Glyph GetCharacter(int charcode, FontFaceFlags style)
        {
            // Is it e.g. emoji?
            Glyph result = CharacterProviders.Find(charcode);

            if (result != null)
            {
                // Character has been overriden.
                return(result);
            }

            if (Family != null)
            {
                result = Family.GetGlyph(charcode, style);
            }

            if (result == null)
            {
                if (Fallback != null)
                {
                    result = Fallback.GetCharacterDirect(charcode, style);
                }

                // Global fallback - last chance!
                if (result == null)
                {
                    if (DefaultFamily == null && !LoadInternalFont())
                    {
                        // Font not found!
                        return(null);
                    }

                    return(DefaultFamily.Family.GetGlyph(charcode, style));
                }
            }

            return(result);
        }
Example #2
0
    /// <summary>Used internally - don't call this one. Startup the UI for use in the Editor with AOT Nitro.</summary>
    /// <param name="nitroAot">True if no gameobject should be generated.</param>
    public static void Start(bool nitroAot)
    {
        if (_Started)
        {
            return;
        }

        _Started = true;

        // Setup atlas stacks:
        AtlasStacks.Start();

        // Hookup the wrench logging method:
        Dom.Log.OnLog += OnLogMessage;

        // Hookup the InfiniText logging method:
        InfiniText.Fonts.OnLog += OnLogMessage;

                #if !NoBIDI
        // Setup bidi character metadata:
        InfiniText.DirectionCategory.Setup();
                #endif

        // Setup the character entities such as &nbsp;
        CharacterEntities.Setup();

        // Start modules now! UI is always available so we use that:
        Modular.Start.Now(typeof(UI));

        // Setup language metadata:
        Languages.globalLoader.Setup();

        // Setup alert/confirm dialogues:
        BlockingDialogues.Setup();

        // Setup input:
        PowerUI.Input.Setup();

        // Setup the text/language service:
        if (Variables == null)
        {
            Variables = new FullVariableSet();

            if (!nitroAot)
            {
                // Sign up to the variable on change event - whenever a custom var is changed, we need to refresh the screen.
                Variables.OnChange += OnVariableChange;
                // Sign on to the event that occurs when the language changes.
                Dom.Text.OnLanguageChanged += OnLanguageChange;
                // Sign on to the event that occurs when the gender changes.
                Dom.Text.OnGenderChanged += ResolveAllVariables;
            }
        }

        // Setup the callback queue:
        Callbacks.Start();

        // Setup the character providers (for e.g. Emoji):
        CharacterProviders.Setup();

        Layer = LayerMask.NameToLayer("PowerUI");

                #if !NO_LAYER_CHECK
        if (Layer < 0)
        {
            // Invalid layer.
                        #if UNITY_EDITOR
            // Create the new layer now (this will actually be a permanent change):
            Layer = PowerUI.LayerManager.Add();
                        #else
            // On device - make one up:
            Layer = 21;
                        #endif
        }
                #endif

        // Default FPS:
        SetRate(DefaultRate);

                #if !NoNitroRuntime
        // Link up the text/javascript type by creating the engine:
        ScriptEngines.Add(new JavaScriptEngine());
                #endif

        if (nitroAot)
        {
            return;
        }

        GUINode = GameObject.Find("#PowerUI");

        if (GUINode == null)
        {
            // Not started yet.

            // Create the UI game object:
            GUINode      = new GameObject();
            GUINode.name = "#PowerUI";

            // Create the camera:
            CameraNode      = new GameObject();
            CameraNode.name = "Camera";

            // Create the updater:
            GlobalUpdater = GUINode.AddComponent <StandardUpdater>();

            // Setup the camera:
            GUICamera = CameraNode.AddComponent <Camera>();

            // Apply the new settings to the camera:
            GUICamera.orthographic = (CurrentCameraMode == CameraMode.Orthographic);
        }
        else
        {
            // Already started, but we might have updated.

            if (CameraNode == null)
            {
                // This can happen if the PowerUI assembly is actively reloaded (e.g. runtime updates).
                CameraNode      = GameObject.Find("#PowerUI/Camera");
                CameraTransform = CameraNode.transform;
                GUICamera       = CameraNode.GetComponent <Camera>();
            }
            else
            {
                // Already started!
                return;
            }
        }

        // Hide the PowerUI layer from all cameras other than GUICamera:
        Camera[] cameras = Camera.allCameras;

        int layerMask = ~(1 << UI.Layer);

        for (int i = 0; i < cameras.Length; i++)
        {
            // Grab the camera:
            Camera camera = cameras[i];

            // Is it the GUICamera?
            if (camera == GUICamera)
            {
                continue;
            }

            // Hide the UI layer from it:
            camera.cullingMask &= layerMask;
        }

        // Setup the transform:
        CameraTransform        = CameraNode.transform;
        CameraTransform.parent = GUINode.transform;

        GUICamera.nearClipPlane = 0.2f;
        GUICamera.depth         = CameraDepth;
        GUICamera.clearFlags    = CameraClearFlags.Depth;
        GUICamera.cullingMask   = (1 << UI.Layer);
        GUICamera.renderingPath = RenderingPath.Forward;

        SetCameraDistance(60f);
        SetFieldOfView(60f);

        Renderer = new Renderman();

        // Render Mesh.OutputGameObject with the GUI camera:
        Renderer.RenderWithCamera(UI.Layer);
        document            = Renderer.RootDocument as HtmlDocument;
        document.window.top = document.window;

        // Fire the camera event:
        CameraGotCreated(GUICamera);
    }
Example #3
0
    /// <summary>Used internally - don't call this one. Startup the UI for use in the Editor with AOT Nitro.</summary>
    /// <param name="nitroAot">True if no gameobject should be generated.</param>
    public static void Start(bool nitroAot)
    {
        if (!Started)
        {
            Started = true;

            // Setup atlas stacks:
            AtlasStacks.Start();

            // Hookup the wrench logging method:
            Wrench.Log.OnLog += OnLogMessage;

            // Hookup the InfiniText logging method:
            InfiniText.Fonts.OnLog += OnLogMessage;

            // Startup the tag handlers:
            Wrench.TagHandlers.Setup();

            // Startup the file protocols (internally also starts up the CSS engine):
            FileProtocols.Setup();

            // Setup the text/language service:
            if (Variables == null)
            {
                Variables = new FullVariableSet();

                if (!nitroAot)
                {
                    // Sign up to the variable on change event - whenever a custom var is changed, we need to refresh the screen.
                    Variables.OnChange += OnVariableChange;
                    // Ensure that variables is set to whatever the default/current language is.
                    OnLanguageChange(Wrench.Text.Language);
                    // Sign on to the event that occurs when the language changes.
                    Wrench.Text.OnLanguageChanged += OnLanguageChange;
                    // Sign on to the event that occurs when the gender changes.
                    Wrench.Text.OnGenderChanged += ResolveAllVariables;
                }
            }

            // Setup the callback queue:
            Callbacks.Start();

            // Setup the character providers (for e.g. Emoji):
            CharacterProviders.Setup();

            Layer = LayerMask.NameToLayer("PowerUI");

            if (Layer < 0)
            {
                // Invalid layer.
                                #if UNITY_EDITOR
                // Create the new layer now (this will actually be a permanent change):
                Layer = PowerUI.LayerManager.Add();
                                #else
                throw new Exception("Error: PowerUI layer not found. Go to Edit->Project Settings->Tags and add a layer called PowerUI to fix this." +
                                    " Don't forget to make sure it doesn't render with your main camera too!"
                                    );
                                #endif
            }

            // Default FPS:
            SetRate(DefaultRate);

                        #if !NoNitroRuntime
            // Setup the compiler:
            NitroCode.Setup();
                        #endif
        }

        if (nitroAot)
        {
            return;
        }

        GUINode = GameObject.Find("#PowerUI");

        if (GUINode == null)
        {
            // Not started yet.

            // Create the UI game object:
            GUINode      = new GameObject();
            GUINode.name = "#PowerUI";

            // Create the camera:
            CameraNode      = new GameObject();
            CameraNode.name = "Camera";

            // Create the updater:
            GlobalUpdater = GUINode.AddComponent <StandardUpdater>();

            // Setup the camera:
            GUICamera = CameraNode.AddComponent <Camera>();
        }
        else
        {
            // Already started, but we might have updated.

            if (CameraNode == null)
            {
                // This can happen if the PowerUI assembly is actively reloaded (e.g. runtime updates).
                CameraNode      = GameObject.Find("#PowerUI/Camera");
                CameraTransform = CameraNode.transform;
                GUICamera       = CameraNode.GetComponent <Camera>();
            }
            else
            {
                // Already started!
                return;
            }
        }

        // Hide the PowerUI layer from all cameras other than GUICamera:
        Camera[] cameras = Camera.allCameras;

        int layerMask = ~(1 << UI.Layer);

        for (int i = 0; i < cameras.Length; i++)
        {
            // Grab the camera:
            Camera camera = cameras[i];

            // Is it the GUICamera?
            if (camera == GUICamera)
            {
                continue;
            }

            // Hide the UI layer from it:
            camera.cullingMask &= layerMask;
        }

        // Setup the transform:
        CameraTransform        = CameraNode.transform;
        CameraTransform.parent = GUINode.transform;

        GUICamera.nearClipPlane = 0.2f;
        GUICamera.depth         = CameraDepth;
        GUICamera.clearFlags    = CameraClearFlags.Depth;
        GUICamera.cullingMask   = (1 << UI.Layer);
        GUICamera.renderingPath = RenderingPath.Forward;

        SetCameraDistance(60f);
        SetFieldOfView(60f);

        Renderer = new Renderman();

        // Render Mesh.OutputGameObject with the GUI camera:
        Renderer.RenderWithCamera(UI.Layer);
        document            = Renderer.RootDocument;
        document.window.top = document.window;

        // Some overriding default UI settings:
        document.html.Style.Computed.ChangeTagProperty("color", new PowerUI.Css.Value("#ffffff", PowerUI.Css.ValueType.Color));
        document.html.Style.Computed.ChangeTagProperty("font-size", new PowerUI.Css.Value("14px", PowerUI.Css.ValueType.Pixels));
        document.body.Style.Computed.ChangeTagProperty("overflow", new PowerUI.Css.Value("hidden hidden", PowerUI.Css.ValueType.Point));

        UpdateTextDirection();

        // Fire the camera event:
        CameraGotCreated(GUICamera);
    }