private static CollisionWorld.ClosestRayResultCallback SetupCallback(
            CollisionManager collision, Camera viewportCamera, System.Windows.Forms.MouseEventArgs e)
        {
            var mouse = new
            {
                Near = viewportCamera.Project(new Vector2(e.X, e.Y), depth: -1),
                Far  = viewportCamera.Project(new Vector2(e.X, e.Y), depth: 1)
            };

            var callback = new CollisionWorld.ClosestRayResultCallback(
                mouse.Near,
                mouse.Far);

            callback.Flags = (uint)BulletSharp.InternalEdgeAdjustFlags.TriangleConvexBackfaceMode;
            collision.World.RayTest(mouse.Near, mouse.Far, callback);
            return(callback);
        }
        private static CollisionWorld.ClosestRayResultCallback SetupAllRayCallback(
            CollisionManager collision, Camera viewportCamera, System.Windows.Forms.MouseEventArgs e)
        {
            var mouse = new
            {
                Near = viewportCamera.Project(new Vector2(e.X, e.Y), depth: -1),
                Far  = viewportCamera.Project(new Vector2(e.X, e.Y), depth: 1)
            };

            var callback = new CollisionWorld.ClosestRayResultCallback(
                mouse.Near,
                mouse.Far);

            callback.CollisionFilterGroup = CollisionFilterGroups.StaticFilter;
            callback.CollisionFilterMask  = CollisionFilterGroups.StaticFilter;
            collision.World.RayTest(mouse.Near, mouse.Far, callback);
            return(callback);
        }
        public void OnMouseMove(CollisionManager CollisionManager, Camera ActiveCamera, System.Windows.Forms.MouseEventArgs e)
        {
            var mouse = new
            {
                Near = ActiveCamera.Project(new Vector2(e.X, e.Y), depth: -0.90f),
                Far  = ActiveCamera.Project(new Vector2(e.X, e.Y), depth: 1)
            };

            Matrix4 from = Matrix4.Translation(mouse.Near);
            Matrix4 to   = Matrix4.Translation(mouse.Far);

            var d = (mouse.Far - mouse.Near).Normalized();

            using (var callback = new CollisionWorld.ClosestConvexResultCallback(mouse.Near, mouse.Far))
            {
                callback.CollisionFilterGroup = CollisionFilterGroups.StaticFilter;
                callback.CollisionFilterMask  = CollisionFilterGroups.StaticFilter;

                CollisionManager.World.ConvexSweepTest((ConvexShape)CollisionObject.CollisionShape, from, to, callback);

                var lookingNormal = (callback.ConvexToWorld - callback.ConvexFromWorld).Normalized();
                var dot           = Vector3.Dot(callback.HitNormalWorld, lookingNormal);
                Console.WriteLine(callback.HitNormalWorld);
                if (callback.HasHit)
                {
                    if (!this.Selected)
                    {
                        return;
                    }
                    var matrix    = this.WorldMatrix.ClearTranslation();
                    var collMtrix = this.Model.RenderModel.compressionInfo[0].ToExtentsMatrix();

                    Vector3 linVel, angVel;
                    TransformUtil.CalculateVelocity(from, to, 1.0f, out linVel, out angVel);
                    Matrix4 T;
                    TransformUtil.IntegrateTransform(from, linVel, angVel, callback.ClosestHitFraction, out T);

                    this.WorldMatrix = T;
                }
            }
        }