public static SceneSnapshot Deserialize(byte[] bytes) { // Format // 4 bytes: Magic number // 4 bytes: Header size (int) // header: // 4 bytes: headerVersion (int) // 1 byte: hasMatrix: (bool) // 43 bytes: matrix: (float) // [the rest]: serialized scene var sceneSnapshot = new SceneSnapshot(); sceneSnapshot.originMatrix = new Matrix4x4(); var offset = 0; var magicNumber = BitConverter.ToInt32(bytes, offset); var isWrapped = magicNumber == MagicNumber; if (isWrapped) { offset += sizeof(int); var headerSize = BitConverter.ToInt32(bytes, offset); offset += sizeof(int); var headerVersion = BitConverter.ToInt32(bytes, offset); offset += sizeof(int); var hasMatrix = BitConverter.ToBoolean(bytes, offset); offset += sizeof(bool); sceneSnapshot.isMatrixInferred = !hasMatrix; if (hasMatrix) { for (var i = 0; i < 16; i++) { sceneSnapshot.originMatrix[i] = BitConverter.ToSingle(bytes, offset); offset += sizeof(float); } } } else { sceneSnapshot.isMatrixInferred = true; } sceneSnapshot.sceneBytes = bytes.Skip(offset).ToArray(); if (sceneSnapshot.isMatrixInferred) { sceneSnapshot.originMatrix = InferMatrixFromSceneFloor(sceneSnapshot.Scene); } return(sceneSnapshot); }
public static SceneSnapshot Create(Scene scene) { var snapshot = new SceneSnapshot(); var sceneOriginMatrix = ReadOriginMatrixFromScene(scene); snapshot.originMatrix = sceneOriginMatrix.HasValue ? sceneOriginMatrix.Value : InferMatrixFromSceneFloor(scene); snapshot.isMatrixInferred = sceneOriginMatrix == null; snapshot._scene = scene; return(snapshot); }