private void CreateLayerArraysAndProperLayeredGraph()
        {
            int numberOfLayers = this.gridLayerOffsets.Count;

            this.layerOffsets = new double[numberOfLayers];
            int i = numberOfLayers - 1;

            foreach (KeyValuePair <int, double> kv in this.gridLayerOffsets)
            {
                layerOffsets[i]          = kv.Value;
                gridLayerToLayer[kv.Key] = i--;
            }

            int nOfNodes = CountTotalNodesIncludingVirtual(nodesToIndices[tree.Root]);

            ////debugging !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            //int tt = 0;
            //foreach (IntEdge ie in this.intGraph.Edges)
            //    tt += this.OriginalNodeLayer(ie.Source) - this.OriginalNodeLayer(ie.Target) - 1;
            //if (tt + this.intGraph.Nodes.Count != nOfNodes)
            //    throw new Exception();

            int[] layering = new int[nOfNodes];

            List <int>[] layers = new List <int> [numberOfLayers];
            for (i = 0; i < numberOfLayers; i++)
            {
                layers[i] = new List <int>();
            }

            WalkTreeAndInsertLayerEdges(layering, layers);

            this.layerArrays = new LayerArrays(layering);

            int[][] ll = layerArrays.Layers = new int[numberOfLayers][];

            i = 0;
            foreach (List <int> layer in layers)
            {
                ll[i++] = layer.ToArray();
            }

            this.properLayeredGraph = new ProperLayeredGraph(intGraph);
        }
Пример #2
0
        /// <summary>
        /// Returns the same arrays but with no empty layers.
        /// </summary>
        /// <returns></returns>
        internal LayerArrays DropEmptyLayers()
        {
            int[] drop    = new int[this.Layers.Length];
            int   dropVal = 0;

            for (int i = 0; i < this.Layers.Length; i++)
            {
                drop[i] = dropVal;
                if (this.Layers[i].Length == 0)
                {
                    dropVal++;
                }
            }

            if (dropVal == 0)
            {
                return(this);
            }

            //we do have empty layers
            int[] ny = new int[Y.Length];
            for (int i = 0; i < ny.Length; i++)
            {
                ny[i] = Y[i] - drop[Y[i]];
            }


            //copy the layers itself
            int[][] nls = new int[this.layers.Length - dropVal][];
            for (int i = 0; i < layers.Length; i++)
            {
                if (layers[i].Length > 0)
                {
                    nls[i - drop[i]] = (int[])layers[i].Clone();
                }
            }

            LayerArrays la = new LayerArrays(ny);

            la.layers = nls;

            return(la);
        }
Пример #3
0
            private void DrawInstanced([NotNull] CommandBuffer cmd, ArraySegment <int> visible, int shaderPass)
            {
                if (visible.Count < 1)
                {
                    return;
                }

                EnsureArrayCapacity(ref _matrices, visible.Count);
                EnsureArrayCapacity(ref _saturation, visible.Count);
                EnsureArrayCapacity(ref _edgeFadeout, visible.Count);
                EnsureArrayCapacity(ref _edgeSharpness, visible.Count);

                if (Batch.Permutation.LayerMode == LayerMode.None)
                {
                    _yLayerInputStart  = null;
                    _yLayerInputExtent = null;
                    _yLayerOutputStart = null;
                    _yLayerOutputEnd   = null;
                }
                else
                {
                    EnsureArrayCapacity(ref _yLayerInputStart, visible.Count);
                    EnsureArrayCapacity(ref _yLayerInputExtent, visible.Count);
                    EnsureArrayCapacity(ref _yLayerOutputStart, visible.Count);
                    EnsureArrayCapacity(ref _yLayerOutputEnd, visible.Count);
                }

                if (Batch.Permutation.LayerMode != LayerMode.Triplanar)
                {
                    _xLayerInputStart  = null;
                    _xLayerInputExtent = null;
                    _xLayerOutputStart = null;
                    _xLayerOutputEnd   = null;
                    _zLayerInputStart  = null;
                    _zLayerInputExtent = null;
                    _zLayerOutputStart = null;
                    _zLayerOutputEnd   = null;
                }
                else
                {
                    EnsureArrayCapacity(ref _xLayerInputStart, visible.Count);
                    EnsureArrayCapacity(ref _xLayerInputExtent, visible.Count);
                    EnsureArrayCapacity(ref _xLayerOutputStart, visible.Count);
                    EnsureArrayCapacity(ref _xLayerOutputEnd, visible.Count);
                    EnsureArrayCapacity(ref _zLayerInputStart, visible.Count);
                    EnsureArrayCapacity(ref _zLayerInputExtent, visible.Count);
                    EnsureArrayCapacity(ref _zLayerOutputStart, visible.Count);
                    EnsureArrayCapacity(ref _zLayerOutputEnd, visible.Count);
                }

                // Copy decal data into arrays
                var arx = LayerArrays.Create(_xLayerInputStart, _xLayerInputExtent, _xLayerOutputStart, _xLayerOutputEnd);
                var ary = LayerArrays.Create(_yLayerInputStart, _yLayerInputExtent, _yLayerOutputStart, _yLayerOutputEnd);
                var arz = LayerArrays.Create(_zLayerInputStart, _zLayerInputExtent, _zLayerOutputStart, _zLayerOutputEnd);

                for (var i = 0; i < visible.Count; i++)
                {
                    // ReSharper disable once PossibleNullReferenceException
                    var decal = Batch.Decals[visible.Array[visible.Offset + i]];

                    decal.Properties.LoadInto(
                        i,
                        _saturation,
                        _edgeFadeout,
                        _edgeSharpness,
                        arx,
                        ary,
                        arz
                        );
                    _matrices[i] = decal.Decal.WorldTransform;
                }

                // Set arrays into instancing property block
                _instancingPropertyBlock.Clear();
                InstanceProperties.LoadInto(
                    _instancingPropertyBlock,
                    _saturation,
                    _edgeFadeout,
                    _edgeSharpness,
                    arx,
                    ary,
                    arz
                    );

                var mat = Batch.GetMaterial(true);

                cmd.DrawMeshInstanced(_box, 0, mat, shaderPass, _matrices, visible.Count, _instancingPropertyBlock);
            }
 public RecoveryLayerCalculator(LayerArrays recoveredLayerArrays)
 {
     layers = recoveredLayerArrays;
 }