Ejemplo n.º 1
0
        public async Task <TextureWithSize> ExtractMipmapAsync(TextureWithSize inputTexture, RenderTextureFormat format, int mipmapLevelToExtract)
        {
            var pack = new UniformsPack();

            pack.SetTexture("_InputTexture", inputTexture.Texture);
            pack.SetUniform("_MipmapLevelToExtract", mipmapLevelToExtract);

            var outSize = ComputeMipmappedOutSize(inputTexture.Size, mipmapLevelToExtract);

            var newTexture = await _textureRenderer.AddOrder(new TextureRenderingTemplate()
            {
                CanMultistep         = true,
                Coords               = new MyRectangle(0, 0, 1, 1),
                CreateTexture2D      = false,
                OutTextureInfo       = new ConventionalTextureInfo(outSize.X, outSize.Y, TextureFormat.ARGB32, true),
                RenderTextureFormat  = format,
                RenderTextureMipMaps = true,
                ShaderName           = "Custom/Tool/ExtractMipmap",
                UniformPack          = pack,
            });

            return(new TextureWithSize()
            {
                Texture = newTexture,
                Size = outSize
            });
        }
Ejemplo n.º 2
0
        private async Task <Texture> GenerateTextureWithMipMapsAsync(TextureWithSize tex)
        {
            IntVector2   outTextureSize = tex.Size;
            UniformsPack pack           = new UniformsPack();

            pack.SetTexture("_SourceTexture", tex.Texture);
            ConventionalTextureInfo outTextureInfo =
                new ConventionalTextureInfo(outTextureSize.X, outTextureSize.Y, TextureFormat.ARGB32, true);
            TextureRenderingTemplate template = new TextureRenderingTemplate()
            {
                CanMultistep         = false,
                Coords               = new MyRectangle(0, 0, 1, 1),
                OutTextureInfo       = outTextureInfo,
                RenderTextureFormat  = RenderTextureFormat.RFloat,
                ShaderName           = "Custom/TerGen/Cutting",
                UniformPack          = pack,
                CreateTexture2D      = false,
                RenderTextureMipMaps = true
            };
            var outTex = await _rendererProxy.AddOrder(template);

            await _commonExecutor.AddAction(() => outTex.wrapMode = TextureWrapMode.Clamp);

            return(outTex);
        }
Ejemplo n.º 3
0
        public async Task SaveNormalDetailElementAsync(string filename, TextureWithSize textureWithSize)
        {
            var path      = _mainDictionaryPath + filename + _extension;
            var texture2d = await ChangeNormalTextureToTexture2DAsync(textureWithSize.Texture);

            await AsyncFileUtils.SaveTextureToPngFileAsync(path, texture2d, _commonExecutor);
        }
Ejemplo n.º 4
0
 public HeightArrayWeldingPack(TextureWithSize weldTexture, HeightArrayWelderProxy welderProxy, CommonExecutorUTProxy commonExecutorUtProxy, bool weldingEnabled)
 {
     _weldTexture           = weldTexture;
     _welderProxy           = welderProxy;
     _commonExecutorUtProxy = commonExecutorUtProxy;
     _weldingEnabled        = weldingEnabled;
 }
