Trying to make a terrain tool and i am wondering how i can make my own paint tool

So i am trying to make a road tool where it lowers the height and also paints a texture onto the terrain, here is what i have so far:
It lowers terrain on the terrain mesh but i have yet to make it work with painting a texture, i want to have the ui that the built-in paint texture uses + the ui i have already done.

using UnityEngine;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using UnityEngine.TerrainTools;
using UnityEditor.ShortcutManagement;
using UnityEditorInternal;

namespace UnityEditor.TerrainTools
{

    internal class RoadMaker : TerrainPaintTool<RoadMaker>
    {
        private float m_BrushOpacity = 0.1f;
        private float m_BrushSize = 25f;
        private float m_BrushRotation = 0f;

        Material m_Material = null;
        Material GetPaintMaterial()
        {
            if (m_Material == null)
                m_Material = new Material(Shader.Find("PaintTextureAdvance"));
            return m_Material;
        }

        public override string GetName()
        {
            return "Road Tool";
        }

        public override string GetDescription()
        {
            return "Left click to trench and paint.\n\nHold shift and left click to trench.";
        }

        private void RenderIntoPaintContext(UnityEngine.TerrainTools.PaintContext paintContext, Texture brushTexture, UnityEngine.TerrainTools.BrushTransform brushXform)
        {
            // Get the built-in painting Material reference
            Material mat = UnityEngine.TerrainTools.TerrainPaintUtility.GetBuiltinPaintMaterial();
            // Bind the current brush texture
            mat.SetTexture("_BrushTex", brushTexture);
            // Bind the tool-specific shader properties
            var opacity = -m_BrushOpacity / 100000;
            mat.SetVector("_BrushParams", new Vector4(opacity, 0.0f, 0.0f, 0.0f));
            // Setup the material for reading from/writing into the PaintContext texture data. This is a necessary step to setup the correct shader properties for appropriately transforming UVs and sampling textures within the shader
            UnityEngine.TerrainTools.TerrainPaintUtility.SetupTerrainToolMaterialProperties(paintContext, brushXform, mat);
            // Render into the PaintContext's destinationRenderTexture using the built-in painting Material - the id for the Raise/Lower pass is 0.
            Graphics.Blit(paintContext.sourceRenderTexture, paintContext.destinationRenderTexture, mat, 0);
        }

        // Render Tool previews in the SceneView
        public override void OnRenderBrushPreview(Terrain terrain, IOnSceneGUI editContext)
        {
            // Dont render preview if this isnt a Repaint
            if (Event.current.type != EventType.Repaint) return;

            // Only do the rest if user mouse hits valid terrain
            if (!editContext.hitValidTerrain) return;

            // Get the current BrushTransform under the mouse position relative to the Terrain
            UnityEngine.TerrainTools.BrushTransform brushXform = UnityEngine.TerrainTools.TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.raycastHit.textureCoord, m_BrushSize, m_BrushRotation);
            // Get the PaintContext for the current BrushTransform. This has a sourceRenderTexture from which to read existing Terrain texture data.
            UnityEngine.TerrainTools.PaintContext paintContext = UnityEngine.TerrainTools.TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds(), 1);
            // Get the built-in Material for rendering Brush Previews
            Material previewMaterial = TerrainPaintUtilityEditor.GetDefaultBrushPreviewMaterial();
            // Render the brush preview for the sourceRenderTexture. This will show up as a projected brush mesh rendered on top of the Terrain
            TerrainPaintUtilityEditor.DrawBrushPreview(paintContext, TerrainBrushPreviewMode.SourceRenderTexture, editContext.brushTexture, brushXform, previewMaterial, 0);
            // Render changes into the PaintContext destinationRenderTexture
            RenderIntoPaintContext(paintContext, editContext.brushTexture, brushXform);
            // Restore old render target.
            RenderTexture.active = paintContext.oldRenderTexture;
            // Bind the sourceRenderTexture to the preview Material. This is used to compute deltas in height
            previewMaterial.SetTexture("_HeightmapOrig", paintContext.sourceRenderTexture);
            // Render a procedural mesh displaying the delta/displacement in height from the source Terrain texture data. When modifying Terrain height, this shows how much the next paint operation will alter the Terrain height
            TerrainPaintUtilityEditor.DrawBrushPreview(paintContext, TerrainBrushPreviewMode.DestinationRenderTexture, editContext.brushTexture, brushXform, previewMaterial, 1);
            // Cleanup resources
            UnityEngine.TerrainTools.TerrainPaintUtility.ReleaseContextResources(paintContext);
        }

        // Perform painting operations that modify the Terrain texture data
        public override bool OnPaint(Terrain terrain, IOnPaint editContext)
        {
            // Get the current BrushTransform under the mouse position relative to the Terrain
            UnityEngine.TerrainTools.BrushTransform brushXform = UnityEngine.TerrainTools.TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.uv, m_BrushSize, m_BrushRotation);
            // Get the PaintContext for the current BrushTransform. This has a sourceRenderTexture from which to read existing Terrain texture data
            // and a destinationRenderTexture into which to write new Terrain texture data
            UnityEngine.TerrainTools.PaintContext paintContext = UnityEngine.TerrainTools.TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds());
            // Call the common rendering function used by OnRenderBrushPreview and OnPaint
            RenderIntoPaintContext(paintContext, editContext.brushTexture, brushXform);
            // Commit the modified PaintContext with a provided string for tracking Undo operations. This function handles Undo and resource cleanup for you
            UnityEngine.TerrainTools.TerrainPaintUtility.EndPaintHeightmap(paintContext, "Terrain Paint - Raise or Lower Height");

            // Return whether or not Trees and Details should be hidden while painting with this Terrain Tool
            return true;
        }

        public override void OnInspectorGUI(Terrain terrain, IOnInspectorGUI editContext)
        {
            m_BrushOpacity = EditorGUILayout.Slider("Opacity", m_BrushOpacity, 0, 100);
            m_BrushSize = EditorGUILayout.Slider("Size", m_BrushSize, .001f, 100f);
            m_BrushRotation = EditorGUILayout.Slider("Rotation", m_BrushRotation, 0, 360);
        }
    }
}