示例#1
0
        private static BaseEffect ReadXMLEffect(XmlReader reader, ReadResourceCallBack callback, string dir)
        {
            var effect = new BaseEffect();
            EffectStateStructure lastess = null;
            var set = new EffectStateRatioSet();

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    switch (reader.Name)
                    {
                    case "Effect":
                        effect.Filename = Path.Combine(dir, reader.GetAttribute("FilePath"));
                        callback(effect.Filename);
                        break;

                    case "State":
                        var       ess = new EffectStateStructure();
                        BlendMode blendMode;
                        if (!Enum.TryParse <BlendMode>(reader.GetAttribute("Blend"), out blendMode))
                        {
                            blendMode = BlendMode.None;
                        }
                        ess.BlendMode = blendMode;
                        ess.X         = float.Parse(reader.GetAttribute("X"), CultureInfo.InvariantCulture);
                        ess.Y         = float.Parse(reader.GetAttribute("Y"), CultureInfo.InvariantCulture);
                        ess.Alpha     = float.Parse(reader.GetAttribute("Alpha"), CultureInfo.InvariantCulture);
                        ess.Rotation  = float.Parse(reader.GetAttribute("Rotation"), CultureInfo.InvariantCulture);
                        ess.ScaleX    = float.Parse(reader.GetAttribute("ScaleX"), CultureInfo.InvariantCulture);
                        ess.ScaleY    = float.Parse(reader.GetAttribute("ScaleY"), CultureInfo.InvariantCulture);
                        if (lastess != null)
                        {
                            set.StartState = lastess;
                            set.EndState   = ess;
                            effect.Sets.Add(set.StartFrame, set);
                            set = new EffectStateRatioSet();
                        }
                        lastess = ess;
                        break;

                    case "RatioMakers":
                        set.StartFrame = int.Parse(reader.GetAttribute("StartFrame"), CultureInfo.InvariantCulture);
                        set.EndFrame   = int.Parse(reader.GetAttribute("EndFrame"), CultureInfo.InvariantCulture);
                        ReadXMLRatioMakers(reader.ReadSubtree(), set);
                        break;

                    case "BezierPositions":
                        ReadXMLBezierPositions(reader.ReadSubtree(), set);
                        break;
                    }
                }
            }
            effect.CheckFrameLength();
            reader.Close();
            return(effect);
        }
示例#2
0
 private static EffectManager CheckCache(string filename, ReadResourceCallBack callback)
 {
     if (table.ContainsKey(filename))
     {
         var em = table[filename] as EffectManager;
         CallReadResourceCallback(em, callback);
         return((EffectManager)em.Clone());
     }
     return(null);
 }
示例#3
0
        private static EffectManager ReadXMLEffects(XmlReader reader, ReadResourceCallBack callback, StreamCallBack streamCallBack, string dir)
        {
            var list    = new List <BaseEffect>();
            var manager = new EffectManager();

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    switch (reader.Name)
                    {
                    case "Effects":
                        float val = 0;
                        if (float.TryParse(reader.GetAttribute("FPS"), NumberStyles.Float, CultureInfo.InvariantCulture, out val))
                        {
                            manager.FPS = val;
                        }
                        else
                        {
                            manager.FPS = 60;
                        }

                        break;

                    case "Effect":
                        manager.Effects.Add(ReadXMLEffect(reader.ReadSubtree(), callback, dir));
                        break;

                    case "EffectReference":
                        var filepath  = reader.GetAttribute("FilePath");
                        var parentdir = Path.GetDirectoryName(dir);
                        var be        = ReadXMLEffect(reader.ReadSubtree(), callback, dir);
                        be.Filename = Path.Combine(parentdir, filepath);
                        list.Add(be);
                        manager.Effects.Add(be);
                        break;
                    }
                }
            }
            reader.Close();

            foreach (BaseEffect baseEffect in list)
            {
                using (Stream stream = streamCallBack(baseEffect.Filename))
                {
                    var em = Load(stream, baseEffect.Filename, callback, streamCallBack);
                    if (em != null)
                    {
                        baseEffect.Effects = em.Effects;
                        baseEffect.FPS     = em.FPS;
                    }
                }
            }
            return(manager);
        }
