public async Task <List <float> > GetValuesAsync(RandomFieldNature nature, float seed, List <Vector2> queryPositions) { Dictionary <MyRectangle, IntensityFieldFigure> segmentsDict = null; var randomFieldFigureId = new RandomFieldFigureId(nature, seed); if (!_figuresDictionary.ContainsKey(randomFieldFigureId)) { segmentsDict = new Dictionary <MyRectangle, IntensityFieldFigure>(); _figuresDictionary[randomFieldFigureId] = segmentsDict; } else { segmentsDict = _figuresDictionary[randomFieldFigureId]; } List <MyRectangle> segmentCoordsList = new List <MyRectangle>(queryPositions.Count); for (int i = 0; i < queryPositions.Count; i++) { segmentCoordsList.Add(CalculateSegment(queryPositions[i])); } List <MyRectangle> distinctCoords = segmentCoordsList.Distinct().ToList(); List <MyRectangle> coordsToCreateFigureFor = distinctCoords.Where(c => !segmentsDict.ContainsKey(c)).ToList(); if (coordsToCreateFigureFor.Any()) { var createdFigures = await TaskUtils.WhenAll(Enumerable.Range(0, coordsToCreateFigureFor.Count).Select( (i) => { var coord = coordsToCreateFigureFor[i]; return(_figureGenerator.GenerateRandomFieldFigureAsync(nature, seed, coord)); })); for (int i = 0; i < coordsToCreateFigureFor.Count; i++) { var coord = coordsToCreateFigureFor[i]; segmentsDict[coord] = createdFigures[i]; } } List <float> outList = new List <float>(queryPositions.Count); for (int i = 0; i < queryPositions.Count; i++) { var position = queryPositions[i]; var segmentCoords = segmentCoordsList[i]; IntensityFieldFigure fieldFigure = segmentsDict[segmentCoords]; var inFigureUv = new Vector2((position.x - segmentCoords.X) / segmentCoords.Width, (position.y - segmentCoords.Y) / segmentCoords.Height); outList.Add(fieldFigure.GetPixelWithUv(inFigureUv)); } return(outList); }
private IntensityFieldFigure CopyToRandomFieldFigure(Texture2D outTexture) { var randomFieldFigure = new IntensityFieldFigure(outTexture.width, outTexture.height); for (int x = 0; x < outTexture.width; x++) { for (int y = 0; y < outTexture.height; y++) { randomFieldFigure.SetPixel(x, y, outTexture.GetPixel(x, y).r); } } return(randomFieldFigure); }