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 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)
        {
            var queryOutput = await _db.QueryAsync(new TerrainDescriptionQuery()
            {
                QueryArea = queryArea,
                RequestedElementDetails = new List <TerrainDescriptionQueryElementDetail>()
                {
                    new TerrainDescriptionQueryElementDetail()
                    {
                        Resolution          = resolution,
                        Type                = type,
                        RequiredMergeStatus = cornersMergeStatus
                    }
                }
            });

            return(queryOutput.GetElementOfType(type));
        }
Exemple #4
0
 public override Task <TerrainDetailElementOutput> RetriveTerrainDetailAsync(
     TerrainDescriptionElementTypeEnum type, MyRectangle queryArea, TerrainCardinalResolution resolution, RequiredCornersMergeStatus cornersMergeStatus)
 {
     return(TaskUtils.MyFromResult(_mockProvidingFunction(type, queryArea, resolution, cornersMergeStatus)));
 }
        private async Task <TokenizedTerrainDetailElement> GenerateElementAsync(
            MyRectangle alignedArea, TerrainCardinalResolution resolution,
            RequiredCornersMergeStatus requiredMerge,
            TerrainDescriptionElementTypeEnum elementType,
            Func <MyRectangle, TerrainCardinalResolution, CornersMergeStatus, Task <TerrainDetailElement> > detailElementGenerator
            )
        {
            CornersMergeStatus statusWeTarget;

            if (requiredMerge == RequiredCornersMergeStatus.NOT_IMPORTANT)
            {
                if (_memoryTerrainCaches[CornersMergeStatus.MERGED][elementType].IsInCache(GenerateInternalToken(alignedArea, resolution, elementType, CornersMergeStatus.MERGED)))
                {
                    statusWeTarget = CornersMergeStatus.MERGED;
                }
                else
                {
                    statusWeTarget = CornersMergeStatus.NOT_MERGED;
                }
            }
            else if (requiredMerge == RequiredCornersMergeStatus.NOT_MERGED)
            {
                statusWeTarget = CornersMergeStatus.NOT_MERGED;
            }
            else
            {
                statusWeTarget = CornersMergeStatus.MERGED;
            }

            if (!_mergingEnabled)
            {
                statusWeTarget = CornersMergeStatus.NOT_MERGED;
            }

            var internalToken = GenerateInternalToken(alignedArea, resolution, elementType, statusWeTarget);
            var queryOutput   = await _memoryTerrainCaches[statusWeTarget][elementType].TryRetriveAsync(internalToken);

            if (queryOutput.Asset != null)
            {
                return(new TokenizedTerrainDetailElement()
                {
                    DetailElement = new TerrainDetailElement()
                    {
                        Texture = queryOutput.Asset,
                        Resolution = resolution,
                        DetailArea = alignedArea,
                        CornersMergeStatus = statusWeTarget
                    },
                    Token = new TerrainDetailElementToken(alignedArea, resolution, elementType, statusWeTarget)
                });
            }
            else
            {
                var detailElement = await detailElementGenerator(alignedArea, resolution, statusWeTarget);

                var   queryOutputCreationObligationToken = queryOutput.CreationObligationToken.Value;
                await _memoryTerrainCaches[statusWeTarget][elementType].AddAssetAsync(
                    queryOutputCreationObligationToken, internalToken, detailElement.Texture);
                return(new TokenizedTerrainDetailElement()
                {
                    DetailElement = new TerrainDetailElement()
                    {
                        Texture = detailElement.Texture,
                        Resolution = resolution,
                        DetailArea = alignedArea,
                        CornersMergeStatus = statusWeTarget
                    },
                    Token = new TerrainDetailElementToken(alignedArea, resolution, elementType, detailElement.CornersMergeStatus)
                });
            }
        }
 private InternalTerrainDetailElementToken GenerateInternalToken(
     MyRectangle rect, TerrainCardinalResolution resolution, TerrainDescriptionElementTypeEnum type, CornersMergeStatus mergeStatus)
 {
     return(new InternalTerrainDetailElementToken(GenerateQuantisizedQueryRectangle(rect), resolution, type, mergeStatus));
 }
Exemple #7
0
 public bool HasElementOfType(TerrainDescriptionElementTypeEnum type)
 {
     return _output.ContainsKey(type);
 }
Exemple #8
0
 public TerrainDetailElementOutput GetElementOfType(TerrainDescriptionElementTypeEnum type)
 {
     return _output[type];
 }
 public abstract Task <TerrainDetailElementOutput> RetriveTerrainDetailAsync(
     TerrainDescriptionElementTypeEnum type, MyRectangle queryArea, TerrainCardinalResolution resolution, RequiredCornersMergeStatus cornersMergeStatus);