Esempio n. 1
0
        /// <summary>
        /// Adds a ray and target to test an intersection. If the target is pickable,
        /// and an intersection exists, the records are added to the query.
        /// </summary>
        /// <param name="ray">Ray to test with</param>
        /// <param name="pickable">Target to test against</param>
        /// <returns>True if an intersection was found, false otherwise.</returns>
        public bool AddPick(Ray ray, IPickable pickable)
        {
            if (pickable == null)
            {
                return(false);
            }

            if (pickable.IsPickable)
            {
                BoundingVolume              bv         = pickable.WorldBounding;
                BoundingIntersectionRecord  bvRecord   = new BoundingIntersectionRecord();
                PrimitiveIntersectionRecord primRecord = new PrimitiveIntersectionRecord();
                if (bv != null)
                {
                    bv.IntersectsWhere(ref ray, out bvRecord);
                }
                else
                {
                    return(false);
                }

                if (bvRecord.IntersectionCount > 0 && _primitivePickingEnabled)
                {
                    primRecord = pickable.IntersectsPrimitivesWhere(ray);

                    if (primRecord.IntersectionCount > 0)
                    {
                        _results.Add(new PickResult(ray, pickable, bvRecord, primRecord));
                        _sorted = false;
                        return(true);
                    }
                }
                else if (bvRecord.IntersectionCount > 0)
                {
                    _results.Add(new PickResult(ray, pickable, bvRecord));
                    _sorted = false;
                    return(true);
                }
            }
            return(false);
        }