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);
        }