private static void WriteMaterial(XMaterial material, XofFileSaveObject saveObject)
        {
            byte[] data = BuildMaterialData(material);

            using (var child = saveObject.AddData(XofFileDefaultTemplates.MaterialId, material.Name, null, data))
            {
                WriteMaterialChildren(material, child);
            }
        }
        private static void WriteMaterialChildren(XMaterial material, XofFileSaveData child)
        {
            if (!string.IsNullOrEmpty(material.Filename))
            {
                WriteTextureFilename(material.Filename, child);
            }

            if (material.EffectInstance != null)
            {
                WriteEffectInstance(material.EffectInstance, child);
            }
        }
        private static void WriteMaterial(XMaterial material, XofFileSaveData saveData)
        {
            if (material.IsReference)
            {
                saveData.AddDataReference(material.Name, null);
            }
            else
            {
                byte[] data = BuildMaterialData(material);

                using (var child = saveData.AddData(XofFileDefaultTemplates.MaterialId, material.Name, null, data))
                {
                    WriteMaterialChildren(material, child);
                }
            }
        }
        private static byte[] BuildMaterialData(XMaterial material)
        {
            byte[] data;

            using (var ms = new MemoryStream())
                using (var writer = new BinaryWriter(ms))
                {
                    WriteColorRgba(material.FaceColor, writer);
                    writer.Write(material.Power);
                    WriteColorRgb(material.SpecularColor, writer);
                    WriteColorRgb(material.EmissiveColor, writer);

                    data = ms.ToArray();
                }

            return(data);
        }
Exemplo n.º 5
0
        private static XMaterial ReadMaterial(XofFileEnumData enumData)
        {
            var material = new XMaterial
            {
                Name = enumData.GetName()
            };

            if (enumData.IsReference())
            {
                material.IsReference = true;
                return(material);
            }

            byte[] data = enumData.GetData();

            using (var ms = new MemoryStream(data, false))
                using (var reader = new BinaryReader(ms))
                {
                    material.FaceColor     = ReadColorRgba(reader);
                    material.Power         = reader.ReadSingle();
                    material.SpecularColor = ReadColorRgb(reader);
                    material.EmissiveColor = ReadColorRgb(reader);

                    if (ms.Position != ms.Length)
                    {
                        throw new InvalidDataException();
                    }
                }

            bool textureFilenameRead = false;
            bool effectInstanceRead  = false;

            int childrenCount = enumData.GetChildrenCount();

            for (int childIndex = 0; childIndex < childrenCount; childIndex++)
            {
                using (var child = enumData.GetChild(childIndex))
                {
                    Guid type = child.GetTemplateType();

                    if (type == XofFileDefaultTemplates.TextureFilenameId)
                    {
                        if (textureFilenameRead)
                        {
                            throw new InvalidDataException();
                        }

                        material.Filename   = ReadTextureFilename(child);
                        textureFilenameRead = true;
                    }
                    else if (type == XofFileDefaultTemplates.EffectInstanceId)
                    {
                        if (effectInstanceRead)
                        {
                            throw new InvalidDataException();
                        }

                        material.EffectInstance = ReadEffectInstance(child);
                        effectInstanceRead      = true;
                    }
                    else
                    {
                        throw new InvalidDataException();
                    }
                }
            }

            return(material);
        }