public static byte[] Serialize(SParticleRenderer input)
        {
            ComposedPrimitives prims = new ComposedPrimitives();
            prims.AddValue(input.camPos.x); prims.AddValue(input.camPos.y); prims.AddValue(input.camPos.z);
            prims.AddValue(input.camUp.x); prims.AddValue(input.camUp.y); prims.AddValue(input.camUp.z);
            prims.AddValue(input.materialInstanceID);
            prims.AddValue(input.renderMode);
            prims.AddValue(input.cameraVelocityScale);
            prims.AddValue(input.lengthScale);
            prims.AddValue(input.velocityScale);

            return prims.Compose();
        }
        public static byte[] Serialize(ScreenCaptureSnapshot input)
        {
            ComposedByteStream stream = ComposedByteStream.FetchStream();

            //--------------- Primitives --------------------
            ComposedPrimitives prims = new ComposedPrimitives();
            prims.AddValue(input.screenWidth);
            prims.AddValue(input.screenHeight);

            prims.AddValue(input.camNames != null ? input.camNames.Length : 0);
            prims.AddValue(input.camRenders != null ? input.camRenders.Length : 0);
            prims.AddValue(input.camRects != null ? input.camRects.Length : 0);

            prims.AddValue(input.mainCamLocalRotation.x);
            prims.AddValue(input.mainCamLocalRotation.y);
            prims.AddValue(input.mainCamLocalRotation.z);
            prims.AddValue(input.mainCamWorldRotation.x);
            prims.AddValue(input.mainCamWorldRotation.y);
            prims.AddValue(input.mainCamWorldRotation.z);
            prims.AddValue(input.inputAcceleration.x);
            prims.AddValue(input.inputAcceleration.y);
            prims.AddValue(input.inputAcceleration.z);

            stream.AddStream(prims.Compose());
            //--------------- Primitives --------------------

            if(input.camNames != null || input.camNames.Length != 0) {
                foreach(string name in input.camNames)
                    stream.AddStream(name);
            }

            if (input.camRenders != null && input.camRenders.Length != 0) {
                foreach (byte[] render in input.camRenders)
                    stream.AddStream(render);
            }

            if (input.camRects != null && input.camRects.Length != 0) {
                foreach (Rect rect in input.camRects)
                    stream.AddStream(new float[] { rect.x, rect.y, rect.width, rect.height });
            }
            return stream.Compose();
        }
        //--------------- Serialize / Deserialize --------------------
        public static byte[] Serialize(SGenericParticleSystem input)
        {
            if (input == null)
                return null;

            ComposedPrimitives prims = new ComposedPrimitives();
            prims.AddValue(input.instanceID);
            prims.AddValue(input.goInstanceID);
            prims.AddValue(input.isLegacy);
            prims.AddValue(input.isWorldSpace);
            prims.AddValue(input.emit);
            prims.AddValue(input.enabled);
            prims.AddValue(input.position.x);
            prims.AddValue(input.position.y);
            prims.AddValue(input.position.z);

            ComposedByteStream stream = ComposedByteStream.FetchStream(4);
            stream.AddStream(prims.Compose());
            stream.AddStream(input.name);
            stream.AddStream(SParticleRenderer.Serialize(input.renderer));
            stream.AddStream(SGenericParticleArray.Serialize(input.particles));
            return stream.Compose();
        }
        //--------------- Serialize / Deserialize --------------------
        public static byte[] Serialize(SWorldObject input)
        {
            ComposedPrimitives prims = new ComposedPrimitives();

            prims.AddValue(input.instanceID);
            prims.AddValue(input.activeInHierarchy);
            prims.AddValue(input.color.r);
            prims.AddValue(input.color.g);
            prims.AddValue(input.color.b);
            prims.AddValue(input.color.a);

            ComposedByteStream stream = new ComposedByteStream(input.meshes.Count + 2);
            stream.AddStream(prims.Compose());
            stream.AddStream(input.name);

            foreach (SMesh mesh in input.meshes)
                stream.AddStream(SMesh.Serialize(mesh));

            return stream.Compose();
        }
            //--------------- Serialize / Deserialize --------------------
            internal static byte[] Serialize(HeaderData input)
            {
                if (input == null)
                    return null;

                ComposedPrimitives prims = new ComposedPrimitives();
                prims.AddValue(input.activeInHierarchy);
                prims.AddValue(input.meshInstanceID);
                prims.AddValue(input.goInstanceID);
                prims.AddValue(input.type);

                ComposedByteStream stream = ComposedByteStream.FetchStream(4);
                stream.AddStream(input.parentName);
                stream.AddStream(input.meshName);
                stream.AddStream(prims.Compose());
                stream.AddStream(input.matrix.GetRawData());
                return stream.Compose();
            }
        public static byte[] Serialize(ExposedGameObject input)
        {
            if (input == null) return null;
            //--------------- First primitives --------------------
            ComposedPrimitives prims = new ComposedPrimitives();
            prims.AddValue(input.transformID);
            prims.AddValue(input.parentID);
            prims.AddValue(input.layer);
            prims.AddValue(input.activeSelf);
            prims.AddValue(input.isStatic);
            prims.AddValue(input.isHiddenOrDontSave);
            //--------------- First primitives --------------------

            //--------------- Final stream --------------------
            ComposedByteStream stream = ComposedByteStream.FetchStream();
            stream.AddStream(prims.Compose());
            stream.AddStream(input.name);
            stream.AddStream(input.tag);
            stream.AddStream(input.matrix.GetRawData());
            stream.AddStream(input.components);
            //--------------- Final stream --------------------

            return stream.Compose();
        }
        public static byte[] Serialize(ExposedComponent input)
        {
            if (input == null) return null;
            ComposedPrimitives prims = new ComposedPrimitives();
            prims.AddValue(input.instanceID);
            prims.AddValue(input.enabled);

            ComposedByteStream stream = ComposedByteStream.FetchStream();

            stream.AddStream(prims.Compose());
            stream.AddStream(input.name);
            stream.AddStream(SerializeExposedObject(input));
            return stream.Compose();
        }
        //--------------- Serialize / Deserialize --------------------
        public static byte[] Serialize(VerticalSliceHeaderData input)
        {
            ComposedPrimitives prims = new ComposedPrimitives();
            prims.AddValue(input.screenWidth);
            prims.AddValue(input.screenHeight);
            prims.AddValue(input.frameNumber);
            prims.AddValue(input.sessionNumber);
            prims.AddValue(input.birthTimeStamp);
            prims.AddValue(input.dateTimeStamp);
            byte[] data = prims.Compose();

            ComposedByteStream stream = ComposedByteStream.FetchStream();
            stream.AddStream(input.userUID);
            stream.AddStream(input.userNiceID);
            stream.AddStream(input.levelName);
            stream.AddStream(data);
            return stream.Compose();
        }