Пример #1
0
    private int SortingOrderGenerate(SVGSpriteAssetFile spriteAsset)
    {
        if (spriteAsset != null)
        {
            SVGSpriteRef  spriteRef  = spriteAsset.SpriteRef;
            SVGSpriteData spriteData = spriteAsset.SpriteData;

            int svgIndex = this.SvgAssetIndexGet(spriteRef.TxtAsset);
            if (svgIndex >= 0)
            {
                SVGSpritesList spritesList;
                SVGAssetInput  svgAsset = this.m_SvgList[svgIndex];

                // if needed, advance in the instances group
                if (spriteData.InCurrentInstancesGroup)
                {
                    // get the list of sprites (references) relative to the SVG input asset
                    if (this.m_GeneratedSpritesLists.TryGetValue(svgAsset.TxtAsset.GetInstanceID(), out spritesList))
                    {
                        // advance instances group, telling that we are going to instantiate one sprite only
                        this.NextInstancesGroup(svgAsset, spritesList, 1);
                    }
                }
                return(SVGAtlas.SortingOrderCalc(svgIndex, svgAsset.InstanceBaseIdx, spriteData.ZOrder));
            }
        }
        return(-1);
    }
 private void OnSpriteSelect(SVGSpriteAssetFile spriteAsset)
 {
     if (!this.m_EditedLoader.SpriteReference.Equals(spriteAsset.SpriteRef))
     {
         // set the selected sprite (reference)
         this.m_EditedLoader.SpriteReference.TxtAsset = spriteAsset.SpriteRef.TxtAsset;
         this.m_EditedLoader.SpriteReference.ElemIdx  = spriteAsset.SpriteRef.ElemIdx;
         // set the selected sprite into the Image component
         Image uiImage = this.m_EditedLoader.GetComponent <Image>();
         if (uiImage != null)
         {
             RectTransform rectTransform = uiImage.gameObject.GetComponent <RectTransform>();
             Sprite        sprite        = spriteAsset.SpriteData.Sprite;
             uiImage.sprite = sprite;
             // Unity editor won't display immediately the new sprite if it has the same dimensions of the previous one
             // so in order to refresh the game view, we set a temporary value and restore the previous one (or a new one)
             if ((rectTransform.anchorMin == Vector2.zero) && (rectTransform.anchorMax == Vector2.one))
             {
                 Vector2 tmp = rectTransform.sizeDelta;
                 rectTransform.sizeDelta = tmp + Vector2.one;
                 rectTransform.sizeDelta = tmp;
             }
             else
             {
                 rectTransform.sizeDelta = Vector2.zero;
                 rectTransform.sizeDelta = new Vector2(sprite.rect.width, sprite.rect.height);
             }
         }
     }
 }
    // border editing callback
    private void OnSpriteEdited(PivotEditingResult result, SVGSpriteAssetFile spriteAsset, Vector2 editedPivot, Vector4 editedBorder)
    {
        SVGCanvasBehaviour svgCanvas = target as SVGCanvasBehaviour;

        if ((svgCanvas != null) && (result == PivotEditingResult.Ok))
        {
            SVGUIAtlas uiAtlas = svgCanvas.UIAtlas;
            if (uiAtlas != null)
            {
                // assign the new border
                uiAtlas.UpdateBorder(spriteAsset, editedBorder);
                SVGUtils.MarkObjectDirty(uiAtlas);
                SVGUtils.MarkSceneDirty();

                // get the list of instantiated SVG sprites that reference the edited one
                List <GameObject> spritesInstances = new List <GameObject>();
                uiAtlas.GetSpritesInstances(spritesInstances, spriteAsset.SpriteRef);
                foreach (GameObject gameObj in spritesInstances)
                {
                    Image uiImage = (Image)gameObj.GetComponent <Image>();
                    if (uiImage != null)
                    {
                        // the Image component won't recognize the change of sprite border, so in order to refresh
                        // instantiated objects we have to unset-set the sprite property
                        uiImage.sprite = null;
                        uiImage.sprite = spriteAsset.SpriteData.Sprite;
                    }
                }
            }
        }
    }
    private void SpritePreview(SVGUIAtlas uiAtlas, Canvas canvas, SVGSpriteAssetFile spriteAsset)
    {
        SVGUIWidgetType widgetType;
        Sprite          sprite     = spriteAsset.SpriteData.Sprite;
        Texture2D       texture    = sprite.texture;
        Rect            spriteRect = sprite.textureRect;
        Rect            uv         = new Rect(spriteRect.x / texture.width, spriteRect.y / texture.height, spriteRect.width / texture.width, spriteRect.height / texture.height);

        GUILayoutOption[] spriteTextureOptions = new GUILayoutOption[2] {
            GUILayout.Width(uiAtlas.SpritesPreviewSize), GUILayout.Height(uiAtlas.SpritesPreviewSize)
        };

        EditorGUILayout.BeginHorizontal(GUILayout.MinHeight(uiAtlas.SpritesPreviewSize + 5));
        {
            EditorGUILayout.LabelField(sprite.name, GUILayout.MinWidth(10));
            // reserve space for drawing sprite
            EditorGUILayout.LabelField("", spriteTextureOptions);
            Rect  guiRect       = GUILayoutUtility.GetLastRect();
            float maxSpriteDim  = Math.Max(spriteRect.width, spriteRect.height);
            float previewWidth  = (spriteRect.width / maxSpriteDim) * uiAtlas.SpritesPreviewSize;
            float previewHeight = (spriteRect.height / maxSpriteDim) * uiAtlas.SpritesPreviewSize;
            float previewX      = (uiAtlas.SpritesPreviewSize - previewWidth) / 2;
            float previewY      = 0;
            Rect  previewRect   = new Rect(guiRect.xMin + previewX, guiRect.yMin + previewY, previewWidth, previewHeight);
            GUI.DrawTextureWithTexCoords(previewRect, texture, uv, true);
            EditorGUILayout.Space();
            // sprite dimensions
            EditorGUILayout.LabelField("[" + spriteRect.width + " x " + spriteRect.height + "]", GUILayout.MaxWidth(120));

            if (GUILayout.Button("Edit", EditorStyles.miniButton))
            {
                // show pivot editor
                SVGPivotEditor.Show(spriteAsset, this.OnSpriteEdited);
            }

            widgetType = (SVGUIWidgetType)EditorGUILayout.EnumPopup("", spriteAsset.InstantiatedWidgetType, new GUILayoutOption[] { GUILayout.Width(80) });

            // instantiate
            if (GUILayout.Button("Instantiate", EditorStyles.miniButton))
            {
                GameObject gameObj = uiAtlas.InstantiateWidget(canvas, spriteAsset.SpriteRef, widgetType);
                // set the created instance as selected
                if (gameObj != null)
                {
                    Selection.objects = new UnityEngine.Object[1] {
                        gameObj as UnityEngine.Object
                    };
                }
            }

            EditorGUILayout.Space();
        }
        EditorGUILayout.EndHorizontal();

        if (widgetType != spriteAsset.InstantiatedWidgetType)
        {
            spriteAsset.InstantiatedWidgetType = widgetType;
        }
    }
