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 }); }
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 )); }
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)); }