# Generated Cmake Pico project file

cmake_minimum_required(VERSION 3.13)

# Non-Secure hard-float ABI
set(PICO_COMPILER "pico_arm_cortex_m33_gcc_ns")

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Increased stack size for core0
set(PICO_STACK_SIZE 8192)

# No printing ...
set(PICO_STDIO_USB 0)
set(PICO_STDIO_UART 0)

# Use hard-float ABI and single-precision VFP for Cortex-M33
set(CMAKE_C_FLAGS "-mcpu=cortex-m33 -march=armv8-m.main+dsp -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -fpermissive ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-m33 -march=armv8-m.main+dsp -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -fpermissive ${CMAKE_CXX_FLAGS}")
set(CMAKE_ASM_FLAGS "-mcpu=cortex-m33 -march=armv8-m.main+dsp -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -fpermissive ${CMAKE_ASM_FLAGS}")

# Finetuned release compiler options (also enable FPU, but leave floats calling convention as soft)
set(CMAKE_C_FLAGS_RELEASE "-O3 -mtune=cortex-m33 -ffast-math -funroll-loops" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -mtune=cortex-m33 -ffast-math -funroll-loops" CACHE STRING "" FORCE)

# Save temporary objects for inspection
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -save-temps=obj")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -save-temps=obj")

# Strip all symbols
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,-s" CACHE STRING "" FORCE)

# Initialise pico_sdk from installed location
# (note this can come from environment, CMake cache etc)

# == DO NOT EDIT THE FOLLOWING LINES for the Raspberry Pi Pico VS Code Extension to work ==
if(WIN32)
    set(USERHOME $ENV{USERPROFILE})
else()
    set(USERHOME $ENV{HOME})
endif()
set(sdkVersion 2.1.1)
set(toolchainVersion 14_2_Rel1)
set(picotoolVersion 2.1.1)
set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake)
if (EXISTS ${picoVscode})
    include(${picoVscode})
endif()
# ====================================================================================
set(PICO_BOARD pico2 CACHE STRING "Board type")

# Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)

project(DemoScene C CXX ASM)

# Set system clock to 300 MHz
set(PICO_DEFAULT_CLOCK_FREQ 300000000)

# Initialise the Raspberry Pi Pico SDK
pico_sdk_init()

# Add executable. Default name is the project name, version 0.1
add_executable(DemoScene
    DisplayDriver/button.cpp
    DisplayDriver/rgbled.cpp
    DisplayDriver/st7789.cpp
	
    AudioDriver/audio_i2s.c
	
    PiCommon/pimoroni_bus.cpp

    VGADriver/scanvideo.c
    VGADriver/vga_modes.c
	
    BaseTypes/ScalarType.cpp
	
    RendererTypes/Camera.cpp
    RendererTypes/Color.cpp
    RendererTypes/Curve.cpp
    RendererTypes/Gizmo.cpp
    RendererTypes/Matrix.cpp
    RendererTypes/Mesh.cpp
    RendererTypes/Scene.cpp
    RendererTypes/Transform.cpp
    RendererTypes/Vector.cpp

    Renderer/FrameBuffer.cpp
    Renderer/Rasterizers.cpp
    Renderer/SoftwareRasterizer.cpp 
	Renderer/PostEfx.cpp
	
    MODPlayer/ModPlayer.cpp 
	
    Font/BitmapFont.cpp
	
    MetaBalls/MetaBalls.cpp
    MetaBalls/MetaBallsLockup.cpp 

    Scenes/Scene00.cpp
    Scenes/Scene01.cpp 
    Scenes/Scene02.cpp 
    Scenes/Scene03.cpp
    Scenes/Scene04.cpp
    Scenes/Scene05.cpp

    Textures/Texture_CyberBlue.cpp
    Textures/Texture_CyberGray.cpp
    Textures/Texture_CyberViolet.cpp
    Textures/Texture_WrapClouds.cpp
    Textures/Texture_WrapAbstractDark.cpp
    Textures/Texture_WrapTunel.cpp
    Textures/Texture_WrapCyber.cpp
    Textures/Texture_MetaGradient.cpp
    Textures/Texture_MotoMask.cpp
    Textures/Texture_WrapBrushedMetal.cpp
    Textures/Texture_Logo.cpp
    Textures/Texture_StartGradient.cpp
    Textures/Texture_FontGradientSmall.cpp
    Textures/Texture_FontGradientLarge.cpp
    Textures/Texture_SplashImage.cpp

    DemoMain.cpp
	BoilerPlate.cpp    
    )

# Add pios
pico_generate_pio_header(DemoScene ${CMAKE_CURRENT_SOURCE_DIR}/AudioDriver/audio_i2s.pio)
pico_generate_pio_header(DemoScene ${CMAKE_CURRENT_SOURCE_DIR}/VGADriver/scanvideo.pio)
pico_generate_pio_header(DemoScene ${CMAKE_CURRENT_SOURCE_DIR}/VGADriver/timing.pio)

# Add custom macros
target_compile_definitions(DemoScene PRIVATE
    PI_PICO_TARGET=1

    # Display timings ...

    PICO_DO_TIMINGS=0

    # Do VGA (pico demo board) or SPI (ST7789 display)

    PICO_DO_VGA=1

    # DSP Audio config

    # For UDA1334A I2S

    UDA_PICO_AUDIO_PACK_I2S_DATA=9
    UDA_PICO_AUDIO_PACK_I2S_BCLK=10

    # For pico demo board

    DMB_PICO_AUDIO_PACK_I2S_DATA=26
    DMB_PICO_AUDIO_PACK_I2S_BCLK=27

    # Audio IRQ/PIO

    PICO_AUDIO_I2S_DMA_IRQ=1
    PICO_AUDIO_I2S_PIO=1

    # VGA driver config

	PICO_SCANVIDEO_PLANE1_VARIABLE_FRAGMENT_DMA=1
)    

# Add include directory
target_include_directories(DemoScene PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/PiCommon
    ${CMAKE_CURRENT_SOURCE_DIR}/DisplayDriver
    ${CMAKE_CURRENT_SOURCE_DIR}/AudioDriver
    ${CMAKE_CURRENT_SOURCE_DIR}/VGADriver
    ${CMAKE_CURRENT_SOURCE_DIR}
)

# Pull in common dependencies  
target_link_libraries(DemoScene pico_stdlib hardware_spi hardware_pwm hardware_dma hardware_pio hardware_irq pico_multicore hardware_interp cmsis_core)

if (PICO_CYW43_SUPPORTED)
    target_link_libraries(DemoScene pico_cyw43_arch_none)
endif()

# Create map/bin/hex file etc.
pico_add_extra_outputs(DemoScene)

# Stdio mode
pico_enable_stdio_uart(DemoScene 0)
pico_enable_stdio_usb(DemoScene 0)

# Add url via pico_set_program_url
