public static bool RebuildDynamicFonts()
    {
        var fontsRebuilt = false;

        rebuildList.Clear();

        var controls = dfControl.ActiveInstances;

        for (int i = 0; i < controls.Count; i++)
        {
            var label = controls[i] as IRendersText;
            if (label != null)
            {
                label.UpdateFontInfo();
            }
        }

        fontsRebuilt = rebuildList.Count > 0;

        for (int i = 0; i < rebuildList.Count; i++)
        {
            var dynamicFont = rebuildList[i] as dfDynamicFont;
            if (dynamicFont != null)
            {
                dynamicFont.FlushCharacterRequests();
            }
        }

        rebuildList.Clear();
        dirty.Clear();

        return(fontsRebuilt);
    }
Exemple #2
0
    public dfList <dfRenderData> RenderMultiple()
    {
        if (!this.isVisible || this.Font == null)
        {
            return(null);
        }

        var matrix = this.transform.localToWorldMatrix;

        if (!this.isControlInvalidated && viewportBox != null)
        {
            for (int i = 0; i < buffers.Count; i++)
            {
                buffers[i].Transform = matrix;
            }

            return(this.buffers);
        }

        try
        {
            // Clear the 'dirty' flag first, because some events (like font texture rebuild)
            // should be able to set the control to 'dirty' again.
            this.isControlInvalidated = false;

            // Parse the markup and perform document layout
            if (isMarkupInvalidated)
            {
                isMarkupInvalidated = false;
                processMarkup();
            }

            // Ensure that our viewport box has been properly resized to
            // fully encompass all nodes, because the resulting size of
            // the viewport box will be used to update scrollbars and
            // determine max scroll position.
            viewportBox.FitToContents();

            // Perform auto-sizing if indicated
            if (autoHeight)
            {
                this.Height = viewportBox.Height;
            }

            // Update scrollbars to match rendered height
            updateScrollbars();

            //@Profiler.BeginSample( "Gather markup render buffers" );
            buffers.Clear();
            gatherRenderBuffers(viewportBox, this.buffers);

            return(this.buffers);
        }
        finally
        {
            updateCollider();
        }
    }
    public void Release()
    {
        planes.Clear();

        if (!pool.Contains(this))
        {
            pool.Enqueue(this);
        }
    }
    public void Update()
    {
        lock ( tracking )
        {
            activeTouches.Clear();

            for (int i = 0; i < tracking.Count; i++)
            {
                activeTouches.Add(tracking[i]);
            }

            postProcessTouches();
        }
    }
Exemple #5
0
    /// <summary>
    /// Used to reset all lists in preparation for filling with new or
    /// updated rendering data. NOTE: While this function does appear
    /// to empty the data lists, it does not free the internal memory
    /// used to hold the information, with the assumption that this
    /// will glyphData in fewer garbage collections.
    /// </summary>
    public void Clear()
    {
        Material     = null;
        Shader       = null;
        Transform    = Matrix4x4.identity;
        Checksum     = 0x00;
        Intersection = dfIntersectionType.None;

        Vertices.Clear();
        UV.Clear();
        Triangles.Clear();
        Colors.Clear();
        Normals.Clear();
        Tangents.Clear();
    }
        public void Clear()
        {
            while (spawned.Count > 0)
            {
                pool.Enqueue(spawned.Dequeue());
            }

            for (int i = 0; i < pool.Count; i++)
            {
                var instance = pool[i];
                DestroyImmediate(instance);
            }

            pool.Clear();
        }
    public dfList <dfRenderData> RenderMultiple()
    {
        if (renderData == null)
        {
            renderData           = dfRenderData.Obtain();
            textRenderData       = dfRenderData.Obtain();
            isControlInvalidated = true;
        }

        var matrix = transform.localToWorldMatrix;

        if (!isControlInvalidated)
        {
            for (int i = 0; i < buffers.Count; i++)
            {
                buffers[i].Transform = matrix;
            }

            return(buffers);
        }

        isControlInvalidated = false;

        buffers.Clear();
        renderData.Clear();

        if (Atlas != null)
        {
            renderData.Material  = Atlas.Material;
            renderData.Transform = matrix;

            renderBackground();
            buffers.Add(renderData);
        }

        var textBuffer = renderText();

        if (textBuffer != null && textBuffer != renderData)
        {
            textBuffer.Transform = matrix;
            buffers.Add(textBuffer);
        }

        // Make sure that the collider size always matches the control
        updateCollider();

        return(buffers);
    }
Exemple #8
0
    private void resetRenderBuffers()
    {
        buffers.Clear();

        if (renderData != null)
        {
            renderData.Clear();
            renderData.Material  = Atlas.Material;
            renderData.Transform = this.transform.localToWorldMatrix;

            buffers.Add(renderData);
        }

        if (textRenderData != null)
        {
            textRenderData.Clear();
            textRenderData.Material  = Atlas.Material;
            textRenderData.Transform = this.transform.localToWorldMatrix;

            buffers.Add(textRenderData);
        }
    }
