Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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);
        }