Пример #5
0
    private GameObject InstantiateSprite(SVGSpriteAssetFile spriteAsset, Vector3 worldPos, int sortingOrder)
    {
        GameObject gameObj = this.Instantiate(spriteAsset, sortingOrder);

        // assign world position
        gameObj.transform.position = worldPos;
        return(gameObj);
    }
    protected void DeleteSprites()
    {
        foreach (KeyValuePair <SVGSpriteRef, SVGSpriteAssetFile> file in this.m_GeneratedSpritesFiles)
        {
            SVGSpriteAssetFile spriteAsset = file.Value;
            AssetDatabase.DeleteAsset(spriteAsset.Path);
        }

        this.m_GeneratedSpritesFiles.Clear();
    }
    private void SpritePreview(SVGAtlas atlas, SVGSpriteAssetFile spriteAsset)
    {
        Sprite    sprite     = spriteAsset.SpriteData.Sprite;
        Texture2D texture    = sprite.texture;
        Rect      spriteRect = sprite.textureRect;
        Rect      uv         = new Rect(spriteRect.x / texture.width, spriteRect.y / texture.height, spriteRect.width / texture.width, spriteRect.height / texture.height);

        GUILayoutOption[] spriteTextureOptions = new GUILayoutOption[2] {
            GUILayout.Width(atlas.SpritesPreviewSize), GUILayout.Height(atlas.SpritesPreviewSize)
        };

        EditorGUILayout.BeginHorizontal(GUILayout.MinHeight(atlas.SpritesPreviewSize + 5));
        {
            EditorGUILayout.LabelField(sprite.name, GUILayout.MinWidth(10));
            // reserve space for drawing sprite
            EditorGUILayout.LabelField("", spriteTextureOptions);
            Rect  guiRect       = GUILayoutUtility.GetLastRect();
            float maxSpriteDim  = Math.Max(spriteRect.width, spriteRect.height);
            float previewWidth  = (spriteRect.width / maxSpriteDim) * atlas.SpritesPreviewSize;
            float previewHeight = (spriteRect.height / maxSpriteDim) * atlas.SpritesPreviewSize;
            float previewX      = (atlas.SpritesPreviewSize - previewWidth) / 2;
            //float previewY = (SVGAtlasEditor.SPRITE_PREVIEW_DIMENSION - previewHeight) / 2;
            //float previewY = (previewWidth > previewHeight) ? 0 : ((SVGAtlasEditor.SPRITE_PREVIEW_DIMENSION - previewHeight) / 2);
            float previewY    = 0;
            Rect  previewRect = new Rect(guiRect.xMin + previewX, guiRect.yMin + previewY, previewWidth, previewHeight);
            GUI.DrawTextureWithTexCoords(previewRect, texture, uv, true);
            EditorGUILayout.Space();
            // sprite dimensions
            EditorGUILayout.LabelField("[" + spriteRect.width + " x " + spriteRect.height + "]", GUILayout.MaxWidth(100));
            EditorGUILayout.Space();
            // current pivot
            EditorGUILayout.LabelField("Pivot [" + string.Format("{0:0.00}", spriteAsset.SpriteData.Pivot.x) + " , " + string.Format("{0:0.00}", spriteAsset.SpriteData.Pivot.y) + "]", GUILayout.Width(120));
            EditorGUILayout.Space();
            // edit pivot
            if (GUILayout.Button("Edit", EditorStyles.miniButton))
            {
                // show pivot editor
                SVGPivotEditor.Show(spriteAsset, this.OnPivotEdited);
            }
            // instantiate
            if (GUILayout.Button("Instantiate", EditorStyles.miniButton, GUILayout.Width(80)))
            {
                GameObject gameObj = atlas.InstantiateSprite(spriteAsset.SpriteRef);
                // set the created instance as selected
                if (gameObj != null)
                {
                    Selection.objects = new UnityEngine.Object[1] {
                        gameObj as UnityEngine.Object
                    };
                }
            }
            EditorGUILayout.Space();
        }
        EditorGUILayout.EndHorizontal();
    }
    // pivot editing callback
    private void OnPivotEdited(PivotEditingResult result, SVGSpriteAssetFile spriteAsset, Vector2 editedPivot, Vector4 editedBorder)
    {
        SVGAtlas atlas = target as SVGAtlas;

        if ((atlas != null) && (result == PivotEditingResult.Ok))
        {
            // assign the new pivot
            atlas.UpdatePivot(spriteAsset, editedPivot);
            SVGUtils.MarkObjectDirty(atlas);
        }
    }
