Exemplo n.º 1
0
        public Dictionary <HeightPyramidLevel, Dictionary <int, EPropMergeRing> > CalculateMergeRectangles(Vector2 worldSpaceTravellerPosition, Dictionary <HeightPyramidLevel, Vector2> levelCentersWorldSpace)
        {
            return(levelCentersWorldSpace.ToDictionary(c => c.Key, pair =>
            {
                var levelIndex = pair.Key;
                Vector2 pyramidCenterUv = WorldSpaceToLevelUvSpace(levelCentersWorldSpace[levelIndex], levelIndex, levelCentersWorldSpace);

                return _ringMergeRanges[levelIndex].ToDictionary(k => k.Key, ringMergeRange =>
                {
                    var ringIndex = ringMergeRange.Key;
                    ELevelAndRingIndexes levelAndRingIndexes = new ELevelAndRingIndexes()
                    {
                        RingIndex = ringIndex,
                        LevelIndex = levelIndex
                    };
                    var innerRectangle = RecalculateMergeRectangles3(worldSpaceTravellerPosition, pyramidCenterUv, ringMergeRange.Value.x, levelAndRingIndexes,
                                                                     levelCentersWorldSpace);
                    var outerRectangle = RecalculateMergeRectangles3(worldSpaceTravellerPosition, pyramidCenterUv, ringMergeRange.Value.y, levelAndRingIndexes,
                                                                     levelCentersWorldSpace);
                    return new EPropMergeRing()
                    {
                        InnerRectangle = innerRectangle,
                        OuterRectangle = outerRectangle
                    };
                });
            }));
        }
Exemplo n.º 2
0
        private MyRectangle RecalculateMergeRectangles3(Vector2 worldSpaceTravellerPosition, Vector2 pyramidCenterUv, float transitionLimit,
                                                        ELevelAndRingIndexes levelAndRingIndexes, Dictionary <HeightPyramidLevel, Vector2> levelCentersWorldSpace)
        {
            var travellerPositionInLevelUv = TravellerWorldPositionToConstantLevelUv(worldSpaceTravellerPosition, levelAndRingIndexes);

            var isuv_x1 = 0.5f * transitionLimit + travellerPositionInLevelUv.x + 0.5f - pyramidCenterUv.x;
            var isuv_x2 = -0.5f * transitionLimit + travellerPositionInLevelUv.x + 0.5f - pyramidCenterUv.x;
            var isuv_y1 = 0.5f * transitionLimit + travellerPositionInLevelUv.y + 0.5f - pyramidCenterUv.y;
            var isuv_y2 = -0.5f * transitionLimit + travellerPositionInLevelUv.y + 0.5f - pyramidCenterUv.y;

            var minValuesUvSpace = new Vector2(
                Mathf.Min(isuv_x1, isuv_x2),
                Mathf.Min(isuv_y1, isuv_y2)
                );

            var maxValuesUvSpace = new Vector2(
                Mathf.Max(isuv_x1, isuv_x2),
                Mathf.Max(isuv_y1, isuv_y2)
                );

            var minValuesWorldSpace = ConstantLevelUvSpaceToWorldSpace(minValuesUvSpace, levelAndRingIndexes);
            var maxValuesWorldSpace = ConstantLevelUvSpaceToWorldSpace(maxValuesUvSpace, levelAndRingIndexes);

            var worldSpaceRectangle = new MyRectangle(minValuesWorldSpace.x, minValuesWorldSpace.y, maxValuesWorldSpace.x - minValuesWorldSpace.x,
                                                      maxValuesWorldSpace.y - minValuesWorldSpace.y);

            return(worldSpaceRectangle);
        }
Exemplo n.º 3
0
        private Vector2 LevelUvSpaceToWorldSpace(Vector2 levelUv, ELevelAndRingIndexes levelAndRingIndexes, Dictionary <HeightPyramidLevel, Vector2> levelCentersWorldSpace)
        {
            Vector2 levelWorldSize         = _floorTextureWorldSizes[levelAndRingIndexes.LevelIndex];
            Vector2 pyramidCenterWorldSize = levelCentersWorldSpace[levelAndRingIndexes.LevelIndex];
            Vector2 offset = (levelUv.Add(-0.5f)) * levelWorldSize;

            return(pyramidCenterWorldSize + offset);
        }
Exemplo n.º 4
0
        private Vector2 ConstantLevelUvSpaceToWorldSpace(Vector2 levelUv, ELevelAndRingIndexes levelAndRingIndexes)
        {
            Vector2 levelWorldSize = _floorTextureWorldSizes[levelAndRingIndexes.LevelIndex];

            return(VectorUtils.MemberwiseMultiply(levelUv.Add(-0.5f), levelWorldSize));
        }
Exemplo n.º 5
0
        private Vector2 TravellerWorldPositionToConstantLevelUv(Vector2 travellerPositionWorldSpace, ELevelAndRingIndexes levelAndRingIndexes)
        {
            Vector2 levelWorldSize = _floorTextureWorldSizes[levelAndRingIndexes.LevelIndex];

            return(VectorUtils.MemberwiseDivide(travellerPositionWorldSpace, levelWorldSize).Add(0.5f));
        }