git subrepo clone --branch=sono6good https://github.com/essej/JUCE.git deps/juce
subrepo: subdir: "deps/juce" merged: "b13f9084e" upstream: origin: "https://github.com/essej/JUCE.git" branch: "sono6good" commit: "b13f9084e" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596"
This commit is contained in:
deps/juce
.gitattributesCMakeLists.txtDemoRunner.jucerCMakeLists.txtCMakeLists.txtCMakeLists.txtjucer_Project.cppjucer_Project.hCMakeLists.txt
.github
.gitignore.gitlab-ci.yml.gitrepoBREAKING-CHANGES.txtCMakeLists.txtChangeList.txtLICENSE.mdREADME.mddocs
examples
Assets
AudioLiveScrollingDisplay.h
Box2DTests
AddPair.hApplyForce.hBodyTypes.hBreakable.hBridge.hBulletTest.hCantilever.hCar.hChain.hCharacterCollision.hCollisionFiltering.hCollisionProcessing.hCompoundShapes.hConfined.hContinuousTest.hDistanceTest.hDominos.hDumpShell.hDynamicTreeTest.hEdgeShapes.hEdgeTest.hGears.hOneSidedPlatform.hPinball.hPolyCollision.hPolyShapes.hPrismatic.hPulleys.hPyramid.hRayCast.hRevolute.hRope.hRopeJoint.hSensorTest.hShapeEditing.hSliderCrank.hSphereStack.hTestEntries.cppTheoJansen.hTiles.hTimeOfImpact.hTumbler.hVaryingFriction.hVaryingRestitution.hVerticalStack.hWeb.h
DSPDemos_Common.hDemoUtilities.hNotifications
images
ic_stat_name.pngic_stat_name10.pngic_stat_name2.pngic_stat_name3.pngic_stat_name4.pngic_stat_name5.pngic_stat_name6.pngic_stat_name7.pngic_stat_name8.pngic_stat_name9.png
sounds
Purchases
Ed.pngEd0.oggEd1.oggEd2.oggFabian.pngFabian0.oggFabian1.oggFabian2.oggJB.pngJB0.oggJB1.oggJB2.oggJules.pngJules0.oggJules1.oggJules2.oggLukasz.pngLukasz0.oggLukasz1.oggLukasz2.oggRobot.pngRobot0.oggRobot1.oggRobot2.oggicon.png
Signing
WavefrontObjParser.hcassette_recorder.wavcello.wavdemo table data.xmlgoogle-services.jsonguitar_amp.wavicons.zipjuce_icon.pngjuce_icon_template.pngjuce_module_infoportmeirion.jpgpower.pngproaudio.pathreverb_ir.wavsinging.oggteapot.objtile_background.pngtreedemo.xmlAudio
AudioAppDemo.hAudioLatencyDemo.hAudioPlaybackDemo.hAudioRecordingDemo.hAudioSettingsDemo.hAudioSynthesiserDemo.hCMakeLists.txtMPEDemo.hMidiDemo.hPluckedStringsDemo.hSimpleFFTDemo.h
CMake
CMakeLists.txtDSP
CMakeLists.txtConvolutionDemo.hFIRFilterDemo.hGainDemo.hIIRFilterDemo.hOscillatorDemo.hOverdriveDemo.hSIMDRegisterDemo.hStateVariableFilterDemo.hWaveShaperTanhDemo.h
DemoRunner
Builds
Android
app
CMakeLists.txtbuild.gradle
build.gradlesrc
debug
res
values
main
AndroidManifest.xml
assets
AudioLiveScrollingDisplay.h
Box2DTests
AddPair.hApplyForce.hBodyTypes.hBreakable.hBridge.hBulletTest.hCantilever.hCar.hChain.hCharacterCollision.hCollisionFiltering.hCollisionProcessing.hCompoundShapes.hConfined.hContinuousTest.hDistanceTest.hDominos.hDumpShell.hDynamicTreeTest.hEdgeShapes.hEdgeTest.hGears.hOneSidedPlatform.hPinball.hPolyCollision.hPolyShapes.hPrismatic.hPulleys.hPyramid.hRayCast.hRevolute.hRope.hRopeJoint.hSensorTest.hShapeEditing.hSliderCrank.hSphereStack.hTestEntries.cppTheoJansen.hTiles.hTimeOfImpact.hTumbler.hVaryingFriction.hVaryingRestitution.hVerticalStack.hWeb.h
DSPDemos_Common.hDemoUtilities.hNotifications
images
ic_stat_name.pngic_stat_name10.pngic_stat_name2.pngic_stat_name3.pngic_stat_name4.pngic_stat_name5.pngic_stat_name6.pngic_stat_name7.pngic_stat_name8.pngic_stat_name9.png
sounds
Purchases
Ed.pngEd0.oggEd1.oggEd2.oggFabian.pngFabian0.oggFabian1.oggFabian2.oggJB.pngJB0.oggJB1.oggJB2.oggJules.pngJules0.oggJules1.oggJules2.oggLukasz.pngLukasz0.oggLukasz1.oggLukasz2.oggRobot.pngRobot0.oggRobot1.oggRobot2.oggicon.png
Signing
WavefrontObjParser.hcassette_recorder.wavcello.wavdemo table data.xmlgoogle-services.jsonguitar_amp.wavicons.zipjuce_icon.pngjuce_icon_template.pngjuce_module_infoportmeirion.jpgpower.pngproaudio.pathreverb_ir.wavsinging.oggteapot.objtile_background.pngtreedemo.xmlres
release
res
values
gradle
gradlewgradlew.batsettings.gradleLinuxMakefile
MacOSX
VisualStudio2015
VisualStudio2017
VisualStudio2019
iOS
App.entitlementsIcon.icnsInfo-App.plistLaunchScreen.storyboard
DemoRunner.xcodeproj
DemoRunner
Images.xcassets
AppIcon.appiconset
Contents.jsonIcon-29.pngIcon-29@2x.pngIcon-29@3x.pngIcon-60@2x.pngIcon-72.pngIcon-72@2x.pngIcon-76.pngIcon-76@2x.pngIcon-83.5@2x.pngIcon-@3x.pngIcon-AppStore-1024.pngIcon-Notification-20@2x.pngIcon-Notification-20@3x.pngIcon-Notifications-20.pngIcon-Notifications-20@2x.pngIcon-Small-1.pngIcon-Small-50.pngIcon-Small-50@2x.pngIcon-Small@2x-1.pngIcon-Spotlight-40.pngIcon-Spotlight-40@2x-1.pngIcon-Spotlight-40@2x.pngIcon-Spotlight-40@3x.pngIcon.pngIcon@2x.png
LaunchImage.launchimage
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_analytics.cppinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_box2d.cppinclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_dsp.cppinclude_juce_dsp.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_osc.cppinclude_juce_product_unlocking.cppinclude_juce_product_unlocking.mminclude_juce_video.cppinclude_juce_video.mm
Source
GUI
AccessibilityDemo.hAnimationAppDemo.hAnimationDemo.hBouncingBallWavetableDemo.hCMakeLists.txtCameraDemo.hCodeEditorDemo.hComponentDemo.hComponentTransformsDemo.hDialogsDemo.hFlexBoxDemo.hFontsDemo.hGraphicsDemo.hGridDemo.hHelloWorldDemo.hImagesDemo.hKeyMappingsDemo.hLookAndFeelDemo.hMDIDemo.hMenusDemo.hMultiTouchDemo.hOpenGLAppDemo.hOpenGLDemo.hOpenGLDemo2D.hPropertiesDemo.hVideoDemo.hWebBrowserDemo.hWidgetsDemo.hWindowsDemo.h
Plugins
AUv3SynthPluginDemo.hArpeggiatorPluginDemo.hAudioPluginDemo.hCMakeLists.txtDSPModulePluginDemo.hGainPluginDemo.hInterAppAudioEffectPluginDemo.hMidiLoggerPluginDemo.hMultiOutSynthPluginDemo.hNoiseGatePluginDemo.hReaperEmbeddedViewPluginDemo.hSamplerPluginDemo.hSurroundPluginDemo.h
extern
Utilities
extras
AudioPerformanceTest
AudioPerformanceTest.jucerInfo-App.plistLaunchScreen.storyboardCMakeLists.txt
Builds
Android
LinuxMakefile
MacOSX
VisualStudio2019
AudioPerformanceTest.slnAudioPerformanceTest_App.vcxprojAudioPerformanceTest_App.vcxproj.filtersresources.rc
iOS
AudioPerformanceTest.xcodeproj
AudioPerformanceTest
Images.xcassets
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mm
Source
AudioPluginHost
AudioPluginHost.jucerIcon.icnsInfo-App.plistLaunchScreen.storyboardCMakeLists.txt
Builds
Android
app
CMakeLists.txtbuild.gradle
build.gradlesrc
debug
res
values
main
AndroidManifest.xml
assets
AudioLiveScrollingDisplay.h
Box2DTests
AddPair.hApplyForce.hBodyTypes.hBreakable.hBridge.hBulletTest.hCantilever.hCar.hChain.hCharacterCollision.hCollisionFiltering.hCollisionProcessing.hCompoundShapes.hConfined.hContinuousTest.hDistanceTest.hDominos.hDumpShell.hDynamicTreeTest.hEdgeShapes.hEdgeTest.hGears.hOneSidedPlatform.hPinball.hPolyCollision.hPolyShapes.hPrismatic.hPulleys.hPyramid.hRayCast.hRevolute.hRope.hRopeJoint.hSensorTest.hShapeEditing.hSliderCrank.hSphereStack.hTestEntries.cppTheoJansen.hTiles.hTimeOfImpact.hTumbler.hVaryingFriction.hVaryingRestitution.hVerticalStack.hWeb.h
DSPDemos_Common.hDemoUtilities.hNotifications
images
ic_stat_name.pngic_stat_name10.pngic_stat_name2.pngic_stat_name3.pngic_stat_name4.pngic_stat_name5.pngic_stat_name6.pngic_stat_name7.pngic_stat_name8.pngic_stat_name9.png
sounds
Purchases
Ed.pngEd0.oggEd1.oggEd2.oggFabian.pngFabian0.oggFabian1.oggFabian2.oggJB.pngJB0.oggJB1.oggJB2.oggJules.pngJules0.oggJules1.oggJules2.oggLukasz.pngLukasz0.oggLukasz1.oggLukasz2.oggRobot.pngRobot0.oggRobot1.oggRobot2.oggicon.png
Signing
WavefrontObjParser.hcassette_recorder.wavcello.wavdemo table data.xmlgoogle-services.jsonguitar_amp.wavicons.zipjuce_icon.pngjuce_icon_template.pngjuce_module_infoportmeirion.jpgpower.pngproaudio.pathreverb_ir.wavsinging.oggteapot.objtile_background.pngtreedemo.xmlres
release
res
values
gradle
gradlewgradlew.batsettings.gradleLinuxMakefile
MacOSX
VisualStudio2015
AudioPluginHost.slnAudioPluginHost_App.vcxprojAudioPluginHost_App.vcxproj.filtersicon.icoresources.rc
VisualStudio2017
AudioPluginHost.slnAudioPluginHost_App.vcxprojAudioPluginHost_App.vcxproj.filtersicon.icoresources.rc
VisualStudio2019
AudioPluginHost.slnAudioPluginHost_App.vcxprojAudioPluginHost_App.vcxproj.filtersicon.icoresources.rc
iOS
AudioPluginHost.xcodeproj
AudioPluginHost
Images.xcassets
AppIcon.appiconset
Contents.jsonIcon-29.pngIcon-29@2x.pngIcon-29@3x.pngIcon-60@2x.pngIcon-72.pngIcon-72@2x.pngIcon-76.pngIcon-76@2x.pngIcon-83.5@2x.pngIcon-@3x.pngIcon-AppStore-1024.pngIcon-Notification-20@2x.pngIcon-Notification-20@3x.pngIcon-Notifications-20.pngIcon-Notifications-20@2x.pngIcon-Small-1.pngIcon-Small-50.pngIcon-Small-50@2x.pngIcon-Small@2x-1.pngIcon-Spotlight-40.pngIcon-Spotlight-40@2x-1.pngIcon-Spotlight-40@2x.pngIcon-Spotlight-40@3x.pngIcon.pngIcon@2x.png
LaunchImage.launchimage
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_dsp.cppinclude_juce_dsp.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mm
Source
BinaryBuilder
Build
CMake
JUCECheckAtomic.cmakeJUCEConfig.cmake.inJUCEHelperTargets.cmakeJUCEModuleSupport.cmakeJUCEUtils.cmakeLaunchScreen.storyboardPIPAudioProcessor.cpp.inPIPComponent.cpp.inPIPConsole.cpp.inRecentFilesMenuTemplate.nibUnityPluginGUIScript.cs.incopyDir.cmakejuce_runtime_arch_detection.cpp
CMakeLists.txtjuce_build_tools
juce_build_tools.cppjuce_build_tools.h
utils
juce_BinaryResourceFile.cppjuce_BinaryResourceFile.hjuce_BuildHelperFunctions.cppjuce_BuildHelperFunctions.hjuce_CppTokeniserFunctions.cppjuce_Entitlements.cppjuce_Entitlements.hjuce_Icons.cppjuce_Icons.hjuce_PlistOptions.cppjuce_PlistOptions.hjuce_ProjectType.hjuce_RelativePath.hjuce_ResourceFileHelpers.cppjuce_ResourceFileHelpers.hjuce_ResourceRc.cppjuce_ResourceRc.hjuce_VersionNumbers.cppjuce_VersionNumbers.h
juceaide
NetworkGraphicsDemo
Builds
Android
LinuxMakefile
MacOSX
VisualStudio2019
NetworkGraphicsDemo.slnNetworkGraphicsDemo_App.vcxprojNetworkGraphicsDemo_App.vcxproj.filtersresources.rc
iOS
Icon.icnsInfo-App.plistLaunchScreen.storyboard
NetworkGraphicsDemo.xcodeproj
NetworkGraphicsDemo
Images.xcassets
AppIcon.appiconset
Contents.jsonIcon-29.pngIcon-29@2x.pngIcon-29@3x.pngIcon-60@2x.pngIcon-72.pngIcon-72@2x.pngIcon-76.pngIcon-76@2x.pngIcon-83.5@2x.pngIcon-@3x.pngIcon-AppStore-1024.pngIcon-Notification-20@2x.pngIcon-Notification-20@3x.pngIcon-Notifications-20.pngIcon-Notifications-20@2x.pngIcon-Small-1.pngIcon-Small-50.pngIcon-Small-50@2x.pngIcon-Small@2x-1.pngIcon-Spotlight-40.pngIcon-Spotlight-40@2x-1.pngIcon-Spotlight-40@2x.pngIcon-Spotlight-40@3x.pngIcon.pngIcon@2x.png
LaunchImage.launchimage
JuceLibraryCode
BinaryData.cppBinaryData.hJuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_osc.cpp
NetworkGraphicsDemo.jucerREADME.txtSource
Projucer
Builds
LinuxMakefile
MacOSX
VisualStudio2015
VisualStudio2017
VisualStudio2019
JuceLibraryCode
BinaryData.cppBinaryData.hJuceHeader.hReadMe.txtinclude_juce_build_tools.cppinclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mm
Projucer.jucerSource
Application
StartPage
jucer_ContentComponents.hjucer_NewProjectTemplates.hjucer_NewProjectWizard.cppjucer_NewProjectWizard.hjucer_StartPageComponent.cppjucer_StartPageComponent.hjucer_StartPageTreeHolder.h
UserAccount
Windows
jucer_AboutWindowComponent.hjucer_EditorColourSchemeWindowComponent.hjucer_FloatingToolWindow.hjucer_GlobalPathsWindowComponent.hjucer_PIPCreatorWindowComponent.hjucer_SVGPathDataWindowComponent.hjucer_TranslationToolWindowComponent.hjucer_UTF8WindowComponent.h
jucer_Application.cppjucer_Application.hjucer_AutoUpdater.cppjucer_AutoUpdater.hjucer_CommandIDs.hjucer_CommandLine.cppjucer_CommandLine.hjucer_CommonHeaders.hjucer_Headers.hjucer_Main.cppjucer_MainWindow.cppjucer_MainWindow.hBinaryData
Icons
background_logo.svgexport_android.svgexport_clion.svgexport_codeBlocks.svgexport_linux.svgexport_visualStudio.svgexport_xcode.svggpl_logo.svgjuce_icon.pngwizard_AnimatedApp.svgwizard_AudioApp.svgwizard_AudioPlugin.svgwizard_ConsoleApp.svgwizard_DLL.svgwizard_GUI.svgwizard_Highlight.svgwizard_OpenGL.svgwizard_Openfile.svgwizard_StaticLibrary.svg
Templates
jucer_AnimatedComponentSimpleTemplate.hjucer_AnimatedComponentTemplate.cppjucer_AnimatedComponentTemplate.hjucer_AudioComponentSimpleTemplate.hjucer_AudioComponentTemplate.cppjucer_AudioComponentTemplate.hjucer_AudioPluginEditorTemplate.cppjucer_AudioPluginEditorTemplate.hjucer_AudioPluginFilterTemplate.cppjucer_AudioPluginFilterTemplate.hjucer_ComponentTemplate.cppjucer_ComponentTemplate.hjucer_ContentCompSimpleTemplate.hjucer_ContentCompTemplate.cppjucer_ContentCompTemplate.hjucer_InlineComponentTemplate.hjucer_MainConsoleAppTemplate.cppjucer_MainTemplate_NoWindow.cppjucer_MainTemplate_Window.cppjucer_NewComponentTemplate.cppjucer_NewComponentTemplate.hjucer_NewCppFileTemplate.cppjucer_NewCppFileTemplate.hjucer_NewInlineComponentTemplate.hjucer_OpenGLComponentSimpleTemplate.hjucer_OpenGLComponentTemplate.cppjucer_OpenGLComponentTemplate.hjucer_PIPAudioProcessorTemplate.hjucer_PIPTemplate.h
colourscheme_dark.xmlcolourscheme_light.xmlgradle
CodeEditor
jucer_DocumentEditorComponent.cppjucer_DocumentEditorComponent.hjucer_ItemPreviewComponent.hjucer_OpenDocumentManager.cppjucer_OpenDocumentManager.hjucer_SourceCodeEditor.cppjucer_SourceCodeEditor.h
ComponentEditor
Components
jucer_ButtonHandler.hjucer_ComboBoxHandler.hjucer_ComponentNameProperty.hjucer_ComponentTypeHandler.cppjucer_ComponentTypeHandler.hjucer_ComponentUndoableAction.hjucer_GenericComponentHandler.hjucer_GroupComponentHandler.hjucer_HyperlinkButtonHandler.hjucer_ImageButtonHandler.hjucer_JucerComponentHandler.hjucer_LabelHandler.hjucer_SliderHandler.hjucer_TabbedComponentHandler.hjucer_TextButtonHandler.hjucer_TextEditorHandler.hjucer_ToggleButtonHandler.hjucer_TreeViewHandler.hjucer_ViewportHandler.h
Documents
PaintElements
jucer_ColouredElement.cppjucer_ColouredElement.hjucer_ElementSiblingComponent.hjucer_FillType.hjucer_GradientPointComponent.hjucer_ImageResourceProperty.hjucer_PaintElement.cppjucer_PaintElement.hjucer_PaintElementEllipse.hjucer_PaintElementGroup.cppjucer_PaintElementGroup.hjucer_PaintElementImage.cppjucer_PaintElementImage.hjucer_PaintElementPath.cppjucer_PaintElementPath.hjucer_PaintElementRectangle.hjucer_PaintElementRoundedRectangle.hjucer_PaintElementText.hjucer_PaintElementUndoableAction.hjucer_PointComponent.hjucer_StrokeType.h
Properties
jucer_ColourPropertyComponent.hjucer_ComponentBooleanProperty.hjucer_ComponentChoiceProperty.hjucer_ComponentColourProperty.hjucer_ComponentTextProperty.hjucer_FilePropertyComponent.hjucer_FontPropertyComponent.hjucer_JustificationProperty.hjucer_PositionPropertyBase.h
UI
jucer_ComponentLayoutEditor.cppjucer_ComponentLayoutEditor.hjucer_ComponentLayoutPanel.hjucer_ComponentOverlayComponent.cppjucer_ComponentOverlayComponent.hjucer_EditingPanelBase.cppjucer_EditingPanelBase.hjucer_JucerCommandIDs.hjucer_JucerDocumentEditor.cppjucer_JucerDocumentEditor.hjucer_PaintRoutineEditor.cppjucer_PaintRoutineEditor.hjucer_PaintRoutinePanel.cppjucer_PaintRoutinePanel.hjucer_RelativePositionedRectangle.hjucer_ResourceEditorPanel.cppjucer_ResourceEditorPanel.hjucer_SnapGridPainter.hjucer_TestComponent.cppjucer_TestComponent.h
jucer_BinaryResources.cppjucer_BinaryResources.hjucer_ComponentLayout.cppjucer_ComponentLayout.hjucer_GeneratedCode.cppjucer_GeneratedCode.hjucer_JucerDocument.cppjucer_JucerDocument.hjucer_ObjectTypes.cppjucer_ObjectTypes.hjucer_PaintRoutine.cppjucer_PaintRoutine.hjucer_UtilityFunctions.hLicenses
LiveBuildEngine
Project
Modules
UI
Sidebar
jucer_ExporterTreeItems.hjucer_FileTreeItems.hjucer_ModuleTreeItems.hjucer_ProjectTreeItemBase.hjucer_Sidebar.hjucer_TreeItemTypes.h
jucer_ContentViewComponent.hjucer_ContentViewComponents.hjucer_FileGroupInformationComponent.hjucer_HeaderComponent.cppjucer_HeaderComponent.hjucer_ModulesInformationComponent.hjucer_ProjectContentComponent.cppjucer_ProjectContentComponent.hjucer_ProjectMessagesComponent.hjucer_UserAvatarComponent.hProjectSaving
jucer_ProjectExport_Android.hjucer_ProjectExport_CLion.hjucer_ProjectExport_CodeBlocks.hjucer_ProjectExport_MSVC.hjucer_ProjectExport_Make.hjucer_ProjectExport_Xcode.hjucer_ProjectExporter.cppjucer_ProjectExporter.hjucer_ProjectSaver.cppjucer_ProjectSaver.hjucer_ResourceFile.cppjucer_ResourceFile.hjucer_XcodeProjectParser.h
Settings
jucer_AppearanceSettings.cppjucer_AppearanceSettings.hjucer_StoredSettings.cppjucer_StoredSettings.h
Utility
Helpers
jucer_CodeHelpers.cppjucer_CodeHelpers.hjucer_Colours.hjucer_FileHelpers.cppjucer_FileHelpers.hjucer_MiscUtilities.cppjucer_MiscUtilities.hjucer_NewFileWizard.cppjucer_NewFileWizard.hjucer_PresetIDs.hjucer_TranslationHelpers.hjucer_ValueSourceHelpers.hjucer_ValueWithDefaultWrapper.hjucer_VersionInfo.cppjucer_VersionInfo.h
PIPs
UI
PropertyComponents
jucer_ColourPropertyComponent.hjucer_FilePathPropertyComponent.hjucer_LabelPropertyComponent.hjucer_PropertyComponentsWithEnablement.h
jucer_IconButton.hjucer_Icons.cppjucer_Icons.hjucer_JucerTreeViewBase.cppjucer_JucerTreeViewBase.hjucer_ProjucerLookAndFeel.cppjucer_ProjucerLookAndFeel.hjucer_SlidingPanelComponent.cppjucer_SlidingPanelComponent.hUnitTestRunner
Builds
LinuxMakefile
MacOSX
VisualStudio2017
UnitTestRunner.slnUnitTestRunner_ConsoleApp.vcxprojUnitTestRunner_ConsoleApp.vcxproj.filtersresources.rc
VisualStudio2019
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_analytics.cppinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_dsp.cppinclude_juce_dsp.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_osc.cppinclude_juce_product_unlocking.cppinclude_juce_product_unlocking.mminclude_juce_video.cppinclude_juce_video.mm
Source
UnitTestRunner.jucerWindowsDLL
Builds
VisualStudio2019
JuceLibraryCode
JuceHeader.hReadMe.txtinclude_juce_audio_basics.cppinclude_juce_audio_basics.mminclude_juce_audio_devices.cppinclude_juce_audio_devices.mminclude_juce_audio_formats.cppinclude_juce_audio_formats.mminclude_juce_audio_processors.cppinclude_juce_audio_processors.mminclude_juce_audio_utils.cppinclude_juce_audio_utils.mminclude_juce_core.cppinclude_juce_core.mminclude_juce_cryptography.cppinclude_juce_cryptography.mminclude_juce_data_structures.cppinclude_juce_data_structures.mminclude_juce_events.cppinclude_juce_events.mminclude_juce_graphics.cppinclude_juce_graphics.mminclude_juce_gui_basics.cppinclude_juce_gui_basics.mminclude_juce_gui_extra.cppinclude_juce_gui_extra.mminclude_juce_opengl.cppinclude_juce_opengl.mminclude_juce_video.cppinclude_juce_video.mm
WindowsDLL.jucermodules
CMakeLists.txtjuce_android_Audio.cppjuce_android_HighPerformanceAudioHelpers.hjuce_android_Midi.cppjuce_android_Oboe.cppjuce_android_OpenSL.cppjuce_ios_Audio.cppjuce_ios_Audio.hjuce_linux_ALSA.cppjuce_linux_Bela.cppjuce_linux_JackAudio.cppjuce_linux_Midi.cppjuce_mac_CoreAudio.cppjuce_mac_CoreMidi.mmjuce_win32_ASIO.cppjuce_win32_DirectSound.cppjuce_win32_Midi.cppjuce_win32_WASAPI.cppAUResources.rjuce_audio_processors.cppjuce_audio_processors.hjuce_audio_processors.mmjuce_MultiTouchMapper.hjuce_ScopedDPIAwarenessDisabler.hjuce_android_ContentSharer.cppjuce_android_FileChooser.cppjuce_android_Windowing.cppjuce_common_MimeTypes.cppjuce_ios_ContentSharer.cppjuce_ios_FileChooser.mmjuce_ios_UIViewComponentPeer.mmjuce_ios_Windowing.mmjuce_linux_FileChooser.cppjuce_linux_Windowing.cppjuce_mac_FileChooser.mmjuce_mac_MainMenu.mmjuce_mac_MouseCursor.mmjuce_mac_NSViewComponentPeer.mmjuce_mac_Windowing.mmjuce_win32_DragAndDrop.cppjuce_win32_FileChooser.cppjuce_win32_ScopedThreadDPIAwarenessSetter.hjuce_win32_Windowing.cppjuce_OpenGLExtensions.hjuce_OpenGL_android.hjuce_OpenGL_ios.hjuce_OpenGL_linux_X11.hjuce_OpenGL_osx.hjuce_OpenGL_win32.h
juce_analytics
juce_audio_basics
audio_play_head
buffers
juce_AudioChannelSet.cppjuce_AudioChannelSet.hjuce_AudioDataConverters.cppjuce_AudioDataConverters.hjuce_AudioProcessLoadMeasurer.cppjuce_AudioProcessLoadMeasurer.hjuce_AudioSampleBuffer.hjuce_FloatVectorOperations.cppjuce_FloatVectorOperations.h
juce_audio_basics.cppjuce_audio_basics.hjuce_audio_basics.mmmidi
juce_MidiBuffer.cppjuce_MidiBuffer.hjuce_MidiDataConcatenator.hjuce_MidiFile.cppjuce_MidiFile.hjuce_MidiKeyboardState.cppjuce_MidiKeyboardState.hjuce_MidiMessage.cppjuce_MidiMessage.hjuce_MidiMessageSequence.cppjuce_MidiMessageSequence.hjuce_MidiRPN.cppjuce_MidiRPN.h
ump
juce_UMP.hjuce_UMPConversion.hjuce_UMPConverters.hjuce_UMPDispatcher.hjuce_UMPFactory.hjuce_UMPIterator.hjuce_UMPMidi1ToBytestreamTranslator.hjuce_UMPMidi1ToMidi2DefaultTranslator.cppjuce_UMPMidi1ToMidi2DefaultTranslator.hjuce_UMPProtocols.hjuce_UMPReceiver.hjuce_UMPSysEx7.cppjuce_UMPSysEx7.hjuce_UMPTests.cppjuce_UMPUtils.cppjuce_UMPUtils.hjuce_UMPView.cppjuce_UMPView.hjuce_UMPacket.hjuce_UMPackets.h
mpe
juce_MPEInstrument.cppjuce_MPEInstrument.cpp.origjuce_MPEInstrument.hjuce_MPEInstrument.h.origjuce_MPEMessages.cppjuce_MPEMessages.hjuce_MPENote.cppjuce_MPENote.hjuce_MPESynthesiser.cppjuce_MPESynthesiser.hjuce_MPESynthesiserBase.cppjuce_MPESynthesiserBase.hjuce_MPESynthesiserVoice.cppjuce_MPESynthesiserVoice.hjuce_MPEUtils.cppjuce_MPEUtils.hjuce_MPEValue.cppjuce_MPEValue.hjuce_MPEZoneLayout.cppjuce_MPEZoneLayout.h
native
sources
juce_AudioSource.hjuce_BufferingAudioSource.cppjuce_BufferingAudioSource.hjuce_ChannelRemappingAudioSource.cppjuce_ChannelRemappingAudioSource.hjuce_IIRFilterAudioSource.cppjuce_IIRFilterAudioSource.hjuce_MemoryAudioSource.cppjuce_MemoryAudioSource.hjuce_MixerAudioSource.cppjuce_MixerAudioSource.hjuce_PositionableAudioSource.hjuce_ResamplingAudioSource.cppjuce_ResamplingAudioSource.hjuce_ReverbAudioSource.cppjuce_ReverbAudioSource.hjuce_ToneGeneratorAudioSource.cppjuce_ToneGeneratorAudioSource.h
synthesisers
utilities
juce_audio_devices
audio_io
juce_AudioDeviceManager.cppjuce_AudioDeviceManager.hjuce_AudioIODevice.cppjuce_AudioIODevice.hjuce_AudioIODeviceType.cppjuce_AudioIODeviceType.hjuce_SystemAudioVolume.h
juce_audio_devices.cppjuce_audio_devices.hjuce_audio_devices.mmmidi_io
native
java
app
com
rmsl
oboe
CMakeLists.txtLICENSEREADME.md
include
oboe
src
aaudio
common
AudioClock.hAudioSourceCaller.cppAudioSourceCaller.hAudioStream.cppAudioStreamBuilder.cppDataConversionFlowGraph.cppDataConversionFlowGraph.hFilterAudioStream.cppFilterAudioStream.hFixedBlockAdapter.cppFixedBlockAdapter.hFixedBlockReader.cppFixedBlockReader.hFixedBlockWriter.cppFixedBlockWriter.hLatencyTuner.cppMonotonicCounter.hOboeDebug.hQuirksManager.cppQuirksManager.hSourceFloatCaller.cppSourceFloatCaller.hSourceI16Caller.cppSourceI16Caller.hSourceI24Caller.cppSourceI24Caller.hSourceI32Caller.cppSourceI32Caller.hStabilizedCallback.cppTrace.cppTrace.hUtilities.cppVersion.cpp
fifo
FifoBuffer.cppFifoBuffer.hFifoController.cppFifoController.hFifoControllerBase.cppFifoControllerBase.hFifoControllerIndirect.cppFifoControllerIndirect.h
flowgraph
ChannelCountConverter.cppChannelCountConverter.hClipToRange.cppClipToRange.hFlowGraphNode.cppFlowGraphNode.hFlowgraphUtilities.hManyToMultiConverter.cppManyToMultiConverter.hMonoToMultiConverter.cppMonoToMultiConverter.hMultiToMonoConverter.cppMultiToMonoConverter.hRampLinear.cppRampLinear.hSampleRateConverter.cppSampleRateConverter.hSinkFloat.cppSinkFloat.hSinkI16.cppSinkI16.hSinkI24.cppSinkI24.hSinkI32.cppSinkI32.hSourceFloat.cppSourceFloat.hSourceI16.cppSourceI16.hSourceI24.cppSourceI24.hSourceI32.cppSourceI32.h
resampler
HyperbolicCosineWindow.hIntegerRatio.cppIntegerRatio.hKaiserWindow.hLinearResampler.cppLinearResampler.hMultiChannelResampler.cppMultiChannelResampler.hPolyphaseResampler.cppPolyphaseResampler.hPolyphaseResamplerMono.cppPolyphaseResamplerMono.hPolyphaseResamplerStereo.cppPolyphaseResamplerStereo.hSincResampler.cppSincResampler.hSincResamplerStereo.cppSincResamplerStereo.h
opensles
AudioInputStreamOpenSLES.cppAudioInputStreamOpenSLES.hAudioOutputStreamOpenSLES.cppAudioOutputStreamOpenSLES.hAudioStreamBuffered.cppAudioStreamBuffered.hAudioStreamOpenSLES.cppAudioStreamOpenSLES.hEngineOpenSLES.cppEngineOpenSLES.hOpenSLESUtilities.cppOpenSLESUtilities.hOutputMixerOpenSLES.cppOutputMixerOpenSLES.h
sources
juce_audio_formats
codecs
flac
Flac Licence.txtall.halloc.hassert.hcallback.hcompat.hendswap.hexport.hformat.h
juce_AiffAudioFormat.cppjuce_AiffAudioFormat.hjuce_CoreAudioFormat.cppjuce_CoreAudioFormat.hjuce_FlacAudioFormat.cppjuce_FlacAudioFormat.hjuce_LAMEEncoderAudioFormat.cppjuce_LAMEEncoderAudioFormat.hjuce_MP3AudioFormat.cppjuce_MP3AudioFormat.hjuce_OggVorbisAudioFormat.cppjuce_OggVorbisAudioFormat.hjuce_WavAudioFormat.cppjuce_WavAudioFormat.hjuce_WindowsMediaAudioFormat.cppjuce_WindowsMediaAudioFormat.hlibFLAC
bitmath.cbitreader.cbitwriter.ccpu.ccrc.cfixed.cfloat.cformat.clpc_flac.cmd5.cmemory.cstream_decoder.cstream_encoder.cstream_encoder_framing.cwindow_flac.c
metadata.hordinals.hstream_decoder.hstream_encoder.hwin_utf8_io.hinclude
private
all.hbitmath.hbitreader.hbitwriter.hcpu.hcrc.hfixed.hfloat.hformat.hlpc.hmd5.hmemory.hmetadata.hstream_encoder.hstream_encoder_framing.hwindow.h
protected
oggvorbis
Ogg Vorbis Licence.txtbitwise.ccodec.hconfig_types.hcrctable.hframing.c
libvorbis-1.3.7
AUTHORSCHANGESCOPYINGREADME.md
ogg.hos_types.hvorbisenc.hvorbisfile.hlib
analysis.cbackends.hbitrate.cbitrate.hblock.c
books
codebook.ccodebook.hcodec_internal.henvelope.cenvelope.hfloor0.cfloor1.chighlevel.hinfo.clookup.clookup.hlookup_data.hlpc.clpc.hlsp.clsp.hmapping0.cmasking.hmdct.cmdct.hmisc.cmisc.hmodes
floor_all.hpsych_11.hpsych_16.hpsych_44.hpsych_8.hresidue_16.hresidue_44.hresidue_44p51.hresidue_44u.hresidue_8.hsetup_11.hsetup_16.hsetup_22.hsetup_32.hsetup_44.hsetup_44p51.hsetup_44u.hsetup_8.hsetup_X.h
os.hpsy.cpsy.hregistry.cregistry.hres0.cscales.hsharedbook.csmallft.csmallft.hsynthesis.cvorbisenc.cvorbisfile.cwindow.cwindow.hformat
juce_AudioFormat.cppjuce_AudioFormat.hjuce_AudioFormatManager.cppjuce_AudioFormatManager.hjuce_AudioFormatReader.cppjuce_AudioFormatReader.hjuce_AudioFormatReaderSource.cppjuce_AudioFormatReaderSource.hjuce_AudioFormatWriter.cppjuce_AudioFormatWriter.hjuce_AudioSubsectionReader.cppjuce_AudioSubsectionReader.hjuce_BufferingAudioFormatReader.cppjuce_BufferingAudioFormatReader.hjuce_MemoryMappedAudioFormatReader.h
juce_audio_formats.cppjuce_audio_formats.hjuce_audio_formats.mmsampler
juce_audio_plugin_client
AAX
AU
CoreAudioUtilityClasses
AUBase.cppAUBase.hAUBaseHelper.hAUBuffer.cppAUBuffer.hAUCarbonViewBase.cppAUCarbonViewBase.hAUCarbonViewControl.cppAUCarbonViewControl.hAUCarbonViewDispatch.cppAUDispatch.cppAUDispatch.hAUInputElement.cppAUInputElement.hAUInputFormatConverter.hAUMIDIBase.cppAUMIDIBase.hAUOutputBase.cppAUOutputBase.hAUOutputElement.cppAUOutputElement.hAUPlugInDispatch.cppAUPlugInDispatch.hAUScopeElement.cppAUScopeElement.hAUSilentTimeout.hAUTimestampGenerator.hAUViewLocalizedStringKeys.hCAAUParameter.cppCAAUParameter.hCAAtomic.hCAAtomicStack.hCAAudioChannelLayout.cppCAAudioChannelLayout.hCAAutoDisposer.hCADebugMacros.hCADebugPrintf.hCAException.hCAHostTimeBase.hCAMath.hCAMutex.cppCAMutex.hCAReferenceCounted.hCAStreamBasicDescription.cppCAStreamBasicDescription.hCAThreadSafeList.hCAVectorUnit.cppCAVectorUnit.hCAVectorUnitTypes.hCAXException.hCarbonEventHandler.cppCarbonEventHandler.hComponentBase.cppComponentBase.hMusicDeviceBase.cppMusicDeviceBase.h
juce_AU_Wrapper.mmjuce_AUv3_Wrapper.mmRTAS
juce_RTAS_DigiCode1.cppjuce_RTAS_DigiCode2.cppjuce_RTAS_DigiCode3.cppjuce_RTAS_DigiCode_Header.hjuce_RTAS_MacUtilities.mmjuce_RTAS_WinExports.defjuce_RTAS_WinResources.rsrjuce_RTAS_WinUtilities.cppjuce_RTAS_Wrapper.cpp
Standalone
Unity
VST
VST3
juce_audio_plugin_client.hjuce_audio_plugin_client_AAX.cppjuce_audio_plugin_client_AAX.mmjuce_audio_plugin_client_AU.rjuce_audio_plugin_client_AU_1.mmjuce_audio_plugin_client_AU_2.mmjuce_audio_plugin_client_AUv3.mmjuce_audio_plugin_client_RTAS.rjuce_audio_plugin_client_RTAS_1.cppjuce_audio_plugin_client_RTAS_2.cppjuce_audio_plugin_client_RTAS_3.cppjuce_audio_plugin_client_RTAS_4.cppjuce_audio_plugin_client_RTAS_utils.cppjuce_audio_plugin_client_RTAS_utils.mmjuce_audio_plugin_client_Standalone.cppjuce_audio_plugin_client_Unity.cppjuce_audio_plugin_client_VST2.cppjuce_audio_plugin_client_VST3.cppjuce_audio_plugin_client_VST_utils.mmjuce_audio_plugin_client_utils.cpputility
juce_audio_processors
format
juce_AudioPluginFormat.cppjuce_AudioPluginFormat.hjuce_AudioPluginFormatManager.cppjuce_AudioPluginFormatManager.h
format_types
VST3_SDK
JUCE_README.mdLICENSE.txtREADME.mdVST3_License_Agreement.pdfVST3_Usage_Guidelines.pdf
juce_AU_Shared.hjuce_AudioUnitPluginFormat.hjuce_AudioUnitPluginFormat.mmjuce_LADSPAPluginFormat.cppjuce_LADSPAPluginFormat.hjuce_LegacyAudioParameter.cppjuce_VST3Common.hjuce_VST3Headers.hjuce_VST3PluginFormat.cppjuce_VST3PluginFormat.hjuce_VSTCommon.hjuce_VSTMidiEventList.hjuce_VSTPluginFormat.cppjuce_VSTPluginFormat.hbase
LICENSE.txtREADME.md
source
baseiids.cppclassfactoryhelpers.hfbuffer.cppfbuffer.hfdebug.cppfdebug.hfobject.cppfobject.hfstreamer.cppfstreamer.hfstring.cppfstring.hupdatehandler.cppupdatehandler.h
thread
pluginterfaces
LICENSE.txtREADME.md
base
conststringtable.cppconststringtable.hcoreiids.cppfalignpop.hfalignpush.hfplatform.hfstrdefs.hftypes.hfunknown.cppfunknown.hfutils.hfvariant.hibstream.hicloneable.hipersistent.hipluginbase.histringresult.hiupdatehandler.hsmartpointer.htypesizecheck.hustring.cppustring.h
gui
vst
ivstattributes.hivstaudioprocessor.hivstautomationstate.hivstchannelcontextinfo.hivstcomponent.hivstcontextmenu.hivsteditcontroller.hivstevents.hivsthostapplication.hivstinterappaudio.hivstmessage.hivstmidicontrollers.hivstmidilearn.hivstnoteexpression.hivstparameterchanges.hivstparameterfunctionname.hivstphysicalui.hivstpluginterfacesupport.hivstplugview.hivstprefetchablesupport.hivstprocesscontext.hivstrepresentation.hivsttestplugprovider.hivstunits.hvstpshpack4.hvstspeaker.hvsttypes.h
public.sdk
processors
juce_AudioPluginInstance.cppjuce_AudioPluginInstance.hjuce_AudioProcessor.cppjuce_AudioProcessor.hjuce_AudioProcessorEditor.cppjuce_AudioProcessorEditor.hjuce_AudioProcessorEditorHostContext.hjuce_AudioProcessorGraph.cppjuce_AudioProcessorGraph.hjuce_AudioProcessorListener.hjuce_AudioProcessorParameter.hjuce_AudioProcessorParameterGroup.cppjuce_AudioProcessorParameterGroup.hjuce_GenericAudioProcessorEditor.cppjuce_GenericAudioProcessorEditor.hjuce_PluginDescription.cppjuce_PluginDescription.h
scanning
juce_KnownPluginList.cppjuce_KnownPluginList.hjuce_PluginDirectoryScanner.cppjuce_PluginDirectoryScanner.hjuce_PluginListComponent.cppjuce_PluginListComponent.h
utilities
juce_AudioParameterBool.cppjuce_AudioParameterBool.hjuce_AudioParameterChoice.cppjuce_AudioParameterChoice.hjuce_AudioParameterFloat.cppjuce_AudioParameterFloat.hjuce_AudioParameterInt.cppjuce_AudioParameterInt.hjuce_AudioProcessorParameterWithID.cppjuce_AudioProcessorParameterWithID.hjuce_AudioProcessorValueTreeState.cppjuce_AudioProcessorValueTreeState.hjuce_ExtensionsVisitor.hjuce_ParameterAttachments.cppjuce_ParameterAttachments.hjuce_PluginHostType.cppjuce_PluginHostType.hjuce_RangedAudioParameter.cppjuce_RangedAudioParameter.hjuce_VST3ClientExtensions.hjuce_VSTCallbackHandler.h
juce_audio_utils
audio_cd
gui
juce_AudioAppComponent.cppjuce_AudioAppComponent.hjuce_AudioDeviceSelectorComponent.cppjuce_AudioDeviceSelectorComponent.hjuce_AudioThumbnail.cppjuce_AudioThumbnail.hjuce_AudioThumbnailBase.hjuce_AudioThumbnailCache.cppjuce_AudioThumbnailCache.hjuce_AudioVisualiserComponent.cppjuce_AudioVisualiserComponent.hjuce_BluetoothMidiDevicePairingDialogue.hjuce_MidiKeyboardComponent.cppjuce_MidiKeyboardComponent.h
juce_audio_utils.cppjuce_audio_utils.hjuce_audio_utils.mmnative
juce_android_BluetoothMidiDevicePairingDialogue.cppjuce_ios_BluetoothMidiDevicePairingDialogue.mmjuce_linux_AudioCDReader.cppjuce_linux_BluetoothMidiDevicePairingDialogue.cppjuce_mac_AudioCDBurner.mmjuce_mac_AudioCDReader.mmjuce_mac_BluetoothMidiDevicePairingDialogue.mmjuce_win32_AudioCDBurner.cppjuce_win32_AudioCDReader.cppjuce_win_BluetoothMidiDevicePairingDialogue.cpp
players
juce_box2d
box2d
Box2D.hREADME.txt
juce_box2d.cppjuce_box2d.hCollision
Shapes
b2ChainShape.cppb2ChainShape.hb2CircleShape.cppb2CircleShape.hb2EdgeShape.cppb2EdgeShape.hb2PolygonShape.cppb2PolygonShape.hb2Shape.h
b2BroadPhase.cppb2BroadPhase.hb2CollideCircle.cppb2CollideEdge.cppb2CollidePolygon.cppb2Collision.cppb2Collision.hb2Distance.cppb2Distance.hb2DynamicTree.cppb2DynamicTree.hb2TimeOfImpact.cppb2TimeOfImpact.hCommon
b2BlockAllocator.cppb2BlockAllocator.hb2Draw.cppb2Draw.hb2GrowableStack.hb2Math.cppb2Math.hb2Settings.cppb2Settings.hb2StackAllocator.cppb2StackAllocator.hb2Timer.cppb2Timer.h
Dynamics
Contacts
b2ChainAndCircleContact.cppb2ChainAndCircleContact.hb2ChainAndPolygonContact.cppb2ChainAndPolygonContact.hb2CircleContact.cppb2CircleContact.hb2Contact.cppb2Contact.hb2ContactSolver.cppb2ContactSolver.hb2EdgeAndCircleContact.cppb2EdgeAndCircleContact.hb2EdgeAndPolygonContact.cppb2EdgeAndPolygonContact.hb2PolygonAndCircleContact.cppb2PolygonAndCircleContact.hb2PolygonContact.cppb2PolygonContact.h
Joints
b2DistanceJoint.cppb2DistanceJoint.hb2FrictionJoint.cppb2FrictionJoint.hb2GearJoint.cppb2GearJoint.hb2Joint.cppb2Joint.hb2MouseJoint.cppb2MouseJoint.hb2PrismaticJoint.cppb2PrismaticJoint.hb2PulleyJoint.cppb2PulleyJoint.hb2RevoluteJoint.cppb2RevoluteJoint.hb2RopeJoint.cppb2RopeJoint.hb2WeldJoint.cppb2WeldJoint.hb2WheelJoint.cppb2WheelJoint.h
b2Body.cppb2Body.hb2ContactManager.cppb2ContactManager.hb2Fixture.cppb2Fixture.hb2Island.cppb2Island.hb2TimeStep.hb2World.cppb2World.hb2WorldCallbacks.cppb2WorldCallbacks.hRope
utils
juce_core
containers
juce_AbstractFifo.cppjuce_AbstractFifo.hjuce_Array.hjuce_ArrayAllocationBase.hjuce_ArrayBase.cppjuce_ArrayBase.hjuce_DynamicObject.cppjuce_DynamicObject.hjuce_ElementComparator.hjuce_HashMap.hjuce_HashMap_test.cppjuce_LinkedListPointer.hjuce_ListenerList.hjuce_NamedValueSet.cppjuce_NamedValueSet.hjuce_OwnedArray.cppjuce_OwnedArray.hjuce_PropertySet.cppjuce_PropertySet.hjuce_ReferenceCountedArray.cppjuce_ReferenceCountedArray.hjuce_ScopedValueSetter.hjuce_SingleThreadedAbstractFifo.hjuce_SortedSet.hjuce_SparseSet.cppjuce_SparseSet.hjuce_Variant.cppjuce_Variant.h
files
juce_DirectoryIterator.cppjuce_DirectoryIterator.hjuce_File.cppjuce_File.hjuce_FileFilter.cppjuce_FileFilter.hjuce_FileInputStream.cppjuce_FileInputStream.hjuce_FileOutputStream.cppjuce_FileOutputStream.hjuce_FileSearchPath.cppjuce_FileSearchPath.hjuce_MemoryMappedFile.hjuce_RangedDirectoryIterator.cppjuce_RangedDirectoryIterator.hjuce_TemporaryFile.cppjuce_TemporaryFile.hjuce_WildcardFileFilter.cppjuce_WildcardFileFilter.h
javascript
juce_core.cppjuce_core.hjuce_core.mmlogging
maths
juce_BigInteger.cppjuce_BigInteger.hjuce_Expression.cppjuce_Expression.hjuce_MathsFunctions.hjuce_NormalisableRange.hjuce_Random.cppjuce_Random.hjuce_Range.hjuce_StatisticsAccumulator.h
memory
juce_AllocationHooks.cppjuce_AllocationHooks.hjuce_Atomic.hjuce_ByteOrder.hjuce_ContainerDeletePolicy.hjuce_HeapBlock.hjuce_HeavyweightLeakedObjectDetector.hjuce_LeakedObjectDetector.hjuce_Memory.hjuce_MemoryBlock.cppjuce_MemoryBlock.hjuce_OptionalScopedPointer.hjuce_ReferenceCountedObject.hjuce_Reservoir.hjuce_ScopedPointer.hjuce_SharedResourcePointer.hjuce_Singleton.hjuce_WeakReference.h
misc
juce_ConsoleApplication.cppjuce_ConsoleApplication.hjuce_Functional.hjuce_Result.cppjuce_Result.hjuce_RuntimePermissions.cppjuce_RuntimePermissions.hjuce_Uuid.cppjuce_Uuid.hjuce_WindowsRegistry.h
native
java
javacore
juce_BasicNativeHeaders.hjuce_android_Files.cppjuce_android_JNIHelpers.cppjuce_android_JNIHelpers.hjuce_android_Misc.cppjuce_android_Network.cppjuce_android_RuntimePermissions.cppjuce_android_SystemStats.cppjuce_android_Threads.cppjuce_curl_Network.cppjuce_intel_SharedCode.hjuce_linux_CommonFile.cppjuce_linux_Files.cppjuce_linux_Network.cppjuce_linux_SystemStats.cppjuce_linux_Threads.cppjuce_mac_CFHelpers.hjuce_mac_Files.mmjuce_mac_Network.mmjuce_mac_ObjCHelpers.hjuce_mac_Strings.mmjuce_mac_SystemStats.mmjuce_mac_Threads.mmjuce_posix_IPAddress.hjuce_posix_NamedPipe.cppjuce_posix_SharedCode.hjuce_wasm_SystemStats.cppjuce_win32_ComSmartPtr.hjuce_win32_Files.cppjuce_win32_Network.cppjuce_win32_Registry.cppjuce_win32_SystemStats.cppjuce_win32_Threads.cppnetwork
juce_IPAddress.cppjuce_IPAddress.hjuce_MACAddress.cppjuce_MACAddress.hjuce_NamedPipe.cppjuce_NamedPipe.hjuce_Socket.cppjuce_Socket.hjuce_URL.cppjuce_URL.hjuce_WebInputStream.cppjuce_WebInputStream.h
streams
juce_BufferedInputStream.cppjuce_BufferedInputStream.hjuce_FileInputSource.cppjuce_FileInputSource.hjuce_InputSource.hjuce_InputStream.cppjuce_InputStream.hjuce_MemoryInputStream.cppjuce_MemoryInputStream.hjuce_MemoryOutputStream.cppjuce_MemoryOutputStream.hjuce_OutputStream.cppjuce_OutputStream.hjuce_SubregionStream.cppjuce_SubregionStream.hjuce_URLInputSource.cppjuce_URLInputSource.h
system
juce_CompilerSupport.hjuce_CompilerWarnings.hjuce_PlatformDefs.hjuce_StandardHeader.hjuce_SystemStats.cppjuce_SystemStats.hjuce_TargetPlatform.h
text
juce_Base64.cppjuce_Base64.hjuce_CharPointer_ASCII.hjuce_CharPointer_UTF16.hjuce_CharPointer_UTF32.hjuce_CharPointer_UTF8.hjuce_CharacterFunctions.cppjuce_CharacterFunctions.hjuce_Identifier.cppjuce_Identifier.hjuce_LocalisedStrings.cppjuce_LocalisedStrings.hjuce_NewLine.hjuce_String.cppjuce_String.hjuce_StringArray.cppjuce_StringArray.hjuce_StringPairArray.cppjuce_StringPairArray.hjuce_StringPool.cppjuce_StringPool.hjuce_StringRef.hjuce_TextDiff.cppjuce_TextDiff.h
threads
juce_ChildProcess.cppjuce_ChildProcess.hjuce_CriticalSection.hjuce_DynamicLibrary.hjuce_HighResolutionTimer.cppjuce_HighResolutionTimer.hjuce_InterProcessLock.hjuce_Process.hjuce_ReadWriteLock.cppjuce_ReadWriteLock.hjuce_ScopedLock.hjuce_ScopedReadLock.hjuce_ScopedWriteLock.hjuce_SpinLock.hjuce_Thread.cppjuce_Thread.hjuce_ThreadLocalValue.hjuce_ThreadPool.cppjuce_ThreadPool.hjuce_TimeSliceThread.cppjuce_TimeSliceThread.hjuce_WaitableEvent.cppjuce_WaitableEvent.h
time
juce_PerformanceCounter.cppjuce_PerformanceCounter.hjuce_RelativeTime.cppjuce_RelativeTime.hjuce_Time.cppjuce_Time.h
unit_tests
xml
zip
juce_cryptography
juce_data_structures
app_properties
juce_ApplicationProperties.cppjuce_ApplicationProperties.hjuce_PropertiesFile.cppjuce_PropertiesFile.h
juce_data_structures.cppjuce_data_structures.hjuce_data_structures.mmundomanager
values
juce_dsp
containers
juce_AudioBlock.hjuce_AudioBlock_test.cppjuce_FixedSizeFunction.hjuce_FixedSizeFunction_test.cppjuce_SIMDRegister.hjuce_SIMDRegister_Impl.hjuce_SIMDRegister_test.cpp
filter_design
frequency
juce_Convolution.cppjuce_Convolution.hjuce_Convolution_test.cppjuce_FFT.cppjuce_FFT.hjuce_FFT_test.cppjuce_Windowing.cppjuce_Windowing.h
juce_dsp.cppjuce_dsp.hjuce_dsp.mmmaths
juce_FastMathApproximations.hjuce_LogRampedValue.hjuce_LogRampedValue_test.cppjuce_LookupTable.cppjuce_LookupTable.hjuce_Matrix.cppjuce_Matrix.hjuce_Matrix_test.cppjuce_Phase.hjuce_Polynomial.hjuce_SpecialFunctions.cppjuce_SpecialFunctions.h
native
juce_avx_SIMDNativeOps.cppjuce_avx_SIMDNativeOps.hjuce_fallback_SIMDNativeOps.hjuce_neon_SIMDNativeOps.cppjuce_neon_SIMDNativeOps.hjuce_sse_SIMDNativeOps.cppjuce_sse_SIMDNativeOps.h
processors
juce_BallisticsFilter.cppjuce_BallisticsFilter.hjuce_DelayLine.cppjuce_DelayLine.hjuce_DryWetMixer.cppjuce_DryWetMixer.hjuce_FIRFilter.cppjuce_FIRFilter.hjuce_FIRFilter_test.cppjuce_FirstOrderTPTFilter.cppjuce_FirstOrderTPTFilter.hjuce_IIRFilter.cppjuce_IIRFilter.hjuce_IIRFilter_Impl.hjuce_LinkwitzRileyFilter.cppjuce_LinkwitzRileyFilter.hjuce_Oversampling.cppjuce_Oversampling.hjuce_Panner.cppjuce_Panner.hjuce_ProcessContext.hjuce_ProcessorChain.hjuce_ProcessorChain_test.cppjuce_ProcessorDuplicator.hjuce_ProcessorWrapper.hjuce_StateVariableFilter.hjuce_StateVariableTPTFilter.cppjuce_StateVariableTPTFilter.h
widgets
juce_events
broadcasters
juce_ActionBroadcaster.cppjuce_ActionBroadcaster.hjuce_ActionListener.hjuce_AsyncUpdater.cppjuce_AsyncUpdater.hjuce_ChangeBroadcaster.cppjuce_ChangeBroadcaster.hjuce_ChangeListener.h
interprocess
juce_ConnectedChildProcess.cppjuce_ConnectedChildProcess.hjuce_InterprocessConnection.cppjuce_InterprocessConnection.hjuce_InterprocessConnectionServer.cppjuce_InterprocessConnectionServer.hjuce_NetworkServiceDiscovery.cppjuce_NetworkServiceDiscovery.h
juce_events.cppjuce_events.hjuce_events.mmmessages
juce_ApplicationBase.cppjuce_ApplicationBase.hjuce_CallbackMessage.hjuce_DeletedAtShutdown.cppjuce_DeletedAtShutdown.hjuce_Initialisation.hjuce_Message.hjuce_MessageListener.cppjuce_MessageListener.hjuce_MessageManager.cppjuce_MessageManager.hjuce_MountedVolumeListChangeDetector.hjuce_NotificationType.h
native
juce_ScopedLowPowerModeDisabler.cppjuce_ScopedLowPowerModeDisabler.hjuce_android_Messaging.cppjuce_ios_MessageManager.mmjuce_linux_EventLoop.hjuce_linux_Messaging.cppjuce_mac_MessageManager.mmjuce_osx_MessageQueue.hjuce_win32_HiddenMessageWindow.hjuce_win32_Messaging.cppjuce_win32_WinRTWrapper.cppjuce_win32_WinRTWrapper.h
timers
juce_graphics
colour
juce_Colour.cppjuce_Colour.hjuce_ColourGradient.cppjuce_ColourGradient.hjuce_Colours.cppjuce_Colours.hjuce_FillType.cppjuce_FillType.hjuce_PixelFormats.h
contexts
juce_GraphicsContext.cppjuce_GraphicsContext.hjuce_LowLevelGraphicsContext.hjuce_LowLevelGraphicsPostScriptRenderer.cppjuce_LowLevelGraphicsPostScriptRenderer.hjuce_LowLevelGraphicsSoftwareRenderer.cppjuce_LowLevelGraphicsSoftwareRenderer.h
effects
juce_DropShadowEffect.cppjuce_DropShadowEffect.hjuce_GlowEffect.cppjuce_GlowEffect.hjuce_ImageEffectFilter.h
fonts
juce_AttributedString.cppjuce_AttributedString.hjuce_CustomTypeface.cppjuce_CustomTypeface.hjuce_Font.cppjuce_Font.hjuce_GlyphArrangement.cppjuce_GlyphArrangement.hjuce_TextLayout.cppjuce_TextLayout.hjuce_Typeface.cppjuce_Typeface.h
geometry
juce_AffineTransform.cppjuce_AffineTransform.hjuce_BorderSize.hjuce_EdgeTable.cppjuce_EdgeTable.hjuce_Line.hjuce_Parallelogram.hjuce_Path.cppjuce_Path.hjuce_PathIterator.cppjuce_PathIterator.hjuce_PathStrokeType.cppjuce_PathStrokeType.hjuce_Point.hjuce_Rectangle.hjuce_RectangleList.h
image_formats
jpglib
READMEcderror.hchanges to libjpeg for JUCE.txtjcapimin.cjcapistd.cjccoefct.cjccolor.cjcdctmgr.cjchuff.cjchuff.hjcinit.cjcmainct.cjcmarker.cjcmaster.cjcomapi.cjconfig.hjcparam.cjcphuff.cjcprepct.cjcsample.cjctrans.cjdapimin.cjdapistd.cjdatasrc.cjdcoefct.cjdcolor.cjdct.hjddctmgr.cjdhuff.cjdhuff.hjdinput.cjdmainct.cjdmarker.cjdmaster.cjdmerge.cjdphuff.cjdpostct.cjdsample.cjdtrans.cjerror.cjerror.hjfdctflt.cjfdctfst.cjfdctint.cjidctflt.cjidctfst.cjidctint.cjidctred.cjinclude.hjmemmgr.cjmemnobs.cjmemsys.hjmorecfg.hjpegint.hjpeglib.hjquant1.cjquant2.cjutils.cjversion.htransupp.ctransupp.h
juce_GIFLoader.cppjuce_JPEGLoader.cppjuce_PNGLoader.cpppnglib
images
juce_Image.cppjuce_Image.hjuce_ImageCache.cppjuce_ImageCache.hjuce_ImageConvolutionKernel.cppjuce_ImageConvolutionKernel.hjuce_ImageFileFormat.cppjuce_ImageFileFormat.h
juce_graphics.cppjuce_graphics.hjuce_graphics.mmnative
juce_RenderingHelpers.hjuce_android_Fonts.cppjuce_android_GraphicsContext.cppjuce_android_IconHelpers.cppjuce_freetype_Fonts.cppjuce_linux_Fonts.cppjuce_linux_IconHelpers.cppjuce_mac_CoreGraphicsContext.hjuce_mac_CoreGraphicsContext.mmjuce_mac_CoreGraphicsHelpers.hjuce_mac_Fonts.mmjuce_mac_IconHelpers.cppjuce_win32_Direct2DGraphicsContext.cppjuce_win32_Direct2DGraphicsContext.hjuce_win32_DirectWriteTypeLayout.cppjuce_win32_DirectWriteTypeface.cppjuce_win32_Fonts.cppjuce_win32_IconHelpers.cpp
placement
juce_gui_basics
accessibility
enums
interfaces
juce_AccessibilityCellInterface.hjuce_AccessibilityTableInterface.hjuce_AccessibilityTextInterface.hjuce_AccessibilityValueInterface.h
juce_AccessibilityHandler.cppjuce_AccessibilityHandler.hjuce_AccessibilityState.happlication
buttons
juce_ArrowButton.cppjuce_ArrowButton.hjuce_Button.cppjuce_Button.hjuce_DrawableButton.cppjuce_DrawableButton.hjuce_HyperlinkButton.cppjuce_HyperlinkButton.hjuce_ImageButton.cppjuce_ImageButton.hjuce_ShapeButton.cppjuce_ShapeButton.hjuce_TextButton.cppjuce_TextButton.hjuce_ToggleButton.cppjuce_ToggleButton.hjuce_ToolbarButton.cppjuce_ToolbarButton.h
commands
juce_ApplicationCommandID.hjuce_ApplicationCommandInfo.cppjuce_ApplicationCommandInfo.hjuce_ApplicationCommandManager.cppjuce_ApplicationCommandManager.hjuce_ApplicationCommandTarget.cppjuce_ApplicationCommandTarget.hjuce_KeyPressMappingSet.cppjuce_KeyPressMappingSet.h
components
juce_CachedComponentImage.hjuce_Component.cppjuce_Component.hjuce_ComponentListener.cppjuce_ComponentListener.hjuce_ComponentTraverser.hjuce_FocusTraverser.cppjuce_FocusTraverser.hjuce_ModalComponentManager.cppjuce_ModalComponentManager.h
desktop
drawables
juce_Drawable.cppjuce_Drawable.hjuce_DrawableComposite.cppjuce_DrawableComposite.hjuce_DrawableImage.cppjuce_DrawableImage.hjuce_DrawablePath.cppjuce_DrawablePath.hjuce_DrawableRectangle.cppjuce_DrawableRectangle.hjuce_DrawableShape.cppjuce_DrawableShape.hjuce_DrawableText.cppjuce_DrawableText.hjuce_SVGParser.cpp
filebrowser
juce_ContentSharer.cppjuce_ContentSharer.hjuce_DirectoryContentsDisplayComponent.cppjuce_DirectoryContentsDisplayComponent.hjuce_DirectoryContentsList.cppjuce_DirectoryContentsList.hjuce_FileBrowserComponent.cppjuce_FileBrowserComponent.hjuce_FileBrowserListener.hjuce_FileChooser.cppjuce_FileChooser.hjuce_FileChooserDialogBox.cppjuce_FileChooserDialogBox.hjuce_FileListComponent.cppjuce_FileListComponent.hjuce_FilePreviewComponent.hjuce_FileSearchPathListComponent.cppjuce_FileSearchPathListComponent.hjuce_FileTreeComponent.cppjuce_FileTreeComponent.hjuce_FilenameComponent.cppjuce_FilenameComponent.hjuce_ImagePreviewComponent.cppjuce_ImagePreviewComponent.h
juce_gui_basics.cppjuce_gui_basics.hjuce_gui_basics.mmkeyboard
juce_CaretComponent.cppjuce_CaretComponent.hjuce_KeyListener.cppjuce_KeyListener.hjuce_KeyPress.cppjuce_KeyPress.hjuce_KeyboardFocusTraverser.cppjuce_KeyboardFocusTraverser.hjuce_ModifierKeys.cppjuce_ModifierKeys.hjuce_SystemClipboard.hjuce_TextEditorKeyMapper.hjuce_TextInputTarget.h
layout
juce_AnimatedPosition.hjuce_AnimatedPositionBehaviours.hjuce_ComponentAnimator.cppjuce_ComponentAnimator.hjuce_ComponentBoundsConstrainer.cppjuce_ComponentBoundsConstrainer.hjuce_ComponentBuilder.cppjuce_ComponentBuilder.hjuce_ComponentMovementWatcher.cppjuce_ComponentMovementWatcher.hjuce_ConcertinaPanel.cppjuce_ConcertinaPanel.hjuce_FlexBox.cppjuce_FlexBox.hjuce_FlexItem.hjuce_Grid.cppjuce_Grid.hjuce_GridItem.cppjuce_GridItem.hjuce_GroupComponent.cppjuce_GroupComponent.hjuce_MultiDocumentPanel.cppjuce_MultiDocumentPanel.hjuce_ResizableBorderComponent.cppjuce_ResizableBorderComponent.hjuce_ResizableCornerComponent.cppjuce_ResizableCornerComponent.hjuce_ResizableEdgeComponent.cppjuce_ResizableEdgeComponent.hjuce_ScrollBar.cppjuce_ScrollBar.hjuce_SidePanel.cppjuce_SidePanel.hjuce_StretchableLayoutManager.cppjuce_StretchableLayoutManager.hjuce_StretchableLayoutResizerBar.cppjuce_StretchableLayoutResizerBar.hjuce_StretchableObjectResizer.cppjuce_StretchableObjectResizer.hjuce_TabbedButtonBar.cppjuce_TabbedButtonBar.hjuce_TabbedComponent.cppjuce_TabbedComponent.hjuce_Viewport.cppjuce_Viewport.h
lookandfeel
juce_LookAndFeel.cppjuce_LookAndFeel.hjuce_LookAndFeel_V1.cppjuce_LookAndFeel_V1.hjuce_LookAndFeel_V2.cppjuce_LookAndFeel_V2.hjuce_LookAndFeel_V3.cppjuce_LookAndFeel_V3.hjuce_LookAndFeel_V4.cppjuce_LookAndFeel_V4.h
menus
juce_BurgerMenuComponent.cppjuce_BurgerMenuComponent.hjuce_MenuBarComponent.cppjuce_MenuBarComponent.hjuce_MenuBarModel.cppjuce_MenuBarModel.hjuce_PopupMenu.cppjuce_PopupMenu.h
misc
juce_BubbleComponent.cppjuce_BubbleComponent.hjuce_DropShadower.cppjuce_DropShadower.hjuce_JUCESplashScreen.cppjuce_JUCESplashScreen.h
mouse
juce_ComponentDragger.cppjuce_ComponentDragger.hjuce_DragAndDropContainer.cppjuce_DragAndDropContainer.hjuce_DragAndDropTarget.hjuce_FileDragAndDropTarget.hjuce_LassoComponent.hjuce_MouseCursor.cppjuce_MouseCursor.hjuce_MouseEvent.cppjuce_MouseEvent.hjuce_MouseInactivityDetector.cppjuce_MouseInactivityDetector.hjuce_MouseInputSource.cppjuce_MouseInputSource.hjuce_MouseListener.cppjuce_MouseListener.hjuce_SelectedItemSet.hjuce_TextDragAndDropTarget.hjuce_TooltipClient.h
native
accessibility
juce_AccessibilityTextHelpers.hjuce_android_Accessibility.cppjuce_ios_Accessibility.mmjuce_mac_Accessibility.mmjuce_mac_AccessibilitySharedCode.mmjuce_win32_Accessibility.cppjuce_win32_AccessibilityElement.cppjuce_win32_AccessibilityElement.hjuce_win32_UIAExpandCollapseProvider.hjuce_win32_UIAGridItemProvider.hjuce_win32_UIAGridProvider.hjuce_win32_UIAHelpers.hjuce_win32_UIAInvokeProvider.hjuce_win32_UIAProviderBase.hjuce_win32_UIAProviders.hjuce_win32_UIARangeValueProvider.hjuce_win32_UIASelectionProvider.hjuce_win32_UIATextProvider.hjuce_win32_UIAToggleProvider.hjuce_win32_UIATransformProvider.hjuce_win32_UIAValueProvider.hjuce_win32_UIAWindowProvider.hjuce_win32_WindowsUIAWrapper.h
java
app
javaopt
app
x11
positioning
juce_MarkerList.cppjuce_MarkerList.hjuce_RelativeCoordinate.cppjuce_RelativeCoordinate.hjuce_RelativeCoordinatePositioner.cppjuce_RelativeCoordinatePositioner.hjuce_RelativeParallelogram.cppjuce_RelativeParallelogram.hjuce_RelativePoint.cppjuce_RelativePoint.hjuce_RelativePointPath.cppjuce_RelativePointPath.hjuce_RelativeRectangle.cppjuce_RelativeRectangle.h
properties
juce_BooleanPropertyComponent.cppjuce_BooleanPropertyComponent.hjuce_ButtonPropertyComponent.cppjuce_ButtonPropertyComponent.hjuce_ChoicePropertyComponent.cppjuce_ChoicePropertyComponent.hjuce_MultiChoicePropertyComponent.cppjuce_MultiChoicePropertyComponent.hjuce_PropertyComponent.cppjuce_PropertyComponent.hjuce_PropertyPanel.cppjuce_PropertyPanel.hjuce_SliderPropertyComponent.cppjuce_SliderPropertyComponent.hjuce_TextPropertyComponent.cppjuce_TextPropertyComponent.h
widgets
juce_ComboBox.cppjuce_ComboBox.hjuce_ImageComponent.cppjuce_ImageComponent.hjuce_Label.cppjuce_Label.hjuce_ListBox.cppjuce_ListBox.cpp.rejjuce_ListBox.hjuce_ProgressBar.cppjuce_ProgressBar.hjuce_Slider.cppjuce_Slider.hjuce_TableHeaderComponent.cppjuce_TableHeaderComponent.hjuce_TableListBox.cppjuce_TableListBox.hjuce_TextEditor.cppjuce_TextEditor.hjuce_Toolbar.cppjuce_Toolbar.hjuce_ToolbarItemComponent.cppjuce_ToolbarItemComponent.hjuce_ToolbarItemFactory.hjuce_ToolbarItemPalette.cppjuce_ToolbarItemPalette.hjuce_TreeView.cppjuce_TreeView.h
windows
juce_AlertWindow.cppjuce_AlertWindow.hjuce_CallOutBox.cppjuce_CallOutBox.hjuce_ComponentPeer.cppjuce_ComponentPeer.hjuce_DialogWindow.cppjuce_DialogWindow.hjuce_DocumentWindow.cppjuce_DocumentWindow.hjuce_MessageBoxOptions.hjuce_NativeMessageBox.hjuce_ResizableWindow.cppjuce_ResizableWindow.hjuce_ThreadWithProgressWindow.cppjuce_ThreadWithProgressWindow.hjuce_TooltipWindow.cppjuce_TooltipWindow.hjuce_TopLevelWindow.cppjuce_TopLevelWindow.h
juce_gui_extra
code_editor
juce_CPlusPlusCodeTokeniser.cppjuce_CPlusPlusCodeTokeniser.hjuce_CPlusPlusCodeTokeniserFunctions.hjuce_CodeDocument.cppjuce_CodeDocument.hjuce_CodeEditorComponent.cppjuce_CodeEditorComponent.hjuce_CodeTokeniser.hjuce_LuaCodeTokeniser.cppjuce_LuaCodeTokeniser.hjuce_XMLCodeTokeniser.cppjuce_XMLCodeTokeniser.h
documents
embedding
juce_ActiveXControlComponent.hjuce_AndroidViewComponent.hjuce_HWNDComponent.hjuce_NSViewComponent.hjuce_UIViewComponent.hjuce_XEmbedComponent.h
juce_gui_extra.cppjuce_gui_extra.hjuce_gui_extra.mmmisc
juce_AnimatedAppComponent.cppjuce_AnimatedAppComponent.hjuce_AppleRemote.hjuce_BubbleMessageComponent.cppjuce_BubbleMessageComponent.hjuce_ColourSelector.cppjuce_ColourSelector.hjuce_KeyMappingEditorComponent.cppjuce_KeyMappingEditorComponent.hjuce_LiveConstantEditor.cppjuce_LiveConstantEditor.hjuce_PreferencesPanel.cppjuce_PreferencesPanel.hjuce_PushNotifications.cppjuce_PushNotifications.hjuce_RecentlyOpenedFilesList.cppjuce_RecentlyOpenedFilesList.hjuce_SplashScreen.cppjuce_SplashScreen.hjuce_SystemTrayIconComponent.cppjuce_SystemTrayIconComponent.hjuce_WebBrowserComponent.h
native
java
app
com
javaopt
juce_AndroidViewComponent.cppjuce_android_PushNotifications.cppjuce_android_WebBrowserComponent.cppjuce_ios_PushNotifications.cppjuce_ios_UIViewComponent.mmjuce_linux_X11_SystemTrayIcon.cppjuce_linux_X11_WebBrowserComponent.cppjuce_linux_XEmbedComponent.cppjuce_mac_AppleRemote.mmjuce_mac_CarbonViewWrapperComponent.hjuce_mac_NSViewComponent.mmjuce_mac_PushNotifications.cppjuce_mac_SystemTrayIcon.cppjuce_mac_WebBrowserComponent.mmjuce_win32_ActiveXComponent.cppjuce_win32_HWNDComponent.cppjuce_win32_SystemTrayIcon.cppjuce_win32_WebBrowserComponent.cppjuce_opengl
geometry
juce_opengl.cppjuce_opengl.hjuce_opengl.mmnative
java
app
com
rmsl
opengl
juce_OpenGLContext.cppjuce_OpenGLContext.hjuce_OpenGLContext.h.rejjuce_OpenGLFrameBuffer.cppjuce_OpenGLFrameBuffer.hjuce_OpenGLGraphicsContext.cppjuce_OpenGLGraphicsContext.hjuce_OpenGLHelpers.cppjuce_OpenGLHelpers.hjuce_OpenGLImage.cppjuce_OpenGLImage.hjuce_OpenGLPixelFormat.cppjuce_OpenGLPixelFormat.hjuce_OpenGLRenderer.hjuce_OpenGLShaderProgram.cppjuce_OpenGLShaderProgram.hjuce_OpenGLTexture.cppjuce_OpenGLTexture.hjuce_gl.cppjuce_gl.hjuce_gles2.cppjuce_gles2.hjuce_khrplatform.hjuce_wgl.h
utils
juce_osc
juce_product_unlocking
in_app_purchases
juce_product_unlocking.cppjuce_product_unlocking.hjuce_product_unlocking.mmmarketplace
juce_KeyFileGeneration.hjuce_OnlineUnlockForm.cppjuce_OnlineUnlockForm.hjuce_OnlineUnlockStatus.cppjuce_OnlineUnlockStatus.hjuce_TracktionMarketplaceStatus.cppjuce_TracktionMarketplaceStatus.h
native
juce_video
504
deps/juce/extras/NetworkGraphicsDemo/Source/Demos.h
vendored
Normal file
504
deps/juce/extras/NetworkGraphicsDemo/Source/Demos.h
vendored
Normal file
@ -0,0 +1,504 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
struct BlankCanvas : public AnimatedContent
|
||||
{
|
||||
String getName() const override { return "Blank Canvas"; }
|
||||
void reset() override {}
|
||||
void handleTouch (Point<float>) override {}
|
||||
void generateCanvas (Graphics&, SharedCanvasDescription&, Rectangle<float>) override {}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct GridLines : public AnimatedContent
|
||||
{
|
||||
String getName() const override { return "Grid Lines"; }
|
||||
void reset() override {}
|
||||
void handleTouch (Point<float>) override {}
|
||||
|
||||
void generateCanvas (Graphics& g, SharedCanvasDescription& canvas, Rectangle<float>) override
|
||||
{
|
||||
auto limits = canvas.getLimits();
|
||||
float lineThickness = 0.1f;
|
||||
|
||||
g.setColour (Colours::blue);
|
||||
g.drawRect (canvas.getLimits(), lineThickness);
|
||||
|
||||
for (float y = limits.getY(); y < limits.getBottom(); y += 2.0f)
|
||||
g.drawLine (limits.getX(), y, limits.getRight(), y, lineThickness);
|
||||
|
||||
for (float x = limits.getX(); x < limits.getRight(); x += 2.0f)
|
||||
g.drawLine (x, limits.getY(), x, limits.getBottom(), lineThickness);
|
||||
|
||||
g.setColour (Colours::darkred);
|
||||
g.drawLine (limits.getX(), limits.getCentreY(), limits.getRight(), limits.getCentreY(), lineThickness);
|
||||
g.drawLine (limits.getCentreX(), limits.getY(), limits.getCentreX(), limits.getBottom(), lineThickness);
|
||||
|
||||
g.setColour (Colours::lightgrey);
|
||||
g.drawLine (limits.getX(), limits.getY(), limits.getRight(), limits.getBottom(), lineThickness);
|
||||
g.drawLine (limits.getX(), limits.getBottom(), limits.getRight(), limits.getY(), lineThickness);
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct BackgroundLogo : public AnimatedContent
|
||||
{
|
||||
BackgroundLogo()
|
||||
{
|
||||
static const char logoData[] = R"blahblah(
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 239.2 239.2" enable-background="new 0 0 239.2 239.2" xml:space="preserve">
|
||||
<path fill="#6CC04A" d="M118.8,201.3c-44.6,0-81-36.3-81-81s36.3-81,81-81s81,36.3,81,81S163.4,201.3,118.8,201.3z M118.8,44.8c-41.7,0-75.6,33.9-75.6,75.6s33.9,75.6,75.6,75.6s75.6-33.9,75.6-75.6S160.4,44.8,118.8,44.8z"/>
|
||||
<path fill="#3B5CAD" d="M182.6,117.6c1.4,0,2.7-0.5,3.7-1.5c1.1-1.1,1.6-2.5,1.4-4c-1.5-12.7-6.5-24.7-14.4-34.8c-1-1.2-2.3-1.9-3.8-1.9c-1.3,0-2.6,0.5-3.6,1.5l-39,39c-0.6,0.6-0.2,1.6,0.7,1.6L182.6,117.6z"/>
|
||||
<path fill="#E73E51" d="M169.5,165.2L169.5,165.2c1.5,0,2.8-0.7,3.8-1.9c7.9-10.1,12.9-22.1,14.4-34.8c0.2-1.5-0.3-2.9-1.4-4c-1-1-2.3-1.5-3.7-1.5l-55,0c-0.9,0-1.3,1-0.7,1.6l39,39C166.9,164.7,168.2,165.2,169.5,165.2z"/>
|
||||
<path fill="#E67E3C" d="M122.9,188L122.9,188c1,1,2.5,1.5,4,1.3c12.7-1.5,24.8-6.5,34.8-14.4c1.2-0.9,1.8-2.3,1.9-3.8c0-1.4-0.6-2.7-1.6-3.7l-38.9-38.9c-0.6-0.6-1.6-0.2-1.6,0.7l0,55.2C121.4,185.8,122,187,122.9,188z"/>
|
||||
<path fill="#F0E049" d="M68,75.4c-1.5,0-2.8,0.7-3.8,1.9c-7.9,10.1-12.9,22.1-14.4,34.8c-0.2,1.5,0.3,2.9,1.4,4c1,1,2.3,1.5,3.7,1.5l55,0c0.9,0,1.3-1,0.7-1.6l-39-39C70.6,76,69.3,75.4,68,75.4z"/>
|
||||
<path fill="#D5D755" d="M114.6,52.7c-1-1-2.5-1.5-4-1.3c-12.7,1.5-24.8,6.5-34.8,14.4c-1.2,0.9-1.8,2.3-1.9,3.8c0,1.4,0.6,2.7,1.6,3.7l38.9,38.9c0.6,0.6,1.6,0.2,1.6-0.7l0-55.2C116.1,54.9,115.5,53.6,114.6,52.7z"/>
|
||||
<path fill="#9CB6D3" d="M163.7,69.6c0-1.5-0.7-2.8-1.9-3.8c-10.1-7.9-22.1-12.9-34.8-14.4c-1.5-0.2-2.9,0.3-4,1.4c-1,1-1.5,2.3-1.5,3.7l0,55c0,0.9,1,1.3,1.6,0.7l39-39C163.1,72.1,163.7,70.9,163.7,69.6z"/>
|
||||
<path fill="#F5BD47" d="M109.9,123l-55,0c-1.4,0-2.7,0.5-3.7,1.5c-1.1,1.1-1.6,2.5-1.4,4c1.5,12.7,6.5,24.7,14.4,34.8c1,1.2,2.3,1.9,3.8,1.9c1.3,0,2.6-0.5,3.5-1.5c0,0,0,0,0,0l39-39C111.2,124,110.8,123,109.9,123z"/>
|
||||
<path fill="#F19F53" d="M114.4,128.5l-38.9,38.9c-1,1-1.6,2.3-1.6,3.7c0,1.5,0.7,2.9,1.9,3.8c10,7.9,22.1,12.9,34.8,14.4c1.6,0.2,3-0.3,4-1.3c0.9-0.9,1.4-2.2,1.4-3.6c0,0,0,0,0,0l0-55.2C116.1,128.3,115,127.9,114.4,128.5z"/>
|
||||
</svg>
|
||||
)blahblah";
|
||||
|
||||
logo = Drawable::createFromSVG (*parseXML (logoData));
|
||||
}
|
||||
|
||||
String getName() const override { return "Background Image"; }
|
||||
void reset() override {}
|
||||
void handleTouch (Point<float>) override {}
|
||||
|
||||
void generateCanvas (Graphics& g, SharedCanvasDescription& canvas, Rectangle<float>) override
|
||||
{
|
||||
logo->drawWithin (g, canvas.getLimits().reduced (3.0f), RectanglePlacement (RectanglePlacement::centred), 0.6f);
|
||||
}
|
||||
|
||||
std::unique_ptr<Drawable> logo;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct FlockDemo : public BackgroundLogo
|
||||
{
|
||||
String getName() const override { return "Flock"; }
|
||||
|
||||
void setNumBirds (int numBirds)
|
||||
{
|
||||
BackgroundLogo::reset();
|
||||
|
||||
birds.clear();
|
||||
|
||||
for (int i = numBirds; --i >= 0;)
|
||||
birds.add ({});
|
||||
|
||||
centreOfGravity = {};
|
||||
lastGravityMove = {};
|
||||
fakeMouseTouchLengthToRun = 0;
|
||||
fakeMouseTouchPosition = {};
|
||||
fakeMouseTouchVelocity = {};
|
||||
}
|
||||
|
||||
void reset() override
|
||||
{
|
||||
BackgroundLogo::reset();
|
||||
setNumBirds (100);
|
||||
}
|
||||
|
||||
void generateCanvas (Graphics& g, SharedCanvasDescription& canvas, Rectangle<float> activeArea) override
|
||||
{
|
||||
BackgroundLogo::generateCanvas (g, canvas, activeArea);
|
||||
|
||||
if (Time::getCurrentTime() > lastGravityMove + RelativeTime::seconds (0.5))
|
||||
{
|
||||
if (fakeMouseTouchLengthToRun > 0)
|
||||
{
|
||||
--fakeMouseTouchLengthToRun;
|
||||
fakeMouseTouchPosition += fakeMouseTouchVelocity;
|
||||
centreOfGravity = fakeMouseTouchPosition;
|
||||
}
|
||||
else
|
||||
{
|
||||
centreOfGravity = {};
|
||||
|
||||
if (rng.nextInt (300) == 2 && canvas.clients.size() > 0)
|
||||
{
|
||||
fakeMouseTouchLengthToRun = 50;
|
||||
fakeMouseTouchPosition = canvas.clients.getReference (rng.nextInt (canvas.clients.size())).centre;
|
||||
fakeMouseTouchVelocity = { rng.nextFloat() * 0.3f - 0.15f,
|
||||
rng.nextFloat() * 0.3f - 0.15f };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g.setColour (Colours::white.withAlpha (0.2f));
|
||||
|
||||
if (! centreOfGravity.isOrigin())
|
||||
g.fillEllipse (centreOfGravity.getX() - 1.0f, centreOfGravity.getY() - 1.0f, 2.0f, 2.0f);
|
||||
|
||||
for (int i = 0; i < birds.size(); ++i)
|
||||
for (int j = i + 1; j < birds.size(); ++j)
|
||||
attractBirds (birds.getReference(i), birds.getReference(j));
|
||||
|
||||
for (auto& b : birds)
|
||||
{
|
||||
if (! centreOfGravity.isOrigin())
|
||||
b.move (centreOfGravity, 0.4f);
|
||||
|
||||
b.update();
|
||||
b.draw (g);
|
||||
b.bounceOffEdges (canvas.getLimits().expanded (1.0f));
|
||||
}
|
||||
|
||||
for (int i = rings.size(); --i >= 0;)
|
||||
{
|
||||
if (rings.getReference(i).update())
|
||||
rings.getReference(i).draw (g);
|
||||
else
|
||||
rings.remove (i);
|
||||
}
|
||||
}
|
||||
|
||||
bool isRingNear (Point<float> p) const
|
||||
{
|
||||
for (auto& r : rings)
|
||||
if (r.centre.getDistanceFrom (p) < 1.0f)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void handleTouch (Point<float> position) override
|
||||
{
|
||||
lastGravityMove = Time::getCurrentTime();
|
||||
centreOfGravity = position;
|
||||
fakeMouseTouchLengthToRun = 0;
|
||||
|
||||
if (! isRingNear (position))
|
||||
rings.add ({ position, 1.0f, 0.5f });
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct Bird
|
||||
{
|
||||
Bird()
|
||||
{
|
||||
Random randGen;
|
||||
pos.x = randGen.nextFloat() * 10.0f - 5.0f;
|
||||
pos.y = randGen.nextFloat() * 10.0f - 5.0f;
|
||||
velocity.x = randGen.nextFloat() * 0.001f;
|
||||
velocity.y = randGen.nextFloat() * 0.001f;
|
||||
|
||||
colour = Colour::fromHSV (randGen.nextFloat(), 0.2f, 0.9f, randGen.nextFloat() * 0.4f + 0.2f);
|
||||
|
||||
shape.addTriangle (0.0f, 0.0f, -0.3f, 1.0f, 0.3f, 1.0f);
|
||||
shape = shape.createPathWithRoundedCorners (0.2f);
|
||||
|
||||
shape.applyTransform (AffineTransform::scale (randGen.nextFloat() + 1.0f));
|
||||
}
|
||||
|
||||
Point<float> pos, velocity, acc;
|
||||
Colour colour;
|
||||
Path shape;
|
||||
|
||||
void move (Point<float> target, float strength)
|
||||
{
|
||||
auto r = target - pos;
|
||||
float rSquared = jmax (0.1f, (r.x * r.x) + (r.y * r.y));
|
||||
|
||||
if (rSquared > 1.0f)
|
||||
velocity += (r * strength / rSquared);
|
||||
|
||||
acc = {};
|
||||
}
|
||||
|
||||
void accelerate (Point<float> acceleration)
|
||||
{
|
||||
acc += acceleration;
|
||||
}
|
||||
|
||||
void bounceOffEdges (Rectangle<float> limits)
|
||||
{
|
||||
if (pos.x < limits.getX()) { velocity.x = std::abs (velocity.x); acc = {}; }
|
||||
if (pos.x > limits.getRight()) { velocity.x = -std::abs (velocity.x); acc = {}; }
|
||||
if (pos.y < limits.getY()) { velocity.y = std::abs (velocity.y); acc = {}; }
|
||||
if (pos.y > limits.getBottom()) { velocity.y = -std::abs (velocity.y); acc = {}; }
|
||||
}
|
||||
|
||||
void update()
|
||||
{
|
||||
velocity += acc;
|
||||
|
||||
float length = velocity.getDistanceFromOrigin();
|
||||
const float maxSpeed = 0.5f;
|
||||
|
||||
if (length > maxSpeed)
|
||||
velocity = getVectorWithLength (velocity, maxSpeed);
|
||||
|
||||
pos += velocity;
|
||||
}
|
||||
|
||||
void draw (Graphics& g)
|
||||
{
|
||||
g.setColour (colour);
|
||||
g.fillPath (shape, AffineTransform::rotation (Point<float>().getAngleToPoint (velocity)).translated (pos));
|
||||
}
|
||||
};
|
||||
|
||||
static Point<float> getVectorWithLength (Point<float> v, float newLength)
|
||||
{
|
||||
return v * (newLength / v.getDistanceFromOrigin());
|
||||
}
|
||||
|
||||
static void attractBirds (Bird& b1, Bird& b2)
|
||||
{
|
||||
auto delta = b1.pos - b2.pos;
|
||||
|
||||
const float zoneRadius = 10.0f;
|
||||
const float low = 0.4f;
|
||||
const float high = 0.65f;
|
||||
const float strength = 0.01f;
|
||||
|
||||
const float distanceSquared = (delta.x * delta.x) * (delta.y * delta.y);
|
||||
|
||||
if (distanceSquared < zoneRadius * zoneRadius && distanceSquared > 0.01f)
|
||||
{
|
||||
float proportion = distanceSquared / (zoneRadius * zoneRadius);
|
||||
|
||||
if (proportion < low)
|
||||
{
|
||||
const float F = (low / proportion - 1.0f) * strength * 0.003f;
|
||||
delta = getVectorWithLength (delta, F);
|
||||
|
||||
b1.accelerate (delta);
|
||||
b2.accelerate (-delta);
|
||||
}
|
||||
else if (proportion < high)
|
||||
{
|
||||
const float regionSize = high - low;
|
||||
const float adjustedProportion = (proportion - low) / regionSize;
|
||||
const float F = (0.5f - std::cos (adjustedProportion * MathConstants<float>::twoPi) * 0.5f + 0.5f) * strength;
|
||||
|
||||
b1.accelerate (getVectorWithLength (b2.velocity, F));
|
||||
b2.accelerate (getVectorWithLength (b1.velocity, F));
|
||||
}
|
||||
else
|
||||
{
|
||||
const float regionSize = 1.0f - high;
|
||||
const float adjustedProportion = (proportion - high) / regionSize;
|
||||
const float F = (0.5f - std::cos (adjustedProportion * MathConstants<float>::twoPi) * 0.5f + 0.5f) * strength;
|
||||
delta = getVectorWithLength (delta, F);
|
||||
|
||||
b1.accelerate (-delta);
|
||||
b2.accelerate (delta);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Random rng;
|
||||
Array<Bird> birds;
|
||||
Point<float> centreOfGravity;
|
||||
Time lastGravityMove;
|
||||
|
||||
int fakeMouseTouchLengthToRun = 0;
|
||||
Point<float> fakeMouseTouchPosition, fakeMouseTouchVelocity;
|
||||
|
||||
//==============================================================================
|
||||
struct Ring
|
||||
{
|
||||
Point<float> centre;
|
||||
float diameter, opacity;
|
||||
|
||||
bool update()
|
||||
{
|
||||
diameter += 0.7f;
|
||||
opacity -= 0.01f;
|
||||
|
||||
return opacity > 0;
|
||||
}
|
||||
|
||||
void draw (Graphics& g)
|
||||
{
|
||||
const float thickness = 0.2f;
|
||||
|
||||
auto r = Rectangle<float> (diameter, diameter).withCentre (centre);
|
||||
|
||||
Path p;
|
||||
p.addEllipse (r);
|
||||
p.addEllipse (r.reduced (thickness));
|
||||
p.setUsingNonZeroWinding (false);
|
||||
|
||||
g.setColour (Colours::white.withAlpha (opacity));
|
||||
g.fillPath (p);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
Array<Ring> rings;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct FlockWithText : public FlockDemo
|
||||
{
|
||||
FlockWithText()
|
||||
{
|
||||
messages.add ("JUCE is our cross-platform C++ framework\n\n"
|
||||
"In this demo, the same C++ app is running natively on NUMDEVICES devices,\n"
|
||||
"which are sharing their graphic state via the network");
|
||||
|
||||
messages.add ("No other libraries were needed to create this demo.\n"
|
||||
"JUCE provides thousands of classes for cross-platform GUI,\n"
|
||||
"audio, networking, data-structures and many other common tasks");
|
||||
|
||||
messages.add ("As well as a code library, JUCE provides tools for managing\n"
|
||||
"cross-platform projects that are built with Xcode,\n"
|
||||
"Visual Studio, Android Studio, GCC and other compilers");
|
||||
|
||||
messages.add ("JUCE can be used to build desktop or mobile apps, and also\n"
|
||||
"audio plug-ins in the VST2, VST3, AudioUnit, AAX and RTAS formats");
|
||||
}
|
||||
|
||||
String getName() const override { return "Flock with text"; }
|
||||
|
||||
void reset() override
|
||||
{
|
||||
FlockDemo::reset();
|
||||
|
||||
currentMessage = 0;
|
||||
currentMessageStart = {};
|
||||
clientIndex = 0;
|
||||
}
|
||||
|
||||
void generateCanvas (Graphics& g, SharedCanvasDescription& canvas, Rectangle<float> activeArea) override
|
||||
{
|
||||
FlockDemo::generateCanvas (g, canvas, activeArea);
|
||||
|
||||
const float textSize = 0.5f; // inches
|
||||
const float textBlockWidth = 20.0f; // inches
|
||||
|
||||
tick();
|
||||
|
||||
Graphics::ScopedSaveState ss (g);
|
||||
const float scale = 20.0f; // scaled to allow the fonts to use more reasonable sizes
|
||||
g.addTransform (AffineTransform::scale (1.0f / scale));
|
||||
|
||||
String text = String (messages[currentMessage]).replace ("NUMDEVICES", String (canvas.clients.size()));
|
||||
|
||||
AttributedString as;
|
||||
as.append (text, Font (textSize * scale), Colour (0x80ffffff).withMultipliedAlpha (alpha));
|
||||
|
||||
as.setJustification (Justification::centred);
|
||||
auto middle = canvas.clients[clientIndex % canvas.clients.size()].centre * scale;
|
||||
as.draw (g, Rectangle<float> (textBlockWidth * scale, textBlockWidth * scale).withCentre (middle));
|
||||
}
|
||||
|
||||
void tick()
|
||||
{
|
||||
const double displayTimeSeconds = 5.0;
|
||||
const double fadeTimeSeconds = 1.0;
|
||||
|
||||
Time now = Time::getCurrentTime();
|
||||
const double secondsSinceStart = (now - currentMessageStart).inSeconds();
|
||||
|
||||
if (secondsSinceStart > displayTimeSeconds)
|
||||
{
|
||||
currentMessageStart = now;
|
||||
currentMessage = (currentMessage + 1) % messages.size();
|
||||
++clientIndex;
|
||||
alpha = 0;
|
||||
}
|
||||
else if (secondsSinceStart > displayTimeSeconds - fadeTimeSeconds)
|
||||
{
|
||||
alpha = (float) jlimit (0.0, 1.0, (displayTimeSeconds - secondsSinceStart) / fadeTimeSeconds);
|
||||
}
|
||||
else if (secondsSinceStart < fadeTimeSeconds)
|
||||
{
|
||||
alpha = (float) jlimit (0.0, 1.0, secondsSinceStart / fadeTimeSeconds);
|
||||
}
|
||||
}
|
||||
|
||||
StringArray messages;
|
||||
int currentMessage = 0, clientIndex = 0;
|
||||
float alpha = 0;
|
||||
Point<float> centre;
|
||||
Time currentMessageStart;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct SmallFlock : public FlockDemo
|
||||
{
|
||||
String getName() const override { return "Small Flock"; }
|
||||
|
||||
void reset() override
|
||||
{
|
||||
setNumBirds (20);
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
struct BigFlock : public FlockDemo
|
||||
{
|
||||
String getName() const override { return "Big Flock"; }
|
||||
|
||||
void reset() override
|
||||
{
|
||||
setNumBirds (200);
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
template <int numHorizontalLogos>
|
||||
struct MultiLogo : public BackgroundLogo
|
||||
{
|
||||
String getName() const override { return "Multi-Logo " + String ((int) numHorizontalLogos); }
|
||||
|
||||
void generateCanvas (Graphics& g, SharedCanvasDescription& canvas, Rectangle<float>) override
|
||||
{
|
||||
float indent = 0.5f;
|
||||
float logoSize = canvas.getLimits().getWidth() / numHorizontalLogos;
|
||||
auto limits = canvas.getLimits();
|
||||
|
||||
for (float x = limits.getX(); x < limits.getRight(); x += logoSize)
|
||||
{
|
||||
for (float y = limits.getY(); y < limits.getBottom(); y += logoSize)
|
||||
{
|
||||
logo->drawWithin (g, Rectangle<float> (x, y, logoSize, logoSize).reduced (indent),
|
||||
RectanglePlacement (RectanglePlacement::centred), 0.5f);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
void createAllDemos (OwnedArray<AnimatedContent>& demos)
|
||||
{
|
||||
demos.add (new FlockDemo());
|
||||
demos.add (new FlockWithText());
|
||||
demos.add (new SmallFlock());
|
||||
demos.add (new BigFlock());
|
||||
demos.add (new BackgroundLogo());
|
||||
demos.add (new MultiLogo<5>());
|
||||
demos.add (new MultiLogo<10>());
|
||||
demos.add (new GridLines());
|
||||
demos.add (new BlankCanvas());
|
||||
}
|
157
deps/juce/extras/NetworkGraphicsDemo/Source/Main.cpp
vendored
Normal file
157
deps/juce/extras/NetworkGraphicsDemo/Source/Main.cpp
vendored
Normal file
@ -0,0 +1,157 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include <JuceHeader.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
String getBroadcastIPAddress()
|
||||
{
|
||||
return IPAddress::getLocalAddress().toString().upToLastOccurrenceOf (".", false, false) + ".255";
|
||||
}
|
||||
|
||||
static const int masterPortNumber = 9001; // the UDP port the master sends on / the clients receive.
|
||||
static const int clientPortNumber = 9002; // the UDP port the clients send on / the master receives.
|
||||
|
||||
static const String canvasStateOSCAddress = "/juce/nfd/canvasState";
|
||||
static const String newClientOSCAddress = "/juce/nfd/newClient";
|
||||
static const String userInputOSCAddress = "/juce/nfd/userInput";
|
||||
}
|
||||
|
||||
#include "SharedCanvas.h"
|
||||
#include "SlaveComponent.h"
|
||||
#include "Demos.h"
|
||||
#include "MasterComponent.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class NetworkGraphicsDemoApplication : public JUCEApplication
|
||||
{
|
||||
public:
|
||||
NetworkGraphicsDemoApplication() : properties (getPropertyFileOptions())
|
||||
{}
|
||||
|
||||
const String getApplicationName() override { return ProjectInfo::projectName; }
|
||||
const String getApplicationVersion() override { return ProjectInfo::versionString; }
|
||||
bool moreThanOneInstanceAllowed() override { return true; }
|
||||
void anotherInstanceStarted (const String&) override {}
|
||||
|
||||
//==============================================================================
|
||||
void initialise (const String& commandLine) override
|
||||
{
|
||||
#if ! JUCE_IOS && ! JUCE_ANDROID
|
||||
// Run as the master if we have a command-line flag "master" or if the exe itself
|
||||
// has been renamed to include the word "master"..
|
||||
bool isMaster = commandLine.containsIgnoreCase ("master")
|
||||
|| File::getSpecialLocation (File::currentApplicationFile)
|
||||
.getFileName().containsIgnoreCase ("master");
|
||||
|
||||
if (isMaster)
|
||||
mainWindows.add (new MainWindow (properties));
|
||||
#endif
|
||||
|
||||
mainWindows.add (new MainWindow (properties, 0));
|
||||
|
||||
Desktop::getInstance().setScreenSaverEnabled (false);
|
||||
}
|
||||
|
||||
void shutdown() override
|
||||
{
|
||||
mainWindows.clear();
|
||||
properties.saveIfNeeded();
|
||||
}
|
||||
|
||||
void systemRequestedQuit() override
|
||||
{
|
||||
quit();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct MainWindow : public DocumentWindow
|
||||
{
|
||||
explicit MainWindow (PropertiesFile& props)
|
||||
: DocumentWindow ("JUCE Networked Graphics Demo - Master", Colours::white, DocumentWindow::allButtons)
|
||||
{
|
||||
setUsingNativeTitleBar (true);
|
||||
setContentOwned (new MasterContentComponent (props), true);
|
||||
setBounds (100, 50, getWidth(), getHeight());
|
||||
setResizable (true, false);
|
||||
setVisible (true);
|
||||
|
||||
glContext.attachTo (*this);
|
||||
}
|
||||
|
||||
MainWindow (PropertiesFile& props, int windowIndex)
|
||||
: DocumentWindow ("JUCE Networked Graphics Demo", Colours::black, DocumentWindow::allButtons)
|
||||
{
|
||||
setUsingNativeTitleBar (true);
|
||||
setContentOwned (new SlaveCanvasComponent (props, windowIndex), true);
|
||||
setBounds (500, 100, getWidth(), getHeight());
|
||||
setResizable (true, false);
|
||||
setVisible (true);
|
||||
|
||||
#if ! JUCE_IOS
|
||||
glContext.attachTo (*this);
|
||||
#endif
|
||||
|
||||
#if JUCE_IOS || JUCE_ANDROID
|
||||
setFullScreen (true);
|
||||
#endif
|
||||
}
|
||||
|
||||
~MainWindow() override
|
||||
{
|
||||
glContext.detach();
|
||||
}
|
||||
|
||||
void closeButtonPressed() override
|
||||
{
|
||||
JUCEApplication::getInstance()->systemRequestedQuit();
|
||||
}
|
||||
|
||||
OpenGLContext glContext;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow)
|
||||
};
|
||||
|
||||
static PropertiesFile::Options getPropertyFileOptions()
|
||||
{
|
||||
PropertiesFile::Options o;
|
||||
o.applicationName = "JUCE Network Graphics Demo";
|
||||
o.filenameSuffix = ".settings";
|
||||
o.folderName = "JUCE Network Graphics Demo";
|
||||
o.osxLibrarySubFolder = "Application Support/JUCE Network Graphics Demo";
|
||||
o.millisecondsBeforeSaving = 2000;
|
||||
return o;
|
||||
}
|
||||
|
||||
PropertiesFile properties;
|
||||
OwnedArray<MainWindow> mainWindows;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
// This macro generates the main() routine that launches the app.
|
||||
START_JUCE_APPLICATION (NetworkGraphicsDemoApplication)
|
422
deps/juce/extras/NetworkGraphicsDemo/Source/MasterComponent.h
vendored
Normal file
422
deps/juce/extras/NetworkGraphicsDemo/Source/MasterComponent.h
vendored
Normal file
@ -0,0 +1,422 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
Runs the master node, calls the demo to update the canvas, broadcasts those changes
|
||||
out to slaves, and shows a view of all the clients to allow them to be dragged around.
|
||||
*/
|
||||
struct MasterContentComponent : public Component,
|
||||
private Timer,
|
||||
private OSCSender,
|
||||
private OSCReceiver,
|
||||
private OSCReceiver::Listener<OSCReceiver::MessageLoopCallback>
|
||||
{
|
||||
MasterContentComponent (PropertiesFile& props)
|
||||
: properties (props)
|
||||
{
|
||||
setWantsKeyboardFocus (true);
|
||||
createAllDemos (demos);
|
||||
setContent (0);
|
||||
|
||||
setSize ((int) (15.0f * currentCanvas.getLimits().getWidth()),
|
||||
(int) (15.0f * currentCanvas.getLimits().getHeight()));
|
||||
|
||||
if (! OSCSender::connect (getBroadcastIPAddress(), masterPortNumber))
|
||||
error = "Master app OSC sender: network connection error.";
|
||||
|
||||
if (! OSCReceiver::connect (clientPortNumber))
|
||||
error = "Master app OSC receiver: network connection error.";
|
||||
|
||||
OSCReceiver::addListener (this);
|
||||
|
||||
startTimerHz (30);
|
||||
}
|
||||
|
||||
~MasterContentComponent() override
|
||||
{
|
||||
OSCReceiver::removeListener (this);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct Client
|
||||
{
|
||||
String name, ipAddress;
|
||||
float widthInches, heightInches;
|
||||
Point<float> centre; // in inches
|
||||
float scaleFactor;
|
||||
};
|
||||
|
||||
Array<Client> clients;
|
||||
|
||||
void addClient (String name, String ipAddress, String areaDescription)
|
||||
{
|
||||
auto area = Rectangle<float>::fromString (areaDescription);
|
||||
|
||||
if (auto c = getClient (name))
|
||||
{
|
||||
c->ipAddress = ipAddress;
|
||||
c->widthInches = area.getWidth();
|
||||
c->heightInches = area.getHeight();
|
||||
return;
|
||||
}
|
||||
|
||||
DBG (name + " " + ipAddress);
|
||||
|
||||
removeClient (name);
|
||||
clients.add ({ name, ipAddress, area.getWidth(), area.getHeight(), {}, 1.0f });
|
||||
|
||||
String lastX = properties.getValue ("lastX_" + name);
|
||||
String lastY = properties.getValue ("lastY_" + name);
|
||||
String lastScale = properties.getValue ("scale_" + name);
|
||||
|
||||
if (lastX.isEmpty() || lastY.isEmpty())
|
||||
setClientCentre (name, { Random().nextFloat() * 10.0f,
|
||||
Random().nextFloat() * 10.0f });
|
||||
else
|
||||
setClientCentre (name, Point<float> (lastX.getFloatValue(),
|
||||
lastY.getFloatValue()));
|
||||
|
||||
if (lastScale.isNotEmpty())
|
||||
setClientScale (name, lastScale.getFloatValue());
|
||||
else
|
||||
setClientScale (name, 1.0f);
|
||||
|
||||
updateDeviceComponents();
|
||||
}
|
||||
|
||||
void removeClient (String name)
|
||||
{
|
||||
for (int i = clients.size(); --i >= 0;)
|
||||
if (clients.getReference (0).name == name)
|
||||
clients.remove (i);
|
||||
|
||||
updateDeviceComponents();
|
||||
}
|
||||
|
||||
void setClientCentre (const String& name, Point<float> newCentre)
|
||||
{
|
||||
if (auto c = getClient (name))
|
||||
{
|
||||
newCentre = currentCanvas.getLimits().getConstrainedPoint (newCentre);
|
||||
c->centre = newCentre;
|
||||
|
||||
properties.setValue ("lastX_" + name, String (newCentre.x));
|
||||
properties.setValue ("lastY_" + name, String (newCentre.y));
|
||||
|
||||
startTimer (1);
|
||||
}
|
||||
}
|
||||
|
||||
float getClientScale (const String& name) const
|
||||
{
|
||||
if (auto c = getClient (name))
|
||||
return c->scaleFactor;
|
||||
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
void setClientScale (const String& name, float newScale)
|
||||
{
|
||||
if (auto c = getClient (name))
|
||||
{
|
||||
c->scaleFactor = jlimit (0.5f, 2.0f, newScale);
|
||||
properties.setValue ("scale_" + name, String (newScale));
|
||||
}
|
||||
}
|
||||
|
||||
Point<float> getClientCentre (const String& name) const
|
||||
{
|
||||
if (auto c = getClient (name))
|
||||
return c->centre;
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Rectangle<float> getClientArea (const String& name) const
|
||||
{
|
||||
if (auto c = getClient (name))
|
||||
return Rectangle<float> (c->widthInches, c->heightInches)
|
||||
.withCentre (c->centre);
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Rectangle<float> getActiveCanvasArea() const
|
||||
{
|
||||
Rectangle<float> r;
|
||||
|
||||
if (clients.size() > 0)
|
||||
r = Rectangle<float> (1.0f, 1.0f).withCentre (clients.getReference (0).centre);
|
||||
|
||||
for (int i = 1; i < clients.size(); ++i)
|
||||
r = r.getUnion (Rectangle<float> (1.0f, 1.0f).withCentre (clients.getReference (i).centre));
|
||||
|
||||
return r.expanded (6.0f);
|
||||
}
|
||||
|
||||
int getContentIndex() const
|
||||
{
|
||||
return demos.indexOf (content);
|
||||
}
|
||||
|
||||
void setContent (int demoIndex)
|
||||
{
|
||||
content = demos[demoIndex];
|
||||
|
||||
if (content != nullptr)
|
||||
content->reset();
|
||||
}
|
||||
|
||||
bool keyPressed (const KeyPress& key) override
|
||||
{
|
||||
if (key == KeyPress::spaceKey || key == KeyPress::rightKey || key == KeyPress::downKey)
|
||||
{
|
||||
setContent ((getContentIndex() + 1) % demos.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (key == KeyPress::upKey || key == KeyPress::leftKey)
|
||||
{
|
||||
setContent ((getContentIndex() + demos.size() - 1) % demos.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
return Component::keyPressed (key);
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
void paint (Graphics& g) override
|
||||
{
|
||||
g.fillAll (Colours::black);
|
||||
|
||||
currentCanvas.draw (g, getLocalBounds().toFloat(), currentCanvas.getLimits());
|
||||
|
||||
if (error.isNotEmpty())
|
||||
{
|
||||
g.setColour (Colours::red);
|
||||
g.setFont (20.0f);
|
||||
g.drawText (error, getLocalBounds().reduced (10).removeFromBottom (80),
|
||||
Justification::centredRight, true);
|
||||
}
|
||||
|
||||
if (content != nullptr)
|
||||
{
|
||||
g.setColour (Colours::white);
|
||||
g.setFont (17.0f);
|
||||
g.drawText ("Demo: " + content->getName(),
|
||||
getLocalBounds().reduced (10).removeFromTop (30),
|
||||
Justification::centredLeft, true);
|
||||
}
|
||||
}
|
||||
|
||||
void resized() override
|
||||
{
|
||||
updateDeviceComponents();
|
||||
}
|
||||
|
||||
void updateDeviceComponents()
|
||||
{
|
||||
for (int i = devices.size(); --i >= 0;)
|
||||
if (getClient (devices.getUnchecked(i)->getName()) == nullptr)
|
||||
devices.remove (i);
|
||||
|
||||
for (const auto& c : clients)
|
||||
if (getDeviceComponent (c.name) == nullptr)
|
||||
addAndMakeVisible (devices.add (new DeviceComponent (*this, c.name)));
|
||||
|
||||
for (auto d : devices)
|
||||
d->setBounds (virtualSpaceToLocal (getClientArea (d->getName())).getSmallestIntegerContainer());
|
||||
}
|
||||
|
||||
Point<float> virtualSpaceToLocal (Point<float> p) const
|
||||
{
|
||||
auto total = currentCanvas.getLimits();
|
||||
|
||||
return { (float) getWidth() * (p.x - total.getX()) / total.getWidth(),
|
||||
(float) getHeight() * (p.y - total.getY()) / total.getHeight() };
|
||||
}
|
||||
|
||||
Rectangle<float> virtualSpaceToLocal (Rectangle<float> p) const
|
||||
{
|
||||
return { virtualSpaceToLocal (p.getTopLeft()),
|
||||
virtualSpaceToLocal (p.getBottomRight()) };
|
||||
}
|
||||
|
||||
Point<float> localSpaceToVirtual (Point<float> p) const
|
||||
{
|
||||
auto total = currentCanvas.getLimits();
|
||||
|
||||
return { total.getX() + total.getWidth() * (p.x / (float) getWidth()),
|
||||
total.getY() + total.getHeight() * (p.y / (float) getHeight()) };
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct DeviceComponent : public Component
|
||||
{
|
||||
DeviceComponent (MasterContentComponent& e, String name)
|
||||
: Component (name), editor (e)
|
||||
{
|
||||
setMouseCursor (MouseCursor::DraggingHandCursor);
|
||||
}
|
||||
|
||||
void paint (Graphics& g) override
|
||||
{
|
||||
g.fillAll (Colours::blue.withAlpha (0.4f));
|
||||
|
||||
g.setColour (Colours::white);
|
||||
g.setFont (11.0f);
|
||||
g.drawFittedText (getName(), getLocalBounds(), Justification::centred, 2);
|
||||
}
|
||||
|
||||
void mouseDown (const MouseEvent&) override
|
||||
{
|
||||
dragStartLocation = editor.getClientCentre (getName());
|
||||
}
|
||||
|
||||
void mouseDrag (const MouseEvent& e) override
|
||||
{
|
||||
editor.setClientCentre (getName(), dragStartLocation
|
||||
+ editor.localSpaceToVirtual (e.getPosition().toFloat())
|
||||
- editor.localSpaceToVirtual (e.getMouseDownPosition().toFloat()));
|
||||
}
|
||||
|
||||
void mouseWheelMove (const MouseEvent&, const MouseWheelDetails& e) override
|
||||
{
|
||||
editor.setClientScale (getName(), editor.getClientScale (getName()) + 0.1f * e.deltaY);
|
||||
}
|
||||
|
||||
void mouseDoubleClick (const MouseEvent&) override
|
||||
{
|
||||
editor.setClientScale (getName(), 1.0f);
|
||||
}
|
||||
|
||||
MasterContentComponent& editor;
|
||||
Point<float> dragStartLocation;
|
||||
Rectangle<float> clientArea;
|
||||
};
|
||||
|
||||
DeviceComponent* getDeviceComponent (const String& name) const
|
||||
{
|
||||
for (auto d : devices)
|
||||
if (d->getName() == name)
|
||||
return d;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void broadcastNewCanvasState (const MemoryBlock& canvasData)
|
||||
{
|
||||
BlockPacketiser packetiser;
|
||||
packetiser.createBlocksFromData (canvasData, 1000);
|
||||
|
||||
for (const auto& client : clients)
|
||||
for (auto& b : packetiser.blocks)
|
||||
sendToIPAddress (client.ipAddress, masterPortNumber, canvasStateOSCAddress, b);
|
||||
}
|
||||
|
||||
void timerCallback() override
|
||||
{
|
||||
startTimerHz (30);
|
||||
|
||||
currentCanvas.reset();
|
||||
updateCanvasInfo (currentCanvas);
|
||||
|
||||
{
|
||||
std::unique_ptr<CanvasGeneratingContext> context (new CanvasGeneratingContext (currentCanvas));
|
||||
Graphics g (*context);
|
||||
|
||||
if (content != nullptr)
|
||||
content->generateCanvas (g, currentCanvas, getActiveCanvasArea());
|
||||
}
|
||||
|
||||
broadcastNewCanvasState (currentCanvas.toMemoryBlock());
|
||||
|
||||
updateDeviceComponents();
|
||||
repaint();
|
||||
}
|
||||
|
||||
void updateCanvasInfo (SharedCanvasDescription& canvas)
|
||||
{
|
||||
canvas.backgroundColour = Colours::black;
|
||||
|
||||
for (const auto& c : clients)
|
||||
canvas.clients.add ({ c.name, c.centre, c.scaleFactor });
|
||||
}
|
||||
|
||||
const Client* getClient (const String& name) const
|
||||
{
|
||||
for (auto& c : clients)
|
||||
if (c.name == name)
|
||||
return &c;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Client* getClient (const String& name)
|
||||
{
|
||||
return const_cast<Client*> (static_cast<const MasterContentComponent&> (*this).getClient (name));
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void oscMessageReceived (const OSCMessage& message) override
|
||||
{
|
||||
auto address = message.getAddressPattern();
|
||||
|
||||
if (address.matches (newClientOSCAddress)) newClientOSCMessageReceived (message);
|
||||
else if (address.matches (userInputOSCAddress)) userInputOSCMessageReceived (message);
|
||||
}
|
||||
|
||||
void newClientOSCMessageReceived (const OSCMessage& message)
|
||||
{
|
||||
if (message.isEmpty() || ! message[0].isString())
|
||||
return;
|
||||
|
||||
StringArray tokens = StringArray::fromTokens (message[0].getString(), ":", "");
|
||||
addClient (tokens[0], tokens[1], tokens[2]);
|
||||
}
|
||||
|
||||
void userInputOSCMessageReceived (const OSCMessage& message)
|
||||
{
|
||||
if (message.size() == 3 && message[0].isString() && message[1].isFloat32() && message[2].isFloat32())
|
||||
{
|
||||
content->handleTouch ({ message[1].getFloat32(),
|
||||
message[2].getFloat32() });
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
AnimatedContent* content = nullptr;
|
||||
PropertiesFile& properties;
|
||||
OwnedArray<DeviceComponent> devices;
|
||||
SharedCanvasDescription currentCanvas;
|
||||
String error;
|
||||
|
||||
OwnedArray<AnimatedContent> demos;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MasterContentComponent)
|
||||
};
|
527
deps/juce/extras/NetworkGraphicsDemo/Source/SharedCanvas.h
vendored
Normal file
527
deps/juce/extras/NetworkGraphicsDemo/Source/SharedCanvas.h
vendored
Normal file
@ -0,0 +1,527 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
This scene description is broadcast to all the clients, and contains a list of all
|
||||
the clients involved, as well as the set of shapes to be drawn.
|
||||
|
||||
Each client will draw the part of the path that lies within its own area. It can
|
||||
find its area by looking at the list of clients contained in this structure.
|
||||
|
||||
All the path coordinates are roughly in units of inches, and devices will convert
|
||||
this to pixels based on their screen size and DPI
|
||||
*/
|
||||
struct SharedCanvasDescription
|
||||
{
|
||||
SharedCanvasDescription() {}
|
||||
|
||||
Colour backgroundColour = Colours::black;
|
||||
|
||||
struct ColouredPath
|
||||
{
|
||||
Path path;
|
||||
FillType fill;
|
||||
};
|
||||
|
||||
Array<ColouredPath> paths;
|
||||
|
||||
struct ClientArea
|
||||
{
|
||||
String name;
|
||||
Point<float> centre; // in inches
|
||||
float scaleFactor; // extra scaling
|
||||
};
|
||||
|
||||
Array<ClientArea> clients;
|
||||
|
||||
//==============================================================================
|
||||
void reset()
|
||||
{
|
||||
paths.clearQuick();
|
||||
clients.clearQuick();
|
||||
}
|
||||
|
||||
void swapWith (SharedCanvasDescription& other)
|
||||
{
|
||||
std::swap (backgroundColour, other.backgroundColour);
|
||||
paths.swapWith (other.paths);
|
||||
clients.swapWith (other.clients);
|
||||
}
|
||||
|
||||
// This is a fixed size that represents the overall canvas limits that
|
||||
// content should lie within
|
||||
Rectangle<float> getLimits() const
|
||||
{
|
||||
float inchesX = 60.0f;
|
||||
float inchesY = 30.0f;
|
||||
|
||||
return { inchesX * -0.5f, inchesY * -0.5f, inchesX, inchesY };
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void draw (Graphics& g, Rectangle<float> targetArea, Rectangle<float> clientArea) const
|
||||
{
|
||||
draw (g, clientArea,
|
||||
AffineTransform::fromTargetPoints (clientArea.getX(), clientArea.getY(),
|
||||
targetArea.getX(), targetArea.getY(),
|
||||
clientArea.getRight(), clientArea.getY(),
|
||||
targetArea.getRight(), targetArea.getY(),
|
||||
clientArea.getRight(), clientArea.getBottom(),
|
||||
targetArea.getRight(), targetArea.getBottom()));
|
||||
}
|
||||
|
||||
void draw (Graphics& g, Rectangle<float> clientArea, AffineTransform t) const
|
||||
{
|
||||
g.saveState();
|
||||
g.addTransform (t);
|
||||
|
||||
for (const auto& p : paths)
|
||||
{
|
||||
if (p.path.getBounds().intersects (clientArea))
|
||||
{
|
||||
g.setFillType (p.fill);
|
||||
g.fillPath (p.path);
|
||||
}
|
||||
}
|
||||
|
||||
g.restoreState();
|
||||
}
|
||||
|
||||
const ClientArea* findClient (const String& clientName) const
|
||||
{
|
||||
for (const auto& c : clients)
|
||||
if (c.name == clientName)
|
||||
return &c;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
// Serialisation...
|
||||
|
||||
void save (OutputStream& out) const
|
||||
{
|
||||
out.writeInt (magic);
|
||||
out.writeInt ((int) backgroundColour.getARGB());
|
||||
|
||||
out.writeInt (clients.size());
|
||||
|
||||
for (const auto& c : clients)
|
||||
{
|
||||
out.writeString (c.name);
|
||||
writePoint (out, c.centre);
|
||||
out.writeFloat (c.scaleFactor);
|
||||
}
|
||||
|
||||
out.writeInt (paths.size());
|
||||
|
||||
for (const auto& p : paths)
|
||||
{
|
||||
writeFill (out, p.fill);
|
||||
p.path.writePathToStream (out);
|
||||
}
|
||||
}
|
||||
|
||||
void load (InputStream& in)
|
||||
{
|
||||
if (in.readInt() != magic)
|
||||
return;
|
||||
|
||||
backgroundColour = Colour ((uint32) in.readInt());
|
||||
|
||||
{
|
||||
const int numClients = in.readInt();
|
||||
clients.clearQuick();
|
||||
|
||||
for (int i = 0; i < numClients; ++i)
|
||||
{
|
||||
ClientArea c;
|
||||
c.name = in.readString();
|
||||
c.centre = readPoint (in);
|
||||
c.scaleFactor = in.readFloat();
|
||||
clients.add (c);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const int numPaths = in.readInt();
|
||||
paths.clearQuick();
|
||||
|
||||
for (int i = 0; i < numPaths; ++i)
|
||||
{
|
||||
ColouredPath p;
|
||||
p.fill = readFill (in);
|
||||
p.path.loadPathFromStream (in);
|
||||
|
||||
paths.add (std::move (p));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MemoryBlock toMemoryBlock() const
|
||||
{
|
||||
MemoryOutputStream o;
|
||||
save (o);
|
||||
return o.getMemoryBlock();
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
static void writePoint (OutputStream& out, Point<float> p)
|
||||
{
|
||||
out.writeFloat (p.x);
|
||||
out.writeFloat (p.y);
|
||||
}
|
||||
|
||||
static void writeRect (OutputStream& out, Rectangle<float> r)
|
||||
{
|
||||
writePoint (out, r.getPosition());
|
||||
out.writeFloat (r.getWidth());
|
||||
out.writeFloat (r.getHeight());
|
||||
}
|
||||
|
||||
static Point<float> readPoint (InputStream& in)
|
||||
{
|
||||
Point<float> p;
|
||||
p.x = in.readFloat();
|
||||
p.y = in.readFloat();
|
||||
return p;
|
||||
}
|
||||
|
||||
static Rectangle<float> readRect (InputStream& in)
|
||||
{
|
||||
Rectangle<float> r;
|
||||
r.setPosition (readPoint (in));
|
||||
r.setWidth (in.readFloat());
|
||||
r.setHeight (in.readFloat());
|
||||
return r;
|
||||
}
|
||||
|
||||
static void writeFill (OutputStream& out, const FillType& f)
|
||||
{
|
||||
if (f.isColour())
|
||||
{
|
||||
out.writeByte (0);
|
||||
out.writeInt ((int) f.colour.getARGB());
|
||||
}
|
||||
else if (f.isGradient())
|
||||
{
|
||||
const ColourGradient& cg = *f.gradient;
|
||||
jassert (cg.getNumColours() >= 2);
|
||||
|
||||
out.writeByte (cg.isRadial ? 2 : 1);
|
||||
|
||||
writePoint (out, cg.point1);
|
||||
writePoint (out, cg.point2);
|
||||
|
||||
out.writeCompressedInt (cg.getNumColours());
|
||||
|
||||
for (int i = 0; i < cg.getNumColours(); ++i)
|
||||
{
|
||||
out.writeDouble (cg.getColourPosition (i));
|
||||
out.writeInt ((int) cg.getColour(i).getARGB());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
jassertfalse;
|
||||
}
|
||||
}
|
||||
|
||||
static FillType readFill (InputStream& in)
|
||||
{
|
||||
int type = in.readByte();
|
||||
|
||||
if (type == 0)
|
||||
return FillType (Colour ((uint32) in.readInt()));
|
||||
|
||||
if (type > 2)
|
||||
{
|
||||
jassertfalse;
|
||||
return FillType();
|
||||
}
|
||||
|
||||
ColourGradient cg;
|
||||
cg.point1 = readPoint (in);
|
||||
cg.point2 = readPoint (in);
|
||||
|
||||
cg.clearColours();
|
||||
|
||||
int numColours = in.readCompressedInt();
|
||||
|
||||
for (int i = 0; i < numColours; ++i)
|
||||
{
|
||||
const double pos = in.readDouble();
|
||||
cg.addColour (pos, Colour ((uint32) in.readInt()));
|
||||
}
|
||||
|
||||
jassert (cg.getNumColours() >= 2);
|
||||
|
||||
return FillType (cg);
|
||||
}
|
||||
|
||||
const int magic = 0x2381239a;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE (SharedCanvasDescription)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class CanvasGeneratingContext : public LowLevelGraphicsContext
|
||||
{
|
||||
public:
|
||||
CanvasGeneratingContext (SharedCanvasDescription& c) : canvas (c)
|
||||
{
|
||||
stateStack.add (new SavedState());
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
bool isVectorDevice() const override { return true; }
|
||||
float getPhysicalPixelScaleFactor() override { return 1.0f; }
|
||||
void setOrigin (Point<int> o) override { addTransform (AffineTransform::translation ((float) o.x, (float) o.y)); }
|
||||
|
||||
void addTransform (const AffineTransform& t) override
|
||||
{
|
||||
getState().transform = t.followedBy (getState().transform);
|
||||
}
|
||||
|
||||
bool clipToRectangle (const Rectangle<int>&) override { return true; }
|
||||
bool clipToRectangleList (const RectangleList<int>&) override { return true; }
|
||||
void excludeClipRectangle (const Rectangle<int>&) override {}
|
||||
void clipToPath (const Path&, const AffineTransform&) override {}
|
||||
void clipToImageAlpha (const Image&, const AffineTransform&) override {}
|
||||
|
||||
void saveState() override
|
||||
{
|
||||
stateStack.add (new SavedState (getState()));
|
||||
}
|
||||
|
||||
void restoreState() override
|
||||
{
|
||||
jassert (stateStack.size() > 0);
|
||||
|
||||
if (stateStack.size() > 0)
|
||||
stateStack.removeLast();
|
||||
}
|
||||
|
||||
void beginTransparencyLayer (float alpha) override
|
||||
{
|
||||
saveState();
|
||||
getState().transparencyLayer = new SharedCanvasHolder();
|
||||
getState().transparencyOpacity = alpha;
|
||||
}
|
||||
|
||||
void endTransparencyLayer() override
|
||||
{
|
||||
const ReferenceCountedObjectPtr<SharedCanvasHolder> finishedTransparencyLayer (getState().transparencyLayer);
|
||||
float alpha = getState().transparencyOpacity;
|
||||
restoreState();
|
||||
|
||||
if (SharedCanvasHolder* c = finishedTransparencyLayer)
|
||||
{
|
||||
for (auto& path : c->canvas.paths)
|
||||
{
|
||||
path.fill.setOpacity (path.fill.getOpacity() * alpha);
|
||||
getTargetCanvas().paths.add (path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle<int> getClipBounds() const override
|
||||
{
|
||||
return canvas.getLimits().getSmallestIntegerContainer()
|
||||
.transformedBy (getState().transform.inverted());
|
||||
}
|
||||
|
||||
bool clipRegionIntersects (const Rectangle<int>&) override { return true; }
|
||||
bool isClipEmpty() const override { return false; }
|
||||
|
||||
//==============================================================================
|
||||
void setFill (const FillType& fillType) override { getState().fillType = fillType; }
|
||||
void setOpacity (float op) override { getState().fillType.setOpacity (op); }
|
||||
void setInterpolationQuality (Graphics::ResamplingQuality) override {}
|
||||
|
||||
//==============================================================================
|
||||
void fillRect (const Rectangle<int>& r, bool) override { fillRect (r.toFloat()); }
|
||||
void fillRectList (const RectangleList<float>& list) override { fillPath (list.toPath(), AffineTransform()); }
|
||||
|
||||
void fillRect (const Rectangle<float>& r) override
|
||||
{
|
||||
Path p;
|
||||
p.addRectangle (r.toFloat());
|
||||
fillPath (p, AffineTransform());
|
||||
}
|
||||
|
||||
void fillPath (const Path& p, const AffineTransform& t) override
|
||||
{
|
||||
Path p2 (p);
|
||||
p2.applyTransform (t.followedBy (getState().transform));
|
||||
|
||||
getTargetCanvas().paths.add ({ std::move (p2), getState().fillType });
|
||||
}
|
||||
|
||||
void drawImage (const Image&, const AffineTransform&) override {}
|
||||
|
||||
void drawLine (const Line<float>& line) override
|
||||
{
|
||||
Path p;
|
||||
p.addLineSegment (line, 1.0f);
|
||||
fillPath (p, AffineTransform());
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const Font& getFont() override { return getState().font; }
|
||||
void setFont (const Font& newFont) override { getState().font = newFont; }
|
||||
|
||||
void drawGlyph (int glyphNumber, const AffineTransform& transform) override
|
||||
{
|
||||
Path p;
|
||||
Font& font = getState().font;
|
||||
font.getTypefacePtr()->getOutlineForGlyph (glyphNumber, p);
|
||||
fillPath (p, AffineTransform::scale (font.getHeight() * font.getHorizontalScale(), font.getHeight()).followedBy (transform));
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
struct SharedCanvasHolder : public ReferenceCountedObject
|
||||
{
|
||||
SharedCanvasDescription canvas;
|
||||
};
|
||||
|
||||
struct SavedState
|
||||
{
|
||||
FillType fillType;
|
||||
AffineTransform transform;
|
||||
Font font;
|
||||
ReferenceCountedObjectPtr<SharedCanvasHolder> transparencyLayer;
|
||||
float transparencyOpacity = 1.0f;
|
||||
};
|
||||
|
||||
SharedCanvasDescription& getTargetCanvas() const
|
||||
{
|
||||
if (SharedCanvasHolder* c = getState().transparencyLayer)
|
||||
return c->canvas;
|
||||
|
||||
return canvas;
|
||||
}
|
||||
|
||||
SavedState& getState() const noexcept
|
||||
{
|
||||
jassert (stateStack.size() > 0);
|
||||
return *stateStack.getLast();
|
||||
}
|
||||
|
||||
SharedCanvasDescription& canvas;
|
||||
OwnedArray<SavedState> stateStack;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CanvasGeneratingContext)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Helper for breaking and reassembling a memory block into smaller checksummed
|
||||
blocks that will fit inside UDP packets
|
||||
*/
|
||||
struct BlockPacketiser
|
||||
{
|
||||
void createBlocksFromData (const MemoryBlock& data, size_t maxBlockSize)
|
||||
{
|
||||
jassert (blocks.size() == 0);
|
||||
|
||||
int offset = 0;
|
||||
size_t remaining = data.getSize();
|
||||
|
||||
while (remaining > 0)
|
||||
{
|
||||
auto num = (size_t) jmin (maxBlockSize, remaining);
|
||||
blocks.add (MemoryBlock (addBytesToPointer (data.getData(), offset), num));
|
||||
offset += (int) num;
|
||||
remaining -= num;
|
||||
}
|
||||
|
||||
MemoryOutputStream checksumBlock;
|
||||
checksumBlock << getLastPacketPrefix() << MD5 (data).toHexString() << (char) 0 << (char) 0;
|
||||
blocks.add (checksumBlock.getMemoryBlock());
|
||||
|
||||
for (int i = 0; i < blocks.size(); ++i)
|
||||
{
|
||||
auto index = (uint32) ByteOrder::swapIfBigEndian (i);
|
||||
blocks.getReference(i).append (&index, sizeof (index));
|
||||
}
|
||||
}
|
||||
|
||||
// returns true if this is an end-of-sequence block
|
||||
bool appendIncomingBlock (MemoryBlock data)
|
||||
{
|
||||
if (data.getSize() > 4)
|
||||
blocks.addSorted (*this, data);
|
||||
|
||||
return String (CharPointer_ASCII ((const char*) data.getData())).startsWith (getLastPacketPrefix());
|
||||
}
|
||||
|
||||
bool reassemble (MemoryBlock& result)
|
||||
{
|
||||
result.reset();
|
||||
|
||||
if (blocks.size() > 1)
|
||||
{
|
||||
for (int i = 0; i < blocks.size() - 1; ++i)
|
||||
result.append (blocks.getReference(i).getData(), blocks.getReference(i).getSize() - 4);
|
||||
|
||||
String storedMD5 (String (CharPointer_ASCII ((const char*) blocks.getLast().getData()))
|
||||
.fromFirstOccurrenceOf (getLastPacketPrefix(), false, false));
|
||||
|
||||
blocks.clearQuick();
|
||||
|
||||
if (MD5 (result).toHexString().trim().equalsIgnoreCase (storedMD5.trim()))
|
||||
return true;
|
||||
}
|
||||
|
||||
result.reset();
|
||||
return false;
|
||||
}
|
||||
|
||||
static int compareElements (const MemoryBlock& b1, const MemoryBlock& b2)
|
||||
{
|
||||
auto i1 = ByteOrder::littleEndianInt (addBytesToPointer (b1.getData(), b1.getSize() - 4));
|
||||
auto i2 = ByteOrder::littleEndianInt (addBytesToPointer (b2.getData(), b2.getSize() - 4));
|
||||
return (int) (i1 - i2);
|
||||
}
|
||||
|
||||
static const char* getLastPacketPrefix() { return "**END_OF_PACKET_LIST** "; }
|
||||
|
||||
Array<MemoryBlock> blocks;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
struct AnimatedContent
|
||||
{
|
||||
virtual ~AnimatedContent() {}
|
||||
|
||||
virtual String getName() const = 0;
|
||||
virtual void reset() = 0;
|
||||
virtual void generateCanvas (Graphics&, SharedCanvasDescription& canvas, Rectangle<float> activeArea) = 0;
|
||||
virtual void handleTouch (Point<float> position) = 0;
|
||||
};
|
224
deps/juce/extras/NetworkGraphicsDemo/Source/SlaveComponent.h
vendored
Normal file
224
deps/juce/extras/NetworkGraphicsDemo/Source/SlaveComponent.h
vendored
Normal file
@ -0,0 +1,224 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
This component runs in a slave process, draws the part of the canvas that this
|
||||
particular client covers, and updates itself when messages arrive from the master
|
||||
containing new canvas states.
|
||||
*/
|
||||
class SlaveCanvasComponent : public Component,
|
||||
private OSCSender,
|
||||
private OSCReceiver,
|
||||
private OSCReceiver::Listener<OSCReceiver::RealtimeCallback>,
|
||||
private AsyncUpdater,
|
||||
private Timer
|
||||
{
|
||||
public:
|
||||
SlaveCanvasComponent (PropertiesFile& p, int windowIndex) : properties (p)
|
||||
{
|
||||
{
|
||||
String uuidPropName ("UUID" + String (windowIndex));
|
||||
clientName = properties.getValue (uuidPropName);
|
||||
|
||||
if (clientName.isEmpty())
|
||||
{
|
||||
clientName = "CLIENT_" + String (Random().nextInt (10000)).toUpperCase();
|
||||
properties.setValue (uuidPropName, clientName);
|
||||
}
|
||||
}
|
||||
|
||||
setOpaque (true);
|
||||
setSize (1500, 900);
|
||||
|
||||
if (! OSCSender::connect (getBroadcastIPAddress(), clientPortNumber))
|
||||
error = "Client app OSC sender: network connection error.";
|
||||
|
||||
if (! OSCReceiver::connect (masterPortNumber))
|
||||
error = "Client app OSC receiver: network connection error.";
|
||||
|
||||
OSCReceiver::addListener (this);
|
||||
|
||||
timerCallback();
|
||||
startTimer (2000);
|
||||
}
|
||||
|
||||
~SlaveCanvasComponent() override
|
||||
{
|
||||
OSCReceiver::removeListener (this);
|
||||
}
|
||||
|
||||
private:
|
||||
void mouseDrag (const MouseEvent& e) override
|
||||
{
|
||||
auto clientArea = getAreaInGlobalSpace();
|
||||
|
||||
if (! clientArea.isEmpty())
|
||||
{
|
||||
OSCMessage message (userInputOSCAddress);
|
||||
|
||||
message.addString (clientName);
|
||||
message.addFloat32 (e.position.x * clientArea.getWidth() / (float) getWidth() + clientArea.getX());
|
||||
message.addFloat32 (e.position.y * clientArea.getHeight() / (float) getHeight() + clientArea.getY());
|
||||
|
||||
send (message);
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void oscMessageReceived (const OSCMessage& message) override
|
||||
{
|
||||
auto address = message.getAddressPattern();
|
||||
|
||||
if (address.matches (canvasStateOSCAddress))
|
||||
canvasStateOSCMessageReceived (message);
|
||||
}
|
||||
|
||||
struct NewStateMessage : public Message
|
||||
{
|
||||
NewStateMessage (const MemoryBlock& d) : data (d) {}
|
||||
MemoryBlock data;
|
||||
};
|
||||
|
||||
void canvasStateOSCMessageReceived (const OSCMessage& message)
|
||||
{
|
||||
if (message.isEmpty() || ! message[0].isBlob())
|
||||
return;
|
||||
|
||||
if (packetiser.appendIncomingBlock (message[0].getBlob()))
|
||||
{
|
||||
const ScopedLock sl (canvasLock);
|
||||
|
||||
MemoryBlock newCanvasData;
|
||||
|
||||
if (packetiser.reassemble (newCanvasData))
|
||||
{
|
||||
MemoryInputStream i (newCanvasData.getData(), newCanvasData.getSize(), false);
|
||||
canvas2.load (i);
|
||||
triggerAsyncUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
String getMachineInfoToDisplay() const
|
||||
{
|
||||
auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (getScreenBounds().getCentre());
|
||||
return getOSName() + " " + String (display->dpi) + " " + String (display->scale);
|
||||
}
|
||||
|
||||
static String getOSName()
|
||||
{
|
||||
#if JUCE_MAC
|
||||
return "Mac OSX";
|
||||
#elif JUCE_ANDROID
|
||||
return "Android";
|
||||
#elif JUCE_IOS
|
||||
return "iOS";
|
||||
#elif JUCE_WINDOWS
|
||||
return "Windows";
|
||||
#elif JUCE_LINUX
|
||||
return "Linux";
|
||||
#elif JUCE_BSD
|
||||
return "BSD";
|
||||
#endif
|
||||
}
|
||||
|
||||
void paint (Graphics& g) override
|
||||
{
|
||||
g.fillAll (canvas.backgroundColour);
|
||||
|
||||
auto clientArea = getAreaInGlobalSpace();
|
||||
|
||||
if (clientArea.isEmpty())
|
||||
{
|
||||
g.setColour (Colours::red.withAlpha (0.5f));
|
||||
g.setFont (20.0f);
|
||||
g.drawText ("Not Connected", getLocalBounds(), Justification::centred, false);
|
||||
return;
|
||||
}
|
||||
|
||||
canvas.draw (g, getLocalBounds().toFloat(), clientArea);
|
||||
|
||||
g.setFont (Font (34.0f));
|
||||
g.setColour (Colours::white.withAlpha (0.6f));
|
||||
|
||||
g.drawText (getMachineInfoToDisplay(),
|
||||
getLocalBounds().reduced (10).removeFromBottom (20),
|
||||
Justification::centredRight, true);
|
||||
|
||||
if (error.isNotEmpty())
|
||||
{
|
||||
g.setColour (Colours::red);
|
||||
g.drawText (error, getLocalBounds().reduced (10).removeFromBottom (80),
|
||||
Justification::centredRight, true);
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle<float> getAreaInGlobalSpace() const
|
||||
{
|
||||
if (auto client = canvas.findClient (clientName))
|
||||
{
|
||||
auto screenBounds = getScreenBounds();
|
||||
auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (screenBounds.getCentre());
|
||||
return ((screenBounds - display->userArea.getCentre()).toFloat() / (client->scaleFactor * display->dpi / display->scale)) + client->centre;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Rectangle<float> getScreenAreaInGlobalSpace() const
|
||||
{
|
||||
if (auto client = canvas.findClient (clientName))
|
||||
{
|
||||
auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (getScreenBounds().getCentre());
|
||||
return (display->userArea.toFloat() / (client->scaleFactor * display->dpi / display->scale)).withCentre (client->centre);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
void timerCallback() override
|
||||
{
|
||||
send (newClientOSCAddress, clientName + ":" + IPAddress::getLocalAddress().toString()
|
||||
+ ":" + getScreenAreaInGlobalSpace().toString());
|
||||
}
|
||||
|
||||
void handleAsyncUpdate() override
|
||||
{
|
||||
const ScopedLock sl (canvasLock);
|
||||
canvas.swapWith (canvas2);
|
||||
repaint();
|
||||
}
|
||||
|
||||
SharedCanvasDescription canvas, canvas2;
|
||||
PropertiesFile& properties;
|
||||
String clientName, error;
|
||||
|
||||
CriticalSection canvasLock;
|
||||
BlockPacketiser packetiser;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SlaveCanvasComponent)
|
||||
};
|
BIN
deps/juce/extras/NetworkGraphicsDemo/Source/juce_icon.png
vendored
Normal file
BIN
deps/juce/extras/NetworkGraphicsDemo/Source/juce_icon.png
vendored
Normal file
Binary file not shown.
After ![]() (image error) Size: 45 KiB |
Reference in New Issue
Block a user