Ejemplo n.º 5
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 Texture MirrorHeightTexture(TextureWithSize textureWithSize)
        {
            var renderMaterial = new Material(Shader.Find("Custom/TerGen/MirrorHeightTexture"));

            renderMaterial.SetTexture("_SourceTexture", textureWithSize.Texture);
            var textureSize = textureWithSize.Size;

            return(UltraTextureRenderer.CreateRenderTexture(renderMaterial,
                                                            new RenderTextureInfo(textureSize.X, textureSize.Y, RenderTextureFormat.ARGB32, true)));
        }
 public async Task <Texture> MirrorHeightTextureAsync(TextureWithSize textureWithSize)
 {
     return(await _commonExecutor.AddAction(() =>
     {
         var renderMaterial = new Material(Shader.Find("Custom/TerGen/MirrorHeightTexture"));
         renderMaterial.SetTexture("_SourceTexture", textureWithSize.Texture);
         var textureSize = textureWithSize.Size;
         return UltraTextureRenderer.CreateRenderTexture(renderMaterial,
                                                         new RenderTextureInfo(textureSize.X, textureSize.Y, RenderTextureFormat.ARGB32, true));
     }));
 }
        public RenderTexture EncodedHeightTextureToPlain(TextureWithSize encodedTexture)
        {
            var renderMaterial = new Material(Shader.Find("Custom/TerGen/RgbaToRFloat"));

            renderMaterial.SetTexture("_SourceTexture", encodedTexture.Texture);
            var textureSize       = encodedTexture.Size;
            var renderTextureInfo = new RenderTextureInfo(textureSize.X, textureSize.Y, RenderTextureFormat.RFloat, true);

            var tex = UltraTextureRenderer.CreateRenderTexture(renderMaterial, renderTextureInfo);

            return(tex);
        }
        private async Task <Texture> CreateGenerateAndGenerateTexture(List <RankedTerrainFeatureApplier> featureAppliers,
                                                                      TextureWithSize globalHeightTexture)
        {
            var provider = CreateTerrainDetailProvider(featureAppliers, globalHeightTexture);

            MyRectangle queryArea  = new MyRectangle(0, 0, 24 * 240, 24 * 240);
            var         resolution = TerrainCardinalResolution.MIN_RESOLUTION;

            var outTex = (await provider.GenerateHeightDetailElementAsync(queryArea, resolution, CornersMergeStatus.NOT_MERGED)).Texture;

            return(outTex.Texture);
        }
 public async Task <Texture2D> PlainToEncodedHeightTextureAsync(TextureWithSize plainTexture)
 {
     return(await _commonExecutor.AddAction(() =>
     {
         var renderMaterial = new Material(Shader.Find("Custom/TerGen/RFloatToRgba"));
         renderMaterial.SetTexture("_SourceTexture", plainTexture.Texture);
         var textureSize = plainTexture.Size;
         var renderTextureInfo = new RenderTextureInfo(textureSize.X, textureSize.Y, RenderTextureFormat.ARGB32);
         ConventionalTextureInfo outTextureinfo =
             new ConventionalTextureInfo(textureSize.X, textureSize.Y, TextureFormat.ARGB32, false);
         return UltraTextureRenderer.RenderTextureAtOnce(renderMaterial, renderTextureInfo, outTextureinfo);
     }));
 }
Ejemplo n.º 11
0
        private async Task <TextureWithSize> CreateOutputTexture(TextureWithSize baseTexture)
        {
            var newTextureTemplate = new MyRenderTextureTemplate(baseTexture.Size.X, baseTexture.Size.Y, RenderTextureFormat.RFloat, true, FilterMode.Point);

            newTextureTemplate.wrapMode      = TextureWrapMode.Clamp;
            newTextureTemplate.SourceTexture = baseTexture.Texture;
            var newTexture = await _textureConciever.ConcieveRenderTextureAsync(newTextureTemplate);

            return(new TextureWithSize()
            {
                Size = baseTexture.Size,
                Texture = newTexture
            });
        }
Ejemplo n.º 12
0
        public void CreateTerrainObject(TextureWithSize textureWithSize, Vector2 startPosition)
        {
            var go = GameObject.CreatePrimitive(PrimitiveType.Plane);

            go.GetComponent <MeshFilter>().mesh = PlaneGenerator.CreateFlatPlaneMesh(241, 241);

            var material = new Material(Shader.Find("Custom/Debug/SimpleTerrain"));

            material.SetTexture("_HeightmapTex", textureWithSize.Texture);
            material.SetFloat("_HeightmapTexWidth", 241);

            go.GetComponent <MeshRenderer>().material = material;
            go.transform.localPosition = new Vector3(startPosition.x, 0, startPosition.y);
            go.transform.localScale    = new Vector3(90, 10, 90);
            go.name = $"TerrainAt" + startPosition;
        }