Пример #9
0
    // show the sprite selector
    static public void Show(SVGSpriteAssetFile spriteAsset, OnPivotEditedCallback callback)
    {
        // close the current selector instance, if any
        SVGPivotEditor.CloseAll();

        if (spriteAsset != null)
        {
            SVGPivotEditor pivotEditor = SVGPivotEditor.CreateInstance <SVGPivotEditor>();
            SVGPivotEditor.Init(pivotEditor, spriteAsset, spriteAsset.SpriteData.Pivot, spriteAsset.SpriteData.Border, callback);
            pivotEditor.ShowEditor();
        }
    }
Пример #10
0
    private static void Init(SVGPivotEditor editor, SVGSpriteAssetFile spriteAsset, Vector2 pivot, Vector4 border, OnPivotEditedCallback callback)
    {
        float v;
        Rect  spriteRect = spriteAsset.SpriteData.Sprite.rect;
        float minDim     = Math.Min(spriteRect.width, spriteRect.height);

        // keep track of the sprite and the input/output pivot
        editor.m_SpriteAsset = spriteAsset;
        editor.m_Pivot.Set(pivot.x, pivot.y);
        editor.m_Border              = border;
        editor.m_SpritePreviewWidth  = spriteRect.width;
        editor.m_SpritePreviewHeight = spriteRect.height;
        // adapt window dimension
        if (minDim < SVGPivotEditor.SPRITE_PREVIEW_MIN_DIMENSION)
        {
            float scl = SVGPivotEditor.SPRITE_PREVIEW_MIN_DIMENSION / minDim;
            editor.m_SpritePreviewWidth  *= scl;
            editor.m_SpritePreviewHeight *= scl;
        }
        // we must not exceed screen resolution (width)
        v = Screen.currentResolution.width * 0.9f;
        if (editor.m_SpritePreviewWidth > v)
        {
            float scl = v / editor.m_SpritePreviewWidth;
            editor.m_SpritePreviewWidth  *= scl;
            editor.m_SpritePreviewHeight *= scl;
        }
        v = Screen.currentResolution.height * 0.9f;
        if (editor.m_SpritePreviewHeight > v)
        {
            float scl = v / editor.m_SpritePreviewHeight;
            editor.m_SpritePreviewWidth  *= scl;
            editor.m_SpritePreviewHeight *= scl;
        }

        editor.m_SpritePreviewWidth  = Mathf.Round(editor.m_SpritePreviewWidth);
        editor.m_SpritePreviewHeight = Mathf.Round(editor.m_SpritePreviewHeight);
        editor.m_WindowWidth         = editor.m_SpritePreviewWidth;
        // we must ensure that pivot and border controls are already visible
        if (editor.m_WindowWidth < 190)
        {
            editor.m_WindowWidth = 190;
        }
        editor.m_WindowHeight = editor.m_SpritePreviewHeight + SVGPivotEditor.BUTTONS_HEIGHT + (SVGPivotEditor.EDIT_FIELDS_HEIGHT * 3);
        // set title
        editor.titleContent = new GUIContent("Sprite editor");
        // set callback
        editor.m_Callback = callback;
    }
