Ejemplo n.º 1
0
 private string GetCornerTexUniformName(TerrainDetailCorner corner)
 {
     if (corner == TerrainDetailCorner.BottomLeft)
     {
         return("BottomLeft");
     }
     else
     if (corner == TerrainDetailCorner.BottomRight)
     {
         return("BottomRight");
     }
     else if (corner == TerrainDetailCorner.TopLeft)
     {
         return("TopLeft");
     }
     else if (corner == TerrainDetailCorner.TopRight)
     {
         return("TopRight");
     }
     else
     {
         Preconditions.Fail("Unsupported corner " + corner);
         return(null);
     }
 }
Ejemplo n.º 2
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),
            });
        }