示例#1
0
        void CheckFunctionalityAvailability()
        {
            var audioAvailable = Settings.Audio.Enabled;

            var videoAvailable = !(VideoViewModel.SelectedVideoSourceKind is NoVideoSourceProvider);

            RecordCommand.RaiseCanExecuteChanged(audioAvailable || videoAvailable);

            ScreenShotCommand.RaiseCanExecuteChanged(videoAvailable);
        }
示例#2
0
        void CheckFunctionalityAvailability()
        {
            var audioAvailable = AudioViewModel.AudioSource.AudioAvailable;

            var videoAvailable = VideoViewModel.SelectedVideoSourceKind != VideoSourceKind.NoVideo;

            RecordCommand.RaiseCanExecuteChanged(audioAvailable || videoAvailable);

            ScreenShotCommand.RaiseCanExecuteChanged(videoAvailable);
        }
示例#3
0
        public ToolbarViewModel(Models models)
        {
            m_models = models;

            PlayPauseCommand            = new PlayPauseCommand(models);
            ResetCommand                = new ResetCommand(models);
            SaveScreenShotCommand       = new ScreenShotCommand(models);
            ToggleCameraMovementCommand = new ActionCommand(() =>
                                                            models.Settings.AllowCameraMovement = !models.Settings.AllowCameraMovement);
            EnterFreeFlightMode             = new EnterFreeFlightMode(models);
            OneIterationCommand             = new PerformIterationsCommand(m_models, 1u);
            NIterationsCommand              = new PerformNIterationsCommand(m_models);
            ContinuousSequenceRenderCommand = new RenderSequenceCommand(m_models, -1, true, false);

            m_models.Renderer.PropertyChanged += RendererOnPropertyChanged;
            m_models.Settings.PropertyChanged += SettingsOnPropertyChanged;
        }
        /* Performs one render loop iteration
         * Blocks if no rendering, display update, or color picking is to be performed
         */
        private void RenderLoop(object sender, EventArgs args)
        {
            m_models.Statusbar.UpdateMemory();

            // Try to acquire the lock - if we're waiting, we're not rendering
            if (m_shouldExit)
            {
                return;
            }
            m_models.Renderer.RenderLock.WaitOne();
            // Check if we've been shut down
            if (m_shouldExit)
            {
                return;
            }

            if (m_takeScreenshot)
            {
                string filename = ScreenShotCommand.ReplaceCommonFilenameTags(m_models, m_models.Settings.ScreenshotNamePattern);
                if (m_denoisedScreenshot)
                {
                    Core.render_save_denoised_radiance(Path.Combine(m_models.Settings.ScreenshotFolder, filename));
                }
                else
                {
                    foreach (RenderTarget target in m_models.RenderTargetSelection.Targets)
                    {
                        if (target.Enabled)
                        {
                            Core.render_save_screenshot(Path.Combine(m_models.Settings.ScreenshotFolder, filename), target.Name, false);
                        }
                        if (target.VarianceEnabled)
                        {
                            Core.render_save_screenshot(Path.Combine(m_models.Settings.ScreenshotFolder, filename), target.Name, true);
                        }
                    }
                }

                m_takeScreenshot = false;
                if (!m_models.Renderer.IsRendering || m_iterationsPerformed == 0)
                {
                    m_models.Renderer.RenderLock.Reset();
                }
            }
            else if (m_clearWorld)
            {
                // Only clear the world, do nothing else
                Core.world_clear_all();
                m_clearWorld = false;
                m_models.Renderer.RenderLock.Reset();
                m_auxiliaryIteration.Set();
            }
            else
            {
                if (!m_repaint)
                {
                    UpdateRenderTargets();

                    if (m_models.Renderer.IsRendering)
                    {
                        if (m_incrementFrame)
                        {
                            m_incrementFrame = false;
                            // If we're at the end of the animation sequence we either loop or stop
                            if (m_models.World.AnimationFrameCurrent + 1u == m_models.World.AnimationFrameCount)
                            {
                                if (m_models.Renderer.LoopAnimation)
                                {
                                    m_models.World.AnimationFrameCurrent = 0u;
                                    m_iterationsPerformed = 0;
                                }
                                else
                                {
                                    // If we stop, m_iterationsPerformed is our break condition further below
                                    m_iterationsPerformed = m_models.Renderer.RemainingIterations;
                                    m_wasLastAnimFrame    = true;
                                }
                            }
                            else
                            {
                                ++m_models.World.AnimationFrameCurrent;
                                m_iterationsPerformed = 0;
                            }
                        }

                        if (m_iterationsPerformed < m_models.Renderer.RemainingIterations || m_models.Renderer.RemainingIterations < 0)
                        {
                            // Update camera movements and enter the render DLL
                            if (m_models.Settings.AllowCameraMovement)
                            {
                                m_models.RendererCamera.MoveCamera();
                            }
                            m_models.Renderer.Iterate();
                            ++m_iterationsPerformed;
                        }
                        else
                        {
                            if (m_models.Renderer.AnimationFrameComplete != null && !m_wasLastAnimFrame)
                            {
                                m_models.Renderer.AnimationFrameComplete();
                            }

                            // Check if we're animating
                            if (m_models.Renderer.RenderAnimation)
                            {
                                if (m_wasLastAnimFrame)
                                {
                                    m_wasLastAnimFrame = false;
                                    System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => m_models.Renderer.IsRendering = false));
                                    m_models.Renderer.RenderLock.Reset();
                                }
                                else
                                {
                                    m_incrementFrame = true;
                                }

                                // Check if we need to reset the animation frame

                                /*if (m_models.Renderer.AnimationStart < m_models.World.AnimationFrameStart)
                                 * {
                                 *  m_incrementFrame = true;
                                 * } else
                                 * {
                                 *  // Check if we should stop
                                 *  if(m_models.World.AnimationFrameCurrent > m_models.Renderer.AnimationEnd || m_wasLastAnimFrame)
                                 *  {
                                 *      m_wasLastAnimFrame = false;
                                 *      System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => m_models.Renderer.IsRendering = false));
                                 *      m_models.Renderer.RenderLock.Reset();
                                 *  } else
                                 *  {
                                 *      m_incrementFrame = true;
                                 *  }
                                 * }*/
                            }
                            else
                            {
                                // No more iterations left -> we're done
                                System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => m_models.Renderer.IsRendering = false));
                                m_models.Renderer.RenderLock.Reset();
                            }
                        }
                    }
                    else
                    {
                        m_iterationsPerformed = 0;
                        m_models.Renderer.RenderLock.Reset();
                    }

                    // We release it to give the GUI a chance to block us (ie. rendering is supposed to pause/stop)
                    if (m_shouldExit)
                    {
                        return;
                    }
                }

                // Renew the display texture (we don't really care)
                IntPtr targetTexture = IntPtr.Zero;
                if (!Core.mufflon_get_target_image(m_renderTarget.Name, m_varianceTarget, out targetTexture))
                {
                    throw new Exception(Core.core_get_dll_error());
                }
                m_models.Display.Repaint(!m_repaint);

                if (m_repaint)
                {
                    m_repaint = false;
                    if (!m_models.Renderer.IsRendering || m_iterationsPerformed == 0)
                    {
                        m_models.Renderer.RenderLock.Reset();
                    }
                    m_auxiliaryIteration.Set();
                }
            }
        }