Ejemplo n.º 13
0
        public DebugFlatTerrainShapeDb(UTTextureRendererProxy textureRenderer)
        {
            var size = new IntVector2(241, 241);
            var tex  = new Texture2D(size.X, size.Y, TextureFormat.ARGB32, true, true);

            for (int x = 0; x < size.X; x++)
            {
                for (int y = 0; y < size.Y; y++)
                {
                    tex.SetPixel(x, y, new Color(0, 0, 0, 0));
                }
            }
            tex.Apply();

            _blankTexture = new TextureWithSize()
            {
                Texture = tex,
                Size    = size
            };

            var pack = new UniformsPack();

            pack.SetTexture("_HeightmapTex", tex);
            pack.SetUniform("_HeightMultiplier", 80);
            ConventionalTextureInfo outTextureInfo =
                new ConventionalTextureInfo(size.X, size.Y, TextureFormat.ARGB32, true);

            var renderCoords = new MyRectangle(0, 0, 1, 1);
            TextureRenderingTemplate template = new TextureRenderingTemplate()
            {
                CanMultistep        = false,
                Coords              = renderCoords,
                OutTextureInfo      = outTextureInfo,
                RenderTextureFormat = RenderTextureFormat.ARGB32,
                ShaderName          = "Custom/Terrain/NormalmapGenerator",
                UniformPack         = pack,
                CreateTexture2D     = false
            };
            var outNormalTex = textureRenderer.AddOrder(template).Result;

            _normalTexture = new TextureWithSize()
            {
                Size    = size,
                Texture = outNormalTex
            };
        }
        private TerrainDetailProvider CreateTerrainDetailProvider(List <RankedTerrainFeatureApplier> featureAppliers,
                                                                  TextureWithSize globalHeightTexture)
        {
            TerrainDetailGeneratorConfiguration generatorConfiguration = new TerrainDetailGeneratorConfiguration()
            {
                TerrainDetailImageSideDisjointResolution = 240
            };
            TextureWithCoords fullFundationData = new TextureWithCoords(sizedTexture: globalHeightTexture,
                                                                        coords: new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator =
                new TerrainDetailGenerator(generatorConfiguration, _utTextureRendererProxy, fullFundationData,
                                           featureAppliers, _commonExecutor);

            TerrainDetailProvider provider =
                new TerrainDetailProvider(generator, null, new TerrainDetailAlignmentCalculator(240));

            return(provider);
        }
        public static UpdatedTerrainTextures GenerateDebugUpdatedTerrainTextures()
        {
            var height      = 1;
            var heightArray = new float[12, 12];

            for (int x = 0; x < 12; x++)
            {
                for (int y = 0; y < 12; y++)
                {
                    heightArray[x, y] = height;
                }
            }
            var ha = new HeightmapArray(heightArray);
            var encodedHeightTex = HeightmapUtils.CreateTextureFromHeightmap(ha);

            var transformer    = new TerrainTextureFormatTransformator(new CommonExecutorUTProxy());
            var plainHeightTex =
                transformer.EncodedHeightTextureToPlain(TextureWithSize.FromTex2D(encodedHeightTex));

            var normalArray = new Vector3[12, 12];

            for (int x = 0; x < 12; x++)
            {
                for (int y = 0; y < 12; y++)
                {
                    normalArray[x, y] = new Vector3(0.0f, 0.0f, 1.0f).normalized;
                }
            }
            var normalTexture = HeightmapUtils.CreateNormalTexture(normalArray);

            return(new UpdatedTerrainTextures()
            {
                HeightTexture = plainHeightTex,
                NormalTexture = normalTexture,
                TextureCoords = new MyRectangle(0, 0, 1, 1),
                TextureGlobalPosition = new MyRectangle(0, 0, 90, 90),
            });
        }
Ejemplo n.º 16
0
        public TerrainDetailGenerator CreateTerrainDetailGenerator(TextureWithSize mainTexture)
        {
            var featureAppliers =
                TerrainDetailProviderDebugUtils.CreateFeatureAppliers(_utTextureRendererProxy, ContainerGameObject,
                                                                      _commonExecutorUtProxy, _computeShaderExecutorObject);


            TerrainDetailGeneratorConfiguration generatorConfiguration = new TerrainDetailGeneratorConfiguration()
            {
                TerrainDetailImageSideDisjointResolution = 240
            };
            TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize()
            {
                Texture = mainTexture.Texture,
                Size    = new IntVector2(mainTexture.Size.X, mainTexture.Size.Y)
            }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator =
                new TerrainDetailGenerator(generatorConfiguration, _utTextureRendererProxy, fullFundationData,
                                           featureAppliers, _commonExecutorUtProxy);

            return(generator);
        }
Ejemplo n.º 17
0
        public DebugSlopedTerrainShapeDb(UTTextureRendererProxy textureRenderer)
        {
            var size             = new IntVector2(241, 241);
            var tex              = new Texture2D(size.X, size.Y, TextureFormat.ARGB32, true, true);
            var encodedHeightTex = new Texture2D(size.X, size.Y, TextureFormat.ARGB32, true, true);

            for (int x = 0; x < size.X; x++)
            {
                for (int y = 0; y < size.Y; y++)
                {
                    tex.SetPixel(x, y, new Color(0, 0, 0, 0));

                    //var distanceToCenter = 1 - (Vector2.Distance(new Vector2(120, 120), new Vector2(x, y)) /
                    //                            Mathf.Sqrt(120 * 120)) / 2;
                    //encodedHeightTex.SetPixel(x, y, HeightColorTransform.EncodeHeight(distanceToCenter / 100));

                    //var distanceToCenter = Mathf.Clamp01(
                    //    Mathf.Min(
                    //        Mathf.Abs(y - 100) / 50.0f,
                    //        Mathf.Abs(x - 100) / 50.0f)
                    //        ) / 300;

                    //encodedHeightTex.SetPixel(x, y, HeightColorTransform.EncodeHeight(distanceToCenter));


                    var heightInUnits = HeightDenormalizer.Default.Normalize(5);
                    var encodedHeight = HeightColorTransform.EncodeHeight(heightInUnits);
                    encodedHeightTex.SetPixel(x, y, encodedHeight);
                }
            }
            tex.Apply();
            encodedHeightTex.Apply();

            _blankTexture = new TextureWithSize()
            {
                Texture = tex,
                Size    = size
            };

            var transformator        = new TerrainTextureFormatTransformator(new CommonExecutorUTProxy());
            var encodedHeightTexture = new TextureWithSize()
            {
                Texture = encodedHeightTex,
                Size    = new IntVector2(241, 241)
            };
            var plainTex = transformator.EncodedHeightTextureToPlain(encodedHeightTexture);

            _heightTexture = new TextureWithSize()
            {
                Size    = new IntVector2(241, 241),
                Texture = plainTex
            };

            var pack = new UniformsPack();

            pack.SetTexture("_HeightmapTex", plainTex);
            pack.SetUniform("_HeightMultiplier", 80);
            ConventionalTextureInfo outTextureInfo =
                new ConventionalTextureInfo(size.X, size.Y, TextureFormat.ARGB32, true);

            var renderCoords = new MyRectangle(0, 0, 1, 1);
            TextureRenderingTemplate template = new TextureRenderingTemplate()
            {
                CanMultistep        = false,
                Coords              = renderCoords,
                OutTextureInfo      = outTextureInfo,
                RenderTextureFormat = RenderTextureFormat.ARGB32,
                ShaderName          = "Custom/Terrain/NormalmapGenerator",
                UniformPack         = pack,
                CreateTexture2D     = false
            };
            var outNormalTex = textureRenderer.AddOrder(template).Result;

            _normalTexture = new TextureWithSize()
            {
                Size    = size,
                Texture = outNormalTex
            };
        }
Ejemplo n.º 18
0
        private async Task MergeDetailObject(Dictionary <TerrainDetailCorner, TerrainDetailElement> sourceTextures,
                                             TextureWithSize sourceTexture, TextureWithSize outTexture, TerrainDetailCorner activeCorner, TextureWithSize scratchTexture)
        {
            var uniforms          = new UniformsPack();
            var cornersPresent    = new Vector4();
            var cornersMerged     = new Vector4();
            int activeCornerIndex = 0;

            var i = 0;

            foreach (var corner in TerrainDetailCorner.OrderedDirections)
            {
                if (corner == activeCorner)
                {
                    activeCornerIndex = i;
                }
                if (sourceTextures.ContainsKey(corner))
                {
                    cornersPresent[i] = 10;
                    if (sourceTextures[corner].CornersMergeStatus == CornersMergeStatus.MERGED)
                    {
                        cornersMerged[i] = 10;
                    }
                    uniforms.SetTexture("_Corner" + GetCornerTexUniformName(corner) + "Tex", sourceTextures[corner].Texture.Texture);
                }
                i++;
            }

            uniforms.SetUniform("_ActiveCornerIndex", activeCornerIndex);
            uniforms.SetUniform("_CornersMerged", cornersMerged);
            uniforms.SetTexture("_ScratchTex", scratchTexture.Texture);
            uniforms.SetUniform("_MergeMargin", _configuration.MergeMarginSize); // todo

            await _renderer.AddOrder(new TextureRenderingTemplate()
            {
                CanMultistep          = false,
                CreateTexture2D       = false,
                RenderTextureToModify = scratchTexture.Texture as RenderTexture, // todo
                ShaderName            = "Custom/TerrainDetailMerger/MergeIntoScratch",
                UniformPack           = uniforms,
                RenderingRectangle    = new IntRectangle(0, 0, scratchTexture.Size.X, scratchTexture.Size.Y),
                RenderTargetSize      = new IntVector2(scratchTexture.Size.X, scratchTexture.Size.Y),
            });


            IntRectangle renderingRectangle;

            if (activeCorner == TerrainDetailCorner.BottomLeft)
            {
                renderingRectangle = new IntRectangle(0, 0, 121, 121);
            }
            else if (activeCorner == TerrainDetailCorner.BottomRight)
            {
                renderingRectangle = new IntRectangle(120, 0, 121, 121);
            }
            else if (activeCorner == TerrainDetailCorner.TopLeft)
            {
                renderingRectangle = new IntRectangle(0, 120, 121, 121);
            }
            else if (activeCorner == TerrainDetailCorner.TopRight)
            {
                renderingRectangle = new IntRectangle(120, 120, 121, 121);
            }
            else
            {
                Preconditions.Fail("Unsupported activeCorner " + activeCorner);
                renderingRectangle = new IntRectangle(0, 0, 1, 1);
            }

            await _renderer.AddOrder(new TextureRenderingTemplate()
            {
                CanMultistep          = false,
                CreateTexture2D       = false,
                RenderTextureToModify = (RenderTexture)outTexture.Texture,
                ShaderName            = "Custom/TerrainDetailMerger/ScratchToActive",
                UniformPack           = uniforms,
                RenderingRectangle    = renderingRectangle,
                RenderTargetSize      = new IntVector2(241, 241),
            });
        }
Ejemplo n.º 19
0
        CreateGridBasedMockProvidingFunction(Dictionary <IntVector2, TextureWithSize> terrainDetailForGridElements, TextureWithSize defaultDetail)
        {
            var copyOfDictionary = terrainDetailForGridElements.ToDictionary(e => e.Key, e => e.Value);

            return(CreateSampleMockProvidingFunction((queryArea) =>
            {
                foreach (var pair in copyOfDictionary)
                {
                    var realPosition = new Vector2(pair.Key.X * 90f, pair.Key.Y * 90f);
                    if (Math.Abs(queryArea.X - realPosition.x) < 0.0001f && Math.Abs(queryArea.Y - realPosition.y) < 0.0001f)
                    {
                        return pair.Value;
                    }
                }
                if (defaultDetail == null)
                {
                    Preconditions.Fail("E911 Failed to return detail in " + queryArea);
                }
                return defaultDetail;
            }));
        }
Ejemplo n.º 20
0
        public async Task <TextureWithSize> MergeHeightDetailCorners(MyRectangle queryArea,
                                                                     TerrainCardinalResolution cardinalResolution, TextureWithSize baseTexture)
        {
            RetriveTerrainDetailProvider();

            var griddedTerrainDetail     = _alignmentCalculator.GetGriddedTerrainArea(queryArea, cardinalResolution);
            var sourceTerrainDetailTasks = new List <TerrainDetailNeighbourhoodDirections>()
            {
                TerrainDetailNeighbourhoodDirections.Left,
                TerrainDetailNeighbourhoodDirections.BottomLeft,
                TerrainDetailNeighbourhoodDirections.Bottom,
            }.Select(direction => new
            {
                direction,
                alignedPosition = _alignmentCalculator.GetAlignedTerrainArea(griddedTerrainDetail + direction.Movement, cardinalResolution)
            })
            .Where(p => _alignmentCalculator.AreaInMap(p.alignedPosition))
            .ToDictionary(
                p => p.direction,
                p => _terrainDetailProvider.RetriveTerrainDetailAsync(
                    TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY, p.alignedPosition, cardinalResolution, RequiredCornersMergeStatus.NOT_IMPORTANT)
                );

            var sourceTerrainDetails = new Dictionary <TerrainDetailNeighbourhoodDirections, TokenizedTerrainDetailElement>();

            foreach (var pair in sourceTerrainDetailTasks)
            {
                sourceTerrainDetails.Add(pair.Key, (await pair.Value).TokenizedElement);
            }

            var activeTerrainDetails = new TerrainDetailElement()
            {
                CornersMergeStatus = CornersMergeStatus.NOT_MERGED,
                DetailArea         = new MyRectangle(0, 0, 1, 1),
                Resolution         = cardinalResolution,
                Texture            = baseTexture
            };

            var outputTexture = await CreateOutputTexture(baseTexture);

            var scratchTextureSize = 121; //todo configurable
            var scratchTexture     = await _textureConciever.ConcieveRenderTextureAsync(new MyRenderTextureTemplate(scratchTextureSize, scratchTextureSize, RenderTextureFormat.RFloat, false, FilterMode.Point));

            var scratchTextureWithSize = new TextureWithSize()
            {
                Texture = scratchTexture,
                Size    = new IntVector2(scratchTextureSize, scratchTextureSize)
            };

            await MergeDetailObject(new Dictionary <TerrainDetailCorner, TerrainDetailElement>()
            {
                { TerrainDetailCorner.BottomLeft, activeTerrainDetails },
            }, baseTexture, outputTexture, TerrainDetailCorner.TopRight, scratchTextureWithSize);

            if (sourceTerrainDetails.ContainsKey(TerrainDetailNeighbourhoodDirections.Left)) // do not merge if one of merging elements was out of map boundaries
            {
                await MergeDetailObject(new Dictionary <TerrainDetailCorner, TerrainDetailElement>()
                {
                    { TerrainDetailCorner.BottomRight, activeTerrainDetails },
                    { TerrainDetailCorner.BottomLeft, sourceTerrainDetails[TerrainDetailNeighbourhoodDirections.Left].DetailElement },
                }, baseTexture, outputTexture, TerrainDetailCorner.TopLeft, scratchTextureWithSize);
            }

            if (sourceTerrainDetails.ContainsKey(TerrainDetailNeighbourhoodDirections.Left) &&
                sourceTerrainDetails.ContainsKey(TerrainDetailNeighbourhoodDirections.BottomLeft) &&
                sourceTerrainDetails.ContainsKey(TerrainDetailNeighbourhoodDirections.Bottom))
            {
                await MergeDetailObject(new Dictionary <TerrainDetailCorner, TerrainDetailElement>()
                {
                    { TerrainDetailCorner.TopRight, activeTerrainDetails },
                    { TerrainDetailCorner.TopLeft, sourceTerrainDetails[TerrainDetailNeighbourhoodDirections.Left].DetailElement },
                    { TerrainDetailCorner.BottomLeft, sourceTerrainDetails[TerrainDetailNeighbourhoodDirections.BottomLeft].DetailElement },
                    { TerrainDetailCorner.BottomRight, sourceTerrainDetails[TerrainDetailNeighbourhoodDirections.Bottom].DetailElement },
                }, baseTexture, outputTexture, TerrainDetailCorner.BottomLeft, scratchTextureWithSize);
            }

            if (sourceTerrainDetails.ContainsKey(TerrainDetailNeighbourhoodDirections.Bottom))
            {
                await MergeDetailObject(new Dictionary <TerrainDetailCorner, TerrainDetailElement>()
                {
                    { TerrainDetailCorner.TopLeft, activeTerrainDetails },
                    { TerrainDetailCorner.BottomLeft, sourceTerrainDetails[TerrainDetailNeighbourhoodDirections.Bottom].DetailElement },
                }, baseTexture, outputTexture, TerrainDetailCorner.BottomRight, scratchTextureWithSize);
            }

            await _commonExecutor.AddAction(() => GameObject.Destroy(scratchTexture));

            await TaskUtils.WhenAll(sourceTerrainDetails.Values.Select(c => c.Token)
                                    .Select(c => _terrainDetailProvider.RemoveTerrainDetailAsync(c)));

            return(outputTexture);
        }
Ejemplo n.º 21
0
 public TextureWithCoords(TextureWithSize sizedTexture, MyRectangle coords)
 {
     _sizedTexture = sizedTexture;
     _coords       = coords;
 }
        public void Start()
        {
            _unityThreadComputeShaderExecutorObject = new UnityThreadComputeShaderExecutorObject();
            var globalHeightTexture = SavingFileManager.LoadPngTextureFromFile(@"C:\inz\cont\n49_e019_1arc_v3.png",
                                                                               3600, 3600,
                                                                               TextureFormat.ARGB32, true, false);
            var sizedGlobalHeightTexture = new TextureWithSize()
            {
                Size    = new IntVector2(3600, 3600),
                Texture = globalHeightTexture
            };

            TaskUtils.SetGlobalMultithreading(true);

            _executionThreadProxy = new GenericAsyncExecutionThreadProxy("TerrainProviding");
            _executionThreadProxy.StartThreading(() => { });
            _executionThreadProxy.PostAction(async() =>
            {
                InitializeFields();
                //var tex0 = await CreateGenerateAndGenerateTexture(new List<RankedTerrainFeatureApplier>()
                //{
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 1,
                //        Applier = new RandomNoiseTerrainFeatureApplier(_utTextureRendererProxy, _commonExecutor,
                //            new Dictionary<TerrainCardinalResolution, RandomNoiseTerrainFeatureApplierConfiguration>
                //        {
                //            { TerrainCardinalResolution.LOW_RESOLUTION, new RandomNoiseTerrainFeatureApplierConfiguration() { DetailResolutionMultiplier = 1} },
                //            { TerrainCardinalResolution.MID_RESOLUTION, new RandomNoiseTerrainFeatureApplierConfiguration() {DetailResolutionMultiplier =  8}},
                //        }),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 2,
                //        Applier = new DiamondSquareTerrainFeatureApplier(
                //            new DiamondSquareCreator(_randomProvider), _commonExecutor,
                //            _utTextureRendererProxy),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 3,
                //        Applier = new ThermalErosionTerrainFeatureApplier(ContainerGameObject,
                //            _unityThreadComputeShaderExecutorObject, _commonExecutor),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 4,
                //        Applier = new HydraulicErosionTerrainFeatureApplier(ContainerGameObject,_unityThreadComputeShaderExecutorObject),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    //new RankedTerrainFeatureApplier()
                //    //{
                //    //    Rank = 6,
                //    //    Applier = new TweakedThermalErosionTerrainFeatureApplier(ContainerGameObject, _unityThreadComputeShaderExecutorObject),
                //    //    AvalibleResolutions = new List<TerrainCardinalResolution>()
                //    //    {
                //    //        TerrainCardinalResolution.LOW_RESOLUTION,
                //    //        TerrainCardinalResolution.MID_RESOLUTION,
                //    //        TerrainCardinalResolution.MAX_RESOLUTION
                //    //    }
                //    //}

                //}, sizedGlobalHeightTexture);

                //var tex1 = await CreateGenerateAndGenerateTexture(new List<RankedTerrainFeatureApplier>()
                //{
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 1,
                //        Applier = new RandomNoiseTerrainFeatureApplier(_utTextureRendererProxy, _commonExecutor,
                //            new Dictionary<TerrainCardinalResolution, RandomNoiseTerrainFeatureApplierConfiguration>
                //        {
                //            { TerrainCardinalResolution.LOW_RESOLUTION, new RandomNoiseTerrainFeatureApplierConfiguration() { DetailResolutionMultiplier = 1} },
                //            { TerrainCardinalResolution.MID_RESOLUTION, new RandomNoiseTerrainFeatureApplierConfiguration() {DetailResolutionMultiplier =  8}},
                //        }),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 2,
                //        Applier = new DiamondSquareTerrainFeatureApplier(
                //            new DiamondSquareCreator(_randomProvider), _commonExecutor,
                //            _utTextureRendererProxy),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 3,
                //        Applier = new ThermalErosionTerrainFeatureApplier(ContainerGameObject,
                //            _unityThreadComputeShaderExecutorObject, _commonExecutor),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    new RankedTerrainFeatureApplier()
                //    {
                //        Rank = 6,
                //        Applier = new HydraulicErosionTerrainFeatureApplier(ContainerGameObject,_unityThreadComputeShaderExecutorObject),
                //        AvalibleResolutions = new List<TerrainCardinalResolution>()
                //        {
                //            TerrainCardinalResolution.LOW_RESOLUTION,
                //            TerrainCardinalResolution.MID_RESOLUTION,
                //            TerrainCardinalResolution.MAX_RESOLUTION
                //        }
                //    },
                //    //new RankedTerrainFeatureApplier()
                //    //{
                //    //    Rank = 5,
                //    //    Applier = new TweakedThermalErosionTerrainFeatureApplier(ContainerGameObject, _unityThreadComputeShaderExecutorObject),
                //    //    AvalibleResolutions = new List<TerrainCardinalResolution>()
                //    //    {
                //    //        TerrainCardinalResolution.MID_RESOLUTION,
                //    //        TerrainCardinalResolution.MAX_RESOLUTION
                //    //    }
                //    //}

                //}, sizedGlobalHeightTexture);


                //_resultBag.Add(new MyTexturePair()
                //{
                //    Tex0 = tex0,
                //    Tex1 = tex1
                //});
            });
        }
 public async Task <RenderTexture> EncodedHeightTextureToPlainAsync(TextureWithSize encodedTexture)
 {
     return(await _commonExecutor.AddAction(() => { return EncodedHeightTextureToPlain(encodedTexture); }));
 }