Esempio n. 1
0
        public void DestroyEntity(ComponentGroup componentGroupFilter)
        {
            BeforeStructuralChange();

            // @TODO: Don't copy entity array,
            // take advantage of inherent chunk structure to do faster destruction
            var entityGroupArray = componentGroupFilter.GetEntityArray();

            if (entityGroupArray.Length == 0)
            {
                return;
            }

            var entityArray = new NativeArray <Entity>(entityGroupArray.Length, Allocator.Temp,
                                                       NativeArrayOptions.UninitializedMemory);

            entityGroupArray.CopyTo(entityArray);
            if (entityArray.Length != 0)
            {
                Entities->TryRemoveEntityId((Entity *)entityArray.GetUnsafeReadOnlyPtr(), entityArray.Length,
                                            ArchetypeManager, m_SharedComponentManager, m_GroupManager, m_CachedComponentTypeInArchetypeArray);
            }

            entityArray.Dispose();
        }
        public unsafe void UpdateInjection(byte *systemPtr)
        {
            var groupStructPtr = systemPtr + m_GroupFieldOffset;

            int length;
            ComponentChunkIterator iterator;

            m_EntityGroup.GetComponentChunkIterator(out length, out iterator);

            for (var i = 0; i != m_ComponentDataInjections.Length; i++)
            {
                ComponentDataArray <ProxyComponentData> data;
                m_EntityGroup.GetComponentDataArray(ref iterator, m_ComponentDataInjections[i].IndexInComponentGroup, length, out data);
                UnsafeUtility.CopyStructureToPtr(ref data, groupStructPtr + m_ComponentDataInjections[i].FieldOffset);
            }

            for (var i = 0; i != m_SharedComponentInjections.Length; i++)
            {
                SharedComponentDataArray <ProxySharedComponentData> data;
                m_EntityGroup.GetSharedComponentDataArray(ref iterator, m_SharedComponentInjections[i].IndexInComponentGroup, length, out data);
                UnsafeUtility.CopyStructureToPtr(ref data, groupStructPtr + m_SharedComponentInjections[i].FieldOffset);
            }

            for (var i = 0; i != m_FixedArrayInjections.Length; i++)
            {
                FixedArrayArray <int> data;
                m_EntityGroup.GetFixedArrayArray(ref iterator, m_FixedArrayInjections[i].IndexInComponentGroup, length, out data);
                UnsafeUtility.CopyStructureToPtr(ref data, groupStructPtr + m_FixedArrayInjections[i].FieldOffset);
            }

            if (m_EntityArrayOffset != -1)
            {
                EntityArray entityArray;
                m_EntityGroup.GetEntityArray(ref iterator, length, out entityArray);
                UnsafeUtility.CopyStructureToPtr(ref entityArray, groupStructPtr + m_EntityArrayOffset);
            }

            if (m_IndexFromEntityOffset != -1)
            {
                IndexFromEntity indexFromEntity;
                m_EntityGroup.GetIndexFromEntity(out indexFromEntity);
                UnsafeUtility.CopyStructureToPtr(ref indexFromEntity, groupStructPtr + m_IndexFromEntityOffset);
            }

            if (m_InjectionContext.HasEntries)
            {
                m_InjectionContext.UpdateEntries(m_EntityGroup, ref iterator, length, groupStructPtr);
            }

            if (m_LengthOffset != -1)
            {
                UnsafeUtility.CopyStructureToPtr(ref length, groupStructPtr + m_LengthOffset);
            }
        }
Esempio n. 3
0
        public unsafe void DestroyEntity(ComponentGroup componentGroupFilter)
        {
            this.BeforeStructuralChange();
            EntityArray entityArray = componentGroupFilter.GetEntityArray();

            if (entityArray.Length != 0)
            {
                NativeArray <Entity> dst = new NativeArray <Entity>(entityArray.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
                entityArray.CopyTo(dst, 0);
                if (dst.Length != 0)
                {
                    this.Entities.TryRemoveEntityId((Entity *)dst.GetUnsafeReadOnlyPtr <Entity>(), dst.Length, this.ArchetypeManager, this.m_SharedComponentManager, this.m_GroupManager, this.m_CachedComponentTypeInArchetypeArray);
                }
                dst.Dispose();
            }
        }
        public unsafe void UpdateInjection(byte *systemPtr)
        {
            var groupStructPtr = systemPtr + m_GroupFieldOffset;

            int length = m_EntityGroup.CalculateLength();
            ComponentChunkIterator iterator = m_EntityGroup.GetComponentChunkIterator();

            for (var i = 0; i != m_ComponentDataInjections.Length; i++)
            {
                ComponentDataArray <ProxyComponentData> data;
                m_EntityGroup.GetComponentDataArray(ref iterator, m_ComponentDataInjections[i].IndexInComponentGroup,
                                                    length, out data);
                UnsafeUtility.CopyStructureToPtr(ref data, groupStructPtr + m_ComponentDataInjections[i].FieldOffset);
            }

            for (var i = 0; i != m_SharedComponentInjections.Length; i++)
            {
                SharedComponentDataArray <ProxySharedComponentData> data;
                m_EntityGroup.GetSharedComponentDataArray(ref iterator,
                                                          m_SharedComponentInjections[i].IndexInComponentGroup, length, out data);
                UnsafeUtility.CopyStructureToPtr(ref data, groupStructPtr + m_SharedComponentInjections[i].FieldOffset);
            }

            for (var i = 0; i != m_BufferArrayInjections.Length; i++)
            {
                BufferArray <ProxyBufferElementData> data;
                m_EntityGroup.GetBufferArray(ref iterator, m_BufferArrayInjections[i].IndexInComponentGroup, length,
                                             out data);
                UnsafeUtility.CopyStructureToPtr(ref data, groupStructPtr + m_BufferArrayInjections[i].FieldOffset);
            }

            if (m_EntityArrayOffset != -1)
            {
                EntityArray entityArray = m_EntityGroup.GetEntityArray();
                UnsafeUtility.CopyStructureToPtr(ref entityArray, groupStructPtr + m_EntityArrayOffset);
            }

            if (m_InjectionContext.HasEntries)
            {
                m_InjectionContext.UpdateEntries(m_EntityGroup, ref iterator, length, groupStructPtr);
            }

            if (m_LengthOffset != -1)
            {
                UnsafeUtility.CopyStructureToPtr(ref length, groupStructPtr + m_LengthOffset);
            }
        }