public static bool IsObjectIsInFrontOf(IsometricData isoObjectLeft, IsometricData isoObjectRight) { var leftMinCal = new float3(-isoObjectLeft.IsoPosition.x, isoObjectLeft.IsoPosition.y, isoObjectRight.IsoPosition.z); var leftMaxCal = leftMinCal + new float3(isoObjectLeft.IsoSize.xy, isoObjectRight.IsoSize.z); var rightMinCal = new float3(-isoObjectRight.IsoPosition.x, isoObjectRight.IsoPosition.y, isoObjectLeft.IsoPosition.z); var rightMaxCal = rightMinCal + new float3(isoObjectRight.IsoSize.xy, isoObjectLeft.IsoSize.z); //from https://shaunlebron.github.io/IsometricBlocks/ bool leftCanBeInFront = math.all(leftMaxCal > rightMinCal); if (leftCanBeInFront) { //from http://bannalia.blogspot.com/2008/02/filmation-math.html bool rightCanBeInFront = math.all(rightMaxCal > leftMinCal); if (rightCanBeInFront) { //left and right can be in front, search deeper var deltaLeftToRight = leftMaxCal - rightMinCal; var deltaRightToLeft = rightMaxCal - leftMinCal; var deltaProjection = isoObjectLeft.IsoSize + isoObjectRight.IsoSize - math.abs(deltaRightToLeft - deltaLeftToRight); var condition = new bool2(deltaProjection.y <= deltaProjection.x && deltaProjection.y <= deltaProjection.z, deltaProjection.x <= deltaProjection.y && deltaProjection.x <= deltaProjection.z); //better than an if else if for vectorization var res = new bool3(condition.x & (deltaLeftToRight.y > deltaRightToLeft.y), (condition.x == false) & condition.y & (deltaLeftToRight.x > deltaRightToLeft.x), (math.any(condition.xy) == false) & (deltaLeftToRight.z > deltaRightToLeft.z)); return(math.any(res)); } } return(leftCanBeInFront); }
public static bool IsIsoObjectOverlap(IsometricData isoObjectLeft, IsometricData isoObjectRight) { return(math.all((isoObjectLeft.ScreenMin < isoObjectRight.ScreenMax) & (isoObjectLeft.ScreenMax > isoObjectRight.ScreenMin))); }
public void UpdateIsometricData(IsometricDataGameobject isoGO, IsometricData newData) { _isometricDataToUpdate[isoGO] = newData; }