Esempio n. 1
0
        public void Evaluate(int spreadMax)
        {
            FNodeBuffer.SliceCount      = 1;
            FTransformBuffer.SliceCount = 1;
            FInvalidate = false;

            if (FNodeBuffer[0] == null)
            {
                FNodeBuffer[0] = new DX11Resource <DX11DynamicStructuredBuffer <LBVH.Node> >();
            }
            if (FTransformBuffer[0] == null)
            {
                FTransformBuffer[0] = new DX11Resource <DX11DynamicStructuredBuffer <Matrix> >();
            }

            //FEntities.Sync();
            if (FApply[0] || FFirst)
            {
                BVHBuilder builder = new BVHBuilder();
                node_data      = builder.Build(FEntities.ToList());
                FNodeCount[0]  = node_data.Length;
                FLeafCount[0]  = FEntities.SliceCount;
                FLeafOffset[0] = FEntities.SliceCount > 0 ? FEntities.SliceCount - 1 : 0;

                if (node_data != null)
                {
                    transform_data = builder.GetTransformsForLastBuild();

                    FBoxes.SliceCount = node_data.Length;
                    for (int i = 0; i < node_data.Length; ++i)
                    {
                        LBVH.Node node = node_data[i];
                        Vector3   min  = node_data[i].min;
                        Vector3   max  = node_data[i].max;
                        FBoxes[i] = VMath.Transform(
                            (new Vector3D(min.X + max.X, min.Y + max.Y, min.Z + max.Z)) * 0.5,
                            new Vector3D(max.X - min.X, max.Y - min.Y, max.Z - min.Z),
                            Vector3D.Zero);
                    }
                }
                else
                {
                    FBoxes.SliceCount = 0;
                }

                FInvalidate = true;
                FFirst      = false;
                FNodeBuffer.Stream.IsChanged      = true;
                FTransformBuffer.Stream.IsChanged = true;
            }
        }