public override void Generate(TileData data, StopToken stop)
        {
            Coord locality = TownGlobalObject.GetIndexAtCoord(data.area.Coord);

            if (TownGlobalObject.townsData[locality] == null)
            {
                return;
            }

            //SplineSys src = data.ReadInletProduct(splineIn);
            SplineSys src = data.ReadInletProduct(this);

            // MatrixWorld heights = data.ReadInletProduct(heightIn);
            if (src == null)
            {
                return;
            }

            if (!enabled)// || heights == null)
            {
                data.StoreProduct(this, src); return;
            }


            if (stop != null && stop.stop)
            {
                return;
            }
            SplineSys dst = new SplineSys(src);

            // at this point cleanse. it should be clean. but clean anyway?
            dst.Clamp((Vector3)data.area.active.worldPos, (Vector3)data.area.active.worldSize);


            // WE only do main stage
            if (data.isDraft)
            {
                data.StoreProduct(this, dst); return;
            }

            if (dst.lines.Length == 0)
            {
                // null. there are no segments to add.
                //  TownGlobalObject.GetSplineList(data.area.Coord);
                data.StoreProduct(this, dst);
                return;
            }
            // this is already completed processed by all threads /n/ times and marked as done in OnTileApplied()
            else if (TownGlobalObject.isSplinesMeshRenderedOnTile.ContainsKey(data.area.Coord))
            {
                return;
            }

            //{
            //    // we already processed the tile.
            //    data.StoreProduct(this, dst);
            //    return;
            //}


            // these might not be linked but probably are???
            foreach (var item in dst.lines)
            {
                var subdic  = new Dictionary <Coord, List <Vector3> >();
                var sublist = new List <SplineMesh.Spline>();

                // track to ensure we have at a minimum two nodes...
                int nodesInThisSegmentGroup = 0;


                // use this rather than the monobehaviour
                TypedSpline typed = new TypedSpline();

                //   SplineMesh.Spline mysm = new SplineMesh.Spline();

                // these should be linked  - Hopefully this will pickup on a partially aborted WHILE

                for (int segmentindex = 0; segmentindex < item.segments.Length; segmentindex++)
                {
                    // They will be in pairs by now. we need to do the logic to string them back together, here.

                    Segment segmentToProcess = item.segments[segmentindex];

                    // nodesInThisSegmentGroup = AddNodeReturnIncrementedTotalCount(data, nodesInThisSegmentGroup, segmentToProcess, mysm);

                    nodesInThisSegmentGroup = AddNodeToListReturnIncrementedTotalCount(nodesInThisSegmentGroup, segmentToProcess, typed.nodes);

                    segmentindex++;
                }
                typed.chosenType = (int)chosenType;
                typed.tryToFloor = TryToFloor;

                //update a value
                if (TownGlobalObject.splinesNodesDataForTile.ContainsKey(data.area.Coord))
                {
                    TownGlobalObject.splinesNodesDataForTile[data.area.Coord].Add(typed);
                }
                else
                {// create a new one
                    TownGlobalObject.GetSplineList(data.area.Coord).Add(typed);
                }
                //TownGlobalObject.splinesNodesDataForTile.AddOrUpdate(data.area.Coord, TownGlobalObject.GetSplineList(data.area.Coord), (key, current) => { current.Add(typed);  return current; }   );

                //  TownGlobalObject.GetSplineList(data.area.Coord).Add(typed);


                // here we would loop if the segmentindex has not been reached.
                // might have to watch for weird single node edge cases but oh well. Bridge. Come to it.
            }

            // We just store the original.

            //   data.StoreProduct(this, src);

            // We store TRUNCATED copy.

            data.StoreProduct(this, dst);
        }
    public static void OnTileAppliedRenderMeshSplines(TerrainTile tile, TileData data, StopToken stop)
    {
        /*
         *
         * IN THE NEXT SECTION WE HANDLE THE SPLINE MESH RENDERING
         *
         *
         */

        //TODO: Just make a parent holder for all splines on a tile and delete THAT


        //for (int i = tile.transform.childCount - 1; i > 0; i--)
        //{

        //    if (tile.transform.GetChild(i).name.StartsWith("__SPLINE__"))
        //        DestroyImmediate(tile.transform.GetChild(i).gameObject);

        //}

        // we only do this on Main pass and when we actually have made something to process.
        if (data.isDraft)// || !TownGlobalObject.splinesNodesDataForTile.ContainsKey(data.area.Coord))
        {
            return;
        }

        //  int numberOfSplineNodes = 0;


        if (!TownGlobalObject.splinesNodesDataForTile.ContainsKey(data.area.Coord))
        {
            // this is not a mesh spline tile
            return;
        }

        // By this point this should absolutely exist - unless there is no spline data!
        int totalNumberOfListsOfSplineMeshSplines = TownGlobalObject.splinesNodesDataForTile[data.area.Coord].Count;

        // There is nothing in the list
        if (totalNumberOfListsOfSplineMeshSplines == 0)
        {
            return;
        }


        //public void Test(ConcurrentDictionary<string, int> dictionary)
        //{
        //    dictionary.AddOrUpdate("key", 1, (key, current) => current += 2);
        //}



        //  TownHolder.Instance.SplineMeshWallMasterSpawner.SetActive(false);

        List <GameObject> thingsToActivate = new List <GameObject>();



        Coord locality = TownGlobalObject.GetIndexAtCoord(data.area.Coord);



        // Coord offset = locality - data.area.Coord;

        Coord offset = data.area.Coord;

        // SplinePowerExtended

        var DynamicHolder = TownHolder.Instance.MapMagicObjectReference.transform.Find(string.Format("Tile {0},{1}", offset.x, offset.z));


        // For like the 4th time we check this  TODO: Make it part of the Town Instancing
        TownGlobalObject.townsData[locality].TownGameObject ??= new GameObject(TownGlobalObject.townsData[locality].name);


        //create or use the holder now it has the right name.
        var go = TownGlobalObject.townsData[locality].TownGameObject;



        // We walk over the nodes assuming pairs?

        for (int i = 0; i < totalNumberOfListsOfSplineMeshSplines; i++)
        {
            //SplineMesh.Spline();
            TypedSpline newValue = TownGlobalObject.GetSplineList(data.area.Coord)[i];

            // No splines for us...
            if (newValue.nodes.Count == 0)
            {
                continue;
            }


            if ((newValue.nodes[1].Position - newValue.nodes[0].Position).sqrMagnitude == 0)
            {
                continue;
            }

            //  Transform child = null;


            // TODO make this an actual hash and shove it in a table
            // string hash = string.Format("{0}_{1}_{4}_{5}|{2}_{3}", startvec.x, startvec.y, startvec.z, endvec.x, endvec.y, endvec.z);
            //  string fullhash = string.Format("{0}_{1}|{4}_{5}|{2}_{3}", startvec.x, startvec.y, startvec.z, endvec.x, endvec.y, endvec.z);
            string hash = string.Format("__SPLINE__{0}__{2}|{3}__{5}", newValue.nodes[0].Position.x, newValue.nodes[0].Position.y, newValue.nodes[0].Position.z, newValue.nodes[newValue.nodes.Count - 1].Position.x, newValue.nodes[newValue.nodes.Count - 1].Position.y, newValue.nodes[newValue.nodes.Count - 1].Position.z);


            // TODO replace this with a lookup  SOOOOON


            //foreach (Transform children in DynamicHolder.parent)
            //{
            //   // if(child.IsNull())
            //    child ??= children.Find(hash);
            //}

            //// we already rendered this  remove the gmeobject then and do it again.?
            //if (child !=null)
            //    {
            //        var code = child.GetComponent<SplineMesh.Spline>();
            //        bool wipeit = false;
            //        for (int nodeat = 0; nodeat < code.nodes.Count; nodeat++)
            //        {

            //            var thisnode = code.nodes[nodeat];
            //            if (thisnode.Position.y == 0)
            //            {
            //                wipeit = true;
            //            }
            //        }

            //        if (wipeit)
            //        {
            //            DestroyImmediate(child.gameObject);
            //        }
            //        else
            //        {
            //            continue;
            //        }

            //    }



            var newSpline = ((objectRendered)newValue.chosenType) switch
            {
                objectRendered.wall => GameObject.Instantiate(TownHolder.Instance.SplineMeshWallMasterSpawner, DynamicHolder, true),
                objectRendered.fence => GameObject.Instantiate(TownHolder.Instance.SplineMeshFenceMasterSpawner, DynamicHolder, true),
                objectRendered.gatehouse => GameObject.Instantiate(TownHolder.Instance.SplineMeshGatehouseMasterSpawner, DynamicHolder, true),
                _ => GameObject.Instantiate(TownHolder.Instance.SplineMeshWallMasterSpawner, DynamicHolder, true),
            };

            newSpline.name = hash + ((objectRendered)newValue.chosenType).ToString();

            newSpline.GetComponent <SplineMesh.Spline>().nodes = newValue.nodes;


            if (newValue.tryToFloor)
            {
                var scrp = newSpline.AddComponent <AlignNodesToTerrainOnEnable>();

                //  scrp.checkVal = 0.07f;
            }

            thingsToActivate.Add(newSpline);


            // mark it as finally processed. but only if we havent already.

            //  if (!TownGlobalObject.isSplinesMeshRenderedOnTile.ContainsKey(data.area.Coord))
            //       TownGlobalObject.isSplinesMeshRenderedOnTile.Add(data.area.Coord, true);
        }

        // Activate them as a group.
        for (int i = 0; i < thingsToActivate.Count; i++)
        {
            thingsToActivate[i].SetActive(true);
        }
    }