protected override void OnCreate() { m_abilityStateIdleMask = EntityManager.GetEntityQueryMask(GetEntityQuery(typeof(AbilityStateIdle))); m_abilityStateActiveMask = EntityManager.GetEntityQueryMask(GetEntityQuery(typeof(AbilityStateActive))); m_abilityStateCooldownMask = EntityManager.GetEntityQueryMask(GetEntityQuery(typeof(AbilityStateCooldown))); m_abilityRequestDeactivateMask = EntityManager.GetEntityQueryMask(GetEntityQuery(typeof(AbilityRequestDeactivate))); }
/// <summary> /// Gets an <see cref="EntityQueryMask"/> that can be used to quickly match if an entity belongs to an EntityQuery. /// There is a maximum limit of 1024 EntityQueryMasks that can be created. EntityQueryMasks cannot be created /// from EntityQueries with filters. /// </summary> /// <param name="query">The EntityQuery that describes the EntityQueryMask.</param> /// <returns>The EntityQueryMask corresponding to the EntityQuery.</returns> public EntityQueryMask GetEntityQueryMask(EntityQuery query) { if (query.HasFilter()) { throw new Exception("GetEntityQueryMask can only be called on an EntityQuery without a filter applied to it." + " You can call EntityQuery.ResetFilter to remove the filters from an EntityQuery."); } if (query.m_QueryData->EntityQueryMask.IsCreated()) { return(query.m_QueryData->EntityQueryMask); } if (m_EntityQueryManager.m_EntityQueryMasksAllocated >= 1024) { throw new Exception("You have reached the limit of 1024 unique EntityQueryMasks, and cannot generate any more."); } var mask = new EntityQueryMask( (byte)(m_EntityQueryManager.m_EntityQueryMasksAllocated / 8), (byte)(1 << (m_EntityQueryManager.m_EntityQueryMasksAllocated % 8)), query.EntityComponentStore); m_EntityQueryManager.m_EntityQueryMasksAllocated++; for (var i = 0; i < query.m_QueryData->MatchingArchetypes.Length; ++i) { query.m_QueryData->MatchingArchetypes.Ptr[i]->Archetype->QueryMaskArray[mask.Index] |= mask.Mask; } query.m_QueryData->EntityQueryMask = mask; return(mask); }
protected override void OnCreate() { m_HierarchyChildMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(Parent), typeof(LocalToWorld) } }) ); m_NonTriggerDynamicBodyMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(Translation), typeof(Rotation), typeof(PhysicsVelocity) }, None = new ComponentType[] { typeof(StatefulTriggerEvent) } }) ); }
/// <summary> /// Gets an <see cref="EntityQueryMask"/> that can be used to quickly match if an entity belongs to an EntityQuery. /// There is a maximum limit of 1024 EntityQueryMasks that can be created. EntityQueryMasks cannot be created /// from EntityQueries with filters. /// </summary> /// <remarks>Note that EntityQueryMask only filters by Archetype, it doesn't support EntityQuery shared component or change filtering.</remarks> /// <param name="query">The EntityQuery that describes the EntityQueryMask.</param> /// <returns>The EntityQueryMask corresponding to the EntityQuery.</returns> public EntityQueryMask GetEntityQueryMask(EntityQuery query) { var access = GetCheckedEntityDataAccess(); var queryImpl = query._GetImpl(); if (queryImpl->_QueryData->EntityQueryMask.IsCreated()) { return(queryImpl->_QueryData->EntityQueryMask); } if (access->EntityQueryManager->m_EntityQueryMasksAllocated >= 1024) { throw new Exception("You have reached the limit of 1024 unique EntityQueryMasks, and cannot generate any more."); } var mask = new EntityQueryMask( (byte)(access->EntityQueryManager->m_EntityQueryMasksAllocated / 8), (byte)(1 << (access->EntityQueryManager->m_EntityQueryMasksAllocated % 8)), access->EntityComponentStore); access->EntityQueryManager->m_EntityQueryMasksAllocated++; for (var i = 0; i < queryImpl->_QueryData->MatchingArchetypes.Length; ++i) { queryImpl->_QueryData->MatchingArchetypes.Ptr[i]->Archetype->QueryMaskArray[mask.Index] |= mask.Mask; } queryImpl->_QueryData->EntityQueryMask = mask; return(mask); }
protected override void OnCreate() { m_ExportPhysicsWorld = World.GetOrCreateSystem <ExportPhysicsWorld>(); m_TriggerSystem = World.GetOrCreateSystem <TriggerEventConversionSystem>(); m_EndFramePhysicsSystem = World.GetOrCreateSystem <EndFramePhysicsSystem>(); m_HierarchyChildMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(Parent), typeof(LocalToWorld) } }) ); m_NonTriggerDynamicBodyMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(Translation), typeof(Rotation), typeof(PhysicsVelocity) }, None = new ComponentType[] { typeof(StatefulTriggerEvent) } }) ); }
protected override void OnCreate() { m_RootsQuery = GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <LocalToWorld>(), ComponentType.ReadOnly <Child>() }, None = new ComponentType[] { typeof(Parent) }, Options = EntityQueryOptions.FilterWriteGroup }); m_LocalToWorldWriteGroupMask = EntityManager.GetEntityQueryMask(GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(LocalToWorld), ComponentType.ReadOnly <LocalToParent>(), ComponentType.ReadOnly <Parent>() }, Options = EntityQueryOptions.FilterWriteGroup })); }
public EntityQuery CreateEntityQuery(EntityComponentStore *entityComponentStore, ManagedComponentStore managedComponentStore, ArchetypeQuery *query, int queryCount, ComponentType *component, int componentCount) { //@TODO: Validate that required types is subset of archetype filters all... int hash = (int)math.hash(component, componentCount * sizeof(ComponentType)); for (var i = 0; i < queryCount; ++i) { hash = hash * 397 ^ query[i].GetHashCode(); } EntityQueryData *cachedQuery = null; if (m_EntityGroupDataCache.TryGetFirstValue(hash, out var entityGroupDataIndex, out var iterator)) { do { var possibleMatch = m_EntityGroupDatas.Ptr[entityGroupDataIndex]; if (Matches(possibleMatch, query, queryCount, component, componentCount)) { cachedQuery = possibleMatch; break; } } while (m_EntityGroupDataCache.TryGetNextValue(out entityGroupDataIndex, ref iterator)); } if (cachedQuery == null) { cachedQuery = (EntityQueryData *)ChunkAllocate <EntityQueryData>(); cachedQuery->RequiredComponentsCount = componentCount; cachedQuery->RequiredComponents = (ComponentType *)ChunkAllocate <ComponentType>(componentCount, component); InitializeReaderWriter(cachedQuery, component, componentCount); cachedQuery->ArchetypeQueryCount = queryCount; cachedQuery->ArchetypeQuery = (ArchetypeQuery *)ChunkAllocate <ArchetypeQuery>(queryCount, query); for (var i = 0; i < queryCount; ++i) { cachedQuery->ArchetypeQuery[i].All = (int *)ChunkAllocate <int>(cachedQuery->ArchetypeQuery[i].AllCount, query[i].All); cachedQuery->ArchetypeQuery[i].Any = (int *)ChunkAllocate <int>(cachedQuery->ArchetypeQuery[i].AnyCount, query[i].Any); cachedQuery->ArchetypeQuery[i].None = (int *)ChunkAllocate <int>(cachedQuery->ArchetypeQuery[i].NoneCount, query[i].None); cachedQuery->ArchetypeQuery[i].AllAccessMode = (byte *)ChunkAllocate <byte>(cachedQuery->ArchetypeQuery[i].AllCount, query[i].AllAccessMode); cachedQuery->ArchetypeQuery[i].AnyAccessMode = (byte *)ChunkAllocate <byte>(cachedQuery->ArchetypeQuery[i].AnyCount, query[i].AnyAccessMode); cachedQuery->ArchetypeQuery[i].NoneAccessMode = (byte *)ChunkAllocate <byte>(cachedQuery->ArchetypeQuery[i].NoneCount, query[i].NoneAccessMode); } cachedQuery->MatchingArchetypes = new UnsafeMatchingArchetypePtrList(entityComponentStore); cachedQuery->EntityQueryMask = new EntityQueryMask(); for (var i = 0; i < entityComponentStore->m_Archetypes.Length; ++i) { var archetype = entityComponentStore->m_Archetypes.Ptr[i]; AddArchetypeIfMatching(archetype, cachedQuery); } m_EntityGroupDataCache.Add(hash, m_EntityGroupDatas.Length); m_EntityGroupDatas.Add(cachedQuery); } return(new EntityQuery(cachedQuery, m_JobSafetyManager, entityComponentStore, managedComponentStore)); }
protected override void OnCreate() { _AssetDependencyTracker = new AssetDependencyTracker <Entity>(EntityScenesPaths.SubSceneImporterType, "Import EntityScene"); _Changed = new NativeList <AssetDependencyTracker <Entity> .Completed>(32, Allocator.Persistent); m_ValidSceneMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <SceneReference>(), ComponentType.ReadOnly <RequestSceneLoaded>(), ComponentType.ReadOnly <AssetDependencyTrackerState>() }, None = new[] { ComponentType.ReadOnly <DisableSceneResolveAndLoad>(), } })); m_AddScenes = GetEntityQuery( new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <SceneReference>(), ComponentType.ReadOnly <RequestSceneLoaded>() }, None = new[] { ComponentType.ReadOnly <DisableSceneResolveAndLoad>(), ComponentType.ReadOnly <AssetDependencyTrackerState>() } }); //@TODO: This syntax is horrible. We need a reactive query syntax that lets me simply invert the m_AddScenes EntityQueryDesc m_RemoveScenes = GetEntityQuery( new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <AssetDependencyTrackerState>() }, None = new[] { ComponentType.ReadOnly <SceneReference>(), ComponentType.ReadOnly <RequestSceneLoaded>() } }, new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <AssetDependencyTrackerState>(), ComponentType.ReadOnly <DisableSceneResolveAndLoad>() } }, new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <AssetDependencyTrackerState>(), ComponentType.ReadOnly <Disabled>() } } ); }
internal TimeEditor(EntityCommandBufferSystem ecbs) { this.ecbs = ecbs; this.ecb = ecbs.CreateCommandBuffer(); var em = ecbs.EntityManager; hasLocaltimeScale = em.GetEntityQueryMask(em.CreateEntityQuery(typeof(LocalTimeScale))); hasTimeScale = em.GetEntityQueryMask(em.CreateEntityQuery(typeof(TimeScale))); }
public BehaviorTreeBufferElement(int order, BehaviorTreeRuntimeThread runtimeThread, NodeBlobRef nodeBlob, EntityQueryMask queryMask, Entity behaviorTree, JobHandle dependency) { Order = order; RuntimeThread = runtimeThread; NodeBlob = nodeBlob; QueryMask = queryMask; BehaviorTree = behaviorTree; Dependency = dependency; }
protected override void OnCreate() { m_CommandBufferSystem = World.GetOrCreateSystem <EndFixedStepSimulationEntityCommandBufferSystem>(); m_TriggerSystem = World.GetOrCreateSystem <TriggerEventConversionSystem>(); m_NonTriggerMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { None = new ComponentType[] { typeof(StatefulTriggerEvent) } }) ); }
protected override void OnCreate() { m_Contexts = new Dictionary <Entity, GraphInstance>(); m_UninitializedQuery = GetEntityQuery(typeof(ScriptingGraph), ComponentType.Exclude <ScriptingGraphInstance>()); m_Query = GetEntityQuery(typeof(ScriptingGraphInstance)); var beingDestroyedQuery = GetEntityQuery(typeof(ScriptingGraphInstance), ComponentType.Exclude <ScriptingGraphInstanceAlive>()); m_BeingDestroyedQueryMask = EntityManager.GetEntityQueryMask(beingDestroyedQuery); #if VS_DOTS_PHYSICS_EXISTS // TODO A FULL HUNDRED m_TriggerData = new NativeMultiHashMap <Entity, VisualScriptingPhysics.CollisionTriggerData>(100, Allocator.Persistent); m_CollisionData = new NativeMultiHashMap <Entity, VisualScriptingPhysics.CollisionTriggerData>(100, Allocator.Persistent); #endif }
public EntityHierarchyDefaultGroupingStrategy(World world, IEntityHierarchyState state) { m_World = world; m_State = state; m_RootEntitiesQuery = m_World.EntityManager.CreateEntityQuery(new EntityQueryDesc { None = new ComponentType[] { typeof(Parent) } }); m_RootEntitiesQueryMask = m_World.EntityManager.GetEntityQueryMask(m_RootEntitiesQuery); m_ChildTypeIndex = TypeManager.GetTypeIndex(typeof(Child)); m_ParentEntitiesQuery = m_World.EntityManager.CreateEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(Child) } }); m_ParentEntitiesQueryMask = m_World.EntityManager.GetEntityQueryMask(m_ParentEntitiesQuery); }
protected override void OnCreate() { m_NonTriggerDynamicBodyMask = EntityManager.GetEntityQueryMask(GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(PhysicsVelocity), typeof(PhysicsMass), typeof(Translation) }, None = new ComponentType[] { typeof(StatefulTriggerEvent) } })); }
public EntityHierarchyDefaultGroupingStrategy(World world) { m_ChildTypeIndex = TypeManager.GetTypeIndex(typeof(Child)); m_World = world; m_Versions.Add(EntityHierarchyNodeId.Root, 0); m_Children.Add(EntityHierarchyNodeId.Root, new UnsafeHashMap <EntityHierarchyNodeId, byte>(k_DefaultChildrenCapacity, Allocator.Persistent)); m_RootEntitiesQuery = m_World.EntityManager.CreateEntityQuery(new EntityQueryDesc { None = new ComponentType[] { typeof(Parent) } }); m_ParentEntitiesQuery = m_World.EntityManager.CreateEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(Child) } }); m_RootEntitiesQueryMask = m_World.EntityManager.GetEntityQueryMask(m_RootEntitiesQuery); m_ParentEntitiesQueryMask = m_World.EntityManager.GetEntityQueryMask(m_ParentEntitiesQuery); }
protected override void OnCreate() { m_Contexts = new Dictionary <Entity, GraphInstance>(); m_UninitializedQuery = GetEntityQuery(typeof(ScriptingGraph), ComponentType.Exclude <ScriptingGraphInstance>()); m_Query = GetEntityQuery(typeof(ScriptingGraphInstance)); var beingDestroyedQuery = GetEntityQuery(typeof(ScriptingGraphInstance), ComponentType.Exclude <ScriptingGraphInstanceAlive>()); m_BeingDestroyedQueryMask = EntityManager.GetEntityQueryMask(beingDestroyedQuery); m_OutputTriggersPerEntityGraphActivated = new NativeMultiHashMap <Entity, uint>(100, Allocator.Persistent); m_OutputTriggersPerEntityGraphActivated2 = new NativeMultiHashMap <Entity, uint>(100, Allocator.Persistent); m_InputTriggersPerEntityGraphActivated = new NativeHashMap <Entity, uint>(100, Allocator.Persistent); m_EventSystem = World.GetOrCreateSystem <VisualScriptingEventSystem>(); m_EventFieldDescriptions = new Dictionary <ulong, List <FieldDescription> >(); #if VS_DOTS_PHYSICS_EXISTS // TODO A FULL HUNDRED m_TriggerData = new NativeMultiHashMap <Entity, VisualScriptingPhysics.CollisionTriggerData>(100, Allocator.Persistent); m_CollisionData = new NativeMultiHashMap <Entity, VisualScriptingPhysics.CollisionTriggerData>(100, Allocator.Persistent); #endif }
protected override void OnCreate() { m_CommandBufferSystem = World.GetOrCreateSystem <EndFixedStepSimulationEntityCommandBufferSystem>(); m_NonTriggerMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { None = new ComponentType[] { typeof(StatefulTriggerEvent) } }) ); RequireForUpdate(GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(TriggerVolumeChangeMaterial) } })); }
protected override void OnCreate() { m_OverlappingGroup = GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(OverlappingTriggerVolume), typeof(PortalOverlappingTriggerVolume), } }); m_HierarchyChildMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { typeof(Parent), typeof(LocalToWorld) } }) ); }
protected override void OnCreate() { m_CommandBufferSystem = World.GetOrCreateSystem <EndSimulationEntityCommandBufferSystem>(); m_TriggerSystem = World.GetOrCreateSystem <TriggerEventConversionSystem>(); m_NonTriggerMask = EntityManager.GetEntityQueryMask( GetEntityQuery(new EntityQueryDesc { None = new ComponentType[] { typeof(StatefulTriggerEvent) } }) ); //We set our queries m_PlayerScores = GetEntityQuery(ComponentType.ReadWrite <PlayerScoreComponent>()); m_HighestScore = GetEntityQuery(ComponentType.ReadWrite <HighestScoreComponent>()); //We wait to update until we have our converted entities RequireForUpdate(m_PlayerScores); RequireForUpdate(m_HighestScore); }
internal void SetMask(EntityQueryMask mask) { QueryMaskArray[mask.Index] |= mask.Mask; }
internal bool CompareMask(EntityQueryMask mask) { return((byte)(QueryMaskArray[mask.Index] & mask.Mask) == mask.Mask); }
protected override void OnCreate() { m_RootsGroup = GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <ChildTime>(), ComponentType.ReadOnly <TimeScale>() }, None = new ComponentType[] { typeof(ParentTime) } }); m_TimeScaleWriteGroupMaskLocalParent = EntityManager.GetEntityQueryMask(GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <ParentTime>(), ComponentType.ReadWrite <TimeScale>(), ComponentType.ReadOnly <LocalTimeScale>() }, Options = EntityQueryOptions.FilterWriteGroup })); m_TimeScaleWriteGroupMaskParent = EntityManager.GetEntityQueryMask(GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <ParentTime>(), ComponentType.ReadWrite <TimeScale>(), }, Options = EntityQueryOptions.FilterWriteGroup })); AnyRootChangeQueryLocal = GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <ChildTime>(), ComponentType.ReadOnly <LocalTimeScale>(), }, }); AnyRootChangeQueryLocal.AddChangedVersionFilter(typeof(LocalTimeScale)); AnyRootChangeQuery = GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <ChildTime>(), ComponentType.ReadOnly <TimeScale>(), }, }); AnyRootChangeQuery.AddChangedVersionFilter(typeof(TimeScale)); AnyChildChangeQuery = GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <ParentTime>(), ComponentType.ReadOnly <TimeScale>(), }, }); AnyChildChangeQuery.AddChangedVersionFilter(typeof(ParentTime)); AnyChildChangeQuery.AddChangedVersionFilter(typeof(TimeScale)); AnyChildChangeQueryLocal = GetEntityQuery(new EntityQueryDesc { All = new ComponentType[] { ComponentType.ReadOnly <ParentTime>(), ComponentType.ReadOnly <LocalTimeScale>(), }, }); AnyChildChangeQueryLocal.AddChangedVersionFilter(typeof(ParentTime)); AnyChildChangeQueryLocal.AddChangedVersionFilter(typeof(LocalTimeScale)); }