protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            if (m_MouseGroup.CalculateLength() == 0)
            {
                return(inputDeps);
            }

            var handle = JobHandle.CombineDependencies(inputDeps, m_BuildPhysicsWorldSystem.FinalJobHandle);

            if (Input.GetMouseButtonDown(0) && (Camera.main != null))
            {
                var mice           = m_MouseGroup.ToComponentDataArray <MousePick>(Allocator.TempJob);
                var IgnoreTriggers = mice[0].IgnoreTriggers != 0;
                mice.Dispose();

                // Schedule picking job, after the collision world has been built
                handle = new Pick
                {
                    CollisionWorld   = m_BuildPhysicsWorldSystem.PhysicsWorld.CollisionWorld,
                    NumDynamicBodies = m_BuildPhysicsWorldSystem.PhysicsWorld.NumDynamicBodies,
                    SpringData       = SpringDatas,
                    RayInput         = MousePickBehaviour.CreateRayCastFromMouse(),
                    Near             = Camera.main.nearClipPlane,
                    Forward          = Camera.main.transform.forward,
                    IgnoreTriggers   = IgnoreTriggers,
                }.Schedule(JobHandle.CombineDependencies(handle, m_BuildPhysicsWorldSystem.FinalJobHandle));

                PickJobHandle = handle;

                handle.Complete(); // TODO.ma figure out how to do this properly...we need a way to make physics sync wait for
                // any user jobs that touch the component data, maybe a JobHandle LastUserJob or something that the user has to set
            }

            if (Input.GetMouseButtonUp(0))
            {
                SpringDatas[0] = new SpringData();
            }

            return(handle);
        }
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            if (m_MouseGroup.CalculateLength() == 0)
            {
                return(inputDeps);
            }

            var Positions = GetComponentDataFromEntity <Translation>();

            // If there's a pick job, wait for it to finish
            if (m_PickSystem.PickJobHandle != null)
            {
                JobHandle.CombineDependencies(inputDeps, m_PickSystem.PickJobHandle.Value).Complete();
            }

            // If there's a picked entity, drag it
            MousePickSystem.SpringData springData = m_PickSystem.SpringDatas[0];
            var physicsWorld = m_PickSystem.m_BuildPhysicsWorldSystem.PhysicsWorld;

            if (springData.Dragging != 0)
            {
                Entity entity = m_PickSystem.SpringDatas[0].Entity;

                if (!m_WasDragging)
                {
                    GameMgr.g.PlayPickMonsterSoundEffect(entity);
                }

                m_WasDragging = true;
                Translation posComponent = Positions[entity];
                m_SelectedEntity = entity;

                var hits = new NativeList <RaycastHit>(Allocator.TempJob);
                physicsWorld.CollisionWorld.CastRay(MousePickBehaviour.CreateRayCastFromMouse(), ref hits);
                var terrainEntities = m_TerrainEntityQuery.ToEntityArray(Allocator.TempJob);
                foreach (var terrainEntity in terrainEntities)
                {
                    var index = physicsWorld.GetRigidBodyIndex(terrainEntity);
                    foreach (var hit in hits.ToArray())
                    {
                        if (hit.RigidBodyIndex == index)
                        {
                            posComponent.Value.x = hit.Position.x;
                            posComponent.Value.z = hit.Position.z;
                            Positions[entity]    = posComponent;
                            break;
                        }
                    }
                }

                hits.Dispose();
                terrainEntities.Dispose();
            }
            else if (m_WasDragging)
            {
                m_WasDragging = false;
                var hits = new NativeList <RaycastHit>(Allocator.TempJob);
                physicsWorld.CollisionWorld.CastRay(MousePickBehaviour.CreateRayCastFromMouse(), ref hits);

                var roomEntities = m_RoomEntityQuery.ToEntityArray(Allocator.TempJob);
                foreach (var room in roomEntities)
                {
                    var index = physicsWorld.GetRigidBodyIndex(room);
                    foreach (var hit in hits.ToArray())
                    {
                        if (hit.RigidBodyIndex == index)
                        {
                            GameMgr.MoveMonsterToRoom(m_SelectedEntity, room, 0);
                        }
                    }
                }

                hits.Dispose();
                roomEntities.Dispose();
            }

            return(inputDeps);
        }