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); } }); } }
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); } }); } }
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); } }); } }
#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); } }); } }