示例#1
0
 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)
         }
     })
         );
 }
示例#4
0
        /// <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>()
                }
            }
                );
        }
示例#9
0
        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)));
        }
示例#10
0
 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);
        }
示例#14
0
 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);
        }
示例#16
0
        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
        }
示例#17
0
 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)
         }
     })
         );
 }
示例#19
0
    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);
    }
示例#20
0
 internal void SetMask(EntityQueryMask mask)
 {
     QueryMaskArray[mask.Index] |= mask.Mask;
 }
示例#21
0
 internal bool CompareMask(EntityQueryMask mask)
 {
     return((byte)(QueryMaskArray[mask.Index] & mask.Mask) == mask.Mask);
 }
示例#22
0
        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));
        }