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