public static Entity RemapEntityForPrefab(SparseEntityRemapInfo *remapping, int remappingCount, Entity source) { // When instantiating prefabs, // internal references are remapped. for (int i = 0; i != remappingCount; i++) { if (source == remapping[i].Src) { return(remapping[i].Target); } } // And external references are kept. return(source); }
internal static void PatchEntityForPrefabInBoxedType(object container, SparseEntityRemapInfo *remapInfo, int remapInfoCount) { var visitor = new EntityRemappingVisitor(remapInfo, remapInfoCount); var changeTracker = new ChangeTracker(); var type = container.GetType(); var resolved = PropertyBagResolver.Resolve(type); if (resolved != null) { resolved.Accept(ref container, ref visitor, ref changeTracker); } else { throw new ArgumentException($"Type '{type.FullName}' not supported for visiting."); } }
public static void PatchEntitiesForPrefab(EntityPatchInfo *scalarPatches, int scalarPatchCount, BufferEntityPatchInfo *bufferPatches, int bufferPatchCount, byte *data, int indexInChunk, int entityCount, SparseEntityRemapInfo *remapping, int remappingCount) { // Patch scalars (single components) with entity references. for (int p = 0; p < scalarPatchCount; p++) { byte *entityData = data + scalarPatches[p].Offset; for (int e = 0; e != entityCount; e++) { Entity *entity = (Entity *)(entityData + scalarPatches[p].Stride * (e + indexInChunk)); * entity = RemapEntityForPrefab(remapping + e * remappingCount, remappingCount, *entity); } } // Patch buffers that contain entity references for (int p = 0; p < bufferPatchCount; ++p) { byte *bufferData = data + bufferPatches[p].BufferOffset; for (int e = 0; e != entityCount; e++) { BufferHeader *header = (BufferHeader *)(bufferData + bufferPatches[p].BufferStride * (e + indexInChunk)); byte *elemsBase = BufferHeader.GetElementPointer(header) + bufferPatches[p].ElementOffset; int elemCount = header->Length; for (int k = 0; k != elemCount; ++k) { Entity *entityPtr = (Entity *)elemsBase; * entityPtr = RemapEntityForPrefab(remapping + e * remappingCount, remappingCount, *entityPtr); elemsBase += bufferPatches[p].ElementStride; } } } }