Пример #11
0
 private void OnSpriteSelect(SVGSpriteAssetFile spriteAsset)
 {
     if (this.m_EditedLoader.SpriteReference.TxtAsset != spriteAsset.SpriteRef.TxtAsset ||
         this.m_EditedLoader.SpriteReference.ElemIdx != spriteAsset.SpriteRef.ElemIdx)
     {
         // set the selected sprite (reference)
         this.m_EditedLoader.SpriteReference.TxtAsset = spriteAsset.SpriteRef.TxtAsset;
         this.m_EditedLoader.SpriteReference.ElemIdx  = spriteAsset.SpriteRef.ElemIdx;
         // set the selected sprite into the renderer
         SpriteRenderer renderer = this.m_EditedLoader.GetComponent <SpriteRenderer>();
         if (renderer != null)
         {
             renderer.sprite = spriteAsset.SpriteData.Sprite;
         }
     }
 }
Пример #12
0
    public void UpdateBorder(SVGSpriteAssetFile spriteAsset, Vector4 newBorder)
    {
        SVGSpriteData spriteData = spriteAsset.SpriteData;
        Sprite        oldSprite  = spriteData.Sprite;
        // create a new sprite (same texture, same rectangle, same pivot, different border)
        Sprite newSprite = Sprite.Create(oldSprite.texture, oldSprite.rect, spriteData.Pivot, SVGBasicAtlas.SPRITE_PIXELS_PER_UNIT, 0, SpriteMeshType.FullRect, newBorder);

        spriteData.Border = newBorder;
        newSprite.name    = oldSprite.name;
        // serialized copy from the new sprite (i.e. the sprite with updated border) to the old sprite (i.e. the sprite to be updated)
        // NB: we use this technique because there isn't an explicit sprite method that allows the change of border property
        EditorUtility.CopySerialized(newSprite, oldSprite);
        SVGUtils.MarkObjectDirty(oldSprite);
        // destroy the temporary sprite
        GameObject.DestroyImmediate(newSprite);
    }
