void OnDrawGizmos()
    {
        if (tiles == null)
        {
            return;
        }

        Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        int2 worldtilePosition = TileUtil.WorldToWorldtile(mousePosition);

        if (!TileUtil.BoundaryCheck(worldtilePosition, mapSize))
        {
            return;
        }

        int tileIndex = TileUtil.To1DIndex(worldtilePosition, mapSize);
        int tile      = tiles[tileIndex];

        if (tileInformations[tile].isSolid)
        {
            return;
        }

        Handles.Label(mousePosition, waterDensities[tileIndex].ToString());
    }
    void Update()
    {
        currentFlowSpeed = Mathf.Clamp01(flowSpeed * Time.deltaTime);

        if (fluidUpdator == null)
        {
            fluidUpdator = StartCoroutine(nameof(UpdateFluid));
        }
        SunLightPropagation();
        TorchLightPropagation(ref torchRedLightPropagationQueue, ref torchRedLightRemovalQueue, LightType.R);
        TorchLightPropagation(ref torchGreenLightPropagationQueue, ref torchGreenLightRemovalQueue, LightType.G);
        TorchLightPropagation(ref torchBlueLightPropagationQueue, ref torchBlueLightRemovalQueue, LightType.B);
        UpdateChunks();

        Vector3 mousePosition     = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        int2    worldTilePosition = TileUtil.WorldToWorldtile(mousePosition);

        if (!TileUtil.BoundaryCheck(worldTilePosition, mapSize))
        {
            return;
        }

        if (Input.GetMouseButton(0))
        {
            SetTile(worldTilePosition, tileInformations[1].id);
        }
        else if (Input.GetMouseButton(1))
        {
            SetTile(worldTilePosition, tileInformations[0].id);
            fluidQueue.Enqueue(new Tuple <int, float>(TileUtil.To1DIndex(worldTilePosition, mapSize), 0.0f));
        }
        else if (Input.GetKeyDown(KeyCode.T))
        {
            SetTile(worldTilePosition, tileInformations[3].id);
        }
        else if (Input.GetKey(KeyCode.W))
        {
            SetTile(worldTilePosition, tileInformations[2].id);
            fluidQueue.Enqueue(new Tuple <int, float>(TileUtil.To1DIndex(worldTilePosition, mapSize), waterDensities[TileUtil.To1DIndex(worldTilePosition, mapSize)] + 3.0f));
        }
    }