示例#4
0
 private static void CallReadResourceCallback(IEffect em, ReadResourceCallBack callback)
 {
     foreach (BaseEffect effect in em.Effects)
     {
         if (effect.Effects.Count == 0)
         {
             callback(effect.Filename);
         }
         else
         {
             CallReadResourceCallback(effect, callback);
         }
     }
 }
示例#5
0
        /// <summary>
        /// エフェクトを読み込む
        /// </summary>
        /// <param name="filename">エフェクトパス</param>
        /// <param name="BeCached">キャッシュされるか</param>
        /// <param name="callback">リソースコールバック</param>
        /// <returns></returns>
        public static EffectManager Load(string filename, bool BeCached, ReadResourceCallBack callback)
        {
            if (!File.Exists(filename))
            {
                return(null);
            }
            var cached = CheckCache(filename, callback);

            if (cached != null)
            {
                return(cached);
            }
            using (FileStream fs = File.Open(filename, FileMode.Open))
            {
                return(Load(fs, filename, BeCached, callback, f => File.Open(f, FileMode.Open)));
            }
        }
示例#6
0
        private static EffectManager LoadEffect(Stream stream, ReadResourceCallBack callback, StreamCallBack streamCallBack, string dir)
        {
            var reader = XmlReader.Create(stream);

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    if (reader.Name == "Effects")
                    {
                        return(ReadXMLEffects(reader.ReadSubtree(), callback, streamCallBack, dir));
                    }
                }
            }
            reader.Close();
            return(null);
        }
示例#7
0
        /// <summary>
        /// エフェクトを読み込む
        /// </summary>
        /// <param name="stream">ストリーム</param>
        /// <param name="filename">ファイル名</param>
        /// <param name="callback">コールバック</param>
        /// <param name="BeCached">キャッシュされるかどうか</param>
        /// <param name="streamCallBack">ストリームコールバック</param>
        /// <returns></returns>
        public static EffectManager Load(Stream stream, string filename, bool BeCached, ReadResourceCallBack callback, StreamCallBack streamCallBack)
        {
            var cached = CheckCache(filename, callback);

            if (cached != null)
            {
                return(cached);
            }
            var fn  = Path.GetFileNameWithoutExtension(filename);
            var dir = Path.Combine(Path.GetDirectoryName(filename), fn);

            try
            {
                var ret = LoadEffect(stream, callback, streamCallBack, dir);
                ret.CheckFrameLength();
                if (BeCached)
                {
                    if (table.ContainsKey(filename))
                    {
                        table[filename] = ret;
                    }
                    else
                    {
                        table.Add(filename, ret);
                    }
                    return((EffectManager)ret.Clone());
                }
                return(ret);
            }
            finally
            {
                stream.Close();
            }
        }
示例#8
0
 /// <summary>
 /// エフェクトを読み込む
 /// </summary>
 /// <param name="stream">ストリーム</param>
 /// <param name="filename">ファイル名</param>
 /// <param name="callback">コールバック</param>
 /// <param name="streamCallBack">ストリームコールバック</param>
 /// <returns></returns>
 public static EffectManager Load(Stream stream, string filename, ReadResourceCallBack callback, StreamCallBack streamCallBack)
 {
     return(Load(stream, filename, true, callback, streamCallBack));
 }
示例#9
0
 /// <summary>
 /// エフェクトを読み込む
 /// </summary>
 /// <param name="filename">エフェクトパス</param>
 /// <param name="callback">リソースコールバック</param>
 /// <returns></returns>
 public static EffectManager Load(string filename, ReadResourceCallBack callback)
 {
     return(Load(filename, true, callback));
 }