Пример #13
0
    private GameObject Instantiate(SVGSpriteAssetFile spriteAsset, int sortingOrder)
    {
        SVGSpriteRef             spriteRef    = spriteAsset.SpriteRef;
        SVGSpriteData            spriteData   = spriteAsset.SpriteData;
        GameObject               gameObj      = new GameObject();
        SpriteRenderer           renderer     = (SpriteRenderer)gameObj.AddComponent <SpriteRenderer>();
        SVGSpriteLoaderBehaviour spriteLoader = (SVGSpriteLoaderBehaviour)gameObj.AddComponent <SVGSpriteLoaderBehaviour>();

        renderer.sprite              = spriteData.Sprite;
        renderer.sortingOrder        = sortingOrder;
        spriteLoader.Atlas           = this;
        spriteLoader.SpriteReference = spriteRef;
        spriteLoader.ResizeOnStart   = true;
        gameObj.name = spriteData.Sprite.name;
        spriteData.InCurrentInstancesGroup = true;
        return(gameObj);
    }
Пример #14
0
    private void DrawInspector()
    {
        bool resizeOnStart   = EditorGUILayout.Toggle("Resize on Start()", this.m_EditedLoader.ResizeOnStart);
        bool updateTransform = EditorGUILayout.Toggle("Update transform", this.m_EditedLoader.UpdateTransform);

        string atlasName = (this.m_EditedLoader.Atlas != null) ? this.m_EditedLoader.Atlas.name : "<select>";

        EditorGUILayout.BeginHorizontal();
        {
            EditorGUILayout.PrefixLabel("Atlas");
            if (GUILayout.Button(atlasName, "DropDown"))
            {
                SVGAtlasSelector.Show("", this.OnAtlasSelect);
            }
        }
        EditorGUILayout.EndHorizontal();

        if (this.m_EditedLoader.Atlas != null && this.m_EditedLoader.SpriteReference != null)
        {
            SVGSpriteAssetFile spriteAsset = this.m_EditedLoader.Atlas.GetGeneratedSprite(this.m_EditedLoader.SpriteReference);
            string             buttonText  = (spriteAsset != null) ? spriteAsset.SpriteData.Sprite.name : "<select>";

            EditorGUILayout.BeginHorizontal();
            {
                EditorGUILayout.PrefixLabel("Sprite");
                if (GUILayout.Button(buttonText, "DropDown"))
                {
                    SVGSpriteSelector.Show(this.m_EditedLoader.Atlas, "", this.OnSpriteSelect);
                }
            }
            EditorGUILayout.EndHorizontal();
        }

        if (this.m_EditedLoader.ResizeOnStart != resizeOnStart)
        {
            this.m_EditedLoader.ResizeOnStart = resizeOnStart;
            SVGUtils.MarkObjectDirty(this.m_EditedLoader);
        }

        if (this.m_EditedLoader.UpdateTransform != updateTransform)
        {
            this.m_EditedLoader.UpdateTransform = updateTransform;
            SVGUtils.MarkObjectDirty(this.m_EditedLoader);
        }
    }
    // Given a text asset representing an SVG file, return the list of generated sprites relative to that document
    public List <SVGSpriteAssetFile> GetGeneratedSpritesByDocument(TextAsset txtAsset)
    {
        if (txtAsset == null)
        {
            return(null);
        }

        // create the output list
        List <SVGSpriteAssetFile> result = new List <SVGSpriteAssetFile>();

        foreach (KeyValuePair <SVGSpriteRef, SVGSpriteAssetFile> file in this.m_GeneratedSpritesFiles)
        {
            SVGSpriteAssetFile spriteAsset = file.Value;
            if (spriteAsset.SpriteRef.TxtAsset == txtAsset)
            {
                result.Add(spriteAsset);
            }
        }

        return(result);
    }
    private void DrawInspector()
    {
        bool resizeOnStart;

        EditorGUILayout.BeginHorizontal();
        {
            EditorGUILayout.PrefixLabel("Resize on Start()");
            resizeOnStart = EditorGUILayout.Toggle(this.m_EditedLoader.ResizeOnStart);
        }
        EditorGUILayout.EndHorizontal();

        SVGUIAtlas uiAtlas = this.m_EditedLoader.UIAtlas;

        if ((uiAtlas != null) && (this.m_EditedLoader.SpriteReference != null))
        {
            SVGSpriteAssetFile spriteAsset = uiAtlas.GetGeneratedSprite(this.m_EditedLoader.SpriteReference);
            string             buttonText  = (spriteAsset != null) ? spriteAsset.SpriteData.Sprite.name : "<select>";

            EditorGUILayout.BeginHorizontal();
            {
                EditorGUILayout.PrefixLabel("Sprite");
                if (GUILayout.Button(buttonText, "DropDown"))
                {
                    SVGSpriteSelector.Show(uiAtlas, "", this.OnSpriteSelect);
                }
                if (GUILayout.Button("Edit", GUILayout.Width(80)))
                {
                    // show pivot editor
                    SVGPivotEditor.Show(spriteAsset, this.OnSpriteEdited);
                }
            }
            EditorGUILayout.EndHorizontal();
        }

        if (this.m_EditedLoader.ResizeOnStart != resizeOnStart)
        {
            this.m_EditedLoader.ResizeOnStart = resizeOnStart;
            SVGUtils.MarkObjectDirty(this.m_EditedLoader);
        }
    }
    // border editing callback
    private void OnSpriteEdited(PivotEditingResult result, SVGSpriteAssetFile spriteAsset, Vector2 editedPivot, Vector4 editedBorder)
    {
        SVGUISpriteLoaderBehaviour spriteLoader = target as SVGUISpriteLoaderBehaviour;

        if ((spriteLoader != null) && (result == PivotEditingResult.Ok))
        {
            SVGUIAtlas uiAtlas = spriteLoader.UIAtlas;
            if (uiAtlas != null)
            {
                // assign the new border
                uiAtlas.UpdateBorder(spriteAsset, editedPivot, editedBorder);
                SVGUtils.MarkObjectDirty(uiAtlas);
                Image uiImage = spriteLoader.GetComponent <Image>();
                if (uiImage != null)
                {
                    // the Image component does not recognize the change of sprite border, so in order to refresh
                    // instantiated objects we have to unset-set the sprite property
                    uiImage.sprite = null;
                    uiImage.sprite = spriteAsset.SpriteData.Sprite;
                }
            }
        }
    }
