ACMX 2.136.0
Dual-Backend Real-Time GPU Video Synthesis
Loading...
Searching...
No Matches
ACMXVK/main_window.hpp
Go to the documentation of this file.
1#ifndef ACMXVK_MAIN_WINDOW_HPP
2#define ACMXVK_MAIN_WINDOW_HPP
3
4#include <mxvk/mxvk.hpp>
5#include <mxvk/mxvk_abstract_model.hpp>
6#include <mxvk/mxvk_cv.hpp>
7#ifdef MXVK_WITH_FFMPEG_CAPTURE
8#include <mxvk/mxvk_ff_capture.hpp>
9#endif
10#include <mxwrite.hpp>
11
12#ifdef AUDIO_ENABLED
13#include "audio.hpp"
14#include "file_audio.hpp"
15#endif
16#ifdef MIDI_ENABLED
17#include "midi.hpp"
18#endif
19#ifdef ACMXVK_WITH_CUDA
20#include "gpu_filters.hpp"
21#endif
22#ifdef ACMXVK_WITH_DNN
23#include "edge_dnn.hpp"
24#endif
25#ifdef ACMXVK_WITH_DEEP_DREAM
26#include "deep_dream_model.hpp"
27#endif
29#include "app/media_helpers.hpp"
30#include "app/media_utils.hpp"
31#include "app/options.hpp"
32#include "app/output_paths.hpp"
33#include "app/playlist.hpp"
37#include "input_validation.hpp"
38
39#ifdef ACMXVK_WITH_MXVK_CUDA
40#include <opencv2/core/cuda.hpp>
41#include <opencv2/cudaarithm.hpp>
42#endif
43#include <opencv2/core.hpp>
44#include <opencv2/imgproc.hpp>
45#include <opencv2/videoio.hpp>
46
47#include <glm/ext/matrix_clip_space.hpp>
48#include <glm/ext/matrix_transform.hpp>
49#include <glm/glm.hpp>
50
51#include <algorithm>
52#include <array>
53#include <chrono>
54#include <cmath>
55#include <condition_variable>
56#include <cstdint>
57#include <deque>
58#include <filesystem>
59#include <iomanip>
60#include <iostream>
61#include <limits>
62#include <memory>
63#include <mutex>
64#include <numbers>
65#include <random>
66#include <sstream>
67#include <stdexcept>
68#include <string>
69#include <string_view>
70#include <thread>
71#include <unordered_map>
72#include <unordered_set>
73#include <utility>
74#include <vector>
75
76namespace acmxvk {
77 void request_headless_shutdown([[maybe_unused]] int signal_number) noexcept;
78
79 // MainWindow's declaration and runtime state live here; method definitions
80 // are implemented in main_window.cpp.
81 class MainWindow final : public mxvk::VK_Window {
82 public:
83 explicit MainWindow(Options options);
84 ~MainWindow() override;
85
86 void event(SDL_Event &event) override;
87 void onSwapchainRecreated() override;
88 void onRecordCustomRendering(VkCommandBuffer command_buffer,
89 std::uint32_t image_index) override;
91 VkCommandBuffer command_buffer, std::uint32_t image_index,
92 VkImageView texture_view,
93 [[maybe_unused]] VkExtent2D texture_extent) override;
94 void recordModel(VkCommandBuffer command_buffer,
95 std::uint32_t image_index, VkImageView texture_view);
96 void proc() override;
97
98 private:
99 // Runtime state shared by the focused MainWindow implementation sections.
100 enum class SourceKind { Camera,
101 Video,
102 Graphic };
103
105 bool snapshot = false;
107 bool continuous = false;
108 bool frame_due = false;
109 bool has_pts = false;
110 std::uint64_t pts = 0;
111 };
112
113 static constexpr std::uint32_t COMPATIBILITY_SPECTRUM_BIN_COUNT = 256;
114
117 mxvk::VK_Capture capture;
120#ifdef MXVK_WITH_FFMPEG_CAPTURE
121 mxvk::VK_FF_Capture ffmpeg_capture;
122 std::vector<std::uint8_t> ffmpeg_rgba;
123 std::vector<std::uint16_t> ffmpeg_rgba16;
124 bool using_ffmpeg_capture = false;
125 bool ffmpeg_seek_repeat_logged = false;
126#ifdef ACMXVK_WITH_MXVK_CUDA
127 cv::cuda::Stream ffmpeg_cuda_stream;
128#endif
129#endif
130 Writer writer;
131 mxvk::VKAbstractModel input_model;
132 mxvk::VK_Sprite *frame_sprite = nullptr;
133 mxvk::VK_Sprite *crossfade_previous_sprite = nullptr;
134 mxvk::VK_Sprite *human_overlay_sprite = nullptr;
138 std::vector<fs::path> shaders;
139 std::unordered_map<std::string, fs::path> shader_reload_overrides;
140 std::vector<fs::path> configured_passes;
141 std::vector<PlaylistNode> playlist;
142 std::vector<mxvk::VK_Sprite *> post_process_sprites;
143 std::vector<ShaderManifest::CustomUniform> custom_uniforms;
144 std::vector<float> custom_uniform_values;
150 std::uint32_t interface_last_sequence = 0;
151 std::chrono::steady_clock::time_point interface_next_connect_attempt{};
155 std::size_t shader_index = 0;
156 std::size_t playlist_index = 0;
158 std::numeric_limits<std::size_t>::max();
159 bool effects_enabled = true;
160 bool multipass_enabled = false;
161 bool playlist_enabled = false;
162 bool shader_locked = false;
163 bool model_initialized = false;
164 bool model_3d_active = false;
166 bool model_auto_rotate = false;
167 bool model_wave_active = false;
173 float mouse_x = 0.0F;
174 float mouse_y = 0.0F;
175 bool mouse_pressed = false;
187 bool recording_complete = false;
190 bool input_paused = false;
191 bool rendering_frozen = false;
194 bool audio_time_active = false;
195 bool audio_delta_time = false;
200 !options.watermark_text.empty();
203 bool snapshot_pending = false;
205 bool autopilot_enabled = false;
208 bool crossfade_active = false;
217 std::size_t crossfade_shader_index = 0;
219 double recording_fps = 0.0;
220 double video_source_fps = 0.0;
225 bool hdr_transfer_hlg = false;
226 bool hdr_output_enabled = false;
236 double shader_time = 0.0;
237 float legacy_alpha = 0.1F;
238 float crossfade_alpha = 1.0F;
240 float model_yaw_degrees = 270.0F;
247 float model_scale = 1.0F;
248 float model_rotation_speed = 18.0F;
256 float model_wave_phase = 0.0F;
260 mxvk::ModelFragmentUniforms model_fragment_uniforms{};
264 std::chrono::steady_clock::time_point compatibility_clock_start =
265 std::chrono::steady_clock::now();
266 std::chrono::steady_clock::time_point model_last_render_time =
267 std::chrono::steady_clock::now();
268 std::chrono::steady_clock::time_point crossfade_start_time =
269 std::chrono::steady_clock::now();
271 std::uint64_t output_frame_count = 0;
272 std::uint64_t decoded_video_frame_count = 0;
273 std::uint64_t video_source_frame_count = 0;
274 std::uint64_t recording_frame_pts = 0;
275 std::uint64_t next_clock_output_frame = 0;
276 std::uint64_t png_frame_count = 0;
277 std::uint64_t generated_frame_count = 0;
278 std::uint64_t snapshot_count = 0;
279 std::uint64_t frame_count = 0;
280 std::uint64_t previous_model_video_frame = 0;
281 std::uint64_t hud_fps_frame_count = 0;
282 std::uint64_t camera_fps_frame_count = 0;
283 double hud_display_fps = 0.0;
284 std::deque<ReadbackRequest> readback_requests;
285 std::chrono::steady_clock::time_point hud_session_start{
286 std::chrono::steady_clock::now()};
287 std::chrono::steady_clock::time_point hud_fps_last_tick{
289 std::chrono::steady_clock::time_point camera_fps_last_tick{};
290 std::chrono::steady_clock::time_point camera_history_next_update{};
291 std::chrono::steady_clock::time_point window_title_last_update{};
292 std::chrono::steady_clock::time_point headless_progress_last_emit{};
294 std::chrono::steady_clock::time_point next_render_tick{};
295 std::chrono::steady_clock::time_point source_playback_clock_start{};
296 std::chrono::steady_clock::time_point source_playback_pause_start{};
297 std::chrono::steady_clock::duration source_playback_paused_duration{};
298 std::chrono::steady_clock::time_point previous_frame{std::chrono::steady_clock::now()};
305 std::mt19937 autopilot_rng{std::random_device{}()};
306 std::mt19937 random_dream_rng{std::random_device{}()};
307 std::uint64_t random_dream_period =
308 std::numeric_limits<std::uint64_t>::max();
311#ifdef ACMXVK_WITH_CUDA
312 std::unique_ptr<gpu::FilterEngine> gpu_filter_engine;
313#endif
314#ifdef ACMXVK_WITH_DNN
315 std::unique_ptr<dnn::EdgeDetector> edge_detector;
316 std::unique_ptr<dnn::HumanSegmenter> human_segmenter;
317 std::unique_ptr<dnn::GenericOnnxProcessor> generic_onnx_processor;
318#endif
319#ifdef ACMXVK_WITH_DEEP_DREAM
320 std::unique_ptr<dream::Model> deep_dream_model;
321#endif
322#ifdef ACMXVK_WITH_MXVK_CUDA
323 cv::cuda::GpuMat cuda_input_rgba;
324 cv::cuda::GpuMat cuda_dream_rgba;
325 cv::cuda::GpuMat cuda_rotated_rgba;
326 cv::cuda::GpuMat cuda_rotation_transpose;
327 cv::Mat cuda_input_fallback_rgba;
328 cv::Mat cuda_history_fallback_rgba;
329 cv::Mat cuda_model_fallback_rgba;
330 bool cuda_input_path_logged = false;
331 bool cuda_input_fallback_logged = false;
332 bool cuda_history_fallback_logged = false;
333 bool cuda_model_fallback_logged = false;
334#endif
335#ifdef AUDIO_ENABLED
336 std::unique_ptr<audio::AudioEngine> audio_engine;
337 std::unique_ptr<audio::FileAudioSource> file_audio_source;
340 std::chrono::steady_clock::time_point audio_warmup_last_tick{};
341#endif
342#ifdef MIDI_ENABLED
344 int channel = -1;
345 int controller = 0;
346 std::size_t uniform_index = 0;
347 std::string uniform_name;
348 };
349
351 int value = 64;
355 bool active = false;
356 };
357
358 std::unique_ptr<midi::MidiInput> midi_input;
359 std::vector<midi::MidiMapping> midi_action_mappings;
360 std::vector<MidiKnobState> midi_knob_states;
361 std::vector<MidiCcMapping> midi_cc_mappings;
362 std::array<int, 4> midi_slider_uniform_indices{-1, -1, -1, -1};
363 std::uint64_t observed_midi_drops = 0;
364#endif
365
366#ifdef AUDIO_ENABLED
367 void resetAudioWarmup();
368 [[nodiscard]] float updateAudioWarmup(
369 std::chrono::steady_clock::time_point now);
370#endif
371 void initializeDnn();
372 void initializeDeepDream();
374 void selectGpuFilter(int direction);
375 void openMidi();
377#ifdef MIDI_ENABLED
378 [[nodiscard]] bool applyMidiCc(const midi::MidiMessage &message);
379 [[nodiscard]] SDL_Keycode midiActionKey(int action) const;
380 [[nodiscard]] bool isMidiSliderMapping(
381 const midi::MidiMapping &mapping) const;
382 [[nodiscard]] static bool usesMidiDeltaDirection(
383 const midi::MidiMapping &mapping);
384 [[nodiscard]] bool isMidiModelAction(int action) const;
385 [[nodiscard]] bool isMidiMappingSupported(
386 const midi::MidiMapping &mapping) const;
387 [[nodiscard]] std::string_view midiActionName(int action) const;
388 void dispatchMidiModelAction(int action);
389 void dispatchMidiAction(int action);
390 [[nodiscard]] bool setMidiUniform(std::size_t uniform_index, int value,
391 std::string_view label);
392 [[nodiscard]] bool applyMidiMap(const midi::MidiMessage &message);
393 void dispatchMidiKnobs();
394#endif
396 void pollMidi();
397 void openAudio();
399 void adjustAudioSensitivity(float amount);
400 [[nodiscard]] bool audioSourceOpen() const;
403 void setSourcePlaybackClockPaused(bool paused);
404 [[nodiscard]] bool mediaClockSeconds(double &seconds) const;
405
406 void loadShaders();
408 void printCustomUniforms() const;
409 [[nodiscard]] std::string currentShader() const;
410 [[nodiscard]] fs::path resolvedShaderPath(const fs::path &shader) const;
411 [[nodiscard]] bool historyCacheEnabled() const;
412 void recordShaderResources(const mxvk::ShaderModuleInfo &module_info,
413 std::string_view source);
414 [[nodiscard]] std::uint32_t spectrumBinCount() const;
415 [[nodiscard]] bool spectrumTextureEnabledForShaders() const;
416 [[nodiscard]] bool spectrumHistoryEnabledForShaders() const;
420 const InterfacePlaybackState &requested, bool announce);
422 const InterfaceOverlayState &requested, bool announce);
424 const InterfaceGpuFilterState &requested, bool announce);
426 const InterfaceDeepDreamState &requested, bool announce);
428 const InterfaceAudioFileState &requested);
430 const InterfaceReloadState &requested);
432 const InterfaceMultipassState &requested);
434 const std::string &requested_name);
436 const std::vector<InterfaceUniformValue> &uniform_values);
437 void loadShaderPasses();
438 void loadPlaylist();
439
442 [[nodiscard]] static std::string clipOverlayText(std::string text);
443 [[nodiscard]] const std::vector<fs::path> *activePasses() const;
444 [[nodiscard]] std::string_view activeShaderRole() const;
445 [[nodiscard]] std::string activePassDescription() const;
446 [[nodiscard]] std::string activePlaylistDescription() const;
447 [[nodiscard]] static std::string formatHudTime(double seconds_value);
448 void updateWindowTitle(bool force = false);
449 void emitHeadlessProgress(bool complete);
450 [[nodiscard]] double hudWallElapsedSeconds() const;
451 [[nodiscard]] bool currentVideoTimeline(
452 double &timeline,
453 std::uint64_t *frame_index = nullptr) const;
454 [[nodiscard]] double hudVideoPositionSeconds() const;
455 [[nodiscard]] std::string hudVideoTimeString() const;
456 [[nodiscard]] std::string hudElapsedTimeString() const;
457 void updateHudFrameRate();
460 void queueRuntimeHud(int &y, int line_height);
461 void queueOverlayText();
462 [[nodiscard]] static std::string captureFourccName(double value);
463 [[nodiscard]] bool hostPreprocessingEnabled() const;
464 void applyDnnEffects(cv::Mat &rgba);
466 void applyDeepDreamEffect(cv::Mat &rgba);
467 void handleDeepDreamRuntimeError(std::string_view message);
469
470 void openInput();
471 [[nodiscard]] std::pair<int, int> source_dimensions();
473 [[nodiscard]] double outputFrameRate();
474 void requestSnapshot(SnapshotFormat format);
475 [[nodiscard]] bool continuousReadbackEnabled() const;
476 void openOutput();
477 void onFrameReadbackScheduled() override;
478 void onFrameReadback(std::vector<std::uint8_t> &rgba, uint32_t width,
479 uint32_t height) override;
480 void onFrameReadbackRgba16(std::vector<std::uint16_t> &rgba,
481 uint32_t width,
482 uint32_t height) override;
484 std::vector<std::uint8_t> &rgba,
485 const std::vector<std::uint16_t> *rgba16, uint32_t width,
486 uint32_t height);
487
488 void initializeModel();
489 void initializeSprite();
490 void resetShaderTime();
491 void beginCrossfade();
492 void updateCrossfade(const std::chrono::steady_clock::time_point now);
493 void cycleCrossfade(int direction);
494 void adjustModelScale(float amount);
496 void togglePause();
497 void toggleFreeze();
498 void stepShaderTime(double amount);
499 void adjustTimeSpeed(double amount);
500 void toggleFullscreen();
502 void logSelectedPlaylistNode(std::string_view action) const;
503 [[nodiscard]] std::uint64_t autopilotFrameAdvance();
504 void toggleAutopilot(bool sequential);
505 void updateAutopilot();
506 void selectShader(int direction);
507 void selectPlaylistNode(int direction);
508 [[nodiscard]] std::vector<fs::path> activeShaderPipeline() const;
509 [[nodiscard]] fs::path directModelFragmentShader() const;
510 void applyShaderPipeline();
511 [[nodiscard]] bool readTrackedInputFrame();
512 [[nodiscard]] bool skipInputFrame();
513 [[nodiscard]] bool handleCaptureEnd(bool discard = false);
514 [[nodiscard]] bool readClockedVideoFrame(double clock_seconds);
515 void closeVideoCapture();
516 [[nodiscard]] bool openVideoCapture();
517 [[nodiscard]] bool readHostRgba(cv::Mat &rgba);
518 void initializeHistory(const cv::Mat &rgba);
519 void updateHistoryFrame(const cv::Mat &rgba);
520 void updateCameraHistory();
521#ifdef ACMXVK_WITH_MXVK_CUDA
522 void updateModelTextureCuda(const cv::cuda::GpuMat &rgba,
523 cv::cuda::Stream &source_stream);
524 void updateCudaHistoryFrame(const cv::cuda::GpuMat &rgba,
525 cv::cuda::Stream &source_stream);
526 void updateFilteredCudaHistoryFrame();
527 void initializeCudaHistory(const cv::cuda::GpuMat &rgba,
528 cv::cuda::Stream &source_stream,
529 bool filtered);
530 void uploadInputFrame(const cv::cuda::GpuMat &rgba,
531 cv::cuda::Stream &source_stream);
532#ifdef ACMXVK_WITH_DEEP_DREAM
533 [[nodiscard]] bool readCudaDeepDreamFrame();
534#endif
535 [[nodiscard]] const cv::cuda::GpuMat &
536 rotateCudaFrame(const cv::cuda::GpuMat &rgba,
537 cv::cuda::Stream &source_stream);
538#endif
539 void uploadInputFrame(const cv::Mat &rgba);
540 [[nodiscard]] bool readLatestCameraFrame();
541 [[nodiscard]] bool readInputFrame();
542 void updateShaderUniforms(int width, int height);
543 };
544} // namespace acmxvk
545
546#endif
std::chrono::steady_clock::duration source_playback_paused_duration
std::unordered_map< std::string, fs::path > shader_reload_overrides
std::unique_ptr< midi::MidiInput > midi_input
std::unique_ptr< audio::FileAudioSource > file_audio_source
InterfaceClient interface_client
void requestSnapshot(SnapshotFormat format)
mxvk::ModelFragmentUniforms model_fragment_uniforms
std::uint64_t previous_autopilot_video_frame
void updateCrossfade(const std::chrono::steady_clock::time_point now)
std::chrono::steady_clock::time_point hud_session_start
fs::path resolvedShaderPath(const fs::path &shader) const
std::uint64_t hud_fps_frame_count
void queueRuntimeHud(int &y, int line_height)
std::vector< mxvk::VK_Sprite * > post_process_sprites
std::uint64_t output_frame_count
void event(SDL_Event &event) override
void setSourcePlaybackClockPaused(bool paused)
std::chrono::steady_clock::time_point source_playback_clock_start
std::chrono::steady_clock::time_point source_playback_pause_start
mxvk::VK_Sprite * crossfade_previous_sprite
void adjustAudioSensitivity(float amount)
std::chrono::steady_clock::time_point camera_fps_last_tick
void cycleCrossfade(int direction)
void adjustModelScale(float amount)
void dispatchMidiAction(int action)
const std::vector< fs::path > * activePasses() const
bool mediaClockSeconds(double &seconds) const
std::vector< float > custom_uniform_values
void onSwapchainRecreated() override
std::chrono::steady_clock::time_point audio_warmup_last_tick
std::string activePassDescription() const
double hudVideoPositionSeconds() const
std::chrono::steady_clock::time_point window_title_last_update
std::deque< ReadbackRequest > readback_requests
MainWindow(Options options)
std::uint64_t generated_frame_count
void onRecordPostProcessingTexture(VkCommandBuffer command_buffer, std::uint32_t image_index, VkImageView texture_view, VkExtent2D texture_extent) override
void apply_interface_gpu_filter_state(const InterfaceGpuFilterState &requested, bool announce)
void apply_interface_audio_file_state(const InterfaceAudioFileState &requested)
std::vector< MidiKnobState > midi_knob_states
void apply_interface_shader_reload(const InterfaceReloadState &requested)
void updateWindowTitle(bool force=false)
bool continuousReadbackEnabled() const
void applyDnnEffects(cv::Mat &rgba)
std::array< int, 4 > midi_slider_uniform_indices
std::string_view activeShaderRole() const
float updateAudioWarmup(std::chrono::steady_clock::time_point now)
fs::path directModelFragmentShader() const
std::uint64_t recording_frame_pts
mxvk::VK_Sprite * frame_sprite
void handleFrameReadback(std::vector< std::uint8_t > &rgba, const std::vector< std::uint16_t > *rgba16, uint32_t width, uint32_t height)
std::chrono::steady_clock::time_point interface_next_connect_attempt
std::uint64_t observed_midi_drops
void onRecordCustomRendering(VkCommandBuffer command_buffer, std::uint32_t image_index) override
void onFrameReadbackRgba16(std::vector< std::uint16_t > &rgba, uint32_t width, uint32_t height) override
bool isMidiModelAction(int action) const
bool isMidiMappingSupported(const midi::MidiMapping &mapping) const
void selectGpuFilter(int direction)
void apply_interface_deep_dream_state(const InterfaceDeepDreamState &requested, bool announce)
bool spectrumHistoryEnabledForShaders() const
std::uint64_t next_clock_output_frame
std::chrono::steady_clock::time_point crossfade_start_time
static std::string formatHudTime(double seconds_value)
bool applyMidiCc(const midi::MidiMessage &message)
void apply_interface_overlay_state(const InterfaceOverlayState &requested, bool announce)
std::chrono::steady_clock::time_point previous_frame
void apply_interface_playback_state(const InterfacePlaybackState &requested, bool announce)
std::chrono::steady_clock::time_point hud_fps_last_tick
static bool usesMidiDeltaDirection(const midi::MidiMapping &mapping)
std::string hudVideoTimeString() const
bool readHostRgba(cv::Mat &rgba)
void toggleAutopilot(bool sequential)
std::uint32_t interface_last_reload_sequence
void recordModel(VkCommandBuffer command_buffer, std::uint32_t image_index, VkImageView texture_view)
void logSelectedPlaylistNode(std::string_view action) const
std::unique_ptr< audio::AudioEngine > audio_engine
std::vector< MidiCcMapping > midi_cc_mappings
mxvk::VK_Sprite * human_overlay_sprite
void apply_interface_uniform_values(const std::vector< InterfaceUniformValue > &uniform_values)
std::vector< fs::path > activeShaderPipeline() const
std::chrono::steady_clock::time_point next_render_tick
void stepShaderTime(double amount)
std::uint64_t previous_model_video_frame
void onFrameReadbackScheduled() override
bool hostPreprocessingEnabled() const
double hudWallElapsedSeconds() const
std::string activePlaylistDescription() const
void handleDeepDreamRuntimeError(std::string_view message)
SnapshotFormat pending_snapshot_format
std::string hudElapsedTimeString() const
std::pair< int, int > source_dimensions()
void apply_interface_multipass_state(const InterfaceMultipassState &requested)
std::uint64_t camera_fps_frame_count
static std::string captureFourccName(double value)
void initializeHistory(const cv::Mat &rgba)
std::uint32_t spectrumBinCount() const
void applyDeepDreamEffect(cv::Mat &rgba)
std::chrono::steady_clock::time_point camera_history_next_update
bool handleCaptureEnd(bool discard=false)
std::uint32_t interface_last_audio_file_sequence
void adjustTimeSpeed(double amount)
void uploadInputFrame(const cv::Mat &rgba)
SDL_Keycode midiActionKey(int action) const
bool readClockedVideoFrame(double clock_seconds)
bool currentVideoTimeline(double &timeline, std::uint64_t *frame_index=nullptr) const
void updateShaderUniforms(int width, int height)
LatestCameraFrame latest_camera_frame
std::chrono::steady_clock::time_point headless_progress_last_emit
std::vector< fs::path > configured_passes
bool applyMidiMap(const midi::MidiMessage &message)
bool spectrumTextureEnabledForShaders() const
std::vector< midi::MidiMapping > midi_action_mappings
void apply_interface_shader_selection(const std::string &requested_name)
bool isMidiSliderMapping(const midi::MidiMapping &mapping) const
void recordShaderResources(const mxvk::ShaderModuleInfo &module_info, std::string_view source)
std::vector< PlaylistNode > playlist
static std::string clipOverlayText(std::string text)
static constexpr std::uint32_t COMPATIBILITY_SPECTRUM_BIN_COUNT
bool setMidiUniform(std::size_t uniform_index, int value, std::string_view label)
std::uint64_t autopilotFrameAdvance()
mxvk::VKAbstractModel input_model
void emitHeadlessProgress(bool complete)
std::chrono::steady_clock::time_point compatibility_clock_start
std::vector< fs::path > shaders
void onFrameReadback(std::vector< std::uint8_t > &rgba, uint32_t width, uint32_t height) override
std::vector< ShaderManifest::CustomUniform > custom_uniforms
std::uint32_t interface_last_sequence
std::string_view midiActionName(int action) const
void updateHistoryFrame(const cv::Mat &rgba)
std::size_t crossfade_post_process_index
std::uint64_t video_source_frame_count
std::chrono::steady_clock::time_point model_last_render_time
std::string currentShader() const
SnapshotWriter snapshot_writer
void dispatchMidiModelAction(int action)
void selectShader(int direction)
std::uint64_t decoded_video_frame_count
std::uint64_t random_dream_period
void selectPlaylistNode(int direction)
void request_headless_shutdown(int signal_number) noexcept
std::string watermark_text
Definition options.hpp:193