//--------------- Serialize --------------------
        public static byte[] Serialize(MaterialDataSnapshot input)
        {
            if (input == null)
                return null;

            ComposedByteStream stream = ComposedByteStream.FetchStream();
            foreach (SMaterial material in input.materials)
                stream.AddStream(SMaterial.Serialize(material));

            return stream.Compose();
        }
        public static SMaterial GetMaterialByInstanceID(MaterialDataSnapshot materialData, int instanceID)
        {
            if (materialData == null || materialData.materials == null || materialData.materials.Length == 0)
                return null;

            SMaterial[] materials = materialData.materials;
            int i =materials.Length;
            while(--i > -1){
                if (materials[i] != null && materials[i].instanceID == instanceID)
                    return materials[i];
            }

            return null;
        }
        public static MaterialDataSnapshot Deserialize(byte[] input)
        {
            if (input == null || input.Length == 0)
                return null;

            MaterialDataSnapshot result = new MaterialDataSnapshot();
            ComposedByteStream stream = ComposedByteStream.FromByteArray(input);

            int iMax = stream.streamCount;
            result.materials = new SMaterial[iMax];
            for (int i = 0; i < iMax; i++)
                result.materials[i] = SMaterial.Deserialize(stream.ReadNextStream<byte>());

            stream.Dispose();
            return result;
        }
        //Todo:Add material data and make all dispose calls recursive.
        public override void Dispose()
        {
            base.Dispose();

            if (header != null) header.Dispose();
            if (systemInfo != null) systemInfo.Dispose();
            if (debugLogs != null) debugLogs.Dispose();
            if (humanInput != null) humanInput.Dispose();
            if (meshData != null) meshData.Dispose();
            if (particleData != null) particleData.Dispose();
            if (materialData != null) materialData.Dispose();
            if (gameObjectsSnapshot != null) gameObjectsSnapshot.Dispose();

            header = null;
            systemInfo = null;
            debugLogs = null;
            humanInput = null;
            meshData = null;
            particleData = null;
            materialData = null;
            gameObjectsSnapshot = null;
            screenCapture = null;
        }