// Use this for initialization
        void Start()
        {
            string        bilFilePath    = @"C:\n49_e019_1arc_v3.bil";
            HeightmapFile heightmapFile  = new HeightmapFile();
            const int     filePixelWidth = 3601;
            //heightmapFile.LoadFile(bilFilePath, 3601);
            //heightmapFile.MirrorReflectHeightDataInXAxis();

            MyTotalHeightmap totalHeightmap = new MyTotalHeightmap();

            //const int subTerrainCount = 14;
            int minSubmapWidth = 256; //(int)Math.Floor((double)filePixelWidth/subTerrainCount)-1 ;
            List <SubmapPreparmentOrder> preparmentOrders = new List <SubmapPreparmentOrder>
            {
                newPreparmentOrder(0, 0, 4, 4, minSubmapWidth, 6, 0),
                newPreparmentOrder(0, 4, 4, 6, minSubmapWidth, 7, 0),
                newPreparmentOrder(4, 0, 6, 4, minSubmapWidth, 5, 0),
                newPreparmentOrder(0, 10, 4, 4, minSubmapWidth, 4, 0),

                newPreparmentOrder(4, 4, 2, 2, minSubmapWidth, 2 + 4, 0),
                newPreparmentOrder(4, 6, 2, 2, minSubmapWidth, 2 + 4, 0),

                newPreparmentOrder(4, 8, 2, 2, minSubmapWidth, 2 + 4, 0),
                newPreparmentOrder(6, 4, 2, 2, minSubmapWidth, 2 + 4, 0),
                newPreparmentOrder(6, 8, 2, 2, minSubmapWidth, 3, 0),
                newPreparmentOrder(8, 4, 2, 2, minSubmapWidth, 2 + 4, 0),

                newPreparmentOrder(8, 6, 2, 2, minSubmapWidth, 2 + 4, 0),

                //newPreparmentOrder(8,8,2,2,minSubmapWidth, 2+4, 1), was lithe this
                newPreparmentOrder(8, 8, 1, 1, minSubmapWidth, 3, 0),
                newPreparmentOrder(9, 8, 1, 1, minSubmapWidth, 3, 0),
                newPreparmentOrder(9, 8, 1, 1, minSubmapWidth, 3, 0),
                newPreparmentOrder(9, 9, 1, 1, minSubmapWidth, 0, 1),


                newPreparmentOrder(6, 6, 2, 2, minSubmapWidth, 2 + 4, 0),
                newPreparmentOrder(10, 4, 4, 6, minSubmapWidth, 3 + 2, 0),

                newPreparmentOrder(10, 10, 4, 4, minSubmapWidth, 4 + 1, 0),
                newPreparmentOrder(4, 10, 6, 4, minSubmapWidth, 3 + 4, 0),
                newPreparmentOrder(10, 0, 4, 4, minSubmapWidth, 3 + 4, 0),
            };

            SubmapPreparer submapPreparer = new SubmapPreparer();
            //var submaps = submapPreparer.PrepareSubmaps(heightmapFile.GlobalHeightArray, preparmentOrders);
            //totalHeightmap.LoadHeightmap(submaps.Ring0Submaps);


            Ring1HeightArrayCreator creator = new Ring1HeightArrayCreator();
            //var ring1Array = creator.CreateRing1HeightmapArray(submaps.Ring1Submaps[0].Heightmap);
            //SavingFileManager.SaveToFile("map.dat", ring1Array);
            var ring1Array = SavingFileManager.LoadFromFile("map.dat", 2048, 2048);

            //ring1Array = BasicHeightmapModifier.AddConstant(-0.5f, ring1Array);
            ring1Array = BasicHeightmapModifier.Multiply(1000, ring1Array);

            _ring1Tree = new Ring1Tree();

            var tempHeightmapInfo = new GlobalHeightmapInfo(2000, 1000, 80000, 80000);

            //_ring1Tree.CreateHeightmap(ring1Array, heightmapFile.GlobalHeightmapInfo);
            _ring1Tree.CreateHeightmap_TODO_DELETE(ring1Array);
        }
        // Use this for initialization
        void Start()
        {
            _updatableContainer = new UpdatableContainer();
            TaskUtils.SetGlobalMultithreading(true);

            int minSubmapWidth = 256; //(int)Math.Floor((double)filePixelWidth/subTerrainCount)-1 ;
            var ring1Array     = SavingFileManager.LoadFromFile("map.dat", 2048, 2048);

            ring1Array = BasicHeightmapModifier.Multiply(1000, ring1Array);
            _ring1Tree = new Ring1Tree();

            //////////////////

            var tessalationRequirementTextureGenerator = new TessalationRequirementTextureGenerator();
            var tessalationReqTexture =
                tessalationRequirementTextureGenerator.GenerateTessalationRequirementTexture(ring1Array, 64);

            var heightmapBundle = SavingFileManager.LoadHeightmapBundlesFromFiles("heightmapBundle", 4, 2048);

            var submapTextures = new Ring1SubmapTextures(heightmapBundle, tessalationReqTexture);

            /// /// VISIBILITY TEXTURE
            var visibilityTextureSideLength = 16;
            var visibilityTexture           = new Texture2D(visibilityTextureSideLength, visibilityTextureSideLength,
                                                            TextureFormat.RFloat, false);

            visibilityTexture.filterMode = FilterMode.Point;

            var visibilityTextureProcessorProxy =
                new Ring1VisibilityTextureProcessorUTProxy(new Ring1VisibilityTextureProcessor(visibilityTexture));

            _updatableContainer.AddUpdatableElement(visibilityTextureProcessorProxy);


            var visibilityTextureChangeGrabber = new Ring1VisibilityTextureChangeGrabber();

            var terrainParentGameObject = new GameObject("TerrainParent");

            var unityCoordsCalculator = new UnityCoordsCalculator(new Vector2(256, 256));
            var orderGrabber          = new Ring1PaintingOrderGrabber();

            var painterProxy = new RingTerrainPainterUTProxy(new RingTerrainPainter());

            _updatableContainer.AddUpdatableElement(painterProxy);

            painterProxy.Update();

            var mainRespondingProxy = new Ring1NodeEventMainRespondingProxy(new Ring1NodeEventMainResponder());

            _otherThreadActionPairs.Add(new OtherThreadProxyAndActionPair()
            {
                Proxy           = mainRespondingProxy,
                EveryPostAction =
                    () =>
                {
                    var delta = visibilityTextureChangeGrabber.RetriveVisibilityChanges();

                    if (delta.AnyChange)
                    {
                        var visibilityTextureChagnes = visibilityTextureChangeGrabber.RetriveVisibilityChanges();
                        visibilityTextureProcessorProxy.AddOrder(visibilityTextureChagnes);
                    }

                    if (orderGrabber.IsAnyOrder)
                    {
                        painterProxy.AddOrder(orderGrabber.RetriveOrderAndClear());
                    }
                }
            });

            var commonExecutor = new CommonExecutorUTProxy();

            _updatableContainer.AddUpdatableElement(commonExecutor);

            TerrainShapeDbProxy terrainShapeDbProxy = new TerrainShapeDbProxy(
                FETerrainShapeDbInitialization.CreateTerrainShapeDb(null /*todo here*/, commonExecutor, new TerrainDetailAlignmentCalculator(240),
                                                                    false, false, false, null));

            _otherThreadActionPairs.Add(new OtherThreadProxyAndActionPair()
            {
                Proxy = terrainShapeDbProxy
            });


            var meshGeneratorProxy = new MeshGeneratorUTProxy(new MeshGeneratorService());

            _updatableContainer.AddUpdatableElement(meshGeneratorProxy);

            //var eventCollector = new Ring1NodeEventCollector((node) =>
            //    new Ring1NodeDirectHeightTerrain(
            //        node,
            //        visibilityTextureChangeGrabber,
            //        visibilityTexture,
            //        terrainParentGameObject,
            //        unityCoordsCalculator,
            //        orderGrabber,
            //        terrainShapeDbProxy,
            //        ring1Array,
            //        meshGeneratorProxy));
            var eventCollector = new Ring1NodeEventCollector(new FromLambdaListenersCreator((node) =>
                                                                                            new Ring1ListenerToGRingListener(
                                                                                                new Ring1NodeShaderHeightTerrain(
                                                                                                    node,
                                                                                                    visibilityTextureChangeGrabber,
                                                                                                    visibilityTexture,
                                                                                                    terrainParentGameObject,
                                                                                                    unityCoordsCalculator,
                                                                                                    orderGrabber,
                                                                                                    terrainShapeDbProxy,
                                                                                                    meshGeneratorProxy,
                                                                                                    null)))); //todo if you want this to work

            var ring1Proxy = new Ring1TreeProxy(_ring1Tree);

            _otherThreadActionPairs.Add(new OtherThreadProxyAndActionPair()
            {
                Proxy           = ring1Proxy,
                EveryPostAction =
                    () =>
                {
                    if (eventCollector.Any)
                    {
                        mainRespondingProxy.AddOrder(eventCollector.RetriveOrderAndClear());
                    }
                }
            });

            StartThreading();
            ring1Proxy.CreateHeightmap(
                new Ring1Tree.RootNodeCreationParameters()
            {
                UnityCoordsCalculator = unityCoordsCalculator,
                NodeListener          = eventCollector,
                PrecisionDistances    = Ring1TestDefaults.PrecisionDistances,
                InitialCameraPosition = Vector3.zero,
            });
        }