public override void OnInspectorGUI()
    {
        AutoTileLookup lookup = target as AutoTileLookup;



        showBaseInspector = EditorGUILayout.Foldout(showBaseInspector, "Show Base Inspector");
        if (showBaseInspector)
        {
            base.OnInspectorGUI();
        }

        overrideRulesFromTile = EditorGUILayout.Foldout(overrideRulesFromTile, "Override Rules List");
        if (overrideRulesFromTile)
        {
            EditorGUILayout.BeginVertical(GUI.skin.box);
            {
                EditorGUILayout.LabelField(
                    "This will set the target rules for this lookup to match.  " +
                    "You don't need to use this unless you are creating a new lookup.", GUI.skin.box);

                RuleTile load = (RuleTile)EditorGUILayout.ObjectField("Load Ruleset", null, typeof(RuleTile), false);
                if (load)
                {
                    lookup.m_maskValues = load.m_TilingRules;
                }
            }
            EditorGUILayout.EndVertical();
        }

        showSubTileMapping = EditorGUILayout.Foldout(showSubTileMapping, "Show Subtile Mapping");
        if (showSubTileMapping)
        {
            EditorGUILayout.BeginVertical(GUI.skin.box);
            {
                EditorGUILayout.LabelField(
                    "This shows each Rule (set with the override tile rules parameter.)  " +
                    "Alongside each rule is the lookup data for each quadrant of the tile.", GUI.skin.box);
            }
            EditorGUILayout.EndVertical();

            SubTileMappingGUI(lookup);
        }



        EditorGUILayout.BeginVertical(GUI.skin.box);
        {
            EditorGUILayout.LabelField(
                "This will take the texture and generate " +
                "the appropriate assets + RuleTile data.", GUI.skin.box);

            Texture2D texture = (Texture2D)EditorGUILayout.ObjectField(null, typeof(Texture2D), false);
            if (texture != null)
            {
                ImportAutotile.ImportSubtile(texture, lookup);
            }
        }
        EditorGUILayout.EndVertical();
    }
Example #2
0
    static void ProcessSubtileTexture(Texture2D _texture, AutoTileLookup _lookup)
    {
        //Spprite importer stuff to prep the asset for slicing.
        string path     = AssetDatabase.GetAssetPath(_texture);
        var    importer = AssetImporter.GetAtPath(path) as TextureImporter;


        importer.textureType        = TextureImporterType.Sprite;
        importer.spriteImportMode   = SpriteImportMode.Multiple;
        importer.mipmapEnabled      = false;
        importer.filterMode         = FilterMode.Point;
        importer.spritePivot        = Vector2.down;
        importer.textureCompression = TextureImporterCompression.Uncompressed;

        var textureSettings = new TextureImporterSettings();

        importer.ReadTextureSettings(textureSettings);
        textureSettings.spriteMeshType = SpriteMeshType.FullRect;
        textureSettings.spriteExtrude  = 0;

        importer.SetTextureSettings(textureSettings);

        //for A2s we know the subtil size is width/4
        int minSpriteSize = _texture.width / 4;

        //Slice the asset
        Rect[] rects = InternalSpriteUtility.GenerateGridSpriteRectangles(
            _texture,
            Vector2.zero,
            new Vector2(minSpriteSize, minSpriteSize),
            Vector2.zero);

        List <Rect> rectList = new List <Rect>(rects);

        string filenameNoExtension  = Path.GetFileNameWithoutExtension(path);
        List <SpriteMetaData> metas = new List <SpriteMetaData>();
        int count = 0;

        foreach (Rect rect in rectList)
        {
            var meta = new SpriteMetaData();
            meta.pivot     = Vector2.one * 0.5f;//center
            meta.alignment = (int)SpriteAlignment.Center;
            meta.rect      = rect;
            int xpos = count % 4;
            int ypos = Mathf.CeilToInt(count / 4);

            int rightside = xpos % 2;
            int topside   = (ypos + 1) % 2;
            int lookup    = (topside * 2) + rightside;


            meta.name = RuleTileEditor.m_ModDirections[lookup] + count.ToString("00") + "_" + filenameNoExtension;
            metas.Add(meta);
            count++;
        }

        importer.spritesheet = metas.ToArray();

        AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
        Object[]      objects = AssetDatabase.LoadAllAssetsAtPath(path);
        List <Sprite> sprites = new List <Sprite>();

        for (int i = 0; i < objects.Length; i++)
        {
            //filter out non-sprites.  I was getting some extra entry here.
            if ((objects[i] as Sprite) != null)
            {
                sprites.Add(objects[i] as Sprite);
            }
        }
        sprites.Sort((Sprite x, Sprite y) => x.name.CompareTo(y.name));

        RuleTile m_tile = ScriptableObject.CreateInstance <RuleTile>();

        m_tile.m_TilingRules = new List <RuleTile.TilingRule>();

        int rulecount = 0;

        for (int i = 255; i >= 0; i--)
        {
            RuleTile.TilingRule rule = ImportAutotile.GetRule(i);
            if (rule != null)
            {
                AddSpritesToRule(ref rule, sprites, rulecount, _lookup);

                rulecount++;
                m_tile.m_TilingRules.Add(rule);
            }
        }

        AssetDatabase.CreateAsset(m_tile, "Assets/" + filenameNoExtension + "tile.asset");
    }