private bool FindInteractionVolumeHit(Ray ray, out int interactionVolumeHitIndex, out IntersectInfo info) { interactionVolumeHitIndex = -1; if (interactionVolumes.Count == 0 || interactionVolumes[0].CollisionVolume == null) { info = null; return(false); } List <IRayTraceable> mesheTraceables = new List <IRayTraceable>(); foreach (InteractionVolume interactionVolume in interactionVolumes) { IRayTraceable traceData = interactionVolume.CollisionVolume; mesheTraceables.Add(new Transform(traceData, interactionVolume.TotalTransform)); } IRayTraceable allObjects = BoundingVolumeHierarchy.CreateNewHierachy(mesheTraceables); info = allObjects.GetClosestIntersection(ray); if (info != null) { for (int i = 0; i < interactionVolumes.Count; i++) { List <IRayTraceable> insideBounds = new List <IRayTraceable>(); interactionVolumes[i].CollisionVolume.GetContained(insideBounds, info.closestHitObject.GetAxisAlignedBoundingBox()); if (insideBounds.Contains(info.closestHitObject)) { interactionVolumeHitIndex = i; return(true); } } } return(false); }
public IntersectInfo GetClosestIntersection(Ray ray) { Ray localRay = GetLocalSpaceRay(ray); IntersectInfo localIntersection = child.GetClosestIntersection(localRay); IntersectInfo globalIntersection = GetGlobalSpaceInfo(localIntersection); return(globalIntersection); }
public IntersectInfo GetClosestIntersection(Ray ray) { if (ray.Intersection(Aabb)) { IRayTraceable checkFirst = nodeA; IRayTraceable checkSecond = nodeB; if (ray.directionNormal[splitingPlane] < 0) { checkFirst = nodeB; checkSecond = nodeA; } IntersectInfo infoFirst = checkFirst.GetClosestIntersection(ray); if (infoFirst != null && infoFirst.hitType != IntersectionType.None) { if (ray.isShadowRay) { return(infoFirst); } else { ray.maxDistanceToConsider = infoFirst.distanceToHit; } } if (checkSecond != null) { IntersectInfo infoSecond = checkSecond.GetClosestIntersection(ray); if (infoSecond != null && infoSecond.hitType != IntersectionType.None) { if (ray.isShadowRay) { return(infoSecond); } else { ray.maxDistanceToConsider = infoSecond.distanceToHit; } } if (infoFirst != null && infoFirst.hitType != IntersectionType.None && infoFirst.distanceToHit >= 0) { if (infoSecond != null && infoSecond.hitType != IntersectionType.None && infoSecond.distanceToHit < infoFirst.distanceToHit && infoSecond.distanceToHit >= 0) { return(infoSecond); } else { return(infoFirst); } } return(infoSecond); // we don't have to test it because it didn't hit. } return(infoFirst); } return(null); }
long CalculateIntersectCostsForItem(IRayTraceable item, int numInterations) { Stopwatch timer = new Stopwatch(); timer.Start(); for (int i = 0; i < numInterations; i++) { item.GetClosestIntersection(GetRandomIntersectingRay()); } return timer.ElapsedMilliseconds; }
long CalculateIntersectCostsForItem(IRayTraceable item, int numInterations) { Stopwatch timer = new Stopwatch(); timer.Start(); for (int i = 0; i < numInterations; i++) { item.GetClosestIntersection(GetRandomIntersectingRay()); } return(timer.ElapsedMilliseconds); }
private IntersectInfo FindNextIntersections(IRayTraceable element, Ray ray, IntersectInfo info, IntersectionType intersectionType) { // get all the intersection for the object Ray currentRayCheckBackfaces = new Ray(ray); currentRayCheckBackfaces.intersectionType = intersectionType; currentRayCheckBackfaces.minDistanceToConsider = ((info.hitPosition + ray.directionNormal * Ray.sameSurfaceOffset) - ray.origin).Length; currentRayCheckBackfaces.maxDistanceToConsider = double.PositiveInfinity; return(element.GetClosestIntersection(currentRayCheckBackfaces)); }
private bool FindMeshGroupHitPosition(Vector2 screenPosition, out int meshHitIndex) { meshHitIndex = 0; if (MeshGroupExtraData.Count == 0 || MeshGroupExtraData[0].meshTraceableData == null) { return(false); } List <IRayTraceable> mesheTraceables = new List <IRayTraceable>(); for (int i = 0; i < MeshGroupExtraData.Count; i++) { foreach (IRayTraceable traceData in MeshGroupExtraData[i].meshTraceableData) { mesheTraceables.Add(new Transform(traceData, MeshGroupTransforms[i].TotalTransform)); } } IRayTraceable allObjects = BoundingVolumeHierarchy.CreateNewHierachy(mesheTraceables); Vector2 meshViewerWidgetScreenPosition = meshViewerWidget.TransformFromParentSpace(this, screenPosition); Ray ray = meshViewerWidget.TrackballTumbleWidget.GetRayFromScreen(meshViewerWidgetScreenPosition); IntersectInfo info = allObjects.GetClosestIntersection(ray); if (info != null) { meshSelectInfo.planeDownHitPos = info.hitPosition; meshSelectInfo.lastMoveDelta = new Vector3(); for (int i = 0; i < MeshGroupExtraData.Count; i++) { List <IRayTraceable> insideBounds = new List <IRayTraceable>(); foreach (IRayTraceable traceData in MeshGroupExtraData[i].meshTraceableData) { traceData.GetContained(insideBounds, info.closestHitObject.GetAxisAlignedBoundingBox()); } if (insideBounds.Contains(info.closestHitObject)) { meshHitIndex = i; return(true); } } } return(false); }
private IntersectInfo FindNextIntersections(IRayTraceable element, Ray ray, IntersectInfo info, IntersectionType intersectionType) { // get all the intersection for the object Ray currentRayCheckBackfaces = new Ray(ray); currentRayCheckBackfaces.intersectionType = intersectionType; currentRayCheckBackfaces.minDistanceToConsider = ((info.hitPosition + ray.direction * Ray.sameSurfaceOffset) - ray.origin).Length; currentRayCheckBackfaces.maxDistanceToConsider = double.PositiveInfinity; return element.GetClosestIntersection(currentRayCheckBackfaces); }