Esempio n. 1
0
        private async Task <TerrainDetailElement> GenerateTerrainDetailElementAsync(
            MyRectangle queryArea, TerrainCardinalResolution cardinalResolution, CornersMergeStatus requiredMerge,
            Func <MyRectangle, TerrainCardinalResolution, TextureWithSize, Task <TextureWithSize> > cornerMergingFunc,
            Func <MyRectangle, TerrainCardinalResolution, RequiredCornersMergeStatus, Task <TextureWithSize> > generateElementFunc
            )
        {
            var newTerrainArea = _alignmentCalculator.ComputeAlignedTerrainArea(queryArea, cardinalResolution);
            RetrivedTerrainDetailTexture texture = null;
            CornersMergeStatus           outCornersMergeStatus;

            TextureWithSize outTexture = null;

            var baseTexture = await generateElementFunc(newTerrainArea, cardinalResolution, RequiredCornersMergeStatus.NOT_MERGED);

            if (requiredMerge == CornersMergeStatus.NOT_MERGED)
            {
                outTexture            = baseTexture;
                outCornersMergeStatus = CornersMergeStatus.NOT_MERGED;
            }
            else
            {
                outTexture = await cornerMergingFunc(queryArea, cardinalResolution, baseTexture);

                outCornersMergeStatus = CornersMergeStatus.MERGED;
            }


            return(new TerrainDetailElement()
            {
                DetailArea = newTerrainArea,
                Resolution = cardinalResolution,
                Texture = outTexture,
                CornersMergeStatus = outCornersMergeStatus
            });
        }
 public InternalTerrainDetailElementToken(IntRectangle queryArea, TerrainCardinalResolution resolution, TerrainDescriptionElementTypeEnum type, CornersMergeStatus mergeStatus)
 {
     _queryArea   = queryArea;
     _resolution  = resolution;
     _type        = type;
     _mergeStatus = mergeStatus;
 }
        public override async Task <TerrainDetailElementOutput> RetriveTerrainDetailAsync(
            TerrainDescriptionElementTypeEnum type, MyRectangle queryArea,
            TerrainCardinalResolution resolution, RequiredCornersMergeStatus cornersMergeStatus)
        {
            TerrainDetailElement detailElement = null;
            CornersMergeStatus   status        = CornersMergeStatus.MERGED;

            if (cornersMergeStatus == RequiredCornersMergeStatus.NOT_MERGED)
            {
                status = CornersMergeStatus.NOT_MERGED;
            }
            if (type == TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY)
            {
                detailElement = await _provider.GenerateHeightDetailElementAsync(queryArea, resolution, status);
            }
            else if (type == TerrainDescriptionElementTypeEnum.NORMAL_ARRAY)
            {
                detailElement = await _provider.GenerateNormalDetailElementAsync(queryArea, resolution, status);
            }
            else
            {
                Preconditions.Fail("Not supported type: " + type);
            }

            return(new TerrainDetailElementOutput()
            {
                TokenizedElement = new TokenizedTerrainDetailElement()
                {
                    DetailElement = detailElement,
                    Token = null
                },
                UvBase = null
            });
        }
Esempio n. 4
0
 public async Task <TerrainDetailElement> GenerateNormalDetailElementAsync(MyRectangle queryArea,
                                                                           TerrainCardinalResolution cardinalResolution, CornersMergeStatus requiredMerge)
 {
     return(await GenerateTerrainDetailElementAsync(queryArea, cardinalResolution, requiredMerge,
                                                    ((rectangle, resolution, textureWithSize) => TaskUtils.MyFromResult(textureWithSize)), // we do not have to merge normals - just generate normals from merged heightmap!
                                                    _generator.GenerateNormalDetailElementAsync
                                                    ));
 }
Esempio n. 5
0
        public async Task <TerrainDetailElement> GenerateHeightDetailElementAsync(MyRectangle queryArea,
                                                                                  TerrainCardinalResolution cardinalResolution, CornersMergeStatus requiredMerge)
        {
            Func <MyRectangle, TerrainCardinalResolution, TextureWithSize, Task <TextureWithSize> > cornerMergingFunc = null;

            if (_cornerMerger != null)
            {
                cornerMergingFunc = _cornerMerger.MergeHeightDetailCorners;
            }

            return(await GenerateTerrainDetailElementAsync(queryArea, cardinalResolution, requiredMerge,
                                                           cornerMergingFunc,
                                                           _generator.GenerateHeightDetailElementAsync
                                                           ));
        }
 private InternalTerrainDetailElementToken GenerateInternalToken(
     MyRectangle rect, TerrainCardinalResolution resolution, TerrainDescriptionElementTypeEnum type, CornersMergeStatus mergeStatus)
 {
     return(new InternalTerrainDetailElementToken(GenerateQuantisizedQueryRectangle(rect), resolution, type, mergeStatus));
 }