cmake_minimum_required(VERSION 3.22)

project(Manta VERSION 20241102 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

option(BUILD_STANDALONE "Build Standalone plugin" TRUE)
option(BUILD_CLAP "Build CLAP plugin" TRUE)
option(BUILD_LV2 "Build LV2 plugin" TRUE)
option(BUILD_VST2 "Build VST2 plugin" FALSE)

set(JUCE_FORMATS VST3)

if(BUILD_STANDALONE)
    list(APPEND JUCE_FORMATS Standalone)
endif()

if(BUILD_VST2)
    list(APPEND JUCE_FORMATS VST)
endif()

if (BUILD_LV2 AND UNIX AND NOT APPLE)
    list(APPEND JUCE_FORMATS LV2)
endif()

find_package(JUCE REQUIRED)

juce_add_plugin(${PROJECT_NAME}
	PRODUCT_NAME "Manta"
	FORMATS ${JUCE_FORMATS}
	COMPANY_NAME "Mrugalla"
	LV2URI "https://github.com/Mrugalla/Manta"
	VERSION "${PROJECT_VERSION}"
	COPY_PLUGIN_AFTER_BUILD FALSE
	NEEDS_MIDI_INPUT TRUE
)

if(BUILD_CLAP)
    add_subdirectory(clap-juce-extensions EXCLUDE_FROM_ALL)
    clap_juce_extensions_plugin(TARGET ${PROJECT_NAME}
        CLAP_ID "com.github.mrugalla.manta"
        CLAP_FEATURES audio-effect
    )
endif()

target_compile_definitions(${PROJECT_NAME} PRIVATE
    JUCE_DISPLAY_SPLASH_SCREEN=0
    JUCE_VST3_CAN_REPLACE_VST2=0
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=0
    JUCE_JACK=1
    PPDEditorWidth=946
    PPDEditorHeight=574
    PPDHasEditor=true
    PPDHasPatchBrowser=true
    PPDHasSidechain=false
    PPDHasGainIn=true
    PPDHasUnityGain=true
    PPDHasHQ=false
    PPDHasStereoConfig=false
    PPDHasPolarity=true
    PPDHasLookahead=false
    PPDHasDelta=false
    PPDFPSKnobs=40
    PPDFPSMeters=40
    PPDFPSTextEditor=3
    PPDMetersUseRMS=true
    PPD_GainIn_Min=-12
    PPD_GainIn_Max=12
    PPD_GainOut_Min=-60
    PPD_GainOut_Max=60
    PPD_UnityGainDefault=true
    PPD_DebugFormularParser=false
    PPD_MixOrGainDry=1
    PPD_MIDINumVoices=0
    PPD_MaxXen=128
    PPDPitchShifterSizeMs=1000
    PPDPitchShifterNumVoices=7
)

juce_add_binary_data(${PROJECT_NAME}_Data
    SOURCES
        Source/cursor.png
        Source/cursorCross.png
        Source/fonts/Dosis/Dosis-VariableFont_wght.ttf
        Source/fonts/Dosis/static/Dosis-Bold.ttf
        Source/fonts/Dosis/static/Dosis-ExtraBold.ttf
        Source/fonts/Dosis/static/Dosis-ExtraLight.ttf
        Source/fonts/Dosis/static/Dosis-Light.ttf
        Source/fonts/Dosis/static/Dosis-Medium.ttf
        Source/fonts/Dosis/static/Dosis-Regular.ttf
        Source/fonts/Dosis/static/Dosis-SemiBold.ttf
        Source/fonts/Lobster/Lobster-Regular.ttf
        Source/fonts/Ms_Madi/MsMadi-Regular.ttf
        Source/fonts/nel19.ttf
        Source/gui/menu.xml
        Source/outtakes.txt
        Source/svg/logo.svg
        Source/svg/logo2.svg
)

target_sources(${PROJECT_NAME}
    PRIVATE
        Source/Editor.cpp
        Source/Editor.h
        Source/Processor.cpp
        Source/Processor.h
        Source/arch/Conversion.h
        Source/arch/FormulaParser.h
        Source/arch/FormulaParser2.h
        Source/arch/Interpolation.h
        Source/arch/Range.h
        Source/arch/Smooth.cpp
        Source/arch/Smooth.h
        Source/arch/State.cpp
        Source/arch/State.h
        Source/audio/AbsorbProcessor.cpp
        Source/audio/AbsorbProcessor.h
        Source/audio/AudioUtils.h
        Source/audio/Bitcrusher.h
        Source/audio/DryWetMix.cpp
        Source/audio/DryWetMix.h
        Source/audio/EnvelopeFollower.cpp
        Source/audio/EnvelopeFollower.h
        Source/audio/Filter.cpp
        Source/audio/Filter.h
        Source/audio/LatencyCompensation.cpp
        Source/audio/LatencyCompensation.h
        Source/audio/MIDILearn.cpp
        Source/audio/MIDILearn.h
        Source/audio/MIDIManager.h
        Source/audio/Manta.h
        Source/audio/Meter.cpp
        Source/audio/Meter.h
        Source/audio/MidSide.cpp
        Source/audio/MidSide.h
        Source/audio/NullNoiseSynth.h
        Source/audio/Oscillator.h
        Source/audio/Oversampling.cpp
        Source/audio/Oversampling.h
        Source/audio/PRM.cpp
        Source/audio/PRM.h
        Source/audio/Phasor.h
        Source/audio/PitchGlitcher.cpp
        Source/audio/PitchGlitcher.h
        Source/audio/ProcessSuspend.h
        Source/audio/Rectifier.h
        Source/audio/Resonator.h
        Source/audio/SpectroBeam.h
        Source/audio/WHead.cpp
        Source/audio/WHead.h
        Source/audio/WaveTable.h
        Source/audio/XenManager.h
        Source/gui/Button.cpp
        Source/gui/Button.h
        Source/gui/ButtonParameterRandomizer.cpp
        Source/gui/ButtonParameterRandomizer.h
        Source/gui/Comp.cpp
        Source/gui/Comp.h
        Source/gui/ContextMenu.cpp
        Source/gui/ContextMenu.h
        Source/gui/EQPad.h
        Source/gui/Events.cpp
        Source/gui/Events.h
        Source/gui/FilterResponseGraph.cpp
        Source/gui/FilterResponseGraph.h
        Source/gui/FormulaParser.h
        Source/gui/GUIParams.cpp
        Source/gui/GUIParams.h
        Source/gui/HighLevel.cpp
        Source/gui/HighLevel.h
        Source/gui/KeyboardComp.h
        Source/gui/Knob.cpp
        Source/gui/Knob.h
        Source/gui/Label.cpp
        Source/gui/Label.h
        Source/gui/Layout.cpp
        Source/gui/Layout.h
        Source/gui/LogoComp.h
        Source/gui/LowLevel.h
        Source/gui/MIDICCMonitor.cpp
        Source/gui/MIDICCMonitor.h
        Source/gui/MIDIVoicesComp.cpp
        Source/gui/MIDIVoicesComp.h
        Source/gui/MantaComp.h
        Source/gui/Menu.cpp
        Source/gui/Menu.h
        Source/gui/PatchBrowser.h
        Source/gui/Shader.cpp
        Source/gui/Shader.h
        Source/gui/Shared.cpp
        Source/gui/Shared.h
        Source/gui/SpectroBeamComp.h
        Source/gui/SplineEditor.h
        Source/gui/TextEditor.cpp
        Source/gui/TextEditor.h
        Source/gui/Tooltip.cpp
        Source/gui/Tooltip.h
        Source/gui/TuningEditor.h
        Source/gui/Using.h
        Source/gui/Utils.cpp
        Source/gui/Utils.h
        Source/gui/WaveTableDisplay.h
        Source/info.h
        Source/param/Param.cpp
        Source/param/Param.h
)

target_link_libraries(${PROJECT_NAME}
    PRIVATE
        ${PROJECT_NAME}_Data
        juce::juce_audio_basics
        juce::juce_audio_devices
        juce::juce_audio_formats
        juce::juce_audio_plugin_client
        juce::juce_audio_processors
        juce::juce_audio_utils
        juce::juce_core
        juce::juce_data_structures
        juce::juce_dsp
        juce::juce_events
        juce::juce_graphics
        juce::juce_gui_basics
        juce::juce_gui_extra
    PUBLIC
        juce::juce_recommended_config_flags
        juce::juce_recommended_lto_flags
        juce::juce_recommended_warning_flags
)

juce_generate_juce_header(${PROJECT_NAME})