Пример #18
0
    public void UpdatePivot(SVGSpriteAssetFile spriteAsset, Vector2 newPivot)
    {
        SVGSpriteRef  spriteRef  = spriteAsset.SpriteRef;
        SVGSpriteData spriteData = spriteAsset.SpriteData;
        Sprite        oldSprite  = spriteData.Sprite;
        // keep track of pivot movement
        Vector2 deltaPivot    = newPivot - spriteData.Pivot;
        Vector2 deltaMovement = (new Vector2(deltaPivot.x * oldSprite.rect.width, deltaPivot.y * oldSprite.rect.height)) / SVGBasicAtlas.SPRITE_PIXELS_PER_UNIT;
        // create a new sprite (same texture, same rectangle, different pivot)
        Sprite newSprite = Sprite.Create(oldSprite.texture, oldSprite.rect, newPivot, SVGBasicAtlas.SPRITE_PIXELS_PER_UNIT, 0, SpriteMeshType.FullRect, spriteData.Border);

        GameObject[] allObjects = GameObject.FindObjectsOfType <GameObject>();

        foreach (GameObject gameObj in allObjects)
        {
            if (gameObj.activeInHierarchy)
            {
                SVGSpriteLoaderBehaviour loader = gameObj.GetComponent <SVGSpriteLoaderBehaviour>();
                // we must be sure that the loader component must refer to this atlas
                if (loader != null && loader.Atlas == this)
                {
                    // check if the instance uses the specified sprite
                    if (loader.SpriteReference.TxtAsset == spriteRef.TxtAsset && loader.SpriteReference.ElemIdx == spriteRef.ElemIdx)
                    {
                        SVGAtlas.UpdatePivotHierarchy(gameObj, deltaMovement, 0);
                    }
                }
            }
        }

        spriteData.Pivot = newPivot;
        newSprite.name   = oldSprite.name;
        EditorUtility.CopySerialized(newSprite, oldSprite);
        SVGUtils.MarkObjectDirty(oldSprite);
        // destroy the temporary sprite
        GameObject.DestroyImmediate(newSprite);
    }
