public static void Execute(NativeArray <byte> outputData, int typeSize, NativeArray <byte> componentByteArray, NativeArray <PersistenceState> persistenceStateArray) { const int amountFound = 1; int totalElementSize = typeSize + PersistenceMetaData.SizeOfStruct; for (int i = 0; i < persistenceStateArray.Length; i++) { PersistenceState persistenceState = persistenceStateArray[i]; #if ENABLE_UNITY_COLLECTIONS_CHECKS if (persistenceState.ArrayIndex * totalElementSize >= outputData.Length) { throw new IndexOutOfRangeException("CopyComponentDataToByteArray:: persistenceState.ArrayIndex seems to be out of range. Or the totalElementSize is wrong."); } #endif PersistenceMetaData *outputMetaDataBytePtr = (PersistenceMetaData *)((byte *)outputData.GetUnsafePtr() + (persistenceState.ArrayIndex * totalElementSize)); void *outputDataBytePtr = outputMetaDataBytePtr + 1; void *compDataBytePtr = (byte *)componentByteArray.GetUnsafeReadOnlyPtr() + (i * typeSize); // Diff int diff = outputMetaDataBytePtr->AmountFound - amountFound; diff |= UnsafeUtility.MemCmp(outputDataBytePtr, compDataBytePtr, typeSize); // Write Meta Data *outputMetaDataBytePtr = new PersistenceMetaData(diff, amountFound); // 1 branch in this constructor // Write Data UnsafeUtility.MemCpy(outputDataBytePtr, compDataBytePtr, typeSize); } }
public static void Execute(NativeArray <byte> inputData, int maxElements, UnsafeUntypedBufferAccessor untypedBufferAccessor, NativeArray <PersistenceState> persistenceStateArray) { Debug.Assert(maxElements < PersistenceMetaData.MaxValueForAmount); int elementSize = untypedBufferAccessor.ElementSize; int sizePerEntity = elementSize * maxElements + PersistenceMetaData.SizeOfStruct; for (int i = 0; i < persistenceStateArray.Length; i++) { PersistenceState persistenceState = persistenceStateArray[i]; #if ENABLE_UNITY_COLLECTIONS_CHECKS if (persistenceState.ArrayIndex >= inputData.Length / sizePerEntity) { throw new IndexOutOfRangeException("CopyByteArrayToBufferElements:: persistenceState.ArrayIndex seems to be out of range. Or the sizePerEntity is wrong."); } #endif PersistenceMetaData *inputMetaDataPtr = (PersistenceMetaData *)((byte *)inputData.GetUnsafeReadOnlyPtr() + persistenceState.ArrayIndex * sizePerEntity); void *inputDataBytePtr = inputMetaDataPtr + 1; // + 1 because it's a PersistenceMetaData pointer // Resize int amountToCopy = inputMetaDataPtr->AmountFound; untypedBufferAccessor.ResizeUninitialized(i, amountToCopy); // Get (Possibly modified because of resize) ptr to buffer data void *bufferDataPtr = untypedBufferAccessor.GetUnsafePtrAndLength(i, out int length); Debug.Assert(length == amountToCopy); // Write Data UnsafeUtility.MemCpy(bufferDataPtr, inputDataBytePtr, elementSize * amountToCopy); } }
public static void Execute(NativeArray <byte> outputData, int maxElements, UnsafeUntypedBufferAccessor untypedBufferAccessor, NativeArray <PersistenceState> persistenceStateArray) { int elementSize = untypedBufferAccessor.ElementSize; int sizePerEntity = elementSize * maxElements + PersistenceMetaData.SizeOfStruct; for (int i = 0; i < persistenceStateArray.Length; i++) { PersistenceState persistenceState = persistenceStateArray[i]; #if ENABLE_UNITY_COLLECTIONS_CHECKS if (persistenceState.ArrayIndex >= outputData.Length / sizePerEntity) { throw new IndexOutOfRangeException("CopyBufferElementsToByteArray:: persistenceState.ArrayIndex seems to be out of range. Or the sizePerEntity is wrong."); } #endif void *bufferDataPtr = untypedBufferAccessor.GetUnsafeReadOnlyPtrAndLength(i, out int length);; PersistenceMetaData *outputMetaBytePtr = (PersistenceMetaData *)((byte *)outputData.GetUnsafePtr() + persistenceState.ArrayIndex * sizePerEntity); void *outputDataBytePtr = outputMetaBytePtr + 1; int amountToCopy = math.clamp(length, 0, maxElements); // Diff int diff = outputMetaBytePtr->AmountFound - amountToCopy; diff |= UnsafeUtility.MemCmp(outputDataBytePtr, bufferDataPtr, amountToCopy * elementSize); // Write Meta Data *outputMetaBytePtr = new PersistenceMetaData(diff, (ushort)amountToCopy); // 1 branch in this constructor // Write Data UnsafeUtility.MemCpy(outputDataBytePtr, bufferDataPtr, elementSize * amountToCopy); } }
public static void Execute(NativeArray <byte> inputData, ComponentType componentType, int typeSize, NativeArray <Entity> entityArray, NativeArray <PersistenceState> persistenceStateArray, EntityCommandBuffer.ParallelWriter ecb, int batchIndex) { int totalElementSize = typeSize + PersistenceMetaData.SizeOfStruct; for (int i = 0; i < entityArray.Length; i++) { PersistenceState persistenceState = persistenceStateArray[i]; int inputMetaByteIndex = persistenceState.ArrayIndex * totalElementSize; int inputDataByteIndex = inputMetaByteIndex + PersistenceMetaData.SizeOfStruct; #if ENABLE_UNITY_COLLECTIONS_CHECKS if (persistenceState.ArrayIndex * totalElementSize >= inputData.Length) { throw new IndexOutOfRangeException("AddMissingComponent:: persistenceState.ArrayIndex seems to be out of range. Or the totalElementSize is wrong."); } #endif var metaData = UnsafeUtility.ReadArrayElementWithStride <PersistenceMetaData>(inputData.GetUnsafeReadOnlyPtr(), persistenceState.ArrayIndex, totalElementSize); if (metaData.AmountFound == 1) { ecb.AddComponent(batchIndex, entityArray[i], componentType); if (typeSize != 0) { ecb.SetComponent(batchIndex, entityArray[i], componentType, typeSize, inputData.GetSubArray(inputDataByteIndex, typeSize)); } } } }
public static void Execute(NativeArray <byte> inputData, int typeSize, NativeArray <byte> componentByteArray, NativeArray <PersistenceState> persistenceStateArray) { int totalElementSize = typeSize + PersistenceMetaData.SizeOfStruct; for (int i = 0; i < persistenceStateArray.Length; i++) { PersistenceState persistenceState = persistenceStateArray[i]; #if ENABLE_UNITY_COLLECTIONS_CHECKS if (persistenceState.ArrayIndex * totalElementSize >= inputData.Length) { throw new IndexOutOfRangeException("CopyByteArrayToComponentData:: persistenceState.ArrayIndex seems to be out of range. Or the totalElementSize is wrong."); } #endif byte *inputDataPtr = (byte *)inputData.GetUnsafeReadOnlyPtr() + (persistenceState.ArrayIndex * totalElementSize + PersistenceMetaData.SizeOfStruct); byte *compDataBytePtr = (byte *)componentByteArray.GetUnsafePtr() + (i * typeSize); // Write Data UnsafeUtility.MemCpy(compDataBytePtr, inputDataPtr, typeSize); } }
public static void Execute(NativeArray <byte> outputData, int stride, NativeArray <PersistenceState> persistenceStateArray, int amountFound) { for (int i = 0; i < persistenceStateArray.Length; i++) { PersistenceState persistenceState = persistenceStateArray[i]; #if ENABLE_UNITY_COLLECTIONS_CHECKS if (persistenceState.ArrayIndex * stride >= outputData.Length) { throw new IndexOutOfRangeException("UpdateMetaDataForTagComponent:: persistenceState.ArrayIndex seems to be out of range. Or the PersistenceMetaData.SizeOfStruct is wrong."); } #endif var metaData = UnsafeUtility.ReadArrayElementWithStride <PersistenceMetaData>(outputData.GetUnsafeReadOnlyPtr(), persistenceState.ArrayIndex, stride); // Diff int diff = metaData.AmountFound - amountFound; // Write Meta Data // 1 branch in PersistenceMetaData constructor UnsafeUtility.WriteArrayElementWithStride(outputData.GetUnsafePtr(), persistenceState.ArrayIndex, stride, new PersistenceMetaData(diff, (ushort)amountFound)); } }