public void Write(BinaryBuffer buf) { buf.Write(collectionCounts.Count); foreach (var i in collectionCounts) { buf.Write(i); } buf.Write(fieldSizes.Count); foreach (var i in fieldSizes) { buf.Write(i); } fieldSizes.Clear(); //Guid crumb, so we can jump to the guid table on read var guidCrumbPosition = buf.position; buf.position += 5; //Type table //At this point includes only node types, which we iterate through adding fields type ids var keys = new Type[typeToLocalID.Count]; typeToLocalID.Keys.CopyTo(keys, 0); buf.Write(keys.Length); foreach (var type in keys) { var metaNode = NodeBindings.GetBindings(type); buf.Write(metaNode.fields.Length); foreach (var field in metaNode.fields) { var typeUnits = TypeUnitUtility.GetTypeUnits(field.type); buf.Write(typeUnits.Length); foreach (var subType in typeUnits) { WriteLocalID(buf, subType); } } } //Guids var currentPosition = buf.position; buf.position = guidCrumbPosition; buf.Write(currentPosition); buf.position = currentPosition; buf.Write(typeToLocalID.Count); foreach (var pair in typeToLocalID) { buf.Write(DeltaCore.GetGUID(pair.Key)); } typeToLocalID.Clear(); }
public void Write(BinaryBuffer buf, PrefabFooter metadata) { var numFieldsWritten = 0; metadata.WriteLocalID(buf, bindings.type); for (int i = 0; i < fields.Length; i++) { var fieldOverride = fields[i]; if (fieldOverride.node != null) { buf.Write(i); var metaField = fieldOverride.node.Bindings.fields[fieldOverride.fieldID]; var start = buf.position; metaField.Write(fieldOverride.node, buf); metadata.fieldSizes.Enqueue(buf.position - start); numFieldsWritten++; } else if (fieldOverride.buf != null) { buf.Write(i); var start = buf.position; buf.WriteBytes(fieldOverride.buf, fieldOverride.position, fieldOverride.length); metadata.fieldSizes.Enqueue(buf.position - start); numFieldsWritten++; } } metadata.collectionCounts.Push(numFieldsWritten); var numChildrenWritten = 0; for (int i = 0; i < children.Length; i++) { var child = children[i]; if (child == null) { continue; } buf.Write(i); child.Write(buf, metadata); numChildrenWritten++; } metadata.collectionCounts.Push(numChildrenWritten); }
public void WriteLocalID(BinaryBuffer buf, Type type) { if (!typeToLocalID.TryGetValue(type, out int localID)) { localID = typeToLocalID.Count; typeToLocalID.Add(type, localID); } buf.Write(localID); }