Пример #19
0
 private void OnSpriteSelect(SVGSpriteAssetFile spriteAsset)
 {
     //if (this.m_EditedLoader.SpriteReference != spriteAsset.SpriteRef)
     if (this.m_EditedLoader.SpriteReference.TxtAsset != spriteAsset.SpriteRef.TxtAsset ||
         this.m_EditedLoader.SpriteReference.ElemIdx != spriteAsset.SpriteRef.ElemIdx)
     {
         // set the selected sprite (reference)
         this.m_EditedLoader.SpriteReference.TxtAsset = spriteAsset.SpriteRef.TxtAsset;
         this.m_EditedLoader.SpriteReference.ElemIdx = spriteAsset.SpriteRef.ElemIdx;
         // set the selected sprite into the renderer
         SpriteRenderer renderer = this.m_EditedLoader.GetComponent<SpriteRenderer>();
         if (renderer != null)
             renderer.sprite = spriteAsset.SpriteData.Sprite;
     }
 }
Пример #20
0
    private bool DrawGUI()
    {
        bool close = false;

    #if UNITY_EDITOR_WIN
        // take care of dpi scaling factor on Windows (Display Settings --> Advanced scaling settings)
        float dpi = Screen.dpi;
        // dpi  96 == 1.00
        // dpi 120 == 1.25
        // dpi 144 == 1.50
        // dpi 168 == 1.75
        // ... and so on
        float dpiAdjust = (((dpi - 96.0f) / 24.0f) * 0.25f) + 1.0f;
    #else
        float dpiAdjust = 1.0f;
    #endif
        int  columnsPerRow = Math.Max(Mathf.FloorToInt((Screen.width / dpiAdjust) / SVGSpriteSelector.SPRITE_PREVIEW_DIMENSION_PADDED), 1);
        int  rowsCount     = 1;
        int  spriteIdx     = 0;
        Rect rect          = new Rect(SVGSpriteSelector.SPRITE_PREVIEW_BORDER, SVGSpriteSelector.SPRITE_PREVIEW_BORDER,
                                      SVGSpriteSelector.SPRITE_PREVIEW_DIMENSION, SVGSpriteSelector.SPRITE_PREVIEW_DIMENSION);
        // draw header, with the name of atlas and the "search by name" toolbox
        List <SVGSpriteAssetFile> spritesList = this.Header();

        this.m_ScrollPos = GUILayout.BeginScrollView(this.m_ScrollPos);
        while (spriteIdx < spritesList.Count)
        {
            // start a new row
            GUILayout.BeginHorizontal();
            {
                int currentColumn = 0;
                rect.x = SVGSpriteSelector.SPRITE_PREVIEW_BORDER;

                while (spriteIdx < spritesList.Count)
                {
                    SVGSpriteAssetFile spriteAsset = spritesList[spriteIdx];
                    Sprite             sprite      = spriteAsset.SpriteData.Sprite;

                    // buttons are used to implement sprite selection (we use the sprite name as tooltip)
                    if (GUI.Button(rect, new GUIContent("", sprite.name)))
                    {
                        // mouse left button click
                        if (Event.current.button == 0)
                        {
                            if (this.m_Callback != null)
                            {
                                this.m_Callback(spriteAsset);
                            }
                            close = true;
                        }
                    }

                    // show sprite preview, taking care to highlight the currently selected one
                    if (Event.current.type == EventType.Repaint)
                    {
                        SVGSpriteSelector.SpritePreview(sprite, rect);
                    }
                    // draw sprite name
                    SVGSpriteSelector.SpriteLabel(sprite.name, rect);

                    // next sprite
                    spriteIdx++;
                    // next column
                    rect.x += SVGSpriteSelector.SPRITE_PREVIEW_DIMENSION_PADDED;
                    if (++currentColumn >= columnsPerRow)
                    {
                        break;
                    }
                }
            }

            GUILayout.EndHorizontal();
            GUILayout.Space(SVGSpriteSelector.SPRITE_PREVIEW_DIMENSION_PADDED);
            rect.y += SVGSpriteSelector.SPRITE_PREVIEW_DIMENSION_PADDED + SVGSpriteSelector.SPRITE_NAME_HEIGHT;
            rowsCount++;
        }

        GUILayout.Space((rowsCount - 1) * SVGSpriteSelector.SPRITE_NAME_HEIGHT + SVGSpriteSelector.SPRITE_PREVIEW_BORDER);
        GUILayout.EndScrollView();

        return(close);
    }
