Newer
Older
fall / FallUnity / Assets / IsoSorting / IsoHandler.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IsoHandler : MonoBehaviour {
    private HashSet<IsoSprite> sprites = new HashSet<IsoSprite>();
    private List<IsoSprite> spriteList = new List<IsoSprite>();
    private Camera mainCamera;
    public void AddIsoSprite(IsoSprite sprite)
    {
        if (sprites.Add(sprite))
        {
            spriteList.Add(sprite);
        }
    }
    public void RemoveIsoSprite(IsoSprite sprite)
    {
        if (sprites.Remove(sprite))
        {
            spriteList.Remove(sprite);
        }
    }

    private List<IsoPiece> pieceList = new List<IsoPiece>();
    public void AddIsoPiece(IsoPiece piece)
    {
        if (!pieceList.Contains(piece))
        {
            pieceList.Add(piece);
        }
    }
    public void RemoveIsoPiece(IsoPiece piece)
    {
        pieceList.Remove(piece);
    }
    // Use this for initialization
    void Start () {
        mainCamera = GameObject.Find("Main Camera").GetComponent<Camera>();
        mainCamera.transparencySortMode = TransparencySortMode.Orthographic;
	}

    int SpriteSort(IsoSprite a, IsoSprite b)
    {
        float diff = b.CameraSpace.z - a.CameraSpace.z;
        if (diff > 0) return 1;
        if (diff < 0) return -1;
        return 0;
    }

    int PieceSort(IsoPiece a, IsoPiece b)
    {
        float diff = b.CameraSpace.z - a.CameraSpace.z;
        if (diff > 0) return 1;
        if (diff < 0) return -1;
        return 0;
    }

    private List<IsoSprite> frontSort = new List<IsoSprite>();
    private float nextDepth = 0;
    private Vector3 camForward;
    private Vector3 camRight;
    private Vector3 camUp;
    private Vector3 camPos;
    void LateUpdate()
    {
        camForward = mainCamera.transform.forward;
        camRight = mainCamera.transform.right;
        camUp = mainCamera.transform.up;
        camPos = mainCamera.transform.position;

        frontSort.Clear();
        for (int i = 0; i < pieceList.Count; i++)
        {
            pieceList[i].Behind.Clear();
            pieceList[i].CameraSpace = mainCamera.WorldToScreenPoint(pieceList[i].LinkedImage.transform.position);
        }

        for (int i = 0; i < spriteList.Count; i++)
        {
            spriteList[i].CameraSpace = mainCamera.WorldToScreenPoint(spriteList[i].gameObject.transform.position);
        }
        spriteList.Sort(SpriteSort);

        int layer = LayerMask.GetMask("iso_piece");
        RaycastHit hitInfo = new RaycastHit();
        for (int i = 0; i < spriteList.Count; i++)
        {
            IsoSprite sprite = spriteList[i];
            if (Physics.Raycast(new Ray(sprite.transform.position, -camForward), out hitInfo, sprite.CameraSpace.z, layer))
            {
                IsoPiece piece = hitInfo.collider.GetComponentInParent<IsoPiece>();
                piece.Behind.Add(sprite);
            }
            else
            {
                frontSort.Add(sprite);
            }
        }

        pieceList.Sort(PieceSort);

        nextDepth = 50;
        for (int i = 0; i < pieceList.Count; i++)
        {
            IsoPiece piece = pieceList[i];
            for (int j = 0; j < piece.Behind.Count; j++)
            {
                SortObject(piece.Behind[j].CameraSpace, piece.Behind[j].gameObject, piece.Behind[j].Mesh);
            }
            SortObject(piece.CameraSpace, piece.LinkedImage, piece.LinkedImage);
        }

        for (int i = 0; i < frontSort.Count; i++)
        {
            SortObject(frontSort[i].CameraSpace, frontSort[i].gameObject, frontSort[i].Mesh);
        }
    }

    private void SortObject(Vector3 camPoint, GameObject getPos, GameObject setPos)
    {
        camPoint.z = nextDepth;

        setPos.transform.position = mainCamera.ScreenToWorldPoint(camPoint);

        nextDepth -= 0.001f;
    }
}