Пример #1
0
            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);
            }
Пример #2
0
 public static bool IsIsoObjectOverlap(IsometricData isoObjectLeft, IsometricData isoObjectRight)
 {
     return(math.all((isoObjectLeft.ScreenMin < isoObjectRight.ScreenMax) & (isoObjectLeft.ScreenMax > isoObjectRight.ScreenMin)));
 }
Пример #3
0
 public void UpdateIsometricData(IsometricDataGameobject isoGO, IsometricData newData)
 {
     _isometricDataToUpdate[isoGO] = newData;
 }