public void CreateDecal(Vector3 decalPosition, BoundingBox area, string textureName, float lifetime, float size, DecalLayers layer)
        {
            Texture2D texture = Renderer.Instance.LookupTexture(textureName);
            Decal decal = new Decal(ref decalPosition, texture, lifetime, size, layer);

            Vector3 difference = area.Max - area.Min;
            float length = difference.Z;
            float height = difference.Y;
            float width = difference.X;

            BEPUphysics.CollisionShapes.ConvexShapes.SphereShape sphereShape = new BEPUphysics.CollisionShapes.ConvexShapes.SphereShape(width);
            //BEPUphysics.CollisionShapes.ConvexShapes.BoxShape boxShape = new BEPUphysics.CollisionShapes.ConvexShapes.BoxShape(width, height, length);
            BEPUphysics.MathExtensions.RigidTransform startingTransform = new BEPUphysics.MathExtensions.RigidTransform(decalPosition);
            Vector3 sweep = Vector3.Zero;

            // area is is local space, transform to world space
            area.Min += decalPosition;
            area.Max += decalPosition;

            // use the broad phase's acceleration structure to find all the objects which are in the decal area
            var candidates = BEPUphysics.ResourceManagement.Resources.GetBroadPhaseEntryList();
            decalsWorld.BroadPhase.QueryAccelerator.GetEntries(area, candidates);

            foreach (BEPUphysics.BroadPhaseEntries.BroadPhaseEntry candidate in candidates)
            {
                if (candidate.OwningActor != null)
                {
                    BEPUphysics.RayHit rayHit;
                    bool gotHit = false;
                    Vector3 location = Vector3.Zero;
                    Vector3 up = Vector3.Up;

                    for(int i = 0; i < cardinalRays.Count; i++)
                    {
                        Ray ray = cardinalRays[i];
                        ray.Position = decalPosition;
                        if (candidate.RayCast(ray, width, out rayHit))
                        {
                            gotHit = true;
                            location = rayHit.Location;
                            up = ups[i];
                            break;
                        }
                    }

                    if (!gotHit)
                    {
                        gotHit = true;
                        Actor actor = (Actor)candidate.OwningActor;
                        location = actor.PhysicsObject.Position;
                        //if (candidate.ConvexCast(sphereShape, ref startingTransform, ref sweep, out rayHit))
                        //{
                        //    gotHit = true;
                        //    location = rayHit.Location;
                        //}
                    }

                    if (gotHit)
                    {
                        // apply the decal
                        Actor actor = (Actor)candidate.OwningActor;
                        if (!decal.ApplyToActor(actor, location, up))
                            break;
                    }
                }
            }

            AddDecal(decal);
        }
 public SphereShape(float radius)
 {
     sphereShape = new BEPUphysics.CollisionShapes.ConvexShapes.SphereShape(radius);
     ComputeMassProperties();
 }