예제 #1
0
        void AcquireUnityTextures(RpcContext <ConvertResource <SyncMaterial> > ctx, Tracker tracker)
        {
            tracker.NbRemaining = tracker.Entries.Count;

            for (var i = 0; i < tracker.Entries.Count; ++i)
            {
                var entry          = tracker.Entries[i];
                var waitAllTracker = new WaitAllTracker {
                    Tracker = tracker, Position = i
                };

                var rpc = m_AcquireUnityResourceOutput.Call(this, ctx, waitAllTracker, new AcquireUnityResource(new StreamState(), entry));
                rpc.Success <Texture2D>((self, ctx, waitAllTracker, texture) =>
                {
                    var tracker   = waitAllTracker.Tracker;
                    var entry     = tracker.Entries[waitAllTracker.Position];
                    var streamKey = new StreamKey(entry.SourceId, new PersistentKey(entry.EntryType, entry.IdInSource));

                    tracker.Textures[waitAllTracker.Position] = texture;
                    tracker.TextureDic.Add(streamKey, texture);
                    --tracker.NbRemaining;

                    if (tracker.NbRemaining == 0)
                    {
                        if (tracker.LatestException == null)
                        {
                            self.ClearTemporaryResources(tracker);
                            ReflectMaterialManager.ComputeMaterial(tracker.Resource, tracker.Material, tracker);
                            ctx.SendSuccess(new ConvertedResource
                            {
                                MainResource = tracker.Material,
                                Dependencies = waitAllTracker.Tracker.Entries.Select(x => x.Id).ToList()
                            });
                        }
                        else
                        {
                            self.CompleteAsFailure(ctx, tracker, tracker.LatestException);
                        }
                    }
                });

                rpc.Failure((self, ctx, waitAllTracker, ex) =>
                {
                    --waitAllTracker.Tracker.NbRemaining;
                    waitAllTracker.Tracker.LatestException = ex;

                    if (waitAllTracker.Tracker.NbRemaining == 0)
                    {
                        self.CompleteAsFailure(ctx, waitAllTracker.Tracker, waitAllTracker.Tracker.LatestException);
                    }
                });
            }
        }
예제 #2
0
        void AcquireSyncObjectResources(Tracker tracker, List <PersistentKey> resourceIds, int startIndex)
        {
            // Acquire EntryData for each resource (meshes and materials)
            var count = resourceIds.Count;

            for (var i = 0; i < count; ++i)
            {
                ++tracker.NbPendingCalls;

                var instanceData   = tracker.Ctx.Data.InstanceData;
                var waitAllTracker = new WaitAllTracker <object> {
                    Tracker = tracker, Position = startIndex + i
                };

                var rpc = m_AcquireEntryDataFromModelOutput.Call(this, tracker.Ctx, waitAllTracker, new AcquireEntryDataFromModelData(instanceData.ManifestId, resourceIds[i]));
                rpc.Success <EntryData>((self, ctx, waitAllTracker, entry) =>
                {
                    var tracker = waitAllTracker.Tracker;
                    tracker.Entries[waitAllTracker.Position] = entry;
                    --tracker.NbPendingCalls;

                    if (tracker.NbPendingCalls == 0)
                    {
                        if (tracker.LatestException == null)
                        {
                            self.AcquireFinalResources(tracker);
                        }
                        else
                        {
                            self.ClearAcquiredResources(tracker);
                            ctx.SendFailure(tracker.LatestException);
                        }
                    }
                });
                rpc.Failure((self, ctx, waitAllTracker, ex) =>
                {
                    var tracker             = waitAllTracker.Tracker;
                    tracker.LatestException = ex;
                    --tracker.NbPendingCalls;

                    if (tracker.NbPendingCalls == 0)
                    {
                        self.ClearAcquiredResources(tracker);
                        ctx.SendFailure(ex);
                    }
                });
            }
        }
