private static IEnumerator LoadMaterial(BinaryReader source, string modelFolder, Action <Material> callback)
        {
            string texName     = ReadString(source);
            string texLocation = Path.Combine(modelFolder, texName);
            string matName     = ReadString(source);

            MaterialKey materialKey = new MaterialKey(matName, texLocation);

            float glossiness = 0;

            bool hasMaterialProperties = source.ReadBoolean();

            if (hasMaterialProperties)
            {
                bool hasEmissive = source.ReadBoolean();
                if (hasEmissive)
                {
                    source.ReadSingle();
                    source.ReadSingle();
                    source.ReadSingle();
                    source.ReadSingle();
                }

                bool hasShininess = source.ReadBoolean();
                if (hasShininess)
                {
                    glossiness = source.ReadSingle() / 100;
                    if (glossiness > 1)
                    {
                        glossiness = 0;
                    }
                }

                bool hasSpecular = source.ReadBoolean();
                if (hasSpecular)
                {
                    source.ReadSingle();
                    source.ReadSingle();
                    source.ReadSingle();
                    source.ReadSingle();
                }

                bool hasTransparencyColor = source.ReadBoolean();
                if (hasTransparencyColor)
                {
                    source.ReadSingle();
                    source.ReadSingle();
                    source.ReadSingle();
                    source.ReadSingle();
                }
            }

            if (cachedMaterials.ContainsKey(materialKey))
            {
                Debug.Log("Loading material from cache");
                Material cachedMaterial = cachedMaterials[materialKey];
                callback.Invoke(cachedMaterial);
            }
            else
            {
                Material material = new Material(GraphicsManager.Instance.WomDefaultMaterial);
                material.name = matName;

                TextureReference textureReference = TextureReference.GetTextureReference(texLocation);

                Texture2D texture = null;
                if (textureReference != null)
                {
                    yield return(textureReference.LoadOrGetTexture(loadedTexture => texture = loadedTexture));
                }

                if (texture)
                {
                    material.SetTexture(ShaderPropertyIds.MainTex, texture);
                }
                else
                {
                    material.SetColor(ShaderPropertyIds.Color, new Color(1, 1, 1, 0));
                }

                material.SetFloat(ShaderPropertyIds.Glossiness, glossiness);

                cachedMaterials[materialKey] = material;
                callback.Invoke(material);
            }
        }