public void OnStreamEvent(SyncedData <TModel> stream, StreamEvent streamEvent) { if (streamEvent == StreamEvent.Added) { var obj = Import(stream); if (m_MemTracker.ContainsKey(m_ObjectHandle, stream.key)) { Debug.Log("Duplicate " + obj.name); } m_MemTracker.Set(m_ObjectHandle, stream.key, obj); m_Output.SendStreamAdded(new SyncedData <TObject>(stream.key, obj)); } else if (streamEvent == StreamEvent.Changed) { if (m_MemTracker.TryGetValue(m_ObjectHandle, stream.key, out var obj)) { ReImport(stream, obj); } else { // We may receive "Changed" for items that were // loaded at some point, but are not in the cache anymore obj = Import(stream); m_MemTracker.Set(m_ObjectHandle, stream.key, obj); } m_Output.SendStreamChanged(new SyncedData <TObject>(stream.key, obj)); } }
protected override void UpdateInternal(float unscaledDeltaTime) { // Postponing instances if there are available models (in order to update model caches first) while (m_DownloadedModels.Count == 0 && m_DownloadedInstances.TryDequeue(out var result)) { if (result.exception != null) { m_Hub.Broadcast(new StreamingErrorEvent(result.instanceData.instance.key, result.instanceData.instance.boundingBox, result.exception)); continue; } Trace(">>>>>> SENDING " + result.instanceData.instance.instance.Name); // TODO Have type dependencies inside the result var meshes = result.downloadedMeshes; var textures = result.downloadedTextures; var materials = result.downloadedMaterials; foreach (var asset in meshes) { m_AddedModels.Add(asset.key); if (!m_MemTracker.ContainsKey(m_MeshesHandle, asset.key)) { Trace(" >> Sending " + asset.GetType().Name + " " + asset.asset.Name); m_SyncMeshOutput.SendStreamAdded(new SyncedData <SyncMesh>(asset.key, asset.asset)); } } foreach (var asset in textures) { if (m_AddedModels.Add(asset.key)) { Trace(" >> Sending " + asset.GetType().Name + " " + asset.asset.Name); m_SyncTextureOutput.SendStreamAdded(new SyncedData <SyncTexture>(asset.key, asset.asset)); } } foreach (var asset in materials) { if (m_AddedModels.Add(asset.key)) { Trace(" >> Sending " + asset.GetType().Name + " " + asset.asset.Name); m_SyncMaterialOutput.SendStreamAdded(new SyncedData <SyncMaterial>(asset.key, asset.asset)); } } var key = result.instanceData.instance.key; if (m_InstanceCache.ContainsKey(key)) { m_InstanceDataOutput.SendStreamChanged(new SyncedData <StreamInstanceData>(key, result.instanceData)); } else { m_InstanceDataOutput.SendStreamAdded(new SyncedData <StreamInstanceData>(key, result.instanceData)); } m_InstanceCache[key] = result.instanceData; Trace(">> DONE " + result.instanceData.instance.instance.Name); } while (m_DownloadedModels.TryDequeue(out var result)) { // Skip without broadcasting error. Errors are broadcasted for each SyncInstance, not for SyncObject or each sub-resource if (result.exception != null) { continue; } TrySendAddedOrChanged(result.assetEntry, m_SyncTextureOutput); TrySendAddedOrChanged(result.assetEntry, m_SyncMeshOutput); TrySendAddedOrChanged(result.assetEntry, m_SyncMaterialOutput); } if (m_State == State.WaitingToFinish && m_DownloadRequests.IsEmpty && m_DownloadedModels.IsEmpty) { m_InstanceDataOutput.SendEnd(); m_State = State.Idle; } }