예제 #3
0
        void AcquireUnityResource <TUnityResource>(Tracker tracker, List <TUnityResource> results, int startIndex)
            where TUnityResource : class
        {
            var entries = tracker.Entries.GetRange(startIndex, results.Count);

            for (var i = 0; i < entries.Count; ++i)
            {
                var entry = entries[i];
                ++tracker.NbPendingCalls;
                var waitAllTracker = new WaitAllTracker <TUnityResource> {
                    Tracker = tracker, Results = results, Position = i
                };

                var rpc = m_AcquireUnityResourceOutput.Call(this, tracker.Ctx, waitAllTracker, new AcquireUnityResource(tracker.Ctx.Data.Stream, entry));
                rpc.Success <TUnityResource>((self, ctx, waitAllTracker, mesh) =>
                {
                    var tracker = waitAllTracker.Tracker;
                    results[waitAllTracker.Position] = mesh;
                    --tracker.NbPendingCalls;

                    if (tracker.NbPendingCalls == 0)
                    {
                        if (tracker.LatestException == null)
                        {
                            self.BuildAndSendResponse(tracker);
                        }
                        else
                        {
                            self.ClearAcquiredResources(tracker);
                            ctx.SendFailure(tracker.LatestException);
                        }
                    }
                });
                rpc.Failure((self, ctx, rpcTracker, ex) =>
                {
                    var tracker             = rpcTracker.Tracker;
                    tracker.LatestException = ex;
                    --tracker.NbPendingCalls;

                    if (tracker.NbPendingCalls == 0)
                    {
                        self.ClearAcquiredResources(tracker);
                        ctx.SendFailure(ex);
                    }
                });
            }
        }
예제 #4
0
#pragma warning restore 649

        protected override void Import(RpcContext <ConvertResource <SyncMaterial> > ctx, SyncedData <SyncMaterial> resource)
        {
            var shader   = ReflectMaterialManager.GetShader(resource.data);
            var material = new Material(shader)
            {
                enableInstancing = true
            };
            var textureIds = GetTextureIds(resource.data);

            var tracker = new Tracker();

            tracker.Resource    = resource;
            tracker.Material    = material;
            tracker.Entries     = new List <EntryData>(Enumerable.Repeat((EntryData)null, textureIds.Count));
            tracker.Textures    = new List <Texture2D>(Enumerable.Repeat((Texture2D)null, textureIds.Count));
            tracker.NbRemaining = textureIds.Count;

            if (tracker.NbRemaining == 0)
            {
                ReflectMaterialManager.ComputeMaterial(resource, material, tracker);
                ctx.SendSuccess(new ConvertedResource {
                    MainResource = material, Dependencies = new List <Guid>()
                });
                return;
            }

            for (var i = 0; i < tracker.Entries.Count; ++i)
            {
                var textureId      = textureIds[i];
                var waitAllTracker = new WaitAllTracker {
                    Tracker = tracker, Position = i
                };

                var rpc = m_AcquireEntryDataFromModelDataOutput.Call(this, ctx, waitAllTracker, new AcquireEntryDataFromModelData(ctx.Data.Entry.ManifestId, new PersistentKey(typeof(SyncTexture), textureId)));
                rpc.Success <EntryData>((self, ctx, waitAllTracker, entry) =>
                {
                    var tracker = waitAllTracker.Tracker;
                    tracker.Entries[waitAllTracker.Position] = entry;
                    --waitAllTracker.Tracker.NbRemaining;

                    if (waitAllTracker.Tracker.NbRemaining == 0)
                    {
                        if (waitAllTracker.Tracker.LatestException == null)
                        {
                            self.AcquireUnityTextures(ctx, tracker);
                        }
                        else
                        {
                            self.CompleteAsFailure(ctx, tracker, waitAllTracker.Tracker.LatestException);
                        }
                    }
                });

                rpc.Failure((self, ctx, waitAllTracker, ex) =>
                {
                    --waitAllTracker.Tracker.NbRemaining;
                    waitAllTracker.Tracker.LatestException = ex;

                    if (waitAllTracker.Tracker.NbRemaining == 0)
                    {
                        self.CompleteAsFailure(ctx, waitAllTracker.Tracker, waitAllTracker.Tracker.LatestException);
                    }
                });
            }
        }