Beispiel #1
0
        public static HkContactBodyData?CastShapeReturnContactBodyData(Vector3D to, HkShape shape, ref MatrixD transform, uint collisionFilter, float extraPenetration, bool ignoreConvexShape = true)
        {
            m_resultWorlds.Clear();
            Clusters.Intersects(to, m_resultWorlds);

            if (m_resultWorlds.Count == 0)
            {
                return(null);
            }

            var world = m_resultWorlds[0];

            Matrix transformF = transform;

            transformF.Translation = (Vector3)(transform.Translation - world.AABB.Center);

            Vector3 toF = (Vector3)(to - world.AABB.Center);

            HkContactBodyData?result = ((HkWorld)world.UserData).CastShapeReturnContactBodyData(toF, shape, ref transformF, collisionFilter, extraPenetration);

            if (result == null)
            {
                return(null);
            }
            HkContactBodyData cpd = result.Value;

            cpd.HitPosition += world.AABB.Center;
            return(cpd);
        }
Beispiel #2
0
        public static bool CastShapeReturnContactBodyDatas(Vector3D to, HkShape shape, ref MatrixD transform, uint collisionFilter, float extraPenetration, List <HkContactBodyData> result, bool ignoreConvexShape = true)
        {
            m_resultWorlds.Clear();
            Clusters.Intersects(to, m_resultWorlds);

            if (m_resultWorlds.Count == 0)
            {
                return(false);
            }

            var world = m_resultWorlds[0];

            Matrix transformF = transform;

            transformF.Translation = (Vector3)(transform.Translation - world.AABB.Center);

            Vector3 toF = (Vector3)(to - world.AABB.Center);

            m_resultShapeCasts.Clear();

            if (((HkWorld)world.UserData).CastShapeReturnContactBodyDatas(toF, shape, ref transformF, collisionFilter, extraPenetration, m_resultShapeCasts))
            {
                foreach (var res in m_resultShapeCasts)
                {
                    HkContactBodyData cpd = res.Value;
                    cpd.HitPosition += world.AABB.Center;
                    result.Add(cpd);
                }

                return(true);
            }


            return(false);
        }