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; } }