Пример #21
0
    private GameObject InstantiateWidget(Canvas canvas, SVGSpriteAssetFile spriteAsset, SVGUIWidgetType widgetType)
    {
        Image         uiImage;
        InputField    inputField = null;
        SVGSpriteRef  spriteRef  = spriteAsset.SpriteRef;
        SVGSpriteData spriteData = spriteAsset.SpriteData;
        GameObject    gameObj    = new GameObject();

        gameObj.layer = LayerMask.NameToLayer("UI");
        // add Image component; NB: it will add a RectTransform component too
        uiImage            = gameObj.AddComponent <Image>();
        uiImage.fillCenter = true;
        uiImage.material   = null;
        uiImage.color      = new Color(1.0f, 1.0f, 1.0f, 1.0f);
        uiImage.sprite     = spriteData.Sprite;

        switch (widgetType)
        {
        case SVGUIWidgetType.Button:
            gameObj.AddComponent <Button>();
            break;

        case SVGUIWidgetType.InputField:
            inputField = gameObj.AddComponent <InputField>();
            break;

        default:
            break;
        }

        // get RectTransform component and set size according to the associated sprite
        RectTransform rectTransform = gameObj.GetComponent <RectTransform>();

        rectTransform.SetParent(canvas.transform);

        // attach SVGUISpriteLoaderBehaviour component
        SVGUISpriteLoaderBehaviour spriteLoader = (SVGUISpriteLoaderBehaviour)gameObj.AddComponent <SVGUISpriteLoaderBehaviour>();

        spriteLoader.UIAtlas         = this;
        spriteLoader.SpriteReference = spriteRef;
        spriteLoader.ResizeOnStart   = true;

        // anchor presets
        if (widgetType == SVGUIWidgetType.Panel)
        {
            rectTransform.anchorMin     = Vector2.zero;
            rectTransform.anchorMax     = Vector2.one;
            rectTransform.localPosition = Vector3.zero;
            rectTransform.sizeDelta     = Vector2.zero;
        }
        else
        {
            rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
            rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
            rectTransform.sizeDelta = new Vector2(spriteData.Sprite.rect.width, spriteData.Sprite.rect.height);
        }

        // set image type
        uiImage.type = (spriteData.Sprite.border != Vector4.zero) ? Image.Type.Sliced : Image.Type.Simple;

        if (widgetType == SVGUIWidgetType.InputField)
        {
            this.PopulateInputField(canvas, gameObj, inputField);
        }

        gameObj.name = spriteData.Sprite.name;
        gameObj.SetActive(true);
        return(gameObj);
    }