Esempio n. 1
0
 public SeparateMeshPerTemplateShapeInstancer(MeshGeneratorUTProxy meshGenerator, HeightPyramidCommonConfiguration commonConfiguration, HeightPyramidPerLevelConfiguration perLevelConfiguration)
 {
     _meshGenerator         = meshGenerator;
     _commonConfiguration   = commonConfiguration;
     _perLevelConfiguration = perLevelConfiguration;
 }
Esempio n. 2
0
        public HeightPyramidLevelTemplate CreateGroup(HeightPyramidPerLevelConfiguration perLevelConfiguration, Vector2 center, bool createCenterObject)
        {
            var shapeTemplates   = new List <HeightPyramidSegmentShapeTemplate>();
            var perRingTemplates = new Dictionary <int, HeightPyramidPerRingTemplate>();

            var centerObjectLength    = perLevelConfiguration.BiggestShapeObjectInGroupLength;
            var tssMarginOffsetLength = perLevelConfiguration.TransitionSingleStepPercent * centerObjectLength;

            if (createCenterObject)
            {
                var centerMergeWidth      = perLevelConfiguration.PerRingConfigurations[0].MergeWidth;
                var mergeStart            = centerObjectLength * 0.5f;
                var centerTransitionRange = new Vector2(mergeStart - centerMergeWidth - tssMarginOffsetLength, mergeStart - tssMarginOffsetLength) /
                                            (centerObjectLength * 3f);
                shapeTemplates.Add(new HeightPyramidSegmentShapeTemplate()
                {
                    FlatPosition = new Vector2(-0.5f * centerObjectLength, -0.5f * centerObjectLength),
                    FlatSize     = new Vector2(centerObjectLength, centerObjectLength),
                    RingIndex    = 0
                });

                perRingTemplates[0] = new HeightPyramidPerRingTemplate()
                {
                    HeightMergeRange = centerTransitionRange,
                };
            }

            var ringCenters = new List <Vector2>()
            {
                new Vector2(0, 3), new Vector2(1, 3), new Vector2(2, 3), new Vector2(3, 3),
                new Vector2(0, 2), new Vector2(3, 2),
                new Vector2(0, 1), new Vector2(3, 1),
                new Vector2(0, 0), new Vector2(1, 0), new Vector2(2, 0), new Vector2(3, 0),
            }.Select(c => (c) / 2f + new Vector2(-1, -1)).ToList();

            for (int ringIndex = 1; ringIndex < perLevelConfiguration.RingsCount; ringIndex++)
            {
                Vector2 flatSize   = Vector2.one * (centerObjectLength * 0.5f) * ringIndex;
                var     mergeWidth = perLevelConfiguration.PerRingConfigurations[ringIndex].MergeWidth;
                var     mergeStart = Mathf.Pow(2, ringIndex - 1) * centerObjectLength;

                Vector2 transitionRange = new Vector2(mergeStart - mergeWidth - tssMarginOffsetLength, mergeStart - tssMarginOffsetLength) /
                                          (centerObjectLength * 3f);

                perRingTemplates[ringIndex] = new HeightPyramidPerRingTemplate()
                {
                    HeightMergeRange = transitionRange,
                };

                foreach (var aRingCenter in ringCenters)
                {
                    Vector2 flatCenter = aRingCenter * centerObjectLength * ringIndex;

                    shapeTemplates.Add(new HeightPyramidSegmentShapeTemplate()
                    {
                        FlatPosition = flatCenter,
                        FlatSize     = flatSize,
                        RingIndex    = ringIndex
                    });
                }
            }

            var levelFlatSize = perLevelConfiguration.FloorTextureWorldSize;

            return(new HeightPyramidLevelTemplate()
            {
                FlatSize = levelFlatSize,
                Center = center,
                HasCenterObject = createCenterObject,
                PerRingTemplates = perRingTemplates,
                ShapeTemplates = shapeTemplates
            });
        }
Esempio n. 3
0
        public static MyRectangle SurfaceTextureSegmentAlignedPositionToWorldSpaceArea(HeightPyramidLevel level, HeightPyramidPerLevelConfiguration perLevelConfiguration,
                                                                                       IntVector2 segmentAlignedPosition)
        {
            var segmentLength = perLevelConfiguration.BiggestShapeObjectInGroupLength;
            var floatSegmentAlignedPosition = segmentAlignedPosition.ToFloatVec();

            if (level == HeightPyramidLevel.Mid)
            {
                floatSegmentAlignedPosition = floatSegmentAlignedPosition + new Vector2(-1, -0.5f);
            }
            else if (level == HeightPyramidLevel.Top)
            {
                floatSegmentAlignedPosition = floatSegmentAlignedPosition + new Vector2(-8, -4);
            }
            else
            {
                floatSegmentAlignedPosition = floatSegmentAlignedPosition + new Vector2(-1 / 8f, -1 / 16f);
            }

            var surfaceWorldSpaceRectangle = new MyRectangle(floatSegmentAlignedPosition.x * segmentLength, floatSegmentAlignedPosition.y * segmentLength
                                                             , segmentLength, segmentLength);

            return(surfaceWorldSpaceRectangle);
        }
Esempio n. 4
0
 public MergedMeshesPyramidShapeInstancer(MeshGeneratorUTProxy meshGenerator, HeightPyramidCommonConfiguration commonConfiguration, HeightPyramidPerLevelConfiguration perLevelConfiguration)
 {
     _meshGenerator         = meshGenerator;
     _commonConfiguration   = commonConfiguration;
     _perLevelConfiguration = perLevelConfiguration;
 }
Esempio n. 5
0
        public static MyRectangle TerrainShapeSegmentAlignedPositionToWorldSpaceArea(HeightPyramidLevel level, HeightPyramidPerLevelConfiguration perLevelConfiguration,
                                                                                     IntVector2 segmentAlignedPosition)
        {
            var segmentLength = perLevelConfiguration.BiggestShapeObjectInGroupLength;

            if (level == HeightPyramidLevel.Mid)
            {
                segmentAlignedPosition = segmentAlignedPosition + new IntVector2(-1, 0);
            }
            else if (level == HeightPyramidLevel.Top)
            {
                segmentAlignedPosition = segmentAlignedPosition + new IntVector2(-8, -4);
            }

            var surfaceWorldSpaceRectangle = new MyRectangle(segmentAlignedPosition.X * segmentLength, segmentAlignedPosition.Y * segmentLength
                                                             , segmentLength, segmentLength);

            //if (level == HeightPyramidLevel.Mid)
            //{
            //    surfaceWorldSpaceRectangle = RectangleUtils.MoveBy(surfaceWorldSpaceRectangle, new Vector2(90 * 8 * 1, 0));
            //}
            //else if (level == HeightPyramidLevel.Top)
            //{
            //    surfaceWorldSpaceRectangle = RectangleUtils.MoveBy(surfaceWorldSpaceRectangle, new Vector2(90 * -8, 90*-4));
            //}
            return(surfaceWorldSpaceRectangle);
        }