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 }; }); })); }
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); }
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); }
private Vector2 ConstantLevelUvSpaceToWorldSpace(Vector2 levelUv, ELevelAndRingIndexes levelAndRingIndexes) { Vector2 levelWorldSize = _floorTextureWorldSizes[levelAndRingIndexes.LevelIndex]; return(VectorUtils.MemberwiseMultiply(levelUv.Add(-0.5f), levelWorldSize)); }
private Vector2 TravellerWorldPositionToConstantLevelUv(Vector2 travellerPositionWorldSpace, ELevelAndRingIndexes levelAndRingIndexes) { Vector2 levelWorldSize = _floorTextureWorldSizes[levelAndRingIndexes.LevelIndex]; return(VectorUtils.MemberwiseDivide(travellerPositionWorldSpace, levelWorldSize).Add(0.5f)); }