Exemple #9
0
    public dfList <dfRenderData> RenderMultiple()
    {
        if (Atlas == null || Font == null)
        {
            return(null);
        }

        if (!isVisible)
        {
            return(null);
        }

        // Initialize render buffers if needed
        if (renderData == null)
        {
            renderData     = dfRenderData.Obtain();
            textRenderData = dfRenderData.Obtain();

            isControlInvalidated = true;
        }

        // If control is not dirty, update the transforms on the
        // render buffers (in case control moved) and return
        // pre-rendered data
        if (!isControlInvalidated)
        {
            for (int i = 0; i < buffers.Count; i++)
            {
                buffers[i].Transform = transform.localToWorldMatrix;
            }
            return(buffers);
        }

        #region Prepare render buffers

        buffers.Clear();

        renderData.Clear();
        renderData.Material  = Atlas.Material;
        renderData.Transform = this.transform.localToWorldMatrix;
        buffers.Add(renderData);

        textRenderData.Clear();
        textRenderData.Material  = Atlas.Material;
        textRenderData.Transform = this.transform.localToWorldMatrix;
        buffers.Add(textRenderData);

        #endregion

        // Render background before anything else, since we're going to
        // want to keep track of where the background data ends and any
        // other data begins
        renderBackground();

        // Render text item
        renderText(textRenderData);

        // Control is no longer in need of rendering
        isControlInvalidated = false;

        // Make sure that the collider size always matches the control
        updateCollider();

        return(buffers);
    }
    public dfList <dfRenderData> RenderMultiple()
    {
        if (Atlas == null || Font == null)
        {
            return(null);
        }

        if (!isVisible)
        {
            return(null);
        }

        // Initialize render buffers if needed
        if (renderData == null)
        {
            renderData     = dfRenderData.Obtain();
            textRenderData = dfRenderData.Obtain();

            isControlInvalidated = true;
        }

        var matrix = this.transform.localToWorldMatrix;

        // If control is not dirty, update the transforms on the
        // render buffers (in case control moved) and return
        // pre-rendered data
        if (!isControlInvalidated)
        {
            for (int i = 0; i < buffers.Count; i++)
            {
                buffers[i].Transform = matrix;
            }
            return(buffers);
        }

        #region Prepare render buffers

        buffers.Clear();

        renderData.Clear();
        renderData.Material  = Atlas.Material;
        renderData.Transform = matrix;
        buffers.Add(renderData);

        textRenderData.Clear();
        textRenderData.Material  = Atlas.Material;
        textRenderData.Transform = matrix;
        buffers.Add(textRenderData);

        #endregion

        // Render background before anything else, since we're going to
        // want to keep track of where the background data ends and any
        // other data begins
        renderBackground();

        // We want to start clipping *after* the background is rendered, so
        // grab the current number of vertices before rendering other elements
        var spriteClipStart = renderData.Vertices.Count;

        // Render other sprites
        renderHover();
        renderSelection();

        // Render text items
        renderItems(textRenderData);

        // Perform clipping
        clipQuads(renderData, spriteClipStart);
        clipQuads(textRenderData, 0);

        // Control is no longer in need of rendering
        isControlInvalidated = false;

        // Make sure that the collider size always matches the control
        updateCollider();

        return(buffers);
    }
    public dfList <Plane> TestIntersection(Bounds bounds, out dfIntersectionType type)
    {
        if (planes == null || planes.Count == 0)
        {
            type = dfIntersectionType.Inside;
            return(null);
        }

        intersectedPlanes.Clear();

        var center  = bounds.center;
        var extents = bounds.extents;

        var intersecting = false;

        var planeCount = planes.Count;
        var rawPlanes  = planes.Items;

        for (int i = 0; i < planeCount; i++)
        {
            var plane       = rawPlanes[i];
            var planeNormal = plane.normal;
            var planeDist   = plane.distance;

            // Compute the projection interval radius of b onto L(t) = b.c + t * p.n
            float r =
                extents.x * Mathf.Abs(planeNormal.x) +
                extents.y * Mathf.Abs(planeNormal.y) +
                extents.z * Mathf.Abs(planeNormal.z);

            // Compute distance of box center from plane
            float distance = Vector3.Dot(planeNormal, center) + planeDist;

            // Intersection occurs when distance falls within [-r,+r] interval
            if (Mathf.Abs(distance) <= r)
            {
                intersecting = true;
                intersectedPlanes.Add(plane);
            }
            else
            {
                // If the control lies behind *any* of the planes, there
                // is no point in continuing with the rest of the test
                if (distance < -r)
                {
                    type = dfIntersectionType.None;
                    return(null);
                }
            }
        }

        if (intersecting)
        {
            type = dfIntersectionType.Intersecting;
            return(intersectedPlanes);
        }

        type = dfIntersectionType.Inside;

        return(null);
    }