private void initializeSceneNode(ToMergeMessage toMergeMessege, Utils.ThreadLocalSceneBlob localSceneNode) { CloudBlockBlob flmBlob = null; CloudBlockBlob outputBlob = null; string sceneName = null; string guid = Guid.NewGuid().ToString(); sceneName = guid + ".png"; m_log.Info("Getting container"); BlobContainerPermissions permissions = renderStorage.Get().GetPermissions(BlobName.FILM_BLOB); permissions.PublicAccess = BlobContainerPublicAccessType.Container; renderStorage.Get().SetPermissions(BlobName.FILM_BLOB, permissions); m_log.Info("Getting blob reference"); flmBlob = renderStorage.Get().CreateBlob(BlobName.FILM_BLOB, toMergeMessege.Flm); //here new flm part(rendered by worker) is placed outputBlob = renderStorage.Get().CreateBlob(BlobName.IMAGE_BLOB, sceneName); //image will be stored here m_log.Info("/Getting blob reference"); localSceneNode.FlmBlob = flmBlob; //new worker's flm file(sent by worker to merge it into main file) localSceneNode.OutputBlob = outputBlob; //image will be stored here localSceneNode.SceneName = sceneName; //new GUID blob }
private void merge(Utils.ThreadLocalSceneBlob currentScene) { try { byte[] buffer = Utils.DownloadBlobToArray(currentScene.FlmBlob); currentScene.FlmBlob.Delete(); //deleting blob with flm saved by worker m_log.Info("FLM downloaded. Blob deleted. Scene ID: " + m_scene.SceneID); int size = buffer.Length; IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(buffer, 0, ptr, size); //copy new flm from buffer to ptr lock (m_downloadFlmLock) { if (m_engine.Samples == 0) { m_log.Info("Loading FLM to RAM. Scene ID: " + m_scene.SceneID); m_engine.LoadFLMFromStream(ptr, size, currentScene.SceneName); m_engine.UpdateFLMFromStream(ptr, size); //count samples that were added in engine } else { m_log.Info("Updating FLM. Scene ID: " + m_scene.SceneID); m_engine.UpdateFLMFromStream(ptr, size); } Marshal.FreeHGlobal(ptr); m_log.Info("Update frame buffer. Scene ID: " + m_scene.SceneID); m_engine.UpdateFramebuffer(); } m_log.Info("/Update frame buffer. Scene ID: " + m_scene.SceneID); } catch (Exception ex) { m_log.Error("Merge error. " + ex.Message); } }
private void updateMessageEvent(MergerMessage merMessage) { m_log.Info("ToMergeMessage. ID: " + m_scene.SceneID.ToString()); lock (m_downloadFlmLock) { ++m_threadsCount; } ToMergeMessage toMergeMessege = merMessage as ToMergeMessage; Utils.ThreadLocalSceneBlob threadSceneNode = new Utils.ThreadLocalSceneBlob(); m_log.Info("InitializeSceneNode. ID: " + m_scene.SceneID.ToString()); initializeSceneNode(toMergeMessege, threadSceneNode); m_log.Info("/InitializeSceneNode. ID: " + m_scene.SceneID.ToString()); m_log.Info("Merge. ID: " + m_scene.SceneID.ToString()); merge(threadSceneNode); m_log.Info("/Merge. ID: " + m_scene.SceneID.ToString()); //scene name means .png blob uri lock (m_makePicLock) { if (!m_stopBySpp) { m_percentageCompleted += m_oneBatchInPercents; } if (m_makePicStopwatch.ElapsedMilliseconds > DocConstants.MAKE_PICTURE_HOLDUP) { createImage(threadSceneNode.OutputBlob); double spp = m_engine.GetSppOfLoadedFLM(); m_log.Info("SPP: " + spp); if (m_stopBySpp) { m_percentageCompleted = (float)((spp * 100.0) / m_scene.StartMessage.RequiredSpp); } m_log.Info("Completed " + m_percentageCompleted); MergerUpdateMessage updateMsg = new MergerUpdateMessage(threadSceneNode.SceneName, m_scene.StartMessage.SessionId, m_percentageCompleted, spp, m_requiredSpp); m_dispatcherQueues[toMergeMessege.ID].AddMessage(updateMsg); m_makePicStopwatch.Restart(); } --m_threadsCount; } }