Esempio n. 1
0
 private static void Write(AssetStreamWriter writer, EvalBoolNOT o, IList <object> objMap)
 {
     WriteUnaryOperator(writer, o, objMap);
 }
Esempio n. 2
0
 private static void Write(AssetStreamWriter writer, EvalFloatNegation o, IList <Object> objMap)
 {
     WriteUnaryOperator(writer, o, objMap);
 }
Esempio n. 3
0
        protected void BeginCook(string clientName, string directory, string assetPath, Action <byte[], int, int> callback, Action fallback)
        {
            string binaryAbsolutePath = Path.ChangeExtension(Path.Combine(directory, assetPath), GameAsset.BinaryFileExtension);

            // Cache Table에 Asset Binary가 존재하면 Cooking하지 않습니다.

            AssetCache cache;
            bool       hasCache = false;

            lock (assetCachesLock)
                hasCache = assetCaches.TryGetValue(binaryAbsolutePath, out cache);

            if (hasCache)
            {
                Trace.WriteLine(string.Format(":[{0}] Cache > {1}", clientName, assetPath));

                if (callback != null)
                {
                    callback(cache.Buffer, 0, cache.Buffer.Length);
                }

                return;
            }

            GameAssetKitchen kitchen = Kitchen;

            taskQueue.Enqueue(() =>
            {
                try
                {
                    string recipePath = Path.ChangeExtension(assetPath, GameAsset.TextFileExtension);
                    GameAssetKitchen.CookingReport report = kitchen.Cook(directory, recipePath);
                    if (report.Asset != null)
                    {
                        // Cooking 된 asset은 나중에 가져다 쓰기 쉽게 단순 Binary화합니다.

                        GameAssetWriter writer         = GameAssetWriter.CreateWriter(report.Asset.GetType());
                        MemoryStream memoryStream      = new MemoryStream();
                        AssetStreamWriter streamWriter = new AssetStreamWriter(memoryStream, null, Kitchen.Storage);
                        writer.Write(streamWriter, report.Asset);

                        if (callback != null)
                        {
                            callback(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
                        }

                        // Cooking 작업을 마치고 Callback까지 호출했으면,
                        //   1. Asset Binary를 Cache Table에 보관합니다.
                        //      다음 요청부터 Cooking 하지 않고 바로 Cache에서 넘겨줍니다.
                        //   2. "{AssetName}.ab" File에 Asset Binary를 저장합니다.

                        byte[] cacheBuffer = new byte[memoryStream.Length];
                        System.Buffer.BlockCopy(memoryStream.GetBuffer(), 0, cacheBuffer, 0, (int)memoryStream.Length);

                        string[] dependencies = new string[report.Dependencies.Count];
                        int dependenciesIndex = 0;
                        foreach (var item in report.Dependencies)
                        {
                            // 파일 시스템 감시자에서 넘긴 변경된 파일명과 비교해야하기 때문에 /에서 \\로 변환합니다.
                            dependencies[dependenciesIndex] = item.Replace('/', '\\');
                            dependenciesIndex++;
                        }

                        lock (assetCachesLock)
                            assetCaches[binaryAbsolutePath] = new AssetCache(cacheBuffer, dependencies);

                        WriteCacheFile(binaryAbsolutePath, cacheBuffer);

                        Trace.TraceInformation(":[{0}] Asset cooking succeed > {1}", clientName, assetPath);

                        foreach (string item in dependencies)
                        {
                            string dependencyDirectory = Path.GetDirectoryName(item);
                            if (dependencyWatchers.Exists((watcher) => string.Compare(watcher.Path, dependencyDirectory) == 0) == false)
                            {
                                var watcher      = new FileSystemWatcher(dependencyDirectory);
                                watcher.Changed += (o, e) => { RemoveAssetCachesByDependency(e.FullPath); };
                                watcher.Deleted += (o, e) => { RemoveAssetCachesByDependency(e.FullPath); };
                                watcher.Renamed += (o, e) => { RemoveAssetCachesByDependency(e.FullPath); };
                                watcher.IncludeSubdirectories = false;
                                watcher.EnableRaisingEvents   = true;
                                dependencyWatchers.Add(watcher);
                            }
                        }
                    }
                    else
                    {
                        Trace.TraceError(":[{0}] AssetRecipe not found > {1}", clientName, assetPath);

                        if (fallback != null)
                        {
                            fallback();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex);

                    if (fallback != null)
                    {
                        fallback();
                    }
                }
            });
        }
Esempio n. 4
0
 private static void Write(AssetStreamWriter writer, EvalVector4RangedSequence o, IList <object> objMap)
 {
     WriteRangedSequence(writer, o, objMap);
 }
Esempio n. 5
0
 private static void Write(AssetStreamWriter writer, EvalVector3Interpolator o, IList <object> objMap)
 {
     WriteInterpolator(writer, o, objMap);
 }
Esempio n. 6
0
 private static void Write(AssetStreamWriter writer, EvalIntCache o, IList <object> objMap)
 {
     WriteCache(writer, o, objMap);
 }
Esempio n. 7
0
 private static void Write(AssetStreamWriter writer, EaseOutCircularCurve o, IList <object> objMap)
 {
     WriteEasingCurve(writer, o, objMap);
 }
Esempio n. 8
0
 private static void Write(AssetStreamWriter writer, EvalFloatDivision o, IList <object> objMap)
 {
     WriteBinaryOperator(writer, o, objMap);
 }
Esempio n. 9
0
 private static void Write(AssetStreamWriter writer, EaseInSinusoidalCurve o, IList <object> objMap)
 {
     WriteEasingCurve(writer, o, objMap);
 }
Esempio n. 10
0
 private static void Write(AssetStreamWriter writer, EaseInOutExponentialCurve o, IList <object> objMap)
 {
     WriteEasingCurve(writer, o, objMap);
 }
Esempio n. 11
0
 protected override void WriteValue(AssetStreamWriter writer, int value)
 {
     writer.Write(value);
 }
Esempio n. 12
0
 public static void WriteBody(AssetStreamWriter writer, Image asset)
 {
     writer.WriteURI(asset.TextureURI);
     writer.Write(asset.ClippingRectangle);
     writer.Write((byte)asset.AppliedTransform);
 }
Esempio n. 13
0
 public override void Write(AssetStreamWriter writer, Image asset)
 {
     writer.Write(asset.ClassID);
     WriteBody(writer, asset);
 }
Esempio n. 14
0
 private static void Write(AssetStreamWriter writer, EvalDoubleToFloat o, IList <object> objMap)
 {
     WriteUnaryOperator(writer, o, objMap);
 }
Esempio n. 15
0
 private static void Write(AssetStreamWriter writer, EaseInOutElasticCurve o, IList <object> objMap)
 {
     WriteElasticEasingCurve(writer, o, objMap);
 }
Esempio n. 16
0
 private static void Write(AssetStreamWriter writer, EvalIntToShortInt o, IList <object> objMap)
 {
     WriteUnaryOperator(writer, o, objMap);
 }
Esempio n. 17
0
 private static bool WriteEasingCurve(AssetStreamWriter writer, EasingCurve o, IList <object> objMap)
 {
     return(WriteGameComponent(writer, o, objMap));
 }
Esempio n. 18
0
 private static void Write(AssetStreamWriter writer, EvalIntModulus o, IList <object> objMap)
 {
     WriteBinaryOperator(writer, o, objMap);
 }
Esempio n. 19
0
 private static void Write(AssetStreamWriter writer, EvalVector4Variable o, IList <object> objMap)
 {
     WriteVariable(writer, o, objMap);
 }
Esempio n. 20
0
 private static void Write(AssetStreamWriter writer, EvalVector4Selector o, IList <object> objMap)
 {
     WriteSelector(writer, o, objMap);
 }
Esempio n. 21
0
 private static void Write(AssetStreamWriter writer, EvalShortIntSequence o, IList <object> objMap)
 {
     WriteSequence(writer, o, objMap);
 }
Esempio n. 22
0
 private static bool WriteEval <V>(AssetStreamWriter writer, Eval <V> o, IList <object> objMap)
 {
     return(WriteGameComponent(writer, o, objMap));
 }
Esempio n. 23
0
 protected abstract void WriteValue(AssetStreamWriter writer, U value);