예제 #1
0
        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
        }
예제 #2
0
 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);
     }
 }
예제 #3
0
        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;
            }
        }