From 4274b835f6c702e190651f197929c7a75377e9a8 Mon Sep 17 00:00:00 2001 From: Anthony Nicholls Date: Tue, 16 Apr 2024 12:06:10 +0100 Subject: [PATCH] Animation: Add animation demos --- .../Builds/Android/app/CMakeLists.txt | 39 +- .../DemoRunner/Builds/LinuxMakefile/Makefile | 10 +- .../DemoRunner.xcodeproj/project.pbxproj | 8 + .../VisualStudio2017/DemoRunner_App.vcxproj | 40 +- .../DemoRunner_App.vcxproj.filters | 66 ++ .../VisualStudio2019/DemoRunner_App.vcxproj | 40 +- .../DemoRunner_App.vcxproj.filters | 66 ++ .../VisualStudio2022/DemoRunner_App.vcxproj | 40 +- .../DemoRunner_App.vcxproj.filters | 66 ++ .../iOS/DemoRunner.xcodeproj/project.pbxproj | 8 + examples/DemoRunner/CMakeLists.txt | 1 + examples/DemoRunner/DemoRunner.jucer | 8 + .../DemoRunner/JuceLibraryCode/JuceHeader.h | 1 + .../include_juce_animation.cpp | 8 + .../DemoRunner/Source/Demos/DemoPIPs2.cpp | 6 +- examples/GUI/AnimationDemo.h | 305 ------ examples/GUI/AnimationEasingDemo.h | 849 +++++++++++++++++ examples/GUI/AnimatorsDemo.h | 900 ++++++++++++++++++ 18 files changed, 2138 insertions(+), 323 deletions(-) create mode 100644 examples/DemoRunner/JuceLibraryCode/include_juce_animation.cpp delete mode 100644 examples/GUI/AnimationDemo.h create mode 100644 examples/GUI/AnimationEasingDemo.h create mode 100644 examples/GUI/AnimatorsDemo.h diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index 3b52b495c5..5ac4cfe8ec 100644 --- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt +++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt @@ -34,9 +34,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_PROJUCER_VERSION=0x80000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.0]] [[-DJUCE_APP_VERSION_HEX=0x80000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_PROJUCER_VERSION=0x80000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_animation=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.0]] [[-DJUCE_APP_VERSION_HEX=0x80000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_PROJUCER_VERSION=0x80000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.0]] [[-DJUCE_APP_VERSION_HEX=0x80000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_PROJUCER_VERSION=0x80000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_animation=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.0]] [[-DJUCE_APP_VERSION_HEX=0x80000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -66,6 +66,23 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" "../../../../../modules/juce_analytics/juce_analytics.cpp" "../../../../../modules/juce_analytics/juce_analytics.h" + "../../../../../modules/juce_animation/animation/juce_Animator.cpp" + "../../../../../modules/juce_animation/animation/juce_Animator.h" + "../../../../../modules/juce_animation/animation/juce_AnimatorSetBuilder.cpp" + "../../../../../modules/juce_animation/animation/juce_AnimatorSetBuilder.h" + "../../../../../modules/juce_animation/animation/juce_AnimatorUpdater.cpp" + "../../../../../modules/juce_animation/animation/juce_AnimatorUpdater.h" + "../../../../../modules/juce_animation/animation/juce_Easings.cpp" + "../../../../../modules/juce_animation/animation/juce_Easings.h" + "../../../../../modules/juce_animation/animation/juce_StaticAnimationLimits.h" + "../../../../../modules/juce_animation/animation/juce_ValueAnimatorBuilder.cpp" + "../../../../../modules/juce_animation/animation/juce_ValueAnimatorBuilder.h" + "../../../../../modules/juce_animation/animation/juce_VBlankAnimatorUpdater.h" + "../../../../../modules/juce_animation/detail/chromium/cubic_bezier.cc" + "../../../../../modules/juce_animation/detail/chromium/cubic_bezier.h" + "../../../../../modules/juce_animation/detail/juce_ArrayAndTupleOps.h" + "../../../../../modules/juce_animation/juce_animation.cpp" + "../../../../../modules/juce_animation/juce_animation.h" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" @@ -2125,6 +2142,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_video/juce_video.mm" "../../../../../modules/juce_video/juce_video.h" "../../../JuceLibraryCode/include_juce_analytics.cpp" + "../../../JuceLibraryCode/include_juce_animation.cpp" "../../../JuceLibraryCode/include_juce_audio_basics.cpp" "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" @@ -2164,6 +2182,23 @@ set_source_files_properties( "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" "../../../../../modules/juce_analytics/juce_analytics.cpp" "../../../../../modules/juce_analytics/juce_analytics.h" + "../../../../../modules/juce_animation/animation/juce_Animator.cpp" + "../../../../../modules/juce_animation/animation/juce_Animator.h" + "../../../../../modules/juce_animation/animation/juce_AnimatorSetBuilder.cpp" + "../../../../../modules/juce_animation/animation/juce_AnimatorSetBuilder.h" + "../../../../../modules/juce_animation/animation/juce_AnimatorUpdater.cpp" + "../../../../../modules/juce_animation/animation/juce_AnimatorUpdater.h" + "../../../../../modules/juce_animation/animation/juce_Easings.cpp" + "../../../../../modules/juce_animation/animation/juce_Easings.h" + "../../../../../modules/juce_animation/animation/juce_StaticAnimationLimits.h" + "../../../../../modules/juce_animation/animation/juce_ValueAnimatorBuilder.cpp" + "../../../../../modules/juce_animation/animation/juce_ValueAnimatorBuilder.h" + "../../../../../modules/juce_animation/animation/juce_VBlankAnimatorUpdater.h" + "../../../../../modules/juce_animation/detail/chromium/cubic_bezier.cc" + "../../../../../modules/juce_animation/detail/chromium/cubic_bezier.h" + "../../../../../modules/juce_animation/detail/juce_ArrayAndTupleOps.h" + "../../../../../modules/juce_animation/juce_animation.cpp" + "../../../../../modules/juce_animation/juce_animation.h" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" diff --git a/examples/DemoRunner/Builds/LinuxMakefile/Makefile b/examples/DemoRunner/Builds/LinuxMakefile/Makefile index 67c2cff325..96ae18e8bf 100644 --- a/examples/DemoRunner/Builds/LinuxMakefile/Makefile +++ b/examples/DemoRunner/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.0" "-DJUCE_APP_VERSION_HEX=0x80000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 gl libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_animation=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.0" "-DJUCE_APP_VERSION_HEX=0x80000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 gl libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := DemoRunner @@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.0" "-DJUCE_APP_VERSION_HEX=0x80000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 gl libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_animation=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.0" "-DJUCE_APP_VERSION_HEX=0x80000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 gl libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := DemoRunner @@ -79,6 +79,7 @@ OBJECTS_APP := \ $(JUCE_OBJDIR)/MainComponent_a54318d2.o \ $(JUCE_OBJDIR)/Main_90ebc5c2.o \ $(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o \ + $(JUCE_OBJDIR)/include_juce_animation_c2224b92.o \ $(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o \ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ @@ -148,6 +149,11 @@ $(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o: ../../JuceLibraryCode/include_ @echo "Compiling include_juce_analytics.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_animation_c2224b92.o: ../../JuceLibraryCode/include_juce_animation.cpp + -$(V_AT)mkdir -p $(@D) + @echo "Compiling include_juce_animation.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o: ../../JuceLibraryCode/include_juce_audio_basics.cpp -$(V_AT)mkdir -p $(@D) @echo "Compiling include_juce_audio_basics.cpp" diff --git a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj index 1023b165c7..e3f1e530f8 100644 --- a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ 48CF0B02E1D06E5DA51E6270 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; }; 4FBBB55F4E347757F74F1F41 /* MainComponent.cpp */ = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; }; 527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; }; + 55F120E70543228568573D4A /* include_juce_animation.cpp */ = {isa = PBXBuildFile; fileRef = CB4C64BACC1CA4AAD6D69565; }; 5CB78489F16E82144914972D /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; }; 5E4310B3F6BB639875D3E9B8 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; }; 5EB6872A39122A5AB67E544E /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 8D44097417573B38729A0179; }; @@ -109,6 +110,7 @@ 71A91516AFD980FEE694C0E1 /* IOKit.framework */ /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 7A5AAE9EE573FC6105CC4AAC /* SettingsContent.h */ /* SettingsContent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = SOURCE_ROOT; }; 7B3243C92248D379A0489AA4 /* Utilities */ /* Utilities */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Utilities; path = ../../../Utilities; sourceTree = ""; }; + 8447FC9882D85E6DAF0A4852 /* juce_animation */ /* juce_animation */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_animation; path = ../../../../modules/juce_animation; sourceTree = SOURCE_ROOT; }; 87D5F938A115568F9CF3BE5A /* Security.framework */ /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; 8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; @@ -128,6 +130,7 @@ B2BC383CE102EECCF49C7AF7 /* IntroScreen.h */ /* IntroScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = SOURCE_ROOT; }; B4389672DA4CC8E0A531062D /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; C1E93FAF6C68A40A664422CD /* include_juce_dsp.mm */ /* include_juce_dsp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_dsp.mm; path = ../../JuceLibraryCode/include_juce_dsp.mm; sourceTree = SOURCE_ROOT; }; + CB4C64BACC1CA4AAD6D69565 /* include_juce_animation.cpp */ /* include_juce_animation.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_animation.cpp; path = ../../JuceLibraryCode/include_juce_animation.cpp; sourceTree = SOURCE_ROOT; }; CE38E6469D98462A2C22C915 /* include_juce_osc.cpp */ /* include_juce_osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_osc.cpp; path = ../../JuceLibraryCode/include_juce_osc.cpp; sourceTree = SOURCE_ROOT; }; CFF2BBEB242CC8B3B904B5F9 /* App */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = BUILT_PRODUCTS_DIR; }; DC192EFA899E6CBE6B5CD394 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; @@ -203,6 +206,7 @@ isa = PBXGroup; children = ( 112FFCB73597157E721BCDF2, + 8447FC9882D85E6DAF0A4852, 6847A9B2C5E3C2ED56D8D4E7, 60F2869DC345EAF2314D6C09, 491641F7632BCC81BBA0ED85, @@ -229,6 +233,7 @@ isa = PBXGroup; children = ( 5965349393850F41DF76F350, + CB4C64BACC1CA4AAD6D69565, 03B0F9318FD583525AB195A9, 03A63C3CA6F24977F19C316D, E061A1C75FA5722167FC4997, @@ -432,6 +437,7 @@ 4FBBB55F4E347757F74F1F41, F619F3887CEC064441BB6EE6, C2BB2B6DA237FE0CB64C7EDA, + 55F120E70543228568573D4A, F28112945CEBEA4CE8975833, 9EACEA6BE8D0ACC72C12C080, 26652AB1BB77C8A39434775F, @@ -523,6 +529,7 @@ "NDEBUG=1", "JUCE_PROJUCER_VERSION=0x80000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", + "JUCE_MODULE_AVAILABLE_juce_animation=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -613,6 +620,7 @@ "DEBUG=1", "JUCE_PROJUCER_VERSION=0x80000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", + "JUCE_MODULE_AVAILABLE_juce_animation=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj index 6e05b6b30e..56bd871e63 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -161,6 +161,27 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -2796,6 +2817,7 @@ true + @@ -2834,6 +2856,16 @@ + + + + + + + + + + diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters index 69909ca0cb..bed4e708c3 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters @@ -23,6 +23,18 @@ {97F7F593-75F8-D6B2-DC96-C946C3976226} + + {F5989655-DEF5-0837-C752-9CCB88B3C1FB} + + + {98B39178-8939-7749-8B88-C3B52C7EBF42} + + + {6ABAE878-BEE8-D294-DCBD-783AC7562B3B} + + + {CBB2B5E6-0E34-A956-8FFF-B4365E57F077} + {EB58F05A-A968-CEBE-40C4-107CDD8F240F} @@ -751,6 +763,27 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\detail\chromium + + + JUCE Modules\juce_animation + JUCE Modules\juce_audio_basics\audio_play_head @@ -3547,6 +3580,9 @@ JUCE Library Code + + JUCE Library Code + JUCE Library Code @@ -3639,6 +3675,36 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\detail\chromium + + + JUCE Modules\juce_animation\detail + + + JUCE Modules\juce_animation + JUCE Modules\juce_audio_basics\audio_play_head diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj index cfea614a1e..87546a8431 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -161,6 +161,27 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -2796,6 +2817,7 @@ true + @@ -2834,6 +2856,16 @@ + + + + + + + + + + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index 90141d94dc..ab09f1c29a 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -23,6 +23,18 @@ {97F7F593-75F8-D6B2-DC96-C946C3976226} + + {F5989655-DEF5-0837-C752-9CCB88B3C1FB} + + + {98B39178-8939-7749-8B88-C3B52C7EBF42} + + + {6ABAE878-BEE8-D294-DCBD-783AC7562B3B} + + + {CBB2B5E6-0E34-A956-8FFF-B4365E57F077} + {EB58F05A-A968-CEBE-40C4-107CDD8F240F} @@ -751,6 +763,27 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\detail\chromium + + + JUCE Modules\juce_animation + JUCE Modules\juce_audio_basics\audio_play_head @@ -3547,6 +3580,9 @@ JUCE Library Code + + JUCE Library Code + JUCE Library Code @@ -3639,6 +3675,36 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\detail\chromium + + + JUCE Modules\juce_animation\detail + + + JUCE Modules\juce_animation + JUCE Modules\juce_audio_basics\audio_play_head diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj index 221ba5ae78..9aaf0ab602 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.0;JUCE_APP_VERSION_HEX=0x80000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -161,6 +161,27 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -2796,6 +2817,7 @@ true + @@ -2834,6 +2856,16 @@ + + + + + + + + + + diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters index f191cccb5d..5bd8867827 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters @@ -23,6 +23,18 @@ {97F7F593-75F8-D6B2-DC96-C946C3976226} + + {F5989655-DEF5-0837-C752-9CCB88B3C1FB} + + + {98B39178-8939-7749-8B88-C3B52C7EBF42} + + + {6ABAE878-BEE8-D294-DCBD-783AC7562B3B} + + + {CBB2B5E6-0E34-A956-8FFF-B4365E57F077} + {EB58F05A-A968-CEBE-40C4-107CDD8F240F} @@ -751,6 +763,27 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\detail\chromium + + + JUCE Modules\juce_animation + JUCE Modules\juce_audio_basics\audio_play_head @@ -3547,6 +3580,9 @@ JUCE Library Code + + JUCE Library Code + JUCE Library Code @@ -3639,6 +3675,36 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\animation + + + JUCE Modules\juce_animation\detail\chromium + + + JUCE Modules\juce_animation\detail + + + JUCE Modules\juce_animation + JUCE Modules\juce_audio_basics\audio_play_head diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj index 01436458e3..24ea9a015b 100644 --- a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 48CF0B02E1D06E5DA51E6270 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; }; 4FBBB55F4E347757F74F1F41 /* MainComponent.cpp */ = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; }; 527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; }; + 55F120E70543228568573D4A /* include_juce_animation.cpp */ = {isa = PBXBuildFile; fileRef = CB4C64BACC1CA4AAD6D69565; }; 5CB78489F16E82144914972D /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; }; 5E4310B3F6BB639875D3E9B8 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; }; 5EB6872A39122A5AB67E544E /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 8D44097417573B38729A0179; }; @@ -109,6 +110,7 @@ 7A5AAE9EE573FC6105CC4AAC /* SettingsContent.h */ /* SettingsContent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = SOURCE_ROOT; }; 7FBD555B32197FEACDFF5AFB /* LaunchScreen.storyboard */ /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = LaunchScreen.storyboard; sourceTree = SOURCE_ROOT; }; 8135645508EEFDBDCDF2ADC6 /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DemoRunner/Images.xcassets; sourceTree = SOURCE_ROOT; }; + 8447FC9882D85E6DAF0A4852 /* juce_animation */ /* juce_animation */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_animation; path = ../../../../modules/juce_animation; sourceTree = SOURCE_ROOT; }; 873F9DD54978E601102353B4 /* CoreText.framework */ /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; 8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; @@ -127,6 +129,7 @@ B2BC383CE102EECCF49C7AF7 /* IntroScreen.h */ /* IntroScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = SOURCE_ROOT; }; B4389672DA4CC8E0A531062D /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; C1E93FAF6C68A40A664422CD /* include_juce_dsp.mm */ /* include_juce_dsp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_dsp.mm; path = ../../JuceLibraryCode/include_juce_dsp.mm; sourceTree = SOURCE_ROOT; }; + CB4C64BACC1CA4AAD6D69565 /* include_juce_animation.cpp */ /* include_juce_animation.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_animation.cpp; path = ../../JuceLibraryCode/include_juce_animation.cpp; sourceTree = SOURCE_ROOT; }; CE38E6469D98462A2C22C915 /* include_juce_osc.cpp */ /* include_juce_osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_osc.cpp; path = ../../JuceLibraryCode/include_juce_osc.cpp; sourceTree = SOURCE_ROOT; }; CFF2BBEB242CC8B3B904B5F9 /* App */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = BUILT_PRODUCTS_DIR; }; DC192EFA899E6CBE6B5CD394 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; @@ -210,6 +213,7 @@ isa = PBXGroup; children = ( 112FFCB73597157E721BCDF2, + 8447FC9882D85E6DAF0A4852, 6847A9B2C5E3C2ED56D8D4E7, 60F2869DC345EAF2314D6C09, 491641F7632BCC81BBA0ED85, @@ -236,6 +240,7 @@ isa = PBXGroup; children = ( 5965349393850F41DF76F350, + CB4C64BACC1CA4AAD6D69565, 03B0F9318FD583525AB195A9, 03A63C3CA6F24977F19C316D, E061A1C75FA5722167FC4997, @@ -436,6 +441,7 @@ 4FBBB55F4E347757F74F1F41, F619F3887CEC064441BB6EE6, C2BB2B6DA237FE0CB64C7EDA, + 55F120E70543228568573D4A, F28112945CEBEA4CE8975833, 9EACEA6BE8D0ACC72C12C080, 26652AB1BB77C8A39434775F, @@ -530,6 +536,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_PROJUCER_VERSION=0x80000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", + "JUCE_MODULE_AVAILABLE_juce_animation=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -620,6 +627,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_PROJUCER_VERSION=0x80000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", + "JUCE_MODULE_AVAILABLE_juce_animation=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/examples/DemoRunner/CMakeLists.txt b/examples/DemoRunner/CMakeLists.txt index bd53d86aff..e49216a9db 100644 --- a/examples/DemoRunner/CMakeLists.txt +++ b/examples/DemoRunner/CMakeLists.txt @@ -69,6 +69,7 @@ target_compile_definitions(DemoRunner PRIVATE target_link_libraries(DemoRunner PRIVATE juce::juce_analytics + juce::juce_animation juce::juce_audio_utils juce::juce_box2d juce::juce_dsp diff --git a/examples/DemoRunner/DemoRunner.jucer b/examples/DemoRunner/DemoRunner.jucer index 4498ad7771..131428cc2c 100644 --- a/examples/DemoRunner/DemoRunner.jucer +++ b/examples/DemoRunner/DemoRunner.jucer @@ -60,6 +60,7 @@ + @@ -87,6 +88,7 @@ + + + + + + + diff --git a/examples/DemoRunner/JuceLibraryCode/JuceHeader.h b/examples/DemoRunner/JuceLibraryCode/JuceHeader.h index 7c6aba16cc..96997eb683 100644 --- a/examples/DemoRunner/JuceLibraryCode/JuceHeader.h +++ b/examples/DemoRunner/JuceLibraryCode/JuceHeader.h @@ -14,6 +14,7 @@ #include +#include #include #include #include diff --git a/examples/DemoRunner/JuceLibraryCode/include_juce_animation.cpp b/examples/DemoRunner/JuceLibraryCode/include_juce_animation.cpp new file mode 100644 index 0000000000..fbd1f2342e --- /dev/null +++ b/examples/DemoRunner/JuceLibraryCode/include_juce_animation.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp b/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp index 077ee17061..81bd0b3721 100644 --- a/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp +++ b/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp @@ -32,7 +32,8 @@ #include "../../../GUI/AccessibilityDemo.h" #endif #include "../../../GUI/AnimationAppDemo.h" -#include "../../../GUI/AnimationDemo.h" +#include "../../../GUI/AnimationEasingDemo.h" +#include "../../../GUI/AnimatorsDemo.h" #include "../../../GUI/BouncingBallWavetableDemo.h" #if JUCE_USE_CAMERA && ! (JUCE_LINUX || JUCE_BSD) #include "../../../GUI/CameraDemo.h" @@ -72,7 +73,8 @@ void registerDemos_Two() noexcept REGISTER_DEMO (AccessibilityDemo, GUI, false) #endif REGISTER_DEMO (AnimationAppDemo, GUI, false) - REGISTER_DEMO (AnimationDemo, GUI, false) + REGISTER_DEMO (AnimationEasingDemo, GUI, false) + REGISTER_DEMO (AnimatorsDemo, GUI, false) REGISTER_DEMO (BouncingBallWavetableDemo, GUI, false) #if JUCE_USE_CAMERA && ! (JUCE_LINUX || JUCE_BSD) REGISTER_DEMO (CameraDemo, GUI, true) diff --git a/examples/GUI/AnimationDemo.h b/examples/GUI/AnimationDemo.h deleted file mode 100644 index b865a26497..0000000000 --- a/examples/GUI/AnimationDemo.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE framework examples. - Copyright (c) Raw Material Software Limited - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - to use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - - ============================================================================== -*/ - -/******************************************************************************* - The block below describes the properties of this PIP. A PIP is a short snippet - of code that can be read by the Projucer and used to generate a JUCE project. - - BEGIN_JUCE_PIP_METADATA - - name: AnimationDemo - version: 1.0.0 - vendor: JUCE - website: http://juce.com - description: Displays an animated draggable ball. - - dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, - juce_gui_basics - exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone - - moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 - - type: Component - mainClass: AnimationDemo - - useLocalCopy: 1 - - END_JUCE_PIP_METADATA - -*******************************************************************************/ - -#pragma once - -#include "../Assets/DemoUtilities.h" - -//============================================================================== -/** This will be the source of our balls and can be dragged around. */ -class BallGeneratorComponent final : public Component -{ -public: - BallGeneratorComponent() {} - - void paint (Graphics& g) override - { - auto area = getLocalBounds().reduced (2); - - g.setColour (Colours::orange); - g.drawRoundedRectangle (area.toFloat(), 10.0f, 2.0f); - - g.setColour (findColour (TextButton::textColourOffId)); - g.drawFittedText ("Drag Me!", area, Justification::centred, 1); - } - - void resized() override - { - // Just set the limits of our constrainer so that we don't drag ourselves off the screen - constrainer.setMinimumOnscreenAmounts (getHeight(), getWidth(), - getHeight(), getWidth()); - } - - void mouseDown (const MouseEvent& e) override - { - // Prepares our dragger to drag this Component - dragger.startDraggingComponent (this, e); - } - - void mouseDrag (const MouseEvent& e) override - { - // Moves this Component according to the mouse drag event and applies our constraints to it - dragger.dragComponent (this, e, &constrainer); - } - -private: - ComponentBoundsConstrainer constrainer; - ComponentDragger dragger; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BallGeneratorComponent) -}; - -//============================================================================== -struct BallComponent final : public Component -{ - BallComponent (Point pos) - : position (pos), - speed (Random::getSystemRandom().nextFloat() * 4.0f - 2.0f, - Random::getSystemRandom().nextFloat() * -6.0f - 2.0f), - colour (Colours::white) - { - setSize (20, 20); - step(); - } - - bool step() - { - position += speed; - speed.y += 0.1f; - - setCentrePosition ((int) position.x, - (int) position.y); - - if (auto* parent = getParentComponent()) - return isPositiveAndBelow (position.x, (float) parent->getWidth()) - && position.y < (float) parent->getHeight(); - - return position.y < 400.0f && position.x >= -10.0f; - } - - void paint (Graphics& g) override - { - g.setColour (colour); - g.fillEllipse (2.0f, 2.0f, (float) getWidth() - 4.0f, (float) getHeight() - 4.0f); - - g.setColour (Colours::darkgrey); - g.drawEllipse (2.0f, 2.0f, (float) getWidth() - 4.0f, (float) getHeight() - 4.0f, 1.0f); - } - - Point position, speed; - Colour colour; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BallComponent) -}; - -//============================================================================== -class AnimationDemo final : public Component, - private Timer -{ -public: - AnimationDemo() - { - setOpaque (true); - - for (auto i = 0; i < 11; ++i) - { - auto* b = createButton(); - componentsToAnimate.add (b); - addAndMakeVisible (b); - b->onClick = [this] { triggerAnimation(); }; - } - - addAndMakeVisible (ballGenerator); - - cycleCount = 2; - startTimerHz (60); - - setSize (620, 620); - } - - void paint (Graphics& g) override - { - g.fillAll (findColour (ResizableWindow::backgroundColourId)); - } - - void resized() override - { - ballGenerator.centreWithSize (80, 50); - triggerAnimation(); - } - -private: - OwnedArray componentsToAnimate; - OwnedArray balls; - BallGeneratorComponent ballGenerator; - - ComponentAnimator animator; - int cycleCount; - - bool firstCallback = true; - - Button* createRandomButton() - { - DrawablePath normal, over; - - Path star1; - star1.addStar ({}, 5, 20.0f, 50.0f, 0.2f); - normal.setPath (star1); - normal.setFill (Colours::red); - - Path star2; - star2.addStar ({}, 7, 30.0f, 50.0f, 0.0f); - over.setPath (star2); - over.setFill (Colours::pink); - over.setStrokeFill (Colours::black); - over.setStrokeThickness (5.0f); - - auto juceIcon = getImageFromAssets ("juce_icon.png"); - - DrawableImage down; - down.setImage (juceIcon); - down.setOverlayColour (Colours::black.withAlpha (0.3f)); - - if (Random::getSystemRandom().nextInt (10) > 2) - { - auto type = Random::getSystemRandom().nextInt (3); - - auto* d = new DrawableButton ("Button", - type == 0 ? DrawableButton::ImageOnButtonBackground - : (type == 1 ? DrawableButton::ImageFitted - : DrawableButton::ImageAboveTextLabel)); - d->setImages (&normal, - Random::getSystemRandom().nextBool() ? &over : nullptr, - Random::getSystemRandom().nextBool() ? &down : nullptr); - - if (Random::getSystemRandom().nextBool()) - { - d->setColour (DrawableButton::backgroundColourId, getRandomBrightColour()); - d->setColour (DrawableButton::backgroundOnColourId, getRandomBrightColour()); - } - - d->setClickingTogglesState (Random::getSystemRandom().nextBool()); - return d; - } - - auto* b = new ImageButton ("ImageButton"); - - b->setImages (true, true, true, - juceIcon, 0.7f, Colours::transparentBlack, - juceIcon, 1.0f, getRandomDarkColour() .withAlpha (0.2f), - juceIcon, 1.0f, getRandomBrightColour().withAlpha (0.8f), - 0.5f); - return b; - } - - Button* createButton() - { - auto juceIcon = getImageFromAssets ("juce_icon.png").rescaled (128, 128); - - auto* b = new ImageButton ("ImageButton"); - - b->setImages (true, true, true, - juceIcon, 1.0f, Colours::transparentBlack, - juceIcon, 1.0f, Colours::white, - juceIcon, 1.0f, Colours::white, - 0.5f); - - return b; - } - - void triggerAnimation() - { - auto width = getWidth(); - auto height = getHeight(); - - bool useWidth = (height > width); - - for (auto* component : componentsToAnimate) - { - auto newIndex = (componentsToAnimate.indexOf (component) + 3 * cycleCount) - % componentsToAnimate.size(); - - auto angle = (float) newIndex * MathConstants::twoPi / (float) componentsToAnimate.size(); - - auto radius = useWidth ? (float) width * 0.35f - : (float) height * 0.35f; - - Rectangle r (getWidth() / 2 + (int) (radius * std::sin (angle)) - 50, - getHeight() / 2 + (int) (radius * std::cos (angle)) - 50, - 100, 100); - - animator.animateComponent (component, r.reduced (10), 1.0f, - 900 + (int) (300 * std::sin (angle)), - false, 0.0, 0.0); - } - - ++cycleCount; - } - - void timerCallback() override - { - if (firstCallback) - { - triggerAnimation(); - firstCallback = false; - } - - // Go through each of our balls and update their position - for (int i = balls.size(); --i >= 0;) - if (! balls.getUnchecked (i)->step()) - balls.remove (i); - - // Randomly generate new balls - if (Random::getSystemRandom().nextInt (100) < 4) - addAndMakeVisible (balls.add (new BallComponent (ballGenerator.getBounds().getCentre().toFloat()))); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AnimationDemo) -}; diff --git a/examples/GUI/AnimationEasingDemo.h b/examples/GUI/AnimationEasingDemo.h new file mode 100644 index 0000000000..2efd95bef4 --- /dev/null +++ b/examples/GUI/AnimationEasingDemo.h @@ -0,0 +1,849 @@ +/* + ============================================================================== + + This file is part of the JUCE framework examples. + Copyright (c) Raw Material Software Limited + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + to use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + + ============================================================================== +*/ + +/******************************************************************************* + The block below describes the properties of this PIP. A PIP is a short snippet + of code that can be read by the Projucer and used to generate a JUCE project. + + BEGIN_JUCE_PIP_METADATA + + name: AnimationEasingDemo + version: 1.0.0 + vendor: JUCE + website: http://juce.com + description: Application for comparing animation easings. + + dependencies: juce_gui_basics, juce_animation + + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone + + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + + type: Component + mainClass: AnimationEasingDemo + + useLocalCopy: 1 + + END_JUCE_PIP_METADATA + +*******************************************************************************/ + +#pragma once + +#include "../Assets/DemoUtilities.h" + +struct AnimationEasingDemoConstants +{ + static constexpr auto smallGapSize = 5; + static constexpr auto mediumGapSize = smallGapSize * 2; + static constexpr auto largeGapSize = mediumGapSize * 2; + static constexpr auto defaultComponentHeight = 35; + inline static const auto cp1AccentColour = Colour { 0xffff0088 }; + inline static const auto cp2AccentColour = Colour { 0xff00aabb }; +}; + +struct AnimationEasingDemoHelpers +{ + static int calculateSectionSize (int originalSize, int numberOfSections, int gapSize) + { + const auto totalGapSize = (float) gapSize * ((float) numberOfSections - 1.0f); + const auto totalSizeOfAllSections = (float) originalSize - totalGapSize; + return roundToInt (totalSizeOfAllSections / (float) numberOfSections); + } + + static void layoutComponentsHorizontally (Rectangle bounds, const std::vector& components, int gapSize = AnimationEasingDemoConstants::smallGapSize) + { + const auto componentWidth = calculateSectionSize (bounds.getWidth(), (int) components.size(), gapSize); + + for (auto* component : components) + { + const auto newComponentBounds = bounds.removeFromLeft (componentWidth); + + if (component != nullptr) + component->setBounds (newComponentBounds); + + bounds.removeFromLeft (gapSize); + } + } + + static void layoutComponentsVertically (Rectangle bounds, const std::vector& components, int gapSize = AnimationEasingDemoConstants::smallGapSize) + { + const auto componentHeight = calculateSectionSize (bounds.getHeight(), (int) components.size(), gapSize); + + for (auto* component : components) + { + const auto newComponentBounds = bounds.removeFromTop (componentHeight); + + if (component != nullptr) + component->setBounds (newComponentBounds); + + bounds.removeFromTop (gapSize); + } + } + + static void layoutComponentsVerticallyOrHorizontally (Rectangle bounds, const std::vector& components, int gapSize = AnimationEasingDemoConstants::smallGapSize) + { + if (bounds.getHeight() > bounds.getWidth()) + layoutComponentsVertically (bounds, components, gapSize); + else + layoutComponentsHorizontally (bounds, components, gapSize); + } +}; + +struct AnimationSettings +{ + Value shouldAnimatePosition; + Value shouldAnimateSize; + Value shouldAnimateAlpha ; + Value durationMs; +}; + +class AnimationSettingsComponent final : public Component +{ +public: + explicit AnimationSettingsComponent (const AnimationSettings& settingsIn) + { + playbackControls.button.onClick = [&]{ NullCheckedInvocation::invoke (onAnimate); }; + + durationControls.slider.getValueObject().referTo (settingsIn.durationMs); + playbackControls.positionToggle.getToggleStateValue().referTo (settingsIn.shouldAnimatePosition); + playbackControls.sizeToggle.getToggleStateValue().referTo (settingsIn.shouldAnimateSize); + playbackControls.alphaToggle.getToggleStateValue().referTo (settingsIn.shouldAnimateAlpha); + + addAndMakeVisible (durationControls); + addAndMakeVisible (playbackControls); + } + + void resized() final + { + AnimationEasingDemoHelpers::layoutComponentsVertically (getLocalBounds(), { &playbackControls, &durationControls }); + } + + std::function onAnimate; + +private: + struct DurationControls final : public Component + { + DurationControls() + { + slider.setRange (50.0, 5000.0, 10.0); + slider.setValue (1000.0); + slider.setTextValueSuffix (" ms"); + + addAndMakeVisible (label); + addAndMakeVisible (slider); + } + + void resized() final + { + auto bounds = getLocalBounds(); + const auto labelWidth = label.getFont().getStringWidth (label.getText()) + AnimationEasingDemoConstants::largeGapSize; + label.setBounds (bounds.removeFromLeft (labelWidth)); + slider.setBounds (bounds); + } + + Label label { "", "Duration:" }; + Slider slider { Slider::SliderStyle::LinearHorizontal, Slider::TextEntryBoxPosition::TextBoxRight }; + }; + + struct PlaybackControls final : public Component + { + PlaybackControls() + { + addAndMakeVisible (button); + addAndMakeVisible (positionToggle); + addAndMakeVisible (sizeToggle); + addAndMakeVisible (alphaToggle); + } + + void resized() final + { + AnimationEasingDemoHelpers::layoutComponentsHorizontally (getLocalBounds(), { &button, nullptr, &positionToggle, &sizeToggle, &alphaToggle }); + } + + TextButton button { "Animate" }; + ToggleButton positionToggle { "Position" }; + ToggleButton sizeToggle { "Size" }; + ToggleButton alphaToggle { "Alpha" }; + }; + + DurationControls durationControls; + PlaybackControls playbackControls; +}; + +static Point convertPointInBoundsToBezierPoint (const Point& point, const Rectangle& bounds) +{ + return { jlimit (0.0f, 1.0f, jmap (point.getX(), bounds.getX(), bounds.getRight(), 0.0f, 1.0f)), + jmap (point.getY(), bounds.getBottom(), bounds.getY(), 0.0f, 1.0f) }; +} + +static Point convertBezierPointToPointInBounds (const Point& bezierPoint, const Rectangle& bounds) +{ + return bounds.getRelativePoint (bezierPoint.getX(), 1.0f - bezierPoint.getY()); +} + +struct CubicBezier +{ + CubicBezier() = default; + CubicBezier (const Point& cp1In, + const Point& cp2In) + : cp1 (cp1In), + cp2 (cp2In) {} + + Point cp0 { 0.0f, 0.0f }; + Point cp1 {}; + Point cp2 {}; + Point cp3 { 1.0f, 1.0f }; + + bool operator!= (const CubicBezier& other) + { + const auto tie = [](const CubicBezier& x) { return std::tie (x.cp0, x.cp1, x.cp2, x.cp3); }; + return tie (*this) != tie (other); + } +}; + +class CubicBezierSettingsComponent final : public Component +{ +public: + CubicBezierSettingsComponent() + { + textEditor.setFont (Font (18.0f)); + textEditor.setColour (TextEditor::ColourIds::backgroundColourId, {}); + textEditor.setColour (TextEditor::ColourIds::highlightColourId, {}); + textEditor.setColour (TextEditor::ColourIds::outlineColourId, {}); + textEditor.setColour (TextEditor::ColourIds::focusedOutlineColourId, {}); + textEditor.setColour (TextEditor::ColourIds::shadowColourId, {}); + textEditor.setJustification (Justification::centred); + + updateText(); + textEditor.onTextChange = [&] + { + const auto strippedText = textEditor.getText().retainCharacters ("0123456789.-,"); + const auto stringValues = StringArray::fromTokens (strippedText, ",", ""); + + if (stringValues.size() == 4) + { + setCubicBezierCurve ({{ jlimit (0.0f, 1.0f, stringValues[0].getFloatValue()), stringValues[1].getFloatValue() }, + { jlimit (0.0f, 1.0f, stringValues[2].getFloatValue()), stringValues[3].getFloatValue() }}); + } + + updateText(); + }; + + addAndMakeVisible (textEditor); + } + + void setCubicBezierCurve (const CubicBezier& newBezierCurve) + { + if (std::exchange (bezierCurve, newBezierCurve) != newBezierCurve) + return; + + updateText(); + NullCheckedInvocation::invoke (onValueChange); + } + + CubicBezier getCubicBezierCurve() const + { + return bezierCurve; + } + + void resized() final + { + textEditor.setBounds (getLocalBounds()); + } + + std::function onValueChange; + +private: + void updateText() + { + ScopedValueSetter> pauseOnTextChangeCallbacks (textEditor.onTextChange, nullptr); + + ScopeGuard restoreCaretPosition {[p = textEditor.getCaretPosition(), this] + { + textEditor.setCaretPosition (p); + }}; + + textEditor.clear(); + + textEditor.setColour (TextEditor::ColourIds::textColourId, Colours::white); + textEditor.insertTextAtCaret ("cubicBezier ("); + + textEditor.setColour (TextEditor::ColourIds::textColourId, AnimationEasingDemoConstants::cp1AccentColour); + textEditor.insertTextAtCaret (String (bezierCurve.cp1.getX(), 2)); + + textEditor.setColour (TextEditor::ColourIds::textColourId, Colours::white); + textEditor.insertTextAtCaret (", "); + + textEditor.setColour (TextEditor::ColourIds::textColourId, AnimationEasingDemoConstants::cp1AccentColour); + textEditor.insertTextAtCaret (String (bezierCurve.cp1.getY(), 2)); + + textEditor.setColour (TextEditor::ColourIds::textColourId, Colours::white); + textEditor.insertTextAtCaret (", "); + + textEditor.setColour (TextEditor::ColourIds::textColourId, AnimationEasingDemoConstants::cp2AccentColour); + textEditor.insertTextAtCaret (String (bezierCurve.cp2.getX(), 2)); + + textEditor.setColour (TextEditor::ColourIds::textColourId, Colours::white); + textEditor.insertTextAtCaret (", "); + + textEditor.setColour (TextEditor::ColourIds::textColourId, AnimationEasingDemoConstants::cp2AccentColour); + textEditor.insertTextAtCaret (String (bezierCurve.cp2.getY(), 2)); + + textEditor.setColour (TextEditor::ColourIds::textColourId, Colours::white); + textEditor.insertTextAtCaret (")"); + } + + CubicBezier bezierCurve; + TextEditor textEditor; +}; + +class CubicBezierGraphComponent final : public Component +{ +public: + void setCubicBezierCurve (const CubicBezier& newBezierCurve) + { + if (std::exchange (bezierCurve, newBezierCurve) != newBezierCurve) + return; + + NullCheckedInvocation::invoke (onValueChange); + repaint(); + } + + CubicBezier getCubicBezierCurve() const + { + return bezierCurve; + } + + void paint (Graphics& g) final + { + const auto bounds = getGraphArea(); + const auto lineThickness = 6.0f; + const auto cp0 = getControlPointOnGraph (bezierCurve.cp0); + const auto cp1 = getControlPointOnGraph (bezierCurve.cp1); + const auto cp2 = getControlPointOnGraph (bezierCurve.cp2); + const auto cp3 = getControlPointOnGraph (bezierCurve.cp3); + const auto outlineColour = getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::outline); + const auto highlightColour = getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::highlightedFill); + const auto foregroundColour = getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::defaultText); + + // graph background + drawColouredLines (g, bounds, 15, { Colour{}, highlightColour.withAlpha (0.2f) }); + + // graph outline + g.setColour (outlineColour); + g.drawRect (bounds); + + // semi-transparent linear line + g.setColour (foregroundColour.withAlpha (0.15f)); + g.drawLine ({ cp0, cp3 }, lineThickness); + + // cubic-bezier curve + Path curve; + curve.startNewSubPath (cp0); + curve.cubicTo (cp1, cp2, cp3); + + g.setColour (foregroundColour); + g.strokePath (curve, PathStrokeType (lineThickness)); + + // lines between control points + g.setColour (foregroundColour); + g.drawLine ({ cp0, cp1 }, 2.0f); + g.drawLine ({ cp2, cp3 }, 2.0f); + + // control points + drawControlPoint (g, cp0, highlightColour.brighter()); + drawControlPoint (g, cp3, highlightColour.brighter()); + drawControlPoint (g, cp1, AnimationEasingDemoConstants::cp1AccentColour); + drawControlPoint (g, cp2, AnimationEasingDemoConstants::cp2AccentColour); + } + + void mouseDown (const MouseEvent& event) final + { + const auto pos = event.position; + const auto distanceToCp1 = pos.getDistanceFrom (getControlPointOnGraph (bezierCurve.cp1)); + const auto distanceToCp2 = pos.getDistanceFrom (getControlPointOnGraph (bezierCurve.cp2)); + + selectedControlPoint = distanceToCp1 <= distanceToCp2 ? &bezierCurve.cp1 + : &bezierCurve.cp2; + updateSelectedControlPoint (pos); + } + + void mouseDrag (const MouseEvent& event) final + { + updateSelectedControlPoint (event.position); + } + + std::function onValueChange; + +private: + Point getControlPointOnGraph (const Point& relativeControlPoint) + { + return convertBezierPointToPointInBounds (relativeControlPoint, getGraphArea()); + } + + void updateSelectedControlPoint (const Point& newPoint) + { + jassert (selectedControlPoint != nullptr); + + const auto newControlPoint = convertPointInBoundsToBezierPoint (newPoint, getGraphArea()); + + if (*selectedControlPoint == newControlPoint) + return; + + *selectedControlPoint = newControlPoint; + NullCheckedInvocation::invoke (onValueChange); + repaint(); + } + + Rectangle getGraphArea() const + { + const auto bounds = getLocalBounds().toFloat(); + const auto size = std::min (bounds.getWidth(), bounds.getHeight()); + return bounds.withSizeKeepingCentre (size, size).reduced (AnimationEasingDemoConstants::largeGapSize); + } + + void drawControlPoint (Graphics& g, const Point& point, Colour colour) + { + const auto size = jlimit (10.0f, 35.0f, (float) std::min (getWidth(), getHeight()) / 12.0f); + Rectangle bounds; + bounds.setSize (size, size); + bounds.setCentre (point); + + g.setColour (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::outline)); + g.drawEllipse (bounds, 2.0f); + + g.setColour (colour); + g.fillEllipse (bounds); + } + + void drawColouredLines (Graphics& g, Rectangle bounds, int numLines, std::vector colours) + { + const auto lineHeight = bounds.getHeight() / (float) numLines; + + for (size_t line = 0; line < (size_t) numLines; ++line) + { + g.setColour (colours[line % colours.size()]); + g.fillRect (bounds.removeFromTop (lineHeight)); + } + } + + CubicBezier bezierCurve; + Point* selectedControlPoint{}; +}; + +class AnimationView : public Component +{ +public: + AnimationView (const AnimationSettings& animationSettingsIn, + std::function easingFunctionFactoryIn) + : animationSettings (animationSettingsIn), + easingFunctionFactory (std::move (easingFunctionFactoryIn)) + { + jassert (easingFunctionFactory != nullptr); + + componentToAnimate.setInterceptsMouseClicks (false, false); + addAndMakeVisible (componentToAnimate); + } + + void animate() + { + showSettingsPage (false); + + const auto valueChangedCallback = [&](float v) + { + animateFrame (animationSettings.shouldAnimatePosition.getValue() ? v : 1.0f, + animationSettings.shouldAnimateSize.getValue() ? v : 1.0f, + animationSettings.shouldAnimateAlpha.getValue() ? v : 1.0f); + }; + + const auto animateIn = ValueAnimatorBuilder{}.withEasing (easingFunctionFactory()) + .withDurationMs (animationSettings.durationMs.getValue()) + .withValueChangedCallback (valueChangedCallback); + + const auto animateOut = animateIn.withValueChangedCallback ([=](auto v){ valueChangedCallback (1.0f - v); }); + + animator = std::make_unique (AnimatorSetBuilder (animateOut.build()) + .followedBy (400.0) + .followedBy (animateIn.build()) + .build()); + + updater.addAnimator (*animator); + animator->start(); + } + + void mouseDown (const MouseEvent&) final + { + animate(); + } + + void resized() override + { + auto bounds = getLocalBounds(); + componentToAnimate.setBounds (bounds); + settingsPageBackground.setBounds (bounds); + + editViewButton.setBounds (bounds.removeFromTop (AnimationEasingDemoConstants::defaultComponentHeight) + .removeFromRight (AnimationEasingDemoConstants::defaultComponentHeight * 2)); + + if (customSettingsPage != nullptr) + customSettingsPage->setBounds (bounds); + } + +protected: + void setCustomSettingsPage (Component& settingsPage) + { + customSettingsPage = &settingsPage; + editViewButton.onClick = [&]{ toggleSettingsPage(); }; + addChildComponent (settingsPageBackground); + addChildComponent (customSettingsPage); + + editViewButton.setButtonText ("Edit"); + addAndMakeVisible (editViewButton); + } + +private: + void showSettingsPage (bool shouldShowSettingsPage) + { + if (customSettingsPage == nullptr) + return; + + editViewButton.setButtonText (shouldShowSettingsPage ? "View" : "Edit"); + settingsPageBackground.setVisible (shouldShowSettingsPage); + customSettingsPage->setVisible (shouldShowSettingsPage); + } + + void toggleSettingsPage() + { + showSettingsPage (editViewButton.getButtonText() == "Edit"); + } + + struct JUCELogoComponent final : Component + { + void paint (Graphics& g) final + { + const auto bounds = getLocalBounds(); + g.setColour (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::highlightedFill)); + g.fillRect (bounds); + + g.setColour (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::defaultText)); + + const auto logo = getJUCELogoPath(); + g.addTransform (logo.getTransformToScaleToFit (bounds.toFloat().reduced (AnimationEasingDemoConstants::mediumGapSize), true)); + g.fillPath (logo); + } + }; + + void animateFrame (float position, float size, float alpha) + { + // Transforms don't work when scaling to 0 so this work around hides + // the component when the size is 0. As the alpha is also animated it's + // guaranteed to be correctly set when the size is not 0 + if (approximatelyEqual (size, 0.0f)) + { + componentToAnimate.setAlpha (0.0f); + return; + } + + const auto bounds = getLocalBounds().toFloat(); + const auto centre = bounds.getCentre(); + const auto xLimits = makeAnimationLimits (-bounds.getWidth(), 0.0f); + componentToAnimate.setTransform (AffineTransform{}.scaled (size, size, centre.getX(), centre.getY()) + .translated (xLimits.lerp (position), 0.0f)); + componentToAnimate.setAlpha (alpha); + } + + struct BackgroundFill : Component + { + void paint (Graphics& g) + { + g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground)); + } + }; + + AnimationSettings animationSettings; + std::function easingFunctionFactory {}; + BackgroundFill settingsPageBackground; + Component* customSettingsPage {}; + TextButton editViewButton; + std::unique_ptr animator; + VBlankAnimatorUpdater updater { this }; + JUCELogoComponent componentToAnimate; +}; + +class StandardEasingAnimationView final : public AnimationView +{ +public: + StandardEasingAnimationView (const AnimationSettings& settings, + ValueAnimatorBuilder::EasingFn easingFunction) + : AnimationView (settings, [=]{ return easingFunction; }) + {} +}; + +class CubicBezierEasingAnimationView final : public AnimationView +{ +public: + CubicBezierEasingAnimationView (const AnimationSettings& animationSettings) + : AnimationView (animationSettings, + [&]{ return Easings::createCubicBezier (bezierCurve.cp1, bezierCurve.cp2); }) + { + settingsPage.graph.onValueChange = [&] { setCubicBezierCurve (settingsPage.graph.getCubicBezierCurve()); }; + settingsPage.settings.onValueChange = [&] { setCubicBezierCurve (settingsPage.settings.getCubicBezierCurve()); }; + settingsPage.graph.setCubicBezierCurve ({ { 0.2f, 0.0f }, { 0.0f, 1.0f } }); + + setCustomSettingsPage (settingsPage); + } + +private: + struct SettingsPage : Component + { + SettingsPage() + { + addAndMakeVisible (graph); + addAndMakeVisible (settings); + } + + void resized() final + { + auto bounds = getLocalBounds(); + settings.setBounds (bounds.removeFromBottom (AnimationEasingDemoConstants::defaultComponentHeight)); + graph.setBounds (bounds); + } + + CubicBezierGraphComponent graph; + CubicBezierSettingsComponent settings; + }; + + void setCubicBezierCurve (const CubicBezier& newBezierCurve) + { + bezierCurve = newBezierCurve; + settingsPage.graph.setCubicBezierCurve (newBezierCurve); + settingsPage.settings.setCubicBezierCurve (newBezierCurve); + } + + + CubicBezier bezierCurve; + SettingsPage settingsPage; +}; + +struct SliderAndLabel final : public Component +{ + SliderAndLabel() + { + addAndMakeVisible (slider); + addAndMakeVisible (label); + } + + void resized() final + { + auto bounds = getLocalBounds(); + label.setBounds (bounds.removeFromTop (bounds.getHeight() / 2) + .removeFromBottom (AnimationEasingDemoConstants::defaultComponentHeight)); + slider.setBounds (bounds.removeFromTop (AnimationEasingDemoConstants::defaultComponentHeight)); + } + + Slider slider; + Label label; +}; + +class SpringEasingAnimationView final : public AnimationView +{ +public: + SpringEasingAnimationView (const AnimationSettings& animationSettings) + : AnimationView (animationSettings, + [&]{ return Easings::createSpring (SpringEasingOptions{}.withFrequency (getFrequency()) + .withAttenuation (getAttenuation()) + .withExtraAttenuationRange (getExtraAttenuationRange())); }) + { + setCustomSettingsPage (settingsPage); + } + +private: + float getFrequency() { return (float) settingsPage.frequency.slider.getValue(); } + float getAttenuation() { return (float) settingsPage.attenuation.slider.getValue(); } + float getExtraAttenuationRange() { return (float) settingsPage.extraAttenuationRange.slider.getValue(); } + + struct SettingsPage : Component + { + SettingsPage() + { + frequency.label.setText ("Frequency", NotificationType::dontSendNotification); + frequency.slider.setRange (1.0, 10.0, 1.0); + frequency.slider.setValue (3.0); + + attenuation.label.setText ("Attenuation", NotificationType::dontSendNotification); + attenuation.slider.setRange (1.0, 10.0, 1.0); + attenuation.slider.setValue (3.0); + + extraAttenuationRange.label.setText ("Extra attenuation range", NotificationType::dontSendNotification); + extraAttenuationRange.slider.setRange (0.05, 0.98, 0.01); + extraAttenuationRange.slider.setValue (0.25); + + addAndMakeVisible (frequency); + addAndMakeVisible (attenuation); + addAndMakeVisible (extraAttenuationRange); + } + + void resized() final + { + AnimationEasingDemoHelpers::layoutComponentsVertically (getLocalBounds(), { &frequency, &attenuation, &extraAttenuationRange }); + } + + SliderAndLabel frequency; + SliderAndLabel attenuation; + SliderAndLabel extraAttenuationRange; + }; + + SettingsPage settingsPage; +}; + +class BounceOutEasingAnimationView final : public AnimationView +{ +public: + BounceOutEasingAnimationView (const AnimationSettings& animationSettings) + : AnimationView (animationSettings, + [&]{ return Easings::createBounce (roundToInt (numberOfBounces.slider.getValue())); }) + { + numberOfBounces.label.setText ("Number of bounces", NotificationType::dontSendNotification); + numberOfBounces.slider.setRange (1.0, 10.0, 1.0); + numberOfBounces.slider.setValue (3.0); + + setCustomSettingsPage (numberOfBounces); + } + +private: + SliderAndLabel numberOfBounces; +}; + +class AnimationSelectorAndView final : public Component +{ + struct AnimationViewAndName + { + String name; + std::unique_ptr component; + }; + +public: + AnimationSelectorAndView (const AnimationSettings& settings) + { + views.push_back ({ "linear", std::make_unique (settings, Easings::createLinear()) }); + views.push_back ({ "ease (default)", std::make_unique (settings, Easings::createEase()) }); + views.push_back ({ "easeIn", std::make_unique (settings, Easings::createEaseIn()) }); + views.push_back ({ "easeOut", std::make_unique (settings, Easings::createEaseOut()) }); + views.push_back ({ "easeInOut", std::make_unique (settings, Easings::createEaseInOut()) }); + views.push_back ({ "easeOutBack", std::make_unique (settings, Easings::createEaseOutBack()) }); + views.push_back ({ "easeInOutCubic", std::make_unique (settings, Easings::createEaseInOutCubic()) }); + views.push_back ({ "cubicBezier", std::make_unique (settings) }); + views.push_back ({ "spring", std::make_unique (settings) }); + views.push_back ({ "bounce", std::make_unique (settings) }); + + for (auto [itemId, view] : enumerate (views, int { 1 })) + easingSelector.addItem (view.name, itemId); + + // select "ease" as the default + easingSelector.setSelectedItemIndex (1); + easingSelector.onChange = [&] + { + for (auto& view : views) + view.component->setVisible (false); + + views[(size_t) easingSelector.getSelectedItemIndex()].component->setVisible (true); + }; + + for (auto& view : views) + addChildComponent (view.component.get()); + + addAndMakeVisible (easingSelector); + } + + void animate() + { + for (auto& view : views) + view.component->animate(); + } + + void resized() final + { + auto bounds = getLocalBounds(); + + easingSelector.setBounds (bounds.removeFromTop (AnimationEasingDemoConstants::defaultComponentHeight)); + + bounds.removeFromTop (AnimationEasingDemoConstants::smallGapSize); + + for (auto& view : views) + view.component->setBounds (bounds); + } + +private: + ComboBox easingSelector; + std::vector views; +}; + +class AnimationEasingDemo final : public Component +{ +public: + //============================================================================== + AnimationEasingDemo() + { + animationSettings.durationMs = 1000.0; + animationSettings.shouldAnimatePosition = true; + animationSettings.shouldAnimateSize = false; + animationSettings.shouldAnimateAlpha = false; + + animationSettingsComponent.onAnimate = [=] + { + animationView1.animate(); + animationView2.animate(); + }; + + addAndMakeVisible (animationSettingsComponent); + addAndMakeVisible (animationView1); + addAndMakeVisible (animationView2); + + setSize (600, 400); + } + + //============================================================================== + void paint (Graphics& g) final + { + g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground)); + } + + void resized() override + { + auto bounds = getLocalBounds().reduced (AnimationEasingDemoConstants::largeGapSize); + + animationSettingsComponent.setBounds (bounds.removeFromTop (AnimationEasingDemoConstants::defaultComponentHeight * 2)); + bounds.removeFromTop (AnimationEasingDemoConstants::smallGapSize); + AnimationEasingDemoHelpers::layoutComponentsVerticallyOrHorizontally (bounds, { &animationView1, &animationView2 }); + } + +private: + //============================================================================== + AnimationSettings animationSettings; + AnimationSettingsComponent animationSettingsComponent { animationSettings }; + AnimationSelectorAndView animationView1 { animationSettings }; + AnimationSelectorAndView animationView2 { animationSettings }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AnimationEasingDemo) +}; diff --git a/examples/GUI/AnimatorsDemo.h b/examples/GUI/AnimatorsDemo.h new file mode 100644 index 0000000000..b646808967 --- /dev/null +++ b/examples/GUI/AnimatorsDemo.h @@ -0,0 +1,900 @@ +/* + ============================================================================== + + This file is part of the JUCE framework examples. + Copyright (c) Raw Material Software Limited + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + to use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + + ============================================================================== +*/ + +/******************************************************************************* + The block below describes the properties of this PIP. A PIP is a short snippet + of code that can be read by the Projucer and used to generate a JUCE project. + + BEGIN_JUCE_PIP_METADATA + + name: AnimatorsDemo + version: 1.0.0 + vendor: JUCE + website: http://juce.com + description: Application demonstrating how the JUCE provided Animator + classes can be used to create dynamic, composable, smooth + animations. + + dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, + juce_gui_basics, juce_animation + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone + + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + + type: Component + mainClass: AnimatorsDemo + + useLocalCopy: 1 + + END_JUCE_PIP_METADATA + +*******************************************************************************/ + +#pragma once + +struct Paintable +{ + virtual ~Paintable() = default; + virtual void paint (Graphics& g) const = 0; +}; + +namespace Shapes +{ + +class Arc final : public Paintable +{ + static constexpr auto pi = MathConstants::pi; + static constexpr auto arcStart = pi / 2.0f; + +public: + Arc() = default; + + Arc (Point centreIn, float radiusIn, float thicknessIn, Colour colourIn) + : centre (centreIn), + initialRadius (radiusIn - thicknessIn / 2), + initialThickness (thicknessIn), + colour (colourIn) + { + } + + void paint (Graphics& g) const override + { + if (! active) + return; + + const Graphics::ScopedSaveState s { g }; + + Path p; + p.addCentredArc (centre.getX(), + centre.getY(), + radius, + radius, + 0.0f, + arcStart, + arcStart + sweepAngle, + true); + + g.setColour (colour); + g.strokePath (p, { thickness, PathStrokeType::mitered }); + } + + void setActive (bool activeIn) + { + active = activeIn; + } + + auto getFanoutAnimator() const { return fanoutAnimator; } + + auto getFillAnimator() const { return fillAnimator; } + + Point centre; + float initialRadius = 0.0f, initialThickness = 0.0f; + Colour colour = Colours::white; + +private: + bool active = false; + float radius = 0.0f, thickness = 0.0f, sweepAngle = 0.0f; + + void reset() + { + sweepAngle = 0.0f; + radius = initialRadius; + thickness = initialThickness; + } + + Animator fanoutAnimator = ValueAnimatorBuilder{} + .withOnStartCallback ([this] + { + reset(); + active = true; + }) + .withValueChangedCallback ([this] (auto value) + { + sweepAngle = makeAnimationLimits (2.1f * MathConstants::pi).lerp (value); + }) + .withEasing (Easings::createLinear()) + .build(); + + Animator fillAnimator = ValueAnimatorBuilder{} + .withOnStartReturningValueChangedCallback ( + [this] + { + const auto thicknessChange = radius - 5.0f; + const std::tuple begin { initialRadius, initialThickness }; + const std::tuple end { initialRadius - thicknessChange / 2.0f, initialThickness + thicknessChange }; + const auto limits = makeAnimationLimits (begin, end); + + return [this, limits] (auto value) + { + std::tie (radius, thickness) = limits.lerp (value); + }; + }) + .withEasing (Easings::createLinear()) + .build(); +}; + +class Circle : public Paintable +{ +public: + Circle (Point centreIn, float radiusIn, Colour colourIn) + : centre (centreIn), radius (radiusIn), colour (colourIn) + { + } + + void paint (Graphics& g) const override + { + if (! active) + return; + + const Graphics::ScopedSaveState s { g }; + + g.setColour (colour); + g.fillEllipse (centre.getX() - radius, centre.getY() - radius, 2.0f * radius, 2.0f * radius); + } + + void setActive (bool activeIn) { active = activeIn; } + +private: + Point centre; + float radius = 0.0f; + Colour colour; + bool active = false; +}; + +/* Can return a subpath based on a proportion between [0, 1.0]. Useful for creating an animation + where a path is drawn over time. +*/ +class PartialPath +{ +public: + explicit PartialPath (std::initializer_list> points) + { + bool pathIsEmpty = false; + + for (auto p : points) + { + if (std::exchange (pathIsEmpty, true) == false) + { + path.startNewSubPath (p); + pts.push_back (std::make_pair (p, 0.0f)); + } + else + { + path.lineTo (p); + pts.push_back (std::make_pair (p, path.getLength())); + } + } + } + + Path getPartialPath (float proportion) const + { + proportion = jmin (1.0f, proportion); + + Path partialPath; + bool pathIsEmpty = false; + + if (pts.size() < 2) + return partialPath; + + const auto proportionalLength = path.getLength() * proportion; + + const auto lineTo = [&partialPath, &pathIsEmpty] (Point p) + { + if (std::exchange (pathIsEmpty, true) == false) + partialPath.startNewSubPath (p); + else + partialPath.lineTo (p); + }; + + for (const auto& point : pts) + { + if (point.second > proportionalLength) + { + lineTo (path.getPointAlongPath (proportionalLength)); + break; + } + + lineTo (point.first); + } + + return partialPath; + } + +private: + Path path; + std::vector, float>> pts; +}; + +class Checkmark : public Paintable +{ +public: + Checkmark (Rectangle placementIn, float thicknessIn) + : placement (placementIn), + partialPath { { placement.getX(), placement.getY() + 0.7f * placement.getHeight() }, + { placement.getX() + 0.4f * placement.getWidth(), placement.getBottom() }, + { placement.getRight(), placement.getY() + 0.2f * placement.getHeight() } }, + thickness (thicknessIn) + { + } + + void paint (Graphics& g) const override + { + if (exactlyEqual (progress, 0.0f)) + return; + + const Graphics::ScopedSaveState s { g }; + + g.setColour (colour); + + const auto p = partialPath.getPartialPath (progress); + g.strokePath (p, PathStrokeType { thickness, PathStrokeType::JointStyle::curved, PathStrokeType::EndCapStyle::rounded }); + } + + void setProgress (float p) { progress = p; } + +private: + Rectangle placement; + PartialPath partialPath; + float progress = 0.0f; + float thickness = 10.0f; + Colour colour { Colours::white }; +}; + +} // namespace Shapes + +inline auto createComponentMover (Component& component, Rectangle targetBounds) +{ + const auto boundsToTuple = [] (auto b) + { + return std::make_tuple (b.getX(), b.getY(), b.getWidth(), b.getHeight()); + }; + + const auto begin = boundsToTuple (component.getBoundsInParent()); + const auto end = boundsToTuple (targetBounds); + const auto limits = makeAnimationLimits (begin, end); + + return [&component, limits] (auto v) + { + const auto [x, y, w, h] = limits.lerp (v); + component.setBounds (x, y, w, h); + }; +} + +class AnimatedCheckmark : public Paintable +{ +public: + AnimatedCheckmark (Point centre, float radius, float thickness, Colour colour) + : arc (centre, radius, thickness, colour), + circle (centre, radius, colour), + checkmark (Rectangle { centre.getX() - radius, + centre.getY() - radius, + 2.0f * radius, + 2.0f * radius }.reduced (radius * 0.4f), + thickness) + { + } + + void paint (Graphics& g) const override + { + arc.paint (g); + circle.paint (g); + checkmark.paint (g); + } + + auto getAnimator() const { return animator; } + +private: + Shapes::Arc arc; + Shapes::Circle circle; + Shapes::Checkmark checkmark; + + Animator animator = [&] + { + circle.setActive (false); + + const auto checkmarkAnimator = ValueAnimatorBuilder{} + .withEasing (Easings::createEaseOutBack()) + .withDurationMs (450) + .withValueChangedCallback ([this] (auto value) + { + checkmark.setProgress (value); + }) + .build(); + + return AnimatorSetBuilder (arc.getFanoutAnimator()) + .followedBy (arc.getFillAnimator()) + .followedBy ([this] + { + arc.setActive (false); + circle.setActive (true); + }) + .followedBy (checkmarkAnimator) + .build(); + }(); +}; + +class FallingBall : public Component +{ +private: + template + auto getDimensions (Rectangle r) + { + return std::make_tuple (r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + +public: + void paint (Graphics& g) override + { + g.setColour (Colour { 0xff179af0 }); + const auto [x, y, width, height] = getDimensions (getLocalBounds().toFloat()); + g.fillEllipse (x, y, width, height); + } + + Animator updateAndGetAnimator() + { + newBounds = getBoundsInParent().withY (getParentHeight() - getHeight()); + return fallAnimator; + } + +private: + Rectangle newBounds; + + Animator fallAnimator = ValueAnimatorBuilder{} + .withOnStartReturningValueChangedCallback ([this] { return createComponentMover (*this, newBounds); }) + .withEasing (Easings::createBounce()) + .withDurationMs (600) + .build(); +}; + +class PulsingCheckmark : public Component +{ +public: + PulsingCheckmark (Point centre, float radius) + : checkmark ({ radius, radius }, radius, radius / 6.25f, Colour { 0xff1bc211 }) + { + const auto widthAndHeight = 2 * (int) radius; + const auto x = (int) (centre.getX() - radius); + const auto y = (int) (centre.getY() - radius); + + setBounds (x, y, widthAndHeight, widthAndHeight); + } + + //============================================================================== + void paint (Graphics& g) override + { + checkmark.paint (g); + } + + void mouseDown (const MouseEvent&) override + { + animator.complete(); + } + + Animator getAnimator() const { return animator; } + +private: + //============================================================================== + AnimatedCheckmark checkmark; + + Animator animator = [&] + { + const auto checkmarkAnimator = checkmark.getAnimator(); + const auto checkmarkDuration = checkmarkAnimator.getDurationMs(); + + const auto pulseAnimator = ValueAnimatorBuilder{} + .withEasing (Easings::createOnOffRamp()) + .withOnStartReturningValueChangedCallback ( + [this] + { + const auto radius = (float) getWidth() / 2.0f; + const auto centreInParent = getBoundsInParent().toFloat().getPosition() + + Point { radius, radius }; + + return [this, centreInParent] (auto value) + { + setTransform (AffineTransform::translation (-centreInParent) + .followedBy (AffineTransform::scale (1.0f + 0.2f * value)) + .followedBy (AffineTransform::translation (centreInParent))); + }; + }) + .build(); + + const auto timeBeforePulseAnimation = checkmarkDuration - pulseAnimator.getDurationMs(); + + const auto repaintAnimator = ValueAnimatorBuilder{} + .withValueChangedCallback ([this] (auto) { repaint(); }) + .runningInfinitely() + .build(); + + return AnimatorSetBuilder (checkmarkAnimator) + .togetherWith (repaintAnimator) + .togetherWith (timeBeforePulseAnimation) + .followedBy (pulseAnimator) + .followedBy ([repaintAnimator] { repaintAnimator.complete(); }) + .build(); + }(); +}; + +// Displays the PulsingCheckmark as it looks when its animation is complete +class CompletedCheckmark : public Component +{ +public: + explicit CompletedCheckmark (std::function onClickIn) + : onClick (std::move (onClickIn)) {} + + void resized() override + { + const auto getCentre = [this] + { + return Point { (float) getWidth() / 2, (float) getHeight() / 2 }; + }; + + const auto radius = (float) std::min (getWidth(), getHeight()) / 2.0f; + checkmark = std::make_unique (getCentre(), radius); + checkmark->setInterceptsMouseClicks (false, false); + addAndMakeVisible (*checkmark); + checkmark->getAnimator().start(); + checkmark->getAnimator().complete(); + checkmark->getAnimator().update (0); + } + + void mouseDown (const MouseEvent&) override + { + NullCheckedInvocation::invoke (onClick); + } + +private: + std::unique_ptr checkmark; + std::function onClick; +}; + +class BallToolComponent : public Component +{ +public: + explicit BallToolComponent (std::function onClickIn) + : onClick (std::move (onClickIn)) {} + + void paint (Graphics& g) override + { + g.setColour (Colour { 0xff179af0 }); + g.fillEllipse (getLocalBounds().toFloat()); + } + + void mouseDown (const MouseEvent&) override + { + NullCheckedInvocation::invoke (onClick); + } + +private: + std::function onClick; +}; + +class AnimatorsDemo : public Component +{ +public: + //============================================================================== + AnimatorsDemo() + { + welcomeComponent.setOnAnimatedClickEnd ([this] + { + toolsPanel.open(); + }); + addAndMakeVisible (welcomeComponent); + + toolsPanel.onClose = [this] { welcomeComponent.reset(); }; + toolsPanel.addToolComponent (std::make_unique ([this] { selectedTool = SelectedTool::checkmark; })); + toolsPanel.addToolComponent (std::make_unique ([this] + { + selectedTool = SelectedTool::ball; + })); + addAndMakeVisible (toolsPanel); + + setSize (600, 400); + } + + //============================================================================== + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + + for (const auto& paintable : objects) + paintable.second->paint (g); + } + + void resized() override + { + welcomeComponent.setBounds (getLocalBounds()); + } + + void mouseDown (const MouseEvent& event) override + { + switch (selectedTool) + { + case SelectedTool::checkmark: + makeCheckmark (event.getPosition().toFloat()); + break; + + case SelectedTool::ball: + makeBall (event.getPosition().toFloat()); + break; + + case SelectedTool::none: + toolsPanel.wobbleLabel(); + break; + } + } + +private: + void makeCheckmark (Point centre) + { + auto checkmark = std::make_unique (centre, 50.0f); + updater.addAnimator (checkmark->getAnimator(), [this] { toolComponent.reset(); }); + checkmark->getAnimator().start(); + addAndMakeVisible (*checkmark, 0); + toolComponent = std::move (checkmark); + } + + void makeBall (Point centre) + { + auto ball = std::make_unique(); + addAndMakeVisible (*ball, 0); + const auto radius = 50.0f; + const Rectangle bounds { centre.getX() - radius, centre.getY() - radius, 2 * radius, 2 * radius }; + ball->setBounds (bounds.toNearestInt()); + auto animator = ball->updateAndGetAnimator(); + updater.addAnimator (animator, [this] { toolComponent.reset(); }); + animator.start(); + toolComponent = std::move (ball); + } + + //============================================================================== + VBlankAnimatorUpdater updater { this }; + + struct WelcomeComponent : public Component + { + WelcomeComponent() + { + startButton.onClick = [this] + { + animateForward = true; + buttonAnimator.start(); + updater.addAnimator (buttonAnimator, [this] { updater.removeAnimator (buttonAnimator); }); + }; + + addAndMakeVisible (startButton); + } + + void setOnAnimatedClickEnd (std::function onClickIn) + { + onClick = std::move (onClickIn); + } + + void reset() + { + animateForward = false; + buttonAnimator.start(); + updater.addAnimator (buttonAnimator, [this] { updater.removeAnimator (buttonAnimator); }); + } + + void resized() override + { + startButton.setBounds (getLocalBounds().withSizeKeepingCentre (140, 40)); + } + + private: + TextButton startButton { "Start demo" }; + bool animateForward = false; + Animator buttonAnimator = [&] + { + return ValueAnimatorBuilder{} + .withOnStartCallback ([this] { setVisible (true); }) + .withValueChangedCallback ([this] (auto value) + { + const auto progress = animateForward ? value : (1.0 - value); + setAlpha (1.0f - (float) progress); + }) + .withOnCompleteCallback ([this] + { + setVisible (! animateForward); + + if (animateForward) + NullCheckedInvocation::invoke (onClick); + }) + .build(); + }(); + + VBlankAnimatorUpdater updater { this }; + std::function onClick; + }; + + class WobblyLabel : public Component + { + public: + explicit WobblyLabel (const String& text) + : label ({}, text) + { + label.setJustificationType (Justification::right); + addAndMakeVisible (label); + } + + void resized() override + { + label.setBounds (getLocalBounds().withX ((int) offset)); + } + + void wobble() + { + updater.addAnimator (animator, [this] { updater.removeAnimator (animator); }); + animator.start(); + } + + private: + float offset = 0.0f; + Label label; + Animator animator = ValueAnimatorBuilder{}.withValueChangedCallback ( + [this] (float progress) + { + offset = 10.0f * std::sin (progress * 20.0f) * (1.0f - progress); + resized(); + }) + .withDurationMs (600) + .build(); + VBlankAnimatorUpdater updater { this }; + }; + + struct ToolsPanel : public Component + { + static constexpr auto margin = 15; + + ToolsPanel() + { + shadower.setOwner (this); + closeButton.onClick = [this] { close(); }; + addAndMakeVisible (closeButton); + addAndMakeVisible (label); + addAndMakeVisible (instructions); + addChildComponent (selectionComponent, 0); + + instructions.setJustificationType (Justification::centred); + } + + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId).brighter (0.1f)); + } + + void resized() override + { + closeButton.setBounds (getLocalBounds().removeFromTop (40) + .removeFromRight (40) + .reduced (5)); + + auto bounds = getLocalBounds(); + instructions.setBounds (bounds.removeFromBottom (30)); + + FlexBox flexBox; + flexBox.flexDirection = FlexBox::Direction::row; + flexBox.flexWrap = FlexBox::Wrap::noWrap; + flexBox.justifyContent = FlexBox::JustifyContent::center; + flexBox.alignItems = FlexBox::AlignItems::center; + + const auto height = (float) (bounds.getHeight() - 2 * margin); + + flexBox.items.add (FlexItem (label).withWidth (200.0f).withHeight (height)); + + for (auto& c : toolComponents) + flexBox.items.add (FlexItem (*c).withWidth (height).withHeight (height).withMargin (margin)); + + flexBox.performLayout (bounds); + } + + //============================================================================== + void open() + { + shouldOpen = true; + updater.addAnimator (slideInAnimator, [this] { updater.removeAnimator (slideInAnimator); }); + slideInAnimator.start(); + } + + void close() + { + shouldOpen = false; + updater.addAnimator (slideInAnimator, [this] + { + NullCheckedInvocation::invoke (onClose); + updater.removeAnimator (slideInAnimator); + }); + slideInAnimator.start(); + } + + void addToolComponent (std::unique_ptr component) + { + addAndMakeVisible (*component); + component->addMouseListener (this, false); + toolComponents.push_back (std::move (component)); + } + + //============================================================================== + void mouseUp (const MouseEvent& event) override + { + if (event.originalComponent == this) + return; + + const auto targetBounds = event.originalComponent->getBounds().expanded (std::min (10, margin)); + + if (! selectionComponent.isVisible()) + { + selectionComponent.setBounds (targetBounds); + selectionComponent.appear (updater); + } + else + { + selectionComponent.moveTo (updater, targetBounds); + } + } + + void wobbleLabel() + { + label.wobble(); + } + + private: + //============================================================================== + class SelectionComponent : public Component + { + public: + SelectionComponent() + { + setVisible (false); + } + + void paint (Graphics& g) override + { + arc.paint (g); + } + + void appear (VBlankAnimatorUpdater& animatorUpdater) + { + appearAnimator.start(); + animatorUpdater.addAnimator (appearAnimator, + [this, &animatorUpdater] + { + animatorUpdater.removeAnimator (appearAnimator); + }); + } + + void moveTo (VBlankAnimatorUpdater& animatorUpdater, Rectangle newBoundsIn) + { + newBounds = newBoundsIn; + moveToNewBoundsAnimator.start(); + animatorUpdater.addAnimator (moveToNewBoundsAnimator, + [this, &animatorUpdater] + { + animatorUpdater.removeAnimator (moveToNewBoundsAnimator); + }); + } + + private: + Shapes::Arc arc; + Rectangle newBounds; + + Animator appearAnimator = [&] + { + const auto repaintAnimator = + ValueAnimatorBuilder{} + .withValueChangedCallback ([this] (auto) { repaint(); }) + .runningInfinitely() + .build(); + + return AnimatorSetBuilder { [this] + { + setVisible (true); + arc.centre = Point { getWidth(), getHeight() }.toFloat() / 2; + arc.initialRadius = (float) (getWidth()) / 2 - 2.0f; + arc.initialThickness = 4.0f; + } } + .followedBy (repaintAnimator) + .togetherWith (arc.getFanoutAnimator()) + .followedBy ([repaintAnimator] { repaintAnimator.complete(); }) + .withTimeTransform ([] (auto v) { return 1.5 * v; }) + .build(); + }(); + + Animator moveToNewBoundsAnimator = ValueAnimatorBuilder{} + .withOnStartReturningValueChangedCallback ([this] { return createComponentMover (*this, newBounds); }) + .withEasing (Easings::createSpring()) + .withDurationMs (600) + .build(); + }; + + WobblyLabel label { "Select animation:" }; + Label instructions { "", "Click below to animate" }; + SelectionComponent selectionComponent; + std::vector> toolComponents; + DropShadow shadow { Colour { 0x90000000 }, 12, {} }; + DropShadower shadower { shadow }; + TextButton closeButton { "X" }; + + Animator slideInAnimator = ValueAnimatorBuilder{} + .withEasing (Easings::createEaseInOutCubic()) + .withOnStartReturningValueChangedCallback ( + [this] + { + const auto width = getParentWidth() - 2 * margin; + const auto height = 130; + setBounds (-width, margin, width, height); + setVisible (true); + + const auto limits = makeAnimationLimits (-width, margin); + + return [this, limits] (auto value) + { + const auto progress = std::clamp (shouldOpen ? value : 1.0 - value, 0.0, 1.0); + setTopLeftPosition (roundToInt (limits.lerp ((float) progress)), margin); + }; + }) + .withDurationMs (500) + .build(); + + VBlankAnimatorUpdater updater { this }; + bool shouldOpen = true; + + public: + std::function onClose; + }; + + enum class SelectedTool + { + none, + checkmark, + ball + }; + + WelcomeComponent welcomeComponent; + ToolsPanel toolsPanel; + SelectedTool selectedTool = SelectedTool::none; + std::unique_ptr toolComponent; + std::map> objects; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AnimatorsDemo) +};