Пример #1
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);
        }