/// <summary> /// Handles MouseInput (for Hovering & Selection) /// </summary> /// <param name="inputDeps">InputDependencies for Jobs</param> /// <param name="mousePos">MousePosition on Screen</param> /// <returns>Output-Dependencies for Jobs</returns> private JobHandle HandleMouseInput(JobHandle inputDeps, Vector2 mousePos) { // Create Ray for Raycast Ray r = camera.ScreenPointToRay(mousePos); // Create RaycastJob (Parallel) RayCastJob <Selectable> jobRayCast = new RayCastJob <Selectable>(r, intersectionResults); // Schedule RaycastJob JobHandle returnHandle = jobRayCast.Schedule(this, inputDeps); // Create SortingJob (Not Parallel) InsertionSortJob <RayIntersectionResult> sortJob = new InsertionSortJob <RayIntersectionResult>(intersectionResults); // Schedule SortingJob with dependency on RaycastJob returnHandle = sortJob.Schedule(returnHandle); // Create EntityArrays for Hovered & Selected, to be used in SelectClosestIntersectionJob // The 'Create' is performed in its own Job, and the OUT Jobhandles can be used as dependecies for when the Arrays are required NativeArray <Entity> hovered = currentHovered.ToEntityArray(Allocator.TempJob, out JobHandle gatherHovered); NativeArray <Entity> selected = currentSelected.ToEntityArray(Allocator.TempJob, out JobHandle gatherSelected); // Combine Dependencies for SelectionJob returnHandle = JobHandle.CombineDependencies(returnHandle, gatherHovered, gatherSelected); // Create SelectionJob SelectClosestIntersectionJob selectionJob = new SelectClosestIntersectionJob(intersectionResults, hovered, selected, Input.GetMouseButtonDown(0), commandBufferSystem.CreateCommandBuffer()); // Create final handle (SelectionJob with dependency on SortingJob & Creates) returnHandle = selectionJob.Schedule(returnHandle); // Add dependency to commandbuffer commandBufferSystem.AddJobHandleForProducer(returnHandle); return(returnHandle); }
protected override JobHandle OnUpdate(JobHandle inputDeps) { if (!Input.GetMouseButtonDown(0) || Camera.main == null) { return(inputDeps); } inputDeps = JobHandle.CombineDependencies(inputDeps, _buildPhysicsWorldSystem.FinalJobHandle); var screenRay = Camera.main.ScreenPointToRay(Input.mousePosition); var job = new RayCastJob { Input = new RaycastInput { Start = screenRay.origin, End = screenRay.GetPoint(2000), Filter = new CollisionFilter { BelongsTo = CollisionGroups.Cast, CollidesWith = CollisionGroups.Drone | CollisionGroups.Hub, GroupIndex = 0 } }, World = _buildPhysicsWorldSystem.PhysicsWorld, Clicked = new NativeArray <Entity>(1, Allocator.TempJob) }; var handle = job.Schedule(inputDeps); _endFramePhysicsSystem.HandlesToWaitFor.Add(handle); handle = new PreSelectJob { Clicked = job.Clicked, Buffer = _barrier.CreateCommandBuffer(), }.Schedule(handle); _barrier.AddJobHandleForProducer(handle); return(handle); }